ti-enxame.com

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

Acabei de configurar um sistema básico do Gentoo (o que significa que posso inicializar e logar e fazer coisas com ele agora). Minha partição raiz está em um grupo virtual LVM2 (com um /boot partição). 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 disco em memória inicial para fazer algo (acho que carregar as coisas do LVM) antes de montar o root. Existe uma maneira de 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 tentei compilar o kernel para root não-LVM, sem initrd e funcionou perfeitamente. Então tentei colocar tudo sob o LVM e não consegui fazer a máquina inicializar (acho que não consegue lidar com as coisas do LVM). Então eu usei a ferramenta genkernel com o --lvm opção e cria o kernel de trabalho 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 (eu não preciso de flexibilidade de qualquer maneira).

12
phunehehe

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

Mas como outros disseram antes: LVMs não tornam seu sistema lento ou fazem nada de ruim de outra maneira, eles apenas permitem que você crie um ambiente que permite que seu kernel carregue e faça seu trabalho.

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

Verifique o entrada da Wikipedia em initrd que explica o que o initrd faz e por que você precisa dele.

Outra observação: vejo seu ponto em querer fazer as coisas sozinho, mas você pode sujar as mãos até mesmo com o genkernel. Use genkernel --menuconfig all e você pode basicamente configurar tudo como se fosse construir seu kernel completamente sem suporte de ferramentas, o genkernel apenas adiciona o make bzImage, faz os módulos e faz as linhas modules_install para você e faz aquelas coisas desagradáveis ​​do initrd.

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

6
tante

editar: acabei de perceber 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 lembrava exatamente):

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

    1. driver da placa-mãe e driver do disco rígido (ambos em Device Drivers)
    2. driver do sistema de arquivos para /, /etc/*, e /lib/modules/* (debaixo 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 completar o resto do processo de inicialização. Se você tiver um processo de inicialização mais envolvido, por exemplo, inicializando pela rede, então você precisa incorporar esses drivers também.

  2. Desative o initrd do kernel "Configuração geral> Inicial RAM e RAM disco (initramfs/initrd) suporte" a.k.a. CONFIG_BLK_DEV_INITRD = n.

  3. Modifique GRUB config, você não precisa mais de init = e realroot =, e configure 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ê compilar 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 lspci e lshw para ajudar a identificar seu hardware. Se você ainda não tem essas ferramentas, emerge lshw pciutils.

5
Lie Ryan

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

O processo de inicialização normal começa com o gerenciador de inicialização, que conhece o suficiente sobre o seu sistema para encontrar o kernel e executá-lo. (GRUB2 é inteligente o suficiente para encontrar um kernel que está localizado em uma partição LVM2 ou RAID, mas GRUB1 não, então geralmente é recomendado que você crie/inicialize como uma partição separada com um layout simplificado.) Depois de carregado, o kernel precisa para ser capaz de encontrar o sistema de arquivos raiz, para que possa iniciar o processo de inicialização. No entanto, o LVM não pode ser iniciado sem ser acionado por algumas ferramentas de 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 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 qualquer outro você quer. É um sistema de arquivos temporário e age apenas como seu sistema de arquivos raiz por tempo suficiente para que a raiz real seja carregada.

No que diz respeito a realmente fazer um, a maioria da documentação sobre o tópico está incrivelmente obsoleta - lvm2create_initrd, por exemplo, nem mesmo funciona mais no Gentoo. (Eu configurei a mesma coisa alguns meses atrás e tive que reescrever o script antes de conseguir um initrd funcionando a partir dele.) Criar seus próprios initramfs pode ser divertido e é a única maneira de obter uma inicialização mínima processo (e aprenda os prós e contras 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 uma forma quase 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 de LVM.

2
p-static

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 sobre ele).

Por exemplo, eu defini 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}
2
Maciej Piechotka

Sim, ele é.

As complicações que surgem da criação e manipulação de initrds são consideradas discutíveis se você instalar e usar grub2. O wiki grub2 http://grub.enbug.org/LVMandRAID descreve como você pode ter seu/boot no lvm com nada mais do que um lvm insmod em grub.cfg, o arquivo de configuração do grub, portanto, não precisa 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.

Aproveitar!

1
chiguire