¿Es posible poner root en LVM sin usar initrd?

12

Acabo de configurar un sistema base 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 una /bootpartición separada ). Para arrancar, necesito pasar los siguientes parámetros al núcleo:

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 núcleo para que no se necesite initrd? Si no, ¿cómo puedo hacer el initrd yo mismo?

Puede ser útil agregar que intenté compilar el kernel para la raíz no LVM, sin initrd y funcionó perfectamente. Luego intenté poner todo bajo LVM y no pude hacer que la máquina se iniciara (supongo que no puede manejar las cosas de LVM). Luego usé la genkernelherramienta con la --lvmopción y crea el núcleo de trabajo y el initrd que estoy usando actualmente.

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

phunehehe
fuente
Un initrd puede tener un pequeño efecto en los tiempos de arranque, pero no afectará el rendimiento de su sistema una vez que esté en funcionamiento.
Kristof Provost
oh sí, en realidad me refería al tiempo de arranque, editado
phunehehe

Respuestas:

6

Respuesta simple: No. Si quieres LVM necesitas 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 permita que su núcleo se cargue y haga su trabajo.

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

Echa un vistazo a la entrada de Wikipedia sobre initrd que explica qué hace el initrd y por qué lo necesitas.

Otra nota: veo su punto de 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 fuera a construir su kernel completamente sin soporte de herramientas, genkernel simplemente agrega make bzImage, make modules y modules_install líneas para usted y hace esas cosas desagradables de initrd.

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

tante
fuente
Bueno, gracias por la confirmación, pero te pierdes la parte "Si no, ¿cómo puedo hacer el initrd yo mismo?"
phunehehe
Agregué información y fusioné mi otra respuesta en esta.
tante
8
Una corrección menor: initrd no se usa para cargar el núcleo : el gestor de arranque carga el núcleo (GRUB, LILO, lo que sea); initrd es un tipo de disco ram que proporciona el sistema de archivos raíz inicial. Debe contener todos los archivos binarios (p. Ej., Módulos del núcleo, programas de soporte de espacio de usuario) necesarios para que el sistema sea realmente operativo. Esta es la razón por la que se necesita para una raíz LVM: el subsistema LVM necesita ser inicializado y su inicialización es demasiado compleja para hacerse convenientemente solo con los parámetros de arranque del kernel; por lo tanto, el linuxrcscript en initrd realiza esta tarea.
Riccardo Murri
Por supuesto que tienes razón, estaba un poco descuidado con mi fraseo.
tante
2
No se puede votar debido a un error bastante grande en la respuesta (initrd no permite que se cargue el núcleo).
wzzrd
5

editar: acabo de darme cuenta de que estás intentando arrancar en LVM, nunca he configurado un LVM, nunca los necesité, por lo que probablemente el enfoque aquí no funcione

Aquí están las reglas básicas que debe hacer para crear un núcleo sin initrd (de memoria, no lo recordaba exactamente):

  1. Vuelva a compilar su núcleo, asegúrese de incorporarlo (IMPORTANTE: ¡no como módulo!):

    1. controlador de la placa y el controlador de disco duro (tanto bajo Device Drivers)
    2. controlador del sistema de ficheros para /, /etc/*y /lib/modules/*(bajo File systems)

    Básicamente, el núcleo debe ser capaz de 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 raíz para completar el resto del proceso de arranque. Si tiene un proceso de arranque más complicado, por ejemplo, el arranque de red, entonces también necesita incorporar esos controladores.

  2. Deshabilite initrd desde el núcleo "Configuración general> Sistemas de archivos RAM iniciales y soporte de disco RAM (initramfs / initrd)" también conocido como CONFIG_BLK_DEV_INITRD = n.

  3. Modifique la configuración de GRUB, 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 olvides 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ó los controladores incorrectos o si compila los controladores básicos como un módulo, entonces el núcleo 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 lspciy lshwpara ayudar a identificar su hardware. Si aún no tiene estas herramientas, entonces emerge lshw pciutils.

Lie Ryan
fuente
+1 por mencionar el módulo integrado frente al módulo en la compilación del núcleo.
anfetamáquina
lsmoddesde un kernel en ejecución también es útil.
LawrenceC
2

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

El proceso de arranque normal comienza con el gestor de arranque, que conoce lo suficiente sobre su sistema para encontrar el núcleo y ejecutarlo. (GRUB2 es lo suficientemente inteligente como para encontrar un kernel ubicado en una partición LVM2 o RAID, pero GRUB1 no lo es, por lo que generalmente se recomienda crear / iniciar como una partición separada con un diseño simplificado). Una vez que se carga, 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 de espacio de usuario, que existen en el sistema de archivos raíz, que no se pueden cargar sin las herramientas de 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), 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 cargar la raíz real.

En cuanto a hacer uno, la mayoría 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 que funcionara). Crear sus propios initramfs puede ser divertido, y es la única forma de obtener un arranque absolutamente mínimo. proceso (y aprender 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 principalmente 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.

p-static
fuente
2

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 establecido la opción:

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

Donde /usr/src/initrd.contentsen mi caso se ve (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/inites:

#!/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}
Maciej Piechotka
fuente
1

Sí lo es.

Las complicaciones que surgen de la creación y el manejo de initrds se vuelven discutibles 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 es necesario un initrd.

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

¡Disfrutar!

chiguire
fuente
hey que realmente se ve genial, ¡tengo que probarlo!
phunehehe