Chroot는 `/bin/bash`를 찾을 수 없습니다

Chroot는 `/bin/bash`를 찾을 수 없습니다

나는 다음이 작동할 것이라고 가정합니다:

mkdir /tmp/chrootTest # Create chroot folder.
mkdir /tmp/chrootTest/bin # Create `/bin` in the chroot folder.
sudo mount -B /bin /tmp/chrootTest/bin/ # Bind-mount the real system's `/bin` to the chroot's `/bin`.
sudo chroot /tmp/chrootTest/ /bin/bash # Execute (open) `/bin/bash` in the chroot.

그러나 마지막 명령은 다음을 생성합니다.

chroot: failed to run command ‘/bin/bash’: No such file or directory

/bin또한 복사 하고 /tmp/chrootTest/bin전체 권한을 부여해 보았습니다 . 그러나 이것도 작동하지 않습니다.

/bin/bash다른 파일을 찾을 수 없기 때문에 매우 기본적인 chroot에서 작동할 수 없다는 오류 메시지가 표시되어도 전혀 놀라지 않을 것입니다. 그러나 파일이 분명히 존재하기 때문에 인쇄된 오류 메시지는 놀랍습니다.

왜 이런 일이 발생합니까? chroot에서 bash를 성공적으로 열려면 무엇이 필요합니까?

답변1

공유 라이브러리 종속성이 있는 바이너리 인 경우 /bin/bashchroot 내에서 해당 종속성을 해결할 수 있어야 합니다.

내 시스템에서:

$ ldd $( command -v bash )
/usr/local/bin/bash:
        Start            End              Type Open Ref GrpRef Name
        0000115f08700000 0000115f08a0c000 exe  1    0   0      /usr/local/bin/bash
        00001161f6a2e000 00001161f6c88000 rlib 0    1   0      /usr/lib/libtermcap.so.14.0
        00001161bc41e000 00001161bc629000 rlib 0    1   0      /usr/local/lib/libintl.so.6.0
        000011614b1de000 000011614b4dd000 rlib 0    2   0      /usr/local/lib/libiconv.so.6.0
        00001161bd091000 00001161bd35b000 rlib 0    1   0      /usr/lib/libc.so.89.2
        000011612ef00000 000011612ef00000 rtld 0    1   0      /usr/libexec/ld.so

비교해 보면:

$ ldd $( command -v sh )
/bin/sh:
        Start            End              Type Open Ref GrpRef Name
        000007ca3c446000 000007ca3c6c6000 dlib 1    0   0      /bin/sh

저는 OpenBSD를 사용하고 있습니다. 출력 형식은 Linux 시스템에서 다르지만 lddLinux에서도 동일한 기본 정보(공유되는 라이브러리 및 위치)가 표시되어야 합니다.

제가 사용하려고 하면매우단순화된 chroot에는 /bin/sh/bin/bash (doasOpenBSD에 대한 " sudo대체" ):

$ doas chroot -u kk t /bin/sh
/bin/sh: No controlling tty (open /dev/tty: No such file or directory)
/bin/sh: warning: won't have full job control
$ /bin/bash
Abort trap

쉘( )을 얻었 /bin/sh지만 /bin/bash실패했습니다. 이 오류는 귀하의 오류와 다르지만 원인은 같다고 생각합니다. /bin/bash이 명령을 직접 실행하면 chroot"Abort"라는 한 단어 메시지만 표시됩니다. 이는 아마도 라이브러리와 동일한 문제 때문일 것입니다.

결론적으로: chroot에는 실행 파일을 실행하는 데 필요한 장치 파일 및 라이브러리를 포함하여 최소한 시스템의 최소 설치가 포함되어야 합니다.

Linux의 "해당 파일 또는 디렉터리가 없습니다" 오류에 대한 설명:

Linux에서 오류가 "해당 파일 또는 디렉터리 없음"인 이유가 약간 혼란스러워서 strace.

execve()쉘에 대한 호출은 ENOENT를 반환해야 합니다:

execve("/bin/bash", ["/bin/bash"], [/* 13 vars */]) = -1 ENOENT (No such file or directory)

...그래서 뭔가 문제가 있는 것 같아요발견하다/bin/bash. 그러나 execve(2)설명서를 읽은 후 다음을 발견했습니다.

ENOENT파일 이름이나 스크립트 또는 ELF 해석기가 존재하지 않습니다.또는 인터프리터가 요구하는 파일이나 공유 라이브러리를 찾을 수 없습니다.

그러면 그렇게 해.

답변2

설치 시스템과 chroot에 사용되는 미디어의 아키텍처가 동일한지 확인하세요.

/mnt에 마운트한 파티션이 시스템을 설치할 때 / 파티션과 동일합니까?

나는 이런 식으로 chroot합니다.

ext* 파일 시스템의 경우.

sudo mount /dev/sdxY /mnt

별도의 /boot BIOS 모드 파티션의 경우

sudo mount /dev/sdzY /mnt/boot

efi 모드의 경우

sudo mount /dev/sdwY /mnt/boot/efi

Vituelle 파일 시스템 마운트

for dir in /dev /dev/pts /proc /sys /run; do sudo mount --bind $dir /mnt/$dir; done

네트워크 액세스의 경우

cp -a /etc/resolv.conf /mnt/etc/resolve.conf

그 다음에

sudo chroot /mnt /bin/bash

하지만 저는 데비안과 우분투에서만 사용합니다.

답변3

예제 코드를 다음과 같이 수정하세요. (저에게 효과적이었습니다)

mkdir /tmp/chrootTest
mkdir /tmp/chrootTest/bin
mkdir /tmp/chrootTest/lib
mkdir /tmp/chrootTest/lib64
sudo mount -B /bin /tmp/chrootTest/bin/
sudo mount -B /lib /tmp/chrootTest/lib/
sudo mount -B /lib64 /tmp/chrootTest/lib64/
sudo chroot /tmp/chrootTest/ /bin/bash

관련 정보