Todos os argumentos do kernel são realmente usados pelo kernel?

10

Por que o Linux permite 'init = / bin / bash'?

Eu li isso, as respostas estão dizendo que é o KERNEL executando este programa init.

Então comecei a me perguntar, o Linux geralmente vem com um initramfs, que eventualmente irá montar e pivot_root para o sistema de arquivos raiz real. Então, o que esse argumento init significa? O caminho no initramfs? Ou como eu imaginei, ele não é lido pelo kernel, mas pelo init do initramfs para executar o init real.

Além disso, o argumento root=UUID=xxxx é realmente lido pelo kernel ou apenas pelo init do initramfs para encontrar o sistema de arquivos raiz real?

Parece que posso passar qualquer argumento que eu queira como argumentos do kernel, então eles são todos lidos pelo kernel ou pelo menos alguns deles são significativos apenas para programas de espaço do usuário?

    
por 神秘德里克 04.10.2018 / 16:20

2 respostas

16

Os parâmetros transmitidos na linha de comando do kernel não precisam ser significativos para o kernel: a documentação dos parâmetros do kernel diz

The kernel parses parameters from the kernel command line up to “–”; if it doesn’t recognize a parameter and it doesn’t contain a ‘.’, the parameter gets passed to init: parameters with ‘=’ go into init’s environment, others are passed as command line arguments to init. Everything after “–” is passed as an argument to init.

Isso não se aplica a init e root , que são realmente parâmetros do kernel e são manipulados pelo kernel. Eles também podem ser manipulados pelo espaço do usuário, uma vez que aparecem em /proc/cmdline . (Assim, por exemplo, o systemd considera o parâmetro quiet do kernel para reduzir sua saída.)

Quando o kernel é inicializado com um initramfs, os parâmetros init e root não são usados pelo kernel diretamente; no que diz respeito ao kernel, eles são fallbacks caso o initramfs não funcione (mas eles ainda são parâmetros do kernel). O initramfs em si é o sistema de arquivos raiz (pelo menos para inicialização), e o kernel procura por um executável init no diretório raiz do initramfs e executa isso. Se alguma coisa falhar (o initramfs não é utilizável, ou não contém /init , ou o último não é executável), o kernel tentará montar o dispositivo especificado por seu parâmetro root e executar /sbin/init ou o executável especificado pelo parâmetro init .

    
por 04.10.2018 / 16:40
3

Transmitir argumentos de kernel personalizados é uma maneira de personalizar um sistema durante uma instalação do KickStart, por exemplo, um servidor PXE pode definir:

linuxefi /c7/vmlinuz ks=http://.../ks/c7 lab ksdevice=eth0 net.ifnames=0 biosdevname=0

onde lab é então usado na configuração do KickStart para fazer coisas diferentes do que para outras compilações de sistema:

%pre
...
case " $(cat /proc/cmdline)" in
   ...
   *\ lab*)
      filesystems_lab
      ;;
   *)
      filesystems_common
      ;;
...

Aqui para configurar um layout de sistema de arquivos diferente do usado em outros tipos de sistema. Espero que rótulos diferentes sejam usados para personalizações locais do que os usados pelo kernel, dado o namespace único envolvido.

    
por 04.10.2018 / 17:01