Estou tentando configurar um chroot estrangeiro em um contêiner docker. Trecho do roteiro:
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
Para Debian buster/armhf, a última linha falha com a seguinte mensagem de erro:
/lib/ld-linux-armhf.so.3: No such file or directory
Porém, quando insiro ls -la $CROSS_ROOT/lib/ld-linux-*
antes da última linha, o arquivo da biblioteca é encontrado:
lrwxrwxrwx 1 root root 30 Mar 15 2022 /opt/chroot/armhf/lib/ld-linux-armhf.so.3 -> arm-linux-gnueabihf/ld-2.28.so
O destino do link também existe:
-rwxr-xr-x 1 root root 105840 Mar 15 2022 /opt/chroot/armhf/lib/arm-linux-gnueabihf/ld-2.28.so
Portanto, a biblioteca está definitivamente onde deveria estar. O que há de errado aqui e o que posso fazer a respeito?
Algumas fontes na net indicam que
fakechroot
se comporta de maneira inconsistente, o que pode explicar as falhas. Além disso,fakechroot
não deve ser necessário, poischroot
é executado sem problemas em um contêiner do Docker (GitLab CI runner, que, pelo que entendi, é executado em modo não privilegiado).Por outro lado,
fakeroot
parece ser necessário, pois algumas operações privilegiadas (ou seja, montagem/sys
e/proc
) falharão em um contêiner Docker não privilegiado.Isso também significa que podemos selecionar um regular
--variant
(qualquer coisa diferente defakechroot
, que apresentará um erro se não estiver sendo executado em umfakechroot
ambiente).Portanto, solte
fakechroot
e use um--variant
diferentefakechroot
(no meu caso,buildd
como estou configurando um sistema de compilação). O seguinte funcionou, pelo menos a ponto dedebootstrap
terminar as duas etapas sem erros:Alguns pacotes também foram alterados em relação ao exemplo anterior; Não investiguei se isso é realmente necessário.