Istruzioni per Minix
Documentazione
Il sito principale per le informazioni su Minix è www.minix3.com. In particolare vanno
studiate le seguenti pagine:
- Istruzioni per
l'installazione che appaiono anche come appendice A nel testo
OSDI3
- La pagina di manuale man setup,
descrive la procedura di setup in maggiore dettaglio. Leggi la parte
che riguarda il test dell'installazione.
- La pagina di manuale man usage,
contiene una spiegazione molto più dettagliata, se vuoi conoscere i
minuti dettagli.
I sorgenti sono consultabili in forma di ipertesto grazie a Michele Chinosi.
Per qualsiasi dubbio, consultare le man pages.
Usare Minix con l'emulatore Qemu
E' possibile usare Minix direttamente dal live CD, ma non si può
salvare niente. Per poter lavorare occorre installare Minix da
qualche parte. E' senz'altro possibile, e istruttivo, installare
Minix su una vera partizione di un vero PC. Se non hai a disposizione
un PC da ripartizionare, allora bisogna usare un emulatore. Io
consiglio Qemu, che è facile da usare e abbastanza veloce.
Attenzione: se decidi di ripartizionare un PC vero, se fai un errore
rischi di perdere tutti i dati che hai su quel disco.
Le seguenti istruzioni permettono di installare Minix su Qemu in
Linux. Qemu è disponibile anche in
Windows; queste istruzioni
potranno con poche modifiche servirvi anche se usate Windows
(Occorre aggiungere sulla riga di comando di qemu l'opzione "-L .").
Scarica i sorgenti di qemu.
Poi esegui:
tar xvzf qemu-0.8.0.tar.gz
cd qemu-0.8.0
./configure
make
sudo make install
Crea una directory per minix, e scaricaci dentro l'immagine del
CD di Minix
mkdir minix
cd minix
wget http://matteo.vaccari.name/so/files/IDE-3.1.2.iso.gz
Decomprimi l'immagine
gunzip IDE-3.1.2.iso.zip
Creiamo un disco virtuale per qemu. Lo facciamo grandino, per esempio
1.2GB. Non ti preoccupare, lo spazio effettivamente occupato sul
disco è molto meno. (Per la spiegazione del comando qemu-img, digita
"man qemu-img")
qemu-img create -f qcow hd.qcow 1200M
Lanciamo qemu facendo boot dal CD (per una spiegazione delle opzioni
di qemu, "man qemu")
qemu -cdrom IDE-3.1.2.iso -boot d hd.qcow
Dopo pochi secondi abbiamo la schermata di login. La login è "root",
senza password.
Esegui il comando "setup" e leggi attentamente le
istruzioni. (Cerca di capire cosa fanno i vari comandi che
stai dando; non eseguire queste istruzioni come un robot.) Potrai
scegliere il tipo di tastiera, il tipo di scheda di rete (scegli "4"),
il tipo di installazione (completa o minima: vanno bene entrambe) e la
modalità "expert" o "automatic". Scegli "automatic" se vuoi fare in
fretta, "expert" se vuoi controllare in dettaglio quello che succede.
Se scegli "automatic" vanno bene tutti i default. Puoi saltare
il test dei blocchi danneggiati.
Ora facciamo "scendere" il sistema operativo con il comando
"shutdown". Ci ritroveremo con il prompt "fd0>" del boot monitor di
Minix. Puoi terminare l'emulatore con ctrl-alt-2, seguito da "quit".
Verifichiamo se siamo in grado di fare il boot dal disco rigido
qemu hd.cow
Dovresti avere il prompt di login in pochi secondi.
Installa i pacchetti addizionali. Da root esegui packman e segui le istruzioni. Se installi tutto, ci vorranno diverse ore.
Testare l'installazione
Entra come "root". Vai nella directory /usr/src/test e
digita "make". Poi fai logout ("exit") e fai la login come utente
"bin". Torna nella directory "/usr/src/test" ed esegui "./run".
Questo porterà via almeno un'ora.
Ricompilare Minix
Entra come root, vai in /usr/src/tools, digita "make" per vedere le
varie opzioni disponibili. Poi digita
make clean
time make image
Per installare la nuova immagine del kernel digita
make hdboot
La nuova immagine verrà installata in /boot/image/3.1.1r1. Per testare
la nuova immagine, dai "shutdown" per tornare nel boot monitor. Fai
il boot con "boot c0d0p0". Il monitor sceglierà l'immagine più
recente.
Editare con Minix
Ci sono molti editor. Io consiglio di scegliere emacs o vi.
- mined è l'editor tradizionale di Minix. Fai "man mined" per una
spiegazione dei comandi. Ricorda: per uscire fai "ctrl-X".
- vi è uno dei due editor classici di Unix. Gli utenti unix si
dividono fra fan di vi e fan di emacs
- elle è una versione molto semplificata di emacs. Nota che
l'utente root, e tutti gli utenti che aggiungerai con "adduser", hanno
nella loro home directory un profilo per "elle" che simula mined. Se
vuoi invece emulare emacs, togli dalla tua home i file ".ellepro.*"
- Se hai installato la versione 3.1.2, puoi installare emacs
Le partizioni
Una spiegazione dei nomi di device usati da Minix:
- /dev/c0d0 rappresenta il primo disco fisso: controller 0, disk 0. (Un
controller IDE può controllare un massimo di due dischi.
- /dev/c0d0p0 è la prima partizione del primo disco (partition 0)
- Se una partizione primaria è suddivisa internamente in partizioni
secondarie, allora i nomi di device sono tipo /dev/c0d0p0s0
(sottopartizione 0)
Installando Minix su qemu secondo queste istruzioni, il disco verrà
partizionato come segue:
- /dev/c0d0p0s0 16 MB /
- /dev/c0d0p0s1 225 MB /home
- /dev/c0d0p0s2 /usr
Howto
Come configurare la rete con qemu
- Nel setup, quando chiede quale scheda di rete supportare, scegliere la voce che dice "supportata da qemu"
- dare il comando halt per entrare nel monitor; poi digitare:
- qemu_pci=1
- save
- boot
Come connettersi attraverso la rete a qemu
- Fare partire qemu con l'opzione -redir tcp:5555::22
- impostare una password per root (con passwd)
- ssh -p 5555 -o StrictHostKeyChecking=no root@localhost
Come rimettere a posto il terminale quando "impazzisce"
- il comando clear pulisce lo schermo
- il comando stty sane resetta il terminale
Come modificare la keymap
Per caricare una nuova keymap al volo:
- loadkeys /usr/lib/keymaps/italian.map
Per cambiare la keymap in maniera permanente:
- cp /usr/lib/keymaps/italian.map /etc/keymap
Per modificare una keymap:
- salvare una copia di backup: cd /usr/src/drivers/tty/keymaps; cp italian.src italian.src.orig
- modificare italian.src
- cd /usr/src/tool
- make services
- loadkeys /usr/lib/keymaps/italian.map
Esercizio: realizzare una system call addizionale
Il prototipo è
int getpids(pid_t *current_pid, pid_t *parent_pid);
- Scrivere un programma di test, che verifica che la syscall funzioni. Inizialmente non compila. Il programma apre un albero di processi di 4 livelli e verifica il funzionamento di getpids() confrontando i risultati con getpid(2) e getppid(2). Per esempio:
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <getpids.h>
#include <assert.h>
#include <stdio.h>
#define N 4
void assert_getpids_works(void) {
pid_t expected_me = getpid();
pid_t expected_parent = getppid();
pid_t actual_me, actual_parent;
int result = getpids(&actual_me, &actual_parent);
assert(0 == result);
assert(actual_me == expected_me);
assert(actual_parent == expected_parent);
}
main(void) {
int i;
assert_getpids_works();
for (i=0; i<N; i++) {
if (0 == fork()) {
assert_getpids_works();
return 0;
} else {
int status;
wait(&status);
}
}
printf("OK\n");
return 0;
}
- Aggiungere src/include/getpids.h con il prototipo di getpids(). Installare gli header
cd src/tools
make includes
Ricompilare il prog di test. Il programma compila, ma fallisce il link.
- Modificare lo header di sistema src/include/minix/callnr.h.
- Aggiungere il sorgente lato userspace in lib/other/_getpids.c, usando come modello lib/posix/_getpid.c .
Inizialmente deve restituire dei numeri fasulli, tipo 999. Per esempio:
#include <lib.h>
#include <getpids.h>
PUBLIC pid_t getpids(pid_t *current, pid_t *parent)
{
*current = *parent = 999;
return 0;
}
- Aggiungere il nostro file a Makefile.in. Eseguire
make Makefile
make
- Installare tutte le librerie
cd src/lib
make all install
Verificare che il prog di test ora compila, ma le assert falliscono
- Modificare /usr/src/servers/pm/{proto.h,table.c,Makefile}
- Aggiungere un file sorgente a /usr/src/servers/pm; modificare il Makefile
- cd src/tools; make install
- occorre modificare anche servers/fs/table.c per tener conto della nostra nuova syscall
- Verificare che il programma di test ora funzioni correttamente