Appunti Solaris - De Falco Alfano

Transcript

Appunti Solaris - De Falco Alfano
Appunti Solaris - Unix
Appunti Solaris - Unix
Autore
ldfa
Versione
1.4 del 28.11.2007
Indice generale
Introduzione....................................................................................................................1
Notazioni....................................................................................................................2
Cosa è Solaris..................................................................................................................2
Logging...........................................................................................................................2
Principali Shell..................................................................................................................3
Gestione Disco.................................................................................................................3
Identificazione della partizione/disco.............................................................................3
Partizioni.....................................................................................................................4
File system: creazione.................................................................................................6
File system: check.......................................................................................................6
Swap..........................................................................................................................7
Copia di un disco.........................................................................................................7
File system.....................................................................................................................10
Come cercare grandi file............................................................................................10
Link di /home/aspect verso /export/aspect..................................................................11
Rete Locale....................................................................................................................11
File di configurazione.................................................................................................11
Controllo stato interfacce LAN....................................................................................13
IPMP.........................................................................................................................13
Email.............................................................................................................................13
Generalità.................................................................................................................13
Problema..................................................................................................................13
Librerie..........................................................................................................................14
Librerie statiche.........................................................................................................14
Librerie dinamiche.....................................................................................................15
Appendice: esempi di script............................................................................................16
cpdsk: copia logica di disco........................................................................................16
Identificazione................................................................................................................18
Riferimenti:...............................................................................................................18
Glossario...................................................................................................................19
Introduzione
Qui di seguito presento una serie di appunti di lavoro fissati nel corso di varie attività
espletate su sistemi Unix.
Salvo dove diversamente indicato, il sistema di riferimento utilizzato è Solaris 9 montato su
sistemi SUN SPARC.
Questi appunti sono liberamente consultabili e riproducibili, ma vengono forniti dall'autore
senza alcuna garanzia di accuratezza e/o di completezza.
L'autore non assume nessuna responsabilità per eventuali danni direttamente o
indirettamente conseguenti all'uso di questi appunti.
pag. 1 di 18
Appunti Solaris - Unix
Notazioni
Dalla versione 1.4 di questo documento, due bordi ai lati di un paragrafo evidenziano
variazioni del testo, o inserimento di nuovo testo, rispetto la versione precedente. I bordi ai
lati di un titolo di un capitolo indicano che il capitolo in questione è nuovo, o ha subito una
completa nuova stesura.
Cosa è Solaris
Solaris è la pacchettizzazione di SunOS, con vari strumenti aggiuntivi e una interfaccia X11.
A sua volta, SunOS è l'implementazione Unix di Sun Microsystems.
Questi due ambienti hanno regole di denominazione della versione diverse. In particolare
Solaris (versione 1) è stato creato da Sun a partire da SunOS 4. La versione Solaris 2 usa
SunOS 5. Inoltre ora Sun fa riferimento a Solaris usando solo la minor version (ovvero
tralascia il 2 della major version) nominando Solaris 8 invece di 2.8, 9 invece di 2.9 etc.
Inizialmente SunOS era una versione di Unix BSD. Dalla versione 5.x in poi SunOS ha
accorpato anche le caratteristiche di Unix System V, divenendo un sistema
System V release 4 (SVR4).
Le precedenti informazioni sono tratte da rif. [5].
Logging
Le indicazioni di questo paragrafo sono riprese da rif. [10] , [11], [12] e [13]. Nel primo
riferimento è anche possibile leggere come configurare un sistema di log remotizzato.
I file di log vengono memorizzati in directory diverse al variare del tipo di Unix usato. Le
directory di solito sono:
●
/usr/adm
usato da versioni vecchie di unix
●
/var/adm
questa è usata dalle nuove versioni di Unix e Solaris
●
/var/log
usata da alcune versioni di Solaris, Linux, BSD e FreeBSD
I file d'interesse sono:
●
acct or pacct
registra i comandi eseguiti da ogni utente
●
lastlog
login utente
●
loginlog
tentativi non riusciti di login utente
●
messages
messaggi registrati su console e su syslogd
●
sulog
uso del comando su
●
utmp, utmpx
utenti loggati correntemente
●
wtmp, wtmpx
tempo di login, logout, shutdown, startup
●
vold.log
errori durante l'uso di media esterni (Floppy, CD)
●
xferlog
accesso ftp
syslogd è il demone che effettua il log dei messaggi. Si configura con il file
/etc/syslog.conf. Parte dal file di startup /etc/rc2.d . Di solito in Solaris i file di log
sono nella partizione /var .
La configurazione si effettua con:
facility.level logfile_o_sistema
Ad esempio:
pag. 2 di 18
Appunti Solaris - Unix
*.info /var/adm/messages
richiede di registrare in /var/adm/messages i messaggi di qualunque livello (info) da
parte di tutti (*).
Invece
*.info;mail.none /var/adm/messages
è come il precedente, ma in più ordina di ignorare (none) i messaggi di mail.
Per ampliare i file di log del login è necessario creare il file loginlog, ad esempio con:
touch var/adm/loginlog
chmod 600 /var/adm/loginlog
chgrp sys /var/adm/loginlog
Altri log files d'interesse:
●
/var/cron/log – log dei lavori (jobs) lanciati tramite crontab
●
/var/lp/logs/lpsched – log delle informazioni correlate ai servizi di stampa
Principali Shell
Le principali shell comandi sono:
●
Bourne shell, è il default; comando sh;
●
Bourne-Again shell, o bash, ha il command history, job control, ed altro; comando
bash;
●
C-Shell, ha il job control, notazione più simile al C-language, ed altro; comando csh;
●
Korn shell, come c-shell ma sintassi simile alla Bourne; comando ksh 1;
Per maggiori approfondimenti si veda rif.[6].
La variabile SHELL (si noti il maiuscolo) contiene il nome della shell di login. Ad esempio:
root@venus # echo $SHELL
root@venus # /sbin/sh
ci dice che il log ci ha avviato una Bourne shell.
Per scoprire con quale shell si sta lavorando, si può usare ps:
root@venus # ps | grep sh
602 pts/2
0:00 sh
625 pts/2
0:00 bash
in questo caso ci si è loggati con una Bourne, per poi attivare una bash. Alcune shell (Cshell
e TCSH) hanno la variabile shell (si noti il minuscolo) per indicare la shell corrente. In tal
caso si può usare semplicemente:
venus# echo $shell
/bin/csh
per identificare la shell corrente.
Gestione Disco
Identificazione della partizione/disco
I dischi sono identificati:
●
dal software di basso livello di gestione dell'hardware (il netbios nel caso di Personal
Computer, l'equivalente firmware di gestione delle macchine SPARC nel caso di
1 E' la shell utilizzata come default dall'utente Aspect nel prodotto CSS della omonima società.
pag. 3 di 18
Appunti Solaris - Unix
computer SUN ...);
●
dal sistema operativo vero e proprio.
Ad esempio, possiamo avere /eisa/eha@1000,0/cmdk@1,0:a come identificativo di una
partizione a livello di macchina, e /dev/rdsk/c1t0d0s0 come identificativo della stessa
partizione a livello di sistema operativo. In Solaris, per conoscere l'id di una partizione a
livello macchina (utile per avviare con quella partizione quando si accende il sistema) si usa il
comando ls -l sul nome partizione conosciuto dal sistema operativo:
# ls -l /dev/rdsk/c1t0d0s0
lrwxrwxrwx 1 root root 55 Mar 5 12:54 /dev/rdsk/c1t0d0s0
-> ../../devices/eisa/eha@1000,0/cmdk@1,0:a
quel che viene dopo la directory
/eisa/eha@1000,0/cmdk@1,0:a
/devices
è
quanto
serve
per
il
boot:
A noi interessa l'identificazione a livello di sistema operativo, si veda il successivo paragrafo.
Partizioni
Il disco è suddiviso in uno o più regioni. Ognuna di queste regioni è detta partizione o slice.
Ogni partizione contiene un file system, o comunque un gruppo di dati la cui disciplina di
accesso è omogenea. E' possibile avere file system di tipo diverso sullo stesso hard disk, ma
ognuno di essi dovrà avere il suo slice dedicato.
In particolare, per i dischi scsi, gli slice vengono nominati con la seguente nomenclatura:
cxtydwsz dove c indica controller, t terminal, d disk, s slice; mentre i numeri che seguono
(nello schema precedente i caratteri xyw e z in corsivo) sono gli identificativi relativi. Quindi
c1t1d0s0 indica controller 1, terminal 1, disk 0 e slice 0.
Importante: lo slice 2 identifica il disco nel suo complesso. Ad esempio c1t1d0s2 identifica
l'intero disco 0 (d0) collegato tramite controller 1 (c1), terminal 1 (t1).
La struttura raccomandata da SUN per i dischi Solaris è la seguente:
s0
s1
s5
s6
s7
/
swap
/var
/exp
(metadb per il Volume manager)
Altri autori (vedi rif. [2] ) raccomandano di usare slice separati, oltre che per / e /var, anche
per /usr, /tmp e /opt.
Il partizionamento complessivo di un disco si può osservare con il comando
prtvtoc raw-device
Ad esempio possiamo avere:
# prtvtoc /dev/rdsk/c1t0d0s2
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
pag. 4 di 18
/dev/rdsk/c1t0d0s2 partition map
Dimensions:
512 bytes/sector
424 sectors/track
24 tracks/cylinder
10176 sectors/cylinder
14089 cylinders
14087 accessible cylinders
Flags:
1: unmountable
10: read-only
Partition
0
1
Tag
2
3
Flags
00
01
First
Sector
Last
Sector
Count
Sector
8201856 81926976 90128831
0
8201856
8201855
Mount Directory
/
Appunti Solaris - Unix
2
5
6
7
5
7
0
0
00
00
00
00
0 143349312 143349311
90128832
5586624 95715455
95715456 47104704 142820159
142820160
529152 143349311
/var
/exp
/sds
Il partizionamento di un disco si ottiene usando il comando format. Questo comando è
potente e flessibile, perché usabile sia batch che interattivamente (vedi rif. [2] ). D'altro
canto l'uso di format è complesso perché permette di modificare le impostazioni per singola
partizione.
Il comando fmthard invece è più semplice, e permette la modifica al volo di tutte le
partizioni di un disco. Ad esempio:
fmthard -s /master/diskframe /dev/rdsk/c1t1d0s2
partiziona il disco c1t1d0s2 con il contenuto del file diskframe. Questo file deve essere
preventivamente preparato con una prtvtoc ridiretta sul file stesso, o composto
manualmente se hai tendenze masochiste. In quest'ultimo caso attenzione al fatto che gli
slice devono rispettare l'allineamento ai cilindri del disco.
Se poi il modello è il disco running, e la destinazione della formattazione è montato sul
sistema (ad esempio: c1t0d0s2 è il disco running la cui struttura vogliamo copiare; e il disco
destinazione, fisicamente uguale al precedente, è raggiungibile con il nome c1t1d0s2)
possiamo usare un comando come segue:
prtvtoc /dev/rdsk/c1t0d0s2 | fmthard -s - /dev/rdsk/c1t1d0s2
che scrive l'uscita del prtvtoc sullo stdin di fmthard. Elegante!
Una nota: a differenza di quel che accade nel mondo DOS/Windows, format non costruisce
le strutture dati del file system. A questo scopo si deve usare il comando newfs (vedi
l'apposito paragrafo a pag. 6)
Le partizioni di un disco divengono accessibili solo se vengono montate. Anche in questo
caso Unix è diverso da DOS/Windows, e non utilizza il concetto di drive. Quando si monta
una partizione, il suo contenuto viene visto come una estensione del file system corrente, e
non come l'inizio di un nuovo file system. Ad esempio. Usando Windows, se monto un disco
con due partizioni su un computer senza altri dischi, probabilmente vedrò i drive C: e D:
ognuno con il proprio file system. Usando Unix, nelle stesse condizioni, vedrò un unico file
system che comincia da root (/) e si estende inglobando i contenuti di entrambe le partizioni.
Il comando semplificato per montare uno slice è:
mount block-device mount-directory
Ad esempio:
mount /dev/dsk/c1t1d0s0 /mnt
permette di accedere ai contenuti della partizione s0 del disco c1t1td0 dalla directory
/mnt.
Per smontare una partizione si usa il comando
umount mount-directory
Riferendoci al precedente esempio, se eseguo:
umount /mnt
distacco i contenuti di c1t1td0s0 dal file system, e /mnt diviene nuovamente un direttorio
vuoto.
Quando Unix parte, controlla il contenuto del file /etc/vfstab per sapere quali slice deve
montare, e su quali directory. Se /etc/vfstab è corrotto, o malamente modificato, il
sistema può non essere in grado di montare lo slice di avvio. Il recovery di questa situazione
impone l'avvio con un sistema alternativo (CD-ROM o un altro disco) per poi montare
manualmente lo slice contenente il file /etc/vfstab guasto per effettuare la sua
riparazione con edit del file.
Per avere l'elenco dei device di disco si usa il comando
df [-k]
pag. 5 di 18
Appunti Solaris - Unix
Ad esempio possiamo avere:
root@venus # df
/
/proc
/etc/mnttab
/dev/fd
/var
/var/run
/tmp
/export
(/dev/md/dsk/d0
(/proc
(mnttab
(fd
(/dev/md/dsk/d5
(swap
(swap
(/dev/md/dsk/d6
):62931386
):
0
):
0
):
0
): 5029806
):11433488
):11433488
):45877226
blocks
blocks
blocks
blocks
blocks
blocks
blocks
blocks
4683548
29938
0
0
433244
197186
197186
2777802
files
files
files
files
files
files
files
files
L'opzione -k è utile per verificare la percentuale d'impegno degli slice:
root@venus # df -k
Filesystem
kbytes
used
avail capacity
/dev/md/dsk/d0
40344451 8878758 31062249
23%
/proc
0
0
0
0%
mnttab
0
0
0
0%
fd
0
0
0
0%
/dev/md/dsk/d5
2736975 222072 2460164
9%
swap
5716792
32 5716760
1%
swap
5716768
8 5716760
1%
/dev/md/dsk/d6
23196744 258131 22706646
2%
Mounted on
/
/proc
/etc/mnttab
/dev/fd
/var
/var/run
/tmp
/export
File system: creazione
Abbiamo visto che il termine formattazione nel mondo Solaris, a differenza di quanto accade
in DOS/Windows, non indica la creazione dei dati necessari alla gestione di un file system,
ma solo il partizionamento del disco. La creazione fisica del file system avviene con il
comando new file system:
newfs raw-device
ad esempio per creare uno Unix file system nello slice s0:
newfs /dev/rdsk/c1t1d0s0
Mentre, per creare lo swap file systems nello slice s1, precedentemente correttamente
formattato:
newfs /dev/rdsk/c1t1d0s1
Nota. Da questi esempi si deduce che il comando newfs rileva informazioni dalla tabella di
partizionamento per sapere che tipo di file system creare nello slice richiesto.
File system: check
Il file system si controlla con:
fsck raw-or-block-device
Dove raw-or-block-device indica lo slice da controllare. Ad esempio:
fsck /dev/dsk/c1t1d0sx
dove sx può essere s0 s5 s6 s7.
Attenzione:
●
usare dsk (block device) e non rdsk (raw device) se si vuole un controllo logico della
struttura del file system;
●
il file system controllato deve essere a riposo, quindi deve girare in single user mode
o su partizioni smontate;
●
ricordare che non si può smontare la partizione di root del disco di avvio della
macchina.
Se ne deduce che non si può fare un file system check dello slice di root di un disco che ha
avviato un sistema. Se si ha questa necessità, al limite si può provare ad andare in single
user mode (comando init -s) e poi bloccare il file system (comando lockfs -fa)
pag. 6 di 18
Appunti Solaris - Unix
prima di eseguire il fsck.
Swap
Per avere l'elenco e le dimensioni dei device e file che partecipano allo swap si usa il
comando:
swap -l
Mentre per ottenere l'impegno e la disponibilità dell'area di swap intesa come device+file
+ram si usa:
swap -s
Lo slice di swap è /dev/dsk/c1t0d0s1 e viene montato all'avvio se nella tabella /etc/vfstab è
presente una riga del tipo
/dev/dsk/c1t0d0s1 – - swap – yes
Come si crea il file system di swap? Basta chiamare il comando newfs su slice
adeguatamente marcato con il relativo partizionamento: vedi il relativo paragrafo.
Copia di un disco.
Concettualmente sono possibili almeno due modi per effettuare la copia di un disco:
●
la clonazione: consiste nel fare la copia settore per settore, utilizza il comando dd;
●
copia logica: si copiano i contenuti dei file system degli slice del disco, utilizza i
comandi ufsdump e ufrestore.
La clonazione copia anche i settori che non contengono informazioni vive. Per questo motivo
è potenzialmente temporalmente più lunga della copia logica. Inoltre i due dischi devono
essere almeno delle stesse dimensioni, eventualmente il disco di output puo’ essere piu’
grande. Il sistema deve essere in single user mode per fare l’operazione di copia. La
procedura da seguire è semplice.
La copia logica è di solito temporalmente più breve, in quanto vengono copiate le sole
informazioni vive2. I due dischi possono avere dimensioni diverse, incluso un disco di output
più piccolo del disco di input, purché di capacità sufficiente per contenere le informazioni
presenti nei file system da copiare. La procedura da seguire è più articolata di quella per la
clonazione.
Copia tramite clonazione.
Ipotizziamo di avere in c1t0d0 il disco di avvio da copiare, e in c1t1d0 il disco destinazione,
che sarà sovrascritto con i contenuti del disco da copiare.
Mettiamoci in condizione di operare in single user mode dopo avere effettuato un controllo
delle periferiche collegate. A questo scopo avviamo il sistema, attendiamo che sulla console
sia presente il cursore “X” ruotante, quindi eseguiamo STOP A per ottenere il comando della
routine di POST.
Al prompt {0} ok eseguiamo il comando boot –rs dove r indica rescan del bus SCSI e s
single user mode.
Il sistema si riavvierà, e, dopo l'inserimento della password di root, si porterà in single user
mode.
A questo punto possiamo copiare la struttura del disco e poi fare il comando dd:
$ prtvtoc /dev/rdsk/c1t0d0s2 | fmthard –s - /dev/rdsk/c1t1d0s2
$ dd if=/dev/rdsk/c1t0d0s2 of=/dev/rdsk/c1t1d0s2 bs=128k
$ fsck –Y /dev/rdsk/c1t1d0s0
2 Se in disco non è saturo le informazioni contenute nei file system lo occuperanno solo parzialmente.
pag. 7 di 18
Appunti Solaris - Unix
raccomando la pazienza: il comando dd impiega circa un'ora per copiare un disco scsi da 72
GB, ed oltre due ore per un disco scsi da 146 GB.
Copia logica
In questo caso si deve prevedere la copia di ogni singolo slice che compone il disco e in cui
siano presenti informazioni d'interesse.
Ipotizziamo di avere un disco con questa struttura:
Slice
s0
s1
s5
s6
s7
mount
/
swap
/var
/exp
/sds
size
77GB
contents_size
3GB
5.2GB
48GB
242MB
196MB
49MB
1MB
In questo contesto è opportuno ricorrere a una copia logica del disco, visto che il suo
contenuto reale è molto inferiore alla capacità del dispositivo. Gli slice da copiare saranno s0,
s5, s6. Non è necessario copiare s1: essendo uno swap verrà ricreato da zero. Nel seguito di
questi appunti ignoriamo anche s73.
La procedura di massima deve prevedere due fasi:
●
copiare il contenuto del disco da replicare (sorgente) su un disco di archivio;
●
copiare il contenuto dal disco di archivio al disco destinazione.
Per la prima fase (copia di un sorgente su un disco di archivio) si procede così:
1 avviare il sistema con un disco su cui verrà archiviato il contenuto del disco da
replicare;
2 inserire in c1t1d0 il disco da replicare (sorgente);
3 archiviare sul disco di avvio:
3.1 la partizione del disco sorgente;
3.2 i contenuti degli slice s0, s5, s6;
3.3 il settore di boot;
4 togliere da c1t1d0 il sorgente.
Per la seconda fase (copia dall'archivio al disco destinazione), avremo:
1 avviare il sistema con il disco contenente l'archivio;
2 inserire in c1t1d0 il disco destinazione;
3 usando l'archivio presente sul disco di avvio:
3.1 partizionare il disco destinazione;
3.2 per ogni slice s0, s5, s6: creare il file system e copiarvi il contenuto in archivio
dello slice corrispondente;
3.3 creare il settore di boot del disco destinazione;
4 togliere da c1t1d0 la destinazione.
Si usano questi comandi:
●
prtvtoc (vedi) per leggere e la struttura delle partizioni;
3 Lo slice s7 qui viene ignorato perché questo disco di esempio era destinato ad essere mirrorato con SVM.
E' usuale istruire SVM ad utilizzare lo slice s7 per i metadb con le informazioni di stato per il mirroring dei
dischi. Questi data base di stato sono scritti da SVM in modalità diretta sul disco, senza utilizzo di un file
system.
pag. 8 di 18
Appunti Solaris - Unix
●
ufsdump (unix file system dump) per archiviare in un file il contenuto di un intero
file system;
●
mount e copy del bootsector;
●
fmthard (vedi) per ricreare la struttura delle partizioni del disco;
●
newfs per creare (formattare) i vari file system vuoti necessari;
●
mount, ufrestore, umount
precedentemente archiviato.
per
popolare
il
file
system
con
il
contenuto
Qui di seguito il maggiore dettaglio.
Start con un disco Solaris libero su cui cumulare i contenuti in c1t0d0 (usando la
directory /master per archiviare i contenuti), e in c1t1d0 il disco da replicare.
Attenzione: gli esempi che seguono sono estratti da script. Quindi # indica commento e non
prompt di sistema, mente \ è il “a capo” del comando corrente.
Archiviazione dei contenuti del disco sorgente
# c1t1 non montato perché la copia richiede filesystem a riposo
prtvtoc /dev/rdsk/c1t1d0s2 >/master/diskframe # copia tabella delle\
partizioni in un file
ufsdump 0f /master/imgs0 /dev/rdsk/c1t1d0s0
# copia il contenuto della\
partizione in un file
ufsdump 0f /master/imgs5 /dev/rdsk/c1t1d0s5
ufsdump 0f /master/imgs6 /dev/rdsk/c1t1d0s6
ufsdump 0f /master/imgs7 /dev/rdsk/c1t1d0s7
# c1t1 montato perché devo copiare il suo bootblock (file .../bootblk)
mount /dev/dsk/c1t1d0s0 /mnt
cp /a/usr/platform/SUNW,Netra-240/lib/fs/bootblk /master/bootblk
umount /mnt
Per la duplicazione. (Opzionale:) Spegnere. Sostituire il disco da copiare in c1t1 con il disco
destinazione. (Se si è spento:) Riavviare. Quindi:
fmthard -s /master/diskframe /dev/rdsk/c1t1d0s2 # applica la tabella\
delle partizioni al\
nuovo HDU
newfs /dev/rdsk/c1t1d0s0
# crea (format) il\
filesystem
newfs /dev/rdsk/c1t1d0s1
newfs /dev/rdsk/c1t1d0s5
newfs /dev/rdsk/c1t1d0s6
newfs /dev/rdsk/c1t1d0s7
mount /dev/dsk/c1t1d0s0 /mnt
cd /mnt
ufrestore xf /master/imgs0
cd /
umount /mnt
mount /dev/dsk/c1t1d0s5 /mnt
cd /mnt
ufrestore xf /master/imgs5
cd /
umount /mnt
mount /dev/dsk/c1t1d0s6 /mnt
cd /mnt
ufrestore xf /master/imgs6
cd /
umount /mnt
installboot /master/bootblk /dev/rdsk/c1t1d0s0
(Opzionale:) Spegnere. Sfilare il disco duplicato.
I passi predetti sono stati implementati nello shell script cpdsk, riportato per esteso in
appendice a pag. 15 cui si rimanda per il dettaglio.
Il comando per l'uso dello script è:
pag. 9 di 18
Appunti Solaris - Unix
cpdsk {-i|-o} directory block_disk_device
Quindi:
1. inserire il disco da copiare (sorgente) in c1t1d0 (2° disco);
2.
creare sul disco c1t0d0 (lavoro) una directory di appoggio su cui copiare i contenuti
del disco sorgente, ad esempio /master;
3.
eseguire cpdsk -i /master c1t1d0. A comando completato sostituire il
sorgente con il disco destinazione;
4. eseguire cpdsk -o /master c1t1d0;
5. a comando completato estrarre il disco destinazione per utilizzarlo.
Dopo avere eseguito i precedenti punti 1. 2.e 3. è possibile eseguire i punti 4.e 5. a
ripetizione per creare più dischi uguali.
Attenzione. Per comodità il comando cpdsk formatta il disco destinazione con la stessa
struttura di slice letta dal disco sorgente. Se si hanno esigenze diverse, ad es. se il disco
destinazione ha dimensioni fisiche diverse, o se si vuole cambiare l'impegno disco dei diversi
slice, è necessario commentare la riga con il comando fmthard.
Inoltre questa procedura non è valida se si gestisce un disco su cui sia stato acceso il disk
mirroring, con particolare riferimento ai contenuti dello slice di root, che sono modificati per
avviare il software di disk mirroring. Inoltre anche la tabella /etc/vfstab viene alterata
per indicare le partizioni in mirror e non più quelle singole usabili con avvio del disco isolato.
Di conseguenza, per copiare tutto il contenuto di un disco mirrorato, è necessario fermare il
mirror su tutti gli slice, soprattutto lo slice di root s0, e poi effettuare la copia. In seguito
bisognerà eseguire nuovamente la procedura per attivare il mirror sul disco.
File system
Come cercare grandi file
Per cercare grandi file usare il comando:
find /dadove -size +nnnn
che rende in uscita i nomi dei file di dimensioni superiori a nnnn blocchi (512 byte/ blocco).
Con il seguente si ottiene il list dei file in questione:
find /dadove -size +nnnn | xargs ls -l
Link di /home/aspect verso /export/aspect
Per avere il link di /home/aspect verso il sorgente /export/aspect. Procedere come segue.
Nel file /etc/auto_home aggiungere in fondo la riga:
aspect nomemacchina:/export/aspect
Nel file /etc/auto_master modificare la riga relativa a /home togliendo il parametro
-nobrowse; la riga diviene:
/home auto_home
Riavviare.
Per i dettagli: man automount
pag. 10 di 18
Appunti Solaris - Unix
Rete Locale
Per una descrizione con maggiore dettaglio di quanto esposto qui di seguito si consulti rif.[7]
e il cap.10 di rif.[8].
File di configurazione
I file di configurazione della rete dati sono:
●
/etc/hostname.interface
●
/etc/nodename
●
/etc/defaultdomain
●
/etc/defaultrouter
4
l'ultimo è opzionale.
I principali file per il database di network sono:
●
/etc/inet/hosts
●
/etc/inet/netmasks
Si noti che i file per il database di network sono nella directory /etc/inet, e non in /etc.
Questa è una variazione introdotta con Solaris 9. Le versioni precedenti usavano /etc. Dalla
versione 9 il file /etc/hosts (e gli altri file analoghi) sono link simbolici ai file qui nominati.
/etc/hostname.bge0 contiene il nome macchina o l'indirizzo ip assegnato alla scheda:
root@venus # cat hostname.bge0
192.168.1.10 netmask + broadcast + up
/etc/hostname6.intefaccia è utilizzata per Ipv6, con lo stesso scopo del precedente.
/etc/nodename contiene il nome macchina:
root@venus # cat nodename
venus
/etc/defaultdomain è il nome completo del dominio di appartenenza. Ad esempio:
deserts.worldwide.com
/etc/defaultrouter una riga per ogni router direttamente connesso alla rete. La riga contiene
il nome dell'interfaccia che funziona come router tra networks:
root@venus # cat defaultrouter
128.1.1.1
255.255.0.0
Database hosts. Contiene gli indirizzi e i nomi host delle macchine sulla propria rete. Se si
usano i servizi di nome (NIS, NIS+, DNS, a volte LDAP) questi sono gestiti nella host table.
Se la macchina è configurata per avere i servizi dei nomi su file locali, gli indirizzi sono
in /etc/inet/hosts Ad esempio:
root@venus # cat hosts
#
# Internet host table
#
127.0.0.1
localhost
128.1.1.16
venus
loghost
192.168.1.115
css71tsp
192.168.1.10
css71a
Database netmasks. Usato in caso di subnetting. E' una lista di reti e le relative subnet
masks. E' in /etc/inet/netmasks. Esempio:
root@venus # cat netmasks
#
4 Ad esempio hostname.bge0
pag. 11 di 18
Appunti Solaris - Unix
# The netmasks file associates Internet Protocol (IP) address
# masks with IP network numbers.
#
#
network-number netmask
#
# The term network-number refers to a number obtained from the
Internet Network
# Information Center.
#
# Both the network-number and the netmasks are specified in
# "decimal dot" notation, e.g:
#
#
128.32.0.0 255.255.255.0
#
#128.1.0.0
255.255.0.0
#10.10.0.0
255.255.0.0
128.1.1.0
255.255.255.0
192.168.1.0
255.255.255.0
L'elenco completo dei file di database di rete è:
●
hosts
●
ipnodes
●
netmasks
●
ethers
●
bootparams
●
protocols
●
services
●
networks
Inoltre il file nsswitch.conf specifica quale servizio di nomi usa la macchina: local files, NIS,
NIS+, DNS, o LDAP. In rif.[7], pag.97, i relativi dettagli.
Per configurare un host con servizio dei nomi local files, si procede come segue:
●
da superuser in /etc;
●
creare i file /etc/hostname.interfaccia , uno per ogni interfaccia di rete,
dove interfaccia è il relativo nome dell'interfaccia, ad esempio bg0, bge1, ... e
inserirci il relativo indirizzo IP, o il nome host;
●
nel file /etc/inetd/hosts effettuare il mapping tra gli IP e i relativi nomi host;5
●
nel file /etc/defaultrouter inserire il/gli IP del/dei router direttamente
connessi alla rete;
●
nel file /etc/inet/hosts effettuare il mapping tra IP e i relativi nomi host
del/dei router;
●
se la rete è una subnet, modificare di conseguenza il file /etc/inet/netmasks;
●
riavviare
5 Attenzione: l'inserimento di nomi e IP non controllati direttamente (ovvero altre macchine di rete
amministrate da altri) può dare luogo a problemi di gestione. Se un altro amministratore modifica il
relativo IP a ns insaputa, il tutto non funziona più. In tal caso meglio ricorrere al DNS. Per fare questo si
deve configurare /etc/nsswitch.conf e /etc/resolv.conf.
pag. 12 di 18
Appunti Solaris - Unix
Controllo stato interfacce LAN
Per controllare le statistiche dei pacchetti sulle interfacce di LAN, usare il comando
netstat -in
Sulle Netra le interfacce fisiche di rete sono bge0, bge1, bge2, bge3
IPMP
Solaris 10 permette IPMP sul solo link fisico, evitando il ping. Ipotizzato il sistema con le
interfacce di LAN qfe0 e qfe4 si può configurare come segue:
nel file /etc/hostname.qfe0:
hostname group groupname up
e nel file /etc/hostname.qfe4:
group groupname up
Con Solaris 9 ho provato e non funziona. Nota: usare il link fisico non permette di
individuare certi tipi di guasto, ad esempio oltre lo switch di attestazione del SUN.
Per sapere come si comporta IPMP non ho trovato di meglio del fare il trace dei pacchetti
icmp. Dare il comando
snoop -d interfaccia_da_osservare icmp
Email
Generalità
Esistono MUA, MTA, MDA: Mail User Agent, Transfer Agent, Delivery Agent. I MUA ricevono
comandi dall'utente per comporre e inviare la posta. Gli MTA trasferiscono la posta tra nodi
diversi. Gli MDA consegnano la posta ad un utente, che la legge con un MUA.
Un esempio di MUA è il programma mail per inviare posta da linea di comando.
sendmail è un MTA, usato sia in Unixware che in Solaris. sendmail riceve ordini da un
MUA per inviare posta (ad esempio: mail), e interfaccia gli MDA ed altri MTA remoti per
recapitare la posta. In Unixware l'agente di delivery locale è il programma slocal. In
Solaris lo MDA locale è mail.local.
La posta locale viene messa in file con lo stesso nome della login utente. Ad
esempio /var/mail/defalco contiene la posta per l'utente defalco. Questi file sono ascii, e
quindi leggibili con un qualunque file editor.
Problema
E' accaduto (in Unixware) che la mancanza del file /var/mail/aspect (e
l'associato /var/mail/.aspect.index) impedissero il delivery della posta, generando messaggi
di errore che hanno saturato il disco del sistema (file /var/adm/log/osmlog in Unixware).
Librerie
Una libreria è una collezione di moduli software che mettono a disposizione di programmi dei
“servizi”, senza che il fruitore del servizio stesso si preoccupi di come è stato implementato.
Il concetto di libreria persegue diversi scopi:
1. sviluppare una sola volta un determinato servizio, e metterlo a disposizione di
chiunque ne abbia bisogno;
pag. 13 di 18
Appunti Solaris - Unix
2. limitare la quantità di memoria RAM impegnata nel sistema quando più processi
richiedono lo stesso servizio, perché una determinata libreria viene caricata in
memoria una sola volta, indipendentemente da quanti programmi la stanno usando
contemporaneamente;
3. limitare la quantità di memoria disco impegnata nel sistema, perché è possibile
sviluppare librerie presenti sul disco in unica istanza, anche se impiegate da più
programmi.
Scritto il codice di un programma, il programmatore suole passare tramite due fasi per
ottenere un eseguibile: compilazione e linking.
La prima fase produce un particolare formato intermedio, detto codice oggetto. In Unix, per
convenzione e non obbligatoriamente, i file con codice oggetto sono identificati con nomi
terminanti per .o .
La seconda fase provvede a inglobare nel codice oggetto, gli eventuali servizi esterni
richieste a librerie.
Il risultato finale di queste due fasi è un eseguibile, ovvero una serie di comandi che il loader
del sistema operativo può caricare in RAM, per poi avviarli nella CPU. La CPU sarà in grado di
eseguire direttamente questi comandi.
Una libreria può essere di due diversi tipi:
●
statica,
●
dinamica (la terminologia inglese in Unix è: shared, ovvero condivisa).
Una libreria è statica se durante la fase di linking il suo codice entra stabilmente a far parte
del file eseguibile. Una libreria statica risolve il precedente punto 1, non i punti 2 e 3.
Una libreria è dinamica se durante la fase di linking il suo codice non viene incorporato nel
file eseguibile, ma vi vengono messi solo degli opportuni puntamenti. In questo caso,
quando si richiede l'esecuzione dell'eseguibile, sarà compito del loader del sistema operativo
verificare quali librerie dinamiche occorrono, e, se non sono già in RAM, caricarvele
opportunamente. Una libreria dinamica risove tutti e tre i punti prima citati, ma introduce
una maggiore complessità di gestione.
Librerie statiche.
Per creare una libreria statica si producono in codice oggetto i moduli che la formeranno.
Dopo di che si usa il programma ar (archive) dandogli il nome delle libreria da creare e
l'elenco dei moduli oggetto che deve inglobare. Ad esempio:
ar rc mylib.a mod_1.o mod_2.o mod_3.o
crea la libreria mylib.a a partire dai moduli mod_1.0 , mod_2.o e mod_3.o .
Il programma ar viene utilizzato anche per la manutenzione della libreria, sostituendo e/o
aggiungendo moduli.
Una libreria statica può essere indicizzata, utilizzando un apposito programma: ranlib . Ad
esempio:
ranlib mylib.a
indicizza la libreria statica mylib.a .L'indicizzazione è utile per abbreviare il tempo
necessario al linking di programmi di grandi dimensioni.
L'uso di una libreria statica si limita ad una corretta fase di linking. Un programma costruito
con libreria statica ha inglobato tutto il codice che serve. Di conseguenza è del tutto
autonomo in fase di esecuzione. Un esempio di link è il seguente:
cc p.o -L./mylibs -lmylib -o p
pag. 14 di 18
Appunti Solaris - Unix
dove il compilatore c (comando cc) effettua il link del codice oggetto p.o con la libreria
statica mylib.a (opzione -l) da cercare nella directory ./mylibs (opzione -L) producendo
il programma eseguibile p (opzione -o).
Librerie dinamiche
La creazione di una libreria dinamica richiede che il codice oggetto dei moduli che la
formeranno venga preparato in un particolare formato rilocabile. Per fare ciò si usa una
opportuna opzione di compilazione -pic (acronimo di position indipendent code) o similari
(dipende dal compilatore). Ad esempio:
cc -c -fpic mod_1.c
produce in formato rilocabile il codice oggetto mod_1.o .
Dopo di che, sempre tramite compilatore, si crea la libreria dinamica, usando una opportuna
opzione (quale sia questa opzione dipende dal compilatore, ad esempio può essere -G). Ad
esempio:
cc -G mydlib.so mod_1.o mod_2.o mod_3.o
crea la libreria dinamica mydlib.so a partire dai moduli mod_1.o , mod_2.so e
mod_3.so . Si noti il suffisso .so che in Unix per convenzione individua le librerie
dinamiche.
L'uso di una libreria dinamica non richiede lo stesso tipo di compilazione di una libreria
statica:
cc p.o -L./mylibs -lmydlib -o p
che è del tutto analogo all'esempio precedente.
Però ora per eseguire il programma p , bisogna caricare sul sistema anche la libreria
mydlib.so . Dove posizionare questo file dipende dal path di ricerca del sistema operativo
per le librerie dinamiche. Per sicurezza è il caso di controllare il settaggio della variabile
d'ambiente LD_LIBRARY_PATH . Se esiste si può mettere la libreria in una delle directory in
essa presenti. Se non esiste si può creare inserendovi una directory in cui mettere le librerie
dinamiche d'utente.
In ogni caso è possibile controllare se le librerie dinamiche necessarie ad un programma
sono raggiungibili dal sistema usando il comando ldd . Ad esempio:
ldd p
darà l'elenco delle librerie dinamiche necessarie, e i relativi path in cui sono presenti nel
disco. Se il path non è presente, la libreria non è raggiungibile.
Per maggiori dettagli riguardo le librerie si consulti rif.[9] a pag.18.
Appendice: esempi di script
cpdsk: copia logica di disco
#!/bin/bash
# copy a disk
# usage: cpdsk {-i|-o} directory device
# by ldfa at citec spa
# ver 1.0 13.02.07
# ver 1.1 04.04.07 example correction
#
input: mount -r to get bootsector from mirrored disk
#
PRG_VER="1.1"
PRG_DATE="04-Apr-2007"
#The guardian
# we must to check at least the presence of 3 parameters
if [ -z $1 ]
# no parameters
pag. 15 di 18
Appunti Solaris - Unix
then
echo
echo
echo
echo
"usage: cpdsk {-i|-o} directory disk_device"
"copy a disk"
" -i copy disk contents from device to directory"
" -o copy disk contents from directory to device"
echo "example:"
echo " cpdsk -i /master c1t1d0"
echo "WARNING: DO NOT write slice in disk_device"
echo "
AND write disk_device without /dev/rdsk \
(see the previous example)"
echo "Disclaimer: the use of this program is free, but \
you use it at your own"
echo " risk. Author does not make warranties, express \
or implied, nor he assumes"
echo " any legal liability or responsibility for the use\
of this program."
echo "Current version is $PRG_VER of $PRG_DATE"
exit 1
fi
if [ -z $2 ]
# no 2nd parameter
then
echo "error: no directory"
echo "type cpdsk without parameters if you need help"
exit 1
fi
if [ -z $3 ]
# no 3rd parameter
then
echo "error: no device"
echo "type cpdsk without parameters if you need help"
exit 1
fi
# TO ADD -i -o check
#The code
RDEV=/dev/rdsk/
BDEV=/dev/dsk/
if [ $1 == "-i" ]
then
# input of the source disk
echo "input of source disk $RDEV$3 to directory $2"
cd $2
# do not mount disk_device: ufsdump requests static file system
prtvtoc $RDEV$3s2 > diskframe
# getting source disk partition table
# echo "dumping $RDEV$3s0 in
ufsdump 0f imgs0 $RDEV$3s0
# echo "dumping $RDEV$3s5 in
ufsdump 0f imgs5 $RDEV$3s5
# echo "dumping $RDEV$3s6 in
ufsdump 0f imgs6 $RDEV$3s6
# echo "dumping $RDEV$3s7 in
# ufsdump 0f imgs7 $RDEV$3s7
$2/img0"
# copying slice content in one file
$2/img5"
$2/img6"
$2/img7"
# do not dump because to use only\
as metadb replica(s) location
# mount disk_device: must get bootblock (file .../bootblk)
mount -r $BDEV$3s0 /mnt
# added -r: do not disturb a\
root slice of a mirrored disk
cp "/mnt/usr/platform/SUNW,Netra-240/lib/fs/ufs/bootblk" bootblk #WARN:\
netra 240 specific case, use \
`uname -i` to check your system\
identification
umount /mnt
fi
if [ $1 == "-o" ]
then
echo "output of directory $2 to device $RDSK$3"
cd $2
pag. 16 di 18
Appunti Solaris - Unix
fmthard -s diskframe $RDEV$3s2 # partitioning destination disk
newfs $RDEV$3s0
fsck $RDEV$3s0
newfs $RDEV$3s1
fsck $RDEV$3s1
newfs $RDEV$3s5
fsck $RDEV$3s5
newfs $RDEV$3s6
fsck $RDEV$3s6
# formatting destination file systems
mount $BDEV$3s0 /mnt
cd /mnt
ufsrestore rf $2/imgs0
rm restoresymtable
cd /
umount /mnt
mount $BDEV$3s5 /mnt
cd /mnt
ufsrestore rf $2/imgs5
rm restoresymtable
cd /
umount /mnt
mount $BDEV$3s6 /mnt
cd /mnt
ufsrestore rf $2/imgs6
rm restoresymtable
cd /
umount /mnt
# copying contents to slices
cd $2
installboot bootblk /dev/rdsk/c1t1d0s0 # putting bootblock in place
fi
exit 0
Identificazione
Documento:
Progetto/Titolo...............Appunti Solaris - Unix / Appunti Solaris - Unix
Versione ........................1.4
Del.................................28.11.2007
Stato..............................
Diffusione.......................
Filename........................appunti-solaris-1.4_.odt
Storia:
Versione Del
Lavorazione
1.0................................prima stesura
1.1................................inserimento del capitolo relativo alla email
1.2............30.03.2007...migliorata la descrizione delle copie di dischi
1.3............17.04.2007...inserito il capitolo “identificazione e storia”
migliorata la sezione gestione disco
1.4............28.11.2007...Inserito il capitolo “Cosa è Solaris”
Inserito il capitolo “Principali shell”
cambiata la formattazione del documento
Inserito il capitolo “Librerie”
Inserito il capitolo “Logging”
pag. 17 di 18
Appunti Solaris - Unix
Riferimenti:
Rif.
[1]...............E.V. Meersch, K.Hens- Configuring Boot Disks With Solaris™ Volume Manager
Software - Sun BluePrints OnLine - October 2002
[2]...............Greg (shoe) Schuweiler - The "format" Utility in the Solaris Operating System November 2004
[3]...............Sun Microsystems, Inc. - Solaris Volume Manager Administration Guide – May
2002
[4]...............Scott Cromar - Solaris SPARC boot sequence - Princeton University – 2006
[5]...............indiana university, university information technology services, knowledge base
- http://kb.iu.edu/data/agjq.html
[6]...............From Wikipedia, the free encyclopedia: Bourne shell http://en.wikipedia.org/wiki/Bourne_shell
[7]...............SUN Microsystems, Inc. - System Administration Guide: IP Services – May
2002
[8]...............Janice Winsor – Solaris, operating environment system administrator's guide –
Sun Micorsistems Press, A Prentice Hall Title -4th ed.
[9]...............guy keren - Building And Using Static And Shared "C" Libraries http://users.actcom.co.il/~choo/lupg/tutorials/libraries/unix-c-libraries.html
[10].............Caltech, Information Technology Services - Unix Security Overview: Solaris:
Logging http://www.its.caltech.edu/its/security/sysadmins/seminars/solaris/logging.html
[11].............Kristopher March - System Log Rotation Utilizing logadm (for Solaris 9 OS
Only) - http://www.sun.com/bigadmin/content/submitted/solaris_logadm.html
[12].............Boran consulting - IT Security Cookbook, Securing UNIX #1/2 http://www.boran.com/security/unix1.html#Heading107
[13].............By Simson Garfinkel & Gene Spafford - Practical unix & internet security ISBN 1-56592-148-8 http://www.unix.org.ua/orelly/networking/puis/ch10_01.htm
Glossario
Acronimo Significato
ALOM...........Advanced Lights Out Manager, controllore di sistema che permette di gestire
da remoto il server SUN Netra 240
POST............Power On Self Test, il programma che controlla l'integrità del sistema all'avvio,
e prosegue con le routine di avvio propriamente dette. Nel rif. [4] vi è una
descrizione delle fasi di avvio di un sistema SPARC.
VMS.............Volume Manager Software, sinonimo di SVM (vedi)
SVM.............Solaris Volume Manager, Evoluzione di Solstice, software di disk mirroring
adottato da SUN per Solaris. Si veda Rif. [1]
pag. 18 di 18