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/modulesestaba 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 -ken mi sistema operativo actualmente en ejecución y en una caja virtual para verificar qué módulos están en uso.SATA Controllerdice que lo usaahcicomo módulo.
- Cuando lo ejecuto modprobe -v ahcise queja mucho de "símbolo desconocido: ata_some_stuff", pero después de eso devuelve algo comoSCSI Subsystem initialized,ATA-6: VBOX HARDDISKyDirect-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 -ken 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=yno 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
/devautomá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
udevbastante temprano en su secuencia de inicio. Una de las pocas cosas que debe hacer (debe?) Antes de eso es montar/procy/sys. Después de iniciar el demonio, llameudevadm trigger --action=add; udevadm settlepara 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
udevdbinario, necesitará las otras partes deudevsu initrd. Esto incluye archivos de configuración en/etc/udev, la configuración base en/lib/udev, así como binarios auxiliares comoscsi_idtambié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
udevdcomo cualquier otro programa desde el initrd. Esto no elimina ningún dispositivo de/dev. Usemount --move /dev /root/devpara mover el montado/deva 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,
/linuxrcdebe salir, mientras que en un initramfs,/initdebeexeciniciar 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
lsmoden un sistema que funcione. Comience con todos ellos, luego pode de forma inteligente si necesita ahorrar espacio.