docker에서 debootstrap --fakechroot를 사용한 두 번째 단계가 실패합니다(/lib/ld-linux-armhf.so.3: 해당 파일 또는 디렉터리가 없음).

docker에서 debootstrap --fakechroot를 사용한 두 번째 단계가 실패합니다(/lib/ld-linux-armhf.so.3: 해당 파일 또는 디렉터리가 없음).

Docker 컨테이너에 외부 chroot를 설정하려고 합니다. 스크립트 발췌:

apt-get -y install debootstrap fakechroot fakeroot qemu-user-static binfmt-support
mkdir -p $CROSS_ROOT
fakechroot fakeroot -s .fakeroot.state debootstrap --variant=fakechroot --include=fakeroot,build-essential,ca-certificates,debian-archive-keyring,git,sudo --arch=${CROSS_ARCH} --foreign ${CROSS_RELEASE} $CROSS_ROOT $CROSS_MIRROR
mkdir -p $CROSS_ROOT/usr/bin
ln /usr/bin/qemu-*-static $CROSS_ROOT/usr/bin/
fakechroot fakeroot -i .fakeroot.state -s .fakeroot.state chroot $CROSS_ROOT /debootstrap/debootstrap --second-stage

Debian Buster/armhf의 경우 마지막 줄은 다음 오류 메시지와 함께 실패합니다.

/lib/ld-linux-armhf.so.3: No such file or directory

그러나 ls -la $CROSS_ROOT/lib/ld-linux-*마지막 줄 앞에 삽입하면 라이브러리 파일이 발견됩니다.

lrwxrwxrwx 1 root root 30 Mar 15  2022 /opt/chroot/armhf/lib/ld-linux-armhf.so.3 -> arm-linux-gnueabihf/ld-2.28.so

링크 대상도 존재합니다:

-rwxr-xr-x 1 root root 105840 Mar 15  2022 /opt/chroot/armhf/lib/arm-linux-gnueabihf/ld-2.28.so

그러니 도서관은 당연히 있어야 할 곳에 있는 것입니다. 여기에 무슨 문제가 있으며 어떻게 해야 합니까?

답변1

웹의 일부 소스에 따르면 일관 fakechroot되지 않게 동작하며 이는 실패를 설명할 수 있습니다. 또한 Docker 컨테이너 내부에서 실행되는 문제가 없으므로 fakechroot필요하지 않습니다 chroot. (내가 아는 한 GitLab CI 실행기는 권한 없는 모드에서 실행됩니다.)

반면에 일부 권한 있는 작업(예: mount 및 mount )은 권한이 없는 Docker 컨테이너에서 실패할 수 있으므로 이는 fakeroot필요한 것 같습니다 ./sys/proc

이는 또한 일반을 선택할 수 있음을 의미합니다 --variant(이 외에 다른 것은 fakechroot환경에서 실행되지 않으면 오류가 발생합니다 fakechroot).

그러니 포기 fakechroot하고 --variant다른 것을 사용하세요 fakechroot(제 경우에는 buildd빌드 시스템을 설정하고 있기 때문에). 다음 방법은 작동하며 debootstrap오류 없이 최소 두 단계를 완료합니다.

apt-get -y install debootstrap fakechroot fakeroot qemu-user-static binfmt-support
mkdir -p $CROSS_ROOT
fakeroot -s .fakeroot.state debootstrap --variant=buildd --include=fakechroot,fakeroot,build-essential,ca-certificates,debian-archive-keyring,git,sudo --arch=${CROSS_ARCH} --foreign ${CROSS_RELEASE} $CROSS_ROOT $CROSS_MIRROR
mkdir -p $CROSS_ROOT/usr/bin
ln /usr/bin/qemu-*-static $CROSS_ROOT/usr/bin/
fakeroot -i .fakeroot.state -s .fakeroot.state chroot $CROSS_ROOT /debootstrap/debootstrap --second-stage --verbose

일부 패키지도 이전 예제와 비교하여 변경되었습니다. 이것이 실제로 필요한지 여부는 조사하지 않았습니다.

관련 정보