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
Webの一部のソースによると、fakechroot
一貫して動作しません。これは失敗を説明する可能性があります。また、Dockerコンテナ内で実行される問題がないため、fakechroot
必要ありませんchroot
。 (私が知っている限り、GitLab CIランチャーは無許可モードで実行されます。)
一方、一部の特権タスク(mountやmountなど)は、権限のないDockerコンテナで失敗する可能性があるため、これはfakeroot
必要なようです。/sys
/proc
これはまた、一般を選択できることを意味します--variant
(これ以外は、fakechroot
環境で実行されないとエラーが発生しますfakechroot
)。
だからあきらめてfakechroot
他--variant
のものを使ってくださいfakechroot
(私の場合はbuildd
ビルドシステムを設定しているので)。次の方法は機能し、debootstrap
エラーなしで少なくとも2つのステップを完了します。
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
一部のパッケージも前の例と比較して変更されました。これが実際に必要かどうかは調べていません。