I documenti del kernel spiegano come impacchettare un'immagine nel kernel stesso. 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 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ò sovrascrivere / con un nuovo dispositivo root ed eseguire un altro programma init. Vedere 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. Molti altri pacchetti (come busybox) hanno chiamato questo comando "switch_root".
Popolazione di initramfs:
Il processo di compilazione del kernel 2.6 crea sempre un archivio initramfs in formato cpio compresso con 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 usr/Kconfig
) può essere utilizzata per specificare una fonte per l'
initramfs
archivio, che verrà automaticamente incorporata nel file binario risultante. Questa opzione può puntare a un archivio * esistente gzipped cpio
*, 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 root
non è necessario l'accesso 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 denominata " initramfs
", nella linux
directory -2.6. *. Consultare la documentazione / early-userspace / README per maggiori dettagli.)
Il kernel non dipende da cpio
strumenti 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 scripts/gen_initramfs_list.sh
) e procede a impacchettare quella directory usando il file di configurazione (alimentandolo a usr/gen_init_cpio
, da cui viene creato usr/gen_init_cpio.c
). Il cpio
codice di creazione del kernel è interamente autonomo e anche l'estrattore del kernel è (ovviamente) autonomo.