Capitolo 20. Operazioni varie

Sommario
20.1. Creazione di floppy di installazione
20.2. Creazione di CD-ROM
20.3. Sincronizzare l'orologio di sistema
20.4. Installare il boot manager
20.5. Cancellare la disklabel
20.6. Speaker
20.7. Memory file system
20.8. Dimenticata la password di root?
20.9. Aggiungere un nuovo disco fisso
20.10. Password file is busy?
20.11. Come ricreare in dispositivi nella directory /dev

Questo capitolo raccoglie in ordine sparso vari argomenti, che non hanno trovato collocazione negli altri capitoli.

20.1. Creazione di floppy di installazione

L'autore di questa sezione (Creazione di floppy di installazione) è Eric Delcamp

Per poter creare dei floppy di installazione è necessario che nel kernel sia abilitato lo "pseudo-device" vnd.

  1. Per prima cosa bisogna creare il kernel da mettere sui floppy, che supponiamo di chiamare FLOPPY, che deve derivare da uno dei kernel INSTALL.

  2. Una volta compilato, il kernel si troverà nel file /sys/arch/i386/compile/FLOPPY/netbsd.

  3. Portarsi nella directory /usr/src/distrib/i386/floppies/ramdisk e dare il comando

    # make	  
    Questo crea il file ramdisk.fs in quella directory.

  4. Portarsi nella directory /usr/src/distrib/i386/floppies/fdset e dare il comando:

    # make KERN=/sys/arch/i386/compile/FLOPPY/netbsd	  

  5. Il comando precedente ha creato uno o due file (dipende dalla dimensione del kernel) di nome boot1.fs e boot2.fs. A questo punto bisogna trasferire questi file su floppy con il comando (o meglio, i comandi):

    # dd if=boot1.fs of=/dev/fd0a bs=36b
    # dd if=boot2.fs of=/dev/fd0a bs=36b
    	  
    Naturalmente tra un comando e l'altro bisogna mettere un nuovo floppy nel drive.

20.2. Creazione di CD-ROM

Per creare un CD-ROM di dati si utilizzano i programmi mkisofs e cdrecord. NetBSD supporta l'utilizzo sia di masterizzatori SCSI sia di masterizzatori IDE. Questi ultimi si possono utilizzare in maniera del tutto trasparente, senza bisogno di installare emulazioni SCSI o altre diavolerie perché il driver è in grado di ricevere direttamente comandi ATAPI (come sempre NetBSD riesce a trovare la soluzione più semplice e più elegante).

La creazione di un CD procede in due fasi: dapprima si crea un'immagine ISO del CD sul disco fisso utilizzando il programma mkisofs e poi si scrive l'immagine sul CD con cdrecord. Negli esempi seguenti si suppone di utilizzare un masterizzatore IDE/ATAPI tra quelli supportati da cdrecord: il masterizzatore viene riconosciuto dal sistema come master secondario

cd1 at atapibus1 drive 0: <HP CD-Writer Plus 8100> type 5 cdrom removable    

20.2.1. Creazione dell'immagine ISO

Per creare l'immagine del CD su disco fisso bisogna innanzi tutto che ci sia spazio sufficiente sul disco: a seconda della quantità di dati può servire fino a 700MB. Supponendo che i dati che ci interessano siano nella directory mieidati, bisogna scrivere

# mkisofs -aflrTv -o cdimage mieidati/      

Una volta creato il file immagine cdimage, lo si può esaminare montandolo come se fosse un filesystem per controllare che non vi siano errori e non sprecare un prezioso CD.

# ls -l cdimage
-rw-rw-r--  1 auser     user  284672 Dec  1 11:58 cdimage
# vnconfig -v vnd0 cdimage 512/556/1/1
# mount -r -t cd9660 /dev/vnd0c /mnt
  ... browsing su /mnt ...
# umount /mnt
# vnconfig -u vnd0
      

Il valore 556 è stato ottenuto dividendo la dimensione del file, 284672, per 512.

20.3. Sincronizzare l'orologio di sistema

Per qualche strano motivo sembra che gli orologi di sistema non funzionino mai granché bene, e non è raro trovarsi con sfasamenti di parecchi minuti. Il problema si aggrava quando si ha a che fare con più host collegati in rete: con buona probabilità non si riuscirà mai a mantenerli sincronizzati. Per risolvere il problema viene il nostro aiuto il protocollo NTP (Network Time Protocol) versione 3, che consente di mantenere sincronizzati gli orologi di più workstation collegate in rete utilizzando dei server appositi.

Grazie al protocollo NTP è possibile sia semplicemente mantenere corretta l'ora di sistema di un singolo host, sia sincronizzare un'intera rete. Si tratta di un protocollo piuttosto complesso, che definisce la struttura gerarchica master-slave di una serie di server suddividendoli in strati: in cima alla gerarchia vi sono i server di strato 1, connessi a una sorgente hardware di riferimento per la data e l'ora. I server di strato 2 si sincronizzano via NTP con quelli di strato 1 e, a loro volta, fanno da server secondari per gli host degli strati inferiori. Questa struttura gerarchica evita la congestione che si avrebbe se tutti gli host client facessero riferimento ai server di strato 1. Se, per esempio, si vuole sincronizzare un'intera rete, non si devono collegare tutti gli host allo stesso server pubblico di strato 1; invece, si crea un server locale che si sincronizza con quello pubblico e i restanti host si sincronizzano con il server locale.

Fortunatamente, per sfruttare gli strumenti NTP non è necessario comprendere i dettagli del protocollo e della sua implementazione (chi fosse interessato può far riferimento al documento RFC 1305) ma è sufficiente sapere come avviare alcuni programmi. Su NetBSD sono già presenti i programmi necessari per sfruttare questo protocollo, derivati dall'implementazione xntp. In questa sezione viene descritto un semplice metodo per mantenere aggiornata l'ora di sistema.

Per prima cosa bisogna procurarsi l'indirizzo dei server NTP pubblici da utilizzare come riferimento; un elenco completo si può trovare su http://www.eecis.udel.edu/~mills/ntp/servers.html, ma per l'Italia possono essere usati tempo.cstv.to.cnr.it e time.ien.it, che sono due server di strato 1.

A questo punto, per sincronizzare l'orologio di sistema basta dare il comando (è necessario essere root):

# ntpdate -b tempo.cstv.to.cnr.it time.ien.it      
L'opzione -b serve per indicare a ntpdate di impostare direttamente il nuovo valore dell'ora di sistema anziché cercare di correggere quello attuale, ed è consigliata quando la differenza tra l'ora corretta (quella del server) e quella locale può essere notevole.

Abbiamo visto come funziona ntpdate; adesso bisogna decidere il modo migliore per avviarlo in automatico. Se l'host da sincronizzare è sempre collegato a Internet, la cosa migliore è lanciare il programma a ogni riavvio specificando

ntpdate=YES      ntpdate_hosts="time.ien.it"      
in /etc/rc.conf. Il nome del server può essere specificato in ntpdate_hosts, altrimenti lo script andrà a estrarlo dal file /etc/ntp.conf.

Se l'host viene collegato a Internet tramite un provider e la connessione non è sempre attiva, si può far lanciare il comando ntpdate dallo script ip-up, come spiegato nel Capitolo 10. In questo caso la riga da inserire nel file è:

/usr/sbin/ntpdate -s -b time.ien.it      
(il path è necessario). L'opzione -s causa il logging dei messaggi, che si possono poi ritrovare in /var/log/messages (salvo diversa configurazione di syslog.conf).

Oltre a ntpdate sono presenti vari altri comandi ed è anche possibile far diventare un host della rete il server NTP degli altri host client. Il server interno si sincronizzerà con i server di riferimento esterni alla rete e i client si sincronizzeranno con il nostro server. Per questo tipo di configurazione si deve utilizzare il demone xntpd, creando l'apposito file di configurazione /etc/ntp.conf. Ad esempio:

server time.ien.it
server tempo.cstv.to.cnr.it      

Xntpd si può anch'esso avviare da rc.conf, abilitando l'apposita opzione.

xntpd=YES      

Per la sincronizzazione interna alla rete, in alternativa alla configurazione descritta è anche possibile usare il demone timed, nato specificamente con 4.3BSD. Anche timed si basa su uno schema master-slave: quando viene avviato su una macchina, timed chiede al master l'ora di sistema della rete e corregge l'ora della macchina stessa appropriatamente. Si può quindi utilizzare una struttura mista, nella quale uno degli host si sincronizza con un server NTP pubblico e fa da master per la rete locale, i cui client si sincronizzano con timed. Sull'host di riferimento devono essere attivi sia NTP sia timed, e bisogna fare attenzione a non farli interferire (timed deve essere avviato con l'opzione -F hostname; in questo modo non tenta di aggiornare l'orologio locale).

20.4. Installare il boot manager

Il programma di installazione di NetBSD può installare il proprio boot manager, se l'utente lo richiede. In caso di errata o mancata installazione è possibile installarlo in un secondo tempo o modificarne le proprietà con il comando fdisk. Per esempio:

# fdisk -B wd0    

Se il sistema non si avvia dal disco fisso, si può fare il boot con il dischetto di avviamento usato per l'installazione e far partire il kernel sul disco fisso con un comando di questo tipo:

> boot wd0a:netbsd    

20.5. Cancellare la disklabel

Benché la cancellazione della disklabel non sia un'operazione frequente può essere utile sapere come fare in caso di necessità. Naturalmente si tratta di un'operazione da eseguire solo se si sa esattamente quello che si sta facendo. Per esempio:

# dd if=/dev/zero of=/dev/rwd0c bs=8k count=1    

In questo modo viene cancellata la disklabel ma non la tabella delle partizioni del MBR. Per cancellare completamente il disco usare wd0d. Per esempio:

# dd if=/dev/zero of=/dev/rwd0d bs=8k    

20.6. Speaker

Per produrre un suono sullo speaker (per esempio un avvertimento alla fine di uno script) si può utilizzare il device spkr del kernel che viene mappato sul dispositivo /dev/speaker. Per esempio, sulle mailing list ho trovato un post che suggeriva:

echo 'BPBPBPBPBP' > /dev/speaker    

20.7. Memory file system

Per migliorare le prestazioni in presenza di determinate configurazioni si può utilizzare un memory filesystem. A titolo di esempio, questa strategia può essere utile quando si compila molto e si dispone di sufficiente memoria. Per creare un file system in memoria, aggiungere una riga di questo tipo a /etc/fstab:

/dev/wd0b /tmp  mfs     rw,async,noatime,nosuid,-s=20000    

l'opzione -s=20000 imposta le dimensioni a circa 10 MB (20000 settori), che dovrebbero essere sufficienti per la compilazione del kernel.

20.8. Dimenticata la password di root?

Quando si dimentica la password di root non tutto è perduto, e si può ancora "recuperare" il sistema. I passi da compiere sono i seguenti: fare il boot in modalità monoutente, montare / e cambiare la password di root. In dettaglio:

  1. Fare il boot in modalità monoutente: quando compare il prompt di boot e inizia il conto alla rovescia di cinque secondi dare il comando:

    > boot -s	  

  2. Alla richiesta

    Enter pathname of shell or RETURN for sh:	  
    premere Invio.

  3. Dare i seguenti comandi:

    # fsck -y /
    # mount -u /
    # fsck -y /usr
    # mount /usr
    	  

  4. Cambiare la password di root con passwd.

  5. Dare il comando exit per passare alla modalità multiutente.

20.9. Aggiungere un nuovo disco fisso

Questa sezione spiega come aggiungere un nuovo disco fisso a un sistema NetBSD. Nell'esempio proposto verranno aggiunti un controller SCSI e un disco fisso collegato al nuovo controller. Chi non deve installare il controller può semplicemente saltare la lettura della parte relativa e andare direttamente alla configurazione dell'hard disk. L'installazione di un disco fisso IDE è identica a quella presentata nell'esempio; solo il nome del dispositico sarà diverso (wd# anziché sd#).

Come sempre, prima di acquistare nuovo hardware è bene consultare la lista delle compatibilità hardware di NetBSD, per accertarsi che il dispositivo scelto sia supportato dal sistema.

Completata l'installazione fisica del controller e del disco fisso, nonché il relativo collegamento si avvia il sistema e ci si accerta che il dispositivo sia riconosciuto con il solito dmesg. Per esempio, per un controller NCR-875 l'output è il seguente:

ncr0 at pci0 dev 15 function 0: ncr 53c875 fast20 wide scsi
ncr0: interrupting at irq 10
ncr0: minsync=12, maxsync=137, maxoffs=16, 128 dwords burst, large dma fifo
ncr0: single-ended, open drain IRQ driver, using on-chip SRAM
ncr0: restart (scsi reset).
scsibus0 at ncr0: 16 targets, 8 luns per target
sd0(ncr0:2:0): 20.0 MB/s (50 ns, offset 15)
sd0: 2063MB, 8188 cyl, 3 head, 172 sec, 512 bytes/sect x 4226725 sectors      
Se il dispositivo non compare nell'output bisogna accertarsi che il kernel in uso lo supporti ed eventualmente compilare un kernel personalizzato (si veda il Capitolo 7).

A questo punto si possono creare le partizioni con il comando fdisk. Per prima cosa visualizziamo lo stato attuale del disco:

# fdisk sd0
NetBSD disklabel disk geometry:
cylinders: 8188 heads: 3 sectors/track: 172 (516 sectors/cylinder)

BIOS disk geometry:
cylinders: 524 heads: 128 sectors/track: 63 (8064 sectors/cylinder)

Partition table:
0: sysid 6 (Primary 'big' DOS, 16-bit FAT (> 32MB))
    start 63, size 4225473 (2063 MB), flag 0x0
        beg: cylinder    0, head   1, sector  1
        end: cylinder  523, head 127, sector 63
1: <UNUSED>
2: <UNUSED>
3: <UNUSED>    

In questo esempio la partizione DOS verrà eliminata e sostituita con una partizione NetBSD che occuperà l'intero disco. Il comando fdisk -u sd0 consente di modificare interattivamente le partizioni. Le modifiche verranno scritte su disco soltanto alla fine, dopo aver chiesto conferma, il che consente di procedere con una certa tranquillità.

Dopo aver eseguito fdisk -u, confermiamo le modifiche e otteniamo le seguenti partizioni:

Partition table:
0: sysid 169 (NetBSD)
    start 63, size 4225473 (2063 MB), flag 0x0
        beg: cylinder    0, head   1, sector  1
        end: cylinder  523, head 127, sector 63
1: <UNUSED>
2: <UNUSED>
3: <UNUSED>      

A questo punto bisogna scrivere la disklabel sul disco. La sequenza corretta di operazioni è:

# disklabel sd0 > tempfile
# vi tempfile
# disklabel -R -r sd0 tempfile
      

In questo esempio creiamo le seguenti partizioni con disklabel, editando il file tempfile come spiegato sopra:

#      size   offset   fstype [fsize bsize   cpg]
a:  2048004       63   4.2BSD   1024  8192    16 # (Cyl.  0*- 3969*)
c:  4226662       63   unused      0     0       # (Cyl.  0*- 8191*)
d:  4226725        0   unused      0     0       # (Cyl.  0 - 8191*)
e:  2178658  2048067   4.2BSD   1024  8192    16 # (Cyl.  3969*- 8191*)      

Nota: una volta creata la disklabel, la si può ottimizzare studiando l'output del comando newfs -N /dev/sd0a che segnala se alla fine di una partizione rimangono settori non allocati. Questo valore si può utilizzare per modificare la dimensione della partizione stessa.

In ultimo creiamo i nuovi file system per le partizioni a ed e.

# newfs /dev/sd0a
# newfs /dev/sd0e
      
Il disco è ora pronto per essere usato, con due partizioni da montare. Per esempio:
# mount /dev/sd0a /mnt      

20.10. Password file is busy?

A alcuni utenti è capitato di ricevere il misterioso messaggio "Password file is busy" quando cercavano di modificare una password. La soluzione al problema è semplice: eliminare il file /etc/ptmp, dopo aver controllato che non contenga informazioni importanti (si tratta di una copia del file /etc/master.passwd che, per motivi imperscrutabili, è rimasta in circolazione anziché essere eliminata).

20.11. Come ricreare in dispositivi nella directory /dev

L'autore di questa sezione è Reinoud Koornstra

Per prima cosa è necessario passare alla modalità mono utente (single user) con le partizioni ancora montate "rw" (read-write). Per far ciò conviene semplicemente dare il comando shutdown now dalla modalità multi utente oppure riavviare il sistema con l'opzione -s e rendere / e /dev leggibili e scrivibili con i seguenti comandi:

# mount -u /
# mount -u /dev
    

Poi:

# mkdir /nudev
# cd /nudev
# cp /dev/MAKEDEV* .
# sh ./MAKEDEV all
# cd /
# mv dev odev
# mv nudev dev
# rm -r odev
    

In alternativa, se sul sistema sono installati i sorgenti in /usr/src, si può fare così:

# mkdir /nudev
# cd /nudev
# cp /usr/src/etc/MAKEDEV.local .
# cp /usr/src/etc/etc.$arch/MAKEDEV .
# sh ./MAKEDEV all
# cd /
# mv dev odev; mv nudev dev
# rm -r odev
    

Il valore da sostituire a $arch può essere determinato con il comando seguente:

# uname -m    

oppure con:

# sysctl hw.machine_arch    

Nota: Il secondo metodo per ricreare i dispositivi (quello che sfrutta i sorgenti installati sul sistema) può aggiungere alcuni dispositivi a quelli già esistenti (almeno sull'architettura i386). Per esempio, attualmente è possibile avere 16 partizioni anziché 8. Utilizzando la versione originale di MAKEDEV (quella della directory /dev), i nuovi dispositivi non saranno creati.