Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Slackware For Dummies
Slackware For Dummies
Mauro Sacchetto
3° edizione: ottobre 2006
II
Introduzione 1
Premessa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Un cenno storico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
Requisiti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Informazioni su Slackware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1 Procurarsi Slackware 5
1.1 Scaricare Slackware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
Scheda n. 1: Condivisioni con BitTorrent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.2 Controllare le ISO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.2.1 Quali controlli . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.2.2 Lo md5sum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.2.3 La firma digitale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.2.4 Controllo dei file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Scheda n. 2: GnuPG, firma e crittografia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.3 Masterizzare le ISO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.3.1 Masterizzare le ISO su CD col kernel 2.4 . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.3.2 Masterizzare le ISO su CD col kernel 2.6 . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.3.3 Controllo del CD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.3.4 Creare ISO da CD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.3.5 Reperire Slackware in DVD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.3.6 Masterizzare le ISO su DVD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.3.7 I front-end grafici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
III
IV Indice
3 Installare Slackware 25
3.1 Avviare l’installazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Scheda n. 5: I kernel di Slackware 11.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3.2 Scegliere la tastiera . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.3 Lanciare il setup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.4 Opzione ADDSWAP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.5 Opzione TARGET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.6 Opzione SOURCE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.7 Opzione SELECT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
Scheda n. 6: I pacchetti di Slackware 11.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.8 Rifinire l’installazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
3.8.1 Scegliere un kernel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
3.8.2 Creare un floppy di avvio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Scheda n. 7: La gestione dei floppy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.8.3 Configurare il modem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.8.4 Abilitare Hotplug . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.8.5 Installare Lilo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.8.6 Configurare il mouse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
3.8.7 Abilitare GPM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
3.8.8 Configurare la rete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
3.8.9 Impostare i demoni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
3.8.10 Sostituire i font della console . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
3.8.11 Impostare l’ora di sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
3.8.12 Scegliere un Desktop Environment . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
Scheda n. 8: Come installare Gnome . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
3.8.13 Impostare la password di root . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
3.8.14 Riavviare il sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
3.9 Installare Slackware da floppy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
Scheda n. 9: Le directory di Slackware 11.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
17 La console 273
17.1 Tipi di console . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
17.2 Commutazione fra console . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
17.3 Prompt e comandi principali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
17.4 La history . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
17.5 Il server X in più terminali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
Scheda n. 26: Inizializzazione e runlevel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
17.6 L’avvio del sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278
17.7 Modificare il manager di avvio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278
17.8 Avviare automaticamente in modalità grafica . . . . . . . . . . . . . . . . . . . . . . . . . . 279
Indice XI
Ringraziamenti 318
Premessa
La distro Slackware GNU/Linux è la prima distribuzione uscita fra quelle storiche, conta più anni
di vita di ogni altra, e – soprattutto grazie alle innovazioni apportate a partire dalla versione 9.0 – è
divenuta maggiormente accessibile agli utenti. Parecchi sono infatti gli strumenti di configurazione (da
xorgconfig ad alsaconf, da netconfig a xwmconfig, da liloconfig a mouseconfig e via dicendo) che, sebbe-
ne non grafici come quelli di altre distribuzioni, svolgono con molta efficacia il loro compito. Slackware è
notoriamente stabile e veloce. Il carattere «spartano» che le viene attribuito (niente strumenti di configu-
razione di tipo grafico, niente bootsplash colorato o con animazione, Lilo senza immagini) può lasciare
perplessi utenti che provengono da Microsoft Windows® (ma anche da altre distribuzioni GNU/Linux).
Tuttavia ha un suo contraltare per nulla secondario nel fatto che è altamente personalizzabile, in non
pochi casi in maniera anche più semplice di altre distribuzioni.
L’utilizzo del kernel vanilla, cioè privo dell’applicazione di patch (a eccezione della patch speakup,
che introduce funzionalità speciali per l’utilizzo dello schermo per i diversamente abili), ne rende asso-
lutamente praticabile la ricompilazione, che in altre distribuzioni invece è una faccenda assai complicata.
È poi facile accorgersi che, in molti casi, proprio questa linearità di Slackware consente di approntare il
sistema con pochi ritocchi ai file di configurazione. La filosofia di Slackware è riassunta nel motto KISS,
e cioè «Keep It Simple, Stupid»: fin troppo spesso gli strumenti grafici che dovrebbero semplificare la
gestione da parte dell’utente complicano il sistema in misura notevole. Inoltre Slackware, spogliata delle
GUI (acronimo di Graphical User Interface, e cioè dei frontend grafici), o con un Window Manager che
non richiede processori potenti e molta RAM, gira perfettamente anche su vecchi computer dotati di
scarse risorse.
Questa guida intende essere un ausilio per ottenere in svariati ambiti una buona configurazione di
Slackware in un computer stand-alone e una piccola LAN (Local Area Network, nella fattispecie una rete
domestica); non prende invece in considerazione l’utilizzo del computer come server web, mail o ftp.
Una guida esaustiva è impossibile da scrivere, perché la configurazione varia a seconda dell’hardware
e delle esigenze degli utenti. Questo spiega la mole enorme dei quesiti che si leggono nelle mailing
list e nei forum, nonché i numerosi How-To, che rimangono essenziali riferimenti per approfondire le
questioni e personalizzare ulteriormente il proprio sistema.
Ciò non toglie che sia possibile indicare almeno alcuni elementi di base come punto di partenza
della configurazione. Inoltre sono trattati (per lo più nelle schede) alcuni aspetti comuni a tutti i sistemi
GNU/Linux, essendo impossibile prescinderne. Alcune sezioni sono rivolte a chi voglia installare e
configurare Slackware per la prima volta, altre (come la compilazione dei pacchetti, l’uso di udev o
la condivisione di file e risorse con NFS e Samba) presuppongono invece una qualche confidenza con
GNU/Linux e con Slackware. Due sezioni sono dedicate rispettivamente alla console e alla shell bash,
certo non specifiche di Slackware, ma essenziali per la gestione del sistema.
Nel testo sono state adottate le seguenti convenzioni: le stringhe di testo e le citazioni da sezioni
1
2 Introduzione
di file sono in Courier su sfondo grigio chiaro; gli indirizzi Internet e i nomi di directory e di file in
Helvetica; i comandi in Courier; i tasti di comando in Helvetica grassetto; le variabili in corsivo.
Un cenno storico
Slackware nasce nell’aprile 1993, anche se l’annuncio ufficiale compare in Internet poco tempo dopo,
il 16 luglio, e si può ancora leggere all’indirizzo: http://www.slackware.com/announce/1.0.php.
Il suo creatore è Patrick J. Volkerding, laureatosi in informatica nel 1993 (il titolo americano è «Ba-
chelor of Science») presso la Moorhead State University del Minnesota. Volkerding, avendo bisogno di
un interprete LISP (List Processor, un linguaggio di programmazione di tipo funzionale, notevolmen-
te lontano dai linguaggi imperativi come Fortran, Pascal, C ecc.), costruì un piccolo sistema basato su
GNU/Linux, chiamato SLS Linux (Soft Landing System). Fissati alcuni bug di questo sistema, decise di
creare un’intera distribuzione, inizialmente riservata a un ristretto gruppo di amici. Slackware 1.0 era
composta da due serie di pacchetti: la serie a (contenente il kernel, le utilità di base e consistente in tre-
dici floppy) e la serie x (contenente il server grafico e consistente in undici floppy). Volkerding continua
a essere il mantainer perssoché unico di questa distribuzione, anche se dopo la sua trascorsa malattia
aveva dichiarato di voler coinvolgere (ma non si sa a che livello) dei collaboratori, per garantirle un fu-
turo in modo del tutto indipendente dalle sue vicende personali. Inoltre, si affida a un gruppo ristretto
di persone che seguono gli aggiornamenti di sicurezza. Si tratta insomma, per Slackware, di una «one
man distro».
Le varie release si susseguono con scadenza approssimativamente annuale, ma senza autentica re-
golarità (il salto nella numerazione dalla 4 alla 7 è stato determinato da motivazioni commerciali e di
immagine), con in più alcune versioni intermedie per aggiornamenti e bug fixes:
I curiosi o i nostalgici possono tuttora scaricare (e provare a installare) le vecchie versioni di Slack-
ware all’indirizzo: http://zuul.slackware.biz/versions.
Il nome di questa distribuzione GNU/Linux deriva dal termine «slack», che come sostantivo signifi-
ca «ozio», «pigrizia», «indolenza», e può essere usato anche come aggettivo, nelle medesime accezioni.
Dietro questa curiosa denominazione sta l’adesione alla Church of the SubGenius, movimento pseudo-
religioso «tecno-pagano» nato a Dallas nel 1953, che acquistò popolarità durante gli anni Ottanta e No-
vanta. Esso presentava evidenti legami con la cultura pop, con la musica underground e uno spiccato
interesse per Internet. Attualmente, il sito di riferimento del movimento è: http://www.subgenius.com.
Introduzione 3
La fondamentale credenza della Chiesa dei Subgenius è la ricerca dello Slack, ovvero un senso di
libertà, di indipendenza, di autonomia allorché si riescono a raggiungere i propri obiettivi. Tutti nasco-
no con lo spirito dello Slack, ma poi esso viene inibito dalla «cospirazione» della gente comune e dal
conformismo. Di conseguenza, i seguaci dello Slack non devono accettare l’autorità costituita e i limiti
della società.
Requisiti
Slackware è una distribuzione a 32 bit per computer PC compatibili con processore Intel 486 o supe-
riore (Intel, Celeron, Pentium, MMX, AMD, ecc.); tuttavia ne esistono oggi dei port per altre architetture:
uno ufficiale per s/390 e altri non ufficiali: Slackintosh per powerpc (http://workaround.ch/index.html)
e Splack per sparc (http://www.splack.org). Inoltre, secondo i dati che è possibile reperire in siti quali
http://www.distrowatch.com e http://www.linux.org, esistono attualmente quasi quaranta cloni di Slack-
ware e una ventina di distribuzioni live basate su di essa (la più nota è probabilmente Slax, reperibile
all’indirizzo: http://slax.linux-live.org). Slackware attualmente è ottimizzata per i686, anche se è compa-
tibile con processori da i486 in su. Inoltre contiene un completo ambiente di sviluppo che supporta C,
C++, Fortran-77, LISP, Java e altri linguaggi.
Slackware richiede almeno 16 MB di RAM, poco più di 3 GB di spazio sul disco fisso per un’installa-
zione completa, e necessita di un file di swap (sebbene sarebbe possibile farne a meno in presenza di una
accertata RAM sufficiente). Si possono installare soltanto i programmi inclusi nella serie di pacchetti a
(che costituisce la configurazione minimale e consente comunque al sistema di funzionare), aggiungen-
do in un secondo momento altri pacchetti. Molti sono i lettori CD anche obsoleti supportati (in certi casi,
lettori apparentemente non supportati usano in realtà componenti elettronici di ditte supportate). In
questo caso si può andare per tentativi. I lettori con standard IDE/ATAPI sono tutti supportati, mentre
per quelli SCSI tutto dipende dal supporto al controller.
Informazioni su Slackware
La prima fonte di informazioni su Slackware (e su GNU/Linux in generale) si trova nella distri-
buzione stessa, ricca di documentazione che si può reperire in /usr/doc/Linux-HOWTOs ed eventual-
mente scaricabile anche all’indirizzo del Linux Documentation Project: http://www.tldp.org, parzialmente
mirrorato in lingua italiana all’indirizzo: http://it.tldp.org.
Qui si possono vedere gli How-To, le FAQ, gli LDP e infine le LDPInstall-guide. Sebbene in alcuni
casi questi documenti siano un po’ datati, costituiscono comunque fonti preziose di informazione.
La guida ufficiale, ampia ma non onnicomprensiva, è lo Slackware Linux Essentials, di cui è stata
rilasciata la seconda edizione, contenuta nel DVD o nel CD 5 nell’omonima directory della distribuzione,
che si può inoltre scaricare in rete all’indirizzo: ftp://ftp.slackbook.org/pub/slackbook/slackbook-2.0.pdf,
oppure acquistare in formato cartaceo.
Una versione italiana della prima edizione è presente all’indirizzo: http://www.slackit.org/book.php.
Una traduzione della seconda edizione è attualmente in corso.
4 Introduzione
Capitolo 1
Procurarsi Slackware
Scheda n. 1
Condivisioni con BitTorrent
Fino a un paio di anni fa, in Internet dominava una netta distinzione fra i server e i client. I server
fornivano contenuti che potevano essere scaricati dai client. Ciò era dovuto anche ai limiti oggettivi
della banda: chi stava scaricando con un modem a 56KB non aveva banda sufficiente per condividere
file. Con l’avvento delle tecnologie broadband come la DSL si è resa disponibile una banda notevolmente
più ampia, che ha portato alla nascita dei p2p, acronimo di «peer-to-peer», che letteralmente significa
«da pari a pari» (per sottolineare il fatto che tutti i nodi rivestono, indistintamente, lo stesso ruolo). Fra
questi, una soluzione particolarmente felice è costituita da BitTorrent, creato da Bram Cohen e reperibile
all’indirizzo: http://www.bittorrent.com.
La «filosofia» di BitTorrent
La «filosofia» del p2p risiede nel fatto che chi è connesso per scaricare qualcosa può rendere dispo-
nibile quello che ha già scaricato, o altro materiale che risiede nel suo computer: dunque ogni client si
trasforma in un piccolo server. Mentre però in alcuni sistemi di p2p la ricerca dei file è integrata nel
programma stesso, BitTorrent si limita al download, lasciando all’utente il compito di trovare la fonte
(ad esempio, mediante un motore di ricerca). Nel sito di Slackware sono indicati molti BitTorrent. In se-
condo luogo, innumerevoli programmi di p2p consentono di scaricare file senza preoccuparsi se l’utente
consenta la condivisione dei propri. Ma in questo modo sarebbe assai difficile farli funzionare adeguata-
mente: scaricare ciò che ci interessa da altri senza consentire che, a loro volta, altri possano scaricare da
5
6 1. Procurarsi Slackware
noi, viene chiamato leeching («fare la sanguisuga»). Per evitare questo problema BitTorrent impone una
propria tecnica: suddivide il file richiesto in piccoli pezzi (detti chunk, di 250 KB l’uno), velocizzando il
download e rendendolo più efficiente, perché è possibile scaricare anche da chi non ha il file per intero,
ma lo sta scaricando contemporaneamente a noi. Inoltre, per combattere il leeching, BitTorrent permette
di iniziare a scaricare un file anche a chi non ne ha messo a disposizione nessuno, ma se poi nulla viene
messo a disposizione, non fa più proseguire l’operazione.
Funzionamento di BitTorrent
Per poter usufruire del sistema è necessario, innanzitutto, prelevare da un sito web dedicato un file
di estensione .torrent. Si tratta di un file statico, contenente delle informazioni codificate mediante un
algoritmo di hashing: il file da prelevare e/o da trasferire, l’indirizzo di un server traccia (in inglese
tracker) utilizzato per localizzare i sorgenti (cioè altri utenti) che possiedono il file o parte di esso e
altre notizie e statistiche. Il client BitTorrent si connette al server traccia e ottiene una lista degli utenti
che hanno scaricato o stanno scaricando lo stesso torrent. Allo stesso tempo, esso aggiunge il nuovo
utente alla lista, di modo che altri a loro volta possano scaricare da quest’ultimo. Il client aggiorna
periodicamente la lista degli utenti.
In questo modo, ogni nodo contribuisce a diffondere il file: più è ampia la banda su un determina-
to nodo, più elevate sono le probabilità che il tracker venga diffuso verso altri nodi. Ciò è favorito dal
funzionamento stesso di BitTorrent: come abbiamo visto, quando parte una richiesta di download, Bit-
Torrent inizia il prelievo solo se c’è un numero sufficiente di utenti connessi (almeno uno dei quali deve
possedere il file completo), laddove, se ce ne sono pochi, è possibile condividere solo alcune parti del
file.
La velocità di scaricamento viene così progressivamente incrementata quanto più numerosi sono gli
utenti che stanno scaricando il file. Inoltre, i server traccia che possiedono il file completo, e che vengono
chiamati semi (in inglese seed), fanno sì che nel computer dell’utente lo scaricamento di un determinato
file si completi solo nel momento in cui essi hanno completato la copia del file stesso verso altri server
traccia, per consentirne la diffusione.
BitTorrent e i firewall
Se il traffico è controllato da un firewall, per consentire sia il download sia l’upload va abilitato il
traffico in TCP e UDP per tutte le porte di cui si serve BitTorrent, e precisamente le porte 6881-6889. Se
il firewall facesse il NAT (Network Address Translation), i pacchetti non potrebbero raggiungere l’indi-
rizzo privato del client e ciò renderebbe impossibile la condivisione. È pertanto necessario configurare
adeguatamente il router, a seconda del modello. IPTables richiede invece una regola del tipo:
iptables -t nat -I PREROUTING -p tcp --dport 6881:6889 -j DNAT --to-destination host
dove host è l’indirizzo IP privato su cui gira il client BitTorrent.
Se invece non si usa un router e la connessione a Internet non è stabile (quando ci si connette con
un modem, l’indirizzo IP varia sempre; con una connessione tipo DSL ciò è meno probabile, ma mai
garantito), è necessario comunicare al server traccia il corretto indirizzo IP pubblico con l’opzione --ip
123.45.67.890. In questo caso si deve aggiornare la riga di comando, che risulterà del tipo:
bittorrent --ip 123.45.67.890 --responsefile "%1
In alternativa, un sistema più farraginoso è ricorrere a servizi esterni (come i siti
http://checkip.dyndns.org, http://www.whatismyipaddress.com, http://www.dnsart.com).
I comandi principali di BitTorrent
BitTorrent funziona da console col comando: bittorrent-console file.torrent , con la versio-
ne ncurses, sempre da console, col comando: bittorrent-curses file.torrent e si vale invece di
un’interfaccia grafica (versione GUI) col comando: bittorrent file.torrent . Quest’ultima versione
richiede che siano installate le librerie wxpython (che di default non sono presenti in Slackware).
In /etc/mailcap dovrà essere presente la riga:
application/x-bittorrent; /usr/bin/bittorrent-xterm '%s';
1.2. Controllare le ISO 7
che solitamente viene aggiunta in modo automatico all’installazione del pacchetto. I passaggi pratici da
seguire sono allora i seguenti:
a) individuare il file che ci interessa (ad esempio, la ISO n. 1 di Slackware)
b) scaricare il relativo file .torrent (nel nostro caso quello relativo alla ISO n. 1 di Slackware, reperibile
all’indirizzo: http://www.slackware.com/getslack/torrents.php)
c) lanciare da console il comando a seconda dell’interfaccia che desideriamo, ad esempio:
bittorrent-curses slackware-11.0-install-d1.torrent
Per scaricare (o diffondere) più file senza lanciare molteplici istanze del programma, si può usare
la versione del client launchmany-console oppure launchmany-curses. Il primo parametro sulla linea
di comando specificherà una cartella, che contiene un certo numero di .torrent e i loro corrispondenti
file/cartelle; il resto della riga di comando segue le normali regole di BitTorrent.
Con i comandi maketorrent (da GUI) e maketorrent-console (da console) è semplicissimo creare
un file torrent per i file o le directory che si vogliono mettere a disposizione in questo modo.
Slackware presenta BitTorrent nella sezione /extra (CD 2), e inoltre BitTornado, una versione
sperimentale modificata di BitTorrent (che richiede anch’esso le librerie wxpython).
BitTorrent e i browser
Per automatizzare lo scaricamento dal browser, è necessario creare un’associazione tra i file di esten-
sione .torrent e /usr/bin/btdownloadxterm.sh. Una volta scaricato il torrent, si aprirà così automaticamen-
te la finestra di scaricamento. Infine, vi sono alcune GUI molto buone per BitTorrent: Azureus, scarica-
bile dal sito: http://azureus.sourceforge.net (che richiede la presenza di Java) implementa per l’appunto
il protocollo BitTorrent.
1.2.2 Lo md5sum
Per controllare la ISO si deve lanciare il comando: md5sum nome_iso.iso e confrontare l’output con
la stringa contenuta nel file di digest che la accompagna. Il comando sarà dunque, ad esempio: md5sum
slackware-11.0-install-d1.iso. La stringa risultante dovrà essere identica a quella presente nel file
slackware-11.0-install-d1.iso.md5.
fare questo si ricorre a GnuPG, un programma che gestisce la crittografia a chiave pubblica delle e-mail
e le firme digitali (vedi Scheda n. 2 — GnuPG: firma e crittografia ).
Per verificare le ISO di Slackware, dobbiamo compiere i passaggi seguenti:
a) ci procuriamo la firma GPG di Slackware (molti siti hanno una sezione sicurezza con tali firme),
reperibile all’indirizzo: http://www.slackware.com/gpg-key.
b) Salviamo la firma in un file di solo testo, con un nome a piacere ed estensione .asc (ad esempio
slackware.asc).
c) Importiamo da console la firma nel nostro database di firme (il cosiddetto keyring) col comando:
gpg --import chiave.asc (ad esempio gpg --import slackware.asc).
d) Possiamo eventualmente controllare le chiavi già importate col comando: gpg --list-keys e dovrà
apparirci anche la chiave appena importata.
e) Firmiamo la chiave con la nostra tramite il comando: gpg --edit-key chiave (ad esempio gpg
--edit-key slackware) ed entriamo quindi in modalità comando. Diamo quindi il comando: sign.
Di seguito la chiave dev’essere anche convalidata. Se siamo certi dell’autenticità della firma, le attri-
buiamo un determinato livello di affidabilità che va da nessuna convalida a convalida totale e definitiva.
Confermiamo la scelta ed effettuiamo l’operazione con la nostra firma GPG.
A questo punto abbiamo installato la firma dell’autore; siamo pronti adesso a verificare la ISO.
Scarichiamo anche il file di firma di quest’ultima e diamo il comando: gpg --verify nome_iso.asc
nome_iso.iso. Il risultato ci dirà se la firma è valida.
Scheda n. 2
GnuPG: firma e crittografia
Il programma GnuPG è la versione open source di PGP, e cioè Pretty Good Privacy. Si tratta di un
sistema di autenticazione e di crittazione a chiave pubblica che rende possibile inviare mail firmate o
crittate in modo che solo il destinatario possa leggerle o che possa comunque verificare l’autenticità del
mittente e che, allo stesso modo, rende possibile apporre a qualsiasi file una firma digitale per consentire
il controllo della sua autenticità. Per svolgere tutte queste operazioni vengono usate da ciascun utente
due chiavi, una privata e una pubblica, generate mediante appositi comandi. La chiave privata dev’es-
sere tenuta segreta e serve per decrittare i messaggi ricevuti, quella pubblica invece dev’essere inviata
ai destinatari. Quando A deve mandare un messaggio crittato a B, lo critta con la chiave pubblica di B,
il quale poi lo decritta con la sua chiave privata. Invece, per firmare A applicherà al messaggio la sua
chiave privata e B potrà verificare mediante la chiave pubblica di A che il messaggio è stato in effetti
inviato da questi.
Generare le proprie chiavi
Per poter usare GnuPG, la prima tappa consiste nel generare la propria coppia di chiavi, pubblica
e privata, che saranno collocate nella directory nascosta /.gnupg della home. A questo fine si usa il
comando: gpg --gen-key. Di norma, si usa il tipo proposto di default e, come lunghezza del file, 1024
bit (una maggiore lunghezza aumenta la sicurezza e insieme i tempi di crittazione e decrittazione).
L’algoritmo maggiormente adottato è DSA/ElGamal, in quanto non brevettato. Durante la generazione
della firma è opportuno aumentare l’entropia (ossia il «disordine») del computer, muovendo il mouse e
aprendo altri programmi.
1.2. Controllare le ISO 9
Tuttavia questa chiave è relativamente lunga (anche se si adotta la versione a 1024 bit) e quindi sco-
moda da inserire. Per ovviare a questo inconveniente, spesso si usa firmare i messaggi con una versione
della chiave non in formato binario, ma ascii (detta ascii-armored, un formato protetto da un’armatura
ascii simile ai documenti codificati con uuencode), che è più breve. I file di chiave binari di solito hanno
l’estensione .gpg (o .sig), quelli ascii l’estensione .asc. Per creare questo secondo tipo di chiave e visua-
lizzarla si adotta l’opzione --armor (anche abbreviata in -a) e serve il comando: gpg --armor --export
-o firma.asc, dove l’opzione -o abbrevia --output e fa vedere la firma sullo standard output (lo
schermo).
Per usare la chiave si deve creare anche una password (detta passphrase), per la quale valgono le
stesse regole di opportunità di quando si crea una password per altro uso.
Per cancellare la chiave pubblica si usa il comando: gpg --delete-key ID.
Per cancellare la chiave privata si usa il comando: gpg --delete-secret-key.
Per generare un certificato di revoca, atto a revocare la nostra chiave se per qualche motivo intendes-
simo eliminarla, si usa il comando: gpg --gen-revoke nome_utente . Infatti non potremo, nell’even-
tualità, ricreare la chiave originaria, in quanto anche fornendo gli stessi dati (e-mail, passphrase ecc.) la
firma risultante sarebbe comunque diversa.
Esportare la propria chiave pubblica
La chiave pubblica può essere inviata manualmente ai nostri corrispondenti, oppure può essere
pubblicata in appositi server. Essa può essere quindi inclusa o allegata ai messaggi.
L’esportazione si effettua, se la chiave binaria, col comando: gpg --export ID chiave.gpg, mentre
se è ascii col comando: gpg -a --export ID chiave.asc. L’esportazione in un keyserver si effettua col
comando: gpg --keyserver keyserver --send-key ID. Altro semplicissimo metodo consiste nell’ef-
fettuare un copia-incolla dell’output di: gpg -a --export ID nell’apposito form della pagina web del
server delle chiavi.
Importare e convalidare le chiavi
Per importare le chiavi pubbliche dei corrispondenti nel database delle nostre chiavi (detto keyring)
si usa il comando: gpg --import chiave.asc, mentre per verificare se l’importazione ha avuto effetti-
vamente luogo, o semplicemente per controllare quali chiavi sono state importate, si dà il comando: gpg
--list-keys.
Ogni chiave appena importata dev’essere convalidata firmandola con la nostra chiave. A questo fine
si usa il comando: gpg --edit che ci fa entrare in modalità comando, e quindi il comando: sign, dopo
di che si attribuisce alla chiave un determinato livello di affidabilità, sempre da modalità comando, col
comando: trust e si sceglie il livello di affidabilità da conferire alla chiave importata e appena firmata.
Verificare una firma
Per verificare una firma si usa il comando: gpg --verify chiave.asc file_da_verificare .
Firmare e crittare un file
Per firmare un file si dà il comando: gpg --sign file .
Per firmarlo con una firma ascii si dà il comando: gpg -a --clearsign file .
Per firmare un file con una forma ascii separata, che può consentire di verificare il file stesso, si usa
il comando: gpg -sba file . Questo comando produce un file separato di nome file.asc, di cui ci si
serve per la verifica. Le opzioni stanno rispettivamente per: -s = firmare il file; -b = produrre una firma
separata (detta detach sign); -a = produrre una firma in formato ascii (come abbiamo già visto).
Per crittare un file si dà il comando: gpg -e file , dove l’opzione -e abbrevia --encrypt, oppure,
sempre con firma ascii: gpg -a -e file .
Per crittare un file con un nome determinato, il comando sarà: gpg --output file_crittato
--encrypt --recipient ID file_da_crittare .
Decrittare un file
10 1. Procurarsi Slackware
Per decrittare un file si usa il comando: gpg [-d] file , dove l’opzione -d (facoltativa) abbrevia
--decript, mentre per decrittare e controllare un file si usa il comando: gpg -d chiave.asc file .
Per decrittare un file con un nome determinato, il comando sarà: gpg --output file_crittato
--decrypt nome_file_decrittato .
L’output predefinito può essere rediretto a un file con l’opzione -o file .
I client di posta
La maggior parte dei client di posta, sia testuali (come Mutt) sia grafici (come Mozilla Thunderbird,
che ricorre a un add-on quale Enigmail), riescono a gestire le firme GnuPG. Kmail presenta un’ottima
integrazione con GnuGP e, se si sceglie di firmare le e-mail, usa di default la firma ascii-armored. Inoltre
KDE ha un semplice strumento grafico (KGpg) per svolgere tutte le operazioni che sono state descritte.
Le opzioni di GnuPG sono molte di più di quelle segnalate in questa scheda. Un’ampia documentazione
è reperibile nel sito del programma, all’indirizzo: http://www.gnupg.org, mentre per le opzioni a riga di
comando si può ricorrere alla pagina man di gpg.
13
14 2. Preparare il disco fisso
del CD 3 di Slackware), il quale però supporta NTFS solo se opportunamente patchato; ma se suppo-
niamo di avere solo Windows nel nostro computer per il momento non saremo in grado di utilizzarlo.
Peraltro, quest’ultimo programma, come altri per GNU/Linux, è in grado di gestire un elevato numero
di file system, ben più vario di quelli accessibili dagli strumenti di amministrazione per Windows.
Utilizzeremo allora i floppy per ridimensionare la partizione di Windows (sia essa FAT32 o NTFS) e
creeremo altre due partizioni, una EXT3 (Partition Magic consente di creare partizioni GNU/Linux di
due formati, EXT2 ed EXT3, più il file system per il file di swap, mentre non ne supporta altri, come
Reiserfs) e una di swap. La prima dev’essere sufficientemente ampia da ospitare il sistema operativo
(nel caso di un’installazione completa, poco più di 3 GB) e i programmi aggiuntivi; la seconda, alla
luce di un antico adagio, dovrebbe ammontare al doppio della RAM disponibile. Tuttavia ciò è valido
solo se si ha poca RAM; oggi, non essendo infrequente trovare computer domestici che hanno un GB o
più di RAM, si può creare un file di swap più piccolo o addirittura ometterlo in presenza di un’ampia
RAM. Se poi vogliamo, creeremo anche una partizione /home per gli utenti (ciò vale – ed è decisamente
consigliabile – anche nel caso che siamo noi l’unico utente del nostro computer). La sua dimensione
dipende ovviamente da che cosa essa è destinata a contenere.
Digitiamone la dimensione in MB, ricordando che 1 GB = 1024 MB, o 1000 MB per semplificare il
computo (nel nostro esempio, 5000 MB):
Scegliamo di collocarla all’inizio dello spazio libero presente nel disco fisso (presumibilmente dopo
la partizione che ospita Windows):
16 2. Preparare il disco fisso
Andiamo nel menu che ci permette di scegliere il tipo di partizione che vogliamo creare:
Infine scegliamo il tipo di formattazione fra le numerose possibilità che il menu ci offre:
Per GNU/Linux si tratta del file system 83, per il file di swap del file system 82:
2.2. Usare Cfdisk 17
Ripetiamo i vari passaggi per ogni ulteriore partizione, naturalmente senza indicare queste nuove
partizioni come avviabili (fra l’altro, Windows parte solo se collocato nella prima partizione del disco
fisso, che dev’essere necessariamente avviabile). Quindi diamo l’ordine di scrivere andando coi tasti
freccette alla voce «write»:
Continuiamo con la stessa procedura per tutte le partizioni nuove che intendiamo creare (ricordando
che la scrittura può essere effettuata un’unica volta, al termine di tutte le modifiche):
Una volta che il programma abbia terminato la scrittura, usciamo e riavviamo il sistema. Ciò non
è strettamente necessario, ma non sempre l’operazione di ioctl che causa la rilettura della tabella delle
partizioni va buon fine. A questo punto il comando: fdisk -l dovrebbe farci vedere tutte le nuove
partizioni. Come alternativa, possiamo lasciare lo spazio libero non allocato e impostare le partizioni
direttamente, durante l’installazione, sempre con cfdisk.
In caso di errore, possiamo sempre uscire dal programma senza scrivere, scegliendo la voce «Quit»:
2.2. Usare Cfdisk 19
Scheda n. 3
I file system di GNU/Linux
GNU/Linux supporta una grandissima quantità di file system, nativi o utilizzati da altri sistemi
operativi, fra cui alcuni assai poco diffusi e particolari. I primi sono supportati direttamente nel kernel
(EXT2, EXT3, NFS, iso9660), gli altri grazie a moduli. Ne offriamo un elenco per categorie, distinguendo
i file system locali da quelli di rete, e quindi soffermandoci su quelli nativi più usati.
Il journaling
Preliminarmente, va chiarito che il journaling di cui sono dotati alcuni file system serve a conservare
le tracce dell’attività del disco fisso: in caso di crash, si tratta di verificare quanto il file system è lontano
dalla consistenza e, se possibile, di correggerne gli errori; una ulteriore possibilità, non sempre fortunata,
è cercare di recuperare i dati perduti nel crash. L’operazione di scansione e di recupero dei dati è detta
replay. Il journaling può essere effettuato sui soli metadata oppure sia sui metadata sia sui dati. Nel
primo caso è relativamente semplice ripristinare la consistenza del file system, ma nulla garantisce che
non vadano persi dei dati. Nel secondo caso, dovendo i dati essere scritti due volte, una nel log di
sistema e una nel file system stesso, le prestazioni del sistema si rallentano in misura considerevole.
L’unico file system che riesce a compiere questa doppia operazione senza influenzare significativamente
le prestazioni del sistema sembra essere Reiserfs4.
Quale file system?
Per vedere quali file system sono supportati dal nostro sistema (il che dipende dalle opzioni con cui
è stato compilato il kernel) si usa il comando: cat /proc/filesystems.
Non esiste una risposta univoca alla domanda: quale file system adottare per il nostro computer?
In linea di massima, attualmente la scelta è fra EXT2, EXT3 e Reiserfs. Dobbiamo considerare elementi
quali velocità, stabilità e supporto in funzione delle nostre esigenze, dal momento che un computer
domestico deve offrire prestazioni del tutto diverse da un server di posta o da un database. Inoltre va
tenuto presente che (a eccezione della migrazione da EXT2 a EXT3 e viceversa), cambiare il file system
significa dover formattare e reinstallare i contenuti del nostro disco fisso. In certi ambiti, poi, non vi sono
prestazioni significativamente diverse fra i vari file system, mentre EXT2 ed EXT3 risultano quelli più
supportati, se ci riferiamo alle utilità di backup, ripristino e gestione. Va infine ricordato che non tutti
i bootloader funzionano sempre e comunque (al momento attuale Grub riesce a supportare Reiserfs4
solo se patchato e Lilo non lo supporta affatto). EXT2, proprio perché manca del journaling, ha talora
prestazioni migliori di EXT3, ma richiede tempi assai più lunghi per i controlli in caso di crash. Alcuni
20 2. Preparare il disco fisso
ritengono che la scelta migliore per i desktop sia Reiserfs (che Slackware ci propone come default e che è
adottato personalmente da P. J. Volkerding), molti altri adottano EXT2 o EXT3. Questi ultimi gestiscono
con maggiore efficienza file di notevoli dimensioni, laddove Reiserfs è più veloce nel trattamento dei
file di piccole dimensioni (che però sono in genere assai più piccoli di quelli che può creare un utente
domestico per un normale uso del computer).
File system locali
bfs file system di boot per SCO Unixware. Non supporta molte funzioni normali, appunto perché creato
esclusivamente per bootare il kernel da UnixWare.
ext2 file system tipico di GNU/Linux. Offre ancor oggi prestazioni buone e un’ampia affidabilità. È lar-
ghissimamente supportato dai sistemi Unix e può valersi di un’ampia serie di utilità e di driver.
Non presenta funzioni di journaling, per cui, a seguito di un crash, la sua consistenza dev’esse-
re verificata con fsck e può causare la perdita irreparabile di dati. Può essere convertito senza
problemi in EXT3.
ext3 è la versione journalized di EXT2. È dotato di un journaling completo (cioè non dei soli metadata),
per cui è in genere possibile ripristinare file cancellati o perduti a seguito di un crash. Può esse-
re riconvertito senza problemi in EXT2. Offre tre metodi di journaling: writeback (scrive prima i
metadata e quindi i dati; la persistenza di dati vecchi può far sì che dopo un ripristino essi com-
paiano nei file in luogo di quelli più recenti); ordered (si tratta dell’impostazione di default: scrive
prima i dati e quindi i metadata); journal (effettua una doppia scrittura di tutti dati). La modalità
di default può essere modificata inserendo in /etc/fstab l’opzione data=opzione . EXT3 può me-
morizzare file fino a 2 TB col kernel 2.4 e fino a 4 TB col kernel 2.6, e inoltre supporta nomi di file
fino a 255 caratteri (anche se questo limite può essere superato con opportune patch).
fat file system Microsoft di tipo FAT12 e FAT16. Prende il nome dalla File Allocation Table, una tabella
che funge da indice del contenuto del disco fisso. È stato progressivamente perfezionato per ag-
giungergli nuove funzionalità, cosicché sono nati gli altri, successivi file system della Microsoft.
Supporta solo nomi brevi dei file (otto caratteri, più i tre dell’estensione).
freevxfs versione libera del file system Veritas VxFS usato da SCO: Unixware, Sun Solaris, HP-UX. È
dotato di journaling.
hfs file system gerarchico Macintosh, oggi aggiornato con hfs+. È supportato da GNU/Linux solo in
maniera largamente sperimentale.
jfs file system IBM con funzionalità di journaling. Sviluppato originariamente da IBM, dal 2000 ne esiste
anche il port per GNU/Linux. Supporta il journal dei soli metadata e non è in grado di gestire le
quote di GNU/Linux.
minix file system Minix. Si tratta, storicamente, del primo file system supportato da GNU/Linux e
presenta notevoli limitazioni.
ntfs file system NT Microsoft per Windows NT, Windows 2000 e Windows XP. È sorto dal progetto
Microsoft di creare un file system del tutto nuovo, più rapido, resistente ai crash di Windows ed
esente dalle limitazioni del file system FAT.
reiserFS file system Reiser, creato ex novo da Hans Reiser. Reiserfs è un file system relativamente recente,
molto veloce, che organizza le informazioni in un database ad albero bilanciato, per cui è in grado
2.2. Usare Cfdisk 21
di utilizzare e trovare anche un grandissimo numero di file di piccole dimensioni in tempi molto
rapidi, mentre gestisce con maggior lentezza di EXT2 e di EXT3 i file più ampi. Fa il journaling
dei soli metadata: questo vuol dire che in caso di crash o di spegnimento accidentale del PC, le
modifiche effettuate sui nostri file potrebbero comunque andare perse. Non è compatibile con
EXT2 ed EXT3.
reiserfs4 file system Reiser di nuova generazione. Rilasciato molto di recente, è stato dichiarato il più
veloce file system per GNU/Linux. È tutto giocato su operazioni atomiche: dunque esse o sono
eseguite completamente o non hanno affatto luogo e non c’è nessuna perdita di dati per operazio-
ni eseguite solo parzialmente. Reiserfs4 organizza il database dei file in alberi che non distinguono
file piccoli e grandi, e ciò consente sia una maggior velocità nelle prestazioni sia un notevole ri-
sparmio di spazio. Questo file system, a causa della sua novità, non è ancora supportato in maniera
nativa dal kernel di GNU/Linux (e necessita pertanto di patch).
romfs file system per ROM. Si tratta di un file system di sola lettura, concepito per gestire i RAM disk
dei dischi di installazione.
ufs file system Unix usato per i sistemi BSD, Sun e Mac OS X.
umsdos più che un filesystem, si tratta di un layer che permette di implementare i permessi classici dei
filesystem Unix sulla FAT, rendendo possibile l’installazione di GNU/Linux su quest’ultima.
vfat file system FAT di Microsoft, noto anche come FAT32. Questo file system, a differenza dei
precedenti MSDOS, supporta nomi fino a 255 caratteri.
xfs file system creato da SGI per Irix (una distribuzione Unix). Dal 2000 ne esiste anche il port per
GNU/Linux. Ha caratteristiche tecniche originali, come la struttura ad albero e il supporto per
attributi estesi (oggi posseduto da diversi altri file system), e garantisce una larghezza di banda
minima durante l’accesso.
nfs file system NFS (Network File System). Sviluppato da Sun e basato sul meccanismo RPC, consente
la condivisione dei file in sistemi Unix paritetici e dunque anche GNU/Linux (sebbene esista un
addon della Microsoft per usare NFS anche su Windows). Essendo stato concepito per reti interne,
non possiede funzionalità di protezione integrata.
coda file system di rete della Carnegie Mellon University. Simile a NFS, offre anche il supporto per
operazioni interrotte e funzioni di cache di sicurezza.
ncfps file system NCFPS di Novell Corporation (detto anche NCP). Serve a montare i volumi Novell
Netware.
netatalk file system atto a gestire le reti miste GNU/Linux e Macintosh, sia paritetiche sia client.
smbfs file system basato sul protocollo SMB (Shared Message Block) usato da Microsoft e Samba stesso.
Consente di gestire servizi di rete ed è stato sviluppato come implementazione SMB/CIFS. L’im-
plementazione Unix prende il nome di Samba ed è comunemente usata per gestire le reti miste
GNU/Linux e Microsoft Windows od OS/2, sia paritetiche sia client.
22 2. Preparare il disco fisso
iso 9960 è lo standard per i CD-ROM; in particolare, permette la registrazione in multisessione. Per
soddisfare particolari esigenze, sono state create per esso nuove estensioni.
rock Ridge consente l’uso di nomi lunghi e link simbolici di tipo UNIX. Appartenendo tuttavia allo
standard ISO 9960, può essere usato anche nei sistemi non Unix.
joliet estensione di ISO 9960 sviluppata da Microsoft. Consente l’uso dei caratteri Unicode e dei nomi
lunghi (fino a un massimo di 64 caratteri).
udf è lo standard (ISO 13346) per i DVD-ROM (acronimo di Universal Disk Format). Consente la scrittu-
ra e la cancellazione di un CD-RW senza le perdite previste dalla modalità multisessione. Supporta
grandi dimensioni di file e tecniche di scrittura a pacchetti, per cui il CD può essere utilizzato come
una sorta di disco fisso.
Più ampie informazioni su diversi file system possono essere reperite innanzitutto in:
//usr/src/linux/Documentation/filesystems.
pattazione dei file, e ancor meno tentativi di compilazione o installazioni di programmi su partizioni di
questo tipo1 .
Nel caso si scelga anche una partizione distinta per /home, si avrà una partizione estesa contenente
due partizioni logiche, al che il nostro disco fisso potrà apparire come segue:
Per GNU/Linux, hda è il disco master sul primo canale ATA, cioè IDE1, e hdb il disco slave sullo
stesso canale; hdc è il disco master sul secondo canale ATA, cioè IDE2, e hdd il disco slave sullo stesso
canale. Le partizioni sono i numeri che seguono la sigla: hda1 è la prima partizione del disco fisso master,
hda2 la seconda; hdb1 è la prima partizione sul disco fisso slave, e così via. Secondo alcune scuole di
pensiero, sarebbe opportuno non collegare due dischi fissi allo stesso canale, per evitare interferenze che
possono produrre errori nella trasmissione dei dati (ciò è ancora più vero se ci si riferisce a unità come
lettori CD e masterizzatori, che se collegati allo stesso canale possono determinare il fallimento delle
copie «al volo»); tuttavia, in genere, i dischi fissi sono collegati al primo canale e dispositivi come lettore
CD, masterizzatore e unità DVD al secondo.
I dischi SATA vengono invece riconosciuti come dispositivi SCSI, per cui prendono il nome di sda,
sdb ecc. Le partizioni saranno di conseguenza sda1, sda2, . . . , sdb1 ecc. Unità IDE come lettori CD,
masterizzatori e DVD saranno riconosciuti in questo caso come hda ecc.; se si attiva l’emulazione SCSI,
tali unità prenderanno il nome di sr0 ecc., oppure scd0 ecc.; di norma, per rendersene conto è sufficiente
leggere le righe pertinenti di con dmesg | more. Si può tentare di identificare subito il dispositivo con
dmesg | grep sr0 e simili.
Ricordiamo incidentalmente che st0 ecc. sono le unità di memorizzazione a nastro e sg0 ecc. tutti i
dispositivi che non ricadono nelle fattispecie sopra descritte.
1 Non analizziamo qui né la procedura per la ricompilazione del kernel 2.4, né quella per la compilazione del nuovo kernel 2.6.
A tale proposito, due guide estremamente chiare e precise si possono leggere ai seguenti indirizzi:
http://www.slacky.it/tutorial/kernel/compilazione_kernel.html e http://www.gentoo.it/tips/kernel-2.6.0.html.
24 2. Preparare il disco fisso
Scheda n. 4
La partizione /home
GNU/Linux è un sistema autenticamente multiutente: ciò significa che prevede l’accesso contem-
poraneo allo stesso computer da parte di utenti diversi, che non devono poter accedere ai dati altrui.
L’utente root (chiamato anche «superuser») è responsabile della gestione del sistema, può modificare
qualsiasi cosa nel sistema e può accedere alle partizioni dei vari utenti. Ciascun utente non root (detto
user) non può modificare il sistema, e possiede uno «spazio», appunto la sua home, dove lavora, può
memorizzare i suoi dati, personalizzare i programmi che usa senza che queste modifiche si rispecchi-
no nelle home degli altri utenti. Il nome dell’utente dovrebbe essere inferiore agli otto caratteri, per
compatibilità con le utility di login.
Se anche esiste un solo utente che usa il computer, il dualismo di root e utente è vantaggioso perché,
se si riserva a root di modificare il sistema e si lavora di norma come utente, è più difficile danneggiare il
sistema stesso. In secondo luogo, nel caso si debba eliminare momentaneamente il sistema operativo in
vista di una reinstallazione, i dati memorizzati in home rimarranno inalterati e così pure le impostazioni.
Infine eventuali virus (eventualità allo stato attuale abbastanza remota in GNU/Linux) non possono
danneggiare il sistema, perché non hanno accesso alle sue parti vitali. Per creare e montare correttamente
la partizione di home in un’altra partizione o in un altro disco fisso, per essa andrà indicato /home come
punto di montaggio e non invece /mnt/home.
Capitolo 3
Installare Slackware
Scheda n. 5
I kernel di Slackware 11.0
Slackware 11.0 ci mette a disposizione un’ampia serie di kernel precompilati della serie 2.4.33.3.
I seguenti supportano sistemi IDE, e alcuni, in aggiunta, alcuni controller SATA:
bare.i è il kernel di base, valido per la maggior parte dei PC con controller di tipo IDE e supporta
CD-ROM e DVD IDE/ATAPI.
bareacpi.i kernel come bare.i, con l’aggiunta del supporto per ACPI (Advanced Configuration and Po-
wer Interface). È così in grado di svolgere funzioni come l’APM (Advanced Power Management).
Solitamente, si usa sui laptop.
lowmem.i kernel utile per sistemi IDE con scarsa RAM (meno di 8 MB), che inoltre supporta i processori
i386.
old_cd.i kernel analogo al bare.i, con l’aggiunta di un supporto per una serie di vecchi lettori CD-ROM
non standard.
25
26 3. Installare Slackware
pportide.i kernel analogo al bare.i, con un più ampio supporto per dispositivi IDE su porta parallela.
sata.i kernel analogo al bare.i, con supporto per controller SATA di Promise, Silicon Image, SiS,
ServerWorks / Apple K2, VIA e Vitesse. È presente a partire da Slackware 10.1.
I seguenti supportano sistemi dotati di controller SCSI:
ibmmca.s kernel che supporta la MicroChannel Architecture, presente in alcuni computer IBM PS/2 e
in alcuni laptop. Include inoltre il supporto per svariati adattatori MCA SCSI, Ethernet e Token
Ring
jfs.s kernel come il bare.i, ma col supporto per l’IBM Journaled file system e per l’Adaptec AIC7xxx
raid.s kernel col supporto per alcuni controller SCSI e ATA RAID
scsi.s kernel col supporto per svariati controller SCSI non Adaptec
scsi2.s kernel col supporto per altri controller SCSI non Adaptec
scsi3.s kernel col supporto per altri controller SCSI non Adaptec
speakup.s come il bare.i, ma col supporto per Speakup (strumento per i non vedenti, in quanto invia
gli output della console a diversi sintetizzatori vocali)
xfs.s versione estesa di bare.i, col supporto per il file system XFS (SGI)
Qui prendiamo in considerazione solo l’ipotesi di un hardware senza componenti particolari (come
dischi o masterizzatori SCSI o dischi fissi e relativi controller SATA, nel quale caso dovrebbe comunque
essere sufficiente scegliere all’avvio del processo di installazione il kernel sata.i e riconfermare la scelta
verso la conclusione). Nel caso di incertezze, il tasto F2 fornisce un elenco più ampio di kernel, e quindi
il tasto F3 ne offre l’elenco completo. Nel caso che consideriamo, al prompt ci si limita a scegliere la
modalità proposta di default, e cioè il kernel bare.i. È sufficiente dare Invio al prompt:
Slackware dà la possibilità di installare anche un kernel della serie 2.6, e precisamente il 2.6.17.13.
Esso non viene considerato più in testing, in quanto ha ormai raggiunto una buona stabilità (sebbene,
3.2. Scegliere la tastiera 27
a quanto sembra, Volkerding continua a preferire i kernel della serie 2.4 almeno negli ambienti di pro-
duzione per la loro ormai diuturna affidabilità), può nondimeno rappresentare una buona scelta per
un computer desktop, data la sua minor latenza e il più ampio supporto hardware. In questo caso,
al prompt andrà scritto: huge26.s. Questo kernel supporta nativamente anche i dischi SATA e SCSI e
presenta il supporto per la «high memory», utile ai computer che hanno più di un GB di RAM. In un
secondo momento, al termine dell’installazione e prima di riavviare il sistema, andranno installati anche
i moduli ed eventualmente gli header del kernel.
e diamo Invio. Poi confermiamo la scelta, sempre col tasto 1 seguito da Invio:
28 3. Installare Slackware
Ora possiamo fare il login (l’ingresso nel sistema) come root (che è l’amministratore del sistema), per
avviare il setup vero e proprio al prompt (che appare: root@slackware:/#) e digitando la stringa root:
In questa fase non c’è alcuna password da immettere. Visto che abbiamo già preparato il disco fisso,
trascuriamo la proposta di formattarlo usando cfdisk o fdisk. Avviamo l’installazione digitando la
stringa setup:
3.4. Opzione ADDSWAP 29
Il setup proporrà le seguenti opzioni: KEYMAP, ADDSWAP, TARGET, SOURCE, SELECT, IN-
STALL, CONFIGURE. L’opzione KEYMAP non ci interessa, visto che abbiamo già impostato la tastie-
ra.
Dobbiamo impostare la partizione di swap. Poiché il (primo) disco fisso IDE è identificato come hda
(sappiamo già che un eventuale secondo disco fisso risulterebbe hdb), scegliamo la partizione di swap
(nel nostro esempio /dev/hda2):
Se l’abbiamo già formattata come tale, Slackware la riconosce automaticamente e ci propone – chie-
dendoci «Check your swap partitions for bad blocks?» – di riformattarla con o senza il controllo del-
l’integrità (il quale, di default, non viene compiuto) e quindi la attiva automaticamente col comando
swapon:
30 3. Installare Slackware
Diamo l’OK quando il programma ci avverte che il file di swap è stato correttamente configurato e
aggiunto a /etc/fstab:
Scegliamo quindi la partizione (o le partizioni) in cui installare il sistema operativo (nel nostro esem-
pio /dev/hda1), e battiamo Invio. Si tratta della partizione di root, indicata da una semplice barra o slash
(/).
3.5. Opzione TARGET 31
Anche in questo caso, se l’abbiamo già formattata essa verrà riconosciuta subito da uno scanning
automatico, ma possiamo effettuare un’ulteriore scelta e cioè mantenere il file system EXT3 oppure
riformattarla EXT2 o Reiserfs:
Possiamo ora (ri)formattare la partizione, con o senza controllo, oppure rinunciare alla formattazio-
ne:
Nel caso si scelga di riformattare nei formati EXT2 o EXT3, il programma chiederà di indicare la
densità degli inode (cioè gli «index node» dove vengono registrati i nomi dei file e gli indirizzi dei
blocchi in cui sono situati i file):
32 3. Installare Slackware
Ogni file richiede almeno un inode per essere indicizzato, quindi è necessario creare un equilibrio
fra le dimensioni del disco fisso e il numero degli inode in base al quale sarà stabilita la quantità di file
che è possibile creare (mentre il resto dello spazio è dedicato a blocchi di dati). Di default viene creato
un inode ogni 4096 byte, proposta adatta alla maggior parte delle situazioni e che va modificata in 2048
o addirittura in 1024 solo se si prevede di creare nel disco fisso un elevatissimo numero di file molto
piccoli.
Slackware propone Reiserfs come default. Anche in questo caso il programma di installazione può
effettuare una formattazione veloce oppure con verifica (che è naturalmente più lenta):
Se all’avvio abbiamo scelto il kernel 2.6.17.13 (cioè huge26.s), allora la scelta del file system si fa più
ampia: è infatti incluso il supporto non solo per EXT2, EXT3 e Reiserfs, ma anche per jfs e xfs.
Ovvio che, se stiamo utilizzando il programma di installazione solo per apportare delle modifiche
a una partizione preesistente e contenente dei dati, sceglieremo di non formattare e saremo avvertiti in
questo senso dal messaggio «partition will not be reformatted».
Una volta che la partizione selezionata è stata vista dal programma come «in use», confermiamo che
abbiamo terminato di aggiungere partizioni e facciamo scrivere le informazioni in /etc/fstab:
3.6. Opzione SOURCE 33
Se invece intendiamo aggiungere altre partizioni, selezioniamo via via la successiva e compiamo
le stesse operazioni. Se abbiamo anche partizioni in NTFS o in FAT32, esse vengono rilevate dal pro-
gramma di installazione, che ci chiede se vogliamo aggiungerle (Slackware 9.1 riconosceva invece so-
lo le partizioni FAT32). In questo caso dobbiamo indicare un punto di montaggio per potervi acce-
dere in seguito (un pick mount point): lo indicheremo con un nome a piacere, precisando che, secon-
do la migliore tradizione Unix, la partizione va montata in /mnt (scriviamo cioè una cosa del tipo:
/mnt/nome_della_partizione, come /mnt/Windows).
Qui consideriamo soltanto il caso di un’installazione da CD o DVD, opzione che pertanto sceglie-
remo. Il programma di installazione ci chiede di attivare una ricerca automatica del dispositivo o di
indicarlo manualmente. Scegliamo la prima soluzione. Quindi si avvia la ricerca della presenza di un
CD o DVD di installazione:
34 3. Installare Slackware
Il programma avverte quando il dispositivo viene individuato. Di norma, esso starà nel lettore CD
o DVD, identificato come /dev/hdc o /dev/hdd, anche se ciò dipende dalle porte in cui sono installate
queste unità; verosimilmente, in un computer con dischi SATA il lettore potrebbe essere, ad esempio,
/dev/hda:
Scheda n. 6
I pacchetti di Slackware 11.0
Vediamo in breve che cosa contengono i vari pacchetti presenti in Slackware 11.0 (una descrizione
più dettagliata, pacchetto per pacchetto, si legge nel file PACKAGES.TXT presente nel CD 1). Nel loro
insieme, essi ammontano – decompressi – a circa 3482,4 MB.
3.7. Opzione SELECT 35
Serie di pacchetti y (compressi 2,2 MB, decompressi 5,3 MB) contiene alcuni giochi testuali.
Bittorrent strumento che utilizza la capacità di upload dei computer che stanno scaricando dei file per
redistribuirli ad altri computer in download
Checkinstall utilità per configurare, compilare e creare automaticamente file .tgz (come anche .deb e
.rpm) partendo dai sorgenti
Grub il bootloader alternativo a Lilo
J2sdk il pacchetto Java dotato degli strumenti di sviluppo
K3b sontuoso frontend per la masterizzazione di CD e DVD
Parted programma per la gestione delle partizioni
Serie di pacchetti t (compressi 101,3 MB, decompressi 245,2 MB) contiene Tetex, una completa distri-
buzione di programmi, utilità e font atti alla fotocomposizione per elaborare documenti TEX o
LATEX.
Serie di pacchetti tcl (compressi 6,3 MB, decompressi 15,6 MB) contiene il supporto per i linguaggi di
scripting Tcl/Tk/TclX.
Serie di pacchetti xap, seconda parte contiene altre applicazioni che girano sotto il server grafico. Pre-
cisamente, include il browser SeaMonkey (che rimpiazza il vecchio Mozilla), un client per chattare
(Gaim), e infine un programma di disegno e fotoritocco (Gimp).
O si hanno già le idee molto chiare su ciò che ci serve, oppure – è il caso dei principianti – è meglio
abbondare. Potremo in seguito decidere, a ragion veduta, che cosa ci interessa e che cosa no, e rimuovere
eventuali pacchetti inutili. Scegliere troppo poco potrebbe originare problemi e malfunzionamenti.
Innanzitutto dobbiamo selezionare i gruppi di pacchetti. Alla voce «PACKAGE SERIES SELEC-
TION» selezioniamo tutto con la barra spaziatrice, ad eccezione della voce KDEI, altrimenti il program-
ma installerà tutti i pacchetti linguistici, che occupano molto spazio e la cui utilità è quanto meno dubbia.
Installeremo in un secondo momento, al primo riavvio, il solo pacchetto di KDEI per la lingua italiana:
38 3. Installare Slackware
FULL installa tutti i pacchetti senza porre alcuna richiesta di scelta o di conferma.
NEWBIE installa automaticamente tutti i pacchetti indispensabili e chiede se installare o meno, uno
a uno, quelli opzionali, fornendone una breve descrizione e indicando lo spazio che occupano.
L’opzione Skip passa al pacchetto successivo.
MENU simile a NEWBIE, non mostra i pacchetti indispensabili che installa automaticamente e presenta
un menu unico con tutti i pacchetti opzionali, senza descriverli uno alla volta.
EXPERT installa a richiesta i singoli pacchetti, esigendo continue scelte da compiere mediante un menu
interattivo. Conferisce un controllo totale sull’installazione, e consente anche di escludere i pac-
chetti essenziali (ed è perciò vivamente sconsigliata agli inesperti, in quanto potrebbe risultarne
un sistema corrotto o non funzionante).
CUSTOM adotta dei tagfiles (particolari file che dicono al programma setup quali pacchetti devono
essere installati) creati dall’utente nella directory corrente dei pacchetti.
Queste due ultime modalità sono utili per installare velocemente Slackware su più macchine, e di
conseguenza destinate a utenti avanzati.
Pertanto, dei vari sistemi di installazione proposti, la soluzione gordiana è la prima, FULL, che
installa tutto senza mettere il neofita in difficoltà.
Inizia quindi la decompressione e la copia dei file, che avverte dei pacchetti organizzati per lettere:
A un certo punto il programma ci chiederà di inserire anche il successivo CD, e così fino all’esauri-
mento dell’installazione:
40 3. Installare Slackware
Quindi si avvia la configurazione automatica del sistema. Per una visione d’insieme della destinazio-
ne dei vari pacchetti e, più in generale, della struttura del file system di Slackware (che presenta delle pe-
culiarità rispetto ad altre distribuzioni GNU/Linux), vedi Scheda n. 9 – Le directory di Slackware 11.0 .
Posto che bare.i abbia tutte le caratteristiche che ci servono, saltiamo la scelta selezionando «Skip
this menu» e verrà usato per l’appunto bare.i. Se invece abbiamo una diversa necessità, ad esempio se il
nostro disco fisso è SATA, sceglieremo di installare un diverso kernel (nel caso specifico sata.i) dal CD.
Se infine avremo scelto di installare il kernel 2.6 da CD o DVD, allora sceglieremo questo. Poiché i kernel
sono contenuti nel CD 1, nel primo caso sarà necessario cambiare il CD nel lettore.
3.8. Rifinire l’installazione 41
Una volta creato il dischetto, è possibile crearne un secondo per sicurezza, o passare alla fase succes-
siva dell’installazione:
42 3. Installare Slackware
Nel caso avessimo dei problemi a far partire il programma dal disco fisso, saremo in grado di ri-
correre al floppy, anche se in realtà è sempre possibile far partire il sistema dal CD1 di Slackware. Per
evitare spiacevoli sorprese, è opportuno controllare il buon funzionamento del floppy provando ad av-
viare da questo. Inoltre, il floppy può essere creato in qualsiasi momento con l’utilità pkgtool oppure
col comando: makebootdisk.
Scheda n. 7
La gestione dei floppy
Come in tutti i sistemi GNU/Linux, anche in Slackware la gestione dei floppy è riservata a root. Qui
sono indicati i comandi fondamentali e più usati.
Formattare un floppy
a) Per effettuare una formattazione di basso livello, dare il comando: fdformat /dev/fd0[H1440].
L’opzione -n disabilita la verifica, che altrimenti viene effettuata di default.
b) Per creare il file system EXT2 dare il comando: mkfs.ext2 /dev/fd0.
c) Per creare il file system FAT dare il comando: mkfs -t msdos -c /dev/fd0. Anche qui L’opzione
-c verifica la correttezza della formattazione.
In tutti questi casi è inoltre sempre possibile aggiungere il parametro H1440 per specificare la densità
del floppy, con la seguente sintassi: fdformat /dev/fd0H1440.
d) Per formattare un floppy con capienze superiori, si ricorre all’utilità superformat. I formati
possibili sono i seguenti, ciascuno seguito dal relativo comando:
1743 KB = superformat -f /dev/fd0 sect=21 cyl=83
1840 KB = superformat -f /dev/fd0 tracksize=23b mss 2rr ssize=2KB
1992 KB = superformat -f /dev/fd0 tracksize=12KB cyl=83 mss
Copiare un floppy
Il metodo più semplice e veloce per copiare direttamente un floppy è ricorrere al comando diskcopy.
Un altro metodo nel creare nel disco fisso una immagine del floppy di origine e nel trasferirla poi nel
floppy di destinazione. Questi sono i passaggi:
a) creare nella directory /root l’immagine col comando: dd if=/dev/fd0 of= /floppy.img
b) inserire il floppy di destinazione
c) copiare l’immagine nel floppy di destinazione col comando: dd if= /floppy.img of=/dev/fd0
[conv=sync]
e) rimuovere il file di immagine *.img nella directory /root.
Poiché a volte può generarsi un errore di I/O se l’ultimo settore del floppy non è tutto scritto, il
processo non va a buon fine. Per evitarlo, basta aggiungere al comando descritto al punto c) l’opzione
conv=sync.
Tutte queste procedure sovrascrivono direttamente il floppy, senza avvertire se esso contiene dei
dati; è perciò opportuno controllare se il disco di destinazione può essere, eventualmente, sovrascritto.
Possiamo configurare, se presente, il modem. Ovviamente, i passaggi ulteriori dipendono dal tipo di
modem che possediamo, dalle sue caratteristiche e dalla porta in cui è inserito:
3.8. Rifinire l’installazione 43
Possiamo abilitare HOTPLUG all’avvio. È una scelta da fare senz’altro se si usa il kernel 2.4.33.3,
perché hotplug si occupa di individuare e gestire le periferiche plug&play:
Se invece abbiamo installato un kernel sella serie 2.6, possiamo rinunciare a hotplug e passare la
gestione delle periferiche a udev.
Ora dobbiamo installare Lilo, il bootloader o caricatore di boot (Lilo è l’acronimo di «LInux LOader»),
e cioè il programma che si occupa di farci scegliere all’avvio il sistema operativo da montare, Windows,
Slackware o eventuali altri sistemi. In questa fase è meglio affidarsi all’installazione automatica, mentre
modificheremo Lilo in un secondo momento, per meglio piegarlo alle nostre necessità:
44 3. Installare Slackware
Delle tre opzioni proposte (ROOT, FLOPPY, MBR), scegliamo di installare Lilo sull’MBR (Master
Boot Record), che sovrascrive il bootloader di Windows.
L’installazione sulla directory di root richiede che la partizione sia resa avviabile, cosa che si può fare
con fdisk. L’installazione su floppy richiede naturalmente il suo inserimento nell’apposita unità ogni
qualvolta si debba lanciare Slackware.
L’avviso secondo cui l’installazione di Lilo nell’MBR è «possibly unsafe» non deve preoccupare. Ciò
si verifica solo in casi rari e particolari: se il BIOS non supporta la capacità del disco e sono installati soft-
ware come MaxBlast o EZBios, oppure se è già installato un altro bootloader come System Commander
o Boot Magic. Con i computer più recenti e le versioni correnti dei programmi, tuttavia, non c’è ragione
di temere che l’installazione di Lilo nell’MBR possa causare danni o non avviare regolarmente il sistema.
È importante ricordare alcune cose:
a) il bootloader di GNU/Linux ci permette di scegliere anche altri sistemi operativi, come appunto
Windows. Al contrario, il bootloader di Windows non ce lo permette, anche se esiste un modo per
modificarlo in questo senso; esiste un’utilità che effettua automaticamente l’aggiunta di ulteriori sistemi
operativi OS/2 o GNU/Linux da far partire col bootloader di Windows, e cioè BootPart (reperibile
all’indirizzo: http://www.winimage.com/bootpart.htm).
b) Il bootloader di Windows viene così sovrascritto, ma se poi decidessimo di disinstallare Slack-
ware, per eliminare anche Lilo e avviare Windows sarà sufficiente ripartire con un floppy di avvio di
Windows XP e lanciare il comando fdisk /mbr (dalla console di ripristino di Windows 2000 va invece
lanciato fixmbr), oppure, prima di eliminare Slackware, cancellare Lilo da questa col comando lilo -u
oppure lilo -U (il primo comando ripristina il settore di boot salvato in /boot/boot.nnnn dopo averlo
3.8. Rifinire l’installazione 45
convalidato in base a un timestamp, cioè l’indicazione di una data e di un’ora, il secondo si limita al puro
e semplice ripristino). Windows ripartirà senza problemi.
c) Se abbiamo già installato Windows nel sistema, la procedura è del tutto linerare: Lilo sovrascriverà
il bootloader di Windows. Se invece si installa Windows dopo Slackware, il suo bootloader sovrascriverà
Lilo. Di conseguenza sarà necessario entrare in Slackware col floppy di avvio oppure col CD 1 o col DVD
e poi da lì reinstallare Lilo.
Se vogliamo migliorare la qualità grafica delle scritte di avvio con un carattere più piccolo e luminoso
(e poter vedere anche la simpatica immagine del pinguino in alto a sinistra sullo schermo), dobbiamo
attivare il frame buffer per la console:
Infine c’è la possibilità di passare a Lilo alcune righe opzionali («append») per attivare funzioni od
opzioni particolari, come l’emulazione SCSI:
Nel prosieguo considereremo il caso di un mouse PS/2 (il tipo ancor oggi maggiormente diffuso e
che non crea problemi con GNU/Linux).
GPM rende possibile l’uso del mouse all’interno della console (la «finestra di comando» di GNU/Li-
nux), cosicché potremo scorrere il testo con la rotellina del mouse o fare dei comodi copia/incolla altri-
menti impossibili (per inserire il testo copiato si preme la rotellina del mouse nel punto di inserimento;
nei mouse privi di rotellina, questa funzione può essere emulata premendo contemporaneamente i due
tasti).
Httpd il web server Apache. Vi si accede aprendo un browser e digitando l’indirizzo IP: http://127.0.0.1,
dove è possibile rinvenire anche la documentazione. Questo servizio serve a coloro che voglio-
no fare del loro computer un server accessibile dall’esterno. In questo caso è necessario o ave-
re un IP statico, oppure fruire di servizi come no-ip (all’indirizzo http://www.no-ip.com oppure
http://www.dynu.com). Ma si tratta di una funzionalità che difficilmente interessa un principiante.
Inetd il BSD Inet Daemon, che serve a far funzionare servizi come time, ftp, talk, finger e altri ancora.
Esso ascolta sulle porte specificate nel suo file di configurazione e fa avviare il relativo servizio
nel momento in cui ne viene fatta richiesta. Per questo è chiamato anche «superdemone». Esso
ottimizza le risorse di sistema, avviando il programma che gestisce un determinato servizio solo
quando viene effettivamente richiesto. La sua configurazione precisa può essere effettuata in un
secondo momento (ad esempio si possono chiudere le porte non in uso, oppure può essere attivato
solo per determinati servizi a basso e occasionale traffico). C’è chi sostiene che valga comunque
la pena di abilitarlo, chi invece lo sconsiglia, perché tale servizio tiene aperte tutte le porte del
computer, e ciò potrebbe rappresentare un rischio per la sicurezza.
Ip_forward serve se il computer deve fungere da router. Normalmente è un servizio che non viene
utilizzato, se non per esigenze particolari.
MySql il server di database offerto da Slackware, potente e versatile. Non è questa la sede per descrivere
il funzionamento di MySql. Se però intendiamo servircene, selezioniamo questa opzione. Non c’è
da preoccuparsi se poi, al caricamento del programma, riceveremo un messaggio che, dopo aver
cercato di avviarlo, è costretto a chiuderlo, avvertendoci con un laconico «mysql ended». In effetti
il programma, se non trova già settati i suoi file di configurazione, non riesce a partire. Sarà un
compito successivo imparare a usarlo.
RPC RPC portmapper demon. Serve, fra le altre cose, a gestire NFS, ossia per usare il Network file
system qualora sia nostra intenzione condividere file con altri computer aventi GNU/Linux come
sistema operativo.
Samba il gestore delle reti tra GNU/Linux e Windows od OS/2. Serve appunto condividere file e
stampanti fra computer aventi GNU/Linux come sistema operativo e altri aventi Windows od
OS/2.
Saslauth server di autenticazione basato sulla libreria SASL, usato sovente nei server di posta elettro-
nica.
Scanluns effettua un’analisi (scannig) dei LUNs (acronimo di «Logical Unit Numbers») alla ricerca di
dispositivi USB.
Sendmail il server per gestire la posta elettronica. Se non abbiamo questa esigenza, possiamo sorvolare.
Syslog serve per poter registrare e leggere i messaggi di sistema presenti in /var/log.
In ogni caso, UTC (acronimo di Tempo Universale Coordinato) può essere attivato sui computer che
montano solo GNU/Linux; se invece si hanno nel computer sistemi operativi diversi (come Windows),
50 3. Installare Slackware
allora è obbligatorio scegliere Local time, perché altrimenti, col cambio dell’ora legale, si avrebbero degli
errori.
Sarà possibile in seguito modificare le impostazioni dell’ora con l’utilità pseudografica timeconfig.
Sarà comunque sempre possibile passare da un Desktop Environment all’altro mediante il comando
xwmconfig. Inoltre si potranno poi aggiungere dei Desktop Environment non inclusi in Slackware, co-
me Gnome, Enlightenment e molti altri. Ormai i gestori di finestre in GNU/Linux sono estremamente
integrati, e allo stesso tempo coerenti col sistema operativo e molto vari nella grafica. Slackware offre
innumerevoli Desktop Environment.
KDE è, con Gnome, il sistema più potente e dotato di strumenti e di opzioni, ma anche il più pesante, nel
senso che richiede innumerevoli risorse. Se il computer è dotato di parecchia RAM, si può optare
tranquillamente per KDE. KDE presenta in aggiunta, per la configurazione di molti aspetti del
sistema, dei propri strumenti, anche se a volte essi sembrano un po’ invasivi e non sempre hanno
un funzionamento perfetto: è dunque meglio ricorrere ai più tradizionali e collaudati metodi.
XFCE presenta un’interfaccia leggera, ma altamente funzionale. Utilizza le librerie GTK+ e ha un pro-
prio Window Manager. La gestione grafica è altamente personalizzabile e con funzioni avanzate,
grazie a un un file manager per gestire il sistema, ma priva di icone del desktop. Possiede inoltre
un pannello per lanciare le applicazioni, un gestore dei suoni, un modulo per il pager e uno di
supporto a Gnome.
3.8. Rifinire l’installazione 51
Blackbox presenta un’interfaccia leggerissima. Il desktop è vuoto e i programmi si aprono con menu
a tendina attivati dal mouse. Non supporta effetti grafici particolari, ma questo lo rende adatto a
computer con scarse risorse. Diverse sue caratteristiche sono personalizzabili direttamente dai file
di configurazione.
Fluxbox interfaccia grafica scarna, senza pannelli o icone, ma che offre la possibilità di aprire innu-
merevoli linguette per i vari programmi. È completamente personalizzabile (supporta infatti le
DockApp di Window Maker, che gli offrono molti strumenti aggiuntivi) e si gestisce per intero
attraverso il mouse. È tuttavia possibile, attraverso applicazioni aggiuntive (come ROX), dotarlo
di icone sul desktop e di un file manager. Deriva da BlackBox.
Wmaker interfaccia grafica leggera, ma funzionale e dotata di innumerevoli strumenti. Inoltre è alta-
mente personalizzabile. Usa prevalentemente il mouse, ma possiede un menu per lanciare appli-
cazioni e configurare alcuni aspetti del sistema.
FVXM2 interfaccia grafica molto leggera. I programmi vengono eseguiti senza integrazione grafica, cioè
in modo totalmente indipendente dall’interfaccia stessa.
TWM è forse la più leggera delle interfacce grafiche. Anche in questo caso il desktop è vuoto e i
programmi si aprono con menu a tendina attivati dal mouse.
Scheda n. 8
Come installare Gnome
Gnome è, con KDE, il Desktop Environment più ricco e sviluppato. Le più recenti versioni (a partire
dalla 2.10) presentano importanti nuove funzionalità, soprattutto nell’ambito della grafica. A differen-
za di KDE, che appare un insieme estremamente unitario di pacchetti, il team di Gnome non sembra
tuttavia star perseguendo uno sviluppo parallelo di tutte le applicazioni.
Slackware e Gnome
Dalla versione 10.2 Slackware ha abbandonato Gnome; su questa scelta si è espresso lo stesso Volker-
ding, che ha denunciato gli enormi problemi di compilazione di Gnome. Nel Changelog del 26 marzo
2005 egli infatti scriveva:
gnome/*: rimosso dalla -current e lasciato al supporto e alla distribuzione della comunità.
Non intendo riprendere tutti i motivi che stanno dietro a questa scelta, che però è stata valu-
tata per più di quattro anni. Esistono già dei buoni progetti per dotare Slackware di GNOME
per quelli che lo desiderano, e sono più completi di quanto Slackware non abbia fornito in
passato. Perciò, a chi cerca GNOME per Slackware -current io raccomando dei pacchetti ben
costruiti in questi due progetti, che perseguono una politica di minima interferenza col siste-
ma base di Slackware:
http://gsb.sf.net
http://gware.sf.net.
C’è anche Dropline, naturalmente, che è assai conosciuto. Tuttavia, a causa della sua po-
litica di aggiungere PAM e di sostituire numerosi pacchetti di sistema (come l’intero sistema
X11) con la sua versione, non mi sento di dare lo stesso assenso a Dropline. Nondimeno,
esso rimane un’altra scelta, e dopo tutto il sistema è il vostro, per cui menziono anche quel
progetto:
http://www.dropline.net/gnome.
52 3. Installare Slackware
Per favore, non si interpreti tutto ciò come una sottovalutazione di GNOME in sé, che
(sebbene di solito richieda di essere ulteriormente corretto e risistemato rispetto a com’è for-
nito, in misura maggiore, diciamo, di KDE o XFce) è una buona scelta per il desktop. Allo
stesso modo, di scelte ce ne sono molte altre, ma Slackware non intende fornirle tutte. GNO-
ME è ed è sempre stato una realizzazione in divenire (anche le versioni «stabili» di solito
non sono ancora perfezionate), che richiede una squadra per star dietro a tutti i cambiamenti
(molti dei quali non sono spesso ben documentati). Io mi auguro davvero che questa scelta
migliorerà sia la qualità di Slackware, sia la qualità (e la quantità) delle opzioni di GNOME
per essa.
In ogni caso, esistono i tre progetti non ufficiali citati anche da Volkerding per consentire di usare su
Slackware questo Desktop Environment.
Freerock Gnome
Il primo progetto è Freerocks Gnome, reperibile all’indirizzo: http://gsb.freerock.org e costituito in
verità da due filoni: il primo, indicato dalla sigla GSB (acronimo di «Gnome SlackBuild»), è un insieme
di SlackBuild atti a compilare i pacchetti di Gnome dai sorgenti. Il secondo, indicato dalla sigla FRG
(acronimo di «Freerock Gnome»), consiste nei pacchetti già compilati, pronti per l’installazione. La pri-
ma opzione presuppone una certa confidenza con Slackware e con i sistemi di pacchettizzazione. La
seconda è offerta in svariate modalità: un installer di rete, il ricorso ai repository di slapt-get, una ISO
contenente tutti i pacchetti.
È possibile scaricare il net-installer e lanciarlo mediante lynx (il browser testuale), ovviamente da
root e senza il server X attivo, col comando:
lynx --source http://gsb.freerock.org/net-install | sh
In tal modo di otterrà l’ultima versione stabile. Se invece si vuole avere la current, il comando sarà:
lynx --source http://gsb.freerock.org/net-install/current | sh
In alternativa si può usare slapt-get, dopo aver aggiunto il repository di Freerocks e la versione
che si intende scaricare nel file di configurazione /etc/slapt-get/slapt-get.rc (senza dimenticare di dare:
slapt-get --update dopo l’aggiunta). A questo punto il processo si avvia col comando:
slapt-get --install frgnome.
Come ultima alternativa, si può scaricare una ISO che contiene già i pacchetti compilati. In questo
caso si dovrà seguire la seguente procedura:
1) creare una directory di montaggio col comando: mkdir /mnt/iso
2) montare l’immagine col comando: mount -t iso9660 file.iso /mnt/iso -o loop
3) andare nella directory dov’è montata l’immagine col comando: cd /mnt/iso
4) installare i file col comando: ./frg_install.sh per un’installazione automatica. Il programma chiede
dapprima se si intenda effettuare un’installazione minimale (1) oppure completa (2), e quindi quale
versione di alcuni pacchetti (eventualmente dotati di patch specifiche) si voglia installare. Infine chiede
l’autorizzazione ad abilitare alcuni script che collocherà in /etc/rc.d (e precisamente rc.howl, rc.saslauthd
e rc.openldap).
È naturalmente sempre possibile ricorrere a un’installazione interamente manuale, da effettuarsi
col comando: upgradepkg --install-new *.tgz. Attenzione a non usare semplicemente installpkg,
oppure ci si ritroverà con diversi pacchetti duplicati (quelli già presenti in Slackware), in due differenti
versioni.
Freerock può creare qualche lieve conflitto nel sistema, peraltro risolvibile in maniera molto semplice.
Poiché tali problemi mutano con le varie realizzazioni, andrà sempre tenuta sotto controllo la pagina
delle FAQ di Freerock, all’indirizzo: http://gsb.freerock.org/faqs.
Freerock, nella versione current, è attualmente compatibile con Slackware 10.2 e coi kernel della serie
2.4. Tuttavia alcune funzioni, quali lo Gnome Volume manager, richiedono il kernel 2.6.
3.8. Rifinire l’installazione 53
Gware
Il secondo progetto è GWARE, reperibile all’indirizzo: http://gware.sf.net, che fornisce dei pacchetti
non intrusivi per Slackware, cioè dotati della massima compatibilità con la distribuzione. Gware pre-
suppone che sia già presente nel sistema una ventina di pacchetti indispensabili. Inoltre modifica pochi
tra quelli già presenti e installa, oltre a quelli di Gnome, alcuni pacchetti richiesti per attivare funzio-
nalità aggiuntive, e cioè fam, howl, dbus e hal, che modificano alcuni file di sistema o installano nuo-
vi file di configurazione o di avvio. Infine, richiede la modifica manuale di un file per far funzionare
correttamente udev.
Prima dell’installazione, è pertanto necessario leggere attentamente il documento sui requisiti,
presente all’indirizzo: ftp://ftp.gware.org/10.2/2.12.0/packages/INSTALL.
I passaggi per l’installazione sono i seguenti:
1) si scarica uno script che automatizza tutte le operazioni. Per la revisione G (allo stato attuale, la più
recente), lo script prende il nome di get-gware-G.sh; ricorrendo a wget, si dà il comando:
wget ftp://gware.org/10.2/2.12.0/packages/get-gware-G.sh
2) si rende eseguibile lo script col comando: chmod +x get-gware-G.sh
3) si avvia lo scaricamento e l’installazione dei pacchetti col comando: ./get-gware-G.sh
Gware sostituisce alcuni pacchetti con la sua propria versione, modifica /etc/inetd.conf e
/etc/rc.d/rc.local e aggiunge alcuni file di configurazione (/etc/rc.d/rc.howl, /etc/rc.d/messagebus,
/etc/rc.d/rc.hald).
Anche Gware – attualmente compatibile con Slackware 10.2 – può creare qualche lieve proble-
ma nel sistema, peraltro risolvibile in maniera molto semplice. Poiché tali problemi mutano con le
varie realizzazioni, andrà sempre tenuta sotto controllo la pagina delle FAQ di Gware, all’indirizzo:
http://www.gware.org/faq.php.
Dropline
Il terzo progetto è Dropline, reperibile all’indirizzo: http://www.dropline.net/gnome; esso si differen-
zia dai primi due per seguire una politica relativamente autonoma da Slackware, ad esempio fornendo
proprie versioni modificate del sistema X11 e adottando pacchetti per la sicurezza, come PAM, estranei
alla distribuzione. Si presenta pertanto come piuttosto intrusivo nel sistema. Va ricordato che Dropline
Gnome è ottimizzato per i686, gira col kernel di default di Slackware, su cui viene compilato, ma richie-
de il kernel 2.6 per attivare alcune funzioni come il montaggio automatico dei dispositivi. Infine, può
non funzionare correttamente su versioni più vecchie di Slackware e sulla current.
Innanzitutto è necessario scaricare dal sito di Dropline Gnome l’installer, un pacchetto nel classico
formato .tgz, da installare con installpkg. Si lancia quindi il comando dropline-installer e a questo
punto, dal menu, si scelgono le operazioni da effettuare. Il menu presenta alcune voci, tutte facilmente
comprensibili:
Installa = installa una copia nuova e integrale di Dropline-Gnome.
Aggiorna = aggiorna un’installazione precedente coi pacchetti più recenti.
Vedi aggiornamenti = si limita a mostrare l’elenco dei pacchetti disponibili per un eventuale
aggiornamento.
Solo download = scarica i pacchetti disponibili senza installarli. Essi vengono resi reperibili di default
nella directory /var/cache/dropline-installer per una successiva installazione manuale. In questo caso è
conveniente installare dapprima il pacchetto Orbit, atto ad aggiornare il database dei pacchetti di Gnome
presenti nel sistema.
Rimuovi = disinstalla Dropline-Gnome.
Preferences = consente di settare alcuni parametri di installazione:
Impostare sorgente = consente di scegliere il supporto dei sorgenti (rete, CD-Rom, disco fisso).
Impostare proxy = consente di specificare un proxy HTTP.
54 3. Installare Slackware
Impostare directory = consente di scegliere una directory diversa da quella di default per conservare
i pacchetti scaricati.
Keep old Programs = mantiene i pacchetti vecchi o li elimina una volta scaricati quelli più recenti.
Keep Install Files = mantiene i vecchi file di installazione o li elimina una volta effettuati gli
aggiornamenti.
Esci = esce dal menu.
Il programma di installazione costruisce una lista dei pacchetti, organizzati in categorie. Ne citiamo
i più signficativi:
Application Development = programmi di sviluppo come Pkgconfig, Intltool e Glade, e inoltre della
documentazione.
Desktop Extras = l’editor per gconf, alcuni giochi, Ghex (editor esadecimale).
GNOME Desktop = la piattaforma Gnome essenziale.
Internet Software = Firefox, Thunderbird, Drivel, Epifany, Gaim, GnomeMeeting, Xchat.
Media Software = Totem, Rhytmbox, Eince, Gthumb0, Gimp, Gtkam, Inkscape.
Office Applications = la suite Office di Gnome, Evolution (in preparazione anche OpenOffice).
System Software = pacchetti di sistema indispensabili (librerie ecc.) e i pacchetti del server X.
È possibile scegliere le categorie nel loro insieme o scegliere pacchetto per pacchetto. Se si opta per
l’installazione per categorie, l’installer offre una ulteriore scelta: un’installazione completa (di quasi 250
pacchetti), un’installazione selettiva e una minimale.
Infine, è disponibile anche la ISO per creare un CD in cui si troveranno tutti i pacchetti.
È opportuno scegliere, come sempre, una stringa non troppo semplice od ovvia, consistente in una
sequenza di lettere maiuscole e minuscole, numeri e simboli alfanumerici. Se risulta troppo semplice (ad
esempio breve e composta da sole lettere minuscole o, peggio, consistente in una parola del dizionario),
è il programma stesso a non accettarla. Impostare una password non sembra strettamente necessario,
perché è ovviamente possibile accedere al sistema anche senza; se poi noi siamo l’unico utente del nostro
computer, la cosa potrebbe ritenersi del tutto trascurabile. In realtà, la configurazione di alcuni program-
mi (come CUPS o Samba mediante SWAT) richiede obbligatoriamente una password (non si riesce ad
entrare in CUPS o in SWAT senza password anche se si è già root).
Una volta digitata la password, se essa viene accettata, dobbiamo digitarla una seconda volta per
sicurezza:
3.8. Rifinire l’installazione 55
e infine riavviare il sistema con Ctrl+Alt+Canc, dopo aver tolto il CD dal lettore:
56 3. Installare Slackware
Scheda n. 9
Le directory di Slackware 11.0
L’organizzazione di Slackware, che rispetta il Linux Filesystem Hierarchy Standard (LFHS), non
è troppo dissimile da quella delle altre distribuzioni GNU/Linux; tuttavia non manca di alcune
peculiarità. Vediamo com’è articolata la struttura delle principali directory.
/bin contiene i file binari (cioè eseguibili) essenziali per il funzionamento del sistema operativo,
accessibili non solo a root, ma a tutti gli utenti. Di solito viene modificata solo a causa di
aggiornamenti.
/boot contiene i file di avvio per l’esecuzione del sistema operativo, cioè il kernel e gli altri file di
configurazione dell’avvio del sistema.
/cdrom è il punto di montaggio del lettore CD, automaticamente rilevato durante l’installazione.
/dev contiene la mappatura dei dispositivi, cioè i file che corrispondono alle periferiche.
/etc contiene gli script e i file di configurazione del sistema (dai file di configurazione di X Window al
database utenti, fino agli script di inizializzazione del sistema) e di numerosi programmi.
/home contiene le directory principali degli utenti e le relative subdirectory (esclusa quella di root).
/lib contiene le librerie del sistema (le più importanti sono le librerie C, il dynamic loader, le librerie
ncurses) e, nella subdirectory /modules, i moduli del kernel.
/lost+found all’avvio del sistema, viene effettuato un controllo di eventuali errori del file system. Se ne
vengono individuati, viene lanciato il programma fsck per tentare di correggerli. Le parti corrette
del file system vengono scritte per l’appunto nella directory /lost+found.
/media contiene i punti di montaggio delle periferiche rimovibili (come CD, DVD, floppy e pendrive).
/mnt contiene i punti di montaggio delle periferiche fisse (come i dischi fissi).
/opt contiene i pacchetti opzionali. Di default, Slackware installa qui anche KDE. Non è cattiva norma
installare in questa directory gli ulteriori pacchetti aggiunti dagli utenti.
/proc punto di montaggio per interagire col kernel. Si tratta di un file system virtuale che non risie-
de realmente sul disco. Contiene informazioni sul kernel e sui processi in esecuzione, conservate
sotto forma di file in questa directory. Reciprocamente, è possibile inviare informazioni al kernel
attraverso alcuni di questi file.
3.9. Installare Slackware da floppy 57
/root la directory principale (home) dell’utente root. Essa è collocata per l’appunto in /root e non in
/home, come per gli altri utenti del sistema. Infatti, nel caso che la home di root fosse una partizione
diversa da / e non fosse possibile montarla per qualche motivo, all’utente root sarebbe difficile
eseguire il login per risolvere il problema, essendo la sua home directory collocata sul file system
danneggiato.
/sbin contiene i comandi del sistema operativo che solo root può lanciare. Se un utente cerca di lanciarli
dal suo account, riceverà il messaggio: «command not found», poiché /sbin non risiede nel suo
path. Per trasformarsi in root e poterli così lanciare, si darà il comando su per restare comunque
sempre nella directory di partenza o il comando su - per trovarsi nella home di root. In alternativa,
andrà indicato da parte dell’utente il percorso completo dell’eseguibile.
/tmp contiene i file temporanei, ma anche una serie di directory di configurazione di alcuni dispositivi.
Certe distro, ma non Slackware, la puliscono in modo automatico all’avvio del sistema.
/usr contiene i programmi a disposizione degli utenti. La subdirectory /usr/X11R6 contiene lo X system
del sistema (e cioè il server grafico), i cui file di configurazione risiedono invece in /etc/X11.
/var contiene file di log (cioè i resoconti) del sistema e dei file gestiti dai processi di sistema (come la
cache dei dati). Questa directory è pertanto utilizzata per conservare tutte quelle informazioni che
cambiano di frequente.
58 3. Installare Slackware
Capitolo 4
Possiamo verificare con calma, una riga alla volta, i messaggi che il programma ci invia durante
il caricamento, e che passano velocemente sullo schermo, dando il comando: dmesg | more, oppu-
re: dmesg | less (che consente anche di ritornare indietro con i tasti freccetta o con PagDown) al-
la ricerca di eventuali errori o altro. In alternativa, possiamo andare a leggere i file /var/log/syslog e
/var/log/messages.
A questo punto, facciamo partire il nostro Desktop Environment col comando startx (X è il nome
del server grafico), e si caricherà KDE, secondo quanto abbiamo scelto in fase di configurazione.
59
4. Avviare Slackware per la prima volta
60 e spegnerla
export LANG=us_US
e aggiungeremo la riga:
export LANG=it_IT@euro
e aggiungeremo la riga:
1 Commentare una riga significa aggiungere, all’inizio, il simbolo del cancelletto (#). In tal modo essa non verrà letta dal
programma. Il risultato è lo stesso che cancellarla, ma questa tecnica è migliore perché consente di mantenere delle righe che
potrebbero tornare utili in un secondo tempo, e quindi si usa per inserire nei file delle righe esplicative. Ad esempio si avrà:
# Questo è un commento
Ciò vale almeno per i file di configurazione e per gli script di bash, che è quanto ci interessa, mentre altri linguaggi usano una
differente sintassi.
4.3. Spegnere Slackware 61
Ciò è utile anche per italianizzare tutte le applicazioni che utilizzano il sistema di internazionalizza-
zione gettext (e che sono veramente numerose, compresi molti dei comandi di sistema), che altrimenti
risulterebbero nella lingua originale (e cioè il più delle volte in inglese).
/sbin/modprobe apm
Col kernel 2.6, se il supporto ACPI o APM è abilitato nel kernel stesso, non serve effettuare alcun
intervento: il computer si spegne da solo.
4. Avviare Slackware per la prima volta
62 e spegnerla
# Samples
# %users ALL=/sbin/mount /cdrom,/sbin/umount /cdrom
# %users localhost=/sbin/shutdown -h now
consentono a tutti gli utenti e senza ricorso alcuno alle password rispettivamente di montare e smontare
i CD-ROM senza apportare modifiche a /etc/fstab e di spegnere il computer.
Lievemente più complessa appare la procedura per assegnare solo ad alcuni utenti dei permessi
particolari. Ipotizziamo di voler consentire a un certo numero di utenti la possibilità di spegnere il com-
puter sia con shutdown sia con poweroff e di poterlo riavviare con reboot. È sufficiente a questo fine
aggiungere nel file /etc/sudoers alle righe già presenti quelle sotto indicate, in modo che risulti secondo
la seguente sintassi:
Facciamo un esempio. Per conferire il permesso di spegnere il sistema coi comandi poweroff e
shutdown -h now e di riavviarlo con reboot agli utenti tizio, caio e sempronio, scegliamo di conferi-
re a questo gruppo di utenti l’alias UTENTI, di raccogliere i comandi nell’alias SPEGNI e di consentire loro
di svolgere queste operazioni senza inserire la password. Il file /etc/sudoers apparirà di conseguenza
come segue:
I vari nome_utente, raccolti sono l’unico NOME_ALIAS sono ovviamente i nomi degli utenti autoriz-
zati a effettuare i comandi presenti in NOME_COMANDI, tutti nomi che possono essere scelti a piacere.
Eliminando nell’ultima riga la stringa NOPASSWD: agli utenti autorizzati sarà richiesta la propria pas-
sword per effettuare le operazioni. Tali utenti potranno spegnere il computer col comando shutdown
-h now e riavviarlo col comando reboot con la seguente sintassi: sudo /sbin/shutdown -h now e sudo
/sbin/reboot. È necessario inserire l’indirizzo completo, perché il comando risiede nella directory /sbin,
di solito non presente nel path degli utenti (a meno di non creare appositi link per evitare di digitare
il percorso completo). Se poi volessimo abbreviare i comandi, potremmo sempre ricorrere a degli alias.
In questo caso sarà necessario creare nella home di ciascun utente il file .bash_profile (che di default
Slackware non crea) includendovi delle seguenti righe, che definiscono degli alias:
Esiste infine la possibilità di conferire i permessi di spegnimento e riavvio a un solo gruppo, che per
ipotesi chiamiamo gruppo «spegnimento». A questo fine le righe pertinenti in /etc/sudoers dovranno
risultare:
In questo modo verrà assegnata esclusivamente agli utenti del gruppo la possibilità di spegnere il
computer, e per essi e solo per essi verranno creati gli alias.
Capitolo 5
65
66 5. Ottimizzare il server grafico
nella home directory utente per decidere quale ambiente desktop dovrà essere caricato. Come ultima ri-
sorsa viene usato il file /etc/X11/xinit/Xclients per selezionare un ambiente desktop oppure un Window
Manager da usare allo stesso modo del runlevel 3.
Quando l’utente termina una sessione X sul display predefinito (:0) ed effettua l’uscita, lo script
/etc/X11/xdm/TakeConsole si avvia e assegna nuovamente la proprietà della console all’utente root. Il
display manager originale, che è rimasto operativo dopo la registrazione dell’utente, prende il controllo
eseguendo lo spawn di un nuovo display manager. Questo riavvia il server X, visualizza una nuova
finestra di login e avvia ancora l’intero processo. L’utente viene riportato al display manager dopo aver
effettuato un logging out da X dal runlevel 5.
Il file /etc/X11/xinit/xinitrc contiene, nella prima parte, alcune impostazioni di configurazione con ri-
ferimento ad altri file. Nella parte finale invece (che inizia con la riga: twm & ), esso definisce lo Window
Manager che parte di default all’avvio del server X. Se la sezione appare come segue:
allora ciò significa che il comando startx farà partire KDE. Come abbiamo visto, tale settaggio può
essere modificato manualmente o con xwmconfig.
Il mouse
Si inizia con la scelta del mouse: se abbiamo un mouse PS2 con rotellina, scegliamolo battendo il cor-
rispondente numero di protocollo (nel caso specifico, il numero 4), non abilitiamo invece l’emulazione
per i tre bottoni; la rotellina avrà bisogno di un piccolo, ulteriore intervento per funzionare. Accettiamo
il dispositivo di default (/dev/mouse).
Ricordiamo in questa sede che il modulo psmouse, atto a supportare i mouse di tipo PS2, è disabi-
litato, in quanto blacklistato in /etc/modprobe.d/blacklist, e cioè non viene caricato per evitare, in certi
sistemi, che il mouse non funzioni più se si commuta la console. Pertanto è necessario eliminare (maga-
ri commentandola) l’invocazione a quel modulo presente in /etc/modprobe.d/blacklist, oppure caricarlo
con l’aggiunta di un particolare parametro in /etc/rc.d/rc.modules, nella forma:
che lo carica con un solo protocollo di base, tale da produrre più difficilmente il problema appena
menzionato. Qualora infine si ricompili il kernel, è possibile inserire in forma statica il supporto al
mouse.
necessario verificare se il mouse funziona correttamente
La tastiera
Scegliamo quindi il tipo di tastiera, solitamente una generica a 105 tasti o non funzioneranno i ca-
ratteri delle parentesi uncinate < e > (il tasto corrispondente dovrebbe essere il 4) e la lingua (l’italia-
no dovrebbe essere il numero 31). Tralasciamo di settare una variante per la tastiera (che ci consenti-
rebbe di abilitare un layout alternativo). In questo caso infatti avremmo che la sezione pertinente di
/etc/X11/xorg.conf non risulterebbe:
Section InputDevice
Identifier Keyboard1
Driver kbd
.
.
.
Option XkbRules xorg
Option XkbModel pc105
Option XkbLayout it
EndSection
bensì:
Section InputDevice
Identifier Keyboard1
Driver kbd
.
.
.
Option XkbRules xorg
Option XkbModel pc105
Option XkbLayout it,fr,de
Option XkbVariant basic,basic,basic
Option XkbOptions grp:alt_shift_toggle
EndSection
dove si comprende facilmente che sono stati attivati due altri layout (francese e tedesco) e che per
commutare la tastiera dall’uno all’altro si utilizza la combinazione (detta «gruppo») Alt+Maiusc.
Le opzioni di XKB
Le ulteriori opzioni XKB sono utili a rimappare il funzionamento della tastiera nel server X o per
scambiare le funzioni di tasti diversi (ad esempio abilitare l’uso di un diverso gruppo di tasti di controllo
o scambiare i tasti di controllo) e per gestire i led luminosi relativamente ai tasti. Si tratta verosimilmente
di modifiche da non apportare a una prima installazione di Slackware. Tuttavia ne diamo conto in forma
sintetica. Premettiamo che è possibile ottenere un’immagine delle mappature col comando xkbprint.
Nel nostro caso, per ottenerla con determinate caratteristiche, diamo il comando:
68 5. Ottimizzare il server grafico
Group Shift/Lock behavior 1 Right Alt key switches group while pressed
2 Left Alt key switches group while pressed
3 Left Win-key switches group while pressed
4 Right Win-key switches group while pressed
5 Both Win-keys switch group while pressed
6 Right Alt key changes group
7 Left Alt key changes group
8 Caps Lock key changes group
9 Shift+CapsLock changes group
10 Both Shift keys together change group
11 Both Alt keys together change group
12 Both Ctrl keys together change group
13 Control+Shift changes group
14 Alt+Control changes group
15 Alt+Shift changes group
16 Menu key changes group
17 Left Win-key changes group
18 Right Win-key changes group
19 Left Shift key changes group
20 Right Shift key changes group
21 Left Ctrl key changes group
22 Right Ctrl key changes group
Si può scegliere una di queste opzioni (ad esempio, digitando 3 avremo che il tasto Win servirà a
cambiare gruppo), oppure passare direttamente al menu successivo, premendo Invio. Ci apparirà un
nuovo menu, che gestisce il terzo livello:
In questo caso, ipotizziamo di selezionare l’opzione (la numero 5) per cui è il tasto Menu a farci
andare al terzo livello. Possiamo scegliere dei controlli ulteriori o passare alla voce successiva, sempre
con Invio. Qui possiamo decidere se il cambio di gruppo dev’essere segnalato dall’accensione di uno dei
led luminosi a scelta. E via dicendo, finché abbiamo esaurito la reimpostazione.
In conclusione, possiamo attribuire a un determinato tasto o a una combinazione di tasti il compito
di farci passare da una tastiera a un’altra, oppure di farci passare da un livello a un altro.
Il monitor
Per settare il monitor, accettiamo la frequenza di refresh orizzontale fra quelle proposte o scegliamo
11 per impostare quella del nostro monitor; stessa operazione per la frequenza verticale (qui è l’opzione
5 a consentirci di impostare la frequenza). Diamo un nome a piacere che identifichi il monitor.
La scheda video
Scegliamo la scheda video dal database, quindi la sua memoria, infine attribuiamole un nome a
piacere che la identifichi. Se i modi di risoluzione sono corretti, accettiamo. Specifichiamo infine la pro-
fondità di colore del monitor. Questi sono tutti dati di cui dovremmo già essere in possesso, e che sono
comunque riportati nei manuali dello schermo e della scheda. Alla fine salviamo il file (di solo testo)
contenente tutte le impostazioni, che è /etc/X11/xorg.conf.
Scheda n. 10
L’editor Vi
Gli editor di solo testo di GNU/Linux sono numerosissimi. Alcuni richiedono il supporto del server
grafico, come Kwrite o Kate, altri invece funzionano da console, come Pico, Joe, Emacs, Vi, Vim (che ha
anche una versione grafica che gira sotto X) e Nano (quest’ultimo non incluso in Slackware). I due editor
più classici – intorno a cui non mancano le dispute per la palma di «miglior editor» – sono Vi (che ha
peraltro numerosi cloni: quello adottato in Slackware è Elvis, come si evince dal fatto che /usr/bin/vi non
è che un link simbolico per l’appunto a Elvis) ed Emacs.
Qui offriremo soltanto alcuni cenni base su Vi, che può ritenersi uno strumento efficacissimo per
modificare i file di configurazione, che sono di solo testo, anche se il server X fosse impossibilitato a fun-
zionare. D’altro canto, Vi è l’editor la cui presenza è immancabile in qualsiasi distribuzione GNU/Linux
e Unix in generale; una volta che si sia familiarizzato almeno coi comandi principali, la composizione e
la modifica di un testo risultano molto veloci, e anzi proprio la velocità è uno dei contrassegni specifici
di questo editor. Delle moltissime funzioni di Vi annoveriamo la possibilità di creare comandi perso-
nalizzati, di utilizzare script, di adottare vari schemi di indentazione automatica relazione ai linguaggi
usati.
70 5. Ottimizzare il server grafico
La schermata di Vi
Vi si attiva lanciando da console il comando vi. Se seguito dal nome di un file esistente lo apre, se
seguito dal nome di un file non ancora esistente, lo crea. Infine, quando si apre Vi senza specificare nulla,
ci si trova davanti un file (o meglio buffer) vuoto. Vi non presenta alcun menu e, contrariamente a molti
editor, funziona secondo due diverse modalità: la modalità di comando e la modalità di inserimento
di testo. Esse sono riscontrabili in basso a destra nel buffer, indicate rispettivamente con Command e
Input. I numeri che precedono queste sigle indicano la riga e il carattere del testo (ad esempio, 3*5 indica
che il cursore è attivo sulla quinta lettera della terza riga).
I «mode» di Vi: command mode e insert mode
Lanciato Vi, si apre un buffer vuoto e ci si trova nel cosiddetto «command mode», cioè una moda-
lità in cui Vi si aspetta di ricevere istruzioni su che cosa fare (salvare, uscire, inserire testo, ecc.). Se si
digita vi seguito dal nome di un file, quest’ultimo viene creato se inesistente, aperto se già esistente. Si
può avviare Vi anche da una determinata riga di testo con l’opzione +numero_di_riga . Ad esempio, il
comando: vi +20 /etc/lilo.conf apre /etc/lilo.conf alla riga 20, posizionando lì il cursore. La versione
di Vi presente in Slackware consente anche l’apertura di buffer multipli (cioè di più file contemporanei).
Dall’interno del file aperto, in command mode, bisogna dare il comando: :split nome_file . Il buffer
viene così diviso in due: sotto sta il primo file aperto, sopra il secondo. Con un solo file aperto, :split
divide in due lo schermo consentendo di accedere contemporaneamente a due parti del medesimo file.
In command mode si definiscono i comandi che vogliamo passare a Vi. Il primo è quello che deter-
mina lo spostamento all’«insert mode», cioè la modalità per scrivere nuovo testo. Va premuto il tasto
i per scrivere dal punto di inserimento, oppure il tasto a per scrivere immediatamente dopo il punto
di inserimento. Una funzione particolare dell’insert mode è il replacement mode, che non aggiunge,
ma sostituisce il testo sovrascrivendo quello eventualmente presente. Per passare dal command mode
all’insert mode e quindi da questo al replacement mode basta premere ogni volta Ins. Per tornare da un
qualche modo definito al command mode è sufficiente premere Esc. Qualcuno è giunto addirittura a
distinguere il command mode, che si ha quando il cursore è posizionato sul testo ma la tastiera si può
utilizzare solo per richiedere l’esecuzione di comandi e non per inserire testo, dal directive mode, che
si ha quando, mediante :, il cursore è posizionato nella «linea direttiva», che è poi l’ultima del video,
pronto a scrivere i comandi (si tratterebbe insomma dell’analogo del minibuffer di Emacs).
I comandi di Vi
Vi è un programma molto potente, tutti i suoi comandi (dei quali qui ricorderemo solo i più
immediati e utili) ammontano a qualche centinaio.
Fra i primi comandi da apprendere, ci sono quelli per muoversi all’interno del file. In alcune versioni
di Vi, fra cui quella presente in Slackware, ci si può spostare coi tasti freccia e con i tasti Inizio e Fine;
in altre versioni bisogna fare ricorso ai tradizionali tasti h, j, k e l. Molti comandi del command mode
iniziano col doppio punto (:), in quanto tale simbolo indica al programma che quanto segue è da inter-
pretarsi come un comando. Alcuni comandi possono essere combinati. Ad esempio, 10k muove in altro
dieci caratteri e 4dd cancella quattro righe, la riga dov’è posizionato il cursore più le tre successive.
Alcune opzioni si impostano con comandi univoci, altre richiedono dei parametri numerici. Ad
esempio, l’opzione number (che visualizza all’inizio di ogni riga il suo numero e che si imposta col
comando :set number) non ha bisogno di parametri, mentre l’opzione textwidth (che si imposta col
comando :set textwidth=nn ) richiede di precisare il numero delle righe.
Per eseguire un comando di shell dall’interno di vi si usa il comando :!comando [opzioni], ad
esempio :!ls -l. Per uscire dal comando si batte Invio.
La scrittura con Vi
In insert mode, la scrittura si effettua normalmente da tastiera. È importante ricordare che Vi consi-
dera un paragrafo un testo delimitato da una linea vuota, e non da un semplice a capo. Di conseguenza,
per evitare uno scorrimento lento del testo quando bisogna spostarsi, è buona norma impostare una fine
5.2. Gli strumenti di configurazione 71
di riga fissa fra i settanta e gli ottanta caratteri. In questo caso l’a capo non sarà inteso come un paragrafo
nuovo. Per ottenere questo risultato si ricorre a :set textwidth=nn , dove nn è il numero massimo di
righe consentito; ad esempio, ponendo :set textwidth=80 il testo andrà a capo automaticamente ogni
80 caratteri. Ricordiamo che textwidth presuppone che sia già attiva l’opzione autoindent (da porre
col comando :set autoindent).
Poiché Vi non è un programma di videoscrittura come Writer di OpenOffice, non effettua alcuna rie-
laborazione delle modifiche alle righe e non ricalcola le interruzioni di linea. Pertanto, anche se abbiamo
posto il margine a ottanta caratteri, quando cancelleremo delle parole da una riga, una parte della stessa
resterà vuota. Per ragioni estetiche, si può riformattare il paragrafo al fine di ripristinare l’omogenei-
tà del testo mediante l’operatore gq. Dopo aver selezionato un’area da riformattare in visual mode, si
lancia l’operatore stesso. I parametri che si possono passare a questo operatore sono gli stessi che de-
finiscono le porzioni di testo in Vi. Ad esempio, dando il comando v4jgp all’interno di una sezione di
cinque righe col cursore posto sulla prima, si imparticono in sequenza questi ordini: entrare in visual
mode (v), selezionare dalla posizione del cursore alla fine della sezione (4j), lanciare il nostro operatore.
Ma contare le righe spesso è assai scomodo. Possiamo allora riscrivere il comando precedente come:
jq}, dal momento che } indica per l’appunto la fine del paragrafo. Per riformattare un paragrafo intero
(posto che esso sia separato dagli altri da linee vuote) si darà il comando: gqap. Infine, per formattare
un testo intero (sempre posto che tutti i paragrafi siano separati da linee vuote, altrimenti essi verranno
uniti), si darà il comando: gggqG (gg per spostarsi all’inizio del testo e G per definire la fine del testo).
Vi apporta le modifiche su una copia del file in scrittura finché non si salva il testo. Ma è possibile
anche salvare le modifiche a un file in sola lettura forzando il salvataggio o uscire da un file modificato
senza salvare: basta aggiungere alla fine del comando un punto esclamativo, nella forma :q!, :w! oppure
wq!).
Per selezionare ampie porzioni di testo, è necessario entrare nel cosiddetto visual mode, ossia andare
in command mode e premere v: il movimento delle freccette della tastiera evidenziano il testo seleziona-
to. V seleziona righe intere, Crtl+v seleziona aree rettangolari, utile nelle tabelle (si tratta della cosiddetta
«modalità visuale blocco»).
Apparentemente, Vi non possiede una funzione taglia-incolla. Ma il testo tagliato viene in realtà
memorizzato in un buffer e può essere incollato mediante p (che lo inserisce prima del cursore) e P (che
lo inserisce dopo il cursore). Per copiare, si ricorre al comando y: nella sua forma più semplice esso copia,
memorizzandolo, il carattere su cui è posto il cursore. Quindi ci si sposta nel punto di inserimento, e si
adottano sempre p o P. Per copiare aree più estese di testo, si integra il comando y; così, yw seleziona
il testo dal cursore a fine parola (cioè, per Vi, fino al primo spazio che trova) incluso anche lo spazio, e
ye una parola senza lo spazio finale; y$ copierà sino a fine riga, e via dicendo. Per copiare ampie aree di
testo, ci si vale della «modalità visuale blocco» e quindi si inserisce il testo ancora una volta con p o P.
Per spostare tali aree, allo stesso modo le si definisce con la «modalità visuale blocco», le si cancella con
d e quindi le si inserisce nella nuova posizione con p o P.
È possibile creare degli alias, ossia delle abbreviazioni atte a inserire velocemente del testo più lungo
mediante il comando ab: con la sintassi: :ab [alias] [testo]. Gli alias creati in una sessione di Vi si
rimuovono col comando: :unab [alias].
Ricerca e sostituzione
La ricerca di stringhe è in Vi «case sensitive», per cui di default viene fatta differenza fra le maiuscole
e le minuscole. Si può sospendere questa funzione impostando il comando :set ignorecase, ripristinan-
dolo successivamente con :set noignorecase. In questo caso, però, vengono rinvenute tutte le stringhe,
indipendentemente dalla loro collocazione. Cercare la stringa pera porterà all’individuazione di «pe-
ra». ma anche di «imperatore», «operazione», «salperanno» ecc. Per cercare soltanto le parole, e non la
stringa, si deve racchiudere la parola fra specifici operatori: si avrà perciò il comando: /\<pera\>, che
fornirà solo le occorrenze della parola «pera». Nelle ricerche, il carattere punto (.) vale come il punto
interrogativo nella shell, e dunque come un singolo carattere qualsiasi.
72 5. Ottimizzare il server grafico
La sostituzione può essere manuale o automatica. Nel primo caso ci si vale dei comandi r e R.
Il comando r dev’essere lanciato col cursore sulla lettera da sostituire, seguito dalla nuova lette-
ra. Il comando R consente di sostuire un numero a piacere di caratteri, per poi tornare alla moda-
lità di comando digitando Esc. Nel secondo caso, il comando di base adotta la seguente sintassi:
:s/stringa_da_sostituire /stringa_sostitutiva . Tale comando si limita a sostuire la prima occor-
renza trovata di stringa_da_sostituire con stringa_sostitutiva . Per sostituire tutte le occorrenze
in una riga il comando è: :s/stringa_da_sostituire /stringa_sostitutiva /g, dove g è l’opzione che
sta per «global».
Altri operatori consentono di effettuare altri tipi di sostituzione, di cui offriamo qualche esempio. Il
comando :s/stringa_da_sostituire // sostituisce la stringa con una stringa vuota, cioè, in effetti, la
cancella. I comandi :s/^/stringa e :s/$/stringa aggiungono la stringa rispettivamente all’inizio e
alla fine della riga. Il comando :s/stringa1 /&stringa2 concatena le due stringhe trasformandole in
una stringa unica.
Infine, è possibile specificare l’area in cui effettuare la sostituzione. Il comando:
:n1,n2 s/stringa_da_sostituire / textit stringa_sostitutiva sostituisce la prima occorren-
za di stringa_da_sostituire nell’intervallo di righe specificato in :n1,n2 , mentre la sostituisce in
tutte le occorrenze se si aggiunge, ancora una volta, l’opzione g. E poiché, con questa sintassi, 1 indica la
prima riga e $ l’ultima, il comando :1,$s/stringa_da_sostituire /stringa_sostitutiva sostituirà
tutte le occorrenze di stringa_da_sostituire in tutto il testo.
Editing multiplo
Aperto un file, è possibile aprirne un secondo e altri ancora col comando :e nome_file , quindi
passare dall’uno all’altro con :e# [Invio]. I file a disposizione dell’editing si vedono col comando :args.
Quando si hanno più file aperti, può essere più comodo vederli uno alla volta a schermo pieno e
passare dall’uno all’altro, oppure dividere lo schermo per una visualizzazione simultanea. In questo
caso, ci serviamo di :split. Senza argomenti, questo comando apre una nuova finestra sul file corrente
dividendo a metà lo schermo. Se si aggiunge come argomento il nome di un altro file, i due file vengono
aperti su una metà dello schermo ciascuno. Se si ha bisogno di una dimensione particolare, si ricorre al
comando :n split, dove n è il numero delle righe del file che saranno visualizzate. Per aprire una nuova
finestra il comando è invece new. Le dimensioni delle finestre possono essere aumentate o diminuite
rispettivamente con Ctrl-W + e con Ctrl-W -. Per passare da una finestra all’altra si usa Crtl-w v, per
chiudere la finestra corrente :close e per chiudere tutte le finestre tranne quella corrente :only. Vi non
supporta la divisione verticale delle finestre, attuabile invece in Vim. Per salvare le singole finestre,
i comandi sono quelli tradizionali, mentre per gestirle tutte insieme c’è una serie di comandi atti a
chiudere, salvare e uscire.
Controllo e personalizzazione
Per vedere le impostazioni correnti di Vi si digita :set all, mentre per controllare l’impostazione di
un’opzione specifica :set nome_opzione . Invece :set elenca soltanto le opzioni modificate rispetto al
default.
Inoltre, si può modificare stabilmente la configurazione di base scrivendo regole nuove nel file .exrc,
contenuto nella home dell’utente (file di solo testo che in Slackware va creato dall’utente stesso, per-
ché di default non è presente). Ad esempio, per far sì che Vi crei automaticamente un backup dei file
modificati, che aggiungeranno all’estensione la sigla .bak (secondo l’impostazione di /usr/share/elvis-
2.2_0/elvis.bwk), in ∼/.exrc va aggiunta la riga: set backup. Aggiungiamo incidentalmente che, se può
disturbare avere le directory con disseminati svariati file di backup, è possibile indirizzarli tutti a una
apposita directory: in questo caso la riga risulterà: set backup=directory_dei_backup – ad esempio:
set backup=./backup.
Imparare a usare Vi(m)
Per apprendere Vi, si può comunque usare il tutorial di Vim, disponibile anche in lingua italiana, per
5.2. Gli strumenti di configurazione 73
sperimentarne in concreto il funzionamento; esso si attiva da shell col comando: vimtutor [it]. Se è
stata effettuata l’italianizzazione di Slackware, il tutorial dovrebbe già partire nella lingua di sistema.
Vi presenta innumerevoli funzioni avanzate di cui qui non abbiamo tenuto conto, e molte altre ag-
giuntive sono presenti solo in Vim (ViIMproved), una versione migliorata e potenziata di Vi, anch’essa
presente in Slackware. Per lavorare estesamente sul testo, ormai è consigliabile adottare Vim, impo-
stando anzi in aggiunta la non compatibilità con Vi, per fruire di tutte le potenzialità di questo edi-
tor. Slackware 11.0 installa già una versione di .vimrc dotata di elementi di personalizzazione, e cioè
/usr/share/vim/vimrc, basato su /usr/doc/vim-7.0.109.doc/gvimrc_example.vim. Esso costituisce un buon
punto di partenza per creare un efficace file di configurazione ulteriormente personalizzato e va copiato
nella home dell’utente come .vimrc.
Comandi principali di Vi
a) Operazioni sui comandi
Entra in insert mode (dal punto in cui è il cursore) = i
Entra in insert mode (dal punto successivo a quello in cui è il cursore) = a
Entra in insert mode (da inizio riga) = I
Entra in insert mode (da fine riga) = A
Ripete l’ultimo comando = .
Annulla l’ultima operazione = u
Ripristina l’ultima operazione cancellata = Ctrl+t
b) Operazioni sui file
Apre un file = :e nome_file
Salva con nome il file aperto = :w nome_file
Esce da Vi senza salvare il file corrente (se non modificato) = :q
Esce da Vi senza salvare il file corrente (se modificato) = :q!
Esce da Vi salvando il file = :wq oppure ZZ
Mostra informazioni sul file = Ctrl+G
Mostra il numero delle linee del file = :=
c) Spostamento del cursore
Muove a sinistra di un carattere = h
Muove in basso di un carattere (passare alla riga inferiore) = j
Muove in alto di un carattere (passare alla riga superiore) = k
Muove a destra di un carattere = l
Si sposta all’inizio della parola successiva = :w
Si sposta alla fine della parola successiva = :e
Si sposta all’inizio della parola precedente = :b
Si sposta a inizio riga = ^
Si sposta a fine riga = $
Si sposta a una riga determinata = :numero_riga oppure numero_rigaG
Si sposta a inizio paragrafo = :{
Si sposta a fine paragrafo = :}
Si sposta a inizio file = :1
Si sposta a fine file = G
d) Gestione del testo
Copia una riga = yy oppure Y
Copia il testo selezionato (solo in visual mode) = y
Inserisce la riga copiata dopo il cursore = p
Inserisce la riga copiata prima del cursore = P
Sostituisce una lettera (dov’è il cursore) = rlettera
Sostituisce più lettere (da dov’è il cursore) = Rlettere
74 5. Ottimizzare il server grafico
tare poi manualmente a /etc/X11/xorg.conf per forzare determinati timing a determinate risoluzioni in
determinati video mode.
Si lancia da console col comando xvidtune. L’utilità consente di regolare la giusta geometria del-
lo schermo (le frequenze orizzontale e verticale) e di vedere subito il risultato (ricorrendo al pulsante
Apply). A questo punto il pulsante Show mostra sulla console una serie di numeri come:
1280x1024 135.00 1280 1296 1440 1688 1024 1025 1028 1066 +hsync +vsync
che indicano le frequenze: tale stringa (che si può visualizzare direttamente senza anteprima col coman-
do: xvidtune -show) va copiata nella sezione Monitor di /etc/X11/xorg.conf, premettendole la stringa
Modeline , ossia:
Modeline 1280x1024 135.00 1280 1296 1440 1688 1024 1025 1028 1066 +hsync +vsync
in
Load 'glx'
Load 'dri'
Section 'DRI'
Mode 0666
End section
Salviamo e usciamo. Perché la modifica apportata abbia effetto, è necessario uscire da X e rientrarvi.
Nel caso si ricompili il kernel, è necessario porre la dovuta attenzione a selezionare il chipset corretto
per la propria scheda madre. Per individuarla ci si può valere del comando: lspci -vv | grep PCI.
Ulteriori dettagli si possono trarre dai comandi: dmesg | grep agpgart oppure dmesg | grep agp. Ciò
dovrebbe fornire sufficienti informazioni per compilare il modulo corretto.
Se tutto è andato a buon fine, possiamo provare a caricare il modulo col comando: modprobe fglrx
e col comando lsmod dovremmo vederlo caricato. Dobbiamo quindi aggiungere in /etc/fstab la seguente
riga:
Per caricare il driver all’avvio, dobbiamo lanciare l’utilità di configurazione aticonfig (che ha sosti-
tuito il vecchio fglrxconfig), oppure apportare a mano alcune modifiche al file /etc/X11/xorg.conf, che
preesiste. Nel primo caso, si lancia il comando aticonfig --initial --input=/etc/X11/xorg.conf,
presupponendo che /etc/X11/xorg.conf esista già (laddove fglrxconfig lo ricreava ex novo). In que-
sto modo risulteranno abilitate le voci relativa ai moduli GLX e DRI, mentre bisognerà decommentare
manualmente le righe relative ai permessi di DRI, per conferire a tutti gli utenti il permesso 666:
# Section "DRI"
# Mode 0666
# EndSection
b) alla sezione Graphic device section, Section "Device" è necessario sostituire il driver corrente
(ad esempio radeon) con fglrx.
c) la sezione sopra riportata Section "DRI" dev’essere decommentata per intero.
Verrà in ogni caso creata una voce di menu in /opt/kde3/share/applnk, che tuttavia risiede in una
posizione non standard. Se dunque si vorrà avere un menu grafico di configurazione in KDE, tale voce
andrà spostata manualmente in /opt/kde/share/applnk.
Se la riga OpenGL vendor string: ATI Technologies Inc. riportasse la voce driver MESA an-
ziché ATI , questo significherebbe che i driver corretti non sono stati caricati.
Il comando glxinfo deve darci alle prime righe un output del tipo:
Se invece leggessimo direct rendering: No , ancora una volta ciò significherebbe che qualcosa
non ha funzionato.
Infine, il comando glxgears ci mostra i frames per secondo, con l’aiuto di una finestra grafica a 2D,
mentre il comando fgl_glxgears ci mostra i frames per secondo in una finestra a 3D.
(WW) fglrx: No matching Device section for instance (BusID PCI:1:0:0) found
(EE) No devices detected
Fatal server error:
no screens found
.
.
.
XIO: fatal error 104 (Connection reset by peer) on X server ':0:0'
after 0 request (0 known processed) with 0 event remainig
basta entrare da console con un editor in /etc/X11/xorg.conf, individuare la Graphics device section
e, nella sottosezione "Misc Options", commentare la riga del tipo:
5.7. Installare i driver per l’accelerazione grafica (schede Nvidia) 79
È opportuno rispondere «yes» se il computer è già connesso a Internet, e inizierà il rapido download.
4) Se, com’è nella maggioranza dei casi, il programma non reperisce un’interfaccia precompilata adatta
al kernel, apparirà un successivo messaggio:
No matching precompiled kernel interface was found on the NVIDIA ftp site; this meants
that the installer will need to compile a kernel interface for your kernel.
# **********************************************************************
# Graphics device section
# **********************************************************************
.
.
.
Section "Device"
Identifier "Nvidia GF6600"
Driver "nvidia"
.
.
.
EndSection
È inoltre possibile effettuare una configurazione più raffinata aggiungendo ulteriori parametri nella
medesima sezione, sotto al nome del driver, con un editor qualsiasi di testo. I parametri applicabili sono
innumerevoli e indicati nel sopra citato file README.txt, ma i tre più utili e immediati (da attivare con
la stringa booleana true) sono:
Il primo disabilita lo splah screen con il logo Nvidia che altrimenti apparirebbe a ogni apertura del
server X.
Il secondo abilita GLX quando è caricata l’estensione Composite X. Tuttavia, questo parametro può
generare dei problemi con le applicazioni OpenGL, per cui di default GLX è disabilitato quando Com-
posite è caricato.
Il terzo abilita l’accelerazione per le estensioni RENDER; esso tuttavia è sperimentale e va pertanto
testato macchina per macchina.
Poiché si tratta di un driver esterno al kernel, la sua installazione dovrà essere effettuata dopo ogni
ricompilazione del kernel.
Scheda n. 11
Il server X e il file /etc/X11/xorg.conf
Il sistema X Window fornisce l’interfaccia grafica della maggior parte delle distribuzioni
GNU/Linux. X adotta un modello client/server (anche in locale), dove i client sono semplicemente
dei programmi che si rivolgono al server per la gestione dei display. Il server X disegna finestre, pul-
santi ecc. in risposta alle chiamate del client, che non dev’essere necessariamente proprio dell’hardware
locale. Ciò significa che si può creare una rete con più computer che vedono questi client da macchine
diverse, e inoltre che è possibile anche esportare un display, cioè visualizzare sulla propria macchina
programmi in esecuzione su macchine remote (ciò, peraltro, non solo all’interno di sistemi GNU/Linux,
ma, con apposite utilità, anche fra sistemi operativi diversi come Macosx e Windows).
Attualmente Slackware adotta Xorg, una implementazione open source liberamente redistribuibile
dello standard X11. Esso è un’infrastruttura desktop basata su X11. Il server X primario include nu-
merose ottimizzazioni tecnologiche, fra cui il supporto per l’accelerazione dell’hardware, l’estensione
5.7. Installare i driver per l’accelerazione grafica (schede Nvidia) 81
XRender per l’anti-aliasing dei font, un design basato su driver modulari, un supporto aggiornato per
dispositivi video hardware e di input, e numerose altre caratteristiche.
Dal punto di vista dell’utente, il file più importante di questo pacchetto (o meglio serie di pacchetti)
è /etc/X11/xorg.conf, che raccoglie tutta la configurazione del server X. È un file di solo testo, diviso in
una serie abbastanza complessa di sezioni, generato dall’utilità xorgconfig, ma che, al limite, potrebbe
anche essere redatto a mano per intero. In ogni sezione vengono specificati dei parametri o caricati
dei moduli per il funzionamento di X. Ogni sezione si individua facilmente, perché inizia con la riga:
Section "<section-name>" e termina con la riga: EndSection. All’interno di ciascuna sezione sono
presenti diverse righe contenenti un nome opzione e almeno un valore d’opzione, a volte fra virgolette.
Sezione MODULE contiene l’indicazione dei moduli della directory /etc/X11R6/lib/modules da cari-
care per il codice di supporto del display, fra cui quelli per i font ed (eventualmente) quelli per
l’accelerazione grafica.
Sezione FILES presenta dapprima il percorso di RGB, il database dei colori (indicati per nome nel file
/usr/X11R6/lib/X11/rgb.txt); la sigla è l’acronimo di Red Green Blu (rosso verde blu), i tre colori
fondamentali che definiscono tutti gli altri sul monitor. Quindi contiene i path dei moduli che
consentono di impostare directory multiple per l’archiviazione dei moduli caricati dal server Xorg.
Infine elenca le diverse directory dei font (la cui configurazione sta in /etc/X11/fs/config, file di
solo testo che però non dev’essere mai modificato a mano) o il numero di porta del font server.
Sezione SERVER FLAGS contiene alcune opzioni particolari di X, in genere inattive (le righe sono
infatti tutte commentate e tali devono restare per l’utente inesperto).
DontVTSwitch disabilita la possibilità di passare da una console virtuale all’altra riportando i tasti
funzione al loro uso normale.
DontZap disabilita l’uso della combinazione di tasti Ctrl-Alt+Backspace atta a uscire forzatamente da
X (e da usarsi solo in caso di emergenza).
Dont Zoom disabilita l’uso della combinazione di tasti Ctrl-Alt-+ e Ctrl-Alt-- atta a cambiare al volo la
risoluzione dello schermo (la prima aumentandola, la seconda diminuendola).
AllowNonLocalXvidtune consente di usare xvidtune anche in base alle direttive di un host diverso da
quello locale.
Sezione INPUT DEVICE contiene la configurazione delle periferiche di input, e usualmente non man-
ca di almeno due sottosezioni, una relativa alla tastiera (Core keyboard's InputDevice section)
e l’altra al mouse (Core Pointer's InputDevice section). Per ogni sottosezione vengono pre-
cisati il nome che identifica il dispositivo e il driver che utilizza, oltre a opzioni aggiuntive fa-
coltative. La seconda parte di questa sottosezione contiene l’eventuale personalizzazione della
tastiera, cioè l’attribuzione di funzioni particolari a determinati tasti. Infine è presente un’ultima
sottosezione per dispositivi aggiuntivi.
Sottosezione CORE KEYBOARD’S INPUTDEVICE contiene la configurazione della tastiera. Non so-
lo dunque le informazioni già presenti nella sezione precedente, ma anche quelle sul modello e il
layout per la corretta attribuzione dei tasti. Inoltre specifica ritardo e frequenza della ripetizione
della tastiera (ossia per quanto tempo dev’essere premuto un tasto perché per avviare la ripeti-
zione del carattere e quanti caratteri verranno introdotti al secondo). Si possono aggiungere qui
ulteriori opzioni di xbd per l’attribuzione di funzioni particolari ai tasti e per far accendere i led
luminosi in combinazioni a piacere in circostanze definite.
Sottosezione CORE POINTER’S INPUTDEVICE contiene la configurazione del mouse. Qui è possi-
bile abilitare la rotellina e l’emulazione dei tre tasti. Inoltre è questa la sezione da modificare se si
possiede un mouse con più tasti. Di norma i mouse PS/2 sono visti come il dispositivo /dev/psaux.
Altri mouse (per esempio gli USB) sono visti come /dev/input o /dev/input/mice. È comunque possi-
bile controllare se un certo dispositivo rappresenta effettivamente il mouse controllando l’output
del dispositivo stesso da console col comando: cat /dev/input/mouse0 mentre si muove il mouse,
e quindi premere Ctrl+C per terminare la sessione.
Sezione MONITOR contiene l’identificativo dello schermo specificato nella sezione ServerLayout
Section, cioè il nome a esso attribuito a piacere in fase di configurazione, e le sue frequenze
orizzontali e verticali.
Sezione GRAPHICS DEVICE vengono qui definiti i parametri relativi al chipset della scheda video.
Dapprima è presente una generica configurazione VGA; quindi alcuni elementi di configurazione
che però servono solo se nel sistema è installato più di un video, per identificarne il BUS, cioè
la collocazione fisica all’interno del computer. Nella sottosezione Section "Device" si leggono
i valori immessi a proposito della scheda video durante la precedente configurazione. La riga
relativa alla memoria video è commentata, in quanto di norma essa è stabilita automaticamente
da Xorg.
Sezione SCREEN definisce una o più risoluzioni (la prima è quella caricata di default) e quindi la ri-
spettiva profondità del colore. La risoluzione – come abbiamo visto – può essere cambiata anche
mentre il server X è attivo.
Sezione SERVERLAYOUT qui viene stabilita la configurazione di base di X: sono definiti i layout del
display e dello schermo, vengono assegnati i nomi ai dispositivi. A meno di non avere configura-
zioni hardware particolari, generalmente saranno presenti qui due sole righe, relative a Keyboard0
e Mouse0, che indicano la tastiera e il mouse configurati di default per il sistema (come indicano
le opzioni CoreKeyboard e CorePointer). Consente anche configurazioni multiple, se il sistema
annovera più schermi o più periferiche di input (ad esempio, due mouse, come talora accade).
Sezione DRI questa sezione (la cui denominazione è l’acronimo di Direct Rendering Interface) gestisce
le autorizzazioni per l’utilizzo dell’accelerazione grafica. Infatti, se decommentata, estende a tutti
gli utenti questa possibilità conferendo a DRI i permessi 666.
5.8. Esportare il server X 83
samiel@darkstar: $ xhost +
access control disabled, clients can connect from any host
Se invece si desidera consentire questa funzione solo ad alcuni utenti, essi andranno precisati dopo il
comando, nella forma xhost + nome_computer oppure xhost + nome_utente . In questo caso potremo
avere:
dove è stato concesso l’accesso al solo utente sabina del computer chiamato brighstar. Naturalmente,
dev’essere attivo il servizio di risoluzione dei nomi nel file /etc/hosts. Non serve modificare altro, perché
Slackware, a differenza di altre distribuzioni, non carica il server X con l’opzione -nolisten tcp (che
altrimenti andrebbe disabilitata). È possibile verificare a quali utenti è stato concesso l’accesso lanciando
il comando xhost senza ulteriori parametri. Per revocare i permessi, si adotta lo stesso comando col
simbolo meno (-) in luogo del simbolo più (+).
root@darkstar:~\# kate
kate: ERROR: KUniqueApplication: Can't determine DISPLAY. Aborting.
oppure:
Per risolvere il problema, essendo già loggati come utente, bisogna dapprima assegnare i permessi al
client col comando: xhost + root. Quindi si passa a root nel modo consueto (con su [-]) e si assegna la
variabile DISPLAY col comando: export DISPLAY=:0. A questo punto è consentito lanciare l’applicazione
che gira sotto X come root. Se si adotta il comando: xhost + localhost, allora qualsiasi utente potrà
usare le applicazioni.
Scheda n. 12
L’editor GNU Emacs
Insieme a Vi(m), GNU Emacs è il più prestigioso editor dei sistemi Unix, anche se in realtà è ricchissi-
mo di ulteriori funzioni che lo rendono assai più di un semplice editor. Con Emacs è possibile, fra l’altro,
inviare e-mail, consultare newsgroup su Usenet, fare dei giochi e addirittura ricorrere a un improbabile
psicanalista. Inoltre, Emacs contiene delle facilitazioni per usare determinati linguaggi di scrittura o di
programmazione, da C e C++ a Python, da Perl a LATEX, e naturalmente Lisp, in cui è scritta la maggior
parte del suo codice. Poiché dal suo interno è possibile effettuare anche la compilazione e il degub di
codice, essi si presenta anche come un ambiente di sviluppo integrato. In Slackware si può avviare la
versione testuale come pure quella supportata dal server X. Una versione avanzata (non presente in
Slackware), e cioè (non-GNU) Xemacs, consente anche di gestire la grafica.
Benché anche come editor Emacs presenti moltissime funzioni avanzate (fra cui il controllo di sub-
processi, la formattazione automatica di codice sorgente e il suo debugging, la gestione di espressioni
e commenti in numerosi linguaggi di programmazione, la personalizzazione del suo aspetto e dei suoi
5.8. Esportare il server X 85
comandi, l’estensibilità, e cioè la possibilità di creare comandi completamente nuovi), qui offriremo solo
alcuni cenni base, volti alla manipolazione semplice di file di puro testo. Inoltre, dal momento che ab-
biamo considerato Vi come editor da console, ora descriveremo alcune caratteristiche della versione di
Emacs che gira sotto X.
La schermata di Emacs
L’editor si richiama semplicemente digitando emacs al prompt, e, se seguito dal nome di un file
esistente lo apre, se seguito dal nome di un file non ancora esistente, lo crea. Infine, quando invece si
apre Emacs senza specificare nulla, ci si trova davanti un buffer vuoto detto «scratch», dov’è possibile
scrivere testo che non sarà salvato automaticamente (tranne che poi si impartisca l’ordine contrario).
Nella schermata, che prende il nome di «riquadro» (frame), troviamo a sinistra la barra di scorrimento. In
alto è posta la barra dei menu, attivabile col mouse da X, con tasti funzione da console. I file o comunque
il testo aperto viene conservato in un’area chiamata «buffer»; il punto in cui, all’interno del buffer, è
collocato il cursore del mouse viene chiamato «punto». Un buffer non coincide propriamente con un file:
il testo elaborato nel buffer è una copia di quello originale e non lo modifica finché non viene salvato;
inoltre vi sono buffer che vengono creati come risultato di determinati comandi. È possibile aprire più
file in differenti buffer: avremo così molteplici riquadri nella medesima sessione di Emacs.
Nella parte inferiore dello schermo è presente una barra chiamata «riga di modalità», che fornisce
informazioni come il nome del buffer corrente, la percentuale visibile sullo schermo, la riga in cui si
trova il punto, l’eventuale file in cui viene salvato il buffer. Se si tratta di buffer a lettura e scrittura,
troveremo i simboli ** se esso è stato modificato, -- se non lo è stato; se si tratta di buffer a sola lettura,
troveremo i simboli %* se esso è stato modificato, %% se non lo è stato. La riga di modalità dichiara inoltre
le modalità attive nel buffer: ad esempio l’insert mode, per cui il testo digitato viene inserito, l’overwrite
mode, per cui il testo digitato sovrascrive il testo nel punto, nonché la modalità principale di scrittura.
Ancora più in basso troviamo la cosiddetta «area echo», dove Emacs comunica brevi messaggi di
stato, come quelli di errore o altro. Quando si digita un comando che richiede che richiede un input,
quest’ultimo viene richiesto e va digitato in quest’area. Questa riga è più nota col nome di «minibuffer»,
che in certo modo può essere descritta come la linea di comando di Emacs.
I comandi di Emacs
Molti comandi di Emacs (in realtà scorciatoie da tastiera per numerose funzioni che potrebbero esse-
re invocate dal minibuffer) sono costituiti da una doppia combinazione che fa ampio ricorso al tasto Ctrl.
Nella notazione specifica, Ctrl si scrive semplicemente C; ad esempio, poiché il comando per uscire dal-
l’editor è Ctrl+x Ctrl+c, si avrà la formula C-x C-c. Le funzioni sono invece sempre precedute da Alt+x,
che nella notazione risulta M-x, per il fatto che si riferisce al tasto Meta; in realtà è molto improbabile
che le tastiere abbiano un simile tasto, e allora in suo luogo si utilizza Alt. Per eseguire una determinata
funzione, si deve pertanto premere M-x, digitare nell’area echo il nome della funzione e infine premere
Invio. Per uscire da una funzione o da un comando, si preme C-g, atto anche a interrompere e annullare
l’input da tastiera se si commette un errore. Molti comandi accettano anche un argomento numerico,
che in genere (ma vi sono importanti eccezioni, come C-v e M-v, che spostano il cursore avanti e indietro
di n linee e non di n schermate) indica per quante volte vanno ripetuti. Tale argomento viene espresso
dalla sequenza C-u n. Ad esempio, C-u 5 c-f sposta in avanti il cursore di cinque caratteri.
Molti comandi aprono un buffer nuovo, che a volte occupa una parte della finestra originaria, si può
chiudere questa seconda finestra e tornare alla prima con C-x 1.
La gestione dei buffer di Emacs
Per aprire un file, si può ricorrere al menu oppure alla funzione find-file. Si digiterà, come scor-
ciatoia da tastiera, C-x C-f, quindi si premerà Invio. Nell’area echo si scriverà infine il nome del file,
considerando che il tasto Tab offre una scorciatoia per il completamento dei nomi, come in console.
Emacs può aprire contemporaneamente più buffer. Ad esempio, il comando: emacs testo1.txt
/etc/fstab /documenti/documento1 apre tutti e tre i file in questione. Per passare da un buffer al-
86 5. Ottimizzare il server grafico
l’altro si usa C-x b: si passa all’ultimo file visitato (la visualizzazione di un buffer in Emacs è chiamata
«visita») se non si precisa alcun nome, mentre per andare a un determinato buffer bisogna specificarne
il nome.
Emacs consente di vedere contemporaneamente lo stesso buffer o più buffer in finestre diverse. Per
suddividere il riquadro corrente in due finestre poste orizzontalmente si usa il comando: C-x 2; C-x 3
divide ulteriormente la finestra attiva in due finestre accostate verticalmente. Le finestre possono essere
ridimensionate col mouse. Per passare da una finestra all’altra o si clicca dentro col mouse, oppure si dà:
C-x o. Il comando C-x 1 chiude le finestre ripristinando quella principale.
Un buffer si chiude senza salvarlo (cioè eliminandolo, «killandolo») col comando C-x k. Se il conte-
nuto proviene da un file, Emacs chiederà se lo si vuole salvare, se invece proviene da un buffer scratch,
questo verrà chiuso direttamente.
Per uscire dal programma, si digita C-x C-c, che chiede in aggiunta se si vogliono salvare i buffer
aperti e non ancora salvati. Per mettere il programma in background, si digita C-z: Emacs viene ridotto
a icona e può essere ripreso in un secondo tempo.
La scrittura si effettua normalmente da tastiera. Quando una riga supera l’ampiezza dello schermo,
un simbolo ci avverte che non si tratta se non della prosecuzione della riga precedente: una barra inversa
o backslash in modalità console, una freccia ricurva in modalità grafica.
Ricerca e sostituzione
La selezione di aree ampie e uniformi di testo (che Emacs chiama «regioni») si effettua definendo
l’inizio dell’area con un «mark point» con C-@ oppure con C-barra spaziatrice e collocando alla fine il
punto (in alternativa, si può selezionare la regione col mouse). Per copiare la regione (che viene collocata
nel cosiddetto «kill-ring», qualcosa di simile a ciò che in altri editor di chiama clipboard, o «appunti») si
dà M-w e quindi, per incollarla in un nuovo luogo, C-y. Per spostare la regione, si adotta C-w invece
di M-w. Va ricordato che Emacs fa differenza fra eliminazione (killing) e cancellazione (deleting): il testo
eliminato viene conservato in un buffer nascosto e può essere ripristinato, laddove il testo cancellato
viene definitivamente eliminato ed è irrecuperabile.
Emacs offre diversi metodi per la ricerca e la sostituzione del testo. Il più semplice è la ricerca di
stringhe che viene effettuata in modo incrementale. Si entra nella modalità di ricerca con C-s e quindi
si scrivono (nel minibuffer) le lettere; terminata la stringa, si dà Invio. Emacs inizia subito a mostrare
le occorrenze trovate a partire dal punto. Più lettere si scrivono, più si restringe il campo, finché viene
individuata la prima occorrenza della stringa indicata. La ricerca si prosegue dando ancora C-s. La
stringa C-r imposta invece una ricerca inversa, dal punto all’indietro.
La sostituzione si effettua col comando M-x replace-string. Nel minibuffer viene richiesta la stringa
da sostuire e poi la sostituzione. Battuto Invio, tutte le occorrenze vengono sostituite. Se invece si vuole
effettuare una sostituzione interattiva, in modo cioè che Emacs chieda a ogni occorrenza se effettuare o
meno la sostituzione, si userà il comando M-x query-replace. Tutte queste sostituzioni avranno luogo a
partire dal punto.
Modalità primarie, secondarie e personalizzazione
Come abbiamo detto, Emacs può scrivere linguaggi differenti, dal solo testo a svariati linguaggi di
programmazione, fino ai file di TEX, fornendo diverse tecniche di evidenziazione a colori, una diversa
indentazione, un aiuto sensibile al contesto e si interfaccia automaticamente col debugger opportuno.
Ogni buffer viene aperto in una «modalità primaria» a seconda del tipo di linguaggio, che ha un compor-
tamento leggermento diverso dalle modalità primarie per altri linguaggi. L’help sulla modalità primaria
attualmente attivata si apre con C-h m. Vi sono anche delle modalità secondarie, che integrano quella
primaria con alcune utilità. Ad esempio, quando si è in modalità primaria text-mode (attivabile con M-x
text mode [Invio]), si può attivare la modalità secondaria Auto Fill (attivabile con M-x auto fill mode
[Invio]), la quale interrompe la riga quando essa diventa troppo lunga. Di default, l’interruzione di riga
è fissata a settanta caratteri, ma può essere modificata col comando: C-u nn C-x f (dove nn è il numero
5.8. Esportare il server X 87
delle righe) e ripristinata con C-x f). Quando invece si scrive un determinato codice, la modalità auto-fill
indenta diversamente il testo.
Infine, Emacs può essere altamente personalizzato. Il modo stabile più conveniente è editare un file
∼/.emacs, di solito modificando il valore di una variabile. Ad esempio, inserire in ∼/.emacs la stringa:
(setq inhibit-startup-message t)
serve a far sì che Emacs si apra direttamente con un buffer scratch vuoto, senza mostrare la finestra
di benvenuto. Se si vuole rendere sempre attiva la modalità auto-fill, ipotizzando di fissare l’a capo
all’ottantesimo carattere, si aggiungeranno in ∼/.emacs le seguenti righe:
(add-hook 'text-mode-hook 'text-mode-hook-identify)
(add-hook 'text-mode-hook 'turn-on-auto-fill)
(setq-default fill-column 80)
e via dicendo. I cambiamenti apportati mediante il menu Option – Customize Emacs sono salvati
proprio in ∼/.emacs.
Imparare a usare Emacs
Emacs contiene un ampio tutorial che consente di apprendere tutte le sue funzioni fondamentali.
Esso si avvia col comando C-h t. È disponibile in numerose lingue, compreso l’italiano.
La pagina man relativa a Emacs è molto sintetica, mentre una guida estesissima e dettagliata è dispo-
nibile in formato info. C’è anche la possibilità di ricorrere ad apropos per informazioni sulle funzioni se
non si ricorda esattamente la stringa completa.
Il principiante è messo al riparo dal commettere errori con comandi potenzialmente pericolosi, i
quali, di default, sono disattivati. Invocando tali comandi, si riceve un messaggio che domanda se atti-
varli o meno. Premendo la barra spaziatrice essi verranno comunque attivati, premendo n essi invece
rimarranno disattivati.
Comandi principali di Emacs
a) Spostamento del punto
Sposta il punto alla riga precedente = C-p (previous)
Sposta il punto alla riga successiva = C-n (next)
Sposta il punto indietro (a sinistra) di un carattere = C-b (backward)
Sposta il punto avanti (a destra) di un carattere = C-f (forward)
Sposta il punto indietro (a sinistra) di una parola = M-b
Sposta il punto avanti (a destra) di una parola = M-f
Sposta il punto a inizio riga = C-a
Sposta il punto a fine riga = C-e
Sposta il punto all’inizio del paragrafo = M-a
Sposta il punto alla fine del paragrafo = M-e
Sposta il punto avanti di una schermata = C-v
Sposta il punto indietro di una schermata = M-v
Centra il testo rispetto alla riga dov’è il punto: C-l
Sposta il punto all’inizio del testo = M-<
Sposta il punto alla fine del testo = M->
b) Gestione del testo
Elimina il carattere a sinistra del punto = C-d
Elimina il carattere a destra del punto = Canc
Elimina la parola posta prima del punto = M-Del
Elimina la parola posta dopo il punto = M-d
Elimina il testo dal punto alla fine della riga = C-k
Elimina il testo dal segno al punto = M-k
Cancella tutto il testo = C-l
88 5. Ottimizzare il server grafico
La seconda informazione si ottiene invece analizzando l’output del comando: lspci [-v], dove, fra
l’altro, dovremmo leggere qualcosa come:
00:0a.0 Multimedia audio controller: Creative Labs SB Live! EMU10k1 (rev 0a)
Subsystem: Creative Labs SBLive! 5.1 Digital Model SB0220
Flags: bus master, medium devsel, latency 32, IRQ 9
I/O ports at d800 [size=32]
Capabilities: [dc] Power Management version 1
Scheda n. 13
La gestione dei moduli
I moduli del kernel consentono a determinate periferiche di funzionare, oppure abilitano particolari
funzioni nel sistema; normalmente, si distinguono i driver dei dispositivi, quelli per i file system e i
driver di rete. Di solito, il nome dei file oggetto ha estensione .o, e così è stato anche per i moduli del
kernel fino alla versione 2.4. Con il kernel 2.6, anche per facilitarne l’identificazione, i moduli hanno
assunto l’estensione .ko (abbreviazione di «kernel object»). Il file .ko, in realtà, è composto da varie
sezioni ed è il risultato del collegamento di due file: il vero e proprio file oggetto contenente il codice, di
89
90 6. Ottimizzare il server sonoro
estensione .o, e un file che contiene informazioni aggiuntive riguardo all’ambiente di compilazione del
modulo, cioè un file oggetto ELF il cui nome adotta l’estensione .mod.o.
Tutti i comandi per la gestione dei moduli sono contenuti nel pacchetto module-init-tools, che imple-
menta sia le modutils per operare coi kernel 2.4, sia i module-init-tools propriamente detti, per operare
coi kernel 2.6.
Il vantaggio di un kernel modulare è che le voci abilitate per l’appunto in questa forma vengono
caricate in memoria solo quando ve ne sia effettiva necessità. I moduli vengono collocati nella directory
/lib/modules/versione_kernel ed elencati alla radice di questa directory nel file modules.dep, che ne in-
dividua anche le dipendenze; esso viene generato dal comando depmod. Il kernel è in grado di caricare
automaticamente i moduli che determinati programmi invocano, qualora vi siano state abilitate, nel-
la sezione Loadable module support, le voci: Enable loadable module support e Automatic kernel
module loading.
In alcuni casi però è necessario intervenire manualmente per caricare o rimuovere un determinato
modulo. Tutti i comandi relativi alla gestione dei moduli sono contenuti nel pacchetto module-init-tools
(che integra sia le modutils, ossia gli strumenti di gestione per il kernel 2.4, sia i module-init-tools, ossia
le utilità di gestione per il kernel 2.6).
Il comando: insmod /percorso/nome_modulo è il modo più semplice per inserire un modulo. Ad
esempio, si ha: insmod /lib/modules/2.6.18/kernel/drivers/block/loop.ko.
Il comando: rmmod nome_modulo è il modo più semplice per rimuovere un modulo. Vi si possono
aggiungere, fra l’altro, l’opzione -f, che forza la rimozione (e che funziona solo se è stata selezionata,
nella sezione del kernel Loadable module support, la voce: Forced module unloading), e l’opzione
-w, che aspetta che il modulo non sia in uso presso nessuno degli utenti loggati nel sistema.
Il comando modprobe aggiunge o rimuove intelligentemente uno o più moduli del kernel che sono
attualmente caricati nel sistema. Infatti è in grado anche di gestire le dipendenze dei moduli stessi. Esso
può valersi di una serie di opzioni, fra cui ricordiamo:
-v: esegue il comando in modo verboso, cioè fornendo una serie di informazioni sul processo in corso.
-C --config: esegue il comando in base non alla configurazione di /etc/modprobe.conf o dei file di
/etc/modprobe.d, ma in base a un file di configurazione specificato nel comando (col suo intero percorso).
--ignore-install oppure --ignore-remove: ignora i comandi di installazione o di rimozione, ed è
utile soprattutto nel caso vi siano più moduli connessi.
-r: rimuove il modulo specificato; se il modulo dipende da un altro che non è in uso, cerca di rimuovere
anche quello. A differenza del comando di inserimento, applicabile a un solo modulo, il comando di
rimozione può applicarsi contemporaneamente a più moduli.
-l: specifica i moduli presenti nel kernel (non solo quelli attualmente caricati, per consultare i quali si
ricorre invece al comando lsmod).
Fino a Slackware 10.2, i moduli da caricare o rimuovere col kernel 2.6 erano specificati nel file
/etc/modprobe.conf, ma ora la situazione è cambiata. Infatti, soprattutto per gestire meglio le eventuali
dipendenze fra moduli, ma anche per creare alias adeguati o caricare più moduli, si è preferito ricorrere
a una directory, e cioè /etc/modprobe.d, in cui i vari moduli e il loro comportamento è specificato separa-
tamente, ciascuno in un suo file. In questi file va inserito un comando per riga, mentre una barra inversa
a fine riga precisa che il comando continua in quella successiva e il simbolo del cancelletto imposta un
commento.
Le opzioni che possono essere precisate sono innanzitutto gli alias per un determinato modulo. Ad
esempio, la stringa alias mio_modulo modulo_con_un_nome_lunghissimo significa che si potrà ca-
ricare quel modulo usando la forma abbreviata. Per gestire più moduli si possono adottare anche i
caratteri jolly. In secondo luogo si possono aggiungere ai moduli le opzioni del caso.
Una funzione importante dei file di /etc/modprobe.d è che i moduli possono essere caricati non sem-
plicemente dal kernel, ma ricorrendo a un comando specificato. Ciò si rivela utile, ad esempio, nel caso in
cui un modulo lavora meglio se caricato insieme a un altro modulo già installato (e non caricato), ma che
6.1. Configurare il server sonoro 91
non dipende da esso, per cui il semplice comando: modprobe nome_modulo non caricherebbe il secondo.
Il risultato potrebbe essere qualcosa come la stringa: install modulo_1 /sbin/modprobe modulo_2 ;
sbin modprobe --ignore install modulo_1 . L’opzione --ignore-install fa in modo che la seconda
occorrenza di modprobe non causi un nuovo tentativo di eseguire il medesimo comando di installazio-
ne. Si può anche stabilire un ordine gerarchico nel caricamento dei moduli. Ad esempio, il comando:
install probe-ethernet /sbin/modprobe e100 || /sbin/modprobe eepro100 fa sì che si cerchi di
caricare dapprima il driver e100, e solo nell’eventualità che il comando non riesca si cerchi di caricare
eepro100, allorché si lancia il comando modprobe ethernet.
I file di /etc/modprobe.d possono anche rimuovere i moduli, quando al comando modprobe
viene aggiunta l’opzione -r. Il comportamento è del tutto analogo al comando di caricamen-
to. La controparte dei due comandi appena visti è infatti: remove modulo_1 /sbin/modprobe
-r --ignore-remove modulo_1 && /sbin/modprobe -r modulo_2 nel primo caso, e remove
probe-ethernet /sbin/modprobe -r eepro100 || sbin/modprobe -r e100 nel secondo.
C’è la possibilità di riferirsi ad altri file di configurazione col comando: include nome_file .
Infine, c’è la possibilità di blacklistare determinati moduli, ossia di inibirne il caricamento. Il modo
classico per blacklistare un modulo è inserirne il nome o l’alias in /etc/modprobe.d/blacklist.
Per approntare i moduli della scheda sonora ci soccorre l’utilità alsaconf, che dovrebbe individua-
re automaticamente la scheda audio del computer. È sufficiente lanciare il comando alsaconf e quindi
acconsentire a che il programma aggiunga le righe pertinenti in uno dei due succitati file di configura-
zione. L’utilità alsaconf non riconosce la scheda nel caso il supporto a essa sia stato inserito nel kernel,
ma in tale situazione non ci si vale nemmeno dei driver di Alsa.
Per ottimizzare la resa della scheda audio, innanzitutto abilitiamo da console il server sonoro, che di
default potrebbe essere muto, col comando alsamixer, che apre un menu pseudo-grafico in cui dobbia-
mo impostare i volumi delle varie applicazioni mediante i tasti freccetta; premendo il tasto a interruttore
m si possono abilitare o disabilitare i singoli canali, naturalmente diversi a seconda del modello e del-
le caratteristiche della scheda audio. Un buon sistema empirico è quello di tenere gli altoparlanti del
computer accesi a un volume relativamente sostenuto per poter rilevare eventuali disturbi, come fischi
e fruscii, o magari suonare un CD con KSCd o qualche mp3, dopo di che si esce dal programma sem-
plicemente premendo Esc. Una volta terminata l’operazione, i valori così settati vanno memorizzati
col comando: alsactl store. Le impostazioni (uguali per tutti gli utenti) vengono trascritte nel file
/etc/asound.state. Ulteriori modifiche possono essere apportate in un secondo momento, richiamando
il mixer. Anche in questo caso i nuovi valori andranno registrati col comando: alsactl store.
Non resta che andare nel Centro di controllo di KDE, scegliere ALSA come dispositivo audio del
sistema sonoro e fare gli ultimi eventuali aggiustamenti al mixer di KDE, e cioè Kmixer, e/o ricorrendo
ad aumix.
Scheda n. 14
Il sistema sonoro in GNU/Linux
Il primo sistema audio di GNU/Linux è stato OSS/Free (Open Sound System), una serie di driver atti
a fornire un’API (acronimo di «Applications Program[ming] Interface») per svariate piattaforme Unix
che supportavano innumerevoli dispositivi audio. Tuttavia i driver di OSS non erano standardizzati.
In seguito lo sviluppo di OSS si concentrò su GNU/Linux e nacque così OSS/Linux, il quale tuttavia
procedeva piuttosto a rilento rispetto agli sviluppi del kernel. Il lavoro degli sviluppatori finì per ab-
bandonare progressivamente OSS, invece di rinnovarlo, a favore di un progetto del tutto nuovo: ALSA
(acronimo di «Advanced Linux Sound Architecture»).
92 6. Ottimizzare il server sonoro
ALSA è un sistema modulare con supporto MIDI, in grado di sostituire tutte le applicazioni basate
su OSS (con il quale è pienamente compatibile) in maniera anche più efficiente. Include inoltre un’API
e una libreria in user-space (libasound) per i programmatori che intendono gestire le caratteristiche e le
potenzialità del server sonoro. ALSA ricorre a devfs e procfs, astraendo dall’interazione fra hardware
e software, su cui OSS era invece largamente curvato. Si appoggia pertanto a una serie di dispositivi
virtuali, contenuti in /dev/snd. In tal modo ha acquisito una struttura organica che riesce a gestire una
grande quantità di schede audio anche professionali e con supporto MIDI. L’elenco delle schede sonore
supportate da ALSA si può leggere nel sito ufficiale, all’indirizzo: http://www.alsa-project.org. Infine,
ALSA offre una serie di piccole applicazioni che consentono di controllare i vari aspetti del sistema, fra
le quali: amixer, per regolare il volume e i controlli del suono; alsamixer, una versione pseudo-grafica
di amixer basata su ncurses; aconnect e aseqnet per connettersi a dispositivi MIDI e controllare le porte
connesse; aplay, aplaymidi e arecordmidi, applicazioni da riga di comando per eseguire e registrare
numerosi tipi di file sonori.
ALSA interagisce con dei software chiamati «server sonori» che integrano le potenzialità di quanto
offerto dal kernel. Le applicazioni potrebbero usare direttamente ALSA, ma diverse schede audio (so-
prattutto i modelli più economici) non hanno un mixer hardware integrato (o, in certi casi, ALSA non è
in grado di usarlo); di conseguenza, appena un’applicazione iniziasse a riprodurre i suoni, le altre non
riuscirebbero a usarla. È per ovviare a questo limite che si è fatto ricorso, per l’appunto, ai demoni. Gra-
zie a essi le applicazioni gestite da KDE, anziché usare l’API di ALSA, fanno ricorso a quella di aRTS,
che si occupa di mixare tutti i flussi sonori in ingresso e di farli riprodurre dalla scheda audio. Peraltro,
dati i notori limiti di aRTS e stando agli attuali annunci, esso verrà abbandonato in KDE 4 a favore di
una nuova struttura multimediale chiamata Phonon, capace di usare tutti i backend audio.
Tra gli innumerevoli server sonori, oltre al già menzionato aRTS (il server sonoro di KDE), facilmen-
te configurabile, ma dotato di qualità non professionale, menzioniamo ESD (acronimo di «Enlightened
Sound Daemon», il server sonoro adottato da Gnome), con poche opzioni da configurare; JACK (acroni-
mo di «Jack Audio Connection Kit»), che richiede ALSA potenziandone notevolmente le capacità. Esso
funge da tessuto connettivo per tutte le applicazioni audio installate nel sistema che lo supportano e
consente a un segnale audio di fluire da una all’altra di queste applicazioni per esserne modificato.
La libreria xine-lib permette di decodificare e riprodurre flussi audio e video mediante la sua API.
Viene utilizzata da diverse applicazioni (ad esempio, da amarok) alla stessa stregua di aRTS, e – a sua
volta – può utilizzare aRTS per effettuare l’output.
Gstreamer è un framework (in via di sviluppo) di flussi multimediali assai complesso: esso permet-
te alle applicazioni di condividere un set comune di plugin per operazioni quali codifica e decodifica
video, codifica e decodifica audio, filtri audio e video, visualizzazione audio, Web streaming e qual-
siasi altra che fluisca in tempo reale o in altro modo. Esso presenta un’API ben definita, attraverso la
quale è possibile istanziare i vari componenti e interconnetterli, creando una catena che può svolgere i
compiti più disparati. In questo modo, solo Gstreamer svolge il compito di interpretare i vari formati
di file e, in ultima istanza, definisce i vari formati supportati o meno da un programma, a seconda dei
supporti con cui è stato compilato. Ad esempio, se compilato col supporto xvid, qualunque player vi-
deo che usa Gstreamer sarà in grado di riprodurre file xvid; questa modularità spiega perché le distro
che lo adottano in genere hanno un pacchetto base per gstreamer e altri pacchetti come gstreamer-mp3,
gstremer-vorbis, ecc.; quando nuovi formati multimediali saranno inventati, basterà inserire il supporto
a questi in Gstreamer perché tutte le applicazioni, anche quelle scritte prima, siano grado di riprodurli.
In conclusione, potrebbe trattarsi di un mezzo per unificare il lavoro dei maggiori Desktop Environment.
In GNU/Linux è così possibile non solo ascoltare la maggior parte dei formati audio, ma anche
produrre e gestire gli effetti digitali con LADSPA (acronimo di «Linux Audio Developers Simple Plugin
Architecture»), e registrare e mixare con una ormai nutrita serie di programmi di livello professionale.
Insomma, il settore del sonoro nell’ambito dei sistemi GNU/Linux, che pure non erano storicamente
nati con l’obiettivo di gestire la multimedialità, appare attualmente in piena espansione e tutto sommato
6.2. Il server sonoro e gli utenti 93
campioni di suoni digitali (ad esempio, una tromba, un violino, un pianoforte) e le istruzioni perché il
sintetizzatore li possa gestire (variando inoltre, a seconda delle impostazioni, il tocco, la dinamica, effetti
come il vibrato ecc.). Il file (di estensione .fs2, anche se esiste un altro formato, .GUS) che contiene questa
campionatura si chiama «banco soundfont», mentre i vari campioni sonori presenti al suo interno hanno
estensione .pat (e sono chiamati «patch»). Di consueto, un banco soundfont contiene un set di strumenti
nel banco 0, alle posizioni 0-127, e quindi un set di percussioni al banco 128, posizione 0. È possibile
scaricare dalla rete parecchi soundfont, e inoltre esistono delle utilità per crearne di nuovi, il che tuttavia
presuppone che si faccia dei MIDI un uso abbastanza professionale. Fra i soundfont disponibili in rete,
una qualità particolarmente buona va riconosciuta alla raccolta nota col nome di Eawpatches.
Fra le schede sonore non integrate, soltanto SoundBlaster ha un sintetizzatore, che però va configu-
rato; la prima scheda ad avere il chip è stata l’ormai vecchia Sound Blaster AWE 32/64. Le schede sonore
integrate invece non lo hanno mai, e allora bisogna ricorrere a un software di emulazione. È facile ren-
dersene conto verificando (a maggior ragione in occasione di un nuovo acquisto) le schede supportate
da Alsa, all’indirizzo: http://www.linuxfocus.org/common/src/article259/SOUNDCARDS.html.
sfxload /usr/lib/sfbank/nome_soundfont.SF2
oppure:
asfxload /usr/lib/sfbank/nome_soundfont.SF2
Pmidi è invece in grado di fornirci alcune informazioni sulle porte midi, se lanciato con l’opzione -l.
Ad esempio, si potrebbe avere questo output:
bash-3.00# pmidi -l
Port Client name Port name
64:0 EMU10K1 MPU-401 (UART) EMU10K1 MPU-401 (UART)
65:0 Emu10k1 WaveTable Emu10k1 Port 0
65:1 Emu10k1 WaveTable Emu10k1 Port 1
65:2 Emu10k1 WaveTable Emu10k1 Port 2
65:3 Emu10k1 WaveTable Emu10k1 Port 3
Usare TiMidity++
TiMidity++ è un renderizzatore di file MIDI, atto a generare i file audio; qui tuttavia esso ci interessa
piuttosto come sintetizzatore in real time, in grado cioè di inviare l’uscita audio e di eseguire i MIDI in
tempo reale. Con TiMidity++, oltre a installare il programma, è necessario:
a) avere a disposizione i soundfont
b) scompattarli in una directory (a piacere) come /usr/lib/sfbank/timidity/instruments
c) creare in /usr/share/timidity/timidity.cfg il file timidity.cfg che indica la posizione del banco soundfont e
l’elenco delle mappature (in parecchi casi i pacchetti di soundfont contengono anche, già compilato, il
file di configurazione). Tale file potrebbe essere (ne offriamo uno stralcio):
soundfont /usr/lib/sfbank/timidity/instruments
bank 0
0 instruments/acpiano amp=125
1 instruments/britepno amp=115
2 instruments/synpiano amp=115
3 instruments/honky
4 instruments/epiano1
.
.
.
125 instruments/helicptr
126 instruments/applause
#127 instruments/pistol
96 6. Ottimizzare il server sonoro
##############################################################################
# The GUS drum patches
#
# Many patches are forced to note=xx, since they are keyed to C4 or some
# other note rather than to the key they are played on in the set. It is
# simpler to change the .cfg file than edit the patches :) All the congas
# really are best keyed to note=62, those aren't typos.
drumset 0
35 instruments/kick1
36 instruments/kick2
.
.
.
86 instruments/surdo1
87 instruments/surdo2
In presenza di un file di mappatura .SF2 non è necessario scompattare nulla. Basta collocarlo in una
directory a piacere, come potrebbe essere /usr/lib/sfbank, e riportarne la collocazione sempre nel sopra
citato file di configurazione, e cioè /usr/share/timidity/timidity.cfg, in modo che risulti, ad esempio:
soundfont /usr/lib/sfbank/PC51f.sf2.
Un comando classico per ascoltare un file MIDI è: timidity -iA -Os file.mid, dove -iA indica di
usare il dispositivo pcm di ALSA e -Os di usare l’interfaccia ALSA sequencer. Per lasciar fare tutto a
TiMidity++, basta il comando: timidity file.mid.
Poiché TiMidity++ si appoggia in questo caso a /dev/snd/seq (e Kmid a /dev/sequencer, emulazione
OSS del medesimo dispositivo), si deve prestare attenzione a un’eventuale compilazione del kernel 2.6
se si intende abilitare udev, poiché questi dispositivi non vengono creati automaticamente: dunque è
necessario abilitare Alsa direttamente nel kernel e inserirvi le voci Sequencer support e OSS Sequencer
API.
Naturalmente è possibile usare altri sistemi sonori, da Arts a Jack, modificando le opzioni. Il coman-
do: timidity -h mostra una lunga lista di opzioni.
È infine possibile adottare delle GUI, se sono state abilitate nella compilazione del pacchetto. Ad
esempio, lanciando timidity -ig si aprirà l’interfaccia grafica basata sulle gtk, e via dicendo.
Usare Fluidsynth
Con Fluidsynt il comando classico per ascoltare un file MIDI presenta la sintassi: [comando] [opzioni]
[soundfont] [file_midi ]) e risulta: fluidsynth -a alsa -m alsa_seq /usr/lib/sfbank/PC51f.sf2
6.3. Ascoltare i file MIDI 97
file.mid, dove -a abbrevia --audio-driver, e ancora una volta le opzioni richiedono al programma
di usare il dispositivo pcm di ALSA e l’interfaccia ALSA sequencer. Più semplicemente, il comando
potrebbe allora essere: fluidsynth /usr/lib/sfbank/PC51f.sf2 file.mid.
Usare Kmid
Per usare un’interfaccia come Kmid, è necessario lanciare come demone (cioè come ALSA sequencer)
un emulatore in background (TiMidity++ ammette questa possibilità) e quindi scegliere la porta che sarà
visibile nel menu delle impostazioni di Kmid. Il comando da console sarà allora: timidity -iA -Os &
oppure: timidity -iA -Os --background oppure ancora, nel modo più semplice: timidity &.
A questo punto, nella finestra delle impostazioni di Kmid si troveranno le voci relative alle porte di
TiMidity++ per il sequencer che si possono utilizzare.
Per evitare di caricare manualmente TiMidity++ in background ogni volta, è possibile aggiungere in
/etc/rc.d/rc.local le righe:
# starting Timidity
timidity=/usr/bin/timidity
$timidity -iA -Os > /dev/null &
dove il reindirizzamento a /dev/null serve a evitare di ricevere, in fase di caricamento del sistema,
messaggi noiosi.
Scheda n. 15
Che cosa sono i permessi
I tre tipi di permessi
In GNU/Linux, a differenza di quanto avviene in Windows, ogni applicazione presenta determinati
permessi, e precisamente tre: lettura, scrittura ed esecuzione. Essi vengono indicati con lettere o con
numeri: il permesso di lettura con r o con 4, di scrittura con w o con 2, di esecuzione con x o con 1. I
permessi complessivi vengono indicati con una triade di lettere o con un numero che è la somma dei vari
permessi numerici. Ad esempio, poiché root ha tutti i permessi, nei confronti di una certa applicazione
avrà il permesso rwx (e cioè di lettura, scrittura ed esecuzione) ossia il permesso 7 (4+2+1). Se un utente
ha solo il permesso di lettura, avrà il permesso r--, ossia 4, e via dicendo.
Inoltre i permessi sono distinti in tre triadi: la prima riguarda il proprietario dell’applicazione, la
seconda il gruppo, la terza tutti gli altri utenti. Le tre triadi sono indicate sempre con lettere o numeri.
Di conseguenza, se tutte le tre categorie (proprietario, gruppo, altri utenti) hanno tutti i permessi, l’ap-
plicazione avrà i seguenti permessi: rwxrwxrwx, e cioè 777. Se solo root ha tutti i permessi e le altre due
categorie solo il permesso di lettura, avremo: rwxr--r--, e cioè 744, e via dicendo. I permessi di un file
possono essere visualizzati da console col comando: ls -l nome_file
I permessi delle directory
Una situazione leggermente diversa si propone per i permessi delle directory. Il permesso r consente
la visualizzazione del loro contenuto, il permesso w ne consente la scrittura e cioè la modifica consisten-
te nell’aggiunta o nella rimozione di file, infine il permesso x ne consente l’attraversamento. Se si toglie
quest’ultimo permesso, non sarà più possibile entrare nelle directory interessate per leggerne il conte-
nuto. Invece, se si toglie a una directory il permesso di lettura, ma si lascia quello di attraversamento,
l’utente non potrà visualizzarne il contenuto, ma, se conosce esattamente il percorso e il nome di un file
presente al suo interno, potrà comunque leggerlo.
98 6. Ottimizzare il server sonoro
devono poter essere in grado di cambiare la loro password da soli, senza richiedere l’intervento dell’am-
ministratore del sistema, il comando in questione appartiene a root e ha il bit suid impostato; quando
esso è invocato da un utente normale, parte comunque con privilegi di root.
L’impostazione di questi permessi dev’essere attentamente valutata, perché può introdurre falle nella
sicurezza del sistema. I bit suid e sgid si impostano coi comandi chmod e chgrp con l’opzione +s, e
possono essere verificati col comando: ls -l, che visualizza una s al posto della x in corrispondenza dei
permessi di utente o gruppo.
Da notare che, se un file ha il bit suid/sgid, ma non quello di esecuzione, la S è maiuscola. Se invece
è una directory ad avere il bit sgid impostato, tutti i file creati al suo interno avranno i suoi stessi attri-
buti (proprietario e gruppo), indipendentemente da chi li crea, e tutte le directory create al suo interno
saranno dotate, ricorsivamente, del bit sgid.
La concessione dei permessi con sudo
La concessione di permessi speciali si può effettuare con sudo (acronimo di «superuser do»). Vi sono
infatti delle operazioni riservate a root, che però può decidere di farle compiere anche a determinati
utenti. In questo caso egli concede loro, in forma perpetua o revocabile, il permesso di svolgerle. A tal
fine è necessario editare il file /etc/sudoers. Benché sia prescritto di editarlo con visudo, una versione
di Vi studiata apposta per /etc/sudoers che è in grado di compiere una verifica della correttezza della
sintassi del file, in realtà è possibile modificarlo con qualsiasi editor, ed effettuare in seguito il controllo
lanciando il comando visudo -c. Infatti, se editato per intero con visudo, il file risulterà «lockato»,
ovvero sarà creato un file .tmp che blocca il file indicando che esso è in uso, per impedirne più accessi
contemporanei. Sudo è in grado di concede permessi definiti e delimitati a determinati utenti o gruppi
di utenti e si serve di una sintassi propria. Rinviamo qui all’ampia pagina man del programma.
100 6. Ottimizzare il server sonoro
Capitolo 7
101
102 7. Gestione degli utenti e dei gruppi
corrispondente all’account da eliminare; /etc/group, dove viene rimosso l’utente da tutti i gruppi in cui
è presente; viene infine eliminato l’eventuale file di spool della della sua mail in /var/spool/mail/utente.
Il comando userdel -r nome_utente rimuove anche la home dell’utente e tutti i file in esso contenuti.
dove «blocks» indica il numero totale di blocchi e «inodes» è il numero totale di inode (sempre in KB) che
l’utente ha a sua disposizione sulla partizione. Analogamente, per determinare la quota di un gruppo
sul proprio sistema, si dà il comando: edquota -g gruppo e allo stesso modo si aprirà vi per modificare
le quote di questo gruppo:
Le impostazioni stabilite coi comandi edquota -u utente e edquota -g gruppo vengono registrate
rispettivamente nei file /home/aquota.user e /home/aquota.group.
7.2. Le password 103
Il parametro Soft (Limit) indica l’ammontare massimo d’uso del disco di cui un utente dispone
su una partizione. Quando viene combinato con Grace Period, esso agisce come una linea di confine,
emettendo un avvertimento quando un utente la oltrepassa.
Il parametro Hard (Limit) funziona quando è impostato Grace Period. Specifica il limite assoluto
d’uso del disco, che non può essere violato da un utente.
Il parametro Grace (Period), lanciato col comando edquota -t, è il limite di tempo (possono essere
usate unità di tempo di secondi, minuti, ore, giorni, settimane e mesi) disponibile prima che venga fatto
rispettare il Soft Limit. Di default, in Slackware esso ammonta a sette giorni. Questo è infatti quanto
appare lanciando il comando edquota -t:
Per visualizzare un riepilogo delle informazioni sulle quote per un file system si usa il comando
repquota -a, che produce un output del tipo:
7.2 Le password
7.2.1 Il sistema delle password in Slackware
Nella gestione degli utenti, un ruolo particolarmente delicato è rappresentato dalle password. Slack-
ware, che utilizza il sistema shadow password, memorizza i dati degli utenti nel file /etc/passwd; esso
tuttavia, poiché dev’essere accessibile a tutti gli utenti, non contiene anche le password (ma solo l’indi-
cazione, consistente nella lettera «x», che c’è una password). Una riga del file /etc/passwd, relativa a un
fittizio utente prova, apparirà dunque:
prova:x:1001:100:,:/home/prova:/bin/bash
I vari campi, separati dal doppio punto, sono in sequenza: nome utente, password, User ID, Group ID
(il gruppo degli utenti users in Slackware è, di default, il numero 100), eventuali informazioni opzionali
per il finger separate da virgole (qui assenti), la home directory e la shell prescelta.
Le password sono invece presenti nel file /etc/shadow, in forma criptata. Analizziamo una riga del
file /etc/shadow, che potrebbe apparire così:
104 7. Gestione degli utenti e dei gruppi
prova:$1$uDl/w0z4$tMNrDOo0to76p9VWLXjkv1:12836:0:99999:7:::
Anche qui i vari campi sono separati dal doppio punto e, in sequenza, sono: nome utente, password
criptata, giorni passati dall’ultimo cambio di password (rispetto a Epoch, fissato per ora al 1° gennaio
1970), giorni prima che la password possa essere cambiata (qui lo zero indica che la password può
essere cambiata da subito), giorni che mancano allo scadere della password (il campo 99999 equivale a
dire che la password non scadrà mai), giorni che mancano allo scadere dell’account dell’utente, giorni
che mancano alla sospensione dell’utente, giorni dopo la sospensione per la disabilitazione dell’utente,
e un campo riservato. Se non si usa la funzione di sospensione dell’account, questi ultimi campi non
sono significativi.
prova:$1$uDl/w0z4$tMNrDOo0to76p9VWLXjkv1:12836:0:99999:7:::
dovrà diventare:
prova::12836:0:99999:7:::
Ancora una volta, salvato il file e riavviato il sistema, sarà possibile loggarsi come root senza ricevere
alcuna richiesta della password, che potrà essere ripristinata col comando passwd.
persone diverse) gliela comunicherà. A questo punto l’utente potrà effettuare l’accesso e cambiarla a
suo piacimento.
La seconda strategia consiste nel cancellare la password dell’utente in /etc/shadow. Di conseguenza,
la riga:
prova:$1$uDl/w0z4$tMNrDOo0to76p9VWLXjkv1:12836:0:99999:7:::
dovrà diventare:
prova::12836:0:99999:7:::
Al nuovo accesso, possibile a questo punto senza nessuna password, l’utente potrà reimpostarla. In
questo modo però, se il computer è condiviso da più persone, si potrebbe lasciare l’accesso all’account
dell’utente del tutto incontrollato finché questi non reimposti la sua password.
107
108 8. Gestione delle unità
eventi del mouse e inviarli al pipe /dev/gpmdata per farli utilizzare da altri programmi. Infine ci sono i
dispositivi a socket, speciali descrittori di file che offrono un’interfaccia di rete.
Coi kernel 2.4 si usa /sbin/hotplug per individuare i dispositivi, ma coi kernel 2.6 si usa
/sbin/udevsend (se si adotta udev). Ciò dovrebbe lavorare meglio nei sistemi che hanno i
kernel 2.6 con udev e HAL.
Ma Slackware ha sempre diffidato da HAL, almeno fino a questo momento. E subito dopo, a propo-
sito di udev, anche in relazione al lavoro di Piter Punk, si legge:
Ciò che sta accadendo è molto interessante, ma ci sono delle ragioni che mi hanno spinto
a fare solo dei piccoli passi in questa direzione. Ad esempio, era bello popolare /dev prima di
verificare le partizioni e montarle in modalità di lettura e scrittura, ma sembra che ciò non sia
più possibile. Inoltre, abbiamo notizia di componenti hardware che non sono stati identificati
correttamente (ed è capitato anche a me). Fondamentalmente, sembra trattarsi del problema
di trovare, nel processo di avvio, il momento giusto dove piazzare udev, ma ci sono anche
parecchi problemi riguardante le regole di udev. Noi ci adegueremo, ma probabilmente non
nella prossima versione. Questo aggiornamento a udev-071 fornisce l’adeguamento mini-
mo alla documentazione del kernel 2.6.16.9, è stato attentamente testato e funziona bene.
110 8. Gestione delle unità
udev-0.90 avvia più velocemente la macchina, ma non è altrettanto affidabile (almeno nei
test compiuti qui, in base a ciò che viene invocato dai nostri script di inizializzazione), e noi
non siamo mai stati dell’avviso di preferire la velocità all’affidabilità.
La versione di udev attualmente presente in Slackware, nata da una lunga ed e laborata serie di
versioni, sembra ora intercettare adeguatamente gli eventi e può di conseguenza prescindere ormai da
hotplug. Sarà quindi possibile disinstallare hotplug o semplicemente disabilitarlo mediante: chmod a-x
/etc/rc.d/rc.hotplug. Tale versione richiede il kernel 2.6.15 o superiori
Ciò significa che il database di udev risiede nel file nascosto /dev/.udev.tdb.
3) quale directory contiene le regole:
Ciò significa che le regole sono scritte nel file /etc/udev/rules.d/udev.rules e negli altri file della directo-
ry. Questo file non dovrebbe essere modificato: nuove regole possono essere aggiunte semplicemente
inserendo nella stessa directory un nuovo file. Questa prassi è conveniente perché, se si aggiorna udev,
/etc/udev/rules.d/udev.rules viene sovrascritto cancellando le regole aggiunte; certo, è sempre possibi-
le farne un backup e poi copiare le nostre regole nel file nuovo, ma tutto questo lavoro si risparmia
inserendole in un altro file, nuovo.
Tutti i file di regole creati dovranno comunque avere l’estensione .rules. Poiché i file di questa direc-
tory sono letti in ordine alfabetico, se si vuol far sì che le regole personalizzate siano lette prima del file di
default, bisogna avere l’accortezza di chiamare il file in modo che, alfabeticamente, preceda udev.rules.
Nelle versioni più vecchie di udev c’era inoltre la necessità di specificare quale directory conteneva i
permessi e comparivano pertanto anche le righe:
Ciò significa che i permessi erano scritti nel file /etc/udev/permissions.d/udev.permissions (ma, a dire
il vero, lo stesso risultato si otteneva se tali informazioni erano contenute in /etc/udev/udev.conf). Qui
trovavamo elencati i nomi dei dispositivi, l’utente e il gruppo di appartenenza, e i permessi nella classica
forma ottale. L’ultima parte di questi file specifica e proprietà dei dispositivi che non sono governati da
regole particolari.
8.2. Devfs e udev 111
Nelle più recenti versioni sono state modificate alcune caratteristiche di udev, sia per quanto riguarda
le modalità per conferire i permessi, sia per quanto riguarda la sintassi delle regole. Infatti non esiste più
il file /etc/udev/permission, e i permessi e i mode vanno collocati in /etc/udev/rules.d/udev.rules o in altri
file appositamente creati e collocati in questa directory.
BUS coincide col tipo di bus del dispositivo. Esempi tipici sono: usb, scsi e ide.
KERNEL coincide coi nomi assegnati dal kernel. Esempi tipici sono: hda, tty, usb0 e lp0.
SUBSYSTEM coincide coi nomi assegnati dal subsystem del kernel. Generalmente, ma non sempre,
tali campi coincidono col nome di bus.
DRIVER coincide coi nomi dei driver che controllano il dispositivo. Esempi sono: radeon e usb-storage.
ID coincide col numero del dispositivo del bus a cui è collegato.
PLACE coincide con la posizione fisica del dispositivo sul bus. Ciò è valido quasi esclusivamente per
dispositivi USB.
SYSFS {nomefile} si tratta del nome del dispositivo che udev legge in /sys e per il quale cerca di in-
dividuare il valore. Può trattarsi della marca, del numero seriale, dell’UUID o dell’etichetta di
sistema di un dispositivo (in ogni regola, possono essere posti fino a cinque campi di questo tipo,
tra graffe).
PROGRAM questo campo consente a udev di richiamare un qualsiasi programma esterno e di usare
l’output per denominare i dispositivi.
RESULT questo campo ricorre all’output finale di PROGRAM (e può dunque essere usato solo dopo
un call di PROGRAM).
NAME questo campo dice a udev come chiamare il dispositivo in /dev. Il suo valore è il key relativo, a
cui viene pertanto assegnato questo NAME.
SYMLINK è il nome di un link simbolico creato per richiamare il NAME e specifica localizzazioni
addizionali dove il dispositivo sarà linkato. Si possono usare più SYMLINK separati da uno spazio.
Se il link si inserisce in una regola priva di NAME, la regola non viene applicata, ma resta in
attesa di una regola che crei il node. Ciò può risultare utile per creare un symlink a un node di un
dispositivo, riferito a un utente specificato più tardi in un file di regole.
Udevinfo inizia listando le informazioni sul node richiamato, e prosegue cercando quelle sugli altri
node dei dispositivi dello stesso tipo, elencando tutti i possibili attributi nel formato delle key di udev.
Il secondo comando che abbiamo menzionato fornirà un output di questo tipo:
udevinfo starts with the device the node belongs to and then walks up
the device chain, to print for every device found, all possibly useful
attributes in the udev key format.
Only attributes within one device section may be used together in one
rule, to match the device for which the node will be created.
SYSFS{manufacturer}=="hp"
SYSFS{maxchild}=="0"
SYSFS{product}=="deskjet 6122"
SYSFS{serial}=="MY29K2B46033"
SYSFS{speed}=="12"
SYSFS{version}==" 2.00"
KERNEL=="microcode", NAME="cpu/microcode"
Se in effetti il nome nel kernel è microcode, allora verrà creato il dispositivo cpu/microcode.
Allo stesso modo, si può far sì che la stampante non venga chiamate semplicemente lp0, ma col un
nome indicativo, come HP_DeskJet_6122.
Se vogliamo creare dei node per per più dispositivi omologhi, la regola apparirà come segue:
KERNEL=="controlC[0-9]*", NAME="snd/%k"
In questo modo, per tutti i dispositivi il cui nome inizia con la stringa controlC (parliamo qui di
espressioni regolari) verranno creati dei node nella directory /snd che prenderanno il nome assegnato
loro dal kernel. %k è uno dei cosiddetti «operatori di sostituzione» di cui si vale la sintassi di udev.
Gli operatori di sostituzione sono:
%e se già esiste il node per un dispositivo, il più piccolo intero positivo decimale N è sostituito in
modo che il nome risultante non coincida con nessun node già esistente (altrimenti non avrebbe
luogo alcuna sostituzione). Ciò serve per creare compatibilità fra più sysmlink e per enumerare
dispositivi dello stesso tipo, originati da differenti sottosistemi del kernel.
%% il carattere % stesso.
facciamo in modo che, quando il dispositivo è inserito nella presa USB e rilevato da hotplug, udev gli
assegni stabilmente il nome camera, dal momento che ne vengono prima rilevati il bus e il nome della
marca.
Lettore CD e masterizzatore
Se vi vuole applicare una regola per definire stabilmente il lettore CD e il masterizzatore (ipotizzando
che il primo si riferisca a /dev/hdc e il secondo a /dev/hdd), le due regole da creare (eliminando quelle
preesistenti) saranno:
Poiché al riavvio di udev si avrà che /dev/cdrom punta a /dev/hdc, che /dev/cdrw punta a /dev/hdd, e
che le due nuove regole di udev definiscono categoricamente i due link, in /etc/fstab l’avvio delle righe
relative ai due dispositivi dovrà risultare come segue:
In questo modo, eventuali ulteriori modifiche ai dispositivi richiederanno soltanto la modifica del
file con le regole e non anche di /etc/fstab, i cui link vengono risistemati automaticamente grazie a udev.
Due stampanti
Allo stesso modo è possibile risolvere il problema della eventuale presenza di due stampanti USB,
magari una laser in bianco e nero (chiamata lp_bw) e una a getto d’inchiostro, a colori (chiamata lp_color).
Il node del dispositivo sarebbe diverso se le inserissimo in momenti diversi nella presa USB, compor-
tando problemi per la stampa e, ancor di più, per un’eventuale condivisione stampanti. Con una regola
di udev possiamo invece fare in modo che a ogni stampante sia attribuito un identificativo univoco, del
tutto indipendentemente dall’ordine con il quale esse vengono collegate al computer. La doppia regola
assumerà dunque questo aspetto:
Quando udev rileva il primo numero seriale, lo associa al node dal nome lp_color e quando invece
rileva il secondo, al node dal nome lp_b&w.
116 8. Gestione delle unità
Un’altra importante funzione di udev è la possibilità di richiamare dei programmi esterni (come
degli script) per determinare quale nome deve coincidere con un dispositivo, o se deve coincidere con
esso. Ciò serve se le regole non sono sufficientemente elastiche. Ad esempio, se si vuole utilizzare un
dato, diciamo il nome dell’artista, di un CD-ROM musicale, non c’è modo per poterlo fare mediante
sysf, che non ha nulla a che vedere coi contenuti del CD. Dobbiamo allora far sì che udev richiami il
programma name_cdrom.pl (un ipotetico script Perl), non appena il kernel percepisce un dispositivo a
blocchi. La regola assume la forma seguente:
In questo modo la regola cerca ogni dispositivo che inizia con «h» o con «d» seguito da una «s» e
quindi da una lettera qualsiasi dell’alfabeto. Se coincide con un qualche dispositivo, viene invocato lo
script Perl name_cdrom.pl. In questo script sono forniti due argomenti, il minor e il major number del
dispositivo (cioè %M e %m). Se il programma riesce, il primo esito fornisce il nome del dispositivo (cioè
%c1). Viene così creato un link simbolico al file /dev/cdrom, cosicché gli altri programmi possono trovare
il dispositivo /dev/cdrom stesso nel sistema. Lo script fa cercare il nome dell’artista nel database freedb,
ammesso che il sistema sia connesso a Internet.
Scheda n. 16
I link simbolici
In GNU/Linux è possibile avere dei collegamenti a file o directory in maniera trasparente. Un link
simbolico (detto anche symlink o soft link) è un file che punta a un altro file. Se per esempio volessimo
(o avessimo la necessità di) chiamare lo stesso file con due nomi distinti, per evitare di ricopiare a ogni
modifica uno dei due file (cosa che occuperebbe anche più spazio sul disco fisso), potremmo creare un
link simbolico.
La sintassi del comando è: ln -s /percorso /nome_file /percorso/nome_link .
I link simbolici sono distinti dai file cui puntano, cioè all’inode number del primo ci sono le
informazioni sull’inode number del secondo.
I link simbolici si differenziano dai cosiddetti hard link: questi ultimi sono riferimenti multipli che
puntano infatti allo stesso inode number, quindi si hanno due repliche dello stesso file con lo spazio di
uno. In tal modo un singolo file può essere raggiunto attraverso percorsi differenti. Essi si creano col
comando: ln /percorso /nome_file /percorso/nome_link .
Di conseguenza, se si cancella il file puntato da un link simbolico, resterà un link «penzolante» (dan-
gling) perché non esiste più il file a cui dovrebbe riferirsi. Se invece si cancella un file puntato da un
hard link, non si farà altro che cancellare uno dei nomi con cui veniva chiamato quel file; il file viene
effettivamente cancellato solo quando il conteggio dei link è uguale a 0.
Le uniche limitazioni nella creazione di hard link stanno nel fatto che essi non si possono riferire a
directory, e nemmeno a file che risiedono su dispositivi differenti.
8.3. Il montaggi dei dispositivi 117
Scheda n. 17
Il file /etc/fstab
Ogni riga del file è dedicata a un determinato dispositivo, secondo una sintassi del tipo:
[dispositivo] [punto di montaggio] [file system] [opzioni di montaggio] [dump]
[check]
I dispositivi
Ogni tipo di dispositivo è indicato da una sigla. Vediamo i principali.
hd disco fisso IDE. In particolare si avrà hdxn, dove x indica il disco e n la partizione. Come sappiamo,
hda è il master sul controller primario e hdb lo slave sul controller primario; hdc è il master sul
controller secondario e hdd lo slave sul controller secondario. Coi numeri invece vengono indicate
le partizioni. Dunque /dev/hda1 indicherà la prima partizione del primo disco rigido, /dev/hda2 la
118 8. Gestione delle unità
seconda, /dev/hdb1 la prima partizione del secondo disco rigido e /dev/hdb2 la seconda partizione
del secondo disco rigido ecc. In linea di massima, anche i lettori di CD e i masterizzatori IDE ven-
gono identificati con questo tipo di dispositivo. Inoltre Slackware crea di default /cdrom, un colle-
gamento simbolico al dispositivo CD-ROM (generalmente /dev/hdc o /dev/hdd): infatti /dev/cdrom
non è che un link simbolico a /dev/hdc o a /dev/hdd.
sd disco SCSI. Come per i dischi IDE, si avrà una successiva lettera e dei numeri per indicarne la parti-
zioni. Di conseguenza /dev/sda sarà primo dispositivo scsi e /dev/sdb il secondo. In linea di massi-
ma, anche i lettori di CD e i masterizzatori SCSI vengono identificati con questo tipo di dispositivo,
nonché alcune unità rimovibili come i pendrive, le memorie di massa delle macchine fotografi-
che digitali, i dischi USB esterni. In questo caso, eventuali partizioni saranno indicate nel modo
consueto (sda1, sda2 ecc.).
fd il dispositivo floppy. Il primo dispositivo floppy è indicato con /dev/fd0; nel caso (ormai raro) ve ne
siano più d’uno, essi vengono numerati progressivamente.
Il punto di montaggio
Come abbiamo visto, il sistema deve montare un dispositivo in una determinata cartella; la soluzio-
ne migliore (se non ci sono esigenze particolari) è crearla nella directory /mnt, che il sistema stesso ci
propone come cartella di default per questo tipo di operazioni (anche se è possibile creare altre cartelle
a piacere).
I file system
Come abbiamo visto, GNU/Linux supporta una enorme quantità di file system. Abbiamo già men-
zionato i più diffusi. In /etc/fstab è però possibile impostare questa voce ad auto perché il sistema cerchi
di determinare automaticamente di quale tipo di file system si tratta. Ciò è utile nel caso di floppy o di
pendrive, che possono essere formattati di volta in volta in diverso modo, e ci esime dal modificare le
voci del file.
Le opzioni di montaggio
Le più comuni e utili (per un elenco completo, si veda man mount) sono:
noauto non monta automaticamente il dispositivo all’avvio. Il dispositivo dev’essere montato da shell
col comando mount, oppure, in un server X, anche con l’apposita procedura (in KDE cliccando col
mouse sull’icona del dispositivo presente sul desktop). È ovvio che unità non sempre presenti,
come floppy o pendrive, andranno caratterizzate con questa opzione: in caso contrario il sistema
cercherà comunque di caricarle e, non trovandole, ci darà un messaggio di errore.
defaults monta il dispositivo secondo i permessi di default (che sono definiti in /etc/profile).
users consente a tutti gli utenti non root di montare e smontare il dispositivo (vale a dire che un dispo-
sitivo montato da un certo utente può essere smontato da un altro, cosa impossibile con l’opzione
«user»).
noatime non aggiorna l’ora di accesso all’inode per ogni accesso, velocizzandolo.
sync sincronizza le operazioni di scrittura sui dispositivi. Può risultare utile nel caso di dispositivi ri-
movibili come floppy e pendrive perché, pur rallentando tali operazioni, è una garanzia contro la
perdita di dati.
L’opzione dump
Questo valore è usato dal comando dump per effettuare dei backup sui file system. Il valore deve
essere impostato a 0 per evitare l’effettuazione del backup, a 1 per consentirla. Di norma questa opzione
si imposta a 1 solo per i file system non removibili.
L’opzione check
Questo valore è usato dal comando check per determinare l’ordine del controllo dell’integrità del
file system all’avvio del sistema. Può assumere i valori:
0 = nessun controllo
1 = controlla per primo
2 = controlla in seguito
Generalmente i valori sono:
1 per la partizione di root (/)
2 per le altre partizioni dei dischi rigidi
0 per tutti gli altri dispositivi.
I file system presenti nello stesso disco sono verificati in sequenza, mentre è possibile abilitare il check
contemporaneo di file system collocati in dischi fissi differenti. Di conseguenza è sconsigliato assegnare
il valore 1 a partizioni diverse dello stesso disco fisso, perché il lavoro delle testine non risulterebbe
ottimizzato.
La verifica dei file system
Per modificare la frequenza dei controlli su file system EXT2 ed EXT3 si ricorre a tune2fs, secondo la
sintassi tune2fs [opzioni] [argomenti] [file system]. Di default la verifica viene compiuta ogni
centottanta giorni od ogni venti riavvii o montaggi. Con l’opzione -c esso imposta il numero massimo di
montaggi tra due verifiche del file system: così, il comando: tune2fs -c 30 /dev/hda1 fa sì che, se non
intervengono necessità particolari, il controllo di /dev/hda1 sarà effettuato ogni trenta montaggi e non di
più. L’opzione -i imposta l’intervallo temporale massimo tra le verifiche, e assume tre argomenti: d, m
e w. Il postfisso d (oppure nessun postfisso) forza una verifica giornaliera, il postfisso w una settimanale
e il postfisso m una mensile. Il valore 0 (zero) disabilita la dipendenza temporale delle verifiche. Infine,
l’opzione -e imposta il comportamento che il kernel deve assumere se vengono rinvenuti errori nel file
system, e assume tre valori: continue, cioè continua la normale esecuzione; remount-ro, cioè rimonta
il file system in sola lettura (read-only); panic, cioè provoca un kernel panic bloccando il sistema. Le
opzioni possono anche essere combinate; per disabilitare ogni controllo su /dev/hda1 il comando sarà:
tune2fs -c 0 -i 0 /dev/hda1.
Questa utilità non dev’essere mai usata su file system montati in lettura e scrittura, i quali andranno
perciò precauzionalmente montati in sola lettura.
120 8. Gestione delle unità
La verifica forzata del file system si ottiene, per EXT2 ed EXT3, con e2fsck, con la sintassi: e2fsck
[opzioni] [file system]. Se usato su EXT3, f2fsck applica il journal prima di procedere con la veri-
fica. Le opzioni principali sono: -b che cerca un superblocco diverso da quello normale, -c, che avvia il
programma badblocks per trovare e quindi marcare i settori danneggiati del file system, -f, che forza
il controllo, -n che apre il file system in sola lettura e assume la risposta «no» a tutte le domande (ed è
il contrario dell’opzione -y), consentendo di usare f2sfck in modo non interattivo (è una modalità di
sicurezza), -p (= «preen») che ripara automaticamente il file system.
Questa utilità non dovrebbe mai essere usata su file system montati, le quali andranno perciò
precauzionalmente smontate.
Se il file system sembra presentare degli errori, si può scaricare il journal nel database del file sy-
stem col comando: e2fsck -fy /dev/periferica (dove periferica sarà indicata con la lettera dell’unità
e il numero della partizione) e quindi procedere a un nuovo controllo. Se il superblocco normale ri-
sulta danneggiato, si possono ottenere i numeri dei superblocchi di backup col comando: mke2fs -e
periferica e quindi sostituire il superblocco danneggiato con quello di backup, col comando fsck -b
num , dove num è il numero del superblocco di backup.
Per modificare le impostazioni dei controlli su file system Reiserfs si ricorre a reiserfstune, secondo
la sintassi reiserfstune [opzioni] [file system]. Questa utilità è in grado di modificare due para-
metri del journaling, ossia la sua dimensione e quella della transazione massima, in blocchi. L’opzione
più utile è -f, che forza l’aggiornamento del journal anche per i file system creati prima del codice di
rilocazione del journal. Il journal può risiedere anche in file system diversi da quello attuale
La verifica forzata del file system si ottiene, per Reiserfs, con reiserfsck, con la sintassi: reiserfsck
[opzioni] [file system]. Fra le opzioni disponibili, --check avvia la verifica della consistenza del
file system senza però ripararlo in caso di errori (da usarsi in file system montati in sola scrittura);
--fix-fixable ricostruisce la consistenza laddove non ci sia bisogno di ricostruire l’intero albero del fi-
le system (è lo stesso reiserfs --check ad avvertire se questa opzione è opportuna); --rebuild-tree
ricostruisce l’intero file system utilizzando i «nodi foglia» (leaf nodes) trovati nel dispositivo (è lo stesso
reiserfs --check ad avvertire se questa opzione è necessaria); --rebuild-sb, che ricostruire il super-
blocco se il sistema sembra incapace di trovare una partizione formattata Reiserfs mentre noi siamo
sicuri che c’è.
In aggiunta, l’opzione -S scansiona l’intera partizione e non solo lo spazio utilizzato.
Alla fine di /etc/fstab è necessario lasciare sempre una riga bianca in più, o riceveremo un messaggio
di errore del tipo «warning: no final newline at the end of /etc/fstab».
Un esempio
Ecco un esempio di /etc/fstab, che include anche configurazioni particolari che verranno trattate nel
prosieguo (la condivisione NFS):
/dev/hda4 swap swap defaults 0 0
/dev/hda2 / ext3 defaults 1 1
/dev/hda3 /home ext3 defaults 1 2
/dev/hdb1 /mnt/archivio ext3 defaults 1 2
/dev/hdb3 /mnt/slack ext3 defaults 1 2
/dev/hdb4 /mnt/debian ext3 defaults 1 2
/dev/hda1 /mnt/windows ntfs auto,umask=022,ro 0 0
/dev/hdb2 /mnt/backup vfat defaults 0 0
/dev/cdrom /mnt/cdrom iso9660 noauto,users,ro 0 0
/dev/dvd /mnt/dvd iso9660 noauto,users,ro 0 0
/dev/fd0 /mnt/floppy auto noauto,users 0 0
/dev/sda1 /mnt/pendrive vfat noauto,users 0 0
192.168.0.3:/ mnt/brightstar nfs noauto,_netdev,sync,users 0 0
8.4. Montaggio dei dischi rigidi 121
posto che si sia già provveduto a creare in /mnt i rispettivi punti di montaggio, e cioè /mnt/windows e
/mnt/archivio (i nomi delle directory in /mnt sono scelti a piacere).
Nel primo caso abbiamo indicato: a) la partizione del disco fisso che contiene il programma; b) la di-
rectory di montaggio; c) il tipo di file system; d) abbiamo dato indicazione di montarla automaticamente
(cioè ogni volta all’avvio), e) abbiamo abilitato il montaggio di default, f) abbiamo tuttavia modificato i
permessi con umask in modo che gruppo e utenti possano accedere all’unità, g) abbiamo specificato che
si tratta di una unità in sola lettura; f) abbiamo infine escluso il backup e il controllo del file system.
Nel secondo caso con gid e umask combinati abbiamo autorizzato un ipotetico gruppo 104 (il gruppo
«archivio») a effettuare tutte le operazioni, e gli altri utenti ad accedere in sola lettura.
I permessi per il montaggio delle unità non riguardano naturalmente la possibilità di accedervi da
parte degli utenti. In una unità disco di proprietà di root:root si possono creare directory appartenenti
a utenti diversi, che avranno perciò la piena possibilità di utilizzarle.
In questo caso il file system è iso9660, il formato standard per i CD, oppure udf. L’opzione users
è utile per consentire a tutti gli utenti di montare e smontare queste unità. L’opzione defaults invece
consentirebbe il montaggio e lo smontaggio solo a root, visto che questi dispositivi appartengono a
root:root.
Un’ultima cautela per usare il masterizzatore: col kernel 2.4 e con le vecchie versioni di cdrecord (il
programma che serve a scrivere i CD) è necessario abilitare l’emulazione SCSI. A questo fine è sufficiente
aggiungere alla fine di /etc/lilo.conf, con un editor qualsiasi di testo, la riga:
122 8. Gestione delle unità
append='hdc=ide-scsi hdd=ide-scsi'
In questo caso, lettore e masterizzatore non saranno più visti come dispositivi IDE, ma appunto
come SCSI, per cui non saranno indicati più – poniamo – con /dev/hdc e /dev/hdd, bensì come /dev/scd0
e /dev/scd1. In ogni caso, non è inopportuno abilitare l’emulazione SCSI anche con le versioni più recenti
di cdrecord, il che velocizza notevolmente (con una certa approssimazione, di un 40%) la scrittura.
Andrà quindi controllato il link simbolico /dev/cdrom (creato durante l’installazione), ed eventual-
mente cancellato e ricreato per fare in modo che corrisponda al nuovo dispositivo. I passaggi sono sem-
plicemente: rm /dev/cdrom e ln -s /dev/sdc0 /dev/cdrom nel primo caso e, nel secondo, rm /dev/dvd
e ln -s /dev/sdc1 /dev/dvd.
Ipotizziamo infine di avere un disco fisso SATA, identificato con /dev/sda e un lettore CD-ROM IDE
identificato di default con /dev/hda. Attivando l’emulazione SCSI tale lettore verrà ora identificato con
un dispositivo SCSI, in genere /dev/sr0 (o /dev/sg0), reperibile mediante dmesg | grep sr0 (o dmesg |
grep sg0). Di conseguenza anche in questo caso il link andrà ricreato con la procedura sopra indicata.
Col kernel 2.6 è sempre possibile abilitare l’emulazione, ma le versioni più recenti di cdrecord non lo
richiedono più (e anzi lo dichiarano deprecato), lavorando tranquillamente e con maggior efficienza coi
masterizzatori IDE, per cui non serve aggiungere nulla in /etc/lilo.conf.
(ipotizziamo qui che il file system utilizzato sia vfat e che la codifica del linguaggio sia l’italiano; que-
st’ultima indicazione è del tutto opzionale. Se il pendrive fosse formattato FAT, i nomi dei file risulte-
rebbero di soli otto caratteri, più l’estensione).
Se poi compileremo il kernel 2.6, non tralasciamo di abilitare il supporto per i dischi SCSI e per l’hot-
plug, dal momento che questi dispositivi (e altri supporti come i dischi Zip) vengono riconosciuti per
l’appunto come dischi SCSI. In caso di problemi, è innanzitutto opportuno verificare con che nome (devi-
ce) viene riconosciuto il dispositivo. Lo si può fare inserendo il pendrive nella presa USB e controllando
immediatamente l’output del comando: tail -F /var/log/messages, oppure lanciando il comando:
sfdisk -l /dev/sda (oppure sdb ecc. se il disco fisso è SATA e dunque sda indica già un’altra unità). È
anche possibile, ma in genere superfluo, abilitare gli utenti al montaggio aggiungendone i nomi nel file
/etc/group alla voce disk.
Scheda n. 18
Automount e autofs
Il servizio di automount
L’automount è un processo che consente ad alcuni file system (come i dispositivi rimovibili e le
condivisioni NFS) di essere montati in maniera automatica, quando un utente cerca di accedervi. Allo
stesso modo, il file system viene smontato dopo un periodo (convenzionalmente stabilito) in cui il file
system non viene più usato.
8.6. Montaggio di un pendrive USB 123
Slackware, pur non avendo già attivo un sistema di montaggio e smontaggio automatico dei disposi-
tivi rimovibili (CD-ROM, pendrive, dischi USB) e delle condivisioni NFS, è predisposta per questo tipo
di servizio. Dei file di configurazione di esempio sono presenti in /usr/doc/autofs-3.1.7/samples.
Questo servizio, che naturalmente si può attivare anche nei computer desktop, risulta però di parti-
colare utilità in ambienti di rete molto estesi. Poiché infatti i dispositivi montati da /etc/fstab occupano
comunque delle risorse, l’automount consente di montarli solo quando se ne ha effettiva necessità e di
smontarli automaticamente quando, per un certo periodo, non se ne fa uso. È altresì utile in presenza di
molti mount incrociati anche fra pochi computer, nel caso ve ne siano di inattivi (e infine in casi parti-
colari, ad esempio quando sia presente la necessità di operare il montaggio di unità DOS in modalità di
conversione attivata e disattivata insieme).
Questo servizio è affidato ad autofs e ad automount. Autofs serve a rilevare le richieste di montaggio,
e quando viene effettuata una richiesta invoca automount per compiere effettivamente l’operazione di
montaggio.
Si presuppone che sia attivato nel kernel (nella sezione «File systems») il supporto per autofs4, che
rimpiazza il vecchio autofs, dichiarato obsoleto. Mentre autofs era implementato in user-space e si ba-
sava sul demone AMD che passava il traffico ai file system automontati attraverso NFS, autofs4 (dal
kernel 2.2) è implementato a livello kernel. Ciò significa che, in questo caso, è il kernel a conoscere
quali sono i punti di montaggio dei sistemi automontati. Se nel kernel è attivato solo il supporto ad
autofs4 (e non anche quello ad autofs), per ragioni di compatibilità potrebbe essere necessario inserire
in /etc/modprobe.conf la seguente linea:
alias autofs autofs4
L’inizializzazione del servizio
Per inizializzare il servizio, si può inserire in /etc/rc.d uno script chiamato rc.autofs, da rendere ov-
viamente eseguibile. Inoltre bisogna inserire un’invocazione a questo script. Le possibilità a questo fine
sono due: o si aggiunge a /etc/rc.d/rc.local la seguente riga:
/etc/rc.d/rc.autofs start
oppure si aggiunge a /etc/rc.d/rc.M una sezione come la seguente:
# Start the automount demon:
if [ -x /etc/rc.d/rc.autofs ]; then
. /etc/rc.d/rc.autofs start
fi
Come già detto, un esempio generico è contenuto in /usr/doc/autofs-3.1.7/samples; esso si chiama
rc.autofs.in, va rinominato rc.autofs e reso eseguibile con chmod. Tuttavia, a meno di non modificarlo
in misura abbastanza cospicua, non funziona perché è concepito per distribuzioni RedHat o Debian.
Alcuni script adatti specificamente a Slackware (fermo restando il ricorso ai motori di ricerca) si possono
reperire rispettivamente agli indirizzi:
http://www.slackware.com/~david/zuul/nis-mini-howto/rc.autofs (Cantrell)
http://mariner.cs.ucdavis.edu/slackware/doc/slackware/rc.autofs (Terminator)
http://www.vivaolinux.com.br/artigos/impressora.php?codigo=734 (Ribeiro)
http://schelcj.avlug.org/files/rc.autofs.patch (Scheller)
In alcuni di questi script è già incluso il timeout, che non andrà pertanto specificato in
/etc/auto.master. Ad esempio, nello script di Ribeiro si legge una sezione dedicata per appunto a stabilire
il timeout.
I comandi per gestire manualmente autofs sono:
/etc/rc.d/rc.autofs start, per avviare il processo;
/etc/rc.d/rc.autofs stop, per terminare il processo;
/etc/rc.d/rc.autofs status, per vedere la configurazione e i sistemi attualmente automontati;
124 8. Gestione delle unità
cd -fstype=iso9660,ro :/dev/hdc
cdrw -fstype=iso9660,ro :/dev/hdd
floppy -fstype=auto,umask=000 :/dev/fd0
pendrive -fstype=vfat,umask=000 :/dev/sda1
brightstar -fstype=nfs,soft,intr 192.168.0.3:/
127
128 9. L’installazione delle periferiche
so va collocato nella cartella /usr/share/cups/model e dotato dei permessi corretti col comando: chmod
644 /usr/share/cups/model/nome_stampante.ppd. A questo punto, basta seguire la procedura sopra
descritta.
Quindi va fatto partire o ripartire il demone cupsd, rispettivamente col comando /etc/rc.d/rc.cups
start oppure /etc/rc.d/rc.cups restart e si può infine passare alla configurazione descritta sopra
via browser. La stampante, che dovrebbe già essere stata rilevata, si installerà in questo caso in /dev/lpn.
Scheda 19
I server di stampa di GNU/Linux
In Unix esistono vari server di stampa (Berkeley LPD, LPRng, Ipsched, CUPS). GNU/Linux ha ere-
ditato LPD e CUPS. Fino alla versione 9.1 Slackware proponeva come default LPD: esso è stabile, ma
carente di funzioni e a volte complicato da configurare. Dalla versione 10.0 il default è invece CUPS.
Esistono vari tipi di filtri: i due più importanti sono il più vecchio ifhp, filtro generico per le stampanti
PostScript, e il più recente Foomatic, che funziona su tutti i server e gestisce Ghostscript per le stampan-
ti che non comprendono PostScript. Esistono infine vari client: i due tradizionali sono lpr e lp. Mentre
le applicazioni grafiche in genere convertono automaticamente i formati dei file (siano essi testi o im-
magini; ad esempio Gimp ha un proprio accessorio di conversione e cioè gimp-print) in PostScript, la
stampa da riga di comando pone problemi assai maggiori, perché è necessario sapere esattamente come
e quando effettuare la conversione prima di inviare l’output alla stampante.
Questi componenti servono per effettuare i vari passaggi che il processo di stampa richiede. In sin-
tesi, un’applicazione (come un editor) genera un documento da stampare, il quale viene inviato da un
client di stampa a un server di stampa e immesso in una coda di stampa, una sorta di «lista d’attesa».
Quindi il server invia il documento a un programma detto filtro di stampa che lo modifica per render-
lo accettabile per la stampante. Se la stampante supporta PostScript, il server invia il risultato di questa
operazione direttamente alla periferica di stampa, altrimenti lo invia prima a un altro filtro che rasterizza
il documento (conferendogli una forma bitmap), e quindi alla stampante.
9.1. Installare una stampante 129
Le applicazioni di stampa GNU/Linux (e in generale Unix) generano file PostScript, che non è tanto
un formato di file, quanto un linguaggio di descrizione vettoriale della pagina, cioè un programma. Per
questo esso necessita di un interprete che lo visualizzi. Questa conversione si chiama, per l’appunto,
rasterizzazione, ed è effettuata dal programma Ghostscript.
Cups (acronimo di «Common UNIX Printing System») consente di configurare stampanti locali e
remote sia col protocollo IPP (Internet Printing Protocol) sia coi protocolli LPD (Line Printer Daemon) e
SMB (Server Message Block); questi ultimi due sono però supportati con funzionalità ridotte. Per ricono-
scere le caratteristiche delle stampanti CUPS usa dei file .ppd allocati in /usr/share/cups/model: si tratta
di file che contengono istruzioni di tipo MIME (CUPS è quasi sempre in grado di determinare il tipo MI-
ME e cioè il formato di ciascun documento e di farne operare la corretta conversione prima di inviarlo
alla stampante). Per svolgere questa funzione CUPS si basa su due file di database: /etc/cups/mime.types
e /etc/cups/mime.convs; il primo contiene un elenco dei formati di file che CUPS può gestire, mentre il
secondo associa ciascun tipo MIME con il programma in grado di elaborarlo. I file .ppd sono di solo
testo e descrivono le caratteristiche e le capacità di una determinata stampante.
Cups gestisce in proprio i filtri di stampa incorporando dei programmi specifici, ma si serve anche
di programmi esterni, come ghostscript (un interprete per i formati PostScript e Adobe Portable Docu-
ment), hpijs (che fornisce il supporto a un’ottantina di stampanti Hewlett-Packard) e espgs (che sup-
porta il formato pdf). Attualmente, oltre a hpijs, è disponibile anche hplip (che contiene tutti i driver di
hpijs, ma supporta in aggiunta le stampanti HP multifunzione), non presente però nei pacchetti ufficiali
di Slackware. CUPS supporta un gran numero di stampanti e di opzioni, ed è semplice da configurare,
perché offre, fra l’altro, una comoda interfaccia web.
Il principale file di configurazione di CUPS è /etc/cups/cupsd.conf. Esso presenta delle falle di si-
curezza, perché invia in rete dati come la password di configurazione in forma di testo semplice. Mo-
dificare questo e altri aspetti è possibile, ma interessa più un amministratore di rete che un utente do-
mestico. Le operazioni di configurazione di CUPS si possono effettuare dall’interfaccia web che si apre
all’indirizzo http://localhost:631, oppure anche, naturalmente, da riga di comando.
<Location />
Order Deny,Allow
Deny From All
Allow From 127.0.0.1
</Location>
9.1. Installare una stampante 131
Alla voce <Location /> aggiungiamo una riga contenente l’indirizzo IP del client (ad esempio
192.168.0.3) per autorizzarlo, di modo che risulti:
<Location />
Order Deny,Allow
Deny From All
Allow From 127.0.0.1
Allow From 192.168.0.3
</Location>
ipp://192.168.0.2:631/printers/hp_deskjet_6122
Scelto anche il driver opportuno e terminata la configurazione, nella schermata finale dovremmo ve-
dere la stampate già connessa dall’indirizzo http://192.168.0.2:631/printers/hp_deskjet_6122. A questo
punto è sufficiente stampare la pagina di prova per verificare che tutto funzioni correttamente.
http://nome_server :631/printers/nome_stampante
dove nome_server è il nome della macchina GNU/Linux in cui è installata fisicamente la stampante e
nome_stampante è il nome attribuito alla stampante in CUPS, ad esempio:
http://darkstar:631/printers/hp6122
Si aprirà quindi una nuova finestra che consente di aggiungere i driver. Una volta selezionati i driver
corretti, comparirà un’ultima finestra, Stampante predefinita, che consente di impostare o meno la
stampante appena aggiunta come predefinita. Sarà quindi possibile stampare una pagina di prova per
verificare la felice riuscita dell’operazione.
Secondo caso: stampante installata su macchina Windows. È sufficiente installare la stampante anche
sulla macchina GNU/Linux da CUPS, scegliendo alla voce Device il protocollo IPP e inserendo quindi
l’indirizzo del server di stampa Windows, secondo la sintassi sopra ricordata.
132 9. L’installazione delle periferiche
oppure
a seconda dello scanner installato. Si può poi andare nella directory /etc/sane.d, individuare il file mar-
ca_dello_scanner.conf che corrisponde alla marca del nostro scanner (ad esempio epson.conf oppure
hp.conf), e lasciare decommentata solo la riga relativa alla porta del dispositivo già suggeritaci dal co-
mando sane-find-scanner; nel caso di uno scanner USB, sarà /dev/usb/scanner0 oppure /dev/usbscanner0.
Infine dovremo controllare che sia decommentata la riga relativa alla marca dello scanner in /etc/sane.d/dll.conf.
A questo punto, possiamo verificare se lo scanner è funzionante col comando: scanimage -L. Se l’output
è qualcosa di simile a:
È perciò soluzione migliore gestire lo scanner inserendo gli utenti autorizzati nel gruppo scanner,
che da Slackware 10.2 esiste già (nelle versioni precedenti era invece necessario crearlo a mano col
comando: groupadd scanner) mediante il comando: usermod -G scanner nome_utente ed eventual-
mente attribuendo il dispositivo di scansionamento al gruppo scanner col comando: chgrp scanner
/dev/usb/scanner0.
usb /dev/usb/scanner0
e
9.2. Installare uno scanner USB 133
usb /dev/usbscanner0
La voce
usb
è invece già presente e attiva, e non serve aggiungere nulla. Il file /etc/hotplug/usb.usermap contiene
già tutti i dati rilevanti (VENDOR e PRODUCT) di un gran numero di scanner supportati dal progetto
Sane. Queste righe abilitano il riconoscimento via libusb dello scanner passandogli VENDOR e PRO-
DUCT. Solo se lo scanner risultasse sconosciuto, ne dovremmo aggiungere la localizzazione su libusb
suggeritaci prima da sane-find-scanner con la sintassi usb <product ID> <device ID>, ad esempio:
usb libusb:004:002
A questo punto possiamo usare tutte le applicazioni dello scanner, ma solo da root. Come renderne
possibile l’utilizzo anche da utente? Per evitare ogni volta la scomoda procedura di conferire i permessi
da root e quindi rientrare come utente, si può automatizzare il tutto (anche se in realtà Slackware è
già predisposta a ciò e richiede solo un intervento minimo). Come premessa è necessario aver abilitato
hotplug. Slackware contiene in /etc/hotplug/usb lo script libusbscanner, il quale di default conferisce
a tutti gli utenti del gruppo «scanner» i permessi di utilizzo (chmodando il dispositivo al valore 660 e
attribuendone la proprietà a root:scanner); basta pertanto aggiungere al gruppo «scanner» i nomi degli
utenti autorizzati. Nello stesso script, le ultime righe conferiscono a tutti gli utenti, indipendentemente
dal gruppo di appartenenza, la possibilità di usare lo scanner (chmodando il dispositivo al valore 666).
Tali righe, di default, sono commentate. Basterà decommentarle, anche se allargare indiscriminatamente
permessi potrebbe introdurre delle falle nella sicurezza del sistema.
net
Quindi, visto che Slackware è basato su inetd e non su xinetd, aggiungiamo in /etc/inetd.conf la
seguente riga:
La prima stringa indica il nome del servizio (sane), la seconda il tipo di socket (stream), la terza il
protocollo (tcp), la quarta indica di attivare il servizio immediatamente alla richiesta del client, la quinta
il proprietario del processo (root), la sesta e la settima il path dei processi.
A questo punto, dopo aver riavviato inetd (col comando: /etc/rc.d/rc.inetd restart), avremo il
servizio saned in ascolto sulla porta 6566, cosa che si può verificare con telnet dando il comando: telnet
localhost 6566. Se l’output è:
134 9. L’installazione delle periferiche
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
192.168.0.3
net:192.168.0.2
Dal client potremo verificare se il dispositivo di scansione è stato correttamente individuato col
comando scanimage -L, che fornirà un output del tipo:
Se insorgono degli errori, o la connessione client/server non ha luogo, ci si può rendere conto di
quello che non funziona col comando: SANE_DEBUG_NET=128 scanimage -L.
Saned è in grado anche di consentire l’accesso allo scanner solo agli utenti di un determinato gruppo,
o solo in base a una password, ma qui prescindiamo da queste ulteriori configurazioni. Infine, può esse-
re usato anche per una condivisione dello scanner fra computer GNU/Linux e computer Windows.
Esistono in questo caso delle apposite utilità: un programma open source è reperibile all’indirizzo:
http://sanetwain.ozuzo.net.
9.3.2 Gnomemeeting
L’installazione di Gnomemeeting è molto lineare, anche se richiede alcune librerie di Gnome non pre-
senti in Slackware per poter funzionare. Se sono stati installati i driver corretti, il programma funzionerà
da subito, una volta effettuata una semplice configurazione guidata.
Capita talora che Gnomemeeting accusi una cattiva configurazione di Gconf, non riuscendo a trovare
la chiave di registro gconf_test_age e interrompa così il processo iniziale di settaggio. Questo problema
è dovuto esclusivamente alla cattiva compilazione del pacchetto. Per rimediare, è comunque sufficiente
lanciare da console il comando: gnomemeeting-config-tool --install-schemas e quindi confermare
l’installazione. Compiuta anche questa operazione, lanciando Gnomemeeting si avvierà finalmente il
Configuration Druid per settare la webcam, ormai pronta per l’uso.
La più recente versione di Gnomemeeting prende di nome di Ekiga; si tratta di un software fortemen-
te integrato in Gnome, per cui, a meno di non voler installare una nutrita serie di dipendenze, dovrebbe
essere fatto girare nel suo ambiente nativo.
nali (ma vi sono modelli sempre più perfezionati e ad altissima definizione), esse offrono la possibilità
di manipolare in maniera veloce e precisa le fotografie. La gestione di questo tipo di dispositivi sotto
GNU/Linux non presenta dei grossi problemi, anche se in Slackware può richiede una certa iniziativa
da parte dell’utente.
Molte macchine fotografiche digitali supportano sia lo standard USB Mass Storage, per cui sono viste
come semplici dischi rimovibili USB, sia lo standard PTP (Picture Tranfer Protocol), che consente una
gestione avanzata del dispositivo. Basta modificarne il setup per usare il primo o il secondo protocollo.
Dopo queste operazioni fondamentali, è vantaggioso installare ulteriori pacchetti, per poter fruire di
tutti i vantaggi delle libgphoto2, nessuno dei quali rientra in quelli ufficiali di Slackware. Menzioniamo
qui:
gphoto2 = una serie di applicazioni per la gestione delle fotocamere.
kamera = l’io_slave di Konqueror. In realtà, Kamera è un’utilità che fa parte di Kdegraphics. Poiché
abilitare questa funzione richiede che siano già installate le libgphoto2, essa non è presente nella ver-
sione ufficiale di KDE offerta da Slackware. Bisognerà pertanto ricompilare Kdegraphics inserendo nel
configure anche la voce: --with-kamera. È sufficiente modificare in tal senso lo SlackBuild presente in
/source/kde/kdegraphics.
digikam = interfaccia a gphoto2 per KDE. Esso ha la semplice funzione di visualizzatore, ma può
essere integrato con un pacchetto di plugin che ne amplia in misura accentuata le funzionalità.
digikamimage-plugins = serie di plugin per Digikam che consentono, fra l’altro, di rinominare grup-
pi di immagini, di cambiarne il formato, di trasformarle in Video CD, di archiviarle su CD, di creare una
galleria di immagini per il web, di correggere gamma, luminosità e contrasto, di preparare le immagini
per la stampa, di inviarle via e-mail e altro ancora.
Lanciato Digikam, dal menu Fotocamera si seleziona Aggiungi fotocamera, e si può cliccare sul
pulsante Autorilevamento. Se la macchina fotografica è tra quelle direttamente supportate, verrà iden-
tificata e ne verranno indicate le caratteristiche (marca e modello), altrimenti sarà aggiunta come un
generico dispositivo PTP. Dopo di che si potrà scaricare il contenuto della macchina su disco fisso.
Per gli utenti che hanno istallato Gnome, esiste un’altra applicazione di base per la gestione delle
fotocamere digitali, e cioè gtkam, un frontend per le libgphoto2.
138 9. L’installazione delle periferiche
Capitolo 10
10.2 Lilo
10.2.1 Il bootloader Lilo
Storicamente, Lilo (LInux LOader) è il primo bootloader di GNU/Linux. Superati i limiti tecnici
delle prime versioni (soprattutto il fatto che esso non leggeva oltre i primi 1024 cilindri del disco fisso)
e la differenza fra il modo in cui talvolta il BIOS e il kernel leggono la geometria del disco fisso, esso
è attualmente un bootloader universale, in grado di caricare un vastissimo numero di sistemi operativi
diversi. Le versioni più recenti sono in grado di identificare automaticamente non solo le partizioni DOS,
ma anche quelle NTFS. Inoltre Lilo gestisce una serie di parametri opzionali che gli vengono passati in
fase di boot. Con opportune patch al kernel, può essere abbellito con accattivanti bootsplash.
Modalità simple
È la modalità più comoda per gli utenti inesperti e presenta un’ottima capacità di riconoscimento dei
dispositivi. Questa modalità però riconosce in genere Windows e, per GNU/Linux, la sola partizione
in cui è presente Slackware. Se abbiamo sul nostro computer altre distribuzioni GNU/Linux, queste
dovranno essere aggiunte successivamente a mano. Tale modalità chiede di impostare i seguenti campi:
139
140 10. Avviare il sistema e creare un dual boot
frame buffer = attivazione del frame buffer per la console. La modalità standard (vga normale) fa vedere
all’avvio dei caratteri piuttosto grandi, poco definiti (e senza logo); usando il framebuffer appropriato
alla nostra scheda video invece i caratteri sono più piccoli e appare anche l’immagine di un pinguino
sullo schermo (sebbene lo scorrimento del testo sia in questo caso leggermente più lento).
parametri opzionali (e precisamente la voce OPTIONAL LILO append="<kernel parameters>" LINE) =
aggiunta di parametri facoltativi alla riga append, come l’abilitazione dell’emulazione SCSI, oppure del
tipo ramdisk, read-only, read-write, root e vga.
destinazione = scelta della sede dove installare Lilo.
Modalità expert
La modalità expert consente una configurazione più fine, cosicché non dovrebbe esserci bisogno di
applicare successivamente ritocchi al file /etc/lilo.conf. Chiede di impostare i seguenti campi:
begin = propone di aggiungere degli header, e cioè parametri opzionali per il kernel.
frame buffer = attivazione del frame buffer per la console.
target = la sede dove installare Lilo.
timeout = il tempo che deve passare perché si carichi il sistema di default.
add a Linux partition = consente di aggiungere le partizioni GNU/Linux già riconosciute da Lilo. Si
seleziona la partizione e le si attribuisce un nome a piacere. Non serve, com’è ovvio, aggiungere a Lilo
le partizioni non bootabili (come una partizione destinata a fare da backup di dati e priva di sistema
operativo).
add a Windows partition = consente di aggiungere le partizioni Windows già riconosciute da Lilo. Si
seleziona la partizione e le si attribuisce un nome a piacere.
Tutte queste configurazioni vengono riportate in /etc/lilo.conf, un file di puro testo che può essere
modificato con un editor qualsiasi.
lba32 = genera degli indirizzi a blocchi logici da 32 bit invece che considerare gli indirizzi in base a
cilindro/testina/settore. Ciò consente di avviare un sistema dotato di un disco fisso con più di 1024
cilindri. Dalla versione 22, questa è l’impostazione di default (che perciò non serve precisare) e rimedia
a un noto limite delle versioni precedenti.
map = serve a rimappare i dispositivi se, ad esempio nel caso che si aggiunga un disco fisso al sistema,
Windows non si colloca più nella prima partizione del primo disco.
È di conseguenza possibile far partire comunque Windows, in certo modo «ingannandolo» mediante
Lilo. La sezione pertinente apparirà come segue:
other = /dev/hdxn
map-drive = 0x80
to = 0x81
map-drive = 0x81
to = 0x80
label="Windows"
table = /dev/hda
dove, al solito, x è la lettera che indica il disco fisso e n la partizione dove risiede Windows.
Volendo, è anche possibile aggiungere la riga password=password , di modo che l’accesso sia limitato.
Scheda n. 20
Un esempio di /etc/lilo.conf
Ecco un caso di /etc/lilo.conf relativo allo stesso sistema di cui, alla Scheda n. 14, abbiamo riportato
sopra il file /etc/fstab:
message = /boot/boot_message.txt
prompt
timeout = 50
default = Slackware
# Override dangerous defaults that rewrite the partition table:
change-rules
reset
# VESA framebuffer console @ 1024x768x256
vga = 773
# Normal VGA console
# vga = normal
# VESA framebuffer console @ 1024x768x64k
# vga=791
# VESA framebuffer console @ 1024x768x32k
# vga=790
# VESA framebuffer console @ 1024x768x256
# vga=773
# VESA framebuffer console @ 800x600x64k
# vga=788
# VESA framebuffer console @ 800x600x32k
# vga=787
# VESA framebuffer console @ 800x600x256
# vga=771
# VESA framebuffer console @ 640x480x64k
# vga=785
# VESA framebuffer console @ 640x480x32k
# vga=784
# VESA framebuffer console @ 640x480x256
# vga=769
# End LILO global section
# Windows bootable partition config begins
other = /dev/hda1
label = Windows
table = /dev/hda
# Windows bootable partition config ends
# Linux bootable partition config begins
image = /boot/vmlinuz
root = /dev/hda2
label = Slackware
read-only
image = /mnt/slack/boot/vmlinuz
root = /dev/hdb3
label = Slack
read-only
image = /mnt/debian/boot/vmlinuz
initrd = /mnt/debian/boot/initrd.img-2.4.27-1-386
root = /dev/hdb4
label = Debian
read-only
10.2. Lilo 143
password = password
In tal modo solo l’amministratore può avviare il sistema. Nel secondo caso (avvio libero, ma pro-
tetto), chiunque può avviare il computer, ma solo l’amministratore è in grado di passare parametri ag-
giuntivi al kernel. A questo fine si edita il file /etc/lilo.conf aggiungendo, oltre alla riga password , la
riga:
restricted
In tal modo il sistema, senza la password, si avvierà solo in modalità multiutente (runlevel 4). Per
chi desidera una maggiore sicurezza, c’è anche un sistema più complicato. Si tratta di installare Lilo sia
nell’MBR del disco fisso, sia nel settore di avvio della partizione di root, in modo che il primo richiami
il secondo. La configurazione di questo primo Lilo dovrà essere come segue:
# /etc/lilo.hda
boot = /dev/hda
message = /boot/message.txt
prompt
password = password1
other = /dev/hdxn
label = Linux
Se la password fornita al primo Lilo è corretta, si avvia un sistema operativo generico (definito infatti
«other», mentre il kernel viene in effetti avviato solo nella seconda fase di avvio) presente nella partizio-
ne di root. Questo Lilo avvierà automaticamente Slackware senza parametri, i quali, per essere aggiunti,
necessiteranno della seconda password (ovviamente diversa dalla prima). Al boot, un messaggio avver-
tirà di contattare l’amministratore per eventuali problemi. Questo meccanismo serve quando vi siano
più utenti, non in un computer domestico in cui facilmente root coincide con l’utente principale. La
configurazione del secondo Lilo (dove si potranno aggiungere i parametri aggiuntivi di append) dovrà
essere come segue:
boot = /dev/hda1
vga = normal
root = /dev/hda1
password = password2
restricted
read-only # Non-UMSDOS filesystems should be mounted read-only for checking
144 10. Avviare il sistema e creare un dual boot
Se si opta per una simile configurazione, si dovrà installare prima il Lilo della partizione di root e
solo in seguito l’altro, giacché Lilo, se non trova un sistema operativo nelle partizioni indicata da «other»,
rifiuta di installarsi. Perciò i comandi saranno:
lilo -C /etc/hda1
lilo -C /etc/hda
o comunque si chiamino le partizioni. Se si imposta la password di Lilo, poiché essa viene scritta in
chiaro (e non in maniera criptata) nel file /etc/lilo.conf, quest’ultimo dovrà avere i permessi 600 (leg-
gibile e scrivibile solo da root), o altri utenti saranno in grado di leggere le password. Infine, si può
rendere immodificabile il file di configurazione di Lilo, mediante il comando chattr, il che previene
anche modificazioni accidentali. Solo root potrà rimuovere questo attributo. Il comando è: chattr +i
/etc/lilo.conf. L’opzione +i aggiunge l’immodificabilità, mentre per rimuoverla si passerà l’opzione
-i.
Le versioni più recenti di Lilo riconoscono non solo le partizioni DOS (FAT e FAT32), ma anche
NTFS, per cui in genere esse vengono aggiunte automaticamente, rendendo superflua la configurazione
manuale.
10.2.7 Il multiboot
È naturalmente possibile installare più sistemi operativi, e non solo due. La procedura per il mul-
tiboot è comunque la stessa del dual boot. Ipotizziamo di avere un’altra partizione con una seconda
distribuzione di GNU/Linux, diciamo Debian, installata sulla quarta partizione del primo disco fisso
(e dunque in /dev/hda4). Nella sezione # Linux bootable partition config begins prima della riga #
Linux bootable partition config ends dovremo aggiungere le righe: a) image, b) root, c) label e d)
read-only dell’ulteriore sistema operativo.
In a) collochiamo il riferimento al kernel di Debian da caricare. Posto che da Slackware lo vediamo
in /mnt/debian, la riga risulterà:
/mnt/debian/boot/vmlinuz
In b) indichiamo la partizione della directory root di Debian, nel nostro esempio /dev/hda4. In c)
indichiamo il nome che ci apparirà nel messaggio di avvio, che potrebbe essere per l’appunto Debian.
10.3. L’alternativa a Lilo: Grub 145
Poiché, inoltre, alcune distribuzioni vogliono alcune indicazioni supplementari come initrd (per cari-
care i moduli opportuni in fase di avvio del sistema), esse andranno aggiunte nella medesima sezione.
Questa apparirà dunque come segue:
image = /mnt/debian/boot/vmlinuz-2.4.27-1-386
root = /dev/hda4
label = Debian
initrd = /mnt/debian/boot/initrd.img-2.4.27-1-386
read-only
Nel caso, che talvolta si verifica, che durante l’installazione il programma non riesca a installare Lilo,
o che per altri motivi lo abbiamo disinstallato o sovrascritto (ad esempio, installando Windows dopo
Slackware), è necessario avviare Slackware da floppy oppure da CD. Nel caso si usi il floppy di avvio,
esso sa in genere quale partizione caricare come root, per cui è sufficiente loggarsi come root e quindi
lanciare in sequenza, come detto sopra, lilo -t (se si vuole effettuare un controllo) e lilo -v. Se invece
si usa il CD1 di Slackware, sono da effettuare i seguenti passaggi:
a) si fa il boot da CD, come per una normale installazione. Se il disco fisso non è IDE ma SATA, si passa
al boot l’opzione sata.i; per le unità IDE non è necessario passare l’opzione bare.i, che viene scelta di
default. Per casi diversi, si sceglie il kernel opportuno.
b) si sceglie eventualmente la tastiera italiana
c) si effettua il login come root
d) si monta la partizione di root col comando: mount -t file_system /dev/hdxn /mnt (oppure, nel
caso di dischi SATA, /dev/sdxn, dove file_system sarà EXT2, EXT3 o Reiserfs e n è il numero della
partizione
e) si dà il comando: chroot /mnt
f) si lancia lilo -t (se si vuole effettuare un controllo) e quindi lilo -v.
Questa procedura va adottata anche nel caso si installi Windows dopo Slackware, perché il bootloa-
der di Windows sovrascriverà quello di Slackware.
Negli /extra del CD 3, Slackware ci mette a disposizione un bootloader alternativo a Lilo, Grub (acro-
nimo di Great Unified Boot loader), più recente e oggi adottato da numerose distribuzioni, perfettamente
compatibile anche con Slackware. Grub è molto potente ed elastico, supporta un numero maggiore di
opzioni rispetto a Lilo, fornisce per i parametri da passare al boot una comoda funzione di completa-
mento automatico (col tabulatore, come si fa in console); inoltre, poiché punta direttamente ai file, a
differenza di Lilo non va lanciato ogni volta che si modifica il kernel, il che rende maggiormente rapida
la riconfigurazione del sistema. Un’analisi completa delle caratteristiche e funzionalità di Grub si può
reperire al seguente indirizzo: http://www.gnu.org/software/grub/manual/grub.pdf.
146 10. Avviare il sistema e creare un dual boot
Modalità simple
È la modalità più comoda per gli utenti inesperti e presenta un’ottima capacità di riconoscimento dei
dispositivi. L’unico difetto è che in questo modo Grub, rilevando tutte le partizioni, non distingue fra
quelle avviabili e quelle che non lo sono e infatti tutte le aggiunge alla voce «Linux bootable partition».
Sarà comunque sufficiente cancellarle manualmente da /boot/grub/menu.lst.
framebuffer: la modalità standard (vga normale) non attiva il framebuffer e perciò presenta all’avvio
caratteri piuttosto grandi e fa andar perduta l’immagine del pinguino. In alternativa, selezionare una
modalità maggiormente appropriata alla propria scheda.
partizione: la partizione dov’è installato Grub, che in linea di massima sarà quella di root di Slackware.
destinazione: dove installare Grub. Le alternative sono tre, come per Lilo: il superblocco della partizione
di root, l’MBR del disco fisso, un floppy. Scegliamo questa opzione: il programma ci chiederà se voglia-
mo formattare il dischetto e, una volta pronto, scegliendo la voce «ready», passerà alla copiatura dei file.
Se verificheremo il buon funzionamento del floppy, sempre dal menu di apertura potremo copiare in
seguito Grub sull’MBR, installandolo stabilmente.
Modalità expert
Fornisce una configurazione più fine, anche se ulteriori modifiche possono sempre essere apportate
manualmente, in un secondo tempo, al file /boot/grub/menu.lst.
header: richiede l’inserimento di eventuali header o parametri opzionali per il kernel, come un’imma-
gine ramdisk iniziale (initrd).
framebuffer: come sopra.
destinazione: come sopra.
partizione: come sopra.
Aggiungere partizioni GNU/Linux: consente di aggiungere partizioni GNU/Linux specificandone il
nome, la directory di boot e parametri opzionali aggiuntivi.
Aggiungere partizioni di altri tipo: consente di aggiungere partizioni non GNU/Linux (DOS, Win-
dows, BSD, OS2 e HURD) specificandone il nome, la directory di boot e parametri opzionali aggiuntivi.
Infine installa Grub dove abbiamo scelto di collocarlo, come nella modalità simple.
fisso slave sarà hd1,0 ecc. Inoltre Grub non differenzia i dischi IDE da quelli SCSI, per cui la sintassi
appena indicata funziona con entrambi i tipi di unità. Infine, il nome da assegnare al sistema operativo
(e la corrispondente etichetta di menu) si chiama «title», e non «label» come in Lilo, ma anche qui è
un nome a piacere. Queste e altre differenze possono produrre un iniziale disorientamento, ma è facile
adattarsi e saper configurare presto anche questo file.
È possibile passare a Grub un’ampia serie di comandi e di opzioni all’avvio. Se si vuole editare una
voce particolare del menu, la si seleziona e quindi si preme e; si seleziona poi la riga da modificare e si
preme ancora e. A questo punto è possibile apportare le modifiche desiderate. Alla fine si preme Invio
per fissare le modifiche e b per riavviare il boot. Per ottenere il prompt dei comandi bisogna digitare c
e quindi passare le opzioni desiderate. Infine, per interrompere il processo di boot è sufficiente premere
Esc. Si possono far partire da riga di comando più sistemi, con una serie di comandi del tipo:
grub> root (hd0,1)
grub> kernel /boot/vmlinuz root=/dev/hda2 ro
grub> boot
Si può anche chiedere a Grub di identificare la partizione in cui risiede il kernel, col comando: grub>
find /boot/vmlinuz. Si può infine avviare una partizione DOS o Windows (qui presente in /dev/hda1)
coi comandi:
grub> rootnoverify (hd0,0)
grub> makeactive
grub> chainloader +1 grub> boot
Anche Grub consente naturalmente il dual boot con Windows e il multiboot fra più distribuzioni
GNU/Linux o BSD. Tuttavia, per avviare Windows e non potendolo fare direttamente, Grub si affida a
una tecnica chiamata chain-loading, per cui in realtà avvia il boot loader nativo di Windows.
password = la password (eventualmente criptata) per poter modificare i parametri di avvio al boot.
Scheda n. 21
Un esempio di /boot/grub/menu.lst
Ecco un caso di /boot/grub/menu.lst che monta esattamente gli stessi dispositivi del file /etc/lilo.conf
che abbiamo riportato sopra, alla Scheda n. 15. Una semplice lettura ne evidenzia le innegabili analogie
e, insieme, le differenze di impostazione.
password = password
ma (a differenza di Lilo) è in grado anche di criptarla con l’algoritmo MD5. Per questo, si lancia da shell
il comando: grub-md5-crypt, quindi si inserisce due volte la password (la seconda per conferma), infine
si copia in /boot/grub/menu.lst il risultato ottenuto:
La password così ottenuta può essere inserita dopo i codici iniziali e prima dell’inizio della lista dei
sistemi operativi per bloccare l’accesso a tutti i sistemi che riportano tale dicitura, secondo l’esempio che
segue:
In alternativa, si può collocare una password diversa per ogni sistema, nella riga successiva a «title».
In questo caso, andrà precisata anche la riga «lock», secondo la seguente sintassi:
il terzo (quit) per uscire dal prompt. Ipotizzando di volerlo collocare nell’MBR del (primo) disco fisso
(hd0) e di avere i file di configurazione nella seconda partizione dello stesso (hd0,1), i comandi saranno:
root@darkstar:~# grub
Probing devices to guess BIOS drives. This may take a long time.
[ Minimal BASH-like line editing is supported. For the first word, TAB
lists possible command completions. Anywhere else TAB lists the possible
completions of a device/filename. ]
grub> quit
volta, sull’MBR del disco fisso. Ci sono naturalmente anche altri bootmanager indipendenti, fra cui
U-Boot (http://u-boot.sourceforge.net) e Smart BootManager (http://btmgr.webframe.org).
152 10. Avviare il sistema e creare un dual boot
Capitolo 11
Scheda n. 22
Le funzioni di Pkgtool
Pkgtool è uno strumento di configurazione proprio di Slackware. Esso svolge diverse funzioni, fra
cui quella di gestione dei pacchetti, consentendo di installare un pacchetto dalla directory corrente, da
altre directory o da floppy; di rimuovere un pacchetto; di visualizzare il contenuto di un pacchetto e
le informazioni su di esso (un’analoga utilità di KDE è Kpackage). Infine, alla voce «Setup», consen-
te di gestire parecchi aspetti del sistema, già presentati durante l’installazione. È utile se decidessimo
di modificare successivamente le impostazioni, senza volerlo fare modificando manualmente i file di
configurazione. Eccone le voci:
05. fontconfig lancia il comando fc-cache per indicizzare i font per il server grafico.
153
154 11. Gestione dei pacchetti
mouse serve per attivare il servizio GPM, cioè il supporto per il mouse nella console.
Esiste inoltre una GUI per X per pkgtool il cui nome è Xpkgtool, reperibile all’indirizzo:
http://xpkgtool.sourceforge.net, in grado di effettuare il controllo dell’integrità dei pacchetti. In più,
questa utilità contiene Slack-Grade (reperibile però anche separatamente), per il download dei
pacchetti.
bash-3.0-i486-2:bin/bash2.new
--install-new: di norma upgradepkg aggiorna semplicemente i pacchetti già presenti, ma non installa
pacchetti nuovi. Se, ad esempio, cerchiamo di aggiornare il pacchetto di Abiword che tuttavia non è
presente nel sistema, riceveremo un messaggio di errore:
Questa opzione, utile se dobbiamo procedere con una serie di più pacchetti alcuni dei quali già
presenti in versioni vecchie e altri non installati, consente sia di aggiornare i vecchi sia di installare i
nuovi con un unico comando.
--reinstall: di norma upgradepkg non installa i pacchetti già presenti nella medesima versione. Que-
st’opzione consente invece al programma di reinstallarli in ogni caso.
il pacchetto potrebbe comunque non funzionare: lanciandolo da console, esso lamenterà qualche dipen-
denza insoddisfatta, il che peraltro è un buon sistema per rendersi conto del problema. Se, ad esempio,
cerchiamo di avviare una versione di k3b compilata anche col supporto a musicbrainz, che però non
abbiamo installato, saremo avvertiti da questo messaggio:
samiel@darkstar: $ k3b
k3b: error while loading shared libraries: libmusicbrainz.so.4: cannot open shared
object file: No such file or directory
C’è un mito che è circolato da quando RedHat ha introdotto il RedHat Package Manager,
e cioè che Slackware non ha alcuna utilità per la gestione dei pacchetti. Ciò è semplicemen-
te falso. Slackware ha sempre incluso una utilità per gestire i pacchetti, anche prima che
RedHat esistesse. Benché non ricchissimo di caratteristiche od onnipervasivo come rmp (o,
almeno sotto questo aspetto, deb), pkgtool e i programmi correlati sono altrettanto validi
per installare pacchetti come gli rpm. La verità su pkgtool non è che non esiste, ma che non
effettua alcuna verifica delle dipendenze.
A quanto pare, molta gente nella comunità Linux ritiene che un’utilità per gestire i pac-
chetti debba includere per definizione la verifica delle dipendenze. Non è così, in quanto
almeno Slackware non si comporta in questo modo. Ciò non significa che i pacchetti di Slack-
ware non abbiano dipendenze, ma piuttosto che la sua utilità di gestione dei pacchetti non
le verifica. La gestione delle dipendenze è lasciata all’amministratore di sistema, e a noi va
bene così.
Alcuni pacchettizzatori integrano comunque il .tgz con un file chiamato «slack-required» nel quale
dichiarano le dipendenze, precisandone quando necessario, in aggiunta, le versioni.
Capitolo 12
Scheda n. 23
Gli strumenti di compilazione
In genere, i pacchetti per GNU/Linux sono open source, per cui ne vengono distribuiti anche i co-
dici sorgente piuttosto che i soli binari già compilati. Questo rende possibile compilarli per architetture
(Pentium III, Pentium4, Athlon ecc.) e per sistemi operativi diversi (Fedora e Mandrake usano gli .rpm,
Debian i .deb, Slackware i .tgz ecc.). Inoltre consente di abilitare specifiche funzionalità, di modificare i
programmi stessi, di correggere bug e così via.
Per compilare un pacchetto da sorgenti sono necessari una serie di strumenti denominati «pacchetti
di sviluppo»: tra i principali annoveriamo almeno il compilatore, i file di intestazione, le binutils, il make
e perl.
157
158 12. Creazione di pacchetti .tgz
Compendiamo molto sommariamente i passaggi del processo di compilazione: il sorgente (se non è
un file unico) contiene una serie di file di estensione .c (detti «sorgenti multipli») che C compila trasfor-
mandoli in file oggetto di estensione .o, un binario quasi completo. Per terminare la compilazione entra
così in gioco il linker: può infatti essere necessario combinare più file oggetto per creare un programma
e collegare questi ultimi a una o più librerie. Una volta effettuata quest’ultima operazione e posizionati
i vari file del pacchetto nelle directory di destinazione, abbiamo pronto il nostro file binario, cioè un
eseguibile.
Compilatori
Gcc è uno dei compilatori tradizionali: in svariati sistemi Unix, CC è un collegamento a gcc, e si avvia
almeno coi comandi gcc e g++. Slackware non include l’ormai obsoleto egcs. Il compilatore esegue delle
operazioni preliminari sul sorgente, prima di passare alla compilazione vera e propria, per renderlo
maggiormente comprensibile a CC. A tal fine si vale del preprocessore C (cpp).
I file di intestazione
Detti anche «header», contengono definizioni del sistema operativo di cui il compilatore necessita
per svolgere il suo lavoro. Solitamente hanno estensione .h. Slackware li presenta nei pacchetti di glibc.
Inoltre servono gli header del kernel. Di solito, i file di intestazione contengono dichiarazioni di tipi e
funzioni che le varie librerie o il sistema operativo offrono.
Le binutils
Contengono una serie di programmi che elaborano e unificano l’output del compilatore per ottenere
i binari finali in linguaggio macchina. Si tratta, fra l’altro, dell’assembler as, del linker ld e del library
archiver ar. Infatti CC, da solo, non è in grado di creare un binario e necessita di determinate librerie,
cioè di funzioni precompilate che implementa (se tali librerie sono statiche) oppure che richiama (se esse
sono dinamiche).
Le librerie statiche e dinamiche
Le librerie si suddividono in statiche e dinamiche o condivise; le prime hanno estensione .a, le se-
conde .so. Quando si collega un programma a una libreria statica, il linker copia il codice dalla libreria
all’eseguibile; esso dunque non ha bisogno di trovare altrove, nel sistema, la libreria per essere eseguito,
ma più librerie di questo tipo include, più aumentano le sue dimensioni. Per risolvere il problema esi-
stono le librerie condivise. In questo caso il linker si limita a collegare l’eseguibile a una libreria presente
altrove nel sistema: si ha così il duplice vantaggio che il programma carica la libreria solo quando ne
ha bisogno e non aumenta di dimensione, e che più processi possono condividere lo stesso codice di
libreria condivisa in memoria (e su disco). Per verificare quali librerie sta usando un programma, si usa
il comando: ldd nome_programma .
Il make
Make sovrintende al processo di compilazione, per automatizzarne alcuni aspetti. Slackware presen-
ta GNU make, che supporta anche alcuni Makefile con estensione non standard. Make opera in base
a delle regole incorporate, che possono però essere modificate con opportuni parametri. Fra le più si-
gnificative macro o variabili speciali troviamo CFLAGS (opzioni del compilatore C); LDFLAGS (come
CFLAGS, che servono al linker per cercare le librerie); LDLIBS (per consentire la ricerca delle libre-
rie condivise in posizioni non canoniche, cioè non incluse nel percorso di ricerca di libreria di runtime
preconfigurato); CC (il compilatore stesso; l’impostazione predefinita è cc); CPPFLAGS (opzioni del
preprocessore); CXXFLAGS (GNU make la usa per i flag di C++; non funziona con altre versioni di
make). Il make rende automatici anche i processi di linking e solitamente è fatto seguire dal comando
make install per installare effettivamente il programma. Per far sì che il make possa adattarsi a varie
architetture senza modificare parecchie impostazioni (il che una volta andava effettuato a mano), sono
stati introdotto diversi programmi che creano il make: fra questi, i più diffusi e funzionali sono lo script
configure e quindi autoconf e automake.
12.2. Procedura per la creazione di pacchetti .tgz 159
Perl
Linguaggio di script richiesto da moltissimi script di configurazione, generatori di codice, parser e
utilità correlate.
Altri pacchetti di sviluppo
Vi sono poi ancora altri programmi eventualmente in gioco quando si compila: il debugger (Slack-
ware monta il debugger standard dei sistemi GNU/Linux, e cioè gdb), che serve e identificare le cause
di eventuali malfunzionamenti (ma serve esclusivamente al programmatore); programmi che leggono
file o comandi di configurazione durante la compilazione, come il tokenizzatore Lex (in GNU/Linux
Flex) e l’analizzatore Yacc (in Linux, sia Bison sia lo stesso Yacc).
Linguaggi di scripting
Molti programmi sono oggi redatti con linguaggi di scripting. Dal momento che alcuni di questi
hanno raggiunto una grande potenza, non sono pochi i programmatori che li preferiscono a C. Il più im-
portante di questi linguaggi, data la sua estrema versatilità, è, come abbiamo visto, Perl; quindi Python,
PHP (per l’elaborazione di ipertesti che si riscontra spesso nelle pagine Web dinamiche e che il più delle
volte genera codice HTML); Java (poco adottato nei sistemi Unix), e ancora Tcl, m4 (per l’elaborazione
delle macro), Ruby, Lisp (con cui è compilato in buona parte Emacs), Matlab (linguaggio commercia-
le di programmazione matematica a cui attualmente si stanno affiancando progetti open source come
Octave e Scilab).
Il sorgente si scompatta da console a seconda del formato, che in genere è .tar.gz o .tar.bz2 (sulla
scompattazione e la gestione degli archivi vedi Scheda n. 24 – La gestione degli archivi ), oppure con
utilità grafiche come Ark (per KDE) o File Roller (per Gnome) in una directory qualunque. È sempre
opportuno evitare di svolgere questa operazione in directory di programma, per non causare eventua-
li errori di cancellazione, e usare una directory creata ad hoc: alcuni la creano in /home o all’interno
della directory dei sorgenti (soluzioni entrambe scomode), o ancora in una subdirectory di /tmp. Qui
ipotizzeremo, a titolo di esempio, di lavorare nella directory provvisoria /tmp/pkg.
Scheda n. 24
La gestione degli archivi
Vi sono vari tipi di archivi supportati da GNU/Linux, compressi e non. Citiamo qui i principali e
indichiamo i più diffusi comandi per la loro gestione.
Il formato .zip
Questo formato non è particolarmente diffuso in ambiente GNU/Linux, e tuttavia è utile conoscerlo per
poter gestire gli archivi di ambiente Windows, dove è di fatto lo standard (essendo molto meno diffusi i
formati .rar e altri).
Zippare un file: zip nome_archivio.zip nome_file.estensione . Una volta zippato il file, il
programma ci informa sulla percentuale di compressione con l’avviso: «deflated n%».
Zippare una directory: zip [-r] nome_archivio.zip /directory . L’opzione -r consente un proces-
so ricorsivo, cioè esteso alle subdirectory della directory principale. Una volta zippata la directory, il
programma ci informa sulla percentuale di compressione dei singoli file.
Szippare un file o un archivio: unzip nome_archivio.zip.
Il formato .gzip
Il programma gzip è in grado di zippare solo file, e non directory (per compiere questa operazione è
necessario combinarlo col programma tar).
Comprimere un file: gzip nome_file.estensione . L’estensione .gz viene aggiunta automaticamente.
Questo comando sostituisce il file originario, che viene pertanto eliminato, a meno che non si precisi
l’opzione k. L’opzione -1 predispone alla massima velocità dell’operazione, l’opzione -9 alla massima
compressione possibile, passando per i gradi intermedi.
Decomprimere un file: gzip -d nome_file.zip oppure: gunzip nome_file.zip, dal momento che
gunzip non è che un link simbolico a gzip. Il programma in questione, dopo aver compattato o
scompattato, elimina il file originale, a meno che non si precisi l’opzione k.
Il formato .bzip2
Il programma bzip2 è un’altra utilità di sola compressione, ma, sebbene forse un po’ più lenta nel-
l’operare e tale da richiedere un uso maggiore di memoria, è in grado di raggiungere percentuali di
compressione più elevate di gzip.
Comprimere un file: bzip2 nome_file.estensione . Questo comando sostituisce il file originario, che
viene pertanto eliminato, a meno che non si precisi l’opzione k. L’opzione -1 predispone alla massi-
ma velocità dell’operazione, l’opzione -9 alla massima compressione possibile, passando per i gradi
intermedi.
Decomprimere un file: bzip2 -d nome_file.bz2 oppure: bunzip2 nome_file.bz2. Questo comando
sostituisce il file originario, che viene pertanto eliminato, a meno che non si precisi l’opzione k.
12.2. Procedura per la creazione di pacchetti .tgz 161
Il formato .tar
Il programma tar serve a creare archivi non compressi. Fra le varie opzioni che supporta servono
soprattutto le seguenti:
-f: specifica un file archivio da estrarre o da creare (quest’opzione va sempre specificata, con l’unica
eccezione delle unità a nastro).
-c: crea un archivio.
-x: estrae un archivio (è possibile anche estrarre singoli file da un archivio precisando esattamente il loro
nome).
-t: mostra il contenuto dell’archivio.
-v: effettua le operazioni in «verbose mode», cioè dando maggiori informazioni.
-p: mantiene le autorizzazioni originali dei file, avendo la precedenza su umask (le autorizzazioni ven-
gono impostate solo al termine del processo di estrazione, per cui è necessario attendere la conclusione
dell’intero processo per ottenere da questa opzione il risultato desiderato).
Creare un archivio: tar -cvf nome_archivio.tar /cartella_da_archiviare .
Estrarre un archivio: tar -xvf nome_archivio.tar .
Listare il contenuto di un archivio (senza estrarre): tar -tf nome_archivio.tar .
I formati tar.gz e tar.bz2
Poiché gzip e bzip2 sono solo in grado di comprimere e tar solo di archiviare, è possibile ottenere ar-
chivi compressi combinando queste due utilità. Basta aggiungere alle opzioni del comando tar rispet-
tivamente le opzioni z per indicare gzip e j per indicare bz2 al fine di svolgere tutte le operazioni su
entrambi i tipi di archivio.
Creare un archivio con gzip (.tgz o .tar.gz): tar -czvf nome_archivio.tgz
/cartella_da_archiviare .
Creare un archivio con bzip2 (.tar.bz2): tar -cjvf nome_archivio.tar.bz2
/cartella_da_archiviare .
Estrarre un archivio con gzip (.tgz o .tar.gz): tar -xvfz nome_archivio.tgz.
Estrarre un archivio con bzip2 (.tar.bz2): tar -xjvf nome_archivio.tar.bz2. In realtà, l’operazione è
duplice: prima i file vengono decompressi, poi estratti. La procedura coincide quindi con l’applicazione
di gunzip e quindi di tar -x.
Listare il contenuto di un archivio (senza estrarre): tar -ztf nome_archivio.tgz .
Se si estrae un archivio per errore in una qualche directory preesistente, si possono cancellare tutti e solo
i file estratti col comando: tar -ztf nome_archivio.estensione | xargs rm.
Il formato .rar
L’algoritmo che sta alla base del formato .rar è commerciale. Rar offre un buon fattore di compressione,
ma è poco usato in Unix. Per GNU/Linux è stato sviluppata un’utilità a sola riga di comando, reperi-
bile all’indirizzo http://www.rarlab.com/index.htm. Essa, se non registrata, consente soltanto di estrarre
archivi, con la seguente sintassi: rar e nome_archivio.rar . In questo caso si può ricorrere anche a
strumenti disponibili in modalità grafica, come Ark).
Il formato .ace
Il formato .ace è commerciale e sviluppato per Windows; presenta un buon equilibrio fra percentuale
di compressione e velocità nell’effettuare le sue operazioni. L’utilità per gestire sotto Windows questo
tipo di file è inoltre in grado di gestire svariati altri formati di compressione. Esiste un’utilità a riga
di comando per GNU/Linux atta a scompattare archivi di questo tipo; si tratta di linunace, reperibile
all’indirizzo: http://www.winace.com/.
Il formato .7-Zip
7-Zip è un un recente formato di compressione sviluppato sotto Windows che riesce a ottenere ri-
sultati migliori dei tradizionali algoritmi che stanno alla base di WinZip e di Rar. Ne esiste un
162 12. Creazione di pacchetti .tgz
port per GNU/Linux, e più precisamente una utilità da riga di comando reperibile all’indirizzo
http://p7zip.sourceforge.net. È tuttavia consigliabile usarlo solo per decomprimere file in questo formato,
e non anche per creare archivi sotto Unix: esso infatti non mantiene i permessi dei file.
Prima di chmodare, verifichiamo naturalmente se ne vale la pena, cioè se effettivamente sono pre-
senti file con quei permessi da modificare. I comandi sono del tipo:
find . -perm 775 -exec chmod 755 {} \;
find . -perm 664 -exec chmod 644 {} \;
(che sono i casi più diffusi) e via dicendo.
Le opzioni di base
Quelle che seguono sono le opzioni di base della configurazione, pressoché identiche per tutti i pac-
chetti. Forniscono alcune informazioni sul pacchetto, e solitamente nella compilazione si può prescin-
dere da esse.
Installation directories:
--prefix=PREFIX install architecture-independent files in PREFIX
[/usr/local]
--exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
[PREFIX]
By default, `make install' will install all the files in `/usr/local/bin',
`/usr/local/lib' etc. You can specify an installation prefix other than `/usr/local'
using `--prefix', for instance `--prefix=$HOME'.
For better control, use the options below.
Tutte queste attenzioni non servono solo a produrre la standardizzazione dei pacchetti e di conse-
guenza l’ordine all’interno del disco fisso. Esse fanno anche sì che gran parte del sistema giri in sola
lettura, per garantirne la sicurezza.
Prefisso e suffisso
Le indicazioni che seguono sono relative all’assegnazione di un prefisso o di un suffisso al nome
del programma al momento dell’installazione. Se non si passa al configure $ARCH-slackware-linux per
specificare il sistema operativo, questo potrebbe generare degli eseguibili con estensione scorretta, come
slackware-linux-cups invece, semplicemente, di cups. È proprio per evitare questo genere di errori che
si fa ricorso alle opzioni --program-prefix=PREFIX e --program-suffix=SUFFIX.
Program names:
--program-prefix=PREFIX prepend PREFIX to installed program names
--program-suffix=SUFFIX append SUFFIX to installed program names
--program-transform-name=PROGRAM run sed PROGRAM on installed program names
System types:
--build=BUILD configure for building on BUILD [guessed]
--host=HOST cross-compile to build programs to run on HOST [BUILD]
--target=TARGET configure for building compilers for TARGET [HOST]
Optional Features:
--disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
--enable-FEATURE[=ARG] include FEATURE [ARG=yes]
--enable-debug Enables Debug-Code
--disable-dependency-trackin Speeds up one-time builds
--enable-dependency-trackin Do not reject slow dependency extractors
--enable-debug=ARG enables debug symbols (yes|no|full) default=no
--disable-debug disables debug output and debug symbols default=no
--enable-strict compiles with strict compiler options (may not work!)
12.2. Procedura per la creazione di pacchetti .tgz 165
Qui di seguito si dettaglia che il pacchetto può essere installato abilitando determinate funzioni lega-
te ad altri pacchetti presenti nel sistema. Ad esempio, l’opzione --with-xinerama fa sì che sia abilitato
il supporto per Xinerama. Molti pacchetti consentono di abilitare o meno specifiche utili opzioni, per
adattare il pacchetto alle proprie esigenze. Ad esempio, alcune GUI per database consentono di usare
vari database (da MySQL a PostgreSQL) a seconda delle opzioni attivate; per certi programmi di posta
elettronica, può essere opportuno abilitare ssl con l’opzione --enable-ssl, per altri determinati plugins
col comando --enable-plugins e via dicendo. Altre opzioni suggeriscono al programma la presenza
di librerie in posizioni non canoniche, che potrebbero sfuggire al controllo automatico. Alcune funzioni
sono abilitate se il programma trova determinate librerie già presenti nel sistema, senza il bisogno di
precisare esplicitamente dei flag. Così, k3b attiva i plugin per decodificare alcuni formati di file sonori
semplicemente se individua le relative librerie.
Optional Packages:
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
--without-PACKAGE do not use PACKAGE (same as with-PACKAGE=no)
--with-gnu-ld assume the C compiler uses GNU ld default=no
--with-pic try to use only PIC/non-PIC objects default=use both
--with-pythondir=pythondir use python installed in pythondir
--without-python Do not compile the Scripter Plugin
--with-xinerama enable support for Xinerama
--with-extra-includes=DIR adds non standard include paths
--with-extra-libs=DIR adds non standard library paths
--with-qt-dir=DIR where the root of Qt is installed
--with-qt-includes=DIR where the Qt includes are
--with-qt-libraries=DIR where the Qt library is installed
166 12. Creazione di pacchetti .tgz
Variabili di sistema
Sono qui elencate le variabili di sistema. L’ottimizzazione del pacchetto prevede di adottare sempre
CFLAGS, cioè di indicare per quale tipo di ambiente deve lavorare il compilatore. I parametri di otti-
mizzazione da passare al compilatore, che prendono per l’appunto il nome di FLAGS, dipendono anche
dall’architettura per cui vogliamo configurare il pacchetto (come Pentium o Athlon).
Se non viene precisato alcun parametro, gcc cerca di minimizzare il tempo di compilazione e lo spa-
zio richiesto in memoria (chiamato «costo di compilazione»), a scapito dell’efficienza del pacchetto. La
situazione cambia se al compilatore vengono passati dei parametri definiti. Quelli classici (attualmente
ne esistono di nuovi e più spinti, ma tutti ancora a livello sperimentale) sono: -O (equivalente di -O1.
Attenzione: si tratta della lettera O, non del numero zero!) riduce le dimensioni del pacchetto; -O2: cer-
ca invece di migliorare la dimensione del compilato; infine -O3: migliora ulteriormente la velocità del
compilato a scapito delle dimensioni (per cui ne produce un lieve incremento). Per compatibilità, nei
pacchetti standard, al momento attuale Slackware adotta -O2.
Quindi si precisa l’ottimizzazione per il processore e la CPU. Attualmente i pacchetti ufficiali di
Slackware sono costruiti per i486, per cui avremo i seguenti due valori: -march=i486 e -mtune=i686 (le
versioni precedenti di gcc, presenti fino a Slackware 10.2, adottavano -mcpu in luogo di -mtune). Pac-
chetti costruiti per uso personale possono anche avere ottimizzazioni più spinte, ad esempio i FLAGS
-O3 e -march=i686. Il parametro -march è rilevante per i sistemi che dovranno usare il pacchetto (un
pacchetto ottimizzato per i686 non funziona su un i484), mentre -mtune solo per il sistema che sta com-
pilando il pacchetto, in quanto ne ottimizza le risorse durante il suo lavoro. In ogni caso, si può trovare
l’elenco esaustivo delle opzioni al seguente indirizzo: http://gcc.gnu.org/onlinedocs. Un altro elenco più
semplice ma comunque ampio si legge all’indirizzo: http://gentoo-wiki.com/Safe_Cflags.
L’eventuale opzione -g genera informazioni di debug (dunque è l’opposto di --disable-debug o di
--enable-debug=no).
Altre opzioni sono state analizzate nella Scheda n. 19 – Gli strumenti di compilazione . A titolo di
esempio, citiamo il caso del pacchetto openldap. Il configure, se non opportunamente configurato, cer-
ca il Berkeley DB, ma non trova ciò di cui necessita e cioè la versione corretta di quel pacchetto, e di
conseguenza interrompe la compilazione col messaggio:
Per risolvere bisogna suggerire al configure il percorso di tale libreria, inserendo i campi CPPFLAGS e
LDFLAGS, come segue:
oppure
find . | xargs file | grep "executable" | grep ELF | cut -f 1 -d : | xargs strip \
--strip-unneeded 2> /dev/null
Lo strip non solo riduce le dimensioni dei binari (e successivamente delle librerie) rendendo il pro-
gramma più veloce e riducendo l’uso della memoria, ma contribuisce anche a rendere più sicuri i binari:
eliminando i simboli di debug dai file, essi risultano diversi da quello normalmente usati in altre distri-
buzioni e meno soggetti a un possibile exploit. C’è una sola controindicazione, che però riguarda più
che altro i programmatori: in caso di crash, il programma non darà indicazioni utili alla soluzione del
problema.
12.2. Procedura per la creazione di pacchetti .tgz 169
find . | xargs file | grep "shared object" | grep ELF | cut -f1 -d : |
xargs strip --strip-unneeded 2> /dev/null
In tutti questi casi, la redirezione dell’eventuale messaggio di errore (2>) a /dev/null evita di ricevere
inutili messaggi se i file da strippare in realtà non esistono. La stessa procedura si adotta anche per
strippare eventuali file di tipo current o archive. In questo caso il comando sarà:
|-----handy-ruler------------------------------------------------------|
emacs: emacs (GNU Emacs)
emacs:
emacs: Base binaries and support files for the GNU Emacs editor/environment.
emacs: This version supports X. If you do not have X installed, you will
emacs: also have to install the replacement Emacs binary that does not
emacs: require the X11, Xaw3d, and Xt libraries.
emacs:
emacs: The emacs binary in this package was configured with these options:
emacs: i486-slackware-linux --prefix=/usr --with-x11 --with-x-toolkit
emacs: --with-pop
emacs:
La parte superiore, intitolata «HOW TO EDIT THIS FILE», è tutta commentata e consiste soltanto
in istruzioni per compilare correttamente la descrizione (ciò nondimeno, è buona norma mantener-
la sempre invece di rimuoverla). Il file va collocato in una directory creata appositamente e chiamata
/install.
Lo slack-required
Se il pacchetto necessita di librerie particolari, cioè ha delle dipendenze che richiedono altri pacchetti
inusuali o comunque non presenti in Slackware, ciò dovrebbe essere segnalato in un file (di solo testo)
chiamato «slack-required», che andrà posizionato in /install. Di default, si segnala una sola dipendenza
per linea, precisando inoltre la versione richiesta, secondo la sintassi:
nome_applicazione condizione versione,
dove «condizione» può essere = (uguale), < (minore), > (maggiore), >= (maggiore o uguale ) e <= (minore
o uguale). Ad esempio, la stringa:
significa che che è richiesta la libreria openh323 in versione uguale o maggiore di 1.13.4.
12.2. Procedura per la creazione di pacchetti .tgz 171
( cd /usr/lib/graphviz ; dot -c )
Tuttavia, stando al funzionamento ordinario, essa verrebbe anteposta ai link simbolici che doinst.sh
crea al momento dell’installazione del programma, e non trovandoli già produrrebbe un errore. Perché
invece la creazione dei link preceda l’inserimento della riga, va usata per l’appunto l’opzione -p, cosicché
il comando di creazione del .tgz risulterà:
makepkg -l y -c n -p $TMP/$NAME-$VERSION-$ARCH-$BUILD.tgz
Saremo avvertiti del corretto procedimento verso la fine del processo di compilazione, quando leg-
geremo a schermo:
Alcuni pacchetti (in genere privi di eseguibili, come i file di linguaggio per altri programmi) non ac-
cettano le opzioni per il compilatore, dunque non possono essere costruiti per una particolare architet-
tura. In questo caso, in luogo dell’indicazione dell’architettura (come i486) andrà inserita l’indicazione
noarch.
Creato il pacchetto, si possono rimuovere le due directory temporanee di lavoro (quella in cui abbia-
mo scompattato il sorgente e quella in cui abbiamo costruito il .tgz).
Ora siamo pronti per installare il nostro .tgz, ma prima è opportuno verificare che il processo di
compilazione sia andato a buon fine. La verifica di eventuali errori si può compiere (è il metodo più
172 12. Creazione di pacchetti .tgz
veloce) rileggendo i messaggi che sono apparsi sulla shell, e a questo fine si può impostare la cronologia
di una shell come Konsole perché visualizzi un numero illimitato di righe (Impostazioni – Cronologia
– Numero di linee – Illimitato), oppure – soluzione assai più comoda – si può redirigere il processo a un
file. Infine, si possono vedere soltanto gli errori redirigendoli a un file. Nel caso si adotti uno SlackBuild,
il comando sarà:
./nome_pacchetto.SlackBuild --cleanup 2>/home/errori.txt
#!/bin/sh
# chiude tutte le applicazioni attive di sendmail
killall sendmail
userdel alias
userdel qmaild
userdel qmaill
userdel qmailp
userdel qmailq
userdel qmailr
userdel qmails
groupdel nofiles
groupdel qmail
È possibile anche inserire un avvertimento a video, che metta al corrente, ad esempio, di una libre-
ria necessaria per effettuare l’installazione o di una determinata procedura da seguire. All’interno di
doinst.sh andranno collocate le righe che si desidera appaiano, con la seguente sintassi:
( echo )
( echo )
( echo ================================================ )
( echo )
( echo Avvertimento )
( echo Avvertimento )
( echo )
( echo ================================================ )
( echo )
12.5 Tips&tricks
12.5.1 Pacchetti con nomi non canonici
Come abbiamo visto, i pacchetti .tgz di Slackware presentano dei nomi in forma canonica, composti
da una serie di campi (nome, versione, ottimizzazione, numero della compilazione eventualmente pre-
ceduto dalla sigla del compilatore), separati da un trattino. Questa forma serve al database per successivi
aggiornamenti. Il primo campo è sempre i nome del pacchetto, ed è separato da un trattino dal secondo
campo, che è sempre la sua versione, e via dicendo. In certi casi però si trovano dei sorgenti che pre-
sentano dei nomi difformi da questa struttura, ad esempio knights-0.6.4-beta.tar.gz. Se si compilasse il
174 12. Creazione di pacchetti .tgz
#!/bin/sh
userresources=$HOME/.Xresources
usermodmap=$HOME/.Xmodmap
sysresources=/usr/X11R6/lib/X11/xinit/.Xresources
sysmodmap=/usr/X11R6/lib/X11/xinit/.Xmodmap
if [ -f $sysresources ]; then
xrdb -merge $sysresources
fi
if
[ -f $sysmodmap ]; then
xmodmap $sysmodmap
fi
if [ -f $userresources ]; then
xrdb -merge $userresources
fi
if [ -f $usermodmap ]; then
xmodmap $usermodmap
fi
# Start the window manager:
exec /usr/X11R6/bin/nome_eseguibile
12.6. Creare una patch 175
DO_NOT_COMPILE='$DO_NOT_COMPILE kmobile'
In questo modo si ordina al configure di aggiungere kmobile a quanto non dev’essere compilato.
Spesso si tratta di utilità o funzioni ancora in testing. Per far compilare anch’esse, basta rimuovere quella
riga o, più semplicemente, commentarla. Nel configure si troverà a volte definito in modo esplicito, come
nel caso appena considerato, quanto non va compilato, più spesso però saranno presenti delle istruzioni
condizionali. Consideriamo un caso esemplificativo, quello di kcardtools. Nel configure troviamo:
Ciò significa che se la variabile FOUND_KSMCARD ha un contenuto diverso da «yes», allora kcardtools
non va compilato. Sempre nel configure, ricercando la stringa FOUND_KSMCARD si trova che la variabile è
posta in base a questa condizione:
Si tratta evidentemente (dal nome della variabile) di un header. Un’ulteriore ricerca sulla stringa
ac_cv_header_kcarddb_h ci fa trovare una serie di istruzioni legate al fatto che kcarddb sia stato trovato
o meno:
Poiché kcardb.h viene installato insieme a ksmcard (che sta in kdelibs), possiamo concludere che
kcardtools viene installato se e solo se trova la presenza di quello header, a sua volta presente solo se
abbiamo già installato le kdelibs.
In certi altri casi la presenza di specifici programmi o librerie consente l’attivazione automatica di
certe funzioni o supporti o funzionalità aggiuntive. Alcuni programmi riassumono alla fine del configu-
re le opzioni abilitate e quelle che non lo sono. È perciò di solito abbastanza semplice rendersi conto di
quello che manca e fare una ricerca sul modo per abilitarlo.
(in genere il Makefile, ma talvolta delle librerie). Se si vuole tener traccia delle modifiche (essenziale nel
caso poi si intenda produrre uno SlackBuild), si devono modificare i file nella directory di partenza, a
cui si aggiunge il suffisso .orig e quindi produrre un file che registri le modifiche apportate col comando:
diff -u -r [file-originale] [file-modificato] >file.diff.
La patch può essere inserita anche nello SlackBuild, che ricorre a una versione del file .diff com-
pressa con gzip. KDE presenta una comoda e molto efficiente interfaccia per diff e patch, che si chiama
Kompare. Per apportare modifiche elementari al volo, si usa l’editor sed.
Scheda n. 25
Lo streaming editor SED
Sed non è propriamente un editor col quale scrivere dei testi, ma uno «streaming editor», ossia un
programma (non interattivo, laddove tutti i tradizionali e ben noti editor, da Vi a Emacs e così via sono
interattivi) di manipolazione del testo e più in generale di un flusso di dati, quando esso provenga
indifferentemente dallo standard input, da un file o da una pipeline. Il risultato della trasformazione
viene restituito attraverso lo standard output (cioè visualizzando il testo modificato a schermo senza
intaccare il file originale) o in un file. Ciò risulta particolarmente utile per modificare script di shell, ma
anche per produrre il batch editing di file o per creare degli script che modificano in forma automatica
dei file esistenti.
Facciamo due esempi banali, immediatamente riproducibili. Nel primo, abbiamo un flusso di testo
attivato con echo, in cui si sostituisce al volo una parola con un’altra, visibile sullo schermo:
echo 'Il miglior sistema operativo è Windows' | sed /Windows/s//Linux/
Nel secondo effettuiamo la sostituzione globale di una stringa all’interno di un file di testo, in modo
che il vecchio venga preservato:
La sintassi di sed
Sed opera attraverso un comando, un indirizzo che gli viene fornito e che può essere rappresentato
da una stringa di testo, da un numero di riga, da una verifica di occorrenza, da un’espressione regolare.
Il testo da elaborare viene racchiuso fra delimitatori, costituiti solitamente da semplici barre (/) – ma
anche dal trattino basso (_) oppure dalle virgole, o ancora dalla barra verticale (|): quello che conta è
soltanto la leggibilità della formula –, cui si aggiungono determinati operatori.
Ad esempio, 3d indica a sed di cancellare la terza riga dell’input, mentre /parola/d gli ordina di
cancellare la parola parola.
Sed adotta l’opzione -e per indicare che quanto segue è un comando. Se è presente una singola
istruzione, allora tale opzione può essere omessa.
Negli script di shell l’adozione degli apici semplici evita l’espansione di shell. Comandi lunghi
possono essere scritti su più righe usando la barra inversa (\) come indicatore di a capo.
Possono essere adottate anche le espressioni regolari, come ^(che indica l’inizio di riga), $ (che in-
dica la fine di riga), . (che indica un singolo carattere quasiasi), * (che indica zero o più ripetizioni del
carattere precedente), [] (che indica tutti i caratteri all’interno delle graffe). Di conseguenza, avremo fra
l’altro che:
/a*^/ restituisce le linee che terminano con «a» seguita da zero o più spazi
/[abc]/ restituisce le linee che contengono «a», «b» o «c»
/^[abc]/ restituisce le linee che iniziano con «a», «b» o «c»
Queste espressioni si usano per tutte le operazioni di sostituzione e cancellazione. Ad esempio, il co-
mando: sed -e '/regexp/d'/percorso/file | more elimina le righe corrispondenti all’espressione
regolare indicata, mentre il comando: sed -n -e '/regexp/p'/percorso/file | more stampa le ri-
ghe che soddisfano l’espressione. Infine, il comando: sed -n -e '/begin/,/end/p'/percorso/file |
more stampa l’intervallo compreso fra le espressioni indicate. Se la prima espressione non viene trovata,
non sarà stampato nulla, perché sed non sa da dove iniziare a stampare. Se invece non viene trovata
la seconda espressione, verrà stampato tutto il testo che segue alla prima, perché sed non sa, quando
inizia, se e dove la troverà.
I comandi di sed
Fra i comandi di sed a cui maggiormente si fa ricorso possono essere citati:
p (print) che visualizza l’indirizzo sullo standard output. Pertanto indirizzo /p stampa sullo stan-
dard output l’indirizzo specificato, facendo vedere sullo schermo una determinata stringa. Il comando:
sed 'p' file.txt fa vedere sullo schermo il testo di file.txt.
i (insert) che inserisce una determinata stringa.
c (change) che modifica una determinata riga sostituendola con la nuova riga indicata.
w (write) che scrive in un file le modifiche apportate, file che viene indicato col carattere di
reindirizzamento >.
s (substitute) che sostituisce una determinata stringa (ed è probabilmente quello a cui si fa ricorso
nella più ampia misura). Pertanto il comando sed indirizzo /s/stringa1 /stringa2 / sostituisce in
tutte le righe specificate in indirizzo e solo in esse la prima occorrenza di stringa1 con stringa2. Per
sostituire tutte le occorrenze è necessario specificare, in aggiunta, l’operatore g (global), come abbiamo
constatato nei due esempi sopra riportati.
Il comando d (delete) che cancella una determinata stringa. Pertanto indirizzo /d lo cancella. Ad
esempio, lanciando il comando: sed -e 'd' /etc/lilo.conf non leggeremo a schermo nulla: sed ha
infatti aperto il file, ha letto una riga nel suo pattern buffer, ha eseguito il comando di cancellazione e ha
proseguito così per tutte le righe. In assenza di indirizzi, sed infatti si applica a tutte le linee del testo. L’a-
dozione della virgoletta singola serve a evitare l’espansione di shell. È naturalmente possibile precisare
una determinata riga; così, il comando: sed -e '1d' /etc/lilo.conf cancella soltanto la prima riga.
Gli intervalli si precisano separati dalla virgola, per cui il comando: sed -e '1,10d' /etc/lilo.conf
eliminerà le prime dieci righe.
Tutti i comandi possono essere applicati con più opzioni aggiuntive. Anche un comando di so-
stituzione può essere applicato solo a una riga o a un determinato intervallo di righe. Il comando:
sed -e '1,10s/foo/bar/g' file.txt sostituirà tutte le occorrenze di foo con bar nelle righe da 1 a
10 incluse del file file.txt, mentre il comando: sed -e '/^$/,/^END/s/foo/bar/g'file.txt sostituirà
tutte le occorrenze di foo con bar solo nei blocchi di testo che iniziano con una riga bianca e terminano
con la stringa END.
La barra inversa fa sì che il comando continui sulla riga successiva; in tal modo il carattere di a capo
a fine riga diventa una stringa di sostituzione. Ad esempio:
s/^*/\
/g
produce come risultato che tutti gli spazi che si trovano a inizio riga vengono sostituiti con un a capo.
In pratica, le indentazioni dei paragrafi si trasformano in altrettante righe vuote.
Istruzioni multiple di editing vanno specificate con l’opzione -e; se è presente un’unica istruzione,
tale opzione può essere omessa.
178 12. Creazione di pacchetti .tgz
Un indirizzo seguito da una o più operazioni può richiedere l’adozione di opportune graffe. Ad
esempio, per cancellare solo la prima di una serie di righe vuote, si avrà:
/[0-9A-Za-z]/,/^$/
/^$/d
.
Alcuni operatori di sed
Elenchiamo alcuni operatori di sed:
ln -s /usr/bin/ccache cc
ln -s /usr/bin/ccache g++
ln -s /usr/bin/ccache gcc
ln -s /usr/bin/ccache i486-slackware-linux-c++
ln -s /usr/bin/ccache i486-slackware-linux-g++
ln -s /usr/bin/ccache i486-slackware-linux-gcc
I link sono inseriti in /usr/local/bin perché esso viene considerato prima di /usr/bin e di /bin, per cui
lanciando gcc verrà richiamato ccache e non gcc stesso.
12.10 Lo SlackBuild
12.10.1 Che cos’è uno SlackBuild
Lo SlackBuild non è che uno script di shell che contiene una serie di comandi atti a costruire un pac-
chetto .tgz partendo dai sorgenti. È sufficiente collocare nella stessa directory lo SlackBuild, lo slack-desc
e il file sorgente (più eventuali file di patch) e lanciare lo SlackBuild stesso. Questo può essere avviato
(sempre e solo da root) settando i permessi in modo opportuno (di norma 755) e quindi impartendo il
comando: ./nome_pacchetto.SlackBuild se lo script è eseguibile oppure, in ogni caso, col comando:
sh nome_pacchetto.SlackBuild. L’aggiunta dell’opzione --cleanup effettua la cancellazione delle di-
rectory temporanee di lavoro (se lo SlackBuild prevede questa opzione). Il processo può essere seguito
da shell o da console, e alla fine nella directory predefinita, che noi poniamo essere /tmp, troveremo il
pacchetto pronto.
La scrittura di uno SlackBuild è utile perché in tal modo i vari passaggi eseguiti nella creazione
del pacchetto non vanno persi: sarà sempre possibile compilare una versione aggiornata (controllando i
cambiamenti) senza dover rifare daccapo tutto il procedimento. Inoltre, modificando alcuni parametri, si
può compilare in modo veloce un pacchetto personalizzato (ad esempio, è possibile utilizzare uno Slack-
Build ufficiale e modificare i FLAGS per adattarlo maggiormente alla nostra architettura). Naturalmente,
la stesura dello SlackBuild richiede una qualche conoscenza di bash scripting.
#!/bin/sh
#
# Heavily based on the Slackware 10.2 SlackBuild
# http://www.nano-editor.org
Dapprima (prima riga) si imposta la directory corrente in cui stanno il sorgente, lo slack-desc e lo
SlackBuild. CWD è la «Current Work Directory» e il comando pwd effettua il «print working directory»,
che per noi è la directory di esecuzione dello script.
Quindi si impostano la variabile per la directory di lavoro, qui /tmp (seconda e terza riga). In secondo
luogo vengono create altre variabili atte a velocizzare il lavoro: il nome della directory di lavoro in
/tmp (quinta riga), il nome del pacchetto (sesta riga), la versione (settima riga), l’architettura (ottava
riga) e infine la release del .tgz (nona riga). L’uso delle variabili è sempre preferibile, perché, se si deve
aggiornare lo SlackBuild per costruire una versione successiva, basta cambiare una sola occorrenza.
CWD=`pwd`
if ["$TMP" = ""]; then
TMP=/tmp
fi
PKG=$TMP/package-nano
NAME=nano
12.10. Lo SlackBuild 181
VERSION=1.2.4
ARCH=i486
BUILD=1ms
Qui di seguito si definisce la posizione in cui scompattare il sorgente, e cioè la directory /tmp:
if [ ! -d $TMP ]; then
mkdir -p $TMP
fi
if [ ! -d $PKG ]; then
mkdir -p $PKG
fi
Produciamo adesso, con la sezione che segue, una semplice stampa a schermo, che ci avverte del-
l’avvio dello SlackBuild per un determinato pacchetto, fornendone nome e versione:
echo "+-----------------------------------+"
echo "| Start SlackBuild $NAME-$VERSION |"
echo "+-----------------------------------+"
Con le righe che seguono ci si porta nella directory di lavoro e si scompatta il sorgente:
cd $TMP
tar xzvf $CWD/$NAME-$VERSION.tar.gz
Con quanto segue ci si porta nella directory del sorgente ormai scompattato (prima riga), si cambiano
i permessi (seconda riga), si rendono ortodossi eventuali permessi anomali (terza e quarta riga):
cd $NAME-$VERSION
chown -R root.root .
find . -perm 775 -exec chmod 755 {} \;
find . -perm 664 -exec chmod 644 {} \;
Le opzioni possono essere collocate tutte sulla stessa riga o, per maggiore leggibilità, su righe diver-
se. In questo caso, prima di ogni capoverso il simbolo della barra inversa (\) indica che la riga non è
conclusa.
Si passa ora alla compilazione vera e propria del pacchetto con la sezione che segue:
make
Nelle righe che seguono si fa in modo che i file del pacchetto vengano installati all’interno della
directory temporanea di lavoro:
Si crea la directory canonica per inserire la documentazione e vi si copiano i file dal sorgente scom-
pattato, in genere presenti nella sua directory principale:
mkdir -p $PKG/usr/doc/$NAME-$VERSION
cp -a \
AUTHORS BUGS COPYING ChangeLog INSTALL NEWS README THANKS TODO UPGRADE \
$PKG/usr/doc/$NAME-$VERSION
( cd \$PKG
find . | xargs file | grep "executable" | grep ELF | cut -f 1 -d : | xargs strip \
--strip-unneeded 2> /dev/null
find . | xargs file | grep "shared object" | grep ELF | cut -f 1 -d : | xargs strip \
--strip-unneeded 2> /dev/null
find . -type f -name "*.a" | xargs file | grep archive | cut -f 1 -d : | xargs strip \
--strip-unneeded 2> /dev/null
)
gzip -9 $PKG/usr/man/*/*
gzip -9 $PKG/usr/info/*
Si conferiscono ora i corretti permessi alla directory /usr/bin, dove stanno gli eseguibili:
Si crea adesso la directory install e vi si copia lo slack-desc. In questa directory il programma inserirà
poi anche l’eventuale doinst.sh:
mkdir -p $PKG/install
cat $CWD/slack-desc > $PKG/install/slack-desc
Si passa infine nella directory di lavoro del pacchetto appena creato e si impartisce il comando atto a
creare il pacchetto stesso con la sezione che segue:
12.10. Lo SlackBuild 183
cd $PKG
makepkg -l y -c n $TMP/$NAME-$VERSION-$ARCH-$BUILD.tgz
Nel caso lo SlackBuild sia stato lanciato con l’opzione --cleanup, la sezione che segue dispone di
cancellare le due directory temporanee: quella dove è stato scompattato il sorgente e quella in cui è stato
creato il pacchetto, che rimarrà, pronto per l’installazione, nella directory /tmp.
Una volta creato il file doinst.sh, nello SlackBuild andrà inserita la riga:
if [ -d $PKG/opt/kde/man ]; then
gzip -9 $PKG/opt/kde/man/man?/*
fi
184 12. Creazione di pacchetti .tgz
Per interrompere immediatamente la compilazione se c’è un errore si inserisce il piccolo script che
segue dopo ogni make o make install dello SlackBuild:
if [ $'!= 0 ]; then
exit
fi
Si deve tuttavia prestare attenzione al fatto che, a volte, questa procedura estrema (anche se effettuata
a mano con Ctrl+z durante la compilazione) può lasciare indebitamente modificati i permessi di tutta
la directory /tmp e delle sue subdirectory, assegnando tutto a root:root, con conseguenze sgradevoli
per gli utenti. In questo caso i permessi si ripristinano, per ciascun utente alla volta, col comando: chown
-R nome_utente :users *nome_utente *. Allo stesso modo resteranno in /tmp le directory di lavoro, da
rimuovere manualmente.
In /tmp alcuni file sono di root:users (fra di essi, quelli contenuti in .ICE-unix e anche il file .X0-
lock. Modificati proprietario e gruppo in root:root, essi potrebbero creare dei problemi all’avvio di
X. In questo caso, la soluzione radicale è eliminare tutti i file con: rm -rf /tmp* e rm -rf /tmp/.* e
riavviare il sistema.
Per applicare una patch, nella directory dove stanno il sorgente, lo slack-desc e lo SlackBuild andrà
collocato anche il file .diff zippato con gzip. La riga di comando da inserire nello SlackBuild sarà del
tipo:
L’opzione --verbose consente di controllare nella shell il felice esito della patch stessa.
Aggiornare Slackware
13.2 Swaret
13.2.1 Che cos’è Swaret
Swaret (SlackWARE Tool) si sta rapidamente affermando come lo strumento più diffuso e funzionale,
tanto che ne esiste la traduzione in svariati linguaggi, italiano incluso, e anche alcune GUI:
Kswaret (basata sulle QT) per KDE (reperibile agli indirizzi: http://freshmeat.net/projects/kswaret e
http://kswaret.sourceforge.net, anche se al momento il progetto sembra abbandonato)
Gswaret (basata su ncurses), progetto che però al momento sembra abbandonato
Zswaret (basata su Zenith), progetto che però al momento sembra abbandonato
Qtswaret (http://qtswaret.altervista.org e http://qtswaret.sourceforge.net/index.php).
In ogni caso, è estremamente semplice gestire il programma da riga di comando. Slackware non
installa Swaret di default, e anzi il pacchetto, reperibile negli /extra fino alla versione 9.1, è stato at-
tualmente eliminato; esso è comunque scaricabile all’indirizzo http://swaret.sourceforge.net. Swaret è in
grado di gestire le dipendenze e (tramite ldd) il «track and fix» delle librerie mancanti; ciò non equivale
però sempre una risoluzione esaustiva delle dipendenze, che in certi casi non sono librerie, ma altri tipi
di pacchetti. Inoltre Swaret non compie l’aggiornamento dei pacchetti di Dropline Gnome, che si effet-
187
188 13. Aggiornare Slackware
tua mediante il dropline-installer. Attualmente è in sviluppo un nuovo ramo (il 2) scritto in Perl (il ramo
1 è semplicemente uno script di bash).
REPOS_ROOT=NOME_REPOSITORY%PROTOCOLLO:URL
ad esempio:
REPOS_ROOT=Slacky.it%http://www.slacky.it/download
Ad esempio, se vogliamo escludere tutti i pacchetti delle lingue di KDE e di KOffice, tranne quello
italiano che andrà invece installato, possiamo scrivere:
EXCLUDE=kde-i18n[it] koffice-i18n[it]
DEPENDENCY=1: questo settaggio controlla le dipendenze, mentre = 0 lo escluderebbe. Sebbene Swaret
non sia sempre infallibile nella gestione delle dipendenze, nella maggior parte dei casi produce buoni
risultati.
DSEARCHLIB=1: compie la ricerca delle librerie mancanti.
DSEARCHM=0: impostato a 1 fa sì che Swaret ricorra al programma slocate per la ricerca delle libre-
rie mancanti (e richiede un aggiornamento frequente del database interno dei pacchetti, col comando
updatedb -uv). Impostato a O effettua la ricerca con find.
MD5CHECK=0: impostato a 1, controlla lo MD5SUM dei pacchetti.
GPGCHECK=0: impostato a 1, controlla la firma digitale dei pacchetti (e presuppone che le firme siano già
nel keyring del sistema).
DESC=0: impostato a 1, mostra la descrizione dei pacchetti durante l’installazione.
CACHE-DIR=/var/swaret: imposta la directory di cache.
LOG=1: abilita la scrittura di un file di log.
LOG_FILE=/var/log/swaret: imposta la directory del file di log.
WARNINGS=1: abilita i messaggi di avvertimento a schermo.
INFORMATION=1: abilita la visualizzazione delle informazioni a schermo.
Nella sezione Network Settings sono presenti le seguenti opzioni:
NIC=eth0: indica la scheda di rete. Questa voce, abilitata di default, va modificata se si ha una connes-
sione a Internet di altro tipo.
NIC=lo: serve per installare da un CD-ROM (attiva il servizio di loopback)
PROGRESS=1: seleziona il tipo di interfaccia per indicare il download.
TIMEOUT=35: imposta il timeout per wget e/o rsync.
RETRIES=5: imposta il numero di tentativi per wget e/o rsync.
PASSIVE_FTP=1: attiva la modalità ftp passivo (utile se si ha un firewall).
WGET_PROXY=http://IP or HOST:PORT: se si vuole il supporto proxy ai protocolli.
HTTP o FTP, la presente riga va decommentata e va impostata la relativa variabile.
RSYNC_PROXY=IP or HOST:PORT: se si vuole il supporto proxy al protocollo RSYNC, la presente riga va
decommentata e va impostata la relativa variabile.
swaret --compile parola_chiave [-a]: scarica e compila il pacchetto individuato mediante la parola
chiave. Si tratta di una funzione sperimentale, che si attiva solo se il programma trova le istruzioni in
uno buildscript apposito nella directory /var/swaret/.cache.
swaret --config: apre il file /etc/swaret.conf per modificarne la configurazione.
swaret --dep nome_pacchetto [-a]: verifica le dipendenze del pacchetto indicato.
swaret --dep parola_chiave [-a]: verifica le dipendenze di tutti i pacchetti individuati mediante la
parola chiave.
swaret --extra: cerca negli extra di Swaret.
swaret --faq parola_chiave : mostra le Frequently Asked Questions di Swaret.
swaret --get parola_chiave [-a | -p | -ap | s | -as | -u | -au]: scarica il pacchetto o i pac-
chetti, le patch o i sorgenti individuati mediante la parola chiave.
swaret --gpg [-i] path_della_chiave_GPG : importa una chiave GPG pubblica.
swaret --help: mostra l’indice complessivo dei comandi e delle opzioni.
swaret --htus parola_chiave : mostra come usare Swaret attraverso venticinque esempi (la sigla sta
per «How To Use Swaret»).
swaret --install parola_chiave [-a | -p | -ap]: installa il pacchetto o la patch individuati me-
diante la parola chiave.
swaret --list [-p | -s | -i | -u | -n | -np]: elenca tutti i pacchetti, le patch e i sorgenti instal-
lati o meno nel sistema.
swaret --list | grep nome_pacchetto : elenca i pacchetti che rispondono ai criteri impostati median-
te la parola chiave.
swaret --log [-t | -c]: mostra il file di log di Swaret.
swaret --manual: mostra la pagina man di Swaret.
swaret --morehelp: mostra l’indice dei comandi e delle opzioni in forma estesa, specificandole una per
una.
swaret --purge [-s | -d # | -ds # | -w # | -ws # | -v]: rimuove i pacchetti e patch sorgenti
(con l’aggiunta dell’opzione -s) presenti nella cache di Swaret. Non rimuove invece i pacchetti effetti-
vamente installati (azione che vuole il comando remove). L’opzione -w serve a specificare una linea tem-
porale, espressa in settimane, mentre l’opzione -d la esprime in giorni; ad esempio, il comando swaret
--purge -w 4 rimuoverà tutti i file più vecchi di quattro settimane e il comando swaret --purge -ds
5 rimuoverà tutti i sorgenti più vecchi di cinque giorni. Con l’opzione -v questo comando rimuove tutte
le versioni dei pacchetti.
swaret --reinstall parola_chiave [-a | -p | -ap]: reinstalla il pacchetto o la patch individuati
mediante la parola chiave.
swaret --remove parola_chiave [-a]: rimuove il pacchetto o la patch individuati mediante la parola
chiave.
swaret --resume parola_chiave [-p | -s]: riprende lo scaricamento di pacchetti, patch o sorgenti,
individuati mediante la parola chiave, che sia stato interrotto.
swaret --search parola_chiave [-p | -s | -i | -u | -n | -np]: ricerca pacchetti, patch o sor-
genti disponibili, installati e non mediante la parola chiave.
swaret --set nome_variabile : cerca una variabile corrispondente a quelle impostate in /etc/swaret.conf.
swaret --show parola_chiave [-p | -i]: mostra una descrizione per i pacchetti e le patches indivi-
duati mediante una parola chiave.
swaret --update: aggiorna il database dei pacchetti di Swaret cercandoli nei mirror e nei repository
impostati.
swaret --upgrade parola_chiave [-a]: aggiorna tutti i pacchetti o solo quello/i individuato/i me-
diante la parola chiave.
swaret --version: mostra la versione corrente di Swaret.
Le seguenti opzioni possono anche essere combinate:
l’opzione -a rende il procedimento automatico.
13.3. Slapt-get 191
13.3 Slapt-get
Slapt-get, scaricabile all’indirizzo http://software.jaos.org, è un sistema APT-like, cioè simile a quel-
lo utilizzato da Debian per l’aggiornamento dei pacchetti. A differenza di Swaret, effettua il controllo
delle dipendenze in base agli slack-required, che vanno pertanto sempre inseriti in ogni pacchetto (ma
che, a dire il vero, non fanno parte degli standard ufficiali di Slackware); questa è comunque una rego-
la tassativa per i siti di Slapt-get. Teoricamente, questo metodo è più affidabile, perché sappiamo che
non sempre le dipendenze consistono nelle sole librerie. Slapt-get si utilizza da riga di comando con
la sintassi slap-get [obiettivi] [opzioni], ma ne esiste un’interfaccia grafica chiamata slapt-Gui,
scaricabile all’indirizzo http://akinimod.sourceforge.net/slaptgui e basata su GTK.
Il file di configurazione di Slapt-get è /etc/slapt-getrc. In esso vengono specificati:
a) alla voce WORKINGDIR la directory dove Slapt-get piazza i file con cui lavora (gli elenchi dei file dei
vari siti, i pacchetti scaricati ecc.);
b) alla voce EXCLUDE i pacchetti da non aggiornare automaticamente;
c) alla voce SOURCE gli indirizzi dei siti a cui attingere i pacchetti: un ampio elenco di mirror per Slapt-get
si legge all’indirizzo: http://www.linuxpackages.net/mirrors.php.
I comandi di Slapt-get sono estremamente simili a quelli di Swaret; di conseguenza, per aggiorna-
re il database dei pacchetti si darà il comando slapt-get --update, per aggiornare tutti i pacchetti
slapt-get --upgrade, per aggiornare un pacchetto slapt-get --install nome_pacchetto . Per ag-
giornare l’intera distribuzione a un’altra versione (quella prescelta nel file di configurazione) si darà
il comando slapt-get --dist-upgrade. In ogni caso, l’elenco completo dei comandi e delle opzioni,
secondo la sintassi: slapt-get [OPZIONE/I] [OBIETTIVO], si ottiene col comando: slapt-get --help o
consultando la sua pagina man. Ne indichiamo solo i principali, in maniera molto più sommaria di
quanto sia stato fatto per Swaret:
Obiettivi:
--update: recupera i dati del pacchetto dai mirror.
--upgrade: aggiorna i pacchetti installati.
--dist-upgrade: aggiorna a una nuova release.
--install nome_pacchetto : installa il pacchetto specificato.
--remove nome_pacchetto : rimuove il pacchetto specificato.
--show nome_pacchetto : visualizza una descrizione del pacchetto specificato.
--search parola_chiave : cerca i pacchetti disponibili in base alla parola chiave.
--list: elenca i pacchetti disponibili.
--installed: elenca i pacchetti installati.
--clean: elimina i pacchetti temporanei.
--autoclean: cancella la cache dei pacchetti inesistenti nel sistema.
--version: stampa informazioni su versione e licenza.
Opzioni:
--download-only: si limita a scaricare i pacchetti invece di installarli o di aggiornarli.
--simulate | -s: mostra i pacchetti da installare o aggiornare.
--no-prompt | -y: non chiedere conferma durante l’installazione o aggiornamento.
--reinstall: reinstalla il pacchetto.
192 13. Aggiornare Slackware
13.4 Emerde
Emerde, scaricabile all’indirizzo http://emerde.freaknet.org, è un port del sistema Portage, specifico
di Gentoo GNU/Linux. Questo progetto è molto giovane, e pertanto si deve intendere come fortemente
in fase di sviluppo. Anch’esso gestisce in proprio il controllo delle dipendenze.
13.5 Slackupdate
Un altro strumento di aggiornamento è Slackupdate, che altro non è se non uno script scaricabile al-
l’indirizzo: http://128.173.184.249/slackupdate. Si tratta di un progetto in corso di sviluppo, attualmente
meno elastico e personalizzabile di quelli ci cui ci siamo occupati sopra.
starli in /etc e copiare in essi il contenuto dei vecchi e quindi per rinominare questi ultimi con estensione
.conf.bak si può usare uno script di questo tipo:
#!/bin/sh
cd /etc
find . -name "*.new" | while read configfile ; do
if [ ! "$configfile" = "./rc.d/rc.inet1.conf.new" \
-a ! "$configfile" = "./group.new" \
-a ! "$configfile" = "./passwd.new" \
-a ! "$configfile" = "./shadow.new" ]; then
cp -a $(echo $configfile | rev | cut -f 2- -d . | rev) \
$(echo $configfile | rev | cut -f 2- -d . | rev).bak 2> /dev/null
mv $configfile $(echo $configfile | rev | cut -f 2- -d . | rev)
fi
done
m) se stiamo aggiorna da una versione compresa fra la 10.0 e la 10.2, dobbiamo apportare una modifica
al file /etc/X11/xorg.conf trasformando il nome del driver della tastiera da Keyboard a kbd con un editor
qualsiasi. Se invece proveniamo da una versione ancora precedente (dotata di Xfree e non di Xorg), sarà
necessario riconfigurare il server X con l’utilità xorgconfig.
n) torniamo alla modalità multi-user col comando telinit 3.
o) rimuoviamo i pacchetti obsoleti. Essi possono essere verificati dalla directory /var/log/packages col
comando: cd /var/log/packages e quindi rimossi con removepkg.
p) rimuoviamo tutti i pacchetti delle lingue per KDE e per Koffice che non ci interessano, e che vero-
similmente saranno stati installati dal comando: upgradepkg --install-new. La soluzione più pratica
è spostarsi nella directory /var/log/packages col comando cd /var/log/packages e quindi rimuoverli
tutti col comando removepkg kde-i18n* koffice-i18n* per poi reinstallare eventualmente solo quelli
che ci interessano con installpkg.
Una particolare attenzione va prestata al fatto che, passando da una versione precedente a Slackware
11.0, il pacchetto devs non dev’essere aggiornato mentre udev è attivo. La procedura più sicura per effet-
tuare questo aggiornamento consiste nel rendere ineseguibile udev con chmod a-x /etc/ec.d/rc.udev,
riavviare il sistema e quindi effettuare l’aggiornamento. Se è impossibile riavviare, si possono invece
seguire i seguenti passaggi:
1) fermare udev con sh /etc/rc.d/rc.udev stop
2) smontare pts con umount /dev/pts
3) smontare shm con umount /dev/shm
4) installare i nuovi pacchetti di devs con installpkg devs*.tgz (o aggiornali con upgradepkg)
5) rilanciare udev con sh /etc/rc.d/rc.udev start
6) rimontare tutto il file system con mount -av
Fra i diversi metodi che possono essere adottati, uno è, come abbiamo visto sopra, servirsi di Swaret,
e poi aggiornando manualmente i pacchetti esclusi da ogni automatismo. Tuttavia può capitare che
l’aggiornamento non sia sempre perfetto.
Un sistema interamente «manuale», ma più sicuro, è scaricare i pacchetti della current (comodis-
simo in questo caso si rivela rsync) e procedere quindi, di directory in directory, all’aggiornamento
mediante upgradepkg. Poiché tuttavia sono presenti alcune modifiche, come i pacchetti ricompilati con
dipendenza diverse (ad esempio, nella current che ha preparato Slackware 11.0 Kmail richiedeva le
librerie Cyrus-sasl, che nella 10.2 non erano presenti), alcuni pacchetti nuovi andranno installati con
installpkg o con upgradepkg --install-new. Inoltre si dovranno aggiornare i file di configurazione,
come abbiamo visto sopra.
Per ottenere sempre le più aggirate versioni della current, un metodo assai comodo è fare ricorso
a rsync. Il protocollo rsync serve a effettuare in maniera molto efficiente aggiornamenti remoti: esso
trasferisce solo le differenze tra i due set di file, quello presente nel computer locale e quello remoto, e
di conseguenza automatizza e accelera fortemente la sincronizzazione su rete.
Ad esempio il comando: rsync -avz --delete --delete-after --progress \
rsync://rsync.slackware.at/slackware/slackware-current /archivio (dove /archivio è la directo-
ry locale che ospiterà i file scaricati e slackware.at il mirror prescelto) scarica i file nuovi della current da
slackware.at e, una volta terminato di scaricare, cancella i vecchi preesistenti, mostrando inoltre il pro-
gresso del download. Infatti l’opzione -v (= verbose) fornisce informazioni sul server e altro; l’opzione
-a (= archive mode) attua uno scaricamento ricorsivo di directory e subdirectory; l’opzione -z compri-
me i file durante il trasferimento accelerandolo; l’opzione --delete cancella i file locali che non esistono
nel server, ma con l’opzione aggiuntiva --delete-after li elimina solo dopo che è stato completato lo
scaricamento; l’opzione --progress mostra la percentuale scaricata e la velocità del download.
Molte altre funzioni di rsync possono essere consultate nella guida, col comando: rsync --help.
#!/bin/sh
mkisofs -o /tmp/slackware-install-dvd.iso \
-R -J -V "Slackware Install" -hide-rr-moved \
-v -d -N -no-emul-boot -boot-load-size 4 -boot-info-table \
-sort isolinux/iso.sort -b isolinux/isolinux.bin -c isolinux/isolinux.boot \
-A "Slackware Install DVD" .
Si potrà quindi procedere alla masterizzazione con un frontend come K3B oppure, da console, con:
growisofs -Z /dev/nome_dispositivo =/tmp/slackware-install-dvd.iso -dvd-compat -speed=4.
In tal modo ci si troverà in grado di effettuare un’installazione completa e diretta della current.
Capitolo 14
Connettività e reti
La costruzione e la gestione di una rete è operazione delicata e assai complessa: non è questa la
sede per occuparcene. Di conseguenza, dopo alcune nozioni in prevalenza teoriche, prenderemo in
esame in forma sintetica alcune configurazioni e alcuni comandi utili essenzialmente alla connettività.
Prescinderemo invece del tutto dall’analisi di server http, ftp e di posta elettronica.
195
196 14. Connettività e reti
14.1.4 L’indirizzo IP
L’indirizzo IP serve a identificare un host all’interno della rete TCP/IP. Fino alla metà degli anni No-
vanta, gli indirizzi sono stati attribuiti secondo il modello fornito da IANA (acronimo di Internet Assi-
gned Numbers Authority) e consultabile in Internet all’indirizzo: http://www.iana.org/assignments/port-
numbers, anche se alle assegnazioni effettive erano preposti alcuni organismi distribuiti secondo macro-
aree geografiche. Attualmente, questo compito è svolto dall’Internet Corporation for Assigned Names
and Numbers (ICANN). Tutti gli indirizzi dovevano appartenere a una determinata classe di reti (classe
A, B o C), da cui il nome «classfull» attribuito a questo schema.
Dal 1993 si è affermato un altro schema di indirizzamento, svincolato dal concetto di classe di reti,
da cui il nome di «classless», che adotta la notazione CIDR (acronimo di «Classless Inter-Domain Rou-
ting»); esso appare maggiormente elastico e in grado di migliorare le prestazioni dell’instradamento IP
grazie a una più efficiente organizzazione delle tabelle di routing. Anche in questo caso vi è uno schema
mondiale per la distribuzione degli indirizzi, gestito in Europa dal Network Coordination Center (NIC)
14.1. Che cosa sono le reti 197
del Reseaux IP Europeens (RIPE), sebbene si scontrino in questi caso due diversi criteri: allocazione su
base di fornitore o allocazione su base geografica.
In base al protocollo ipv4, ogni indirizzo IP è composto da 32 bit, suddivisi in quattro gruppi da 8 bit
ciascuno. La prima parte serve a identificare la rete, la seconda parte l’host all’interno della rete.
Poiché vi sono reti di dimensioni diverse, gli indirizzi IP sono classificati in cinque classi, indicate
con le lettere da A a E.
La classe A di reti ha gli indirizzi col primo bit impostato a 0 e la sua maschera di rete è 255.0.0.0.
Ne fanno parte gli indirizzi che vanno da 1.0.0.0 a 127.255.255.255, che pertanto individuano 128 reti da
16.777.214 indirizzi ciascuna.
La classe B di reti ha gli indirizzi col primo bit impostato a 0 e il secondo bit impostato a 1 e la sua
maschera di rete è 255.255.0.0. Ne fanno parte gli indirizzi che vanno da 128.0.0.0 a 191.255.255.255, che
pertanto individuano 16.384 reti da 65.534 indirizzi ciascuna.
La classe C di reti ha gli indirizzi col primo e il secondo bit impostati a 1 e il terzo bit impostato a 0 e la
sua maschera di rete è 255.255.255.0. Ne fanno parte gli indirizzi che vanno da 192.0.0.0 a 223.255.255.255,
che pertanto individuano 2.097.152 reti da 256 indirizzi ciascuna.
La classe D di reti ha gli indirizzi coi primi tre bit impostati a 1 e il quarto bit impostato a 0. Ne
fanno parte gli indirizzi che vanno da 224.x.x.x a 239.x.x.x. La classe E di reti ha gli indirizzi coi primi
quattro bit impostati a 1 e il quinto bit impostato a 0. Ne fanno parte gli indirizzi che vanno da 240.x.x.x
a 247.x.x.x. Tali ultime due classi vengono utilizzate per scopi particolari. Gli indirizzi di classe D non
identificano né la rete né l’host, bensì un indirizzo multicast: sono infatti utilizzati per le trasmissioni
in multicast, dove un solo host trasmette e alcuni altri (quelli facenti parte del gruppo di destinazione)
ricevono. Gli indirizzi di classe E sono invece destinati a un utilizzo futuro.
Valori Uso
da 1.0.0.0 a 9.255.255.255 Blocchi di classe A
10.*.*.* Reti private interne
da 11.0.0.0 a 126.255.255.255 Blocchi di classe A
127.*.*.* Loopback
da 128.0.0.0 a 172.15.255.255 Blocchi di classe B
da 172.16.0.0 a 172.31.255.255 Reti private interne
da 172.32.0.0 a 191.255.255.255 Blocchi di classe B
da 192.0.0.0 a 192.0.255.255 Riservati
da 192.1.0.0 a 192.167.255.255 Blocchi di classe C
da 192.168.0.0 a 192.168.255.255 Reti private interne
da 192.169.0.0 a 223.255.255.255 Blocchi di classe C
da 224.0.0.0 a 255.255.255.255 Riservati per classi speciali
Questi numeri non sono affatto casuali. L’indirizzo IP si può vedere come una sequenza binaria a 32
bit, esprimibile in notazione decimale come composta da quattro ottetti, ciascuno dei quali a sua volta
può assumere un valore fra 0 e 255. Negli indirizzi delle reti di classe A, per definire la segmentazione
possibile in reti si utilizza il primo ottetto, il cui valore è compreso fra 1 e 126. Dal momento che il primo
bit è impostato a 0, è infatti possibile utilizzare solo i 7 successivi. Abbiamo così 27 valori possibili, e
cioè 128. Ma poiché il valore 0 deve esprimere la rete locale e il valore 127 identifica l’interfaccia di
loopback, restano 126 identificativi che possono essere attribuiti alla rete. Gli altri tre ottetti identificano
gli host possibili, e cioè 16.777.214 indirizzi o host per ogni sottorete. Del tutto analogo, mutatis mutandis,
il calcolo per gli altri tipi di rete.
198 14. Connettività e reti
La scelta della rete da costruire obbedisce a ragioni di opportunità facilmente comprensibili: una
grande azienda opterà per una rete di classe B, in modo da attribuire una specifica sottorete a ogni sua
divisione, mentre una rete domestica formata da pochi computer troverà la sua conformazione ideale in
una rete di classe C.
Il subnetting
Lo schema di indirizzamento classfull è ormai obsoleto e scarsamente rispondente alle esigenze con-
seguenti all’impetuosa crescita di Internet. Si è infatti affermata la necessità, per molti utenti della rete,
di disporre di un numero di indirizzi IP da assegnare alle interfacce di rete superiore a quello gestibile
con una rete di classe C (che sono solo 254), ma nettamente inferiore a quello possibile in una rete di
classe B (ben 65534). Di consueto, tali utenti si facevano assegnare una rete di classe B, con la conseguen-
za che molti degli indirizzi possibili rimanevano inutilizzati e in più diminuiva la disponibilità di reti
di questo tipo. Inoltre, le tabelle di instradamento dei router delle cosiddette backbones (le linee princi-
pali di Internet), contenendo un numero enorme di indirizzi, erano diventate ipertrofiche e difficili da
mantenere.
Una prima soluzione a questo problema è rappresentata dal subnetting. Il subnetting implica che lo
spazio di indirizzamento associato a un indirizzo di una certa classe (indipendentemente dal tipo A, B
o C) sia ulteriormente suddiviso in un certo numero di sottoreti. Però, per poter conoscere quale sia la
porzione di netid e quella di hostid, è necessario usare maschere di rete più lunghe di quelle associate ai
tradizionali indirizzi di classe A, B o C. Inoltre, all’interno di una rete le netmask devono sempre essere
indicate esplicitamente, mentre è superfluo all’esterno delle reti si cui è stato praticato il subnetting:
infatti, esso influenza il modo in cui è usato lo spazio all’interno di una rete, ma lascia inalterato il modo
in cui la rete nel suo insieme viene vista dall’esterno.
Ciò comporta una notevole economia perché, assegnato a un utente un solo indirizzo di classe B, vi
si possono creare 128 sottoreti diverse, ciascuna con la capacità di ospitare 510 host. Naturalmente, si
potrebbero creare sottoreti in numero minore, ciascuna però con un maggior numero di host.
Identificativo: 194.24.0.0/21
Supernet mask: 255.255.248.0
Indirizzi: 194.24.0.1 - 194.24.7.254
Broadcast: 194.24.7.255
Naturalmente, si richiede un adeguato supporto da parte dei protocolli di routing. L’ultima versione
del protocollo BGP, detta BGP-4, supporta il concetto di «supernetting». Per la stessa ragione, sono state
apportate delle modifiche anche al firmware dei router.
14.1. Che cosa sono le reti 199
Poiché spariscono le netmask implicite, ogni indirizzo andrà accompagnato sempre e in maniera
esplicita dall’indicazione della netmask. Quest’ultima non viene più indicata con la cosiddetta notazione
«dotted decimal» (come 255.255.255.0), ma con la notazione «slash», postposta all’indirizzo IP (come
/23), che rappresenta l’ampiezza della stessa espressa nel numero dei bit impostati a 1. In questo modo
è possibile, ad esempio, creare una rete con 510 indirizzi (29-2), semplicemente scegliendo il prefisso 23.
Contemporaneamente si riducono le routing table, perché le reti che prima erano formate da più reti di
classe C, possono essere realizzate con un’unica rete con prefisso minore di 24, in modo da utilizzare un
solo riferimento (un unico record) nelle routing table.
Il CIDR – in ciò consiste la sua novità – utilizza maschere di rete di lunghezza arbitraria, mentre
l’indirizzamento secondo classi ammetteva tre sole lunghezze della maschera di sottorete (e cioè /8, /16
e /24). Sebbene la maschera di rete di classe C (/27) sia ancora molto utilizzata, attualmente si adottano
anche maschere più corte per reti grandi (/23 o /22) e più lunghe per reti piccole (da /25 fino a /39
per reti punto-punto). Con questa netmask si indica quali dei bit che la compongono vanno considerati
come indicativi del net id e quali dell’host id, cioè quale segmento indichi la rete e quale gli host. La nota-
zione usata per esprimere indirizzi CIDR è la seguente: a.b.c.d/x, dove x è il net-prefix, cioè il numero
di bit (contati partendo da sinistra) che compongono la parte di indirizzo della rete. I rimanenti bit (32-
x) indicano gli host. Il principale vantaggio di questo meccanismo rispetto al precedente consiste nella
maggiore flessibilità: con esso non si è obbligati a dedicare alla parte di rete multipli di 8 bit, ma sem-
plicemente il numero di bit più adatto alla situazione che dobbiamo gestire. Ad esempio, se vogliamo
che una rete sia costituita dal blocco di indirizzi che va da 220.16.128.0 a 220.16.255.255, allora la nota-
zione CIDR che la rappresenta sarà: 220.16.128.0/17. Allo stesso modo, l’indirizzo IP 192.168.58.147
con netmask 255.255.240.0 può essere scritto 192.168.58.147/255.255.240.0, ma anche, con la nuova
notazione, 192.168.58.147/20, mentre l’indirizzo tradizionale 192.168.0.0/255.255.255.0 risulterà
192.168.0.0/24. In pratica, gli indirizzi IP sono scritti postponendo all’indirizzo vero e proprio o la
relativa subnet mask (come nel primo caso), oppure il relativo net prefix (come nel secondo caso).
Entrambe le tipologie di indirizzo IP, pubblico e privato, possono essere a loro volta dinamiche o
statiche. Gli indirizzi IP pubblici sono in genere dinamici, cioè cambiano a ogni connessione. In alcuni
casi, gli ISP assegnano IP statici, tali cioè da non variare a ogni connessione, ma da rimanere immutati:
questi IP vengono in genere offerti come servizio a pagamento e sono richiesti nel caso in cui si debba
offrire un servizio Internet, ad esempio per una macchina su cui è installato un server web.
DNS implica che si effettui una chiamata o a Internet o a un server via Intranet, alla quale chiamata biso-
gna poi attendere la risposta contenente l’indirizzo IP risolto. Fra gli svantaggi annoveriamo innanzitut-
to il fatto che il file /etc/hosts è statico, per cui, se cambia l’indirizzo IP di un host, esso dev’essere ogni
volta aggiornato, e quindi la circostanza per cui tale file non consente di applicare impostazioni DNS
avanzate, come i campi MX (il record «Mail eXchange» atto alla trasmissione della posta elettronica) o
PTR (il record «PoinTeR» utile per il lookup inverso).
La risoluzione dinamica si effettua mediante una chiamata al DNS cui si comunica l’indirizzo (in
forma di nome) a cui ci si intende connettere. Il server risponde inviando la traduzione in forma nume-
rica, cioè l’indirizzo IP, e di conseguenza ora l’host può finalmente connettersi. Per non incorrere in un
circolo vizioso, è necessario conoscere preliminarmente l’indirizzo del server DNS in forma numerica:
ecco perché i provider forniscono l’IP dei server DNS che mettono a disposizione. Questi indirizzi sono
contenuti nel file /etc/resolv.conf.
I tre numeri all’inizio di ogni riga identificano i dispositivi fornendo nell’ordine bus, slot e funzione.
A questo punto possiamo affinare la ricerca di informazioni su una singola scheda, col comando: lspci
-vvs 03:00.0 (dove l’opzione -vv predispone alla massima informatività e -s consente di specificare
un determinato dispositivo). Si otterrà così il seguente output:
Molti di questi dati sono comunque superflui per la semplice configurazione del dispositivo.
Un classico metodo per attribuire l’indirizzo IP a una scheda è ricorrere a ifconfig. Se lanciato
senza opzioni, ifconfig mostra le schede già configurate. Se l’indirizzo non è stato attribuito, ifconfig
mostra comunque che esiste per l’host un indirizzo virtuale assegnato dal sistema, e cioè l’indirizzo di
loopback:
Se lanciato con l’opzione -a, ifconfig mostra anche le schede non ancora configurate. In questo
caso, l’output sarà:
root@darkstar:~# ifconfig -a
eth0 Link encap:Ethernet HWaddr 00:0F:EA:7A:29:16
UP BROADCAST MULTICAST MTU:1500 Metric:1
14.2. I dispositivi di rete 203
Per attribuire l’indirizzo IP, va dato ifconfig seguito dall’indirizzo stesso ed eventualmente dall’op-
zione up per attivare immediatamente la scheda, ad esempio ifconfig eth0 192.168.0.2 up. Inoltre,
se si usa la notazione CIDR e la maschera e il broadcast address non corrispondono a quella stabilita dal
sistema classfull, bisogna specificarli utilizzando rispettivamente l’opzione netmask e broadcast. Dopo
questa operazione, si vedrà come ifconfig fornisce anche l’indirizzo IP appena attribuito:
Questo comando consente inoltre una precisa ispezione del funzionamento delle interfacce di rete.
Se infatti leggessimo fra l’altro, a proposito di eth0:
sapremmo quanti pacchetti sono stati inviati e quanti ricevuti, e quanti MB sono passati in trasmissione
e in ricezione.
204 14. Connettività e reti
Questa impostazione da console non è tuttavia persistente: va infatti persa allo spegnimento del si-
stema. Per far sì che essa diventi permanente si ricorre a un file di configurazione: /etc/rc.d/rc.inet1.conf.
Durante il processo di inizializzazione di Slackware, lo script /etc/rc.d/rc.M richiama fra l’altro lo
script /etc/rc.d/rc.inet1 e quindi, dopo hotplug che ha il compito di rilevare l’hardware e dunque anche
le varie interfacce di rete, /etc/rc.d/rc.inet2. Lo script /etc/rc.d/rc.inet2 si occupa successivamente di av-
viare tutti i processi di rete: il servizio NFS, Samba, eventuali firewall, il supporto al protocollo ipv6, il
server inetd per la gestione delle interfacce di rete, il demone ssh, il demone per BIND, il servizio NIS
e, a sua volta, invoca il demone inetd. Più in dettaglio, il file /etc/rc.d/rc.inet1.conf viene letto durante
l’inizializzazione del sistema a seguito dei comandi impartiti dallo script /etc/rc.d/rc.inet1.
Quest’ultimo imposta le interfacce in base alle informazioni lette appunto in /etc/rc.d/rc.inet1.conf
ed eventualmente attiva l’interfaccia di loopback; quindi attiva le funzioni delle varie interfacce, veri-
ficando se deve ricorrere al kernel o ai moduli; infine attiva le funzioni di gateway, se necessario. Nel
file /etc/rc.d/rc.inet1.conf troviamo la configurazione delle varie interfacce di rete: l’indirizzo IP se stati-
co, il ricorso a DHCP se dinamico (in questo caso, le impostazioni DHCP sovrascrivono qualsiasi altra
impostazione). Le varie interfacce che corrispondono alle schede di rete, se non precisato altrimenti,
vengono chiamate eth, e dunque eth0 la prima, eth1 la seconda e così via, fino a un massimo di sei; tale
numero può essere però aumentato a piacere, se il computer – caso peraltro assai strano – ne presentasse
più di sei. Se c’è l’esigenza di modificare tale nome, si ricorre al campo IFNAME. Se si intende ricorrere
all’attribuzione dinamica degli indirizzi, la voce USE\_DHCP[0]="" dev’essere impostata a yes:
Tutte queste operazioni di configurazioni possono essere svolte in modo facile e celere, senza mettere
mano direttamente ai file di configurazione, grazie all’utilità netconfig.
14.2. I dispositivi di rete 205
e un DOMAIN NAME a piacere (per ovvi motivi, è vivamente sconsigliato scegliere il nome di un do-
minio esistente; a parte la remota possibilità di conseguenze legali, potrebbe essere difficile risolvere
l’indirizzo di quel dominio). Di conseguenza è conveniente optare per un nome come «mydomain.org»;
ciò appare tuttavia vagamente insensato se in realtà non si possiede un dominio; una scelta opportu-
na potrebbe essere allora qualcosa come «localdomain». Hostname e domainname identificheranno il
computer:
I nomi attribuiti possono essere cambiati con facilità. Il nome dell’host si può riassegnare col coman-
do: hostname nuovo_nome . L’indirizzo completo (host e dominio) sono registrati in /etc/HOSTNAME.
Va quindi inserito l’indirizzo IP. Il programma di installazione offre tre alternative: static IP (se pos-
sediamo una scheda di rete e decidiamo di attribuirvi un indirizzo IP fisso), DHCP (se l’IP ci viene
assegnato in automatico da un server), loopback, se il computer non ha una scheda di rete:
206 14. Connettività e reti
Va ora fornito l’indirizzo della nostra scheda di rete, qualcosa come 192.168.0.2:
È ora la volta della netmask, che di default per le reti di classe C è 255.255.255.0:
e attribuiamo il nome a questo name server, che sarà ancora una volta l’indirizzo IP del router, e cioè
192.168.0.1:
Essi vengono scritti nel file nel file /etc/rc.d/rc.inet1.conf. Un limite di netconfig è che tale script, per
la sua semplicità, configura una e una sola interfaccia di rete. Se il computer fosse dotato di due schede
di rete, la seconda andrebbe perciò configurata mettendo mano ai file di configurazione con un editor.
root@darkstar:~# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo
0.0.0.0 192.168.0.1 0.0.0.0 UG 1 0 0 eth0
Flags = U indica che la route è attiva («up»); H indica un host come target; G indica un gateway come
target; R indica in instradamento reintegrato perché gestito in maniera dinamica; D indica in instrada-
mento configurato da un demone (o rediretto); M indica un instradamento modificato da un demone (o
da una redirezione); I indica un instradamento impedito.
Metric = indica la distanza dalla destinazione, misurata in hop. Gli hop sono gli host da attraversare
per giungere alla destinazione.
Ref = numero di riferimento alla regola di instradamento. Viene usato dal kernel.
Use = numero di volte che la regole è stata presa in considerazione.
I(nter)face = nome dell’interfaccia usata per l’instradamento. Qui abbiamo due schede di rete, eth0
ed eth1.
Nella prima riga del nostro esempio, essendo la rete 192.168.0.0 direttamente connessa all’host in
questione, le informazioni destinate a qualche altro nodo di quella rete possono essere inviate diretta-
mente al nodo stesso, come si evince dal fatto che il gateway è 0.0.0.0.
Nell’ultima riga la rete di destinazione è caratterizzata dall’indirizzo 0.0.0.0, il che significa che la
regola di instradamento vale per qualsiasi rete di destinazione che non sia stata esplicitamente definita
altrimenti in precedenza. Ovviamente, in questo caso bisogna segnalare un gateway o un’interfaccia che
si fa carico di inviare tutti i pacchetti non destinati per le rotte direttamente connesse. Ecco perché il
secondo campo fornisce l’indirizzo del router (qui 192.168.0.1), che dev’essere raggiungibile (nel nostro
esempio lo è perché si tratta di un nodo della rete 192.168.0.0/24, che è direttamente connessa). Non a
caso, il flag non è soltanto U (che sta a indicare che il percorso è attivo), ma anche G (che identifica un
gateway). Anche la maschera di rete resta indefinita in quanto ininfluente.
Per definire un instradamento nuovo si usa il comando route con l’opzione add e quindi -net se
la destinazione (target) è una rete, oppure -host se la destinazione è, appunto, un host. Ad esempio,
il comando: route add -net 192.168.100.0 netmask 255.255.255.0 eth0 definisce l’instradamento
per l’interfaccia eth0 attraverso la rete 192.168.0.x. Per aggiungere l’instradamento predefinito per eth0
via gateway il comando sarà: route add default gw 192.168.255.0 eth0.
Infine, per azzerare la tabella di reinstradamento, ripristinando quella gestita direttamente dal ker-
nel, si usa il comando route con l’opzione del seguita dal numero della rete da eliminare, ad esempio:
route del 192.168.100.0.
il server DHCP, che identifica da un lato il computer che assegna gli indirizzi IP, e dall’altro anche il
processo che svolge questa funzione
il DHCP relay, ossia il computer (o il router) che si occupa di inoltrare le richieste DHCP a un server,
qualora questo non sia sulla stessa sottorete. Questo componente è necessario solo se un server DHCP
deve servire innumerevoli sottoreti. Deve esistere almeno un DHCP relay per ciascuna sottorete servita
e ogni relay dev’essere esplicitamente configurato per inoltrare le richieste a uno o più server.
DHCP utilizza il protocollo UDP; le porte registrate sono la 67 per il server e la 68 per il client.
Quando un computer vuole ottenere un indirizzo tramite DHCP, attiva il processo DHCP client. In
questo momento, esso non possiede un indirizzo IP valido, e di conseguenza non può usare tutte le
funzionalità della rete.
Quindi esso invia un pacchetto chiamato DHCPDISCOVER in broadcast nella sottorete, con indiriz-
zo IP sorgente impostato convenzionalmente a 0.0.0.0 (che significa in pratica un indirizzo qualsiasi),
e con destinazione 255.255.255.255. Tutti i server DHCP attivi nella sottorete ricevono questo pacchetto
e possono rispondere (o meno) con un pacchetto di DHCPOFFER, in cui assegnano un indirizzo IP al
client. Il pacchetto è indirizzato direttamente all’indirizzo di livello livello datalink del client (che
non ha ancora un indirizzo IP), per cui può essere inviato solo da un server che si trovi sulla stessa
sottorete.
Se nella sottorete ci sono più DHCP relay, questi inoltrano il pacchetto al loro server di riferimento,
che può rispondere allo stesso modo attraverso il relay. Il relay agent informa il server della sottorete da
cui ha ricevuto il pacchetto di DHCPDISCOVER, permettendo al server di offrire un indirizzo per una
sottorete valida.
Il client attende un certo tempo per ricevere una o più offerte, dopo di che ne seleziona una e invia un
pacchetto di DHCPREQUEST al server che ha scelto. Questo gli conferma l’assegnazione dell’indirizzo
con un pacchetto di DHCPACK.
A questo punto, il client è autorizzato a usare l’indirizzo ricevuto per un tempo limitato, detto «tem-
po di lease». Esiste un tempo di lease predefinito (ventiquattr’ore) che può essere modificato a piacere
dall’amministratore del server DHCP. Prima della scadenza, il client dovrà tentare di rinnovarlo invian-
do un nuovo pacchetto DHCPREQUEST al server che, se intende prolungare l’assegnazione dell’indi-
rizzo, gli risponderà con un nuovo DHCPACK. Se il client non riesce a rinnovare l’indirizzo, tornerà allo
stato iniziale cercando di farsene attribuire uno nuovo.
Il client si identifica nei confronti del server mediante un campo client-id dei pacchetti DHCP, che
di solito ha come valore il MAC address della scheda di rete per cui si richiede l’indirizzo (ma che po-
trebbe anche essere configurato manualmente). Ciò implica una falla nella sicurezza, perché tale dato,
inviato in broadcast nella sottorete, può essere facilmente sniffato da qualunque altro calcolatore connes-
so alla sottorete. Vi sono dei sistemi più avanzati di sicurezza per controllare l’accesso alla rete, che però
richiedono un supporto da parte degli switch a cui sono collegati gli host (come il progetto IEEE802.1x,
volto a definire gli standard per l’architettura delle LAN). Il server può utilizzare il campo client-id
per decidere se rispondere al client, quale indirizzo assegnargli e quali altri parametri eventualmente
passargli.
14.2. I dispositivi di rete 211
Se ai client di una sottorete gli indirizzi IP devono essere assegnati in forma dinamica, all’interno
della dichiarazione di sottorete non deve mancare la dichiarazione dell’intervallo di indirizzi. Per i client
212 14. Connettività e reti
a cui va assegnato un indirizzo IP in forma statica, dev’esserci una dichiarazione distinta per ogni host.
Quando dhcpd trova una dichiarazione per un client, prima verifica se gli è stato attribuito un indirizzo
fisso e, se non lo trova, passa alla dichiarazione che serve ad attribuire dinamicamente gli indirizzi.
I parametri globali vengono passati all’inizio del file; potrebbe trattarsi del nome di dominio dell’or-
ganizzazione, dell’indirizzo dei DNS ecc., ad esempio:
Si possono fornire sempre e solo indirizzi dinamici a tutti gli host, oppure, per immaginare uno degli
infiniti scenari possibili (ma prossimo a un utilizzo all’interno di una piccola rete privata), si potrebbe
ipotizzare di scegliere l’attribuzione fissa degli indirizzi per le periferiche di rete stabili, e dinamica per
delle periferiche che vengono rimosse spesso, oppure che si connettono solo occasionalmente al server,
come dei computer portatili (si tratta del cosiddetto «indirizzamento misto»).
Nel primo caso il file /etc/dhcpd.conf avrà una struttura estremamente semplice, ad esempio:
In questo modo, ai computer che fanno richiesta di configurazione di rete verrà attribuito un dominio
valido e forniti al tempo stesso gli IP di alcuni DNS (prime due righe). L’assegnazione fin qui effettua-
ta potrebbe però portare a uno spreco di risorse se alcuni dei computer connessi fossero dei portatili,
soggetti perciò spesso a essere disconnessi dal sistema, in quanto gli IP attribuiti resterebbero assegnati,
ancorché inutilizzati. A ciò si ovvia istituendo un tempo predefinito (espresso in secondi) dopo il quale
l’assegnazione scade e dev’essere rinnovata, e un tempo massimo dopo il quale essa non può più essere
14.3. File di configurazione della rete 213
rinnovata (terza e quarta riga). Di default, le assegnazioni valgono per un giorno, dopo di che quell’indi-
rizzo non può più essere attribuito allo stesso host; viene conservata notizia delle attribuzioni effettuate
in /var/state/dhcp/dhcpd.leases, file che dhcpd legge dopo /etc/dhcpd.conf.
È anche possibile formare dei blocchi di configurazione differenziati per effettuare nei confronti di
utenti diversi assegnazioni con valori temporali diversi, ricorrendo al logger di sistema (quinta riga).
Per indirizzare i file di log del server verso uno specifico file bisogna aggiungere nel file /etc/syslog.conf
una riga quale:
local7.debug /var/log/dhcpd.log
Qui però prescindiamo da questa più complessa configurazione. Ampie spiegazioni e alcuni esempi
sono reperibili alla pagina man di dhcpd.conf.
La stringa authoritative (sesta riga) serve se e solo se nella stessa rete sono presenti più server
DHCP, perché, nel caso in cui un client richieda un indirizzo IP non adatto per la sua sottorete, il DHCP
server possa avere l’autorità per negarli la richiesta.
Il blocco di configurazione successivo (dalla settima all’undicesima riga) gestisce l’assegnazione de-
gli IP ai computer connessi. La prima stringa definisce l’indirizzo della rete relativamente alla quale
sono forniti gli indirizzi IP e la relativa submask. La scelta degli indirizzi è del tutto opzionale; l’uni-
co elemento imprescindibile è che sussista coerenza fra l’indirizzo della rete, la netmask e gli indirizzi
dei singoli host. Le parentesi graffe definiscono le istruzioni atte ad attribuire in dettaglio gli IP ai vari
host: essi saranno compresi negli intervalli (1textitrange) indicati, mentre gli IP compresi nell’intervallo
da .101 a .149, che non sono indicati, non verranno assegnati e resteranno disponibili per assegnazioni
statiche. Anche in questo caso le scelte sono largamente opzionali, fatto salvo che non dovranno essere
assegnati gli indirizzi .0 (riservato all’indirizzo della rete), .255 (riservato all’IP di broadcast) e .1 (qui
associato al router).
Stabilito in tal modo come attribuire gli indirizzi dinamici, vediamo adesso come attribuire quegli
statici. Il meccanismo si basa sul riconoscimento di un dato inalterabile come l’indirizzo MAC della
scheda di rete e quindi sull’attribuzione a questo indirizzo di un indirizzo IP. Quando al server DHCP
arriva una richiesta di attribuzione da parte di un dispositivo con tale indirizzo MAC, esso risponderà
attribuendogli l’IP predeterminato alla voce fixed-address.
Questa configurazione di base e molto semplice può essere raffinata definendo un comportamento
specifico per più blocchi, ai quali si possono attribuire in aggiunta delle regole in contrasto con quelle
definite nei criteri generali.
principali, quelli che (essendo semplici file di testo e non binari) possono essere modificati a seconda
delle esigenze.
Molte impostazioni, anzi in genere tutte quelle che servono per navigare con un modem o con un
router, vengono applicate con facilità con gli strumenti di configurazione che vedremo oltre, ma è co-
munque importante conoscere il ruolo, il contenuto e la sintassi di questi file, perché a volte è necessario
mettervi mano direttamente.
# For loopbacking.
127.0.0.1 localhost
192.168.0.2 darkstar.localdomain darkstar
# End of hosts.
dove vengono indicati soltanto l’indirizzo di loopback e l’IP della scheda di rete del sistema, col suo
nome e il suo alias. Un esempio appena più complesso potrebbe essere:
# For loopbacking.
127.0.0.1 localhost
192.168.100.102 server01.mynetwork mynetwork
192.168.0.1 pc01.mynetwork pc01
192.168.1.2 pc02.mynetwork pc02
192.168.100.254 gateway.mynetwork gateway
# End of hosts.
Qui abbiamo a che fare con una LAN composta da un server e due client. Sarà così possibile rife-
rirsi ai vari computer, nei file di configurazione, mediante il nome e, ancor più brevemente, con l’alias,
anziché mediante l’indirizzo IP.
domain localhost
nameserver 212.216.112.222
14.3. File di configurazione della rete 215
nameserver 212.245.255.2
search inwind.it
search tin.it
Nel nostro esempio, la voce domain localhost indica il dominio predefinito nel quale vengono
condotte le interrogazioni; di conseguenza, se venisse indicato un nome di host privo di dominio, gli
verrebbe attribuito quello qui specificato.
Le voci nameserver 212.216.112.222 e nameserver 212.245.255.2 precisano un determinato IP
come indirizzo di un DNS. Esse vengono interrogate nell’ordine in cui sono scritte, nel caso il dominio
predefinito non risponda. Ovviamente, se nessun server risponde si avrà il fallimento del processo di
risoluzione e la conseguente impossibilità di navigare in Internet.
Infine, le voci search inwind.it e search tin.it servono per creare dei nomi di dominio predefi-
nito alternativi e complementari a quello indicato alla prima voce.
basandosi sul protocollo MIME (che gestisce gli allegati), oppure ancora nel modificare un IP non valido
per accedere a un sistema in uno che invece è autorizzato. A noi qui interessa però solo quest’ultimo
caso, l’IP spoofing, di cui si riconoscono tre differenti tecniche: l’IP spoofing non cieco, l’IP spoofing
cieco e di tipo DOS.
Nell’IP spoofing non cieco colui che effettua l’attacco cerca di camuffarsi come un host appartenente
alla sottorete dell’attaccato: quindi i pacchetti destinati all’host risulteranno visibili anche a lui. Questa
tecnica è però realizzabile solo se l’attaccante conosce determinati parametri dei pacchetti (o meglio, de-
gli header dei pacchetti in transito: il sequencer number e l’acknowledgement number). Nello spoofing
cieco invece l’attaccante deve cercare di indovinare il sequencer number dei pacchetti per continuare
la connessione e l’intercettazione dei dati. Infine, gli attacchi di tipo DOS (acronimo di «Denial of Ser-
vice») sono volti a bloccare un determinato host, impedendogli di svolgere le sue normali attività e di
conseguenza impedendo agli utenti di poter fare accesso ai servizi che tale host era destinato a effettuare.
I valori possibili della funzione nospoof sono on e off.
spoofalert: notifica o meno al log di sistema le eventuali verifiche fallite. I valori possibili sono on e
off.
spoof: gestisce le funzionalità di spoof. I valori possibili sono off, nowarn e warn. Il valore off autorizza
gli indirizzi «spoofed» senza notificare alcunché. Il valore nowarn impedisce la traduzione degli indirizzi
«spoofed» senza notificare alcunché. Il valore warn impedisce la traduzione degli indirizzi «spoofed»
abilitando al contempo la notifica via syslog.
reorder: ordina i valori in modo che gli indirizzi locali e di rete locale siano letti per primi. I valori
possibili sono on e off.
Nella formulazione delle regole sono ammessi anche dei caratteri jolly come il punto (.), che posto al-
l’inizio di una stringa indica tutti i membri dell’insieme specificato: ad esempio, la stringa .domain.com
vale sia per system1.domain.com sia per system2.domain.com.
I servizi non precisati in alcuna regola di questi due file sono consentiti a tutti. Le regole presenti in
/etc/hosts.allow hanno la precedenza su quelle specificate in /etc/hosts.deny, tanto che se in /etc/hosts.deny
è contenuta una regola che vieta l’accesso a un servizio, gli host a cui è stata data l’autorizzazione
in /etc/hosts.allow possono comunque accedervi. Le regole specificate hanno effetto dal basso verso
l’alto, per cui è rilevante l’ordine in cui sono posizionate. Le modifiche apportate ai file hanno effetto
immediato e non è necessario riavviare i servizi.
Per gestire al meglio il controllo dell’accesso, /etc/hosts.allow e /etc/hosts.deny vengono usati insie-
me. Di norma, si vieta tutto a tutti in /etc/hosts.deny con ALL e si conferiscono le autorizzazioni specifiche
in /etc/hosts.allow. Un esempio di accoppiata potrebbe essere:
/etc/hosts.deny
ALL: ALL
/etc/hosts.allow
Infine, si può ricorrere all’operatore EXCEPT, che consente di associare elenchi separati alla stessa
regola. Quando EXCEPT viene usato fra due elenchi, ha effetto il primo a meno che una voce del secondo
non corrisponda a un’entità del primo elenco. EXCEPT può essere usato sia con demoni sia con client.
Potremmo allora avere un caso di /etc/hosts.allow come quello che segue:
localdomain 127.0.0.0
mynetwork 192.168.100.0
significano che il protocollo http, quello che serve a raggiungere Internet, è operativo sulla porta 80;
bloccare questa porta ha come conseguenza l’impossibilità di navigare nel web.
Solo in rarissimi casi Slackware ha una politica diversa da quella di altre distribuzioni GNU/Linux
(abbiamo visto il caso della condivisione di uno scanner), ma per lo più e generalmente ha impostazioni
tali per cui tutti i protocolli per la navigazione (http, ftp, telnet ecc.) e per la gestione della posta elet-
tronica (pop3, smtp ecc.) sono preimpostati in modo di consentire l’uso di questi servizi senza mettere
mano al file.
L’operazione si stoppa col comando Ctrl+C, poiché per impostazione predefinita ping invia infiniti
pacchetti; è però possibile specificare il numero dei pacchetti, le loro dimensioni e l’intervallo di tempo
fra una richiesta e l’altra (di default, un secondo). È naturalmente possibile verificare con ping anche un
host situato all’interno di una rete locale.
Il fatto che il comando fallisca dando un output come:
può essere dovuto a innumerevoli ragioni, non necessariamente a un’erronea configurazione del dispo-
sitivo di rete o della tabella di instradamento: esso può dipendere dalla momentanea indisponibilità
dell’host target, oppure dal fatto che esso è configurato in modo da non rispondere alle richieste di ping.
Nel secondo esempio si segue la procedura opposta: viene inserito un indirizzo IP e l’output ne
fornisce il nome.
14.4. Comandi per la configurazione della rete 221
L’opzione più utile è -a (all), che indica di compiere una ricerca generale (cioè di tipo ANY).
;; QUESTION SECTION:
;www.slackware.com. IN ANY
;; ANSWER SECTION:
www.slackware.com. 75867 IN CNAME slackware.com.
;; AUTHORITY SECTION:
slackware.com. 75867 IN NS ns2.cwo.com.
slackware.com. 75867 IN NS ns1.cwo.com.
;; QUESTION SECTION:
;www.slackware.com. IN A
;; ANSWER SECTION:
www.slackware.com. 86400 IN CNAME slackware.com.
slackware.com. 86400 IN A 64.57.102.34
222 14. Connettività e reti
;; AUTHORITY SECTION:
slackware.com. 86400 IN NS ns1.cwo.com.
slackware.com. 86400 IN NS ns2.cwo.com.
;; ADDITIONAL SECTION:
ns1.cwo.com. 123473 IN A 64.57.100.2
ns2.cwo.com. 123473 IN A 64.57.100.3
Non-authoritative answer:
www.slackware.com canonical name = slackware.com.
Name: slackware.com
Address: 64.57.102.34
Nel secondo esempio si segue la procedura opposta: viene inserito un indirizzo IP e l’output ne
fornisce il nome.
Non-authoritative answer:
34.102.57.64.in-addr.arpa name = slackware.com.
è un indirizzo IP, whois visualizza il nome a cui appartiene. Le informazioni, se fornite, sono conte-
nute in forma di record all’interno di un database di tipo RFC 3912. Di default, il comando cerca in
whois.networksolutions.com per i record NIC e in whois.arin.net per gli indirizzi IPv4 e i nomi di rete.
Ad esempio:
Domain names in the .com and .net domains can now be registered
with many different competing registrars. Go to http://www.internic.net
for detailed information.
>>> Last update of whois database: Thu, 15 Jun 2006 15:55:35 EDT <<<
Per conoscere le caratteristiche tecniche dei winmodem, è possibile effettuare una scansione del di-
spositivo via Internet, all’indirizzo: http://132.68.73.235/linmodems/index.html#scanmodem e scarican-
do l’utilità dedicata. Questa, una volta lanciata, crea una directory /modem con una serie di dati. Se
scarsamente decifrabili, l’utente può fare ricorso alla mailing list [email protected] per ottene-
re chiarimenti. Per conoscere il chip del modem, informazione altrettanto importante, si può fare una
ricerca nel sito: http://modemsite.com/56k/chipset.asp.
Un piccolo inconveniente si genera se il computer è dotato di una scheda di rete, ovviamente non uti-
lizzata per la connessione via modem. Infatti il routing è instradato di default verso il gateway registrato
in /etc/rc.d/rc.inet1.conf, che potrebbe essere qualcosa come 192.168.0.1, e di conseguenza la connessione
ha luogo, ma non si riesce ad aprire alcun sito. Siamo avvertiti di questa situazione se, lanciando ppp-go,
fra i dati dell’output leggiamo anche:
Una comoda alternativa è costituita da Kppp, un’utilità di KDE da cui si può configurare, avviare e
fermare la connessione (sotto Gnome ne esiste l’analogo, Gnome PPP). Essa modifica eventuali file di
configurazione preesistenti (come se si fossero già creati con ppp-setup), ma vi lascia, commentandole,
le vecchie entrate. Il vantaggio di questa utilità risiede nel fatto che, mentre ppp-on e ppp-off possono
essere lanciati solo da root, Kppp funziona indifferentemente da root e da utente, anche se è sempre pos-
sibile modificare i permessi di quei comandi (cattiva soluzione), autorizzarli a un determinato gruppo o
ancora autorizzarli soltanto per certi utenti con sudo.
Lanciando la configurazione con l’omonimo pulsante dalla finestra principale, bisogna ricorrere in
ogni caso alla configurazione manuale, perché Kppp presenta valori preimpostati non validi per le con-
nessioni italiane. I dati richiesti sono quasi tutti immediatamente intelligibili: nella scheda Account si
deve creare un account nuovo con un nome a piacere; da qui si raggiunge la linguetta Effettua chia-
mata, dove bisogna inserire il nome del provider, il suo numero telefonico, scegliere l’autenticazione
PAP/CHAP, e scegliere Nessuno come metodo di callback. Nella linguetta IP vale la pena di imposta-
re ad Automatico l’indirizzo IP; nella linguetta Gateway si opta per Gateway predefinito e si mette
la spunta alla voce Assegna il “Default Route” a questo gateway. Nella linguetta DNS si inserisce
i nome di dominio del provider e si aggiungono l’indirizzo o gli indirizzi IP del suo server DNS. Un
piccolo «trucco» per conoscere l’IP del DNS di un provider (posto che si sia già connessi a Internet) è
lanciare dapprima il comando: host -t NS dominio_del_provider per conoscere il nome del server
DNS e quindi: host nome_del_server_DNS per ottenerne l’indirizzo IP. Ad esempio, avremo:
host dnsca.tin.it.
samiel@darkstar:~$ host dnsca.tin.it
dnsca.tin.it has address 195.31.190.31
Un’utile funzione attivabile all’ultima linguetta di questa sezione è Costi telefonici; basta seleziona-
re il tipo di connessione cui facciamo ricorso per sapere in ogni istante a quanto ammonta il totale delle
nostre spese. Per il resto, tutto può essere lasciato com’è.
Nella scheda Modem si aggiunge un modem nuovo con un nome identificativo a piacere, gli si
attribuisce un dispositivo (che può essere /dev/ttySn oppure il link simbolico /dev/modem), si sceglie la
velocità di connessione (che, per un modem 56 kbps, sarà 57600). In questa scheda, oltre al pulsante
per interrogare il modem verificando se viene riconosciuto, bisogna prestare una certa attenzione alla
scheda Comandi modem. Poiché le caratteristiche tecniche delle connessioni variano da Stato a Stato
e in genere di default Kppp è impostato secondo parametri validi per gli Stati Uniti (dove il segnale di
libero è costituto da un tono continuo, mentre in Italia esso è intermittente), alcune stringhe possono
produrre dei fastidi. In Italia è allora possibile connettersi o lasciando disabilitata la voce Attendi il
segnale di linea prima di comporre il numero o adeguando le stringhe che definiscono i comandi del
modem: la stringa di inizializzazione sarà ATZ, la stringa di chiama ATDT se il telefono è a toni, ATDP se il
telefono è a impulsi.
Infine, nella linguetta Varie mettendo la spunta alla voce Aggiungi al pannello appena connesso
si riduce il programma a icona, ma controllando il tempo, la velocità ed eventualmente il costo della
connessione attiva.
anche da switch), integra spesso anche funzione di firewall, sia NAT (Network Addres Translation) sia
SPI (Stateful Packet Inspecting).
Il router va configurato via browser dal suo IP. Nella maggior parte dei casi, tale indirizzo è 192.168.0.1
(oppure 192.168.0.254); il manuale del router contiene comunque tutte queste indicazioni. Alcuni para-
metri, come il tipo di incapsulamento (PPPoA oppure PPPoE) e il metodo di multiplazione (LLC o
VC), sono forniti dal provider. Non affrontiamo invece in questa sede la definizione di altri parametri,
come l’impostazione di un firewall, poiché variano da marca a marca e da modello a modello. Certo,
l’implementazione di un firewall a livello del router può rivelarsi una scelta molto felice.
Vi sono router che, come abbiamo detto, offrono un servizio DHCP, per cui è sufficiente collegarvi
mediante un cavo la scheda o (se dotati di più porte e dunque in possesso della funzionalità aggiuntiva
di switch) le schede di rete. In alternativa, si possono connettere allo stesso modo delle schede di rete già
impostate con IP fisso. In ogni caso, il computer risulterà sempre connesso a Internet, senza necessitare di
alcuna procedura per attivare o disattivare la connessione. Volendo, l’unico metodo è quello di spegnere
fisicamente il router.
questo punto il protocollo irc funzionerà solo verso quell’indirizzo. In tal modo è possibile mantenere
aperte le porte del computer solo verso indirizzi che sappiamo essere affidabili.
Alla voce Connessione è possibile decidere se consentire il traffico da una zona a un altra. Di default
Guarddog consente il traffico da Internet a Locale e viceversa; ce ne rendiamo conto perché in Zona
Internet è spuntata la casella Locale, mentre in Zona locale è spuntata la casella Internet.
L’aspetto per noi rilevante è la presenza del messaggio «1 received», che ci mostra che il viaggio del
pacchetto di prova è andato a buon fine. Ripetiamo simmetricamente l’operazione dal secondo com-
puter. Se invece si ricevesse «0 received», allora bisognerebbe ricontrollare la rete: o l’hardware, o l’as-
segnazione degli indirizzi IP effettuata con netconfig (essi sono riscontrabili in /etc/rc.d/rc.inet1.conf)
dovrebbero contenere degli errori.
233
234 15. Condivisioni con NFS
nodev nfs
Il computer che mette i suoi dati a disposizione si chiama server, quello che li riceve si chiama client.
Poiché la condivisione è gestita sulla base dell’indirizzo IP dei vari computer, la rete dev’essere settata
con indirizzo IP statico, e non con l’indirizzo IP dinamico stabilito da DHCP. In realtà, sarebbe possibile
utilizzare DHCP con indirizzi dinamici, ma ciò presuppone che uno dei computer sia impostato come
server DSN per la rete interna, e qui prescindiamo da questo più complesso scenario.
I demoni che gestiscono i vari aspetti della condivisione sono /sbin/rpc.portmap, /usr/sbin/rpc.nfsd e
/usr/sbin/rpc.mountd: rpc.portmap fa sì che alle richieste NFS risponda il demone corretto, rpc.mountd
serve all’effettuazione del montaggio del file system e rpc.nfsd risponde alle richieste del client, in base
alle direttive di /etc/exports.
Se le impostazioni sono corrette, il comando rpcinfo -p ci restituirà un output del tipo:
La condivisione implica che nel server sia indicata la o le directory da condividere, e che nel client ne
sia indicato il punto di montaggio. La configurazione di base è estremamente semplice e veloce, anche
se può essere ulteriormente affinata.
3. i permessi, racchiusi fra parentesi tonde e senza lasciare alcuno spazio con l’indicazione del client.
15.3. Configurazione del server 235
1. si indica col percorso completo; la barra (/) indica che si intende montare l’intero file system. 2. si
indica con l’indirizzo IP oppure col nome del computer client. Si avrà pertanto una riga come:
/ 192.168.0.2(rw,nohide,no_root_squash)
È possibile condividere soltanto una determinata directory, e allora la riga risulterà ad esempio:
/home/samiel 192.168.0.2(rw,nohide,no_root_squash)
È possibile specificare opzioni diverse per client diversi sulla stessa condivisione, ad esempio:
In questo modo si condivide con due diversi client la stessa directory, ma, fra l’altro, si assegna al
primo il permesso di lettura e scrittura, al secondo solo quello di lettura.
È possibile inoltre differenziare le directory e i permessi fra vari client. Ad esempio:
/ 192.168.0.4(ro,nohide,_netdev,no_root_squash)
/home/samiel 192.168.0.4(rw,nohide,_netdev,no_root_squash)
In questo modo il server mette a disposizione del primo computer il suo intero file system in sola
lettura, e del secondo computer esclusivamente la home dell’utente samiel sia in lettura sia in scrittura.
Si possono inoltre usare dei caratteri jolly. Indicare come client *.mydomain.org significa concedere i
permessi a tutti i computer che fanno parte di quel dominio.
Vediamo infine le opzioni principali:
Dopo aver modificato il file /etc/exports, le modifiche vengono applicate lanciando il comando:
exportfs -r.
236 15. Condivisioni con NFS
2. la directory condivisa
3. il punto di montaggio
5. le opzioni.
1. e 2. sono scritte di seguito, separate solo dai due punti. Avremo perciò, ad esempio:
oppure:
rsize indica il buffer in lettura (r = read) in kb. Attualmente il default è 4096, che può essere aumentato
a 8192.
wsize indica il buffer in scrittura (w = write) in kb. Attualmente il default è 4096, che può essere
aumentato a 8192.
_netdev indica che il file system risiede su un dispositivo che richiede un accesso dalla rete. Serve a
prevenire il tentativo di montaggio dell’unità finché la rete non sia stata abilitata.
hard Stabilisce che la connessione deve essere ritentata all’infinito, anche dopo un crash del sistema. È
la modalità di funzionamento predefinita. Il tentativo può essere interrotto solo se si precisa initr.
initr consente di interrompere una chiamata NFS mediante dei segnali. È utile quando il server non
risponde.
soft consente un timeout in caso di crash del server. Il timeout è precisato con timeo.
timeo definisce il valore del timeout, espresso in decimi di secondo, per il completamento delle richie-
ste; il valore di default è 0,7 secondi. Si definisce con la sintassi timeo=n , dove n sono i decimi di
secondo. Se in quel lasso di tempo non si ottiene una conferma, la connessione viene ritentata con
una durata di timeout doppia, fino a un massimo di 60 secondi.
15.5. La risoluzione dei nomi 237
# For loopbacking.
127.0.0.1 localhost
192.168.0.2 darkstar.mydomain.org darkstar
192.168.0.3 brightstar.mydomain.org brightstar
# End of hosts.
In questo modo, invece di:
/ 192.168.0.2(rw,nohide,_netdev,no_root_squash)
potremo scrivere:
/ darkstar(rw,nohide,_netdev,no_root_squash)
portmap:ALL
lockd:ALL
mountd:ALL
rquotad:ALL
statd:ALL
238 15. Condivisioni con NFS
ALL:ALL
e nello stabilire poi determinati permessi a determinati client all’interno del file /etc/hosts.allow, come
segue:
portmap:192.168.0.3 , 192.168.0.4
lockd:192.168.0.3 , 192.168.0.4
mountd:192.168.0.3 , 192.168.0.4
rquotad:192.168.0.3 , 192.168.0.4
statd:192.168.0.3 , 192.168.0.4
In questi due file vanno indicati gli indirizzi IP e non i nomi dei computer o i loro alias. Per accertarsi
che portmap legga i due file in questione, si lancia il comando: strings /sbin/rpc.portmap | grep
hosts.
4. server WINS (acronimo di «Windows Internet Name Service»). Il ricorso a questa funzionalità è
deprecato nelle ultime versioni di Samba, perché fornisce un supporto di base per la risoluzione
dei nomi per macchine win 9x e Me, laddove ora Samba implementa un proprio servizio DNS
dinamico
7. server o client di Active Directory con supporto LDAP o Kerberos5 (la nuova implementazione di
Samba quale controllore di dominio include un server LDAP built-in chiamato LDB e un’interfac-
cia per la distribuzione delle chiavi KDC, acronimo di «Kerberos Distribution Center»)
9. strumenti per la migrazione rapida e automatica di un dominio gestito con PDC (Primary domain
controller) e BDC (Backup domain controller) MS-Windows NT in un dominio gestito con PDC e
BDC Samba (via un’interfaccia web-based)
10. introduzione di nuovo file system virtuale col supporto delle ACLs (Access Control Lists)
11. come Windows include Visual Basic e WSH (Windows Scripting Host), ora Samba include a sua
volta una nuova interfaccia di scripting in JavaScript
12. un’implementazione – per il momento minima – del protocollo SMB2, presente in Windows Vista®
239
240 16. Condivisioni con Samba
Le reti Unix in generale usano il protocollo TCP/IP, mentre Windows usa per l’appunto SMB sui
protocolli IPX/SPX, NetBEUI e TCP/IP. Per consentire la comunicazione, Samba (sviluppato da Andrew
Tridgell) adotta un’interfaccia di rete chiamata NetBIOS (acronimo di «Network Basic Input Output
System») che consente ai due sistemi di dialogare. Dal canto suo, Microsoft ha sviluppato, allo stesso
fine, il sistema CIFS (acronimo di «Common Internet File System»), ma Samba è più potente e veloce.
Samba è un programma complesso; mentre altre distribuzioni adottano una suddivisione dei suoi file
in più pacchetti, Slackware li include tutti in uno unico, contenente i demoni, i programmi di servizio,
le utilità e le relative librerie (nonché l’amplissima documentazione).
Il file base di configurazione di Samba, /etc/samba/smb.conf, è assai esteso e ricco di opzioni, preve-
dendone oltre trecento. In realtà, assai poche di queste servono per creare una piccola rete mista. Qui
pertanto non ci occuperemo, fra l’altro, di problematiche come i domini, la gestione del browsing, il
ricorso a LDAP e svilupperemo soltanto le seguenti quattro semplici problematiche: come condividere
file in Windows con Slackware, come condividere file in Slackware con Windows, come stampare da
Slackware con una stampante installata su Windows, come stampare da Windows con una stampante
installata su Slackware, il tutto in una piccola rete sicura. La presente sezione si basa essenzialmente su
Windows XP Pro SP2, poiché alcune versioni precedenti di Windows avevano un trattamento diverso
delle password.
UNIX su di una macchina UNIX. Il servizio winbind è controllato separatamente dal servizio Samba.
Qui non ci occuperemo di questa problematica.
Inoltre, il funzionamento di Samba fa riferimento a /etc/services e a /etc/hosts. Slackware è già pronta
per tutto questo, per cui l’avvio del servizio non richiede che si metta mano a nessun file, tranne che a
/etc/hosts, per fruire del servizio di risoluzione dei nomi. È sufficiente rendere eseguibile col comando
chmod u+x il file /etc/rc.d/rc.samba (il comando chmod a+x, consentendo a tutti gli utenti di eseguire
il file, potrebbe compromettere la sicurezza), oppure con l’utilità pkgtool, alla voce Setup, scegliendo
services e quindi rc.samba.
Infine, il file preconfigurato /etc/samba/smb.conf-sample va rinominato /etc/samba/smb.conf per in-
trodurvi le modifiche necessarie (usarlo come punto di partenza è una buona idea, soprattutto quando si
è alle prime configurazioni, per non perdere tempo ed essere certi di non tralasciare sezioni importanti),
oppure crearne uno nuovo da zero.
• le variazioni apportate a questo file non richiedono il riavvio dei demoni di Samba, in quanto esso
viene riletto di default ogni sessanta secondi. In ogni caso, le variazioni alla configurazione delle
risorse condivise non vengono applicate finché c’è un qualche utente che vi è connesso.
[homes] specifica la condivisione delle directory home degli utenti e i loro percorsi e permessi
[printers] gestisce globalmente le stampanti condivise, definendo i relativi accessi
[tmp] definisce lo spazio da dedicare allo swap dei file temporanei
[public] definisce l’accesso a una specifica directory pubblica, cioè accessibile a tutti gli utenti
[share] indica particolari risorse condivise. Le si può attribuire un nome a piacere, purché sempre
racchiuso fra parentesi quadre. Essa, a sua volta suddivisa in ulteriori sottosezioni, definisce la
condivisione per risorse particolari, come alcune directory e soltanto quelle, e per gruppi apposi-
tamente definiti; una directory può essere infatti messa a disposizione di un controllato numero di
utenti raccolti in un gruppo, oppure si può autorizzare soltanto un gruppo a scrivere sulla risorsa,
e via dicendo.
3. la creazione di eventuali password da richiedere gli utenti per accedere alle risorse
5. i limiti della fascia oraria o del periodo in cui le risorse possono essere condivise.
Ogni parametro impostato nelle sezioni particolari prevale su quello specificato nella sezione [global].
Ogni sezione dev’essere aperta dal titolo, indicato fra parentesi quadre. Come sappiamo, le righe pre-
cedute dal simbolo del cancelletto (#) o del punto e virgola (;) sono commenti e perciò non vengono
interpretati dal servizio.
In questo caso, la scelta del tipo di archivio utenti da utilizzare si effettua mediante la direttiva:
passdb backend = smbpasswd
Essa va precisata se la si vuole adottare, poiché di default Samba 3 adotta tdbsam. Inoltre, potreb-
bero doversi specificare le seguenti righe:
smb passwd file = percorso_del_file_delle_password
encrypt password
Il file delle password è di default /etc/samba/private/smbpasswd; la direttiva va inserita solo se
questo file è collocato in una posizione non canonica. Inoltre, sempre di default le password ven-
gono criptate, per compatibilità con le più recenti versioni di Microsoft Windows. La voce pertanto
ha un senso solo se impostata a no, nel caso Samba debba dialogare con Windows 95 o versioni
ancora precedenti; esistono comunque delle patch per i sistemi 9x, Me e 2k in /usr/doc/samba-
numero_versione/docs/registry, costituite dai file di estensione .reg.
Si presuppone inoltre che l’utente Samba sia già stato aggiunto col comando smbpasswd. Per ovvi
motivi di sicurezza, entrambi i file smbusers (presente in /etc/samba) e smbpasswd (presente in
/etc/samba/private), devono essere accessibili sia in lettura che in scrittura per il solo utente root.
b) mediante archivi TDBSAM (Tiny database sam). Si tratta della modalità di default in Samba3,
ideale per server locali che non necessitano di una replica del database interno. È adatta a do-
mini con un numero limitato di utenti (non più di qualche centinaio, anche se il numero consi-
gliato arriva a duecentocinquanta). Include nel file di database passdb.tdb tutte le informazioni
precedentemente contenute in smbpasswd, e in aggiunta le informazioni SAM prima escluse.
In questo caso, la scelta del tipo di archivio utenti da utilizzare si può effettuare mediante la
direttiva:
passdb backend = tdbsam,
che però non è necessario (e che anzi è deprecato) dichiarare poiché è attualmente il default. Ven-
gono così creati i file /etc/samba/private/passdb.tdb, il database delle password che si gestisce con
pdbedit, e /etc/samba/private/secrets.tbd, che contiene il SID (acronimo di «Security ID») di do-
minio, una sorta di identificativo del server. Poiché questo è il comportamento di default di Sam-
ba3, non serve decommentare la riga, già presente, poiché – come abbiamo appena ricordato –
l’indicazione esplicita è deprecata. Non viene richiesta alcuna ulteriore configurazione.
Si presuppone inoltre che l’utente Samba sia già stato aggiunto col comando (che analizzeremo
più in dettaglio sotto) pdbedit -a nome_utente .
c) mediante server locali o remoti NIS, LDAP, MySQL o altri ancora. Questa modalità è adatta a
domini numericamente consistenti, che spesso richiedono la presenza di più PDC. In questi casi,
poiché Samba non prevede la replica diretta degli archivi utente, una delle migliori opzioni è il
ricorso a LDAP. Qui trascuriamo questa problematica.
In questo livello di sicurezza il nome dell’utente Samba deve obbligatoriamente coincidere con il
nome di un utente definito nel sistema GNU/Linux, che, a sua volta, dev’essere sempre in grado di
assegnare un proprietario valido ai file creati o copiati dall’utente nella risorsa condivisa. Se fosse
impossibile soddisfare una tale condizione, si potrebbe ricorrere all’uso di un file di corrisponden-
za tra utenti GNU/Linux e utenti Samba, il cui nome viene indicato con la direttiva username map
= file_di_mappa e che spesso prende il nome /etc/samba/smbusers. In questo file le indicazioni
verranno fornite con la sintassi seguente:
nome_utente_linux = nome_utente_samba
security = server questo tipo di controllo risulta ormai obsoleto. Era usato quando Samba non era
in grado di comportarsi come un domain member server, per cui l’utenza veniva controllata su
246 16. Condivisioni con Samba
di un server esterno (solitamente un PDC MS-Windows, ma anche un PDC Samba), il cui nome
NetBIOS veniva indicato con la direttiva: password server = nome_server. Inoltre esso è meno
sicuro e causa un maggior carico al sistema rispetto al controllo esercitato mediante security =
domain.
security = domain il controllo viene eseguito attraverso i controller del dominio. Il server Samba è
concepito in un domain member server che, presentando un account della macchina («domain
security trust account»), permette a tutte le richieste di autenticazione di passare per l’appunto
attraverso i controller del dominio. Il tipo di controllo di accesso è dunque del tutto analogo a
quello del caso di security = user, ma questa volta il server Samba va a inserirsi in un dominio
MS-Windows NT/2000.
Tuttavia, i computer di una piccola rete domestica in genere non hanno un dominio proprio. In
questa sede prescindiamo pertanto da questa problematica, che interessa piuttosto gli ammini-
stratori di sistemi di notevole ampiezza.
security = ads se si ha un ambiente Active Directory, la stazione Samba si unisce a un dominio come
membro nativo dell’Active Directory, cioè come member server di una Active Directory di MS-
Windows 200x. Sebbene le impostazioni di sicurezza limitino l’uso di protocolli di autenticazione
compatibili con NT, il server Samba è in grado di unirsi a un ADS utilizzando l’autenticazione
Kerberos5 e LDAP per l’archivio utenti: infatti Samba, in Active Directory member mode, è in gra-
do di accettare i ticket di Kerberos. Prescindiamo qui anche da questa problematica, che interessa
sempre gli amministratori di sistemi di notevole ampiezza.
Va infine ricordato che il livello di sicurezza per un server Samba singolo non può essere diversificato.
null password se impostato a yes permette di avere utenti Samba con parola d’ordine nulla (il valore
predefinito è no).
restrict anonymous impedisce il collegamento anonimo. Per ragioni di sicurezza, è opportuno abili-
tare questa opzione.
password level di default, Samba esegue il matching delle password con tutti caratteri minuscoli,
compresa la prima lettera. Questa voce permette di specificare, come nel caso di username level,
quante lettere al massimo si possono rendere maiuscole per i tentativi di connettersi a una condi-
visione. Le si attribuisce un valore numerico, ad esempio: password level = 2.
Come per le condivisioni NFS, queste due opzioni andrebbero gestite in coppia, in modo da negare
a tutti l’accesso in hosts deny (con la stringa ALL) e consentirlo poi a quelli prescelti in hosts allow.
Se vengono incluse in questa sezione, le voci hosts allow e hosts deny fanno riferimento a tutte le
risorse, altrimenti hanno valore solo per la sezione nella quale sono inserite. Sono validi sia il nome ho-
st (ad esempio, hosts allow = samiel), sia l’indirizzo IP (ad esempio, hosts allow = 192.168.0.2),
sia l’indicazione di una sottorete (ad esempio, hosts allow = 192.168.1.*/255.255.0.0 o, in modo
equivalente, hosts allow = 200.200.).
Inoltre, è opportuno che l’accesso a localhost sia concesso sempre, pena possibili malfunzionamenti
della scansione delle risorse del server.
Si può usare anche l’operatore EXCEPT per indicare un’eccezione a una regola (ad esempio hosts
allow 192.168.1. EXCEPT 192.168.1.3).
In assenza delle direttive host allow e host deny, l’accesso è concesso a tutti in modo predefinito.
valid users si imposta per consentire l’accesso esclusivamente agli utenti indicati.
invalid users si imposta per inibire definitivamente l’accesso agli utenti indicati.
A proposito delle opzioni valid users e invalid users, vale la pena di rilevare come Samba
preveda due livelli di controllo di accesso alle risorse condivise: il primo, di carattere generale, si
ottiene con l’impostazione del livello di sicurezza e in pratica stabilisce chi ha diritto di collegarsi
al server; il secondo, di carattere più specifico, si effettua sulle singole risorse appunto mediante
opzioni come valid users, public write list ecc., grazie alle quali si può stabilire quali utenti
possono accedere a ogni singola risorsa.
admin user determina quali utenti, accedendo alla risorsa, possono eseguire operazioni da utente root.
guest account consente di fornire un account generico da considerare «guest» al quale può essere
consentito l’accesso alle condivisioni (da usare nel caso di security = share). Il nome dell’utente
viene scelto a piacere. Nelle sezioni corrispondenti alle risorse da condividere in tal modo andrà
inserito il parametro guest ok = yes. Se qui non viene precisato nulla, verrà usato di default
l’utente nobody.
guest only impostato a yes rende disponibile la connessione soltanto a utenti anonimi. Di default è
settata a no.
browseable rende visualizzabili nell’elenco di Samba tutte le condivisioni disponibili. Se questo para-
metro, di default impostato a yes, viene impostato a no, ovviamente resta la possibilità di effettuare
le condivisioni, ma è necessario conoscerne esattamente il nome.
248 16. Condivisioni con Samba
read list permette di eseguire un override della configurazione base di una condivisione per la lista
degli utenti specificati. In particolare, consente l’accesso con i soli diritti di lettura a una risorsa
scrivibile.
write list permette di eseguire un override della configurazione base di una condivisione per la li-
sta degli utenti specificati. In particolare, consente l’accesso con diritti di scrittura a una risorsa
configurata per consentire accessi in sola lettura.
Entrambi questi override possono essere precisati non solo per utenti, ma anche per gruppi. I nomi
dei gruppi sono preceduti dal simbolo di at (@) oppure dalla e commerciale (&). Ad esempio, si può
avere:
write list = @webmasters @developers.
max connections specifica il numero massimo di connessioni a una condivisione. Settata di default a 0,
permette connessioni illimitate alle risorse. A essa si attribuisce un valore numerico, ad esempio:
max connections = 10.
dead time = nn specifica il numero di minuti (nn) di inattività prima che il client venga disconnesso
per evitare il consumo di risorse.
syslog richiede se utilizzare il syslog, presente in /var/log/syslog, per i log di Samba invece o parallela-
mente al logging diretto. Il valore specificato (da 0 a 10, di default 1) indica quali messaggi di log
inviare a syslog e, in riferimento agli argomenti dell’opzione log level, che cosa loggare diretta-
mente sui file di log interni. Per poter usare il syslog è necessario che Samba sia compilato (come
in effetti è in Slackware) con l’opzione di configurazione --with-syslog e che /etc/syslog.conf sia
configurato per gestire la facility daemon, con una riga tipo:
daemon.* /var/log/daemon.log
SO_SNDBUF: aumenta i buffer di spedizione. I valori possibili sono multipli di 1024, ad esempio
4096 e 8192. Anche in questo caso non ci sono regole fisse, ma solo una sperimentazione del
funzionamento della rete.
comment specifica un commento a piacere relativo alla risorsa condivisa, stringa che apparirà come una
semplice descrizione in Windows.
browseable impostato a yes, fa sì che le risorse condivise del computer GNU/Linux appaiano in Win-
dows. Per ragioni di sicurezza, appare più opportuno impostare a no questo parametro, di modo
che la risorsa, sottratta alla scansione, non appaia con il nome /home a tutti gli utenti. In ogni caso,
se condivise in maniera esplicita e selettiva, le home degli utenti appariranno comunque.
[printers]
comment = stampanti
path = /var/spool/samba
browseable = no
printable = yes
public = yes
writable = no
Qui occorre notare che l’eventuale parametro path serve a impostare una directory per la coda di
stampa diversa da /tmp, che è quella predefinita.
Altra direttiva da segnalare è printable con la quale si attiva la coda di stampa.
Se si adotta la direttiva browseable = yes, è necessario che anche CUPS sia configurato per con-
sentire il browsing delle stampanti. A tal fine bisogna accertarsi fondamentalmente che nella sezione
Browsing Options del file /etc/cups/cupsd.conf la riga
Browsing On
sia decommentata. In aggiunta, si possono definire gli IP autorizzati o interdetti al browsing ricorrendo,
più sotto in questa medesima sezione, alle direttive BrowseAllow e BrowseDeny.
[condivisioni]
comment = Condivisioni
path = /share
browseable = no
writable = yes
[pubblico]
comment = Condivisioni
path = /documenti/public
browseable = no
writable = yes
[printers]
comment = All Printers
path = /var/spool/samba
browseable = no
guest ok = no
writable = no
printable = yes
16.5. Alcuni esempi di /etc/samba/smb.conf 253
[homes]
comment = Home Directories
browseable = yes
read only = no
[printers]
comment = All Printers
path = /var/spool/samba
browseable = no
guest ok = no
writable = no
printable = yes
In questo caso, le home degli utenti, in base alla direttiva read only = no, possono anche essere
scritte da Windows.
[global]
workgroup = Workgroup
[netbios name = darkstar]
security = share
[data]
254 16. Condivisioni con Samba
[global]
workgroup = Workgroup
[netbios name = darkstar]
security = share
[data]
comment = Samba Server
path = /export
force user = anybody
force group = users
read only = no
guest ok = yes
[public]
comment = directory pubblica
browseable = yes
guest ok = yes
path = /usr/local/public
writable = yes
16.5. Alcuni esempi di /etc/samba/smb.conf 255
[temp]
comment = directory pubblica plus
browseable = yes
guest ok = yes
guest only = yes
path = /usr/local/public
writable = yes
[global]
workgroup = DOCS
netbios name = DOCS_SRV
security = user
printcap name = cups
disable spools = yes
show add printer wizard = no
printing = cups
[homes]
comment = Home Directories
valid users = %S
read only = No
browseable = No
[public]
comment = Data
path = /export
256 16. Condivisioni con Samba
[private]
comment = documenti riservati
browseable = yes
public = no
path = /home/samiel/riservato
writable = yes
valid users = utente1 utente2
La direttiva comment serve, al solito, ad associare una descrizione alla risorsa condivisa. L’opzione
browseable (qui impostata a yes) permette di rendere visibile la risorsa agli utenti che si connettono
al server. L’opzione public è un sinonimo di guest ok; in questo caso non si vuole che la risorsa sia
accessibile per l’utente generico. L’opzione path permette di indicare il percorso della risorsa sul siste-
ma GNU/Linux. L’opzione writable (qui impostata a yes) serve a concedere l’accesso in scrittura. La
direttiva valid users indica quali sono gli utenti che possono accedere alla risorsa. È anche possibile
indicare gruppi di utenti GNU/Linux con la sintassi @nome_gruppo e gruppi di utenti NIS (se in rete è
presente un server NIS) con la sintassi &nome_gruppo, e infine entrambi, con la sintassi +&nome_gruppo
o &+nome_gruppo.
[private]
comment = directory privata
browseable = yes
path = /usr/local/private
writable = no
public = no
write list = pippo pluto
create mask = 0644
directory mask = 0644
follow symlinks = no
16.6. Le utilità di Samba 257
In questo esempio abbiamo una directory accessibile in sola lettura, dove tuttavia la presenza della
direttiva write list permette di impostare permessi di scrittura per gli utenti indicati, indipenden-
temente da quanto specificato negli altri parametri. Si deve però aggiungere che i permessi impostati
a livello di sistema su una risorsa hanno sempre il sopravvento su quanto specificato nel file di con-
figurazione di Samba; nel caso considerato, se /usr/local/private fosse di proprietà dell’utente root e i
permessi impostati a 600, gli altri utenti non potrebbero comunque né leggere né scrivere alcunché in
quella directory condivisa. Se si volesse innalzare un utente al rango di root, lo si potrebbe fare con la
direttiva admin users = nome_utente ; in questo modo egli non risentirebbe di eventuali limitazioni
dovute ai permessi sui file. Le ultime due direttive servono a indicare i permessi con cui verranno creati
file e directory all’interno della risorsa condivisa; il valore predefinito è 0755. L’ultima direttiva presente
nell’esempio, follow symlinks, impostata a no impedisce che vengano seguiti i collegamenti simbolici,
evitando così che chi accede alla condivisione possa accedere anche a file che si trovano al suo esterno.
[cd]
comment = CD-ROM
preexec = mount /mnt/cdrom
postexec = umount /mnt/cdrom
browseable = yes
public = yes
path = /mnt/cdrom
writable = no
Se si vuole evitare che possano connettersi utenti sprovvisti dei privilegi per montare e smontare il
CD, le direttive preexec e postexec possono essere sostituite rispettivamente con root preexec e root
postexec, che svolgono lo stesso compito, ma con i privilegi dell’utente root.
net amministra i server remoti Samba e CIFS. Trascuriamo qui questa utilità
smbclient offre un accesso di tipo FTP dai client Linux ai servizi Samba (e CIFS) sui server
root@darkstar:~# smbstatus
No locked files
root@darkstar:~# smbstatus -p
Samba version 2.2.7
Service uid gid pid machine
----------------------------------------------
13388
13039
[...]
root@darkstar:~# smbtree
Password:
WORKGROUP
\\DARKSTAR Samba Server
\\DARKSTAR\samiel Home Directories
\\DARKSTAR\ADMIN$ IPC Service (Samba Server)
\\DARKSTAR\IPC$ IPC Service (Samba Server)
\\BRIGHTSTAR Brightstar
\\BRIGHTSTAR\C$ Condivisione predefinita
\\BRIGHTSTAR\ADMIN$ Amministrazione remota
\\BRIGHTSTAR\D$ Condivisione predefinita
\\BRIGHTSTAR\IPC$ IPC remoto
Il simbolo + davanti al nome del gruppo di lavoro indica che quella macchina è local master browser
per tale gruppo; il simbolo * davanti al nome del gruppo di lavoro indica che quella macchina è domain
master browser per tale gruppo.
ping: invia un determinato numero di ping e attende lo stesso numero di messaggi replica. Può essere
inviato a qualsiasi destinazione.
shutdown: spegne il demone specificato, che può essere sia smbd sia nmbd.
pool-usage: stampa un resoconto sull’uso della memoria da parte del processo specificato. È disponibile
sia per smbd sia per nmbd.
reload-config: obbliga il demone a rileggere il file di configurazione (di default /etc/samba/smb.conf).
Può essere inviato a smbd, nmbd o winbindd.
-u nome_utente specifica il nome dell’utente che deve compiere le operazioni richieste. È necessario
per i comandi di aggiunta, rimozione e modifica.
-f nome_completo gestisce il nome completo dell’utente (scelta peraltro del tutto opzionale), da porre
fra apici doppi (ad esempio, -f "Simo Sorce")
-h home specifica la home dell’utente, indicandone il path completo sempre fra apici doppi (ad esem-
pio, -h "\\\\BERSERKER\\sorce")
-D drive specifica, sempre fra apici doppi, la lettera dell’unità di Windows che dev’essere usata per
mappare la home dell’utente (ad esempio, -d "H:")
-m macchina usata in congiunzione con l’opzione -a, aggiunge un account fiduciario per una macchina
invece che per un utente. Con la specificazione ulteriore dell’opzione -u fornisce il nome della
macchina (ad esempio, pdbedit -a -m -u w2k-wks)
-x cancella un account, relativo a un utente o a una macchina, dal database. Il nome dell’utente va
specificato con l’opzione -u (ad esempio, pdbedit -x -u bob)
262 16. Condivisioni con Samba
-i passdb-backend usa un backend diverso per richiamare gli utenti rispetto a quello specificato in
/etc/samba/smb.conf. Può essere usato per importare i dati relativi agli utenti nel database locale,
facilitando la migrazione da un backend per le password a un altro (ad esempio, pdbedit -i
smbpasswd:/etc/samba/private/smbpasswd.old).
-e passdb-backend esporta tutti gli utenti attualmente disponibili nel backend delle password speci-
ficato (ad esempio, pdbedit -e smbpasswd:/root/samba-users.bac).
-b passdb-backend usa un backend differente da quello adottato di default per le password (ad esem-
pio, pdbedit -b xml:/root/pdb-backup.xml -l)
Server Comment
--------- -------
Workgroup Master
--------- -------
WORKGROUP BRIGHTSTAR
Tra le informazioni che emergono, notiamo che Sharename indica il nome che identifica la risor-
sa condivisa, Type fornisce delle indicazioni sul tipo della risorsa (disco oppure stampante), Comment
aggiunge ulteriori indicazioni.
Le colonne Server e Comment forniscono i nomi degli altri host appartenenti alla rete con delle in-
formazioni aggiuntive, e infine le colonne Workgroup e Master indicano il nome del gruppo e di altri
eventuali gruppi e il domain master del gruppo.
Il comando smbclient consente invece di connettersi a una determinata risorsa se viene specificato
il nome di un servizio, secondo la sintassi: smbclient [//server/servizio], ad esempio: smbclient
//server_samba/public. Se la connessione ha successo, si ha a disposizione un’interfaccia testuale (un
prompt) del tutto simile a quella del programma ftp, dove è possibile eseguire una serie di comandi
16.6. Le utilità di Samba 263
analoghi (get, put, cd, pwd, ecc.) per prelevare file dal server in direzione della macchina locale, per
prelevare file dalla macchina locale in direzione del server, per ricevere informazioni dal server e così
via. Avremo così un prompt del tipo:
L’opzione -I seguita da un numero IP serve a indicare l’indirizzo del server a cui ci si vuole connet-
tere.
L’opzione -U seguita dalla stringa username%password automatizza l’accesso. Se la password non
viene specificata, verrà comunque richiesta. In alternativa, è possibile ricorrere a un file di credenziali
(di solo testo) che contiene in chiaro il nome dell’utente e la sua password. Ad esempio, si può creare il
file /etc/samba/smbcred.brightstar (l’estensione è il nome del computer Windows o della condivisione)
avente per contenuto le seguenti righe:
username = nome_utente
password = password
Per sicurezza, l’amministratore può restringere l’accesso a questo file per prevenirne la lettura da
parte di utenti non autorizzati, coi seguenti comandi:
Qui il nome dell’host può essere sostituito da un indirizzo IP se è attivo il servizio di risoluzione dei
nomi o se l’host è elencato in /etc/hosts.
Per smontare la condivisione si usa, al solito, il comando: umount /punto_di_montaggio .
Si può rendere stabile il montaggio inserendo in /etc/fstab una riga del tipo:
samba -fstype=smbfs,credentials=/etc/samba/smbcred.brightstar, \
gid=102,fmask=660,dmask=770 ://192.168.0.3/C
Alcuni browser supportano il protocollo Samba: fra gli altri Konqueror, nel quale si possono visua-
lizzare le risorse condivise all’indirizzo: smb:/.
[global]
load printers = yes
; printcap name = /etc/printcap
; printing = cups
[printers]
comment = All Printers
path = /var/spool/samba
browseable = no
guest ok = no
writable = no
printable = yes
Qui, nella sezione [global], abbiamo una prima riga che carica automaticamente tutte le stampanti
configurate con CUPS e presenti in /etc/printcap senza che ci sia il bisogno di specificarle individual-
mente. La direttiva va impostata a no solo in server dove gli amministratori intendono effettuare un
controllo preciso di ciò che visibile agli utenti. Se il file /etc/printcap fosse collocato in una posizione
non canonica, allora andrebbe precisata la seconda riga dell’esempio, attualmente commentata. Se non
si intende adottare CUPS come sistema di stampa, allora andrebbe precisata la terza riga dell’esempio,
attualmente commentata
Nella sezione [printers], dopo una riga meramente descrittiva, comment, vengono indicati lo spoo-
ling di Samba, comune per tutte le operazioni e tutti gli utenti, e, con la direttiva browseable = no, il
fatto che la risorsa non verrà visualizzata in Windows. Questa configurazione è resa abbastanza sicu-
ra dalla direttiva guest ok = no, che impedisce utilizzi anonimi della stampante; la direttiva opposta
può essere espressa sia nella forma di guest ok = yes, sia nella forma di set public = yes. Infine, la
risorsa è posta ovviamente come non scrivibile.
[printers]
comment = All Printers
path = /var/spool/samba
guest ok = yes
printable = yes
browseable = no
266 16. Condivisioni con Samba
[global]
workgroup = WORKGROUP
netbios name = darkstar
security = share
disable spools= yes
show add printer wizard = no
printing = cups
[printers]
comment = All Printers
path = /var/spool/samba
guest ok = yes
printable = yes
use client driver = yes
browseable = yes
[printers]
comment = All Printers
path = /var/spool/samba/
printer = HP_DeskJet_6122
browseable = no
public = yes
guest ok = yes
writable = no
printable = yes
printer admin = @ntadmins
[print$]
comment = Printer Drivers Share
path = /usr/share/cups/drivers
write list = tizio, caio, sempronio
printer admin = tizio, caio
16.7. La stampa con Samba 267
La condivisione print$ contiene le unità della stampante, alle quali i client possono accedere se le
stesse non sono disponibili in modo locale. La condivisione print$ è opzionale e potrebbe non essere
necessaria a seconda dell’organizzazione. Impostando browseable = yes, si abilita la stampante da
visualizzare nelle risorse di rete di Windows.
[global]
.
.
.
disable spools = yes
show add printer wizard = no
[printers]
comment = All Printers
path = /var/spool/samba
printer admin = john, ed, @admins
create mask = 0600
printable = Yes
use client driver = Yes
browseable = Yes
Se, come a volte succede, l’utilità di installazione dovesse causare dei problemi (ad esempio, non
creare la porta necessaria), sarà sempre possibile installare la stampante in locale. Quindi, andando
in Pannello di controllo – Stampanti e fax e aprendo col destro del mouse la finestra Proprietà no-
me_stampante, nella linguetta Porte si creerà una nuova porta col tasto Aggiungi porta. Da una nuo-
va finestra, Porte stampanti, basterà scegliere la voce Local port e premere il tasto Nuova porta, quindi
inserire l’indirizzo come specificato sopra, e infine sceglierla come default per la stampante.
L’alternativa consiste nel valersi dell’utilità di Windows per l’installazione delle stampanti. In Pan-
nello di controllo – Stampanti e fax, scegliere la voce Aggiungi stampante. Si apre il wizard Installazione
guidata stampante. Nella finestra Stampante locale o di rete scegliere Stampante di rete o stampante col-
legata a un altro computer. Nella finestra successiva, Specificare una stampante, scegliere la voce Con-
netti alla stampante e scriverne l’indirizzo di rete alla voce: Nome, con la sintassi \\server\stampante
(ad esempio, \\darkstar\HP_DeskJet_6122, il nome che abbiamo attribuito alla stampante in CUPS).
Vanno quindi installati i driver della stampante, come ci avverte una nuova finestra; scegliere il driver
adatto (quello della stampante se presente, oppure uno compatibile) dall’elenco che compare o da un
floppy, e la configurazione sarà conclusa, dopo di che si potrà stampare una pagina di prova.
L’icone della stampante di rete è visibile in Risorse di rete – Visualizza computer del gruppo
di lavoro. Qui si troveranno le icone dei vari computer appartenenti al gruppo di lavoro. Cliccando
sull’icona che li rappresenta, fra le risorse condivise troveremo appunto la stampante. Cliccando ancora
sull’icona di quest’ultima, si aprirà la procedura per l’installazione dei driver.
C’è infine la possibilità di installare la stampante in una porta TCP/IP, ma se e solo se la stampante
stessa include un dispositivo Ethernet. Configurata la stampante a seconda del modello (alcune sono
configurabili via browser, altre consentono di effettuare la stessa operazione mediante l’utilità di con-
figurazione), per attribuirle un indirizzo IP compatibile con quelli adottati nel sistema, si inserirà tale
indirizzo nel wizard di Windows che crea una nuova porta.
consente per l’appunto di esportare i driver di CUPS. Per la scelta dei driver, rimandiamo all’ampia
pagina man di cupsaddsmb.
Una volta scaricati i driver e copiati nella directory /drivers all’interno della directory radice che
di norma si trova in /usr/share/cups si configura /etc/samba/smb.conf aggiungendo la condivisione
[print$] nel modo che segue:
[print$]
comment = Printer Drivers
path = /usr/share/cups/drivers
write list = root
create mask = 0664
directory mask = 0775
A questo punto, avendo configurato le condivisioni [printers] e [print$], si può usare il comando
cupsaddsmb per esportare i drivers, che li aggiungerà a tutte le code di stampa per l’utente root, nella
forma: cupsaddsmb -U root -a.
L’opzione -a serve a specificare tutte le code configurate nel sistema CUPS. Questo comando per-
mette anche di aggiungere coda per coda in modo di permettere una configurazione fine della stampa
remota per i client Windows.
ed eventualmente decommentarla, e che nel file /etc/inetd.conf allo stesso modo sia decommentata la
riga:
Va ricordato che SWAT invia le informazioni in chiaro, non supportando la crittografia. Se si confi-
gura da localhost, ciò non dovrebbe presentare problemi di sicurezza, che tuttavia potrebbero sorgere se
si opera via rete. In questo caso, si può ricorrere a uno strumento di tunnelling SSL chiamato stunnel.
Home
Fa tornare alla pagina di avvio.
Globals
Imposta i parametri della sezione [global], che dunque determinano il comportamento generale
di Samba. Alla luce di quanto è stato analizzato sopra, per una configurazione di base è sufficiente
inserire nella categoria Opzioni basilari il nome corretto alla voce workgroup e nella categoria Opzioni
di sicurezza il metodo prescelto, share oppure – è attualmente il default – user. Per il resto, si possono
tranquillamente accettare le opzioni proposte.
Shares
Imposta le condivisioni. Il menu Scegli condivisione presenta soltanto la voce homes. Altre directory
da condividere possono essere aggiunte nel riquadro Crea condivisione, inserendo il loro percorso as-
soluto nel file system e premendo quindi il pulsante Crea condivisione per rendere stabili le modifiche
apportate.
Printers
Configura le stampanti già presenti nel sistema (e configurate con CUPS). Si può optare per una
gestione globale, o scegliere singolarmente le stampanti.
Wizard
Semplifica la gestione di /etc/samba/smb.conf, eliminando tutte le righe disabilitate e i commenti e
lasciando perciò solo le direttive efficaci.
Status
Mostra lo stato attuale dei demoni smbd, nmbd e winbindd, riguardo ai client connessi, alle condivi-
sioni attive e ai processi in corso. La pagina si aggiorna automaticamente ogni trenta secondi (ma questo
valore può essere modificato a piacere). Inoltre, consente di attivare o disattivare Samba e di ricaricare il
file di configurazione (nel caso vi siano state apportate delle modifiche).
View
Mostra il file /etc/samba/smb.conf che si è ottenuto, man mano che si apportano le modifiche me-
diante SWAT.
16.8. La configurazione di Samba mediante SWAT 271
Password
Gestisce le password crittografate, e permette di aggiungere, rimuovere, abilitare e disabilitare gli
utenti Samba.
272 16. Condivisioni con Samba
Capitolo 17
La console
273
274 17. La console
Se si devono indicare più comandi di seguito, essi vanno separati col punto e virgola (;).
Se si devono utilizzare più righe prima di dare il comando con Invio, il carattere di barra inversa (\)
consente di ignorare il codice del tasto Invio, per cui il testo è interpretato come in continuazione sulla
riga successiva.
17.4. La history 275
Un comando che impiega parecchio tempo per essere eseguito, e che perciò terrebbe occupata la
console, può essere messo in background facendolo terminare col simbolo della e commerciale (&), in
modo da rendere nuovamente disponibile la shell.
La console può essere pulita col comando clear e reinizializzata col comando reset.
Per uscire da una console, si dà il comando logout, exit oppure anche Crtl+d.
La console offre una funzionalità di completamento che si richiama con la combinazione Esc+Tab
(o solo Tab). Se esistono più comandi o nomi di file che iniziano per quella lettera o per quella stringa,
la console li visualizza tutti, in attesa che vengano specificate lettere ulteriori, per restringere il campo
delle possibilità fino ad arrivare a una scelta univoca. Se si digita Esc+', la shell mostra tutti i nomi di
file che corrispondono a quella stringa incompleta.
17.4 La history
La console ha una funzione, chiamata history, che tiene traccia dei comandi precedentemente digitati:
ciò consente di richiamarli senza doverli digitare di nuovo per intero. Il comando history restituisce i
comandi digitati col numero che li identifica, in ordine cronologico. Si può risalire o ridiscendere fra i
comandi con i tasti freccetta, mentre con Pag↑ e Pag↓ si va rispettivamente al primo e all’ultimo coman-
do; si può facilitarne la consultazione redirigendo il comando a more o less. Si possono anche richia-
mare i comandi con !numero_comando . L’elenco dei comandi viene registrato nel file ∼/.bash_history,
impostato di default a 500. Il comando echo $HISTFILE visualizza la posizione del file di elenco, men-
tre il comando echo $HISTSIZE visualizza il valore numerico della variabile. Quest’ultima può essere
modificata aggiungendo in ∼/.bashrc una riga del tipo:
export HISTSIZE=nn
dove nn è un numero a piacere che indica il nuovo numero dei comandi di cui history tiene traccia.
Dopo di ciò, si fa rileggere ∼/.bashrc dal sistema col comando source, e la nuova configurazione risulta
abilitata. La history può essere ripulita col comando history -c.
aggiungendo 4 alle console da 1 a 5 che interessa attivare, per cui avremo (se intendiamo ripristinarle
tutte):
Scheda n. 26
Inizializzazione e runlevel
Slackware ha una modalità del tutto particolare nel gestire l’inizializzazione del sistema, ossia la
gerarchia dei programmi che fanno poi funzionare il sistema nel suo complesso. Si tratta del cosid-
detto stile BDS, laddove la più gran parte delle distribuzioni GNU/Linux ricorre invece al System V.
Entrambi gli stili si basano su script di shell e non su programmi. La differenza fondamentale che li
contraddistingue consiste nel fatto che nel System V ogni runlevel ha una sua subdirectory con gli script
di inizializzazione, mentre nello stile BDS è presente un solo script per ogni runlevel.
Stile SysV e stile BDS
Gli script SysV prendono argomenti del tipo start, stop, restart e simili, a seconda del coman-
do da passare. Perciò si usa, ad esempio, il comando /etc/initrc.d/bind start per far partire Bind, e
/etc/rc.d/bind stop per fermarlo. Inoltre, gli init in stile SysV fanno spesso ricorso a collegamenti sim-
bolici per organizzare il processo di avvio: di conseguenza in /etc/initrc.d/rc.4 potrebbero essere presenti
dei collegamenti simbolici a script di directory. Il nome dei link simbolici è, ad esempio, S10network,
S25xdm, ecc., dove S sta per «start» (che determina l’avvio del servizio), mentre K sta per «kill» (che
blocca o «uccide» il processo), mentre i numeri indicano l’ordine nel quale devono partire. Il principale
vantaggio dell’init in stile SysV è che esso è in grado di configurare «automagicamente» diversi aspetti
dei processi. Ad esempio, nel runlevel 6 può esserci un link simbolico in /etc/rc.d/rc.6 chiamato K75bind,
che blocca Bind se il file a cui è collegato è configurato per far ciò.
Il principale svantaggio dello stile SysV sta nella sua notevole complessità. Per aggiungere un qual-
che servizio, è necessario redigere uno script in stile SysV che gestisca quanto meno start (e possi-
bilmente anche stop). Inoltre, bisogna impostare correttamente i collegamenti simbolici giusti a ogni
runlevel nel quale lo script dev’essere eseguito; se poi esso dev’essere eseguito fra due script con nu-
mero sequenziale, si dovranno rinumerare progressivamente i link simbolici (se lo script z dev’essere
eseguito fra gli script S10x e S11y, devo attribuire allo script z il numero S11z e rinumerare S11z come
S12z).
Infine, è piuttosto scomodo modificare temporaneamente il processo di boot di SysV, se ad esempio
si vuole che un determinato servizio non parta al boot successivo. Il modo più facile è rinominare il link
17.5. Il server X in più terminali 277
simbolico, ma può doversi fare per ogni runlevel, e in caso di ripristino della situazione iniziale biso-
gnerà ricreare manualmente tutti i link. Per evitare questo complesso gioco, Slackware ricorre a script
in stile BDS. Essi sono degli script di shell che si avviano sequenzialmente e non prendono argomenti
come «start» o «stop»: semplicemente, partono quando il sistema entra nel loro runlevel.
Il principale svantaggio degli script in stile BDS sta nelle procedure diverse che si devono volta
per volta adottare per controllare i demoni. Ad esempio, se voglio bloccare («uccidere») Bind, devo
individuare il PID del processo named col comando: ps aux|grep named e quindi ucciderlo, ma non
posso ricorrere a /etc/init.d/bind stop, a meno che non abbia redatto uno script in stile SysV per
farlo.
Il principale vantaggio degli script in stile BDS è che sono facili da comprendere e modificare (con
un qualsiasi editor di testo). Ad esempio, per avviare un servizio z, è sufficiente aggiungere la riga
/usr/local/bin/z al file /etc/rc.d/rc.local, e il servizio stesso verrà eseguito a tutti i runlevel dove vie-
ne eseguito rc.local. Se voglio che quel servizio sia eseguito solo nel runlevel 4, lo aggiungerò solo in
/etc/rc.d/rc.4, che non è una directory, bensì uno script. Se voglio modificare l’ordine di esecuzione degli
script, è sufficiente che ne modifichi l’ordinamento nello script che li lancia. Infine, per escludere un
servizio basta commentare la chiamata, e decommentarla poi quando serve.
Per quanto non sia difficile passare da uno stile all’altro (basta copiare da un sistema all’altro il file
inittab e i file .rc), c’è chi sostiene la maggiore potenza del SysV e chi invece la semplicità del SysBDS.
Inizializzazione del sistema
In Slackware, subito dopo l’esecuzione del kernel, viene eseguito lo script init, che legge il fi-
le /etc/inittab per scegliere la modalità di avvio (cioè il runlevel). Viene quindi eseguito lo script
/etc/rc.s/rc.S che appronta il sistema, prima di entrare effettivamente nel livello (runlevel) desidera-
to. Questo script compie numerose operazioni: abilita la memoria virtuale, monta il file system, pulisce
alcune directory di log, inizializza le periferiche plug&play, carica i moduli del kernel, configura even-
tuali periferiche PCMCIA, imposta le porte seriali e carica gli script System V, qualora ve ne siano.
Inoltre invoca altri script presenti in /etc/rc.d che completano il processo di inizializzazione configu-
rando altre periferiche: /etc/rc.d/rc.modules (che carica i moduli del kernel ed eventualmente invoca lo
script /etc/rc.d/rc.netdevice per configurare la rete); /etc/rc.d/rc.pcmcia (che configura le periferiche di
questo tipo qualora siano presenti); /etc/rc.d/rc.serial (che configura le porte seriali); /etc/rc.d/rc.sysvinit
(che cerca ed eventualmente esegue gli script per il runlevel desiderato).
I runlevel
Il runlevel descrive lo stato in cui girerà il sistema, che può essere monoutente, multiutente, con o
senza i servizi di rete, grafico o testuale. I runlevel sono i seguenti:
runlevel 4 avvia il sistema in modalità multiutente e grafica (cioè all’interno del server X con KDM,
XDM ed eventualmente GDM)
RUNLEVEL SCRIPT
Runlevel 0 /etc/rc.d/rc.0 (che in realtà è un semplice link simbolico a rc.6)
Runlevel 1 /etc/rc.d/rc.K
Runlevel 2 /etc/rc.d/rc.M
Runlevel 3 /etc/rc.d/rc.M
Runlevel 4 /etc/rc.d/rc.4
Runlevel 5 –
Runlevel 6 /etc/rc.d/rc.6
scelto in /home come .xinitrc. In /etc/X11/xinit sono contenuti tutti gli script di avvio di ogni Window
Manager disponibile. Ciò si spiega perché, quando startx fa partire initrc, il suo file di configurazio-
ne determina quali programmi (in particolare, il gestore di finestre) debbano essere lanciati all’avvio
di X. Per prima cosa, xinit controlla se esiste un file .xinitrc nella home dell’utente e, nel caso lo tro-
vi, lo fa eseguire; altrimenti usa il file predefinito, che si trova in /var/X11R6/lib/xinit/xinitrc. Se si han-
no utenti diversi nel sistema, i quali intendono adottare window manager diversi, basta creare nella
/home di ciascuno un link simbolico allo script xinitrc prescelto. Se l’utente A vuole avere KDE co-
me Window Manager predefinito e invece l’utente B Gnome, allora il primo creerà un link in questo
modo: ln -s /etc/X11/xinit/xinitrc.kde /home/A/.xinitrc, mentre il secondo in questo modo:
ln -s /etc/X11/xinit/xinitrc.gnome /home/B/.xinitrc. L’operazione può essere effettuata dagli
utenti stessi (e non da root) all’interno della loro /home, digitando ad esempio il comando:
ln -s /etc/X11/xinit/xinitrc.blackbox ∼/.xinitrc.
in:
Infatti, «3» indica la modalità di avvio testuale e «4» la modalità grafica. In questo caso viene invocato
/etc/rc.d/rc.4, che segue un preciso ordine di caricamento: dapprima kdm (KDE) e quindi xdm (un di-
splay manager di base che consente soltanto di effettuare una registrazione nel sistema). Se si installasse
anche Gnome, allora questo verrebbe caricato per primo. Poiché l’utilità xwmconfig non modifica questo
stato di cose, se si vuole caricare KDE in luogo di Gnome bisogna intervenire manualmente, rieditando
/etc/rc.d/rc.4 in modo da invertire la gerarchia degli accessi. Perciò le righe:
In alternativa, è sufficiente commentare nello stesso file le righe relative a Gnome. Una terza solu-
zione, la più semplice ed elegante, consiste nel togliere a gdm l’eseguibilità col comando: chmod a-x
/usr/bin/gdm. Eventuali altre piccole modifiche, riguardanti l’ingresso in KDE, possono essere effettua-
te dal Centro di Controllo di KDE stesso. Se il sistema è impostato al runlevel 3, è sempre possibile
avviare automaticamente la modalità grafica passando al boot l’opzione telinit 4. Quando appare Li-
lo, sulla riga che mostra l’avvio di Slackware (di default l’indicazione è «Linux») basta aggiungere di
seguito l’opzione indicata. Allo stesso modo, se il runlevel predefinito è 4, per evitare che si avvii auto-
maticamente il server X e il Desktop Manager prescelto e per rimanere invece al prompt della console,
basta aggiungere all’avvio l’opzione telinit 3.
KDE presenta una comoda utilità per automatizzare l’avvio grafico, consentendo inoltre di scegliere
se un qualche utente farà l’ingresso senza dover digitare la password. Da Centro di controllo – Am-
ministrazione di sistema – Gestione degli accessi nella scheda Comodità, alla voce Abilita ingresso
automatico si sceglie il nome dell’utente da autorizzare; per velocizzare ulteriormente lo si può imposta-
re come Utente preselezionato in modo che il suo nome appaia subito nel gestore degli accessi, e infine
alla voce Abilita accesso senza password si può consentire a utenti prescelti l’ingresso senza password.
In questo modo l’utente principale sarà messo nella condizione di accendere il computer e di trovarsi
automaticamente nella sua home con KDE già attivato.
Capitolo 18
La shell bash
281
282 18. La shell bash
una directory diversa, il comando ne mostrerà il contenuto. Va infine ricordato che i file system tipici di
Unix – e conseguentemente anche il modo di passare i comandi alla shell (a differenza del prompt del
DOS) – sono case sensitive, cioè sensibili alla differenza fra maiuscole e minuscole.
samiel@darkstar:$ ls -l /usr/doc/abiword-2.0.12/
totale 57
-rw-r--r-- 1 root root 5 2002-10-01 19:45 BUILD.TXT
-rw-r--r-- 1 root root 6216 2003-03-18 08:23 BiDiReadme.txt
-rw-r--r-- 1 root root 17980 2002-04-15 15:25 COPYING
-rw-r--r-- 1 root root 557 1998-10-21 21:54 COPYRIGHT.TXT
-rw-r--r-- 1 root root 14958 2004-03-18 01:58 CREDITS.TXT
-rw-r--r-- 1 root root 1248 1999-11-16 01:11 README.TXT
drwxr-xr-x 2 root root 616 2004-10-19 08:38 docs/
Nella prima riga è indicato lo spazio occupato dalla directory, in blocchi da 1024 KB. Le righe
successive sono organizzate in colonne.
Nella prima colonna, il trattino (-) indica che si tratta di un file, la d di una directory, mentre la l
indicherebbe i link simbolici. Le lettere che seguono indicano i permessi del file.
La seconda colonna indica il numero di collegamenti fisici al file. Ogni file ha almeno un collegamen-
to fisico, che è il nome originale del file, mentre ogni directory ne ha almeno due, e cioè il nome della
directory, visibile dalla directory superiore, e il file speciale . (punto) situato nella directory stessa, che
indica la directory corrente quando si è al suo interno.
La terza e quarta colonna indicano utente e gruppo a cui il file (o la directory) appartiene.
La quinta colonna indica le dimensioni del file in byte.
La sesta colonna indica la data e l’ora dell’ultima modifica.
La settima e ultima colonna contiene il nome del file (o della directory).
L’opzione -a mostra i file (e le directory) nascosti (quelli il cui nome inizia col punto).
L’opzione -R mostra le directory in modo ricorsivo, cioè con le loro eventuali subdirectory; se l’e-
lenco è lungo, conviene combinarlo con more o less (nella forma ls ...| more oppure ls ...| less).
Reindirizzato a wc, nella forma ls | wc -l, conta i file contenuti nella directory, anziché indicarli per
nome.
L’opzione -F consente di distinguere i file dalle directory facendo seguire al nome di queste ultime
una barra (/); inoltre dettaglia i tipi di file, ponendo un asterisco (*) dopo i file eseguibili e il simbolo
«at» (@) dopo i link simbolici.
18.3. Comandi di base della bash 283
Se nella directory di destinazione esiste un file con lo stesso nome, esso viene automaticamente so-
vrascritto. La stessa procedura si adotta per spostare una directory. Quando si precisa la destinazione,
la directory da copiare diventa una subdirectory di quella di destinazione.
In maniera del tutto analoga al comando cp, anche a proposito di mv l’opzione -f forza lo sposta-
mento, sovrascrivendo sempre e senza messaggi di avviso, mentre l’opzione -i fa sì che il programma
avverta che è già presente un file con lo stesso nome e chieda se si desidera effettivamente sovrascriver-
lo. Per rendere stabile questo meccanismo di sicurezza, si può creare un alias che trasformi stabilmente
il comando mv in mv -i.
Si possono convertire in lettere minuscole i nomi di file scritti in maiuscole col comando chcase, che
in realtà non è un comando della shell, ma uno script in Perl non incluso in Slackware e scaricabile da
Internet. Il comando non trasforma i nomi delle directory, a meno che non si aggiunga l’opzione -d.
Questo comando compie invece l’operazione contraria, dal minuscolo al maiuscolo, con l’opzione -u.
Nei sistemi Unix, i nomi dei file possono essere costituiti da lettere maiuscole, minuscole e da caratteri
alfanumerici. Le estensioni non sono necessarie, ma all’occorrenza possono essere tradizionali (il che
favorisce l’identificazione del tipo del file), come .txt o .jpeg, oppure inventate, o anche multiple, come
potrebbe essere .txt.back. In ogni caso, i file sono riconosciuti dalle applicazioni indipendentemente dalla
presenza dell’estensione.
Il comando which
Il primo è il comando which, che esegue la sua ricerca all’interno del path dell’utente e restituisce la
prima occorrenza del programma cercato con il relativo percorso assoluto. Se però il file non si trova nel
path dell’utente o comunque in una directory a cui egli abbia accesso, esso non verrà individuato. Ad
esempio, il comando which bash dà come output:
/usr/bin/bash
Il comando whereis
Il secondo è il comando whereis, che funziona in modo analogo a which, ma è in grado di cercare
anche pagine di manuale e file sorgenti. Ad esempio, Il comando whereis bash dà come output:
Il comando find
Il terzo è il comando find, che permette di cercare qualunque cosa all’interno del sistema, da cui
deriva una sua certa lentezza. Richiede però dei parametri in più, ossia almeno il path dove effettuare
la ricerca (sempre che sia accessibile all’utente che effettua la ricerca) e il criterio. Quest’ultimo viene
precisato mediante numerose opzioni.
Se il criterio è rappresentato dal nome del file, allora l’opzione sarà -name, seguita dal nome che
intendiamo trovare; essa distingue tra maiuscolo e minuscolo, cosicché, se volessimo effettuare la ricer-
ca prescindendo dalla distinzione fra maiuscole e minuscole, adotteremmo l’opzione -iname. Valgono
qui tutti i caratteri jolly. Ad esempio, per cercare in tutto il sistema la posizione del file bash si usa il
comando: find / -name bash.
18.3. Comandi di base della bash 285
L’opzione -regex cerca invece quei file i cui nomi corrispondono a un’espressione regolare o a un
modello che descrive una serie di stringhe.
L’opzione -size seguita dalla dimensione (di default fissata in blocchi di 512 byte) cerca i file in
relazione alla dimensione specificata. Se essa è preceduta dal segno più (+), la corrispondenza viene
stabilita coi file di dimensione maggiore di quella indicata, se preceduta dal segno meno (-) coi file di
dimensioni minori; se invece non si aggiunge nessun prefisso, la corrispondenza verrà cercata con i file
che corrispondono esattamente alla dimensione indicata. Se si preferisce indicare la dimensione in byte,
si farà seguire il numero dal suffisso b, oppure k per i kilobyte. Ad esempio, find ∼ -size -500b cerca
nella /home i file di dimensioni inferiori a 500 byte.
L’opzione -S consente di ordinare i file in base alle dimensioni, in ordine decrescente. Per trovare
quelli di dimensione minori si adotta invece l’opzione -Sr (che inverte l’elenco). In questi casi l’opzione
-l fa sì che sia possibile leggere anche le dimensioni dei file.
L’opzione -empty trova i file vuoti, e può essere utile per cancellarli.
Le opzioni -mtime e -mmin cercano i file modificati in un lasso di tempo indicato rispettivamente
in ventiquattro ore e in minuti, posto come numero dopo l’opzione. Anche in questo caso si possono
stabilire corrispondenze maggiori, uguali o minori degli argomenti forniti con una procedura del tutto
analoga a quella indicata per -size. Ad esempio, find /opt -mtime -1 cercherà quei file in /opt che
sono stati modificati entro le ultime 24 ore, mentre find /usr/bin -mmin 5 cercherà quei file in /usr/bin
che sono stati modificati esattamente 5 minuti prima della ricerca.
L’opzione -daystart cerca i file modificati a partire dal giorno corrente. È inoltre possibile fissare
come criterio di ricerca un intervallo; ad esempio, il comando find ∼ -mtime 2 -mtime 4 -daystart
cerca i file modificati da due a quattro giorni prima di quando viene effettuata la ricerca.
Un’opzione utilissima soprattutto negli script è -exec. Serve per eseguire il comando passato come
argomento di -exec ai file trovati da find. Ad esempio, per trovare nella directory /documenti tutti i file
di estensione .txt e per visualizzare le righe di questi file che contengono la stringa «parola» si darà il
comando:
find ∼/prova/ -name '*.txt'-exec grep parola '{} '\;
Se invece si vuole che find richieda la conferma dell’esecuzione per ciascun file trovato, in luogo
dell’opzione -exec si adotta -ok. Per svolgere la stessa operazione, con richiesta di conferma per ogni
visualizzazione, si darà il comando:
find ∼/prova/ -name '*.txt'-ok grep parola '{} '\;
Vi sono ancora molte opzioni, per cercare i file secondo il proprietario, i gruppi, i permessi e altre
ancora, per le quali si faccia ricorso alla pagina man di find.
Il comando locate
Il quarto è il comando locate. Esso produce i medesimi risultati di find, ma piuttosto che ricercare
nel sistema opera mediante un database (presente in /var/lib/slocate/slocate.db) ed è perciò decisamente
più veloce. Com’è ovvio, il database non esiste già, e va creato col comando locate -u[v]; l’opzione -v
può essere utile per seguire lo sviluppo del processo, che è tanto più lungo quanto più numerosi sono i
file presenti nel sistema e che registra tutti i file delle unità montate.
Locate è configurato per essere aggiornato automaticamente alle 4:40AM, ma può essere aggiornato
anche manualmente col comando updatedb [-v].
Tale comando non richiede parametri aggiuntivi, solo il nome del file da cercare.
momento. Se il file esiste già, touch aggiorna il timestamp, cioè la data e l’ora di creazione a quella
corrente.
Il comando rmdir cancella una directory solo se è vuota; se essa contiene dei file, il comando fallisce.
In questo caso, si deve adoperare invece il comando rm, eventualmente accompagnato dall’opzione -r se
la directory contiene delle subdirectory, per effettuare un’eliminazione ricorsiva. L’opzione -f rimuove
tutti i file senza chiedere conferma, mentre l’opzione -i chiede conferma per ciascun file. Se, in modo
improprio, sono specificate entrambe le opzioni -f e -i, il comando considera quella indicata per ultima.
La gestione dei file e delle directory può avvalersi anche dei cosiddetti «caratteri jolly»: i principali
sono l’asterisco *, le parentesi quadre [ ] e l’apice semplice '. Si adottano anche altri operatori, come le
graffe { e }.
Il simbolo * indica qualsiasi tipo e numero di caratteri arbitrari. Pertanto, nome* si riferisce a tutto ciò
(file e/o directory) che inizia con la stringa «nome»; tty* indica tutti i file tty; doc* potrebbe indicare i file
doc1, doc2, documento1, documento2, doc_1, doc_2 ecc.; m*d* potrebbe indicare i file miodocumento,
martedì, ecc.; *.c indica tutti i file di estensione .c. L’espressione *.* , tipica di Windows per indicare
tutti i file, non va usata nello stesso modo, in quanto in GNU/Linux essa indica soltanto tutti i file e le
directory contenenti un carattere punto (.).
Il simbolo ' indica un solo carattere alfanumerico arbitrario. Dunque nome'xx indica tutti i file o
directory che iniziano con la stringa «nome», terminano con la stringa «xx» e hanno nel mezzo uno e un
solo qualsiasi carattere.
Il simbolo [ ] indica tutti valori indicati o compresi tra graffe; se separati dal trattino, tali valori
indicano l’intervallo compreso fra i due estremi. Dunque nome[1-4] indica tutto ciò che inizia con la
stringa «nome» e che termina con un numero da 1 a 4 (perciò: «nome1», «nome2»,«nome3», «nome4»).
La stringa nome[1a] indica tutto ciò che inizia con la stringa «nome» e che termina col numero da 1 o
con la lettera a. Ad esempio, in una directory contenente i file doc1, doc2, documento1, documento2,
docA, docB, la stringa doc[1A] identificherebbe soltanto i file doc1 e docA. Una lettera preceduta da
punto esclamativo invece esclude quel carattere. Pertanto a[!b]c indica tutti i file che iniziano con a e
terminano con c e che comprendono al loro interno ogni carattere, tranne b.
Le graffe inseriscono sulla parte precedente, su quella seguente oppure su entrambe. Ad esem-
pio, il comando: touch prova{1,2,3} crea i file prova1, prova2 e prova3, mentre il comando: touch
opera{tore,zione}.txt crea i file operatore.txt e operazione.txt.
I caratteri jolly possono essere usati anche in combinazione: il comando: ls *.[co] avrò come output
l’elenco di tutti i file la cui estensione è .c oppure .o.
Se si deve usare uno di questi caratteri come tale e non come jolly, cioè non si vuole che la shell
lo espanda, lo si deve inserire fra virgolette semplici. Ad esempio, il comando: echo * stampa a video
il contenuto della directory corrente, mentre se si vuole stampare proprio e solo l’asterisco, si darà il
comando echo '*'. Se il testo contiene virgolette semplici da non espandere (come un apostrofo), la
stringa andrà a sua volta racchiusa fra virgolette doppie. L’opzione noglob, infine, disattiva stabilmente
i caratteri speciali della shell. Una volta impostata tale opzione, i caratteri *, ', [ , ] e ∼ non verranno più
espansi se presenti all’interno di un file. Ciò serve qualora ci si voglia riferire a dei file che contengono,
nel loro nome, tali caratteri.
288 18. La shell bash
$ individua la corrispondenza con la fine di riga (ad esempio, $a individua «a» solo quando esso è
l’ultimo carattere della riga).
L’uso di queste espressioni consente di effettuare molteplici ricerche. Abbiamo visto che per visua-
lizzare le righe che iniziano con un determinato testo si utilizza ^. Ad esempio, il comando: grep ^abc
/home/documenti/file.txt cercherà tutte le righe di file.txt che iniziano con la stringa esatta «abc».
Invece il comando: grep -i ^abc /home/documenti/file.txt cercherà tutte le righe di file.txt che
iniziano con la stringa «abc» indipendentemente dalle maiuscole o minuscole.
Per visualizzare le righe che finiscono con un determinato testo si utilizza $. Ad esempio, il co-
mando: grep $abc /home/documenti/file.txt cercherà tutte le righe di file.txt che terminano con la
stringa esatta «abc». Invece il comando: grep -i $abc /home/documenti/file.txt cercherà tutte le ri-
ghe di file.txt che terminano con la stringa «abc» indipendentemente dalle maiuscole o minuscole (grazie
all’opzione -i di grep).
Per visualizzare le righe di una determinata lunghezza si usa il punto (.) racchiuso fra i simboli del-
l’accento circonflesso (^) e del dollaro ($); tanti devono essere i punti quanti i caratteri. Ad esempio, il
comando: grep ^...$ /home/documenti/file.txt cercherà tutte le righe di file.txt che hanno una lun-
ghezza di tre caratteri. Ciò è naturalmente scomodo se le righe sono composte da numerosi caratteri. In
questo caso conviene usare il costrutto ^.numero_righe $, mentre il simbolo della virgola (,) specifica un
intervallo. Così, mentre grep ^.\25$ /home/documenti/file.txt cercherà in quel file le righe lunghe
25 caratteri e infine grep ^. \ 25,\ \ /home/documenti/file.txt cercherà le righe pari a venticinque
o più caratteri.
Per visualizzare le righe che contengono una qualsiasi espressione regolare, si usa |, ossia l’operatore
di alternanza. Ad esempio, il comando: grep acb|def /home/documenti/file.txt cercherà le righe di
file.txt dove compaiono le stringhe «abc» o «def».
iniziare la visualizzazione dalla riga n. È anche possibile vedere la parte finale di un file in progressione,
cioè scritto da un altro processo, e il cui output si modifica continuamente; in questo caso il processo
si interrompe col comando Ctrl+c. Il comando echo, invece, visualizza un testo specificato a schermo;
la stringa da visualizzare va specificata dopo il comando stesso. Di default, echo visualizza la stringa
e stampa una nuova linea vuota dopo la stringa, a meno che non si aggiunga l’opzione -n, la quale
impedisce alla riga di essere inviata allo standard output.
che spesso riesce in effetti a individuare correttamente di quale tipo di file si tratta. Ad esempio, il
comando: file /boot/boot_message.txt darà come output:
Se il file è compresso con gzip, per scoprire il formato del file originale si adotta l’opzione -z. Ad es.,
l’output di file per un file di questo tipo sarà:
Il comando dmesg
Se quanto cerchiamo non sono solo informazioni sulle periferiche PCI, ma su tutto il sistema (dunque
relative anche a periferiche USB, SCSI, configurazione della memoria, CPU ecc.), allora ricorreremo al
comando dmesg, che registra tutto quello che viene rilevato dal kernel. Come abbiamo visto, la lettura
dell’output viene facilitata reindirizzandolo mediante | less. È inoltre possibile filtrare l’output con
grep, se si intendono cercare informazioni su un solo tipo di periferiche. Si avranno così, ad esempio, i
comandi:
dmesg | grep -i usb
dmesg | grep -i isa
dmesg | grep -i hd
dmesg | grep -i memory
dmesg | grep -i cpu
e via dicendo.
cat /proc/cpuinfo
cat /proc/meminfo
cat /proc/modules
cat /proc/partitions
cat /proc/scsi/scsi
e via dicendo. Per assumere tali informazioni, bisogna affidarsi per l’appunto a cat, oppure a utilità
progettate espressamente come sysctl, lspci, ps e top; pager come less e more producono un quadro
lievemente diverso, perché rileggono /proc a ogni pagina. Ricorrere invece a un editor di testo o a un’uti-
lità capace di scrivere su disco è molto pericoloso, perché potrebbe compromettere l’intero sistema. Una
curiosità: se si vuol sentire il rumore prodotto dalla CPU, si può lanciare il comando cat /proc/kcore
> /dev/dsp, magari con gli altoparlanti a volume basso. . .
un file vuoto perché ha innanzitutto creato un nuovo file elenco.txt (vuoto) sovrascrivendo il vecchio, e
quindi ne ha mostra il contenuto (nullo).
È anche possibile redirigere lo standard input, benché sia piuttosto raro dal momento che gran par-
te dei comandi di GNU/Linux accetta i nomi di file come argomenti. Ad esempio, il comando head
/proc/cpuinfo potrebbe essere riscritto come: head < /proc/cpuinfo. Lo stdin può essere rediretto
per ottenere i dati da un file, anziché dalla tastiera; ad esempio, il comando cat < file.txt mostra il
contenuto del file in questione.
È spesso comodo redirigere a un file (o magari alla stampante) l’errore standard (stderr), un flusso
aggiuntivo a scopo diagnostico. Proviamo a dare il comando ls /aaaaaaa; poiché nella nostra ipotesi
questa directory non esiste, a schermo leggeremo: «No such file or directory». Se redirigiamo lo stdout
a un file, col comando: ls /aaaaaaa > elenco.txt, troveremo questo file ovviamente vuoto, ma conti-
nueremo a leggere sullo schermo il messaggio di errore. Per redirigere quest’ultimo a un file, si adotta
la formula 2>. Il comando diventa allora: ls /aaaaaaa > elenco.txt 2> errori.txt. Infatti > indica
lo stream ID1, che è lo stdout, mentre 2> indica lo stream ID2, e cioè l’errore standard. A questo punto
avremo creato il file elenco.txt sempre vuoto, e il file errore.txt. contenente il messaggio di errore che
prima compariva a schermo. Anche in questo caso l’operatore 2>> aggiunge l’output al file preesistente,
anziché sovrascriverlo.
È infine possibile redirigere più flussi allo stesso file, ad esempio sia lo stout sia lo sterr col carattere
di redirezione &>; avremo così, ad esempio, il comando: ls /aaaaaaa > elenco.txt 2>&1.
Ciò può essere utile, come abbiamo visto, quando si compila un pacchetto di ampie dimensioni e non
si vuole stare sempre davanti al video per controllare eventuali messaggi che, inoltre, scorrono assai ve-
loci. Alla fine, leggeremo con comodo o l’intero processo (ad esempio, sh nano.SlackBuild --cleanup
> nano.txt) o soltanto gli eventuali errori (sh nano.SlackBuild --cleanup 2> errori_nano.txt)
18.6.4 Il piping
Per redirezionare il comando non a un file, bensì a un altro comando, si usa la pipe, cioè l’operato-
re |. Si digiti il comando head /proc/cpuinfo. L’output consiste in alcune informazioni sulla CPU del
computer, che leggiamo a schermo. Se invece dalla nostra home diamo il comando head /proc/cpuinfo
> cpuinfo.txt, troveremo un file con quel contenuto, compiendo una semplice redirezione. Ma se di-
gitiamo head /proc/cpuinfo | tr a-z A-Z (il comando tr cambia le maiuscole in minuscole), e cioè
redirigiamo l’output di head al comando tr, otterremo a schermo che tutte le lettere minuscole (a-z)
sono state trasformate in maiuscole.
Allo stesso modo, il comando ls | lpr redirige l’output del comando ls alla stampante invece
che allo schermo (e cioè stampa l’elenco invece di visualizzarlo), mentre per stampare il testo di un
file si darà cat file.txt | lpr. Si possono infine combinare anche più comandi. Ad esempio, sort
elenco.txt | cat -n | lpr legge il file elenco.txt e lo ordina, quindi lo invia alla stampante.
294 18. La shell bash
Sezione Descrizione
1 Comandi utente
2 Chiamate di sistema a basso livello
3 Documentazione sulla libreria di programmazione Unix di livello superiore
4 Informazioni sulle interfacce e i driver di periferica
5 Descrizione dei file di configurazione del sistema
6 Giochi
7 Formati di file, convenzioni e codifiche (ASCII, suffissi ecc.)
8 Comandi di sistema e server
Se un comando viene considerato in più sezioni, si può leggere quella che interessa precisandola fra
man e nome_comando , ad esempio: man 2 mount.
Le pagine man possono essere visualizzate col supporto del colore ricorrendo a un pager (cioè
un’utilità di impaginazione) come most. In /etc/profile andrà inserita la riga:
export PAGER="most"
e di conseguenza i nomi dei file e i link ad altre pagine man appariranno di un colore diverso rispetto
a quello del testo, facilitando la consultazione, mentre si vedrà il numero della riga in cui è posizionato
il cursore e la percentuale del testo già scorso.
pagine man, tale che spesso corrisponde a un manuale vero e proprio. Per sapere quali testi info sono
presenti nel sistema e quali sono i comandi principali, si digita info senza opzioni. Per leggere un ma-
nuale info, si digita info comando . In questo caso, se la pagina esiste, si apre il cosiddetto nodo top, che
presenta i collegamenti ai vari capitoli del manuale o nodi info. Ogni nodo info contiene i collegamenti
ai paragrafi, e così via. I collegamenti sono indicati dal simbolo dell’asterisco (*), seguito dal nome del
nodo e da uno o due simboli del doppio punto (::). Per andare a un nodo info si usano le freccette e
quindi Invio, mentre per uscire si usa il tasto q. Per leggere un file specifico si adotta l’opzione -f, e per
leggere un nodo specifico l’opzione -n. Una pagina info non presente nella posizione canonica, e cioè
in /usr/info, può comunque essere decompressa al volo e letta aggiungendo l’opzione -r. Se invece la
pagina non esiste, info presenta la corrispondente pagina man.
Scheda n. 27
Le shell di Slackware
In Slackware sono presenti le seguenti shell:
Le C shell (csh) sono un tipo di shell usate nei sistemi Unix, originariamente sviluppate da Bill Joy
per il sistema BSD. La shell C deriva dalla sesta versione di sh, che si è sviluppata quindi come shell
Bourne, ma la sua sintassi è modellata su quella del linguaggio di programmazione C. La shell C è stata
potenziata rispetto ai suoi predecessori, fra l’altro abilitando gli alias e la history dei comandi. Le shell
C sono state sopravanzate da shell come la Tenex C shell (tcsh), le Korn shell (ksh) e la bash. Le shell
Bourne shell sono un tipo di shell utilizzato tipicamente sui sistemi Unix e Unix-like, come alternativa
alle C shell. Il loro nome deriva dal loro inventore, Stephen Bourne; per convenzione, tutte le shell di
tipo Bourne vengono indicate con il suffisso sh. La più celebre Bourne shell è bash (acronimo di «Bourne
Again SHell»), sviluppata dalla Free Software Foundation col fine di riunire i vantaggi delle Bourne
shell, C shell (csh) e Korn shell (ksh). Pur introducendo molte innovazioni nell’interazione con l’utente,
lo scripting delle C shell è stato sottoposto a diverse critiche da più parti; poiché tuttavia la presenza di
una Bourne shell è garantita in tutti i sistemi compatibili Unix, ha preso sempre più piede lo scripting di
tipo sh.
logout – ∼/.bash_logout; di conseguenza vengono reimpostate a root tutte le variabili di ambiente. Infat-
ti a seguito del comando su - vengono eseguiti diversi compiti amministrativi, come impostare lo UID
e il GID della tty. Se esiste, la variabile d’ambiente TERM viene conservata, a differenza delle altre variabili
d’ambiente (a meno che non si specifichi l’opzione -p). Quindi vengono reimpostate le variabili d’am-
biente HOME, PATH, SHELL, TERM, MAIL e LOGNAME. PATH viene predefinito come /usr/local/bin:/bin:/usr/bin:
per gli utenti normali e come /sbin:/bin:/usr/sbin:/usr/bin: per root.
Come abbiamo accennato, vi sono infine le shell di logout, atte a compiere una serie di operazioni
all’uscita dalla sessione. Può esserci una shell globale di logout, quella richiamata in /etc/rc.d/r.0 alle
righe:
questo ∼/.bash_profile dovrebbero essere presenti almeno le variabili di ambiente ENV e BASH_ENV, e
inoltre i comandi relativi alla gestione della shell stessa che ricorrono a stty, eventuali modifiche o ag-
giunte al PATH (se invece compiute all’interno di ∼/.bashrc, queste ultime dovrebbero apparire come
delle assegnazioni del tipo "PATH=∼/bin:/bin/:/usr/bin:. . . " piuttosto che come la semplice defizio-
ne del PATH e dunque "PATH=∼/bin:\$PATH. . . "), la riassegnazione delle variabili speciali contenute in
/etc/profile e l’assegnazione di variabili speciali nuove.
Alcune applicazioni fanno partire il terminale sempre e comunque come subshell o shell di login;
ad esempio Konsole di KDE segue questo comportamento. In genere, è possibile distinguere empiri-
camente i due tipi di shell dal prompt: un prompt come: user@host:∼/$ indica che si tratta di una
shell di login, mentre un prompt come bash-3.00$ indica che si tratta di una shell di non login. Ciò
si può verificare facilmente: personalizziamo in un certo modo il prompt della shell di login mediante
∼/.bash_profile e in un altro modo quello della shell interattiva di non login mediante ∼/.bashrc. Quindi
lanciamo Konsole. Vedremo che il suo prompt è quello definito in ∼/.bash_profile. Se, sempre da Konso-
le, apriamo una sessione con la voce «Nuova console Linux» il prompt sarà quello definito in ∼/.bashrc.
Si può aprire direttamente una shell di non login con xterm (presente in Slackware) oppure con Aterm
o Eterm (che invece non vi sono contenute).
#!/bin/bash -i
Va infine ricordato che gli alias non accettano parametri in forma complessa. Per superare questo
limite, bisogna ricorrere a delle funzioni. Ad esempio:
18.9. Le variabili 299
function gzless()
{
gzip -cd \$1 | less ;
}
18.9 Le variabili
18.9.1 Tipi di variabili
La variabili appartengono a tre gruppi principali:
a) variabili di ambiente: fanno parte del sistema e non serve definirle. In Slackware numerose varia-
bili di ambiente sono definite in /etc/profile. Alcune di esse, come i path, possono essere modificate
dall’interno di un programma di shell.
b) variabili incorporate: sono fornite dal sistema e non possono essere modificate
c) variabili di utente: sono definite dall’utente e possono essere modificare a piacere. In Slackware
dovrebbero essere definite in ∼/.bash_profile.
Inoltre possiamo annoverare le variabili locali, che si distinguono variabili di utente o, in un senso
ancora più ristretto, proprie di una sola sessione di shell.
echo $poeta
Virgilio
Le variabili possono essere usate per abbreviare dei comandi. Ad esempio, si può assegnare il nome
ldir a un percorso assoluto completo come /home/samiel/scritti/. A questo punto, per copiarvi un file,
basterà fare il comando: cp testo2.txt $ldir. Per verificare le variabili definite si usa il comando set
nome_variabile , mentre per eliminarne una il comando unset nome_variabile .
Tali variabili sono però locali, la cui durata è cioè legata all’esecuzione della shell nella quale sono
state definite. Inoltre, per valere anche per altri programmi, lanciati dalla shell stessa, devono essere
esportate dopo essere state definite. Avremo perciò, ad esempio, il comando: export poeta. Verificarlo
è molto semplice. Se definissimo all’interno di una shell per la variabile «poeta» il valore «Virgilio» e
quindi, da questa shell, ne lanciassimo un’altra (una sottoshell), come xterm, il comando echo $poeta
non produrrebbe alcun risultato. Se invece esportassimo quella variabile, allora la vedremmo funzionare
anche in xterm.
300 18. La shell bash
samiel@darkstar:$
samiel@darkstar:$ cd /etc
samiel@darkstar:/etc$
18.11 Il path
La variabile $PATH è una delle più importanti, in quanto fissa il percorso (in genere, i percorsi) degli
eseguibili. Se un utente cerca di lanciare un comando che corrisponde a un eseguibile non presente nel
suo path, riceverà l’avviso:
samiel@darkstar:$ ldconfig
-bash: ldconfig: command not found
Ci si può accertare dell’effettiva presenza dell’eseguibile col comando whereis, e quindi lanciarlo
indicando il percorso completo. Normalmente, alcune directory come /sbin non si trovano nel path degli
utenti perché il loro uso è riservato a root. Si può comunque rendere possibile anche agli utenti l’accesso
a queste directory, aggiungendo il relativo path al loro ∼/.bash_profile, nel modo seguente:
PATH=$PATH:/sbin
Esso ci dice il programma richiamato col suo intero percorso, il nome del file, l’errore specifico. Di
norma, se compaiono diversi errori, il più rilevante o quello di base è il primo. I messaggi di errore vanno
distinti dai semplici avvisi («WARNING»). Questi ultimi indicano la presenza di qualcosa di errato, che
però non impedisce il (quasi) regolare svolgimento del comando. Analizziamo alcuni errori fra i più
comuni e le strategie di soluzione.
No such file or directory si è cercato di accedere a un file o a una directory che non esiste.
File exists si è cercato di creare un file o una directory che esiste già.
Not a directory, Is a directory si è cercato di usare un file come se fosse una directory o una directory
come se fosse un file. Ad esempio, si crei il file a con touch a. Si cerchi quindi di creare il file b
con touch a/b. Un messaggio ci avvertirà che a/b non è una directory. In questo caso è necessario
interpretare il messaggio, perché in effetti è solo a a non essere una directory.
No space left on device si cerca di avviare un processo che occupa spazio (come quando si tenta di
creare un file nuovo su di un dispositivo che non ha più spazio libero).
Permission denied si è cercato di effettuare un’operazione su un file o una directory su cui non si ha
autorizzazione di accesso.
Operation not permitted si è cercato di terminare un processo di cui non si ha la proprietà.
Segmentation fault, Bus error il primo errore spesso deriva da un errore presente nel programma (dun-
que responsabilità del programmatore, non del sistema che sta eseguendo quel programma). Di
norma l’errore di segmentazione deriva dal fatto che il programma ha cercato di accedere a una
parte della memoria che non poteva utilizzare. L’errore di bus invece deriva dal fatto che si usa la
memoria in modo non consentito.
#!/bin/sh
#!/bin/csh
Un esempio molto elementare di script per bash che chiamiamo qui myalias è il seguente:
#!/bin/sh
alias ll='ls -l'
alias ldir='ls -aF'
alias copy='cp'
che altro non è, se non l’assegnazione di alcuni alias. Tale script può essere eseguito volta per volta
(mediante i comandi sh myalias se non è eseguibile, oppure ./myalias se è eseguibile). In alternativa,
opportunamente collocato, esso attiverà gli alias a ogni avvio del sistema.
root@darkstar:# who
samiel tty1 Apr 4 10:29
sabina tty3 Apr 4 12:40
root tty2 Apr 4 12:38
Questo comando è limitato agli utenti presenti sul sistema locale, e non include quelli che hanno
effettuato l’ingresso dalla rete, individuabili col comando finger.
Il comando w è analogo a who, ma fornisce una maggiore quantità di dettagli:
root@darkstar:# w
12:41:39 up 2:21, 3 users, load average: 1,06, 0,53, 0,20
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
samiel tty1 - 10:29 2:11m 0.04s 0.00s /bin/sh /bin/sh
sabi tty3 - 12:4 1:27 0.02s 0.00s /bin/sh /usr/X1
root tty2 - 12:8 2:34 0.03s 0.00s emacs
Nella prima riga si leggono l’ora corrente del sistema, da quanto esso è attivo (up), il numero degli
utenti. Nelle righe successive sono elencati gli utenti connessi, il terminale che stanno adoperando, la
sessione X se presente, l’ora della connessione o login, il tempo per cui sono rimasti inattivi, i programmi
che stanno utilizzando.
Il comando last elenca gli utenti che si sono connessi di recente al sistema, mentre seguito dal nome
di un utente visualizza data e ora del suo ultimo accesso. Esso trae i dati dal file /var/log/wtmp, che indica
nell’ultima riga, assieme all’ora e alla data da cui esso parte.
304 18. La shell bash
samiel@darkstar:$ ps
PID TTY TIME CMD
7305 pts/2 00:00:00 bash
7316 pts/2 00:00:00 ps
Più in dettaglio, la voce PID (acronimo di «Process IDentifier) precisa il numero unico identificativo
del processo stesso. La voce TTY mostra il terminale su cui stanno girando i processi; se sono attivati
tutti sullo stesso terminale, ogni voce darà lo stesso tty. La voce TIME indica il tempo di CPU impiegato
dal processo per partire; poiché in genere sono presenti nel sistema molti processi che lavorano tutti
allo stesso tempo, ciascuno di essi impegna solo una piccola porzione del tempo della CPU. Un tempo
particolarmente lungo di avvio, nell’ordine dei minuti, è un dato sospetto e in genere sintomo di qualche
problema del sistema. Infine, la voce CMD mostra l’eseguibile da cui dipende il processo.
Per ottenere una completa lista dei processi attivi nel sistema, si aggiungono al comando ps ulteriori
opzioni: l’opzione [-]a mostra tutti i processi di tutti gli utenti del sistema, tranne quelli che non sono
associati a nessun terminale e i cosiddetti «group leaders» (un group leader è il primo membro di una
serie di processi correlati). L’opzione [-]u mostra tutti i processi associandoli ai vari utenti, indicati
con l’ID o col nome (si tratta di un output «user-oriented»). L’opzione [-]x mostra tutti i processi che
non sono associati a nessun terminale, come i demoni (e infatti nella colonna TTY invece del terminale
apparirà un punto di domanda). Vediamo alcuni esempi.
samiel@darkstar:$ ps -ax
PID TTY STAT TIME COMMAND
1 ? S 0:00 init [3]
2 ? SN 0:00 [ksoftirqd/0]
3 ? S< 0:00 [events/0]
4 ? S< 0:00 [khelper]
9 ? S< 0:00 [kthread]
.
.
.
4919 tty1 Ss 0:00 -bash
4920 tty2 Ss+ 0:00 /sbin/agetty 38400 tty2 linux
4921 tty3 Ss+ 0:00 /sbin/agetty 38400 tty3 linux
4922 tty4 Ss+ 0:00 /sbin/agetty 38400 tty4 linux
4923 tty5 Ss+ 0:00 /sbin/agetty 38400 tty5 linux
4924 tty6 Ss+ 0:00 /sbin/agetty 38400 tty6 linux
5241 tty1 S+ 0:00 /bin/sh /usr/X11R6/bin/startx
.
.
.
6091 pts/1 Ss+ 0:00 -bash
6105 ? R 0:00 konsole [kdeinit] konsole ls
6107 pts/2 Ss 0:00 -bash
18.14. Utenti e processi 305
Qui notiamo in più la colonna STAT, che indica lo stato di un processo. Le possibilità sono:
D: indica i processi che sono «dormienti» e che non possono essere attivati con nuovi input
I: indica i processi inattivi («idle»)
N: indica i processi a bassa priorità
R: indica i processi attualmente in atto («running»)
S: indica i processi «dormienti» in attesa di nuovi input («sleeping»)
T: indica i processi interrotti («traced»)
Z: indica i processi defunti, cioè quelli di cui è morto il processo padre, che però non è riuscito a
distruggerli («killarli») in modo appropriato; essi sono detti «zombie».
A quest’ultimo proposito, ricordiamo che l’opzione -l aggiunge informazioni su quali processi padre
hanno avviato ciascun processo figlio.
Per visualizzare graficamente in modo più chiaro la dipendenza dei processi, è utile il comando
pstree.
La colonna COMMAND indica il nome del comando che ha avviato il processo.
Informazioni ancora più dettagliate si ottengono col comando ps [-]aux:
samiel@darkstar:$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 668 228 ? S 22:11 0:00 init [3]
root 2 0.0 0.0 0 0 ? SN 22:11 0:00 [ksoftirqd/0]
root 3 0.0 0.0 0 0 ? S< 22:11 0:00 [events/0]
root 4 0.0 0.0 0 0 ? S< 22:11 0:00 [khelper]
root 9 0.0 0.0 0 0 ? S< 22:11 0:00 [kthread]
.
.
.
root 3351 0.0 0.0 1528 468 ? Ss 22:12 0:00 /usr/sbin/gpm -m
mysql 4848 0.0 1.4 317756 14808 ? S 22:12 0:00 /usr/libexec/mysq
mysql 4849 0.0 1.4 317756 14808 ? S 22:12 0:00 /usr/libexec/mysq
mysql 4850 0.0 1.4 317756 14808 ? S 22:12 0:00 /usr/libexec/mysq
mysql 4861 0.0 1.4 317756 14808 ? S 22:12 0:00 /usr/libexec/mysq
samiel 4919 0.0 0.1 3344 1892 tty1 Ss 22:12 0:00 -bash
.
.
.
samiel 6089 0.3 1.6 29148 16780 ? S 23:18 0:00 konsole [kdeinit]
samiel 6091 0.0 0.1 3344 1888 pts/1 Ss+ 23:18 0:00 -bash
samiel 6105 0.4 1.6 29148 16792 ? R 23:19 0:00 konsole [kdeinit]
samiel 6107 0.0 0.1 3344 1892 pts/2 Ss 23:19 0:00 -bash
samiel 6122 0.0 0.0 2476 844 pts/2 R+ 23:21 0:00 ps aux
Si leggono qui ulteriori notizie come sull’utente che ha avviato il processo, sulle risorse di sistema che
esso sta occupando: le colonne %CPU, %MEM, VSZ, RSS indicano rispettivamente la percentuale di potenza
del processore utilizzata nell’ultimo minuto, la percentuale di memoria usata nell’ultimo minuto, la
306 18. La shell bash
dimensione della memoria virtuale totale in KB (Virtual SiZe), i KB di memoria reale occupata (Resident
Set Size); la voce START indica il momento in cui il processo è stato avviato.
Quando le righe sono così lunghe che eccedono lo spazio orizzontale dello schermo, l’opzione -w
consente di farle andare a capo.
Per visualizzare particolari processi il cui nome contiene specifiche stringhe, si convoglia l’output
di ps a grep. Ad esempio, per visualizzare i processi i cui comandi contengono un riferimento alla
directory /sbin, il comando sarà: ps aux | grep sbin, mentre per vedere quale processo corrisponde a
un determinato PID il comando sarà: ps -p nn , dove nn è il PID del processo in questione.
Il primo numero, fra parentesi quadre, è il numero di job dell’utente; il secondo numero è il numero
che assume il processo nel sistema (il suo PID).
Si possono mettere più lavori in background, con la sintassi: comando1 [opzioni] [argomento] &;
comando2 [opzioni] [argomento] &.
Se il processo è già attivo, può essere messo in background col comando bg.
La shell comunica con il messaggio «Done» la conclusione del job in background solo quando il
job attualmente attivo è terminato, per non interromperlo; se invece si vuole essere avvisati subito e
comunque della sua conclusione, indipendentemente dal fatto di star effettuando altre operazioni, si
utilizza il comando notify, passandogli come argomento il numero del job preceduto dal simbolo di
percentuale, ad esempio notify %2.
È inoltre possibile far passare un comando in via di attuazione, e cioè in foreground, in background, o
al contrario collocare in background un job attualmente in foreground. Nel primo caso si usa il comando
18.14. Utenti e processi 307
fg: se c’è un solo job in background, esso viene portato automaticamente in foreground, mentre se ve
ne sono più di uno, è necessario specificare il numero del job preceduto dal simbolo %, ad esempio fg
%4. Il comando opposto è bg, usato di solito per riprendere i job sospesi. Questo comando accetta come
argomento sia il numero del job, sia quello del processo.
Sospendere un job
La sospensione di un job si ottiene col comando Ctrl+z, che lascia aperta la possibilità di riprenderlo
in seguito col comando fg, riportandolo cioè in foreground. La shell visualizza una riga che indica il
numero del job sospeso (fra parentesi quadre), la voce STOPPED e il nome del comando relativo a quel
job.
Terminare un job
Per arrestare un job in foreground prima del suo completamento, si usa il comando Ctrl+c, che
fa uscire dal programma. Si può anche adottare il comando kill, seguito dal numero del job sempre
preceduto da %, oppure dal numero del processo.
308 18. La shell bash
Capitolo 19
Sono qui raccolte alcune delle tante procedure per settaggi particolari, alcune tipiche di Slackware,
altre dotate di più generale validità.
309
310 19. Tips & tricks
dove x è il disco fisso e n è il numero della partizione di root. Se invece il file system è Reiserfs, allora il
comando risulta essere: mkinitrd -c -k 2.6.10 -m Reiserfs /dev/hdan .
Serve un po’ di lavoro in più se il disco fisso dove risiede la partizione di root è SATA, perché bi-
sogna far sì che initrd carichi anche il relativo supporto. In questo caso, poiché i driver sono tutti pre-
senti nel pacchetto dei moduli, bisogna lanciare un comando del tipo: mkinitrd -c -k 2.6.17.13 -m
libata:ata_piix:jbd:ext3 -f ext3 -r /dev/sda2, posto qui che il file system sia EXT3, la partizio-
ne di root sia /dev/sda2 e che il modulo che supporta il controller del disco fisso sia piix:jbd. I moduli per
i dischi fissi SATA sono tutti presenti in /lib/modules/2.6.17.13/kernel/drivers/scsi.
Dopo aver costruito initrd, si deve aggiornare il file /etc/lilo.conf aggiungendo nella sezione «# Linux
bootable partition config begins» le seguenti righe:
image = /boot/vmlinuz-generic-2.6.17.13
initrd = /boot/initrd.gz
root = /dev/hdxn
label = Linux-2.6
read-only
Al solito, si deve lanciare lilo [-v] per aggiornare l’MBR. Al riavvio, sarà possibile scegliere uno
dei due kernel. Questo procedimento installa nella directory /boot i nuovi vmlinuz, config e System.map,
ma non anche i sorgenti (che si collocano in /usr/src): di conseguenza, non sarà possibile ricompilare
questo kernel senza installare separatamente, in un secondo momento, i sorgenti stessi.
image = /boot/vmlinuz-2.6.17.13
root = /dev/sda2
label = Slackware-2.6
read-only
image = /boot/vmlinuz-2.4.33.3
root = /dev/sda2
label = Slackware-2.4
read-only
append="hda=ide-scsi"
19.2. Velocizzare l’avvio di Slackware 311
Se si installano i driver per l’accelerazione grafica, si dovrà seguire una procedura specifica perché
essi siano operanti con entrambi i kernel.
Nel caso di una scheda grafica ATI si effettuerà l’installazione tradizionale ripetendola per entrambi
i kernel.
Nel caso di una scheda grafica Nvidia si effettuerà l’installazione tradizionale con uno dei due kernel
e si ripeterà col secondo aggiungendo l’opzione -K, di modo che il comando per lanciare l’installer
risulterà: sh NVIDIA-Linux-x86-1.0-8756-pkg1.run -K. Con tale procedura, infatti, l’installer compila
solo il modulo del kernel e non, in aggiunta, quello per X.
dove si vede già la riga col comando messo in background. Allo stesso modo la riga:
/sbin/ldconfig
/sbin/ldconfig &
e infine la riga:
/usr/X11R6/bin/fc-cache
diventerà:
/usr/X11R6/bin/fc-cache &
È necessario fare attenzione alla codifica da adottare, qualora si usi un editor che supporta varie
codifiche (come Kwrite o Kate), nella fattispecie Unicode (UTF-8), o il file non riuscirà ad essere letto,
generando all’avvio un messaggio di errore («command not found»). La procedura appena descritta vale
per la shell di login e per i terminali non grafici. Per avere il tastierino acceso all’avvio nei vari Window
Manager, è necessario impostare la relativa preferenza (in KDE da Centro di controllo – Periferiche –
Tastiera, alla voce BlocNum all’avvio di KDE bisogna selezionare Acceso).
Il primo ci invita a registrarci come utenti GNU/Linux presso il sito http://counter.li.org, una sorta di
anagrafe per quantificare il numero degli utenti. L’iscrizione, che non comporta alcun obbligo, consente
di registrare sia l’utente sia il suo computer a fini puramente statistici.
Il secondo scritto affronta diversi problemi di configurazione dell’hardware: porte parallele e seriali,
masterizzatori, stampanti, mouse e modem.
Come leggere queste due e-mail? Ci sono due possibilità. Dal momento che esse sono state redatte
con pine (un client e-mail da riga di comando), possiamo richiamare il programma stesso col comando:
pine. Se è la prima volta che lo avviamo, riceveremo un messaggi di benvenuto da cui usciremo col tasto
e e quindi col cursore (oppure premendo il tasto i) andremo alla voce MESSAGE INDEX, dove troveremo
i due messaggi in questione. Si esce infine da pine premendo il tasto q e confermando. In alternativa,
possiamo richiamare col comando: mail l’omonimo programma testuale di posta elettronica. Con i tasti
1 e 2 si richiameranno le due e-mail e col tasto Invio se ne scorrerà il testo.
#!/bin/bash
if ! mozilla -remote "openurl($1,new-window)"
then
exec mozilla $1
fi
salvarlo in una directory qualsiasi, chiamarlo a piacere e renderlo eseguibile con il comando chmod
a+x. Infine dobbiamo settarlo come default browser in OpenOffice o in StarOffice al menu Strumen-
ti – Opzioni – Programmi ausiliari – Attiva i collegamenti con HTTP, indicando ovviamente l’intero
percorso dello script.
Vorrei qui ringraziare Loris, il maintainer di slacky.it, e Giorgio (Useless), con la loro accurata cono-
scenza dei sistemi Unix, che hanno pazientemente letto versioni preparatorie di questo scritto a caccia
dei miei errori, suggerendomi importanti correzioni, integrazioni e modifiche.
Ringrazio inoltre Paoletta per i suggerimenti sul capitolo dedicato a connettività e reti, Christian Eric
(Chrix), Liquid e Firetux per i rilievi sul capitolo dedicato a Samba.
Infine, ringrazio Luigi Carusillo, autore fra l’altro di alcune significative guide su LATEX, che mi ha
aiutato nella preparazione del codice di questo documento.
Resta inteso che la responsabilità finale di Slackware for dummies è soltanto mia. Ogni segnalazio-
ne, consiglio o richiesta sono sempre ben accetti. L’Autore è contattabile al seguente indirizzo e-mail:
[email protected].
Dedico questa guida alla mia famiglia: a mia moglie Sabina, che spesso è andata a dormire da sola
mentre io continuavo a dedicarmi a Slackware, a mia figlia Francesca, che mi ha spento per gioco il
computer, facendomi perdere tutto il lavoro fatto, solo due o tre volte, e al piccolo Luca, arrivato da
pochi mesi.
319
320 Ringraziamenti
The GNU General Public License
Everyone is permitted to copy and distribute verbatim copies of this license document, but changing
it is not allowed.
Abstract
The licenses for most software are designed to take away your freedom to share and change it. By
contrast, the GNU General Public License is intended to guarantee your freedom to share and change
free software – to make sure the software is free for all its users. This General Public License applies to
most of the Free Software Foundation’s software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by the GNU Library General Public
License instead). You can apply it to your programs, too.
When we speak of free software, we are referring to freedom, not price. Our General Public Licenses
are designed to make sure that you have the freedom to distribute copies of free software (and charge
for this service if you wish), that you receive source code or can get it if you want it, that you can change
the software or use pieces of it in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or
to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the
recipients all the rights that you have. You must make sure that they, too, receive or can get the source
code. And you must show them these terms so they know their rights.
We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which
gives you legal permission to copy, distribute and/or modify the software.
Also, for each author’s protection and ours, we want to make certain that everyone understands that
there is no warranty for this free software. If the software is modified by someone else and passed on,
we want its recipients to know that what they have is not the original, so that any problems introduced
by others will not reflect on the original authors’ reputations.
Finally, any free program is threatened constantly by software patents. We wish to avoid the danger
that redistributors of a free program will individually obtain patent licenses, in effect making the pro-
gram proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone’s
free use or not licensed at all.
The precise terms and conditions for copying, distribution and modification follow.
321
322 The GNU General Public License
1. You may copy and distribute verbatim copies of the Program’s source code as you receive it, in any
medium, provided that you conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License
and to the absence of any warranty; and give any other recipients of the Program a copy of this
License along with the Program.
You may charge a fee for the physical act of transferring a copy, and you may at your option offer
warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion of it, thus forming a work
based on the Program, and copy and distribute such modifications or work under the terms of
Section 1 above, provided that you also meet all of these conditions:
(a) You must cause the modified files to carry prominent notices stating that you changed the
files and the date of any change.
(b) You must cause any work that you distribute or publish, that in whole or in part contains or
is derived from the Program or any part thereof, to be licensed as a whole at no charge to all
third parties under the terms of this License.
(c) If the modified program normally reads commands interactively when run, you must cause
it, when started running for such interactive use in the most ordinary way, to print or dis-
play an announcement including an appropriate copyright notice and a notice that there is
no warranty (or else, saying that you provide a warranty) and that users may redistribute
the program under these conditions, and telling the user how to view a copy of this License.
(Exception: if the Program itself is interactive but does not normally print such an announce-
ment, your work based on the Program is not required to print an announcement).
These requirements apply to the modified work as a whole. If identifiable sections of that work are
not derived from the Program, and can be reasonably considered independent and separate works
in themselves, then this License, and its terms, do not apply to those sections when you distribute
them as separate works. But when you distribute the same sections as part of a whole which is a
work based on the Program, the distribution of the whole must be on the terms of this License,
The GNU General Public License 323
whose permissions for other licensees extend to the entire whole, and thus to each and every part
regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely
by you; rather, the intent is to exercise the right to control the distribution of derivative or collective
works based on the Program.
In addition, mere aggregation of another work not based on the Program with the Program (or
with a work based on the Program) on a volume of a storage or distribution medium does not
bring the other work under the scope of this License.
3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code
or executable form under the terms of Sections 1 and 2 above provided that you also do one of the
following:
(a) Accompany it with the complete corresponding machine-readable source code, which must
be distributed under the terms of Sections 1 and 2 above on a medium customarily used for
software interchange; or,
(b) Accompany it with a written offer, valid for at least three years, to give any third party, for
a charge no more than your cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be distributed under the terms
of Sections 1 and 2 above on a medium customarily used for software interchange; or,
(c) Accompany it with the information you received as to the offer to distribute corresponding
source code. (This alternative is allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such an offer, in accord with
Subsection b above.)
The source code for a work means the preferred form of the work for making modifications to
it. For an executable work, complete source code means all the source code for all modules it
contains, plus any associated interface definition files, plus the scripts used to control compilation
and installation of the executable. However, as a special exception, the source code distributed
need not include anything that is normally distributed (in either source or binary form) with the
major components (compiler, kernel, and so on) of the operating system on which the executable
runs, unless that component itself accompanies the executable.
If distribution of executable or object code is made by offering access to copy from a designated
place, then offering equivalent access to copy the source code from the same place counts as dis-
tribution of the source code, even though third parties are not compelled to copy the source along
with the object code.
4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided
under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License. However, parties who have
received copies, or rights, from you under this License will not have their licenses terminated so
long as such parties remain in full compliance.
5. You are not required to accept this License, since you have not signed it. However, nothing else
grants you permission to modify or distribute the Program or its derivative works. These actions
are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the
Program (or any work based on the Program), you indicate your acceptance of this License to do
so, and all its terms and conditions for copying, distributing or modifying the Program or works
based on it.
324 The GNU General Public License
6. Each time you redistribute the Program (or any work based on the Program), the recipient auto-
matically receives a license from the original licensor to copy, distribute or modify the Program
subject to these terms and conditions. You may not impose any further restrictions on the recip-
ients’ exercise of the rights granted herein. You are not responsible for enforcing compliance by
third parties to this License.
7. If, as a consequence of a court judgment or allegation of patent infringement or for any other
reason (not limited to patent issues), conditions are imposed on you (whether by court order,
agreement or otherwise) that contradict the conditions of this License, they do not excuse you
from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your
obligations under this License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent license would not permit royalty-
free redistribution of the Program by all those who receive copies directly or indirectly through
you, then the only way you could satisfy both it and this License would be to refrain entirely from
distribution of the Program.
If any portion of this section is held invalid or unenforceable under any particular circumstance,
the balance of the section is intended to apply and the section as a whole is intended to apply in
other circumstances.
It is not the purpose of this section to induce you to infringe any patents or other property right
claims or to contest validity of any such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is implemented by public license practices.
Many people have made generous contributions to the wide range of software distributed through
that system in reliance on consistent application of that system; it is up to the author/donor to
decide if he or she is willing to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to be a consequence of the rest
of this License.
8. If the distribution and/or use of the Program is restricted in certain countries either by patents
or by copyrighted interfaces, the original copyright holder who places the Program under this
License may add an explicit geographical distribution limitation excluding those countries, so that
distribution is permitted only in or among countries not thus excluded. In such case, this License
incorporates the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions of the General Public
License from time to time. Such new versions will be similar in spirit to the present version, but
may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Program specifies a version number
of this License which applies to it and “any later version”, you have the option of following the
terms and conditions either of that version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of this License, you may choose
any version ever published by the Free Software Foundation.
10. If you wish to incorporate parts of the Program into other free programs whose distribution con-
ditions are different, write to the author to ask for permission. For software which is copyrighted
by the Free Software Foundation, write to the Free Software Foundation; we sometimes make ex-
ceptions for this. Our decision will be guided by the two goals of preserving the free status of all
derivatives of our free software and of promoting the sharing and reuse of software generally.
N O WARRANTY
The GNU General Public License 325
11. B ECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE , THERE IS NO WARRANTY FOR THE PRO -
GRAM , TO THE EXTENT PERMITTED BY APPLICABLE LAW. E XCEPT WHEN OTHERWISE STATED IN
WRITING THE COPYRIGHT HOLDERS AND / OR OTHER PARTIES PROVIDE THE PROGRAM “ AS IS ”
WITHOUT WARRANTY OF ANY KIND , EITHER EXPRESSED OR IMPLIED , INCLUDING , BUT NOT LIM -
ITED TO , THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PUR -
POSE . T HE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU .
S HOULD THE PROGRAM PROVE DEFECTIVE , YOU ASSUME THE COST OF ALL NECESSARY SERVIC -
ING , REPAIR OR CORRECTION .
12. I N NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPY-
RIGHT HOLDER , OR ANY OTHER PARTY WHO MAY MODIFY AND / OR REDISTRIBUTE THE PROGRAM
AS PERMITTED ABOVE , BE LIABLE TO YOU FOR DAMAGES , INCLUDING ANY GENERAL , SPECIAL ,
INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
PROGRAM ( INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INAC -
CURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO
OPERATE WITH ANY OTHER PROGRAMS ), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN AD -
VISED OF THE POSSIBILITY OF SUCH DAMAGES .
This program is free software; you can redistribute it and/or modify it under the terms of the
GNU General Public License as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WAR-
RANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this pro-
gram; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
MA 02110-1301, USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this when it starts in an interactive
mode:
Gnomovision version 69, Copyright (C) <year> <name of author>
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type ‘show w’.
This is free software, and you are welcome to redistribute it under certain conditions; type
‘show c’ for details.
326 The GNU General Public License
The hypothetical commands show w and show c should show the appropriate parts of the General
Public License. Of course, the commands you use may be called something other than show w and show
c; they could even be mouse-clicks or menu items – whatever suits your program.
You should also get your employer (if you work as a programmer) or your school, if any, to sign a
“copyright disclaimer” for the program, if necessary. Here is a sample; alter the names:
This General Public License does not permit incorporating your program into proprietary programs.
If your program is a subroutine library, you may consider it more useful to permit linking proprietary
applications with the library. If this is what you want to do, use the GNU Library General Public License
instead of this License.