¿Cómo llenar el directorio / dev al construir mi propio initrd?

9

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 usa ahcicomo módulo.
  • Cuando lo ejecuto modprobe -v ahcise queja mucho de "símbolo desconocido: ata_some_stuff", pero después de eso devuelve algo como SCSI Subsystem initialized, ATA-6: VBOX HARDDISKy Direct-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?

Carlito
fuente

Respuestas:

12

Si bien la respuesta de Gilles es correcta, es de la vieja escuela :-). Otro elemento importante (más un punto de referencia en la terminología que cualquier otra cosa) es esa guía a la que se vinculó con instrucciones sobre cómo crear un initramfs, no un initrd. Los dos son similares y tienen el mismo propósito, pero son diferentes en cómo se almacena y carga la imagen.

De todos modos, la respuesta a tu pregunta es realmente muy, muy simple.

  1. Habilitar devtmpfsen el kernel ( CONFIG_DEVTMPFS=y)
  2. Corre mount -t devtmpfs none /devcomo lo primero en tu initscript.

Eso es. Los devtmpfs se llenarán /devcomo udev. Ni siquiera es necesario rellenar previamente /dev(en la imagen initramfs) con los conceptos básicos como null, zeroo console.

Patricio
fuente
Gracias por tu comentario. Ejecuté su comando, y ahora tengo más dispositivos, pero todavía no tengo sda o hda para montar. ¿Hay algo que olvidé hacer? Uso el kernel vmlinuz que obtuve del sistema Debians Live, ¿debería compilar el mío?
Carlito
@Carlito ¿Tiene este núcleo habilitado devtmpfs (verifique el archivo de configuración)? Debian solo recientemente cambió a devtmpfs.
Gilles 'SO- deja de ser malvado'
@Gilles No se proporciona un archivo de configuración, pero cargué el núcleo que obtuve de debian, decía el archivo de configuración 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é?
Carlito
@Carlito, sí, si aparecen otras cosas /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 ejecutarlo lspci -ken un sistema Linux en ejecución (que le mostrará qué controlador del kernel están utilizando los diversos componentes de su sistema) .
Patrick
1
@ CiroSantilli709 大 抓捕 六四 事件 法轮功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"
Patrick
4

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, llame udevadm 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 de udevsu initrd. Esto incluye archivos de configuración en /etc/udev, la configuración base en /lib/udev, así como binarios auxiliares como scsi_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. Use mount --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, /initdebe execiniciar 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).

Gilles 'SO- deja de ser malvado'
fuente
Gracias por tu respuesta. Llegué a la conclusión de que realmente hice un initramfs en lugar de un initrd. Pero uso el kernel vmlinuz que obtuve del sistema Debians Live, si realmente compilo mi propio kernel para esto (para saber qué módulos hay para cargar discos duros), o hay una especie de versión mínima que podría usar con los módulos básicos ? Probablemente descargaré el último udev e intentaré compilarlo y ejecutarlo.
Carlito
@Carlito Recomiendo primero intentar con el núcleo Debian, ya que olvidar un controlador necesario es un error común al compilar su propio núcleo.
Gilles 'SO- deja de ser malvado'
¿Pero cómo conseguiría uno? Acabo de copiar el vmlinuz que encontré en debian-businesscard.iso (probablemente no sea la mejor idea). ¿Debo copiar el núcleo estándar que obtuve de ubuntu o debian, y todo el directorio / lib / modules?
Carlito
@Carlito Necesitará al menos todos los módulos necesarios para su hardware. Puede ser difícil encontrar todo lo que necesita navegando por la lista. La mejor manera de averiguar lo que necesita es ejecutar lsmoden un sistema que funcione. Comience con todos ellos, luego pode de forma inteligente si necesita ahorrar espacio.
Gilles 'SO- deja de ser malvado'