O script / init (ou / linuxrc) cria nós de dispositivos temporários em / dev?

5

Considerando que o GRUB executa as seguintes linhas:

kernel /vmlinuz root=/dev/sda1 ro
initrd /initrd

Na inicialização, como o kernel do Linux descobre o /dev/sda1 device node?

Eu sei que as imagens initrd / initramfs contêm módulos para dispositivos de armazenamento (etc.), que são carregados na memória para permitir o acesso ao armazenamento. O que me incomoda é como exatamente o parâmetro do kernel root=/dev/sda1 é analisado pelo kernel.

O script /init (ou /linuxrc ) em initrd / initramfs cria o diretório /dev e, em seguida, o nó do dispositivo /dev/sda1 ? Ou os números "maior" e "menor" de /dev/sda1 são codificados no kernel?

    
por evaldaz 22.07.2012 / 14:39

3 respostas

3

Se você tiver um initramfs, o kernel apenas descompacta e monta o initramfs e executa /init posteriormente. Todo o resto será tratado pelo executável /init . Isso também significa que o kernel não monta o dispositivo especificado no parâmetro de inicialização root .

Distribuições diferentes usam estruturas initramfs diferentes, como, por exemplo, dracut para o Fedora ou initramfs-tools para o Debian. As soluções mais comuns são o uso de algo como udev , mdev ou devtmpfs . Alguns também podem usar apenas MAKEDEV para gerar um layout estático ou ter os arquivos do dispositivo já integrados em sua imagem.

Se você inicializar sem um initramfs, o kernel pode inicializar a partir de dispositivos com números principais / secundários conhecidos, por exemplo, /dev/sda1 , mas não de dispositivos lvm.

    
por 22.07.2012 / 16:01
0

Os principais números menores do dispositivo raiz são armazenados na imagem do kernel (consulte a página manpage de rdev para obter mais informações).

No entanto, os argumentos da linha de comando do kernel NÃO são interpretados pelo kernel. O ramdisk inicial, initrd, contém um sistema de arquivos com um mínimo de linux que normalmente faz a parte de interpretação. Como o initrd funciona depende da sua distribuição. Ele pode simplesmente conter o nó / dev / sda1 ou algum script / programa que o cria em tempo de execução.

Se você estiver em um Linux baseado em Debian, você pode descompactar seu ramdisk assim:

mkdir /tmp/initrd
cd /tmp/initrd
zcat /boot/path/to/initrd | cpio -iv

Os initrds debian são scripts e você pode ver como funciona. Depois que o kernel tiver descompactado o initrd, ele inicia o script init , que você deve encontrar agora em /tmp/initrd . Observe o bloco em que diz for x in $(cat /proc/cmdline); do .

Em /proc/cmdline os argumentos são passados usando o Grub (você pode verificar / verificar isso agora mesmo com o seu shell!). Se você se interessar em aprofundar o Debrian initrd, você pode fazer seu kernel / initrd usar um compartilhamento NFS como sistema de arquivos raiz, passando a opção root=/dev/nfs com o Grub. Quando você fizer isso, nenhum nó /dev/nfs será criado ou montado. Apenas diz ao initrd o que fazer.

No final, cada initrd executará o comando fornecido por alguma opção como init= ou o padrão /sbin/init

Voltando à sua pergunta inicial no título: yes / init (provavelmente) cria esse nó em tempo de execução. Ele usa todos os tipos de programas / heurísticas / voodoo para descobrir como montar seu sistema de arquivos raiz.

    
por 23.07.2012 / 09:33
0

O código inicial executa um programa chamado mdev , que é basicamente uma versão reduzida de udev . Isso verifica todos os dispositivos e cria o conteúdo inicial da pasta /dev . O kernel pode efetivamente executar mount /dev/sda1 / e começar a encontrar o sistema completo.

Veja aqui você quer saber mais sobre mdev .

Números de dispositivos maiores e menores são codificados nos módulos de kernel que são drivers de dispositivo e que usam números principais estáticos (veja, por exemplo, Documentation / devices.txt nos fontes do kernel). A maioria dos módulos do kernel do driver de disco (todos?) Se encaixaria nessa categoria. Então, como diz Ulrich Dangel, alguns kernels podem inicializar sem um initramfs / initrd desde que os módulos necessários estejam estaticamente ligados à imagem do kernel.

    
por 22.07.2012 / 15:17