L'autore di questa appendice è Wojciech Puchar
Questa appendice descrive il procedimento da utilizzare per installare NetBSD senza fare uso di sysinst. Ci si può chiedere perché non usarlo; ecco alcune ragioni:
possibilità di usare opzioni non standard nella creazione dei file system.
perché è facile!
per avere il completo controllo del sistema e capire tutte le operazioni effettuate.
per imparare a preparare i propri dischetti di installazione, mettendo altri utili strumenti accessori al posto di sysinst.
Questa appendice descrive solo la configurazione di sistemi i386 in cui NetBSD sarà l'unico sistema operativo sul disco fisso. Ho cercato tuttavia di evidenziare le parti specifiche di questa architettura sperando di ricevere qualche contributo per quanto riguarda gli altri port (da inviare, in inglese, a wojtek@3miasto.net).
Per mettere in pratica quanto descritto in quest'appendice è richiesta una conoscenza dei comandi di base di Unix (cd, ls, cp, tar, ecc.).
Il processo di installazione consiste dei seguenti passi:
partizionamento del disco fisso
creazione del/dei filesystem
installazione del boot loader (dipendente dalla piattaforma e non presente in alcuni port, quali sparc, ecc.)
decompressione dei tarball nelle partizioni create
configurazione finale (creazione dei dispositivi /dev, /etc/fstab, impostazione del nome dell'host, ecc.)
Gli schemi di partizionamento possono essere semplici o anche molto complessi; ai fini della presente appendice non interessa discutere quale sia il migliore schema possibile: ci si limiterà a descrivere uno schema classico per Unix, comprendente una piccola partizione root, una partizione di swap e una partizione /usr per tutto il resto.
In questa appendice, come in molti manuali di NetBSD, si parlerà spesso di "label" e di "disklabel". Le disklabel sono le strutture usate da NetBSD (e dai sistemi BSD in generale) per memorizzare le informazioni relative alle partizioni. Pertanto la creazione della disklabel equivale al partizionamento.
Se il vostro di sistema ha memoria in sovrabbondanza e siete assolutamente certi che non avrete mai bisogno di swap, potete saltare questa sezione. Tuttavia, sui moderni dischi fissi di grandi dimensioni non è solitamente un problema lasciare una certa quantità di spazio per la partizione di swap, con il beneficio di poter avviare senza problemi un gran numero di programmi contemporaneamente.
Non esistono semplici formule per determinare la dimensione della partizione di swap. L'unica vera regola è che è meglio averne troppa che troppo poca, perché restare senza swap significa dover terminare non solo l'ultimo processo avviato ma anche tutti quelli che hanno bisogno di allocare memoria. Si può anche trattare di /sbin/init, il che porterà al collasso del sistema. Se avete uno di quegli enormi dischi fissi >10GB, laciate almeno 500MB per l'area di swap (ma anche di piu'). L'unica controindicazione è che l'uso dello swap comporta l'allocazione statica di 16 byte per ogni pagina i386 (4KB), il che significa usare 1MB di memoria per ogni 256MB di swap. Non è una cosa catastrofica, ma su una macchina con 16MB di memoria può diventare un problema.
Riassumendo: se avete un disco sufficientemente grande, allocate una generosa area di swap, altrimenti cercate di regolarvi in base alla memoria necessaria alle applicazioni che intendete utilizzare contemporaneamente.
Si può pensare che il posizionamento della partizione di swap sia ininfluente, il che è vero per quanto riguarda i dischi di vecchio tipo (per es. MFM). Sui dischi più recenti (intendendo dischi di oltre 80MB), però, sulle tracce esterne vengono scritti più dati rispetto a quelle interne a causa delle meggiori dimensioni. Ciò porta a un I/O più veloce sulle tracce esterne, che si trovano all'inizio del disco e quindi l'area di swap sarà più veloce se si trova nella zona iniziale.
Il filesystem standard usato da NetBSD è quello detto "ffs" o "ufs" (Fast File System o Unix File System). Anche se "fast" (veloce) non significa "il più veloce al mondo", si tratta di un file system dotato di buone prestazioni per uso generale e di meccanismi di protezione in caso di crash. Per creare il filesystem ci si può limitare a usare il comando newfs senza parametri, ma vale la pena di cercare di ottimizzarne l'uso. Vediamo ora una breve descrizione dei principali parametri su cui intervenire:
imposta la percentuale di spazio riservato. Il default di 10% è piuttosto abbondante e si può scendere al 5% senza particolari problemi ma è bene non scendere al di sotto di questo valore, perché riempiendo molto un filesystem ffs lo si rallenta.
imposta la dimensione in byte del blocco. Per i dischi di grosse dimensioni usare 8192 (8KB), mentre per quelli molto piccoli (<500MB) conviene usare 4096 per risparmiare spazio. Usando blocchi ancora più grandi non si velocizzano le operazioni e si può sprecare spazio, a meno di non memorizzare principalmente file di grosse dimensioni quali MP3 o filmati.
imposta la dimensione del frammento. Un blocco può essere suddiviso fino a un massimo di 8 frammenti e pertanto conviene impostare una dimensione pari a 1/8 della dimensione del blocco: 512 byte per blocchi da 4096 byte e 1024 byte per blocchi da 8192 byte. Il frammento è l'unità di allocazione minima per i file (come il cluster per Windows).
gli inode sono strutture usate per memorizzare informazioni sui file. Per ogni file ci deve essere almeno un inode (ma anche più di uno, per consentire al ffs di memorizzare i dati del file vicino al file stesso). La dimensione di default di 4096 è inadatta ai dischi di grosse dimensioni, perché consente di avere fino a 5 milioni di file su un dispositivo da 20GB. Una valutazione di massima consiglia l'uso di -i 16384 per dischi >2GB e di -i 32768 per dischi da 8GB. Usando valori più grandi non si risparmia più spazio perché un inode occupa 128 byte
Per esempio, le opzioni che uso per una partizione >10GB sono
# newfs -m 5 -b 8192 -f 1024 -i 32768 /dev/{nome_partizione}
La lettura della pagina di manuale di newfs è caldamente consigliata.
Durante il processo di boot il kernel (che di solito si chiama /netbsd) deve essere caricato in memoria dal disco. Il BIOS del PC (e il firmware delle altre architetture) non è di gestire astrazioni quali i filesystem, e quindi si limita a caricare in memoria il primo settore del disco e a eseguirne il codice. Questo codice determina la posizione del bootloader sul disco e lo carica. Il bootloader stesso, infine, può gestire il file system e carica il kernel. Poiché nel settore di boot devono venire memorizzate le coordinate fisiche del bootloader (/boot) non ci si può limitare a copiare il bootloader /boot nella partizione di destinazione, ma occorre dare il seguente comando:
# /usr/mdec/installboot -v /usr/mdec/biosboot.sym /dev/rwd0a
Per quanto riguarda la decompressione dei tarball e la configurazione finale del sistema non è necessaria una particolare introduzione teorica e quindi possiamo passare direttamente alla parte pratica.
Negli esempi seguenti supporremo che il disco fisso sia wd0, il CD cd0 (se presente) e la scheda di rete ep0 (se presente). Se i nomi reali sul vostro sistema sono diversi, basta sostituirli a quelli degli esempi.
Per prima cosa bisogna fare il boot da floppy o da CD. Quando compare il menu di sysinst selezionare "x - exit to shell". Dare il comando dmesg | more per verificare i nomi dei dispositivi dell'hardware presente sul sistema. Per esempio, l'output seguente
wd0 at pciide0 channel 0 drive 0: <ST320423A> wd0: drive supports 32-sector pio transfers, lba addressing wd0: 19536 MB, 16383 cyl, 16 head, 63 sec, 512 bytes/sect x 40011300 sectors wd0: 32-bit data port wd0: drive supports PIO mode 4, DMA mode 2, Ultra-DMA mode 4
indica che il disco "ST320423A" (ST di solito indica un disco Seagate) è collegato come master sul primo canale del controller IDE e ha 40011300 settori di 512 byte, il che porta a una dimensione di circa 19GB. Frequentemente la dimensione mostrata è minore (5-8%) rispetto a quella dichiarata dal produttore, perché i produttori considerano che 1GB equivalga a 1.000.000.000 byte anziché ai consueti 2^30 byte usati in ambito informatico. Poiché 2^30=1.073.741.824, si tratta di una differenza del 7,4%.
L'output:
ep0 at pci0 dev 10 function 0: 3Com 3c590 Ethernet ep0: interrupting at irq 9 ep0: address 00:20:af:f7:cd:71, 32KB byte-wide FIFO, 1:1 Rx:Tx split ep0: 10baseT, 10baseT-FDX, 10base5, 10base2 (default 10baseT)
Indica che la scheda ethernet viene identificata con ep0.
La maggior parte dei messaggi non è difficile da capire anche per i meno esperti, e la loro lettura è molto utile.
Poiché vogliamo ottenere un sistema con solo NetBSD, possiamo eliminare tutte le partizioni preesistenti sul disco con il seguente comando:
# dd if=/dev/zero of=/dev/rwd0d bs=1m count=1
che "ripulisce" il primo megabyte del disco riempiendolo di zeri.
/dev/rwd0d significa: la partizione "raw" d del disco wd0 (su i386 d è una pseudo partizione che copre l'intero disco). "Raw" indica che non viene effettuato buffering dal sistema (qui non è necessario).
# disklabel -I -i wd0
Il comando precedente serve per iniziare a partizionare un disco vuoto. Non specificare l'opzione -I se si vuole modificare una disklabel esistente.
Verrà mostrato il prompt:
partition>
Il sistema è in attesa di comandi. I comandi più importanti sono ? (help), I (imposta varie informazioni sul disco) e le lettere minuscole da a fino a h (impostano le informazioni per le rispettive partizioni).
Incominciamo con il comando I. Il sistema chiede il tipo di disco (accettare il default), il nome del disco (idem) e la label. La label è a piacere; per esempio si può scrivere il proprio nome. In caso di furto del disco fisso si può dimostrare di essere il proprietario perchè fdisk di DOS/Windows non cancella questa informazione.
Numero di partizioni: scegliere 8 (ma anche di più se ce n'è bisogno). Lasciare i valori di default per le altre opzioni, visto che le informazioni relative alla geometria dei dischi moderni sono in realtà fittizie.
Ora bisogna creare le partizioni, cominciando con le partizioni "d" e "c" che si riferiscono all'intero disco:
partition> d Filesystem type [?] [unused]: Start offset [0c, 0s, 0M]: 0s Partition size ('$' for all remaining) [39693.8c, 40011300s, 19536.8M]: $ partition> c Filesystem type [?] [unused]: Start offset [0c, 0s, 0M]: 0s Partition size ('$' for all remaining) [39693.8c, 40011300s, 19536.8M]: $
Nota: sul port i386 la partizione "d" si riferisce all'intero disco e la "c" alla parte NetBSD del disco. Nel nostro esempio NetBSD copre l'intero disco e pertanto le partizioni "d" e "c" coincidono.
Poi si passa alla creazione della partizione da mettere all'inizio del disco. Nel partizionamento classico di Unix si tratta della partizione "a", di circa 50MB. Questa dimensione deve essere aumentata opportunamente se si intende tenere molta posta in spool o avere spazio in /tmp o /home senza creare partizioni separate per /var o /home.
partition> b Filesystem type [?] [unused]: 4.2BSD Start offset [0c, 0s, 0M]: 0s Partition size ('$' for all remaining) [0c, 0s, 0M]: 100000s
100000 settori corrispondono a circa 50MB o poco meno.
Creiamo la seconda partizione (swap) di circa 585MB:
partition> a Filesystem type [?] [unused]: swap Start offset [0c, 0s, 0M]: 100000s Partition size ('$' for all remaining) [0c, 0s, 0M]: 1200000s
e infine la partizione "e" per /usr fino alla fine del disco:
partition> e Filesystem type [?] [unused]: 4.2BSD Start offset [0c, 0s, 0M]: 1300000s Partition size ('$' for all remaining) [0c, 0s, 0M]: $
Verificare che tutto sia a posto con il comando P:
partition> P 8 partitions: # size offset fstype [fsize bsize cpg/sgs] a: 100000 0 4.2BSD 0 0 0 # (Cyl. 0 - 99*) b: 1200000 100000 swap # (Cyl. 99*- 1289*) c: 40011300 0 unused 0 0 # (Cyl. 0 - 39693*) d: 40011300 0 unused 0 0 # (Cyl. 0 - 39693*) e: 38711300 1300000 4.2BSD 0 0 0 # (Cyl. 1289*- 39693*)
Nota: bisogna accertarsi che le partizioni non si sovrappongano (fatta eccezione per c e d). È molto importante ed è bene controllare due volte.
Infine dare i comandi:
partition> W Label disk [n]? y Label written partition> Q
La disklabel è stata scritta. Congratulazioni, la parte più impegnativa dell'operazione è terminata
Per una piccola partizione root usare:
# newfs -m 5 -b 4096 -f 512 /dev/rwd0a
Per partizioni più grandi:
# newfs -m 5 -b 8192 -f 1024 -i 32768 /dev/rwd0<partition name>
È importante aver letto la teoria presentata nelle sezioni precedenti e non limitarsi a ricopiare i comandi.
Ora installiamo il bootloader:
# /usr/mdec/installboot -v /usr/mdec/biosboot.sym /dev/rwd0a
Montare le partizioni su /mnt:
# mount -o async,noatime /dev/wd0a /mnt # mkdir /mnt/usr # mount -o async,noatime /dev/wd0e /mnt/usr ... montare le altre partizioni create ...
Le opzioni async e noatime non sono obbligatorie: tendono a favorire la velocità delle operazioni a discapito dell'integrità del filesystem. La protezione dai crash di sistema in questo momento non è fondamentale, visto che si può ripulire tutto e riinstallare facilmente in caso di crash.
Le sezioni seguenti descrivono alcuni comuni metodi di installazione:
CDROM |
FTP |
NFS |
nastro |
# mount_cd9660 /dev/cd0a /mnt2 # cd /mnt2/dove_si_trovano_i_tarball
"dove_si_trovano_i_tarball" è solitamente i386/binary/sets. Usare i soliti comandi cd e ls per verificare, se non si è sicuri.
Copiare con cp i file desiderati su /mnt/usr. Come minimo bisogna installare base.tgz, etc.tgz e kern.tgz. Se il disco è grande copiare tutto (saltando i file kern*.tgz non utilizzati, visto che basta un solo kernel).
Ora eseguire cd / e umount /mnt2 e, infine, rimuovere il CD.
Attivare la rete. Per esempio, se l'indirizzo IP è 192.168.3.7 e la maschera di rete è 255.255.255.0 (24 bit), scrivere:
# ifconfig ex0 192.168.3.7/24 up
Se la scheda di rete non lo riconosce automaticamente può essere necessario indicare il tipo di "media" aggiungendo "media 10base2" o "media 10baseT" oppure "media 100baseT". Consultare la pagina di manuale di ifconfig per ulteriori informazioni.
Se il server FTP non si trova sulla rete locale, bisogna aggiungere una "route" di default ooportuna. Per esempio:
# route add default 192.168.3.1
poi raggiungere con ftp il server contenente i file di NetBSD. Per il momento si possono solo usare indirizzi IP, e non nomi.
# cd /mnt/usr # ftp 192.168.3.13
Nota: se proprio si vogliono usare i nomi, si può definire un name server (per esempio 192.168.3.2) in questo modo:
# echo "nameserver 192.168.3.2" > /etc/resolv.confe poi dare il comando:# ftp ftp.netbsd.org
Fare il login, portarsi nella directory dove si trovano i file della distribuzione e scaricarli tutti con il comando get. Infine uscire da ftp.
Attivare la rete come già spiegato. Poi:
# mount IP-del-server-NFS:/directory /mnt2
per esempio:
# mount 192.168.3.13:/public/ /mnt2
Poi procedere come per l'installazione da CD. Per esempio:
# cd /mnt2/NetBSD-1.5.2/i386/binary/sets # ls
e copiare tutti i file necessari. Poi:
# cd / # umount /mnt2
Anche se i desktop solitamente non hanno unità a nastri, i server spesso ne hanno una (e talvolta anche un lettore di CD, tanto per occupare un po' di spazio). L'installazione da nastro è molto semplice anche se, purtroppo, i PC non possono fare il boot da nastro e quindi bisogna utilizzare i floppy.
Per preparare un nastro per l'installazione bisogna avere a disposizione un'altra macchina con un'unità a nastri.
Riavvolgere il nastro:
# mt rewind
impostare una dimensione di blocco senza limitazioni per i nastri SCSI
# mt setblk 0
Questo cambia la piccola dimensione di default del blocco a una dimensione qualsiasi. Usando blocchi di grandi dimensioni si possono velocizzare le operazioni, soprattutto sui drive DAT/DDS.
È meglio disabilitare la compressione perché alcuni lettori non sono in grado di leggere un flusso compresso. D'altronde comprimendo dei file già compressi non si hanno benefici, anzi si potrebbe perfino ottenere un peggioramento (fino al 15% sui dischi HP DDS!):
# mt compression 0
Memorizzare i file della distribuzione:
# cd /dove_si_trovano_i_tarball # tar -b64 -cvf /dev/nrst0 *.tgz
Quest'ultimo comando scrive tutti i file tgz su nastro con una dimensione di blocco di 64*512 byte (32KB, una dimensione di blocco ben testata per tutti i DAT).
Avendo usato il dispositivo /dev/nrst0 (prima unità a nastri SCSI, senza riavvolgimento) si può ora registrare anche qualche altro archivio, per esempio qualche utile package di base (per es. editor).
# cd /dove_sono_i_package/All # tar -b64 -cvf /dev/nrst0 joe*.tgz screen*.tgz
Con il comando precedente sono stati aggiunti l'editor joe e il programma screen. È meglio non aggiungere troppi package in questo file.
Ora si possono aggiungere altri package da installare dopo che il sistema è entrato in funzione in modalità multiutente.
# tar -b64 -cvf /dev/nrst0 package_vari
e anche, volendo,
# tar -b64 -cvf /dev/nrst0 *.tgz
Ora si può riavvolgere ed estrarre il nastro:
# mt rewoffl
Il nastro per l'installazione è pronto! Poiché i lettori DDS sono compatibili all'indietro, può essere conveniente acquistare un lettore DDS-1 o DDS-2 usato economico per il computer di casa. Così sarà possibile preparare nastri di installazione e, ovviamente, fare il backup del computer: un vantaggio non da poco, che a mio avviso vale sicuramente la spesa.
Caricare il nastro preparato e dare i comandi:
# mt rewind # mt setblk 0 # cd /mnt/usr # tar -b64 -xvf /dev/nrst0
Non è una cattiva idea copiare qualche altro package extra, in particolare un editor (come joe o jed) per chi non si trova a proprio agio con vi. L'importante è copiare i package su /mnt e non su /mnt/usr. Naturalmente per trasferire i file si può scegliere uno qualunque tra i metodi esposti nelle sezioni precedenti oopure anche utilizzare dei dischetti.
Decomprimere i tarball tutti insieme:
# cd /mnt # for x in usr/*.tgz;do tar xzpvf $x;done # rm usr/*.tgz
o, se si preferisce, uno alla volta:
# tar xzpvf /usr/base.tgz
Se si è creata una sola grande partizione per /usr (e magari una piccola root) può essere una buona idea spostarci dentro /tmp, /var e /home creando dei link simbolici:
# cd /mnt # tar cf - var home tmp|(cd usr; tar xpvf -) # rm -rf var home tmp # ln -s usr/var . # ln -s usr/home . # ln -s usr/tmp .
Questa sequenza di comandi sposta /var, /home e /tmp dentro a /usr e crea i link necessari.
Ancora non è venuto il momento di installare i package aggiuntivi!
Il comando seguente crea i nodi dei dispositivi in /dev (su un 486 può richiedere un po' di tempo):
# cd /mnt/dev # ./MAKEDEV all
Poi cd /mnt/etc e creare fstab. Chi ha dei problemi con vi può usare il comando:
# cat > fstab # /dev/wd0a / ffs rw,softdep,noatime 1 1 # /dev/wd0b none swap sw 0 0 # /dev/wd0e /usr ffs rw,softdep,noatime 1 1 # ^D (control-D)
Se si vuole usare kernfs, creare la directory /kern e aggiungere una riga al file /etc/fstab:
# mkdir /mnt/kern # echo "/kern /kern kernfs rw" >> fstab
Infine verificare che tutto è a posto:
# cat fstab
Rimuovere CD/dischetti/ecc., scrivere reboot e attendere che il sistema si riavvii in modalità monoutente.
Al prompt della shell, scrivere:
# /sbin/mount -a
per montare tutti i filesystem "read-write". Chi ha copiato dei package aggiuntivi (editor, ecc.) li può ora installare con il comando pkg_add. Poi si possono rimuovere i tarball con rm.
Adesso bisogna editare /etc/rc.conf, /etc/defaults/rc.conf e gli altri file di configurazione. Leggere il documento di installazione INSTALL per i dettagli. Generalmente, per far funzionare il sistema è sufficiente mettere
rc_configured=YESin /etc/rc.conf e impostare il nome dell'host in /etc/defaults/rc.conf.
Con ^D (Control-D) si passa alla modalità multiutente. Il sistema è installato e funzionante.