Quando você usaria pivot_root sobre switch_root?

19

Estou querendo entender melhor o processo de inicialização do Linux, a fim de inicializar um sistema através do ceph em vez de nfs.

No processo, me deparei com duas formas de mudar de raiz. Um chamado switch_root e o outro chamado pivot_root. Esses scripts estão sendo executados a partir de um sistema de arquivos em memória (initramfs) obtido via tftp usando o processo de inicialização do pxe.

Quando você usaria um sobre o outro? Eu vi os dois usados ​​em alguns scripts de inicialização colocados na raiz.

Matt H
fonte

Respostas:

16

Encontrei uma explicação maravilhosa aqui . No entanto, deixe-me tentar colocar em um formato mais curto do que entendi na resposta.

Versão mais curta

  1. Enquanto o sistema é inicializado, ele precisa de um espaço inicial do usuário. Isso pode ser alcançado usando initramfs ou initrd.
  2. O initrd é carregado no ramdisk, que é um sistema de arquivos real .
  3. O initramfs não é um sistema de arquivos .
  4. Para initrd pivot_root é usado e para initramfs switch_root é usado.

Versão Longa

Agora, para a explicação detalhada do que eu havia colocado acima.

Enquanto um initramfs e um initrd servem ao mesmo propósito, existem 2 diferenças. A diferença mais óbvia é que um initrd é carregado em um ramdisk. Consiste em um sistema de arquivos real (normalmente ext2) que é montado em um ramdisk. Um initramfs, por outro lado, não é um sistema de arquivos. É simplesmente um arquivo cpio (compactado) (do tipo newc) que é descompactado em um tmpfs. Isso tem um efeito colateral de tornar o initramfs um pouco mais otimizado e capaz de carregar um pouco mais cedo no processo de inicialização do kernel do que um initrd. Além disso, o tamanho dos initramfs na memória é menor, pois o kernel pode adaptar o tamanho dos tmpfs ao que é realmente carregado, em vez de depender de tamanhos predefinidos de ramdisk,

Há também outra diferença de efeito colateral: como o dispositivo raiz (e a mudança para ele) é tratado. Como um initrd é um sistema de arquivos real descompactado no ram, o dispositivo raiz deve realmente ser o ramdisk. Para um initramfs, existe um kernel "rootfs" que se torna o tmpfs no qual o initramfs é descompactado (se o kernel carrega um initramfs; caso contrário, o rootfs é simplesmente o sistema de arquivos especificado pelo parâmetro de inicialização root = kernel), mas esse rootfs provisório não deve ser especificado como o parâmetro root = boot (e não haveria uma maneira de fazer isso, pois não há dispositivo conectado a ele). Isso significa que você ainda pode passar seu dispositivo raiz real para o kernel ao usar um initramfs. Com um initrd, você precisa processar qual é o seu verdadeiro dispositivo raiz. Além disso, desde o "real" Se o dispositivo raiz com um initrd é o ramdisk, o kernel precisa realmente trocar os dispositivos raiz de um dispositivo real (o ramdisk) para outro (sua raiz real). No caso de um initramfs, o espaço initramfs (o tmpfs) não é um dispositivo real, portanto o kernel não alterna dispositivos reais. Assim, enquanto o comando pivot_root é usado com um initrd, um comando diferente deve ser usado para um initramfs. O Busybox fornece switch_root para fazer isso, enquanto o klibc oferece new_root. um comando diferente deve ser usado para um initramfs. O Busybox fornece switch_root para fazer isso, enquanto o klibc oferece new_root. um comando diferente deve ser usado para um initramfs. O Busybox fornece switch_root para fazer isso, enquanto o klibc oferece new_root.

Ramesh
fonte
2
Eu usei pivot_rootno passado o initramfs, switch_rootnão existia naquele momento. switch_rootparece ser um método de conveniência de pivot_rootque faz mais alguma limpeza e também se move /proc /syse /devetc, e não apenas a própria raiz
Daniel Alder
2
Você não pode usar pivot_root em um initframfs rootfs, você receberá Argumento Inválido. Você só pode dinamizar sistemas de arquivos reais.
TiCPU
@TiCPU Então, como o Linux sairia do espaço inicial do usuário?
Melab
A solução fornecida parece estar errada. O próprio Linus diz que pivot_root () ou chroot () mudará apenas a referência atual dos processos /. Portanto, pelo que entendi, poderia haver qualquer caminho e não tem nada a ver com os "discos" reais.
11117 erikbwork