Essa parte da manpage é enganosa. Geralmente, você deseja uma ordenação diferente, conforme descrito em man 8 pivot_root
.
cd new_root # chdir(new_root);
pivot_root . put_old # pivot_root(".", put_old);
exec chroot . # chroot(".");
Este parece ser outro detalhe sutil com pivot_root
. Embora o ponto de pivot_root
seja reorganizar o namespace de montagem, o código do kernel parece dizer que o sistema de arquivos raiz que ele move é determinado pela raiz por processo, que é o que define chroot
.
Como resultado, encontramos o erro "new_root ou put_old estão no sistema de arquivos raiz atual".
Esse detalhe sutil de pivot_root
é necessário para que funcione em tudo no Linux moderno. Se ele foi definido para funcionar na montagem raiz do namespace de montagem, ele tentaria mover o sistema de arquivos rootfs
especial que você normalmente não pode ver . Mas isso não é permitido, porque rootfs deve sempre seja a montagem raiz do namespace .
Podemos confirmar que pivot_root
funciona desta forma, continuando o exemplo da seguinte forma.
# unshare -m
# mount --bind / /mnt
# cd /mnt
# chroot /mnt
# pivot_root . mnt
pivot_root: failed to change root from '.' to 'mnt': Device or resource busy
# exit # leave chroot
# mount --bind . mnt
# cd mnt
# mount --bind /proc proc
# findmnt | grep mnt
└─/mnt /dev/mapper/alan_dell_2016-fedora ext4 rw,relatime,seclabel
└─/mnt /dev/mapper/alan_dell_2016-fedora ext4 rw,relatime,seclabel
└─/mnt/proc proc proc rw,nosuid,nodev,noexec,relatime
# chroot /mnt # re-enter chroot
# cd /mnt
# pivot_root . mnt # this one works
# exit # leave chroot
# findmnt | grep mnt
└─/mnt /dev/mapper/alan_dell_2016-fedora ext4 rw,relatime,seclabel
├─/mnt/mnt /dev/mapper/alan_dell_2016-fedora ext4 rw,relatime,seclabel
└─/mnt/proc /dev/mapper/alan_dell_2016-fedora[/proc] ext4 rw,relatime,seclabel
A segunda chamada pivot_root
funciona. Mas isso não teve nenhum efeito na raiz do namespace de montagem. Olhando de fora do chroot
, ele trocou /mnt
e /mnt/mnt
.