chroot antes de pivot_root causar erro de ocupado

0
# unshare -m
# mount --bind / /mnt
# cd /mnt
# chroot .
# pivot_root . mnt
pivot_root: failed to change root from '.' to 'mnt': Device or resource busy

Por que isso falha? Eu estava seguindo as instruções de man 2 pivot_mount .

pivot_root() may or may not change the current root and the current working directory of any processes or threads which use the old root directory. The caller of pivot_root() must ensure that processes with root or current working directory at the old root operate correctly in either case. An easy way to ensure this is to change their root and current working directory to new_root before invoking pivot_root().

Não vejo como isso corresponde ao erro EBUSY documentado.

ERRORS

pivot_root() may return (in errno) any of the errors returned by stat(2). Additionally, it may return:

EBUSY new_root or put_old are on the current root filesystem, or a filesystem is already mounted on put_old.

    
por sourcejedi 18.07.2018 / 17:42

1 resposta

1

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 .

    
por 18.07.2018 / 17:42

Tags