LEZIONE del 11 Ottobre

Dopo aver completato l'installazione del sistema è possibile passare al suo utilizzo. Come si è detto più volte, tutte le distribuzioni Linux sono in grado convivere con la preesistente installazione del sistema Windows e ciò viene ottenuto grazie all'impiego di uno specifico loader, capace di realizzare la cosiddetta funzionalità di multibooting.

Le distribuzioni Linux, analogamente a qualunque sistema UNIX, permettono un controllo fine di tutte le fasi del boot, come appare schematizzato di seguito. Inoltre, è possibile specificare in modo dettagliato tutte le risorse (dischi, bus USB, stampanti, schede di rete, altre periferiche) cui il sistema può accedere, per mezzo di un meccanismo generalizzato di mounting.

Infine, sia l'utente finale che l'amministratore di sistema possono disporre di una potente interfaccia testuale attraverso la quale si possono definire azioni arbitrariamente complesse da sottomettere al sistema. A partire dalla lezione odierna, vedremo di tracciare le caratteristiche essenziale della cosiddetta bash shell.

SEQUENZA DI BOOT

Benchè la sequenza di boot possa variare nei dettagli per ciascuna distribuzione, essa può essere divisa approssimativamente nei seguenti passi.

  1. Hardware Boot

    Dopo l'accensione o un reset hardware il controllo viene passato ad un programma immagazzinato nella memoria ROM (tipicamente una PROM). Nel PC tale programma viene solitamente chiamato BIOS.

    La sua esecuzione produce un self-test di base della macchina e finisce per accedere ad una memoria non volatile al fine di acquisire il valore di ulteriori parametri. Nel PC questa memoria si presenta come una memoria CMOS il cui stato è mantenuto da apposita batteria. Per questo motivo molti utilizzatori dei PC la identificano semplicemente col termine CMOS benchè, al di fuori del mondo dei PC, venga normalmente chiamata nvram col significato di non-volatile ram.

    I parametri immagazzinati nella nvram variano da sistema a sistema; tuttavia, la minimua informazione presente deve consentire al programma di boot hardware di sapere qual'è il dispositivo di boot o, almeno, di avere la lista dei possibili dispositivi di boot sui cui fare il probing.

    Pertanto lo stadio di boot hardware accede al dispositivo di boot, carica l'OS Loader, che è posizionato in una locazione fissa del dispositivo di boot, e trasferisce il controllo ad esso.


  2. OS Loader

    Nel PC, l'OS Loader si trova nel primo settore del dispositivo di boot e prende il nome di MBR (Master Boot Record). Nella maggior parte dei sistemi, il caricatore iniziale ha funzionalità molto limitate e ciò è dovuto a diversi vincoli architetturali. Anche nei sistemi diversi dai PC esistono alcune limitazioni sulla dimensione e la complessità del caricatore, ma la limitazione di dimensione del MBR nei PC (512 byte, compresa la tabella delle partizioni) rende quasi impossibile realizzare un OS Loader ricco di funzionalità e che, nel contempo, alloggi in uno spazio così limitato. Per questo motivo, la maggior parte dei sistemi fanno si che il caricatore primario chiami un secondo caricatore (OS Loader secondario) che può essere localizzato ovunque, purchè sia una partizione del disco ben specificata.

    Per quanto riguarda i sistemi Linux, l'OS Loader può essere indifferentemente lilo oppure grub . Entrambi possono installare sia un caricatore secondario (laddove è installato DOS, MBR punta ad esso) sia un caricatore in due parti e dar luogo ad un MBR speciale, contenente il codice di bootstrap per caricare la seconda parte del caricatore dalla partizione di root.

    Il compito principale dell'OS Loader è quello di localizzare il kernel sul disco, caricarlo ed eseguirlo. La maggior parte di questi caricatori sono realizzati per essere utilizzati interattivamente, abilitando la possibilità di caricare kernel alternativi (ad esempio, permettendo il backup di kernel precedenti nel caso di test di un nuovo kernel compilato, ma che non funziona) passando parametri opzionali al kernel in via di esecuzione.


  3. Kernel Startup

    Una volta caricato il kernel inizializza i dispositivi hardware, utilizzando driver specifici per ciascuno di essi, per poi attivare lo swapper, che è uno dei processi del kernel e che, nelle moderne distribuzioni di Linux, è noto come kswapd; infine, viene montato il root file system (/). Parte dei parametri passati al kernel sono legati a queste attivatà ad esempio, possono sovrascrivere il root file system di default. Ulteriori informazioni sui parametri del kernel di Linux sono specificati nel comando bootparam.

    Soltanto allora il kernel crea il primo processo, al quale viene dato il numero di identificazione 1. Questo processo esegue il programma /sbin/init, ricevendo tutti i parametri che non sono già stati gestiti dal kernel.


  4. Init e Inittab

    Nel momento che init va in esecuzione comincia la lettura della tabella memorizzata in /etc/inittab per ulteriori istruzioni il cui scopo è quello di definire ciò che deve essere eseguito nei diversi run-level. In questo modo l'amministratore di sistema ha a disposizione un semplice schema di gestione che, per ciascun run-level vede associato un insieme di servizi (ad esempio, S sta per single-user mentre con 2 vanno in esecuzione la maggior parte dei servizi di rete).

    L'amministratore può cambiare il run-level corrente per mezzo del comando init e interrogare il sistema sul run-level corrente per mezzo del comando runlevel. Tuttavia, siccome non è conveniente manipolare i servizi individualmente, modificando questo file, inittab determina il bootstratp di un insieme di script responsabili dell'attivazione (start) e dell'arresto (stop) dei singoli servizi.


  5. Boot Scripts

    La descrizione che segue si applica ai sistemi basati su SYSV-R4 che, attualmente, si riferisce alla maggior parte dei sistemi Unix commerciali (Solaris, HPUX, Irix, Tru64) oltre che alla maggior parte delle distribuzioni Linux (RedHat, Fedora, Debian, Mandrake, Suse, Caldera). Alcuni sistemi (Slackware Linux, FreeBSD, OpenBSD) utilizzano uno schema leggermente diverso di script di boot.

    Per ogni servizio (mail, nfs server, cron, etc.) c'è un singolo script di startup che si trova in una directory ben specificata (nella maggior parte delle distribuzioni Linux si tratta di /etc/init.d). Ciascuno di questi script accetta come singolo argomento la parola start, con l'effetto di determinare l'attivazione del servizio, oppure la parola stop, provocando l'arresto del servizio stesso. Tali script possono accettare altri parametri opzionali di convenienza come restart, per fermare e riattivare il servizio, oppure status per dare informazioni sullo stato del servizio. L'esecuzione dello script senza parametri produce, normalmente, la lista di tutti i possibili argomenti.

A parte le primissime azioni eseguite durante il boot hardware, ognuna delle fasi di boot può essere configurata a piacimento per mezzo di opportuni file di testo che sono consultati dalle routine coinvolte nel boot stesso. Se si esclude grub.conf, contenuto in /etc/grub, tutti gli altri file responsabili del controllo del boot si trovano in /etc.

ATTIVAZIONE DEI SERVIZI

La fase terminale del boot riguarda l'attivazione di tutti i servizi che il sistema mette a disposizione dell'utente per il pieno e corretto utilizzo delle risorse hardware dell'elaboratore.
syslog: syslogd startup succeeded
syslog: klogd startup succeeded
portmap: portmap startup succeeded
nfslock: rpc.statd startup succeeded
keytable: Loading keymap
rc: Starting keytable:  succeeded
random: Initializing random number generator:  succeeded
pcmcia: Starting PCMCIA services:
pcmcia:  cardmgr.
rc: Starting pcmcia:  succeeded
sysctl: kernel.core_uses_pid = 1
network: Setting network parameters:  succeeded
netfs: Mounting other filesystems:  succeeded
network: Bringing up loopback interface:  succeeded
autofs: automount startup succeeded
sshd:  succeeded
xinetd: xinetd startup succeeded
vsftpd: true startup succeeded
sendmail: sendmail startup succeeded
sendmail: sm-client startup succeeded
gpm: gpm startup succeeded
httpd: httpd startup succeeded
crond: crond startup succeeded
cups: cupsd startup succeeded
xfs: xfs startup succeeded
anacron: anacron startup succeeded
atd: atd startup succeeded

Lancio dei servizi richiesti

I servizi attivati sono di vario genere e riguardano diversi aspetti del funzionamento del sistema.

La lista precedente non è da intendersi esaustiva perchè non contiene la maggior parte dei servizi di rete come il web server httpd, il server vsftpd per il trasferimento di file, il server DNS che implementa la traduzione dei domini nei corrispondenti numeri di rete, il server dhcpd per l'assegnazione dinamica dei parametri di rete agli host che lo richiedono, ecc...

ACCESSO AD UN SISTEMA UNIX

Ritornando all'utilizzo di un sistema Unix, questo può avvenire in molti modi diversi. Uno di essi è quello visto nelle lezioni precedenti quando si è discusso come installare una distribuzione Linux su un PC nel quale è già presente un sistema "Windows". In questo caso per utilizzare il sistema Unix è sufficiente selezionare il boot di tale sistema fra quelli consentiti dal multibooter.

Una soluzione alternativa e, altrettanto efficace, è di attivare tale sistema da un CD nella cosiddetta forma live CD. Non è necessaria alcuna installazione ma, ovviamente, poichè tutti gli accessi avvengono su CD e non su disco fisso, le risposte del sistema appariranno senz'altro più lente. Si consiglia, pertanto, di installare la distribuzione quanto prima. Di versioni di questo tipo ne esistono parecchie, ad esempio, Knoppix e SUSE LINUX Live-CD, e sono tutte scaricabili tramite connessioni FTP. Va tenuto conto che, vista la loro dimensione (700 Mb circa), è necessario disporre di una connessione veloce alla rete (per esempio, ADSL) e, tuttavia, richiede almeno un tempo di connessione di 2 ore.

Naturalmente è anche possibile utilizzare un sistema Unix remoto per mezzo di una connessione con terminale virtuale (tipicamente, X Terminal) attraverso il protocollo TELNET. Il client locale negozierà una connessione sulla porta 25 in modalità testuale sul protocollo sottostante TCP/IP, il noto protocollo che identifica la rete internet. Tale connessione può realizzarsi esplicitamente eseguendo il comando telnet sul proprio PC collegato alla rete, oppure implicitamente, per mezzo del browser se opportunamente configurato.

In questo caso, è sufficiente impostare esplitamente nella barra degli indirizzi del proprio browser l'URL col protocollo telnet esplicitamente definito. Ad esempio, impostando l'URL

telnet://host.domain/

verrà aperta, da parte del browser, una finestra nel quale comparirà il banner di login della macchina host.domain, che richiederà l'introduzione di uno username e di una password. Disponendo di una autorizzazione d'accesso su tale macchina è possibile lavorare con un sistema Unix in modalità remota.

PRIMI RUDIMENTI DI SHELL BASH

Quando si introducono lo "username" e la "password" con cui si è registrati nel sistema, la fase di login viene superata con successo e, dopo una breve schermata, si accede a quella che è nota generalmente col termine di home directory che nel complesso dei file system della macchina remota, in cui siamo ospiti, è un nodo della struttura ad albero dei file system.

Possiamo navigare e modificare tale struttura con i comandi

ls dir          lista il contenuto della directory
cd dir          spostati nella directory
ln -s target dir          crea una connessione
mkdir dir          crea la nuova directory
rmdir dir          rimuovi la directory

però, prima ancora di eseguire qualunque comando, è conveniente personalizzare il nostro ambiente di lavoro editando i file che assegnano le cosiddette variabili d'ambiente. Si tratta dei file nascosti .bashrc, .bash_profile e .bash_logout.

Si può visualizzare il valore corrente delle variabili d'environment eseguendo il comando

printenv

Per visualizzare i gli eventuali file nascosti della directory corrente bisogna digitare il comando

ls -a              oppure              ls -al

se vi vuol produrre il cosiddetto long listing nel quale vengono visualizzati alcuni flag che definiscono lo stato del file, diritti d'accesso compresi. La prima lettera ci dice se si tratta di un file regolare (-), directory (d), link (l), socket (s) mentre i 9 successivi, a gruppi di tre, danno i diritti d'accesso in lettura (r), scrittura (w) esecuzione/listing (x) per l'utente (u), gruppo (g) e gli altri utenti (o). Il proprietario del file e il suo gruppo sono listati di seguito; poi compare dimensione, data e nome. Ad esempio, il contenuto della radice è il seguente
drwxr-xr-x    2 root     root         2048 Dec 13  2003 bin
drwxr-xr-x    3 root     root         1024 Dec 13  2003 boot
drwxr-xr-x   20 root     root       117760 Oct 10 20:13 dev
drwxr-xr-x   68 root     root         5120 Oct 10 20:13 etc
drwxr-xr-x   13 root     root         4096 Jul 29 00:26 home
drwxr-xr-x    2 root     root         1024 Jan 24  2003 initrd
drwxr-xr-x    9 root     root         3072 Dec 13  2003 lib
drwx------    2 root     root        12288 Dec 13  2003 lost+found
drwxr-xr-x    2 root     root         1024 Jan 28  2003 misc
drwxr-xr-x   14 root     root         1024 Aug 31 20:20 mnt
dr-xr-xr-x   83 root     root            0 Oct 10 19:29 proc
drwxr-x---   22 root     root         2048 Oct 10 21:10 root
drwxr-xr-x    2 root     root         5120 Dec 13  2003 sbin
drwxr-xr-x    3 root     root         1024 Dec 13  2003 tftpboot
drwxrwxrwt  112 root     root        14336 Oct 10 21:10 tmp
drwxr-xr-x   17 root     root         4096 Jun 15 21:44 usr
drwxr-xr-x   22 root     root         4096 Jun 15 21:52 var

Contenuto della radice

Si tenga presente che ogni comando cmd è fornito di una spiegazione esauriente in linea che può facilmente essere visualizzato eseguendo il comando

man cmd

Alcuni fra i moltissimi comandi, che la shell bash mette a disposizione dell'utente, sono quelli riportati nella seguente tabella

ps opzioni          lista i processi in accordo con opzioni
df ---          mostra i file system montati
mv fn1 fn2          rinomina fn1 come fn2
rm fname          cancella il file fname
cp fn1 fn2          crea una copia del file fn1 col nome fn2
cat text          mostra il contenuto del file di testo text
chmod flag fname          cambia lo stato di accesso di fname secondo i flag indicati

Naturalmente, molti altri sono i comandi disponibili. Questi si trovano come file eseguibili nelle directory di sistema /bin, /sbin, /usr/bin, /usr/sbin, /usr/X11R6/bin, /usr/local/bin che devono essere rese accessibili mediante la variabile d'ambiente PATH.

Infine, prima di terminare, si ricordano gli editor standard di Unix vi e emacs particolarmente adatti per eseguire manuntenzione in qualunque situazione, anche fra le più critiche. Tuttavia, da console grafica sono accessibili molti altri editor avanzati facilmente utilizzabili con l'ausilio del mouse.