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

11

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 montará e rodará o pivot_root no sistema de arquivos raiz real. Então, o que esse initargumento significa? O caminho no initramfs? Ou, como imaginei, não é lido pelo kernel, mas pelo init do initramfs para executar o init real.

Além disso, o root=UUID=xxxxargumento é 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 todos eles são lidos pelo kernel ou pelo menos alguns deles são significativos apenas para os programas do espaço do usuário?

炸鱼 薯条 德里克
fonte

Respostas:

18

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

O kernel analisa os parâmetros da linha de comando do kernel até “-”; se ele não reconhece um parâmetro e não contém um '.', o parâmetro é passado para o init: os parâmetros com '=' entram no ambiente do init, outros são passados ​​como argumentos de linha de comando para o init. Tudo depois de "-" é passado como argumento para o init.

Isso não se aplica inite rootquais são realmente os parâmetros do kernel, e são tratados pelo kernel. Eles também podem ser usados ​​pelo espaço do usuário, uma vez que aparecem no /proc/cmdline. (Assim, por exemplo, systemd leva quietem consideração o parâmetro do kernel para reduzir sua saída.)

Quando o kernel é inicializado com um initramfs, o rootparâmetro não é usado diretamente pelo kernel e o initparâmetro é usado apenas se rdinitfalhar. inita inicialização é tratada kernel_init, que funciona da seguinte maneira:

  • se houver um "comando de execução do ramdisk" (o valor fornecido rdinitna linha de comando do kernel ou /init) que seja acessível, o kernel tentará executá-lo;
  • se isso falhar, e houver um "comando de execução" (o valor atribuído initna linha de comando do kernel), o kernel tenta executá-lo e entra em pânico se não puder;
  • como último recurso, o kernel tenta correr /sbin/init, /etc/init, /bin/init, e /bin/sh; se nenhum desses puder ser executado, entra em pânico .

Quando há um initramfs, tudo isso acontece lá, e o volume de destino não é montado pelo kernel. O que acontece depois que o kernel executa o primeiro initprograma (normalmente, o /initscript no initramfs) depende do programa, não do kernel. Os argumentos para os quais não foram passados initainda estão disponíveis /proc/cmdlinese o /procsistema de arquivos estiver montado.

Stephen Kitt
fonte
Também um pouco curioso, e se init-in-the-initramfs for um arquivo set-uid-non-root? Um arquivo sem bit executável? Será executado como root de qualquer maneira? E se ele estiver com ELF quebrado ou não conseguir encontrar um ld-linux.soELF ou um script muito profundo da recursão ou se algo não puder ser executado?
炸鱼薯条德里克
3
Eu tenho certeza que o kernel não carrega o programa especificado em "init =" no initramfs. Como um initramfs está em uso, parece que ele é executado normalmente antes da execução do programa init especificado pelo usuário (não tenho certeza se é o kernel que faz isso ou codifica no initramfs).
Plug
@ 炸鱼 薯条 德里克 Para especificar um programa alternativo em vez de /initinicializar a partir de um ramdisk, você pode usar o rdinit=/path/toparâmetro boot.
Pizdelect
3

Passar argumentos personalizados do kernel é 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 das outras compilações do 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. Felizmente, rótulos diferentes são usados ​​para personalizações locais e não são usados ​​pelo kernel, dado o único espaço de nome envolvido.

agitar
fonte