Non importa quello che fai, hai initramfs
. Non ne puoi fare a meno: è l'unico file system che ti è stato imposto. Da kernel.org :
Che cos'è rootfs?
Rootfs
è un'istanza speciale di ramfs
(o tmpfs
, se abilitata), che è
sempre presente nei sistemi 2.6. Non è possibile smontarerootfs
per circa lo stesso motivo per cui non è possibile interrompere il processo di inizializzazione; piuttosto che avere un codice speciale per controllare e gestire un elenco vuoto, è più piccolo e più semplice per il kernel assicurarsi che determinati elenchi non possano diventare vuoti.
La maggior parte dei sistemi monta semplicemente un altro filesystem rootfs
e lo ignora. La quantità di spazio occupata da un'istanza vuota di ramfs è minuscola.
Se * CONFIG_TMPFS * è abilitato, rootfs
verrà utilizzato tmpfs
invece di ramfs
default. Per forzare ramfs
, aggiungi "rootfstype=ramfs"
alla riga di comando del kernel.
Che cos'è initramfs?
Tutti i kernel 2.6 di Linux contengono un"cpio"
archivio in formatogzip, che viene estratto rootfs
all'avvio del kernel. Dopo l'estrazione, il kernel verifica serootfs
contiene un filee"init"
, in tal caso, lo esegue come PID 1. Se trovato, questoinit
processo è responsabile di portare il sistema al massimo, inclusa la localizzazione e il montaggio del dispositivo root reale ( se presente). Serootfs
non contiene uninit
programma dopo che l'cpio
archivioincorporatoè stato estratto in esso, il kernel passerà al codice più vecchio per individuare e montare una partizione root, quindi eseguire una variante/sbin/init
di questo.
Tutto ciò differisce dal vecchio initrd in diversi modi:
Il vecchio initrd era sempre un file separato, mentre l'archivio initramfs è collegato all'immagine del kernel di linux. (La directory linux - * / usr è dedicata alla generazione di questo archivio durante la compilazione.)
Il vecchio file initrd era un'immagine del filesystem gzipped (in alcuni formati di file, come ext2, che necessitava di un driver incorporato nel kernel), mentre il nuovo archivio initramfs è un archivio cpio gzipped (come tar solo più semplice, vedi cpio (1) e Documentation / early-userspace / buffer-format.txt). Il codice di estrazione cpio del kernel non è solo estremamente piccolo, è anche __init testo e dati che possono essere scartati durante il processo di avvio.
Il programma eseguito dal vecchio initrd (che era chiamato / initrd, non / init) ha fatto un po 'di installazione e poi è tornato al kernel, mentre non è previsto che il programma init da initramfs ritorni al kernel. (Se / init ha bisogno di passare il controllo, può sovrastare / con un nuovo dispositivo root ed eseguire un altro programma init. Vedi l'utilità switch_root, di seguito.)
Quando si cambia un altro dispositivo root, initrd pivot_root e quindi smonta il ramdisk. Ma initramfs è rootfs: non puoi né pivot_root rootfs, né smontarlo. Invece elimina tutto da rootfs per liberare spazio (trova -xdev / -exec rm '{}' ';'), monta i rootfs con la nuova radice (cd / newmount; mount --move. /; Chroot.), collega stdin / stdout / stderr al nuovo / dev / console ed esegui il nuovo init.
Dato che si tratta di un processo notevolmente persnickety (e comporta l'eliminazione di comandi prima che tu possa eseguirli), il pacchetto klibc ha introdotto un programma di supporto (utils / run_init.c) per fare tutto questo per te. La maggior parte degli altri pacchetti (come busybox) ha chiamato questo comando "switch_root".
Popolazione di initramfs:
Il processo di compilazione del kernel 2.6 crea sempre un archivio initramfs in formato cpio gzip e lo collega al binario del kernel risultante. Per impostazione predefinita, questo archivio è vuoto (consuma 134 byte su x86).
L'opzione di configurazione CONFIG_INITRAMFS_SOURCE (in Setup generale in menuconfig e residente in usr / Kconfig) può essere usata per specificare una fonte per l'archivio initramfs, che verrà automaticamente incorporato nel binario risultante. Questa opzione può puntare a un archivio cpio gzip esistente, una directory contenente file da archiviare o una specifica di file di testo come il seguente esempio:
dir /dev 755 0 0
nod /dev/console 644 0 0 c 5 1
nod /dev/loop0 644 0 0 b 7 0
dir /bin 755 1000 1000
slink /bin/sh busybox 777 0 0
file /bin/busybox initramfs/busybox 755 0 0
dir /proc 755 0 0
dir /sys 755 0 0
dir /mnt 755 0 0
file /init initramfs/init.sh 755 0 0
Eseguire "usr / gen_init_cpio" (dopo la compilazione del kernel) per ottenere un messaggio di utilizzo che documenta il formato di file sopra.
Un vantaggio del file di configurazione è che non è necessario l'accesso root per impostare autorizzazioni o creare nodi dispositivo nel nuovo archivio. (Si noti che queste due voci "file" di esempio prevedono di trovare i file denominati "init.sh" e "busybox" in una directory chiamata "initramfs", nella directory linux-2.6. *. Vedere la documentazione / early-userspace / README per più dettagli.)
Il kernel non dipende da strumenti cpio esterni. Se si specifica una directory anziché un file di configurazione, l'infrastruttura di compilazione del kernel crea un file di configurazione da quella directory (usr / Makefile chiama script / gen_initramfs_list.sh) e procede a impacchettare quella directory usando il file di configurazione (alimentandolo a usr / gen_init_cpio, creato da usr / gen_init_cpio.c). Il codice di creazione cpio in fase di creazione del kernel è completamente autonomo e anche l'estrattore del tempo di avvio del kernel è (ovviamente) autonomo.