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

10

Acabei de configurar um sistema base do Gentoo (o que significa que eu posso inicializar e logar e fazer coisas com ele agora). Minha partição raiz está em um grupo virtual LVM2 (com uma partição /boot 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 algo (eu acho que carregando as coisas do LVM) antes de montar o root. Existe uma maneira que eu possa 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 initrd e funcionou perfeitamente. Então eu tentei colocar a coisa toda sob o LVM e não consegui arrancar a máquina (eu acho que não pode lidar com o material do LVM). Então usei a ferramenta genkernel com a opção --lvm e ela cria o kernel funcional e initrd que estou usando atualmente.

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

    
por phunehehe 27.09.2010 / 17:25

5 respostas

6

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

Mas como outros já disseram antes: LVMs não abrandam seu sistema ou fazem algo ruim de outra maneira, eles apenas permitem que você crie um ambiente que permita que seu kernel carregue e faça 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 o Entrada da Wikipedia no initrd , que explica o que o initrd faz e por que você precisa dele.

Outra nota: vejo o seu ponto em querer fazer as coisas sozinho, mas você pode sujar as mãos mesmo com o genkernel. Use genkernel --menuconfig all e você pode basicamente configurar tudo como se você fosse construir seu kernel completamente sem suporte de ferramenta, o genkernel apenas adiciona o make bzImage, faz módulos e faz módulos_install linhas para você e faz aquele material initrd desagradável.

Você pode, obviamente, criar o initrd como descrito aqui para o initramfs ou aqui para o initrd .

    
por 27.09.2010 / 23:34
4

edit: só percebi que você está tentando inicializar no LVM, nunca configurei um LVM, nunca precisei deles, então 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 (da memória, não me lembro exatamente):

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

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

    Basicamente, o kernel precisa ser capaz de montar o sistema de arquivos raiz, leia o / etc / fstab, carregue os outros módulos do driver (se necessário), e monte outros sistemas de arquivos não-raiz para completar o restante do processo de inicialização. Se você tem um processo de inicialização mais envolvido, por exemplo rede de inicialização, então você precisa construído nesses drivers também.

  2. Desativar initrd do kernel "Configuração geral > Sistemas de arquivos RAM iniciais e suporte a disco RAM (initramfs / initrd)" a.k.a. CONFIG_BLK_DEV_INITRD = n.

  3. Modifique a configuração do GRUB, você não precisa mais de init = e realroot =, e setup root = então ele aponta para o dispositivo do sistema de arquivos raiz.

Eu acho que é 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 nos drivers errados ou se você compilar os drivers básicos como um módulo, então o kernel não pode ler o sistema de arquivos. Reinicialize 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 lspci e lshw para ajudar a identificar seu hardware. Se você não tiver essas ferramentas, então emerge lshw pciutils .

    
por 28.09.2010 / 10:47
2

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

O processo de inicialização normal começa com o bootloader, que sabe o suficiente sobre o seu sistema para encontrar o kernel e executá-lo. (O GRUB2 é inteligente o bastante para encontrar um kernel localizado em uma partição LVM2 ou RAID, mas o GRUB1 não é, por isso geralmente é recomendado que você crie / boot como uma partição separada com um layout simplificado). para poder 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 userspace, 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 quebrar este ciclo, um initrd ou initramfs é um sistema de arquivos compactado que é armazenado com o kernel (em / boot ou dentro do próprio kernel), que contém apenas o suficiente de um sistema Linux para iniciar serviços como LVM ou MD. ou o que mais você quiser. É um sistema de arquivos temporário e atua apenas como seu sistema de arquivos raiz por tempo suficiente para que a raiz real seja carregada.

No que diz respeito a criar uma, a maior parte da documentação sobre o tópico é incrivelmente obsoleta - lvm2create_initrd, por exemplo, nem funciona mais no Gentoo. (Eu configurei a mesma coisa há alguns meses, 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 trabalho.

A resposta curta: use o Dracut. É um novo framework que está sendo criado para gerar um initramfs de uma maneira mais 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.

    
por 30.09.2010 / 23:43
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.contents no meu caso 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}
    
por 17.12.2010 / 16:51
1

Sim, é.

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

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

Aproveite!

    
por 02.10.2010 / 03:27