.chroot
ARM
x86_64
qemu
바이너리를 chroot 시스템에 복사하여 static을 사용하는 것이 가능하다는 것을 확인했습니다 .
$ cp /usr/bin/qemu-arm archarm-chroot/usr/bin
하지만 그럼에도 불구하고 항상 다음과 같은 오류가 발생합니다.
chroot: failed to run command ‘/bin/bash’: Exec format error
나는 이것이 아키텍처가 다르다는 것을 의미한다는 것을 알고 있습니다. 내가 뭔가 잘못하고 있는 걸까요?
답변1
나는 때때로 ARM chroot를 사용합니다. 내 전화기는 Linux Deploy를 실행하고 이미지는 때때로 죽습니다. 그런 다음 이를 내 컴퓨터에 복사하고 다음과 같이 chroot를 사용하여 상황을 조사합니다.
# This provides the qemu-arm-static binary
apt-get install qemu-user-static
# Mount my target filesystem on /mnt
mount -o loop fs.img /mnt
# Copy the static ARM binary that provides emulation
cp $(which qemu-arm-static) /mnt/usr/bin
# Or, more simply: cp /usr/bin/qemu-arm-static /mnt/usr/bin
# Finally chroot into /mnt, then run 'qemu-arm-static bash'
# This chroots; runs the emulator; and the emulator runs bash
chroot /mnt qemu-arm-static /bin/bash
답변2
중요한:다른 답변을 살펴보십시오. 이것은 오래되고 부정확한 답변입니다.
다른 아키텍처로 루트를 변경할 수 없습니다. chrooting을 통해 아키텍처에서 (chroot에서) 바이너리를 실행하게 됩니다. x86(및 x86_64)에서 ARM 바이너리를 실행하면 "Exec 형식 오류"가 발생합니다.
다른 아키텍처의 바이너리를 실행하려면 에뮬레이터가 필요합니다. Qemu는 이에 대한 좋은 후보이지만 사용 방법을 배워야 합니다. 여기에는 RootFS를 생성하고 ARM용 커널을 컴파일하는 작업이 포함됩니다. 아마도 ARM 바이너리(및 커널)를 컴파일하기 위한 툴체인이 필요할 것입니다. 한 가지 확실한 점은 chroot 메서드를 잊어버리면 x86(x86_64)에서 ARM용으로 컴파일된 바이너리를 실행할 수 없다는 것입니다.
편집하다: @UrichDangel과의 작은 대화 후에 나는 qemu-user 프로그램(이 경우 qemu-arm)을 사용하여 chroot 환경에 들어가는 것이 가능해야 한다는 것을 깨달았습니다. Chroot는 호스트 아키텍처용으로 컴파일된 qemu-arm을 실행해야 하며, 그러면 qemu-arm은 /bin/sh(arm용으로 컴파일됨)를 실행할 수 있습니다.
답변3
아치에 설치qemu-user-static
그리고binfmt-qemu-static
AUR에서.
그런 다음 chroot하려는 디렉토리 qemu-*-static
에 복사한 다음 다음과 같이 작동해야 합니다.usr/bin/
chroot
chroot /mnt qemu-arm-static /bin/bash
답변4
다른 아키텍처를 위한 (마운트된) 파일 시스템으로 확실히 'chroot'하고 의미 있는 작업을 수행할 수 있습니다. 올바른 도구만 있으면 됩니다.
chroot, mount --bind 및 binfmt_misc의 사용자 공간 구현인 PRoot를 살펴보십시오.https://proot-me.github.io/
QEMU의 사용자 모드 에뮬레이터를 사용하면 모든 준비가 완료됩니다.
일반적으로 '전체' 부팅(즉, init 및 서비스 시작)을 수행할 수는 없지만 '자연스러운' 위치에서 일부 바이너리를 실행하는 것만으로도 충분하며, 바인드 마운트된 일부 파일을 포함하여 모든 구성 파일에 액세스할 수 있습니다. '호스트' 시스템 등