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