Come popolare la directory / dev quando si crea il mio initrd?


9

Sto cercando di imparare cose su initrd. Ho seguito questo tutorial per creare il mio initrd da zero e ho installato busybox su di esso. Quindi ho creato un .iso da esso con isolinux, così ho potuto testarlo in virtualbox. Funziona benissimo!

Ho i comandi di base di busybox, quindi volevo montare un filesystem. Ma la directory / dev è quasi vuota (no sda), ad eccezione di alcuni file che ho creato seguendo il tutorial. Ho saputo di udev e penso che questo sia ciò di cui ho bisogno. Tuttavia, non sono sicuro di come procedere.

Dovrei semplicemente prendere l'ultimo codice sorgente da udev, compilarlo e aggiungerlo al mio initrd? E poi chiama / bin / udev o qualcosa del genere nel mio script init? O c'è un altro / modo migliore per popolare la directory / dev?

Modifica: alcune informazioni aggiuntive e aggiornamenti su ciò che ho già fatto.

  • Metto alla prova tutto in una scatola virtuale. Ho appena installato Ubuntu Minimal in Virtual Box, ho creato un file .iso dal mio initrd e poi ho fatto il boot dall'ISO in Virtualbox.
  • Ho usato il vmlinuz e /lib/modulesche erano presenti su debian-businesscard.iso e li ho copiati sul mio initrd che ho creato seguendo il tutorial che ho collegato in precedenza.
  • Kernel ha CONFIG_DEVTMPFS=y
  • Alcuni dispositivi vengono visualizzati /dev, come tty0-tty63 e altri, ma non sda / hda.
  • Ran lspci -knel mio sistema operativo attualmente in esecuzione e in un box virtuale per verificare quali moduli sono in uso. SATA Controllerdice che usa ahcicome modulo.
  • Quando eseguo modprobe -v ahcisi lamenta molto di "simbolo sconosciuto: ata_some_stuff", ma dopo che restituisca qualcosa di simile SCSI Subsystem initialized, ATA-6: VBOX HARDDISKe Direct-Access ATA VBOX HARDDISK. Tuttavia, ancora nessun dispositivo hard disk trovato /dev.

La mia /init/sceneggiatura attuale è la seguente:

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

Qualcuno ha idea di cosa sto facendo di sbagliato e cosa dovrei fare invece?

Risposte:


12

Mentre la risposta di Gilles è corretta, è vecchia scuola :-). Un altro elemento degno di nota (più un pignolo sulla terminologia che altro) è che la guida a cui sei collegato sono le istruzioni su come creare un initramfs, non un initrd. I due sono simili e hanno lo stesso scopo, ma differiscono nel modo in cui l'immagine viene archiviata e caricata.

Ad ogni modo, la risposta alla tua domanda è davvero molto semplice.

  1. Abilita devtmpfsnel kernel ( CONFIG_DEVTMPFS=y)
  2. Esegui mount -t devtmpfs none /devcome prima cosa nella tua initsceneggiatura.

Questo è tutto. Devtmpfs popolerà /devproprio come udev. Non c'è nemmeno bisogno di pre-popolare /dev(l'immagine initramfs in) con i principi fondamentali come null, zeroo console.


Grazie per il tuo commento. Ho eseguito il tuo comando e ora ho più dispositivi, ma ancora nessun sda o hda da montare. C'è qualcosa che ho dimenticato di fare? Uso il kernel vmlinuz che ho ricevuto dal sistema live debians, dovrei effettivamente compilare il mio?
Carlito,

@Carlito Questo kernel ha abilitato devtmpfs (controlla il file di configurazione)? Debian è passato di recente a devtmpfs.
Gilles 'SO- smetti di essere malvagio'

@Gilles Non viene fornito un file di configurazione, ma ho caricato il kernel che ho ricevuto da debian, ha detto il file di configurazione CONFIG_DEVTMPFS=y, ma non ho ancora alcun dispositivo sda. Penso che ciò sia dovuto al fatto che non ho caricato alcun modulo (lsmod non restituisce nulla). Quali moduli devo caricare per ottenere i dispositivi del filesystem? O c'è qualcos'altro che ho dimenticato?
Carlito,

@Carlito sì, se hai altre cose da vedere /dev, non solo le unità, devtmpfs funziona e probabilmente ti manca il modulo controller del disco (come hai indovinato). Sfortunatamente, l'unico modo per sapere quale driver / modulo è necessario è leggere le informazioni per ognuno nella configurazione del kernel o eseguire lspci -kin un sistema Linux in esecuzione (che mostrerà quale driver del kernel stanno usando i vari componenti del sistema) .
Patrick,

1
@ CiroSantilli709 大 抓捕 六四 事件 法轮功CONFIG_DEVTMPFS_MOUNT=ynon ha alcun effetto su initramfs. Dal testo di aiuto del kernel: "Questa opzione non influisce sull'avvio basato su initramfs, qui il filesystem devtmpfs deve sempre essere montato manualmente dopo che è stato montato il rootfs"
Patrick,

4

Udev si popola /devautomaticamente in base ai driver caricati nel kernel e ai dispositivi rilevati da questi driver. I nomi dei dispositivi e le relative autorizzazioni si basano su una serie di regole che gli amministratori possono mettere a punto. La maggior parte dei sistemi Linux dovrebbe usare udev; l'eccezione sono i sistemi (generalmente incorporati) in cui la configurazione hardware è nota al momento della configurazione del sistema e non cambierà successivamente.

In genere si chiamerebbe udevabbastanza presto nella sequenza di avvio. Una delle poche cose che dovresti (devi?) Fare prima è mount /proce /sys. Dopo aver avviato il demone, chiama udevadm trigger --action=add; udevadm settleper fare in modo che udev elabori tutti gli eventi in sospeso dal kernel ( trigger) e attendi che gli eventi vengano elaborati prima di continuare ( settle). È quindi possibile procedere con l'individuazione del dispositivo contenente il filesystem di root.

Oltre al udevdbinario, avrai bisogno delle altre parti del udevtuo initrd. Ciò include i file di configurazione in /etc/udev, la configurazione di base in /lib/udevcosì come i binari di supporto come scsi_idanche in /lib/udev. Hai bisogno di tutti i programmi chiamati dalle regole udev che includi in initrd.

Alla fine di initrd, prima di trasferire il controllo sulla partizione di root reale, dovrai interrompere udevdcome ogni altro programma di initrd. Questo non rimuove alcun dispositivo da /dev. Utilizzare mount --move /dev /root/devper spostare il montato /devsulla radice reale.

Gentoo ha una guida initramfs e una pagina wiki initramfs che menziona udev tra le altre cose. Initramfs è il successore moderno di initrd, usando un archivio cpio anziché un'immagine di filesystem, e con una diversa interfaccia di processo (su un initrd, /linuxrcdeve uscire, mentre su un initramfs, /initdeve essere execinit dalla radice reale); la maggior parte dei sistemi è cambiata in questi giorni (anche se il file potrebbe ancora essere chiamato initrd).


Grazie per la tua risposta. Sono giunto alla conclusione che in realtà ho creato un initramfs anziché un initrd. Ma io uso il kernel vmlinuz che ho ottenuto dal sistema live di debians, se dovessi effettivamente compilare il mio kernel per questo (quindi so quali moduli ci sono per il caricamento di hard disk), o c'è una sorta di versione minima che potrei usare con i moduli di base ? Probabilmente scaricherò l'ultimo udev e proverò a compilarlo ed eseguirlo.
Carlito,

@Carlito Raccomando innanzitutto di provare con il kernel Debian, poiché dimenticare un driver necessario è un errore comune durante la compilazione del proprio kernel.
Gilles 'SO- smetti di essere malvagio'

Ma come ne ottengo uno? Ho appena copiato il vmlinuz che ho trovato nel debian-businesscard.iso (probabilmente non è la migliore idea). Dovrei semplicemente copiare il kernel standard che ho ottenuto da Ubuntu o Debian e l'intera directory / lib / modules?
Carlito,

@Carlito Avrai bisogno almeno di tutti i moduli necessari per il tuo hardware. Può essere difficile trovare tutto ciò di cui hai bisogno sfogliando l'elenco. Il modo migliore per scoprire ciò di cui hai bisogno è eseguire lsmodun sistema funzionante. Quindi inizia con tutti, quindi pota in modo intelligente se hai bisogno di risparmiare spazio.
Gilles 'SO- smetti di essere malvagio'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.