다른 아키텍처를 가진 파일 시스템으로 chroot하려면 어떻게해야합니까?


38

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

나는 이것이 아키텍처가 다르다는 것을 알고 있습니다. 내가 뭔가 잘못하고 있습니까?


2
당신은 구성 할 필요가 binfmt, 처음에보고해야 wiki.debian.org/QemuUserEmulation 조용한 짧은 소개를 들어. binfmt_misc 구성에 대한 예는 svn.kju-app.org/trunk/qemu/qemu/qemu-binfmt-conf.sh
Ulrich Dangel

Qemu 정적 패키지는 Arch 리포지토리에없는 것으로 보입니다.
Jivings 2016 년

2
죄송하지만 아치를 사용하지는 않지만 -static링커 옵션 에 추가 하여 정적 qemu 패키지를 만들 수있을 것입니다
Ulrich Dangel

답변:


15

다른 아키텍처로 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을 위해 컴파일 됨)를 실행할 수 있습니다.


6
binfmt네이티브가 아닌 대상을 실행 하기 위해 와 qemu를 함께 사용할 수 있어야합니다 -wiki.debian.org/QemuUserEmulation
Ulrich Dangel

2
에뮬레이션에 Qemu를 사용하는 방법을 알고 있습니다. 분명히 어떻게 할 수는 없지만 chroot와 함께 사용할 수 있습니다.
Jivings 2016 년

@ UlrichDangel, 예, 이것은 좋은 정보입니다. 그러나 나는 OP 가이 솔루션의 왕을 찾고 있지 않다고 생각합니다. binfmt는 qemu-arm 에뮬레이션으로 qemu를 올바르게 설치하면 가능하지만 qemu-system-arm이 필요한 ARM 에뮬레이션 환경 (예 : Raspberry Pi)에 들어가기를 원합니다.
0xAF

@ 0xAF 그러나 binfmt/ qemu-user솔루션은 OP가 설명한 것과 정확히
같으며

1
@UlrichDangel, 이제 잠깐만, 나는 당신이 옳다고 생각합니다. qemu-arm으로 에뮬레이트 된 chroot를 입력 할 수 있습니다. 이에 대한 의견을 편집하겠습니다.
0xAF

33

필자는 때때로 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

이것은 작동하지만 chroot 이후에 모든 명령은 그러한 파일이나 디렉토리를 제공하지 않습니다. Fedora 24, selinux 문제를 사용하고 있습니까? 도와주세요
Superbiji

@Superbiji 실행 중 /bin/ls입니까? 이 경우 $PATH변수가 설정되지 않았거나 깨졌습니다. 시도하십시오 export PATH=/sbin:/usr/sbin:/usr/bin:/bin. 추가해야 할 다른 경로가있을 수 있지만 이것은 좋은 시작일 것입니다. 그래도 동작하지 않는다면 바이너리를 chroot 환경에 복사하는 것을 잊었을 것입니다. 당신처럼, 너무 파일 시스템을 주변 탐색 bash에 사용할 수있는 echo /*거의 비슷하다 ls /*. SELinux가 방해가 될지 모르지만 경험이 없습니다.
Luc

1
심지어 ls도 제공합니다 /bin/ls: no such file or directory. 수출은 좋은 길을 보여줍니다. 그러나 echo / *가 작동하면 echo / usr / bin / qemu-arm * 파일을 나열하십시오. 나는 또한 sys, proc, dev를 마운트했다
Superbiji

1
도움을 주셔서 감사합니다 .. 원인은 binfmt에서 해석기가 잘못된 경로를
가리킴

1
좋아, 어떻게 든 qemu-arm-static을 bla/usr/bin대신 에 복사하여 해결되었습니다 bla/bin. 내가 그것을 실행할 때 which qemu-arm-static그것이 나에게 /bin/usr일관성이 있어야한다고 생각합니까?
dafnahaktana

10

나는 문제가 복사 안된다고 생각 qemu-arm하지만 qemu-arm-static. 이것은 라이브러리없이 chroot 안에서 실행할 수있는 정적 컴파일 실행 파일입니다.

/proc/sys/fs/binfmt_misc파일이 있는지 확인할 수도 있습니다 qemu-arm. 그렇지 않다면하면 서비스를 다시 시작합니다 binfmt_support.


update-binfmts --importdir / var / lib / binfmts / --import를 수동으로 실행해야 모든 것이 / proc / sys / fs / binfmt_misc에 나타 났으며 chroot가 작동했습니다.
Mariano Alvira

7

설치 작업 나는이를 얻으려면 qemu-static-armbinfmt-supportAUR에서.

에 대한 의견을 읽으십시오 qemu-user-static. PKGBUILDmakepkg를 끝내려면 최신 다운로드 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작동합니다.


6

다른 아키텍처를위한 (마운트 된) 파일 시스템에 'chroot'를 가장 확실하게 'chroot'하고 의미있는 작업을 수행하려면 올바른 도구 만 있으면됩니다.

chroot, mount --bind 및 binfmt_misc의 사용자 공간 구현 인 PRoot를 살펴보십시오. https://proot-me.github.io/

QEMU의 사용자 모드 에뮬레이터와 함께 모두 설정되었습니다.

일반적으로 '전체'부팅을 수행 할 수 없지만 (즉, init 및 서비스 시작) 이진 파일을 바인드 마운트 한 파일을 포함하여 모든 구성 파일에 액세스하여 '자연'위치에서 일부 이진 파일을 실행하면 충분합니다. '호스트'시스템 등


2
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 

1

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수 있습니다.


0

우분투에서 같은 문제가 발생했습니다. 나는 한 않았다 binfmt구성하고 qemu-arm-static호스트 시스템과 동일한 chroot를-ED 경로로 복사됩니다.

한 시간 후, 나는 set|grep bash호스트 머신에서 작업했습니다. 내가 가진 것을 발견 /bin/bash두 ENV 변수에 : SHELLSUDO_COMMAND. 변수를 바꾸고 나면 chroot가 ARM에서 작동했습니다.

SHELL=/bin/sh SUDO_COMMAND=/bin/sh chroot hd

0

나는이 OP에 대해 그가 단순히 다음을 실행하여 binfmts를 구성하기 만하면된다고 생각합니다.

update-binfmts --enable qemu-arm

이것을 실행 한 후, arm 파일 시스템으로의 chroot가 가능했을 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.