pivot_root de initramfs para nova raiz - erro “Argumento inválido”

3

You can not use pivot_root on an initramfs rootfs, you will get Invalid Argument. You can only pivot real filesystems.

De fato:

  1. Fedora Linux 28 - isso usa o dracut initramfs.
  2. Inicialize em um shell initramfs, incluindo rd.break como uma opção na linha de comando do kernel.
  3. cd /sysroot
  4. usr/bin/pivot_root . mnt

- > pivot_root falha com "Argumento inválido", correspondendo a um valor errno de EINVAL .

Não há explicação para isso em man 2 pivot_root :

EINVAL put_old is not underneath new_root.

Por que isso falha? E como o próximo comentador respondeu: "Então, como o Linux sairia do espaço do usuário inicial?"

    
por sourcejedi 14.07.2018 / 00:39

2 respostas

4

Ao contrário do initrd , o Linux não permite desmontar o initramfs . Aparentemente, isso ajudou a manter o código do kernel simples.

Em vez de pivot_root , você pode usar o comando switch_root . Ele implementa o procedimento a seguir. Observe que switch_root exclui todos os arquivos na raiz antiga para liberar a memória do initramfs, portanto, é necessário ter cuidado ao executar este comando.

initramfs is rootfs: you can neither pivot_root rootfs, nor unmount it. Instead delete everything out of rootfs to free up the space (find -xdev / -exec rm '{}' ';'), overmount rootfs with the new root (cd /newmount; mount --move . /; chroot .), attach stdin/stdout/stderr to the new /dev/console, and exec the new init.

Observe que os comandos do shell sugeridos são apenas equivalentes aproximados do código C. Os comandos não funcionarão a menos que estejam todos embutidos no seu shell, porque o primeiro comando exclui todos os programas e outros arquivos do initramfs: -).

Rootfs is a special instance of ramfs (or tmpfs, if that's enabled), which is always present in 2.6 systems. You can't unmount rootfs for approximately the same reason you can't kill the init process; rather than having special code to check for and handle an empty list, it's smaller and simpler for the kernel to just make sure certain lists can't become empty.

link

    
por 14.07.2018 / 00:39
0

A partir do comentário sobre o syscall pivot_root em fs / namespace.c :

Also, the current root cannot be on the 'rootfs' (initial ramfs) filesystem. See Documentation/filesystems/ramfs-rootfs-initramfs.txt for alternatives in this situation.

Eu enviei um patch para o manual as páginas projetam sobre isso , portanto, em futuras versões, man 2 pivot_root mencionará este caso.

    
por 09.08.2018 / 06:11