É possível colocar root no LVM sem usar o initrd?


12

Acabei de configurar um sistema básico do Gentoo (o que significa que posso inicializar, efetuar login e fazer coisas com ele agora). Minha partição raiz está em um grupo virtual LVM2 (com uma /bootpartição separada ). Para inicializar, preciso passar os parâmetros abaixo para o kernel:

root=/dev/ram0 real_root=/dev/vg/rootlv init=/linuxrc dolvm

Aparentemente, ele está usando um ramdisk inicial para fazer alguma coisa (eu acho que carregando as coisas do LVM) antes de montar o root. Existe uma maneira de eu colocar esse código no próprio kernel para que nenhum initrd seja necessário? Se não, como posso fazer o initrd sozinho?

Pode ser útil acrescentar que eu tentei compilar o kernel para raiz não LVM, sem o initrd e funcionou perfeitamente. Então tentei colocar tudo sob o LVM e não consegui inicializar a máquina (acho que não pode lidar com o material do LVM). Então eu usei a genkernelferramenta com a --lvmopção e ela cria o kernel e o initrd que estou usando no momento.

Agora eu quero pular genkernele fazer tudo sozinho, de preferência sem o initrd, para que a máquina inicialize um pouco mais rápido (não preciso da flexibilidade de qualquer maneira).


Um initrd pode ter um pequeno efeito nos tempos de inicialização, mas não afetará o desempenho do seu sistema quando estiver em funcionamento.
Kristof Provost

oh sim, eu realmente significou tempo de boot, editado
phunehehe

Respostas:


6

Resposta simples: Não. Se você deseja LVM, precisa de um initrd.

Mas, como outros já disseram antes: os LVMs não diminuem a velocidade do seu sistema ou fazem algo de ruim de outra maneira, eles apenas permitem que você crie um ambiente que permita ao seu kernel carregar e fazer o seu trabalho.

O initrd permite que seu kernel seja carregado: Se seu kernel estiver em uma unidade LVM, todo o ambiente LVM deve ser estabelecido antes que o binário que contém o kernel possa ser carregado.

Confira a entrada da Wikipedia no initrd, que explica o que o initrd faz e por que você precisa.

Outra observação: Entendo que você quer fazer as coisas sozinho, mas você pode sujar as mãos, mesmo com o genkernel. Use genkernel --menuconfig all e você pode basicamente definir tudo como se fosse construir seu kernel completamente sem o suporte de ferramentas, o genkernel apenas adiciona o make bzImage, make modules e make modules_install linhas para você e faz essas coisas desagradáveis ​​do initrd.

Obviamente, você pode criar o initrd você mesmo, conforme descrito aqui para initramfs ou aqui para initrd .


Bem, obrigado pela confirmação, mas você perdeu a parte "Se não, como posso fazer o initrd eu mesmo?"
phunehehe

Adicionamos algumas informações e mesclamos minha outra resposta a essa.
tante 28/09

8
Uma pequena correção: o initrd não é usado para carregar o kernel : o kernel é carregado pelo gerenciador de inicialização (GRUB, LILO, qualquer que seja); O initrd é um tipo de disco ram que fornece o sistema de arquivos raiz inicial. Ele deve conter todos os binários (por exemplo, módulos do kernel, programas de suporte ao espaço do usuário) necessários para realmente tornar o sistema operacional. É por isso que é necessário para uma raiz LVM: o subsistema LVM precisa ser inicializado e sua inicialização é muito complexa para ser convenientemente feita apenas com os parâmetros de inicialização do kernel; portanto, o linuxrcscript no initrd executa essa tarefa.
Riccardo Murri

Você está certo, claro, fiquei um pouco desleixado com o meu fraseado.
tante

2
Não foi possível votar por causa de um grande erro de resposta (o initrd não permite que o kernel seja carregado).
Wzzrd 28/09/10

5

edit: acabei de perceber que você está tentando inicializar no LVM, nunca configurei um LVM, nunca precisei deles, portanto, provavelmente a abordagem aqui pode não funcionar

Aqui estão as regras básicas que você precisa fazer para criar um kernel sem initrd (a partir da memória, não me lembro exatamente):

  1. Recompile seu kernel, certifique-se de incorporá-lo (IMPORTANTE: não como módulo!):

    1. driver da placa-mãe e driver do disco rígido (ambos abaixo Device Drivers)
    2. controlador de sistema de ficheiros para /, /etc/*e /lib/modules/*(sob File systems)

    Basicamente, o kernel precisa ser capaz de montar o sistema de arquivos raiz, ler o / etc / fstab, carregar outros módulos de driver (se necessário) e montar outros sistemas de arquivos não raiz para concluir o restante do processo de inicialização. Se você tiver um processo de inicialização mais envolvido, por exemplo, inicialização em rede, também precisará criar esses drivers.

  2. Desative o initrd no kernel "Configuração geral> Sistemas de arquivos RAM iniciais e suporte a disco RAM (initramfs / initrd)", também conhecido como CONFIG_BLK_DEV_INITRD = n.

  3. Modifique a configuração do GRUB, você não precisa mais de init = e realroot = e configurar root = para que aponte para o dispositivo do sistema de arquivos raiz.

Eu acho que isso é tudo. Não se esqueça de manter um kernel de backup e uma boa cópia de um Live CD inicializável, caso algo aconteça.

Coisas que podem dar errado: se você compilou os drivers errados ou se você compilou os drivers básicos como um módulo, o kernel não pode ler o sistema de arquivos. Reinicie com um kernel novo ou com um Live CD e recompile um kernel com os drivers corretos.

A única parte difícil é descobrir qual driver é relevante para o seu hardware. Você pode usar lspcie lshwpara ajudar a identificar seu hardware. Se você ainda não possui essas ferramentas, então emerge lshw pciutils.


+1 por mencionar o módulo interno vs. o módulo na compilação do kernel.
Amphetamachine

lsmodde um kernel em execução também é útil.
LawrenceC

2

Sim, você precisa de um initrd. Aqui está o porquê:

O processo normal de inicialização começa com o carregador de inicialização, que sabe o suficiente sobre o seu sistema para encontrar o kernel e executá-lo. (O GRUB2 é inteligente o suficiente para encontrar um kernel localizado em uma partição LVM2 ou RAID, mas o GRUB1 não, por isso é geralmente recomendável que você crie / inicialize como uma partição separada com um layout simplificado.) Uma vez carregado, o kernel precisa ser capaz de encontrar o sistema de arquivos raiz, para que ele possa iniciar o processo de inicialização. No entanto, o LVM não pode ser iniciado sem ser acionado por algumas ferramentas do espaço do usuário, que existem no sistema de arquivos raiz, que não podem ser carregadas sem as ferramentas LVM, que existem no sistema de arquivos raiz ...;)

Para interromper esse ciclo, um initrd ou initramfs é um sistema de arquivos compactado armazenado no kernel (no / boot ou dentro do próprio kernel), que contém um sistema Linux suficiente para iniciar serviços como LVM ou MD ou qualquer outra coisa você quer. É um sistema de arquivos temporário e atua apenas como seu sistema de arquivos raiz o tempo suficiente para que a raiz real seja carregada.

No que diz respeito à criação de um, a maior parte da documentação sobre o assunto é surpreendentemente obsoleta - lvm2create_initrd, por exemplo, nem funciona mais no Gentoo. (Configurei a mesma coisa há alguns meses atrás e tive que reescrever o script antes de obter um initrd de trabalho.) Criar seu próprio initramfs pode ser divertido, e é a única maneira de obter uma inicialização absolutamente mínima. processo (e aprenda os detalhes sobre como o Linux inicializa no processo), mas é muito trabalhoso.

A resposta curta: use Dracut. É uma nova estrutura que está sendo criada para gerar um initramfs de maneira automatizada e está no portage. A documentação é um pouco esparsa, mas há o suficiente para descobrir as coisas, e é de longe a maneira mais fácil de obter um initramfs sólido e uma raiz LVM.


2

Embora não seja possível não usar algum tipo de initrd, é possível não usar arquivos initrd separados. (Eu nunca usei o genkernel, então não posso dar instruções para isso).

Por exemplo, eu configurei a opção:

CONFIG_INITRAMFS_SOURCE="/usr/src/initrd.contents"

Onde /usr/src/initrd.contentsno meu caso se parece (eu tenho LVM + tuxonice + fbsplash):

dir /bin                                    0755 0 0
file    /bin/busybox                        /bin/busybox                        0755 0 0
file    /bin/lvm                        /sbin/lvm.static                    0755 0 0
dir /dev                                    0755 0 0
dir /dev/fb                                 0755 0 0
dir /dev/misc                               0755 0 0
dir /dev/vc                                 0755 0 0
nod /dev/console                                0600 0 0    c  5   1
nod /dev/null                               0600 0 0    c  1   3
nod /dev/snapshot                               0600 0 0    c 10 231
nod /dev/tty1                               0600 0 0    c  4   0
dir /etc                                    0755 0 0
dir /etc/splash                             0755 0 0
dir /etc/splash/natural_gentoo                      0755 0 0
dir /etc/splash/natural_gentoo/images                   0755 0 0
file    /etc/splash/natural_gentoo/images/silent-1680x1050.jpg  /etc/splash/natural_gentoo/images/silent-1680x1050.jpg  0644 0 0
file    /etc/splash/natural_gentoo/images/verbose-1680x1050.jpg /etc/splash/natural_gentoo/images/verbose-1680x1050.jpg 0644 0 0
file    /etc/splash/natural_gentoo/1680x1050.cfg        /etc/splash/natural_gentoo/1680x1050.cfg        0644 0 0
slink   /etc/splash/tuxonice                    /etc/splash/natural_gentoo              0755 0 0
file    /etc/splash/luxisri.ttf                 /etc/splash/luxisri.ttf                 0644 0 0
dir /lib64                                  0755 0 0
dir /lib64/splash                               0755 0 0
dir /lib64/splash/proc                          0755 0 0
dir /lib64/splash/sys                           0755 0 0
dir /proc                                   0755 0 0
dir /mnt                                    0755 0 0
dir /root                                   0770 0 0
dir /sbin                                   0755 0 0
file    /sbin/fbcondecor_helper                 /sbin/fbcondecor_helper                 0755 0 0
slink   /sbin/splash_helper                 /sbin/fbcondecor_helper                 0755 0 0
file    /sbin/tuxoniceui_fbsplash               /sbin/tuxoniceui_fbsplash               0755 0 0
file    /sbin/tuxoniceui_text                   /sbin/tuxoniceui_text                   0755 0 0
dir /sys                                    0755 0 0
file    /init                           /usr/src/init

E /usr/src/inité:

#!/bin/busybox ash
local X ROOT RUNLEVEL INIT PARAM
# Preliminary stuff
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mdev -s
/bin/lvm vgchange -ay picard-main

# Try to resume. This never returns if it succeeds
test -e /sys/power/tuxonice/do_resume && echo 1 > /sys/power/tuxonice/do_resume
#/bin/resume

# Parse the command line for relevant options.
INIT=/sbin/init
RESCUE=""
PARAM=" "
for X in `cat /proc/cmdline`
do
        case "$X" in
                root=*) ROOT=${X#root=} ;;
                [0-6Ss]) RUNLEVEL=${X} ;;
                init=*) INIT=${X#init=} ;;
                rescue) RESCUE="rescue" ;;
        splash=*) PARAM="${PARAM} ${X}" ;;
        consol=*) PARAM="${PARAM} ${X}" ;;
        esac
done

if [ x${RESCUE} = xrescue ]
then
        busybox ash
fi

# Mount and switch root.
mount -o ro ${ROOT} /mnt
umount -f /sys || umount -l /sys
umount -f /proc || umount -l /proc

exec switch_root /mnt ${INIT} ${RUNLEVEL} ${PARAM}

1

Sim, ele é.

As complicações que surgem da criação e manipulação de initrds são discutidas se você instalar e usar o grub2. O wiki do grub2 http://grub.enbug.org/LVMandRAID descreve como você pode ter seu / boot no lvm com nada mais do que um insmod lvm no grub.cfg, o arquivo de configuração do grub, portanto, não há necessidade de um initrd.

grub2 agora na versão 1.98, mas ainda no ramo experimental no gentoo. No entanto, pode ser instalado em outro slot e é perfeitamente utilizável.

Desfrutar!


ei, que realmente parece ótimo, eu tenho que experimentar!
phunehehe
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.