Compilazione kernel, busybox e macchine virtuali
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