Questo documento vuole fornire un insieme di istruzioni semplici e relativamente indolori su come installare e far funzionare Debian GNU/Hurd con il minimo sforzo.
È basato su The Hurd Installation Guide
di Neal H. Walfield.
Grazie a Neal per il suo contributo.
Notare che alcuni punti di questo manuale sono un po' fastidiosi perché richiedono molto tempo e potrebbero essere causa di problemi. Potrebbe essere preferibile, in particolare se si è agli inizi, l'installazione tramite le immagini dei CD già pronte. Anche se sono vecchie di solito funzionano e in seguito si possono prelevare gli aggiornamenti dai repository online.
La distribuzione Debian GNU/Hurd, diversamente dalle distribuzioni di altri sistemi operativi, non ha un bel sistema di installazione. Prima o poi verrà realizzato e forse voi contribuirete al suo progetto o alla sua implementazione, comunque, fino ad allora l'installazione di Debian GNU/Hurd richiede un altro sistema operativo e in particolare un altro sistema Unix-like. Molti utenti hanno riportato installazioni concluse con successo usando varie versioni di GNU/Linux e addirittura con BSD. I requisiti minimi del sistema di avvio sono la capacità di: creare un filesystem ext2, estrarre un archivio tar e installare GNU Grub.
La natura di GNU è simile a qualsiasi altro sistema Unix-like: dopo il
login all'utente viene presentata una shell e il familiare VFS (filesystem
virtuale) di Unix. Nonostante GNU tenti di essere conforme a POSIX, è "Non
Unix". GNU/Hurd è basato su molti dei concetti di Unix e li estende sia
aggiungendo nuove funzionalità che correggendo le cose che sono percepite
come imperfette nel progetto originale. La differenza più grande sono i
traduttori, dei programmi in spazio utente che interagiscono con il VFS.
Questi filesystem non risiedono nel kernel e nemmeno necessitano di essere
eseguiti come root; l'unica cosa che richiedono è l'accesso al supporto
sottostante e un mount point. Un'altra differenza è che i
processi anziché avere l'identità di un singolo utente fissata al momento
della creazione hanno le informazioni sull'identità separate dal processo,
quindi, con i giusti permessi, si possono aggiungere o rimuovere identità.
Essendo parente stretto dell'ambiente Unix (e in particolar modo dello spazio utente GNU che si trova in varianti anche molto popolari come GNU/Linux) è imperativo sentirsi a proprio agio con GNU. L'esperienza con gli strumenti Debian si rivela preziosa anche per la configurazione e la manutenzione di una macchina con GNU/Hurd.
Questa guida si sforza di rendere il processo di installazione di GNU/Hurd il più semplice possibile. Se si riscontrano degli errori (che sono certamente dovuti all'autore) si prega di segnalarli insieme a qualsiasi suggerimento o critica si voglia fare all'autore stesso; viene accettato tutto con immenso piacere.
Se non si dispone di una partizione disponibile o di un hard disk aggiuntivo questo può essere il passo più lungo, infatti in questo caso è necessario ripartizionare l'hard disk. Una possibilità è usare l'editor di partizioni di GNU, Parted. Non solo permette la modifica di base delle partizioni ma permette anche il ridimensionamento e lo spostamento delle partizioni. Il manuale è abbastanza completo e include svariati tutorial.
Hurd supporta diverse estensioni al formato del filesystem ext2fs. Le cose
più importanti fra queste sono i traduttori passivi e un quarto gruppo di bit
con i permessi per gli utenti sconosciuti (gli utenti senza identità, non gli
utenti "other"). Per usare queste estensioni il proprietario della partizione
deve essere impostato a hurd. mke2fs, a meno che non
sia specificato diversamente sulla riga di comando, imposta come proprietario
qualsiasi kernel sia in esecuzione. Dal momento che Hurd rispetta diligentemente
questa impostazione si deve prestare molta attenzione dando il valore
appropriato altrimenti Hurd si comporterà in modo impredicibile. Attenzione,
anche se un filesystem è in possesso di un particolare kernel, altri kernel
possono continuare a usarlo ma potrebbero non essere capaci di usare certe
estensioni.
Per creare un filesystem usare mke2fs e passare -b
4096 -I 128 -o hurd
per indicare l'Hurd come proprietario del
nuovo filesystem. Per esempio, supponendo che la partizione sia
/dev/hda2:
# mke2fs -b 4096 -I 128 -o hurd /dev/hda2 |
Il boot loader del sistema GNU è GRUB (GRand Unified Boot loader) e il suo scopo principale è avviare il cuore del sistema GNU (Mach e l'Hurd). Qualsiasi bootloader che supporti lo standard multiboot può essere usato per caricare Mach e l'Hurd. Al momento (noi sappiamo che) GNU GRUB è l'unico boot loader che supporta questo standard.
Una parola su Grub, diversamente dai boot loader tradizionali per x86, come LILO, Grub è veramente molto potente. Ha una interfaccia a riga di comando, bootp, il supporto per terminali virtuali e una grande quantità di altre funzionalità. Inoltre è in grado di avviare quasi tutti i kernel, se non avete mai avviato una alpha o una sparc allora non potete capire cosa può fare Grub. Quindi, non vi preoccupate: Grub è il migliore. Vi piacerà. Non tornerete indietro.
Probabilmente è consigliabile installare Grub prima di installare Hurd, comunque è possibile eseguire l'installazione di Grub sul disco fisso anche in seguito.
Il passo successivo è scaricare il sistema di base. Ci sono diverse possibilità, se è in esecuzione un sistema Debian si può usare il pacchetto crosshurd altrimenti si può recuperare il tarball del sistema di base da un qualsiasi mirror indicato in http://wiki.debian.org/DebianPorts/Mirrors.
Il tarball è impostato per estrarre tutto il suo contenuto nella directory attuale. L'archivio può essere estratto solo dopo aver montato un filesystem. Supponendo che il filesystem sia su /dev/hda2, che il mount point sia /gnu e che l'archivio sia nella directory home dell'utente allora è necessario:
# mount -t ext2 /dev/hda2 /gnu # cd /gnu # tar --same-owner -xvjpf ~/gnu.tar.bz2 |
Adesso tutto è pronto per avviare GNU/Hurd per la prima volta. Dopo aver verificato che il dischetto di avvio con Grub sia inserito nel drive riavviare il sistema. Se tutto va bene verrà mostrato il menu o la riga di comando di Grub. Se si presenta il menu premere c per passare alla riga di comando.
Per prima cosa si deve caricare GNU Mach, questo richiede la conoscenza
del filesystem e del percorso di GNU Mach. Grub usa una nomenclatura
leggermente diversa sia da Linux che da Hurd: i dischi IDE e SCSI sono
entrambi nominati (hdN,M). N è il numero del dispositivo
(partendo da zero) fornito dal BIOS, quindi Grub non fa distinzione fra dischi
SCSI e IDE. M identifica la partizione sul disco (anche questo
partendo da zero). Se questo confonde non c'è da preoccuparsi: Grub fornisce
molti aiuti.
Per determinare su quale filesystem risiede un particolare file Grub
fornisce il comando find. Quando questo comando viene dato
insieme al nome di un file, Grub cerca su ogni filesystem il file specificato
e mostra dove è stato trovato. Per esempio per cercare il kernel
/boot/gnumach.gz:
grub> find /boot/gnumach.gz (hd0,0) |
In questo esempio Grub indica che /boot/gnumach.gz è su (hd0,0).
Prima di caricare il kernel deve essere specificata sulla riga di comando almeno un'altra opzione, la partizione di root. Questa verrà usata da Hurd (cioè non da Grub) e quindi dovrà essere in un formato che Hurd possa capire.
GNU Mach numera i dischi partendo da zero. I dispositivi IDE hanno il
prefisso hd mentre i dischi SCSI hanno il prefisso
sd. Come avviene con Linux i dischi sono numerati in base alla
loro posizione sul controller. Per esempio il master su canale primario è
hd0 e lo slave su canale secondario è hd3. Le
partizioni seguono la nomenclatura delle partizioni BSD, si aggiunge
sM al nome del disco per indicare una certa partizione. Notare
che M inizia a contare da uno e non da zero. Il numero della
partizione è semplice da calcolare: basta incrementare il valore usato da
Grub di uno.
Dal momento che Hurd non è stato ancora configurato è necessario avviare il sistema in modalità singolo-utente, è sufficiente aggiungere -s alla riga di comando del kernel.
Supponendo che il primo disco (cioè (hd0)) sia il master sul controller secondario, si userà:
grub> kernel (hd0,0)/boot/gnumach.gz root=device:hd2s1 -s [Multiboot-elf, ...] |
Successivamente devono essere caricati il servente per il filesystem di
root e il servente exec. Questo si può fare grazie alla capacità
di Grub di avviare i moduli. Le ${var} sono inserite da GNU Mach. Gli
argomenti sono usati da Hurd per indicare quale tipo di informazione sarà
fornita. Dato che la riga di comando di ext2fs è molto lunga la si può
spezzare usando la sequenza di escape del carattere a capo nello stesso modo
usato normalmente in Unix. Assicurarsi di non lasciare spazi dopo il
contro-slash finale di ogni riga inoltre assicurarsi di distinguere
{ e } da ( e ).
grub> module (hd0,0)/hurd/ext2fs.static --multiboot-command-line=${kernel-command-line} --host-priv-port=${host-port} --device-master-port=${device-port} --exec-server-task=${exec-task} -T typed ${root} $(task-create) $(task-resume)
[Multiboot-module 0x1c4000, 0x2cfe6a bytes]
grub> module (hd0,0)/lib/ld.so.1 /hurd/exec $(exec-task=task-create)
[Multiboot-module 0x494000, 0x27afe bytes]
|
Una volta che Hurd è in esecuzione, il procedimento può essere automatizzato inserendo gli appropriati comandi nel file di configurzione di Grub /boot/grub/menu.lst.
Adesso GNU/Hurd può essere avviato con:
grub> boot |
Se GNU/Hurd non si avvia potrebbe essere colpa di IRQ condivisi: GNU Mach
non li gestisce molto bene. Si può verificare questa situazione guardando,
per esempio, il file /proc/interrupts sotto GNU/Linux. Inoltre, dato
che GNU Mach non supporta i moduli del kernel molti dei driver sono compilati
nel kernel, se nel sistema sono presenti delle vecchie periferiche queste
potrebbero creare dei problemi infatti un dispositivo potrebbe rispondere in
modo non corretto a un segnale rivolto a un dispositivo completamente
indipendente e quindi causare un crash. Di solito compilare un nuovo kernel
con solo i driver dei dispositivi necessari risolve questo genere di problemi,
GNU Mach è facilmente cross-compilabile. Se si usa Debian si installi il
pacchetto mig
e il compilatore gcc
.
Se questo non è di aiuto si chieda sull'appropriata lista di messaggi.
Una volta che si dispone del prompt della shell e ogni volta che Hurd è in modalità singolo-utente è necessario impostare il tipo di terminale:
# export TERM=mach |
Avviso: CONTROL-C e famiglia non funzionano nella modalità singolo-utente.
Adesso è possibile eseguire lo script native-install. Questo
configurerà i pacchetti e imposterà molti importanti traduttori:
# ./native-install |
La fine prematura dello script indica che è necessario eseguirlo una
seconda volta. Seguite le sue istruzioni e riavviate usando il comando
reboot. Si entri nuovamente in modalità singolo-utente e si
esegua di nuovo ./native-install.
Per configurare la rete è necessario configurare prima il traduttore
pfinet. Questo lo si fa con il comando settrans che collega
un tradutore a un certo nodo del filesystem e quando i programmi accedono
al nodo, per esempio inviando un RPC, il sistema operativo avvia in modo
trasparente il servente per gestire la richiesta.
# settrans -fgap /servers/socket/2 /hurd/pfinet -i eth0 -a a.b.c.d -g e.f.g.h -m i.j.k.l |
In questo esempio a settrans sono state passate diverse
opzioni. Le prime due fg forzano tutti i traduttori esistenti
a disattivarsi. Le due successive ap creano un traduttore sia
attivo che passivo, rendendo attivo un traduttore si possono immediatamente
vedere i messaggi di errore su stderr. Le opzioni seguenti salvano
il traduttore e gli argomenti nel nodo e quindi può essere riavviato in modo
trasparente in seguito (cioè rendono le impostazioni persistenti ai riavvii
del sistema). Le opzioni sono seguite dal nodo a cui deve essere collegato
il traduttore, infine c'è il programma (cioè il traduttore) da eseguire e
tutti gli argomenti da passargli. L'opzione -i è l'interfaccia
su cui pfinet si metterà in ascolto, -a è
l'indirizzo IP, -g è il gateway e -m è la maschera
di rete.
Assicurarsi di aggiungere i name server nel file /etc/resolv.conf:
nameserver 192.168.1.1 |
Testare la configurazione con ping -c2 gateway, l'opzione
-c è importantre per limitare il numero di ping, infatti
CONTROL-C non funziona in modalità singolo-utente.
DHCP ancora non funziona con Hurd. Questo è dovuto alle limitazioni di pfinet: è basato sul codice TCP/IP di Linux ed è incapace di ascoltare su 0.0.0.0.
Aiuto su settrans può essere ottenuto passando l'opzione
--help. L'aiuto su uno specifico traduttore può essere ottenuto
invocandolo dalla riga di comando con lo stesso argomento, per esempio:
# /hurd/pfinet --help |
Come in questo caso può essere generato molto output, si tenga
in considerazione l'uso di una pipe con un impaginatore come
less.
Il passo successivo è modificare /etc/fstab per aggiungere altri
filesystem e lo spazio di swap. È molto importante usare lo
spazio di swap, l'Hurd risulterà di un ordine di grandezza più stabile. Notare
che l'Hurd può condividere in modo trasparente una partizione di swap con
Linux ma sarà anche lieto di condividere qualsiasi altro dispositivo comprese
partizioni grezze come la partizione con la home. Normalmente nano
è l'unico editor installato con la distribuzione di base.
Questo è un esempio del file /etc/fstab:
# <file system> <mount point> <type> <options> <dump> <pass> /dev/hd2s1 / ext2 rw 0 1 /dev/hd2s2 /home ext2 rw 0 2 /dev/hd2s3 none swap sw 0 0 |
Ricordarsi di creare tutti i device con il comando MAKEDEV:
# cd /dev # ./MAKEDEV hd2s1 hd2s2 hd2s3 |
Per montare un filesystem nfs viene usato il traduttore
/hurd/nfs. Quando è eseguito da un utente non privilegiato il
traduttore si connette al server utilizzando una porta superiore alla 1023.
Normalmente GNU/Linux non permette questo comportamento, per far accettare
a GNU/Linux le connessioni da porte non riservate si deve aggiungere
l'opzione insicure nella riga export. Segue un esempio di
/etc/exports in cui si suppone che l'indirizzo IP del client sia
192.168.1.2:
/home 192.168.1.2(rw,insecure) |
Per montarlo sul sistema GNU supponendo che l'indirizzo IP del server nfs sia 192.168.1.1 usare:
# settrans -cgap /mount/point /hurd/nfs 192.168.1.1:/home |
Infine riavviare in modalità multiutente, cioè nello stesso modo usato per la modalità singolo-utente ma tralasciando l'opzione -s quando si carica il kernel. Per i dettagli vedere la sezione 5. Avvio di GNU/Hurd.
Buon divertimento!
Dover caricare il kernel a mano può essere molto tedioso. Modificare /boot/grub/menu.lst e adattarlo alle proprie esigenze, l'avvio del sistema diventerà molto più veloce e molto più semplice.
Normalmente solo pochi device sono creati nella directory /dev.
Usare lo script MAKEDEV per creare i device node di cui si
necessita.
Esistono diversi modi per aggiungere dei pacchetti, scaricarli e usare
dpkg -i funziona ma è molto scomodo. Il modo più semplice è
usare apt-get. Aggiungere una delle prossime righe da
http://wiki.debian.org/DebianPorts/Mirrors di unreleased a
/etc/apt/sources.list
:
deb http://ftp.debian-ports.org/debian unreleased main |
http://ftp.debian-ports.org/ e i suoi mirror contengono dei pacchetti modificati o delle patch che ancora non sono stati integrati nella versione originale o in Debian.
E da unstable su uno dei mirror Debian (si veda http://www.debian.org/mirror/list per l'elenco completo) che contiene l'architettura hurd:
deb http://ftp.de.debian.org/debian unstable main |
http://ftp.debian-ports.org/ e i mirror contengono dei pacchetti modificati o delle patch che ancora non sono stati integrati nella verisone originale o in debian. Per usare un mirror locale Debian vedere http://www.debian.org/distrib/ftplist.
Se GNU Mach non riconosce la scheda di rete o si usa un modem, l'unico modo per aggiornare i pacchetti è scaricarli e poi trasferirli nel sistema GNU. Il modo più semplice per fare queste operazioni è usare apt fuori-linea. Vedere /usr/share/doc/apt-doc/offline.text.gz per le istruzioni dettagliate.
Oltre alla console Mach già vista durante l'installazione, GNU/Hurd ha una potente console in spazio-utente che fornisce terminali virtuali. Attualmente è necessario avviare manualmente la console Hurd con il seguente comando:
# console -d vga -d pc_mouse --repeat=mouse -d pc_kbd --repeat=kbd -d generic_speaker -c /dev/vcs |
Nella console Hurd si può passare da iun terminale virtuale a un altro con ALT+F1, ALT+F2 e così via. ALT+CTRL+BACKSPACE chiude la console Hurd causando il ripristino della console Mach da dove si può riaprire la console Hurd con il comando precedente.
È stato fatto il port di X.Org, tutte le schede video supportate che non richiedono un modulo del kernel dovrebbero funzionare.
È necessario essere nella console Hurd e ripetere l'installazione
come indicato nella Sezione 8.4. Poiché X.Org ha /dev/kbd
come device per la tastiera cablato nel codice è necessario creare un link
simbolico:
# cd /dev # ln -s cons/kbd kbd # ln -s cons/mouse mouse |
Sono necessari parecchi pacchetti per X. x-window-core,
rxvt e twm, fvwm o wmaker
sono un buon inizio.
Si può usare debconf per configurare X.Org, comunque non è pronto per Hurd e il file di configurazione deve essere ritoccato. Dopo la configurazione, modificare la sezione pointer che deve diventare:
Section "Pointer" Protocol "osmouse" Device "/dev/mouse" EndSection |
Emulate3Buttons e ZAxisMapping devono essere entrambi disattivati.
Infine, eseguire startx.
Ci sono diverse cose da tenere in mente. Ancora non
è stato fatto il port di update-menu quindi mancano i menu
Debian. Sebbene esista l'implementazione di pthreads non è stato
fatto il port di tutti i pacchetti pthread: non pensate che GNOME o KDE
funzionino senza.