Compilazione kernel, busybox e macchine virtuali

From Sistemi Operativi
Revision as of 16:10, 2 March 2019 by Renzo (talk | contribs) (Created page with "questa è una versione commentata dei comandi digitati nella lezione del 27 febbario 2019 in una directory vuota di una partizione con spazio sufficiente (1G per stare dalla ...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

questa è una versione commentata dei comandi digitati nella lezione del 27 febbario 2019

in una directory vuota di una partizione con spazio sufficiente (1G per stare dalla parte dei bottoni) si fa download dei sorgenti del kernel. oggi l'ultima versione e' 5.0-rc8 (sul web www.kernel.org si decide quale versione scaricare)

 wget https://git.kernel.org/torvalds/t/linux-5.0-rc8.tar.gz

si scompattano i sorgenti e si entra nella dir scompattata

 tar xf linux-5.0-rc8.tar.gz 
 cd linux-5.0-rc8

Ho preparato un file di configurazione minimale per qemu, potete prenderlo via web. Lo scarico in /tmp:

 (cd /tmp; wget http://www.cs.unibo.it/~renzo/vsd/linux-config)

e lo copio come .config nella dir base dei sorgenti del kernel

 cp /tmp/linux-config .config

chiamo menuconfig per configurare il kernel

 make menuconfig

potete configurare il kernel (o lasciare tutto invariato, e' stata caricata la cofigurazione minimale) alla fine uscite salvando. A questo punto si puo' compilare il kernel.

 make -j 5

A seconda di quante opzioni avete abilitato e quanto potente e' la macchina usata potete prendere un caffe' o andare a dormire. Dopo un congruo tempo il kernel sara' pronto)

Spostiamolo il /tmp/vmlinuz

 cp arch/x86_64/boot/bzImage /tmp/vmlinuz
 cd ..

A questo punto possiamo attivare il kernel che partira' regolarmente...

 qemu-system-x86_64 -kernel /tmp/vmlinuz -monitor stdio

Ma si blocchera' perche' una volta attivo non sa cosa fare, manca un init da lanciare. Possiamo prendere una immagine minimale di file system che contenga init. Per esempio una simie immagine puo' essere creata usando busybox (che fara' da solo init, shell e tool di utilita')

Scarichiao e decomprimiamo l'immagine

 wget http://fs.devloop.org.uk/filesystems/BusyBox-1.13.2/BusyBox-1.13.2-amd64-root_fs.bz2
 bzip2 -d BusyBox-1.13.2-amd64-root_fs.bz2

Lanciamo la macchina virtuale, ed ora il sistema sara' attivo:

 qemu-system-x86_64 -hda BusyBox-1.13.2-amd64-root_fs -kernel /tmp/bzImage -append root=/dev/sda -monitor stdio -k en-us -m 1G

Dentro la macchina virtuale potete "gironzolare" a guardare cosa c'e'. Da notare :

 ls -l /bin 

mostra come tutti i comandi siano realizati come link simbolici a busybox.

 uname -a 

mostra la cersione e la data di compilazione del kernel, potete verificare che e' proprio il kernel appena compilato che sta coordinando le attivita; del sistema.

 poweroff

spegne la macchina virtuale.

Le macchine virtuali possono operare anche a livello di processo. Qemu per esempio ha comandi distinti per operare come VM di sistema (qemu-system-...) e di processo (qemu-...). Per fare questa prova facciamo download dei binari di busybox per diverse architetture:

 wget https://busybox.net/downloads/binaries/1.21.1/busybox-binaries.tar.bz2

e decomprimiamo l'archivio

 tar xf busybox-binaries.tar.bz2

Nella dir busybox ci sono gli eseguibili.

 cd busybox/

Quello per la architettura corrente (x86_64 nella macchina usata in aula) funziona

 ./busybox-x86_64 ls

Gli altri dorebbero fallire (se non falliscono e' perche' c'e' un automatisco attivo che chiama qemu)

 ./busybox-mips ls

Possiamo comunque vedere qemu richiamato in modo esplicito che e' in grado di eseguire il binario busybox-mips (virtualizzando la CPU) ma richiama le system call del sistema host.

 qemu-mips busybox-mips ls