Istruzioni per Minix

Matteo Vaccari > Sistemi Operativi

Documentazione

Il sito principale per le informazioni su Minix è www.minix3.com. In particolare vanno studiate le seguenti pagine: 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.

Le partizioni

Una spiegazione dei nomi di device usati da Minix: Installando Minix su qemu secondo queste istruzioni, il disco verrà partizionato come segue:

Howto

Come configurare la rete con qemu

  1. Nel setup, quando chiede quale scheda di rete supportare, scegliere la voce che dice "supportata da qemu"
  2. dare il comando halt per entrare nel monitor; poi digitare:
  3. qemu_pci=1
  4. save
  5. boot

Come connettersi attraverso la rete a qemu

  1. Fare partire qemu con l'opzione -redir tcp:5555::22
  2. impostare una password per root (con passwd)
  3. ssh -p 5555 -o StrictHostKeyChecking=no root@localhost

Come rimettere a posto il terminale quando "impazzisce"

Come modificare la keymap

Per caricare una nuova keymap al volo: Per cambiare la keymap in maniera permanente: Per modificare una keymap:
  1. salvare una copia di backup: cd /usr/src/drivers/tty/keymaps; cp italian.src italian.src.orig
  2. modificare italian.src
  3. cd /usr/src/tool
  4. make services
  5. loadkeys /usr/lib/keymaps/italian.map

Esercizio: realizzare una system call addizionale

Il prototipo è
int getpids(pid_t *current_pid, pid_t *parent_pid);
  1. 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;
    }
    
  2. 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.
  3. Modificare lo header di sistema src/include/minix/callnr.h.
  4. 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;
    }
    
  5. Aggiungere il nostro file a Makefile.in. Eseguire
        make Makefile
        make
      
  6. Installare tutte le librerie
    cd src/lib
    make all install
    
    Verificare che il prog di test ora compila, ma le assert falliscono
  7. Modificare /usr/src/servers/pm/{proto.h,table.c,Makefile}
  8. Aggiungere un file sorgente a /usr/src/servers/pm; modificare il Makefile
  9. cd src/tools; make install
  10. occorre modificare anche servers/fs/table.c per tener conto della nostra nuova syscall
  11. Verificare che il programma di test ora funzioni correttamente