Dado vmlinuz e initrd.gz, como eu descubro, onde o kernel vai carregar o sistema de arquivos / (root)?

3

Estou tentando várias formas de instalação do Linux (de iso, flash, iso em flash, kernel em flash, root em iso-file em flash ...) e quero entender o que está acontecendo.

Minha pergunta é: é possível, dado o kernel construído e os arquivos ramfs de uma distribuição (vmlinuz e initrd), descobrir onde eles vão procurar o sistema de arquivos "/"? É possível configurar isso sem recompilar o kernel?

E mais um: quando o kernel carrega o sistema de arquivos raiz do dispositivo de loopback, criado a partir do sistema de arquivos .iso, como posso configurar esse processo? Obrigado!

EDITAR: Na verdade, a configuração do GRUB contém a raiz do GRUB, que é não a sistema de arquivos raiz real do kernel , mas apenas uma pasta que contém os pertences do GRUB.

A raiz real é configurada no script init em initrd , conforme descrito aqui .

É assim que o kernel do Debian encontra um arquivo ISO no disco rígido, ao inicializar a partir dele - o initramfs o encontra: link ; Observe que a configuração do GRUB não contém nenhuma referência à localização ISO .

    
por Boris Burkov 18.09.2012 / 20:16

4 respostas

6

Ele é fornecido no momento da inicialização pelo bootloader , por exemplo, o Grub.

Para ver com quais argumentos seu kernel foi iniciado, faça o seguinte:

$ cat /proc/cmdline

Para mim, isso gera:

BOOT_IMAGE=/vmlinuz-3.5.0-13-generic root=/dev/mapper/crypt-precise--root ro

Assim, o initrd / initramfs tentará montar meu volume lógico /dev/mapper/crypt-precise--root (LVM criptografado) como / .

Você pode reconfigurar o Grub para carregar outros sistemas operacionais do seu disco rígido usando o mesmo kernel (multi-boot) ou editar este tempo de execução pressionando e enquanto seleciona (ainda não inicializa) o Grub entrada.

Para distribuições baseadas em Debian recentes, alterá-lo permanentemente funciona assim:
(tenha cuidado, você pode não conseguir inicializar em seu sistema operacional original novamente!)

No arquivo /etc/default/grub defina GRUB_CMDLINE_LINUX="root=/dev/mydevice" e atualize o Grub fazendo update-grub .

No entanto, recomendo que você configure a inicialização múltipla, caso contrário não será possível alterar ou atualizar sua configuração do Grub novamente com facilidade.

    
por 18.09.2012 / 20:26
3

Dada a imagem de inicialização, você pode encontrar uma string de versão interna do kernel com o comando file :

%> file /boot/vmlinuz-linux
/boot/vmlinuz-linux: Linux kernel x86 boot executable bzImage, version 3.5.3-1-NAME (X@Y) #1 SMP PREEMPT WEEK MON DAY, RO-rootFS, swap_dev 0x5, Normal VGA
    
por 19.09.2012 / 03:37
1

Na maioria das instalações, você especifica o dispositivo raiz para o bootloader. O dispositivo raiz é passado para o kernel como um parâmetro chamado root . Dependendo do bootloader, isso pode fazer parte dos argumentos da linha de comando do kernel (que podem parecer com ro quiet root=/dev/sda1 ) ou de uma configuração separada. Para alguns bootloaders comuns:

  • Lilo: no arquivo de configuração ( /etc/lilo.conf ), há uma diretiva root para indicar o dispositivo raiz do Linux.
  • Grub legado (versões 0.9x): no arquivo de configuração (normalmente /boot/grub/menu.lst ), o dispositivo raiz é passado como parte da linha de comando do kernel ( kernel directive). Note que existe uma diretiva root diferente para o próprio Grub; que diz ao Grub onde procurar por arquivos como o kernel. Em muitos sistemas, o arquivo de configuração do Grub é gerado pelo script update-grub , que preenche o dispositivo raiz do sistema instalado (usando /boot/grub/device.map ).
  • Grub 2 (versões 1.9x): no arquivo de configuração (normalmente /boot/grub/grub.cfg ), o dispositivo raiz é passado como parte da linha de comando do kernel ( linux directive). Observe que há uma variável root diferente ( set root=(hd0,1) ) que informa ao Grub onde procurar por arquivos como o kernel. Em muitos sistemas, o arquivo de configuração do Grub é gerado pelo script update-grub , que preenche o dispositivo raiz do sistema instalado (usando /boot/grub/device.map ).
  • U-Boot: o dispositivo raiz é passado como parte dos argumentos da linha de comando na variável de ambiente bootargs . O binário do U-Boot contém um valor padrão embutido no tempo de compilação, que pode ser substituído por uma configuração na memória flash (se o dispositivo permitir).

Na ausência de um argumento de linha de comando root , o initrd ou o initramfs, se usado, pode tentar encontrar uma partição raiz para montar. Mesmo na presença de um argumento root , o initrd ou o initramfs podem decidir usar um dispositivo diferente. O código chama switch_root para alternar do initrd para a raiz real.

O dispositivo raiz padrão quando não há nenhum argumento de linha de comando root é determinado em tempo de compilação. Você pode alterar esse valor em uma imagem binária com o utilitário rdev .

Em um kernel inicializado, você pode ver o parâmetro root (se houver) que foi passado para o kernel em /proc/cmdline . Você pode ver o dispositivo real montado em / in /proc/mounts .

    
por 19.09.2012 / 02:24
1

Não tenho certeza se isso ainda é interessante, mas para futuros googlers como eu:

Existem dois diretórios root separados ao iniciar / instalar a partir do grub. Há o grub root e o linux root (não tenho certeza se esse é o termo técnico).

A raiz do grub pode ser definida dentro do grub.cfg e determina quais arquivos são facilmente visíveis dentro do grub. A raiz padrão do grub deve ser o diretório raiz do grub de inicialização da unidade, portanto, se o conteúdo da sua unidade inicializável for:

/boot/
/boot/grub2/
/boot/grub2/grub.cfg
...

Em seguida, a localização do grub.cfg da raiz do grub é /boot/grub2/grub.cfg

A raiz do grub pode ser alterada no grub.cfg usando set root= .

Você pode usar isso para definir a raiz em um diretório dentro da raiz atual ( set root=/boot/ causaria a grub.cfg estar localizada em /grub2/grub.cfg ), que se comporta de maneira semelhante a chroot no Linux.

Você também pode alterar a raiz atual para outra unidade ( set root=(hd0,1) definiria sua raiz como hd0, partição 1. Para obter uma lista completa de quais dispositivos você pode usar, consulte a página do grub sobre ela link ).

Embora a mudança do root root possa ser útil, você também pode prefixar qualquer caminho com o que quer que fosse usar (e.x. linux (hd0,1):/boot/OS/RHEL/isolinux/vmlinuz em vez de set root=(hd0,1) primeiro). Além disso, uma vez que o kernel inicia, a raiz do grub é irrelevante

Quanto ao Linux root , esse é um parâmetro que você pode passar o kernel (vmlinuz) quando você carregá-lo. Para isso, você pode passar ao kernel um parâmetro root= (este valor aparecerá em / proc / cmdline)

No entanto, é importante notar que esta nova raiz deve conter um sistema de arquivos raiz do Linux (procurando por / etc / / var / e assim por diante). Ao instalar você fornece o initrd (INITial Ram Disk) que contém esses elementos, então você provavelmente não quer / precisa alterar a raiz do Linux durante a instalação.

Se você alterar a raiz do Linux, tenha cuidado, pois a mídia de instalação do Linux não é um sistema de arquivos raiz do Linux, embora o initrd.img contido seja.

Se o que você está tentando fazer é usar arquivos dentro do seu iso como argumentos para o seu kernel, então existe uma solução. Se você criar um dispositivo de loopback no grub, o dispositivo persistirá quando o kernel iniciar (então você deve ver um dispositivo chamado /dev/loop0 na raiz do Linux durante a instalação)

Vou dar um pequeno trecho de um grub.cfg relacionado a ISOs e RHEL especificamente:

menuentry "RHEL" {
    set isofile='/boot/iso/RHEL.iso' #this is just a grub variable

    loopback loop $isofile           #mount the $isofile with label=loop as a loopback device

    set root=(loop)                  #set the grub root to the mounted iso (so / is the top level directory in the iso)

    #this starts the kernel and passes the paramter inst.stage2 using the ISO and kickstart as a location on the loopback device created by grub (the syntax for this line is liable to change between distros)
    linux /isolinux/vmlinuz noeject inst.ks=hd:/dev/loop0:/ks/ks.cfg inst.stage2=hd:LABEL=USBDRIVELABEL:/$isofile  

    initrd /isolinux/initrd.img      #provide an initial ramdisk (which will become the **Linux root**
}

Lembre-se de que a sintaxe da linha do kernel no grub.cfg é:

linux [path to kernel] [kernel argument 1] [kernel argument 2] ...

Os argumentos do kernel aparecerão em /proc/cmdline . É importante notar que, porque eles são processados pelo kernel, a sintaxe do grub não é válida.

Você pode encontrar mais informações sobre isso na documentação do grub ( link )

e página do archwiki dos parâmetros do kernel ( link )

bem como opções de inicialização para sua distro relevante (RHEL link )

    
por 11.02.2016 / 23:30