chroot
에서 Arch Linux 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
나는 이것이 아키텍처가 다르다는 것을 알고 있습니다. 내가 뭔가 잘못하고 있습니까?
답변
다른 아키텍처로 chroot 할 수 없습니다. chroot를 사용하면 아키텍처에서 바이너리를 (chroot에서) 실행합니다. x86 (및 그 문제에서 x86_64)에서 ARM 바이너리를 실행하면 “Exec format error”가 발생합니다.
다른 아키텍처에서 바이너리를 실행하려면 에뮬레이터가 필요합니다. Qemu는 이에 대한 좋은 후보이지만 사용법을 배워야합니다. 여기에는 RootFS를 만들고 ARM 용 커널을 컴파일하는 작업이 포함됩니다. ARM 바이너리 (및 커널)를 컴파일하려면 툴체인이 필요합니다. 한 가지 확실한 점은 chroot 메소드를 잊어 버리고 x86 (x86_64)에서 ARM 용으로 컴파일 된 바이너리를 실행할 수 없다는 것입니다.
편집 :
@UrichDangel과의 작은 대화 후 qemu-user 프로그램 (이 경우 qemu-arm)으로 chroot 환경에 들어갈 수 있어야한다는 것을 깨달았습니다. Chroot는 호스트 아키텍처를 위해 컴파일 된 qemu-arm을 실행해야합니다. 그러면 qemu-arm은 / bin / sh (arm을 위해 컴파일 됨)를 실행할 수 있습니다.
답변
필자는 때때로 ARM chroot를 사용합니다. 전화기에서 Linux 배포를 실행하고 이미지가 계속 사라집니다. 그런 다음 그것을 내 컴퓨터에 복사하고 다음과 같이 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
답변
나는 문제가 복사 안된다고 생각 qemu-arm
하지만 qemu-arm-static
. 이것은 라이브러리없이 chroot 안에서 실행할 수있는 정적 컴파일 실행 파일입니다.
/proc/sys/fs/binfmt_misc
파일이 있는지 확인할 수도 있습니다 qemu-arm
. 그렇지 않다면하면 서비스를 다시 시작합니다 binfmt_support
.
답변
설치 작업 나는이를 얻으려면 qemu-static-arm
및 binfmt-support
AUR에서.
에 대한 의견을 읽으십시오 qemu-user-static
. PKGBUILD
makepkg를 끝내려면 최신 다운로드 URL과 해시로 를 업데이트 해야했습니다.
(TAR 파일을 다운로드, AUR에서 설치하려면 untar
, cd
실행 makepkg -i
)
Christian Wolf의 대답이 중요합니다. update-binfmts
이 형식을 사용하기 위해 제대로 실행되지 않았습니다. 그렇게하기 위해 나는 달렸다.
update-binfmts --importdir /var/lib/binfmts/ --import
update-binfmts 맨 페이지에 설명 된대로 그 후 cat /proc/sys/fs/binfmt_misc
다양한 binfmts를 보여줍니다.
그런 다음 복사해야합니다 qemu-*-static
받는 사람 usr/bin/
에 chroot를 당신이 원하는 일에 디렉토리 다음은 chroot
작동합니다.
답변
다른 아키텍처를위한 (마운트 된) 파일 시스템에 ‘chroot’를 가장 확실하게 ‘chroot’하고 의미있는 작업을 수행하려면 올바른 도구 만 있으면됩니다.
chroot, mount –bind 및 binfmt_misc의 사용자 공간 구현 인 PRoot를 살펴보십시오. https://proot-me.github.io/
QEMU의 사용자 모드 에뮬레이터와 함께 모두 설정되었습니다.
일반적으로 ‘전체’부팅을 수행 할 수 없지만 (즉, init 및 서비스 시작) 이진 파일을 바인드 마운트 한 파일을 포함하여 모든 구성 파일에 액세스하여 ‘자연’위치에서 일부 이진 파일을 실행하면 충분합니다. ‘호스트’시스템 등
답변
sudo apt-get update
sudo apt-get install debootstrap qemu qemu-user-static
sudo qemu-debootstrap --arch armhf bionic armhf-chroot
sudo chroot armhf-chroot
uname -m
답변
Luc의 답변에 추가 : 인터프리터의 위치가 chroot에서 기본 파일 시스템과 동일한 지 확인해야합니다. 커널이 실행 파일의 아키텍처를 감지 한 후 인터프리터의 위치를 사용하여 update-binfmts --display
시작하기 때문입니다. 그래서 라인
cp $(which qemu-arm-static) /mnt/usr/bin
실제로해야합니다
cp $(which qemu-arm-static) /mnt/$(which qemu-arm-static)
그렇지 않으면 시스템에 위치 qemu-arm-static
가없는 경우 커널이 필요한 인터프리터를 찾을 수 없으므로 chroot 내에 “찾을 수 없음”오류가 발생할 /usr/bin
수 있습니다.