Estoy tratando de aprender cosas sobre initrd. Seguí este tutorial para construir mi propio initrd desde cero, e instalé busybox en él. Luego hice un .iso con isolinux, para poder probarlo en virtualbox. ¡Funciona muy bien!
Tengo los comandos básicos de busybox, por lo que quería montar un sistema de archivos. Pero el directorio / dev está casi vacío (sin sda), a excepción de algunos archivos que creé mientras seguía el tutorial. Aprendí sobre udev y creo que esto es lo que necesito. Sin embargo, no estoy seguro de cómo hacerlo.
¿Debo tomar el último código fuente de udev, compilarlo y agregarlo a mi initrd? ¿Y luego llamar / bin / udev o algo así en mi script de inicio? ¿O hay otra / mejor manera de poblar el directorio / dev?
Editar: información adicional y actualizaciones sobre lo que ya he hecho.
- Pruebo todo en caja virtual. Acabo de instalar ubuntu minimal en virtual box, hice un .iso desde mi initrd, y luego arranqué desde la iso en virtualbox.
- Usé el vmlinuz y
/lib/modules
estaba presente en un debian-businesscard.iso y los copié en mi initrd que creé siguiendo el tutorial que vinculé anteriormente. - Kernel tiene
CONFIG_DEVTMPFS=y
- Algunos dispositivos aparecen
/dev
, como tty0-tty63 y otros, pero no sda / hda. - Ejecuté
lspci -k
en mi sistema operativo actualmente en ejecución y en una caja virtual para verificar qué módulos están en uso.SATA Controller
dice que lo usaahci
como módulo. - Cuando lo ejecuto
modprobe -v ahci
se queja mucho de "símbolo desconocido: ata_some_stuff", pero después de eso devuelve algo comoSCSI Subsystem initialized
,ATA-6: VBOX HARDDISK
yDirect-Access ATA VBOX HARDDISK
. Sin embargo, todavía no se encontraron dispositivos de disco duro en/dev
.
Mi /init/
script actual es el siguiente:
#!/bin/ash
mount -t devtmpfs none /dev
mount -t proc /proc /proc
mount -t sysfs none /sys
modprobe -v ahci
echo "Hello world"
exec /bin/ash --login
¿Alguien tiene alguna idea de lo que estoy haciendo mal y de lo que debería hacer?
CONFIG_DEVTMPFS=y
, pero todavía no obtengo ningún dispositivo sda. Creo que esto se debe a que no he cargado ningún módulo (lsmod no devuelve nada). ¿Qué módulos debo cargar para obtener los dispositivos del sistema de archivos? ¿O hay algo más que olvidé?/dev
, pero no las unidades, entonces devtmpfs está funcionando y es probable que te falte el módulo del controlador de disco (como habrás adivinado). Desafortunadamente, la única forma de saber qué controlador / módulo necesita es leer la información de cada uno en la configuración del kernel o ejecutarlolspci -k
en un sistema Linux en ejecución (que le mostrará qué controlador del kernel están utilizando los diversos componentes de su sistema) .CONFIG_DEVTMPFS_MOUNT=y
no tiene ningún efecto en initramfs. Del texto de ayuda del kernel: "Esta opción no afecta el arranque basado en initramfs, aquí el sistema de archivos devtmpfs siempre necesita ser montado manualmente después de que se monte el rootfs"Udev se completa
/dev
automáticamente en función de los controladores que se cargan en el kernel y los dispositivos que estos controladores detectan. Los nombres de los dispositivos y sus permisos se basan en un conjunto de reglas que los administradores pueden ajustar. La mayoría de los sistemas Linux deberían usar udev; la excepción son los sistemas (generalmente integrados) donde la configuración del hardware se conoce en el momento en que se configura el sistema y no cambiará después.Por lo general, llamaría
udev
bastante temprano en su secuencia de inicio. Una de las pocas cosas que debe hacer (debe?) Antes de eso es montar/proc
y/sys
. Después de iniciar el demonio, llameudevadm trigger --action=add; udevadm settle
para hacer que udev procese todos los eventos pendientes del kernel (trigger
) y espere hasta que los eventos se procesen antes de continuar (settle
). Luego puede proceder a localizar el dispositivo que contiene el sistema de archivos raíz.Además del
udevd
binario, necesitará las otras partes deudev
su initrd. Esto incluye archivos de configuración en/etc/udev
, la configuración base en/lib/udev
, así como binarios auxiliares comoscsi_id
también en/lib/udev
. Necesita todos los programas que se invocan desde las reglas de udev que incluye en el initrd.Al final del initrd, antes de transferir el control a la partición raíz real, deberá detenerse
udevd
como cualquier otro programa desde el initrd. Esto no elimina ningún dispositivo de/dev
. Usemount --move /dev /root/dev
para mover el montado/dev
a la raíz real.Gentoo tiene una guía initramfs y una página wiki initramfs que mencionan udev entre otras cosas. Initramfs es el sucesor moderno de initrd, utilizando un archivo cpio en lugar de una imagen del sistema de archivos, y con una interfaz de proceso diferente (en un initrd,
/linuxrc
debe salir, mientras que en un initramfs,/init
debeexec
iniciar desde la raíz real); La mayoría de los sistemas han cambiado en estos días (incluso si el archivo todavía se puede llamar initrd).fuente
lsmod
en un sistema que funcione. Comience con todos ellos, luego pode de forma inteligente si necesita ahorrar espacio.