ultimo nella sezione Abbiamo spiegato come creare e testare un'immagine initramfs. In questa sezione, vogliamo creare una directory root minima (rootfs) e statico ve dinamico Spiegheremo le differenze tra i file.

Compilazione statica e dinamica

statica mentre un file non ha bisogno di dipendenze dinamico Un file compilato ha dipendenze. Per scoprire se un file è dinamico ldd viene utilizzato il comando.

$ ldd busybox non è un eseguibile dinamico $ ldd /bin/bash linux-vdso.so.1 (0x00007ffd63d6a000) libreadline.so.8 => /lib64/libreadline.so.8 (0x00007f6121182000) libtinfo.so.6 => /lib64 /libtinfo.so.6 (0x00007f6121141000) libc.so.6 => /lib64/libc.so.6 (0x00007f6120f71000) libtinfow.so.6 => /lib64/libtinfow.so.6 (0x00007f6120f30000) /lib64/ld- linux-x86-64.so.2 (0x00007f61212d2000)

Tutti i file compilati dinamici richiedono il file libc.so.6 e il file interprete ld-linux-x86-64.so.2. Oltre a ciò ci sono dipendenze da librerie aggiuntive utilizzate dall'applicazione. L'albero delle dipendenze sulle distribuzioni Linux è costruito tenendo conto di questi.

Ora prendiamo un codice sorgente C come quello qui sotto e compiliamo questo codice sorgente.

#includere int main(){ puts("Ciao parola"); ritorno 0; }
# compilazione dinamica gcc -o main.dynamic main.c # compilazione statica gcc -o main.static main.c -static

Puoi controllare entrambi con il comando ldd.

I file statici sono di dimensioni maggiori perché tutte le librerie richieste sono incluse in un singolo file, causando un aumento delle dimensioni. Ecco perché nelle distribuzioni la compilazione dinamica è generalmente preferita a quella statica.

Creazione di rootf minimi

Ora da un file compilato dinamico rootfs Creiamo. Per questo, prima copiamo il nostro file in una directory vuota e filetto Scopriamo il nome dell'interprete usando il comando.

$ file main main: ELF 64-bit LSB pie eseguibile, x86-64, versione 1 (SYSV), collegato dinamicamente, interprete /lib64/ld-linux-x86-64.so.2, per GNU/Linux 3.2.0, nota spogliata

Burada /lib64/ld-linux-x86-64.so.2 file dovrebbe trovarsi nello stesso posto nella nostra directory. Per questo motivo, apriamo la directory lib64 e copiamola al suo interno.

$ mkdir lib64 $ installa /lib64/ld-linux-x86-64.so.2 lib64/

Le distribuzioni Linux hanno la directory /lib. Possiamo collegare simbolicamente la nostra directory lib64 qui.

$ ln -s lib64 lib

anche adesso ldd Troviamo le loro dipendenze usando il comando e copiamo anche loro.

$ ldd main linux-vdso.so.1 (0x00007ffd1efe6000) libc.so.6 => /lib64/libc.so.6 (0x00007f0af6a13000) /lib64/ld-linux-x86-64.so.2 (0x00007f0af6bfe000) # interprete Non lo copiamo una seconda volta perché è già stato copiato. # linux-vdso.so.1 non è stato trovato nel sistema come file. Proviene dal kernel Linux. Non lo copiamo neanche noi. # In questo caso dobbiamo solo copiare il nostro file libc.so.6. $ installa /lib64/libc.so.6 lib64

Ora abbiamo creato rootfs. testare chroot /principale Possiamo usare il comando.

$chroot. /main CiaoParola

Come puoi vedere, abbiamo ottenuto rootfs minimi e l'abbiamo eseguito. Se vogliamo, possiamo cambiare la nostra directory rootfs in initramfs. Il file che abbiamo compilato /dentro Mettiamo il file al suo posto e riconfezionamolo. Come segue panico del kernel darà errore. Questo perché il processo principale del sistema (pid 1) non deve essere chiuso.

Panico del kernel

initramfs L'init nelle distribuzioni Linux viene utilizzato per montare la partizione in cui è installato il sistema e avviare il gestore dei servizi al suo interno. I gestori dei servizi, d'altra parte, sono progettati per non spegnersi mai. Possiamo impedirne la chiusura modificando il codice C in questo esempio come segue.

#includere int main(){ puts("Ciao parola"); mentre(1); ritorno 0; }

Ora compiliamo e pacchettizziamo di nuovo la nostra immagine initramfs.

Stampa Hello World con kernel Linux

Come puoi vedere, non otteniamo un errore di kernel panic perché il nostro codice non esce.