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).
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 .
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):
Recompile seu kernel, certifique-se de compilá-lo (IMPORTANTE: não como módulo!):
Device Drivers
)/
, /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.
Desative o initrd do kernel "Configuração geral> Inicial RAM e RAM disco (initramfs/initrd) suporte" a.k.a. CONFIG_BLK_DEV_INITRD = n.
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
.
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.
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}
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!