나는 다음이 작동할 것이라고 가정합니다:
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/bash
chroot 내에서 해당 종속성을 해결할 수 있어야 합니다.
내 시스템에서:
$ 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 시스템에서 다르지만 ldd
Linux에서도 동일한 기본 정보(공유되는 라이브러리 및 위치)가 표시되어야 합니다.
제가 사용하려고 하면매우단순화된 chroot에는 /bin/sh
및 /bin/bash
(doas
OpenBSD에 대한 " 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