it-swarm-es.tech

¿Es posible poner root en LVM sin usar initrd?

Acabo de configurar un sistema base de Gentoo (lo que significa que puedo arrancar e iniciar sesión y hacer cosas con él ahora). Mi partición raíz está en un grupo virtual LVM2 (con un /boot partición). Para arrancar, necesito pasar los siguientes parámetros al kernel:

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

Aparentemente, está usando un disco RAM inicial para hacer algo (supongo que cargar las cosas de LVM) antes de montar la raíz. ¿Hay alguna manera de que pueda poner este código en el kernel mismo para que no se necesite initrd? Si no es así, ¿cómo puedo hacer el initrd yo mismo?

Podría ser útil agregar que intenté compilar el kernel para root no LVM, sin initrd y funcionó perfectamente. Luego traté de poner todo en LVM y no pude hacer que la máquina arrancara (supongo que no puede manejar las cosas de LVM). Luego usé la herramienta genkernel con el --lvm y crea el kernel de trabajo y el initrd que estoy usando actualmente.

Ahora quiero omitir genkernel y hacer todo por mi cuenta, preferiblemente sin initrd para que la máquina arranque algo más rápido (de todos modos, no necesito la flexibilidad).

12
phunehehe

Respuesta simple: No. Si desea LVM, necesita un initrd.

Pero como otros han dicho antes: los LVM no ralentizan su sistema ni hacen nada malo de otra manera, solo le permiten crear un entorno que permite que su kernel se cargue y haga su trabajo.

El initrd permite que se cargue su kernel: si su kernel está en una unidad LVM, debe establecerse todo el entorno LVM antes de que se pueda cargar el binario que contiene el kernel.

Consulte la Entrada de Wikipedia sobre initrd que explica qué hace el initrd y por qué lo necesita.

Otra nota: veo su punto en querer hacer las cosas usted mismo, pero puede ensuciarse las manos incluso con genkernel. Use genkernel --menuconfig all y básicamente puede configurar todo como si construyera su kernel completamente sin soporte de herramientas, genkernel simplemente agrega make bzImage, crea módulos y crea módulos_install líneas para usted y hace esas desagradables cosas initrd.

Obviamente, puede construir el initrd usted mismo como se describe aquí para initramfs o aquí para initrd .

6
tante

editar: me acabo de dar cuenta de que está intentando arrancar en LVM, nunca configuré un LVM, nunca los necesité, por lo que probablemente el enfoque aquí puede no funcionar

Aquí están las reglas básicas que debe seguir para crear un kernel sin initrd (desde la memoria, no recuerdo exactamente):

  1. Vuelva a compilar su kernel, asegúrese de integrarlo en el kernel (IMPORTANTE: ¡no como módulo!):

    1. controlador de placa base y controlador de disco duro (ambos en Device Drivers)
    2. controlador del sistema de archivos para /, /etc/* y /lib/modules/* (debajo File systems)

    Básicamente, el kernel necesita poder montar el sistema de archivos raíz, leer/etc/fstab, cargar otros módulos de controlador (si es necesario) y montar otros sistemas de archivos no root para completar el resto del proceso de arranque. Si tiene un proceso de arranque más complicado, p. Ej. arranque de red, entonces también debe incorporar esos controladores.

  2. Deshabilite initrd desde el kernel "Configuración general> Inicial RAM sistemas de archivos y RAM soporte de disco (initramfs/initrd)" a.k.a. CONFIG_BLK_DEV_INITRD = n.

  3. Modifique GRUB config, ya no necesita init = y realroot =, y configure root = para que apunte al dispositivo del sistema de archivos raíz.

Creo que eso es todo. No olvide mantener un kernel de respaldo y una buena copia de un Live CD de arranque, en caso de que ocurra algo.

Cosas que podrían salir mal: si compiló en los controladores incorrectos o si compila los controladores básicos como un módulo, entonces el kernel no puede leer el sistema de archivos. Reinicie con un kernel nuevo o con un Live CD y vuelva a compilar un kernel con los controladores correctos.

La única parte difícil es averiguar qué controlador es relevante para su hardware. Puede usar lspci y lshw para ayudar a identificar su hardware. Si aún no tiene estas herramientas, entonces emerge lshw pciutils.

5
Lie Ryan

Sí, necesitas un initrd. Este es el por qué:

El proceso de arranque normal comienza con el cargador de arranque, que conoce lo suficiente sobre su sistema para encontrar el kernel y ejecutarlo. (GRUB2 es lo suficientemente inteligente como para encontrar un kernel que se encuentra en una partición LVM2 o RAID, pero GRUB1 no lo es, por lo que generalmente se recomienda que cree/boot como una partición separada con un diseño simplificado). Una vez que está cargado, el kernel necesita para poder encontrar el sistema de archivos raíz, para que pueda iniciar el proceso de arranque. Sin embargo, LVM no puede iniciarse sin ser activado por algunas herramientas del espacio de usuario, que existen en el sistema de archivos raíz, que no se pueden cargar sin las herramientas LVM, que existen en el sistema de archivos raíz ...;)

Para romper este ciclo, un initrd o initramfs es un sistema de archivos comprimido que se almacena con el kernel (ya sea en/boot o dentro del kernel mismo), que contiene lo suficiente de un sistema Linux para iniciar servicios como LVM o MD o cualquier otra cosa. usted quiere. Es un sistema de archivos temporal y solo actúa como su sistema de archivos raíz el tiempo suficiente para que se cargue la raíz real.

En cuanto a hacer uno, la mayor parte de la documentación sobre el tema es asombrosamente obsoleta: lvm2create_initrd, por ejemplo, ya ni siquiera funciona en Gentoo. (Configuré lo mismo hace unos meses, y tuve que reescribir el script antes de obtener un initrd funcional). Crear tus propios initramfs puede ser divertido, y es la única forma de obtener un arranque absolutamente mínimo. proceso (y aprenda los entresijos sobre cómo arranca Linux en el proceso), pero es mucho trabajo.

La respuesta corta: usa Dracut. Es un nuevo marco que se está creando para generar un initramfs de una manera mayoritariamente automatizada, y está en portage. La documentación es un poco escasa, pero hay suficiente para resolver las cosas, y es, con mucho, la forma más fácil de obtener un initramfs sólido y una raíz LVM.

2
p-static

Si bien no es posible no usar algún tipo de initrd, es posible no usar archivos initrd separados. (Nunca he usado genkernel, así que no puedo dar instrucciones para ello).

Por ejemplo, he configurado la opción:

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

Dónde /usr/src/initrd.contents en mi caso se ve así (tengo 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

Y /usr/src/init es:

#!/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

Sí lo es.

Las complicaciones que surgen al crear y manejar initrds se vuelven irrelevantes si instala y usa grub2. El wiki de grub2 http://grub.enbug.org/LVMandRAID describe cómo puede tener su/boot en lvm con nada más que un insmod lvm en grub.cfg, el archivo de configuración de grub, por lo tanto no necesidad de un initrd.

grub2 ahora en la versión 1.98 pero todavía en la rama experimental en gentoo. Sin embargo, se puede instalar en otra ranura y es perfectamente utilizable.

¡Disfrutar!

1
chiguire