Diritto d'autore © 2007-2010 Osamu Aoki
Questa guida di riferimento Debian, Debian Reference (v2) (2011-02-26 17:58:45 UTC) è pensata per fornire un'ampia panoramica del sistema Debian in qualità di guida post-installazione per l'utente. Copre molti aspetti dell'amministrazione di sistema attraverso esempi di uso di comandi di shell, pensati per chi non è sviluppatore.
Sommario
Questo testo è libero; lo si può ridistribuire e/o modificare nei termini della GNU General Public License in qualsiasi versione aderente alle Linee guida Debian per il Software Libero (DFSG).
Indice
$LANG
"$PATH
"$HOME
"apt-get
/ apt-cache
-
aptitude
$LANG
"Lista delle tabelle
ls -l
"
chmod
(1)
$HOME
"
aptitude
(8) e apt-get
(8)
/apt-cache
(8)
aptitude
(8)
dpkg
pam_unix
(8)
/etc/passwd
"
/etc/network/interfaces
"
net-tools
ai
nuovi comandi iproute2
ls
-l
" per lenny
/etc/fstab
"
cvs
(1))
svn
(1))
bsdmainutils
e coreutils
Questa guida di riferimento Debian Reference (versione 2) (2011-02-26 17:58:45 UTC) è pensata per fornire un'ampia panoramica dell'amministrazione di un sistema Debian in qualità di guida post-installazione per l'utente.
Si rivolge ad un lettore che abbia voglia di imparare gli script di shell, ma che non è pronto a leggere tutti i sorgenti C per scoprire come funzioni il sistema GNU/Linux.
Non viene fornita alcuna garanzia. Tutti i marchi registrati appartengono ai rispettivi proprietari.
Il sistema Debian è, di per sé, un'entità in continuo movimento; ciò rende difficile alla sua documentazione essere aggiornata e corretta. Sebbene come base per questo testo sia stata usata la versione "unstable" al momento della sua stesura, alcuni contenuti potrebbero essere obsoleti al momento della sua lettura.
Si consideri questo documento come un riferimento secondario. Esso non sostituisce nessuna guida autorevole. L'autore e i collaboratori non si assumono responsabilità per le conseguenze di errori, omissioni o ambiguità presenti in questo documento.
Il Progetto Debian è un'associazione di individui che hanno fatto causa comune per creare un sistema operativo libero. La sua distribuzione è caratterizzata dai seguenti aspetti.
unstable
e
testing
.
I vari pezzi di Software Libero in Debian provengono da GNU, Linux, BSD, X, ISC, Apache, Ghostscript, Common Unix Printing System , Samba, GNOME, KDE, Mozilla, OpenOffice.org, Vim, TeX, LaTeX, DocBook, Perl, Python, Tcl, Java, Ruby, PHP, Berkeley DB, MySQL, PostgreSQL, Exim, Postfix, Mutt, FreeBSD, OpenBSD, Plan 9 e molti altri progetti software liberi indipendenti. Debian integra questa diversità del Software Libero in un unico sistema.
Nella stesura di questo documento sono state seguite le seguenti linee guida.
Si è cercato di spiegare aspetti gerarchici e i più bassi livelli di funzionamento del sistema.
Il lettore deve fare lo sforzo di cercare risposte da solo andando oltre questa documentazione. Questo documento fornisce solo degli efficaci punti di partenza.
Il lettore deve cercare le soluzioni da solo dalle fonti primarie.
/usr/share/doc/<nome_pacchetto>
".
dpkg -L <nome_pacchetto> |grep '/man/man.*/'
" .
dpkg -L <nome_pacchetto> |grep '/info/'
" .
Per una documentazione dettagliata può essere necessario installare il
corrispondente pacchetto di documentazione il cui nome ha il suffisso
"-doc
" .
Questo documento fornisce informazioni attraverso il seguente stile
semplificato di rappresentazione con esempidi comandi per la shell
bash
(1).
# <comando nell'account root> $ <comando nell'account utente>
Questi prompt di shell distinguono gli account usati e corrispondono a ciò
che si ottiene impostando le variabili d'ambiente in questo modo:
"PS1='\$'
" e "PS2=' '
". Questi valori
sono stati scelti per aumentare la leggibilità del documento e non sono
quelli tipici di una reale installazione del sistema.
Si veda il significato delle variabili d'ambiente "$PS1
"
e "$PS2
" in bash
(1).
Le azioni che gli amministratori di sistema devono eseguire sono scritte all'infinito, ad esempio "Premere il tasto Invio dopo ogni stringa di comando digitata nella shell."
La colonna descrizione ed altre simili in tabelle possono contenere un sintagma nominale che segue le convenzioni per le descrizioni brevi dei pacchetti e che perde l'articolo iniziale quali "un" ed "il". Le colonne possono, in alternativa, contenere una verbo al presente seguendo la convenzione usata nella descrizione breve dei comandi nelle a pagine man. Questa scelta potrà apparire strana per qualcuno, ma fa parte della scelta deliberata dell'autore di mantenere più semplice possibile lo stile di questa documentazione. In entrambi i casi l'iniziale non è maiuscola e manca il punto finale seguendo le dette convenzioni per le descrizioni brevi.
I nomi propri, inclusi i nomi dei comandi mantengono la corretta iniziale maiuscola/minuscola indipendentemente dalla loro posizione.
Un breve comando citato all'interno di un
paragrafo di testo viene reso dal carattere a spaziatura fissa racchiuso tra
virgolette doppie come in "aptitude safe-upgrade
".
Dati testuali da un file di
configurazione citati all'interno di un paragrafo di testo vengono resi dal
carattere a spaziatura fissa racchiuso tra virgolette doppie come in
"deb-src
".
Un comando viene reso dall'uso del
carattere a spaziatura fissa per il suo nome, seguito opzionalmente dalla
numero di sezione della sua pagina man tra parentesi, come in
bash
(1). Ci si senta incoraggiati ad ottenere ulteriori
informazioni digitando quanto segue.
$ man 1 bash
Una pagina man viene resa dall'uso del
carattere a spaziatura fissa per il suo nome seguito dal numero della sua
sezione nelle pagine man racchiuso tra parentesi, come in
sources.list
(5). Ci si senta incoraggiati ad ottenere
ulteriori informazioni digitando quanto segue.
$ man 5 sources.list
Una pagina info viene resa dal suo
comando corrispondente in carattere a spaziatura fissa racchiuso tra
virgolette doppie, come in "info make
". Ci si senta
incoraggiati ad ottenere ulteriori informazioni digitando quanto segue.
$ info make
Un nome di file viene reso dal carattere
a spaziatura fissa tra virgolette doppie, come in
"/etc/passwd
". Per quanto riguarda i file di
configurazione ci si senta incoraggiati ad ottenere ulteriori informazioni
digitando quanto segue.
$ sensible-pager "/etc/passwd"
Un nome di directory viene reso dal
carattere a spaziatura fissa tra virgolette doppie, come in
"/etc/init.d
". Ci si senta incoraggiati ad esplorare il
suo contenuto digitando quanto segue.
$ mc "/etc/init.d/"
Un nome di pacchetto viene reso dal
carattere a spaziatura fissa, come in vim
. Ci si senta
incoraggiati ad ottenere ulteriori informazioni digitando quanto segue.
$ dpkg -L vim $ apt-cache show vim $ aptitude show vim
La posizione di una documentazione può
essere indicata con il nome di file in carattere a spaziatura fissa tra
virgolette doppie, come in
"/usr/share/doc/sysv-rc/README.runlevels.gz
" e
"/usr/share/doc/base-passwd/users-and-groups.html
",
oppure dal suo URL, come in http://www.debian.org. Ci si senta
incoraggiati a leggere la documentazione digitando quanto segue.
$ zcat "/usr/share/doc/sysv-rc/README.runlevels.gz" | sensible-pager $ sensible-browser "/usr/share/doc/base-passwd/users-and-groups.html" $ sensible-browse "http://www.debian.org"
Una variabile d'ambiente viene resa dal
suo nome preceduto dal segno "$
" in carattere a
spaziatura fissa tra virgolette doppie, come in
"$TERM
". Ci si senta incoraggiati ad ottenere il suo
valore attuale digitando quanto segue.
$ echo "$TERM"
Un asterisco "*" posto immediatamente dopo il nome di ogni pacchetto rimanda ad un collegamento alla pagina del Sistema Debian di tracciamento dei bug (BTS) per il pacchetto.
I dati da popcon sono usati come misura oggettiva della popolarità di ciascun pacchetto. Sono stati scaricati il 2010-12-08 14:47:18 UTC e contengono i dati totali inviati da 95150 rapporti su 109197 pacchetti binari e 19 architetture.
Notare che l'archivio amd64
unstable
contiene attualmente solo 30552 pacchetti. I dati di popcon
contengono rapporti inviati da molte installazioni su sistemi vecchi.
Il numero popcon, preceduto da "V:" che sta per "voti", è calcolato così: "100 * (rapporti popcon inviati con il pacchetto eseguito di recente sul PC)/(numero totale di rapporti popcon inviati)".
Il numero popcon, preceduto da "I:" che sta per "installazioni", è calcolato così: "100 * (rapporti popcon inviati con il pacchetto installato sul PC)/(numero totale di rapporti popcon inviati)".
I numeri popcon non dovrebbero essere considerati una misura assoluta
dell'importanza dei pacchetti. Ci sono molti fattori che possono influenzare
le statistiche. Per esempio, alcuni sistemi che partecipano a popcon possono
avere montato directory quali "/bin
" con l'opzione
"noatime
" per migliorare le prestazioni di sistema,
influenzando di fatto negativamente i "voti" per quel sistema.
Anche i dati sulla dimensione dei pacchetti sono usati come misura oggettiva
per ciascun pacchetto. Sono basati sulla
"Installed-Size:
" riportata dal comando
"apt-cache show
" o "aptitude show
"
(attualmente sull'architettura amd64
per la versione
unstable
). La dimensione è riportata in KiB (Kibibyte = unità di 1024 byte).
Una piccola dimensione per un pacchetto può indicare che esso è, nella
versione unstable
un pacchetto fittizio che installa,
attraverso le dipendenze, altri pacchetti con contenuti sostanziosi. Il
pacchetto fittizio permette una transizione facile o una suddivisione di
pacchetto.
Una dimensione di pacchetto seguita da "(*)" indica che il pacchetto non è
presente nella versione unstable
ed è stata quindi usata
la dimensione del pacchetto in experimental
al suo posto.
Ecco alcune interessanti citazioni dalla mailing list di Debian che potrebbero illuminare i nuovi utenti.
<miquels at cistron.nl>
<tollef at add.no>
Penso che imparare un sistema informatico sia come imparare una lingua straniera. Anche se le guide e la documentazione sono utili, si deve fare pratica diretta. Per aiutare il lettore a iniziare dolcemente, ho elaborato alcuni punti base.
Il potente design di Debian GNU/Linux deriva dal sistema operativo Unix, cioè un sistema operativo multiutente e multitasking. Bisogna imparare a sfruttare la potenza di queste caratteristiche e le somiglianze tra Unix e GNU/Linux.
Non bisogna scappare dai testi pensati per Unix e affidarsi solamente a testi su GNU/Linux dato che in questo modo ci si priva di molte informazioni utili.
Se si è usato tramite strumenti a riga di comando un sistema *nix per un certo tempo, probabilmente si sa già tutto ciò che viene spiegato qui. Si usi questa sezione come un ripasso e per consultazioni.
All'avvio del sistema, se non è stato installato il Sistema X Window con un display manager come
gdm
, viene presentata la schermata di login a
caratteri. Supponiamo che il proprio nome host sia pippo
,
il prompt di login apparirà come segue.
pippo login:
Se è stato installato un ambiente GUI come GNOME o KDE, allora ci si può spostare ad un prompt di login premendo Ctrl-Alt-F1 e si può ritornare all'ambiente grafico con Alt-F7 (vedere Sezione 1.1.6, «Console virtuali» in seguito per maggiori informazioni).
Al prompt di login digitare il proprio nome utente, ad esmpio
pinguino
e premere il tasto Invio, poi digitare la
propria password e premere di nuovo Invio.
Nella tradizione Unix, il nome utente e la password di un sistema Debian
distinguono le lettere maiuscole dalle minuscole. Il nome utente di solito
viene scelto usando solo lettere minuscole. Il primo account utente viene
normalmente creato durante l'installazione. Account utente aggiuntivi
possono essere creati da root con adduser
(8).
Il sistema si presenta con il messaggio di benvenuto memorizzato in
"/etc/motd
" (Message Of The Day, messaggio del giorno) e
fornisce un prompt dei comandi.
Debian GNU/Linux lenny/sid foo tty1 pippo login: pinguino Password: Last login: Sun Apr 22 09:29:34 2007 on tty1 Linux snoopy 2.6.20-1-amd64 #1 SMP Sun Apr 15 20:25:49 UTC 2007 x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. pippo:~$
La parte centrale del messaggio di benvenuto può essere personalizzata
modificando il file "/etc/motd.tail
". La prima riga è
generata a partire dalle informazioni sul sistema ottenute usando
"uname -snrvm
".
Si è ora nella shell. La shell interpreta i comandi dell'utente.
Se è stato installato il Sistema X
Window con un display manager come gdm
di GNOME, selezionando l'attività "Ambiente desktop"
durante l'installazione, all'avvio del sistema viene presentata una
schermata grafica di login. Si inseriscono il nome utente e la password per
fare il login come utente non privilegiato. Usare il tasto Tab per spostarsi
dal campo del nome utente a quello della password e viceversa, oppure usare
il mouse e il clic principale.
Si può ottenere il prompt di shell sotto X avviando un programma
emulatore di terminale
come
gnome-terminal
(1), rxvt
(1) o
xterm
(1). Nell'ambiente desktop GNOME, cliccare su
"Applicazioni" → "Accessori" → "Terminale" .
Si può anche fare riferimento alla sezione Sezione 1.1.6, «Console virtuali» in seguito.
In altri sistemi Desktop (come fluxbox
), potrebbe non
esserci un punto evidente per l'apertura del menu. Se si è in questa
condizione, provare a fare clic, con il tasto destro, nel centro dello
schermo e sperare che appaia un menu.
L'account root viene anche indicato come superutente o utente privilegiato. Da questo account si possono eseguire i seguenti compiti amministrativi.
Questi poteri illimitati dell'account utente rendono necessario essere prudenti e responsabili nel loro uso.
Non comunicare mai la password di root ad altri.
I permessi di un file (inclusi i device hardware come CD-ROM, ecc. che sono nient'altro che un altro file per il sistema Debian) possono rendere il file inutilizzabile o inaccessibile per gli utenti non root. Benché usare l'account root sia un metodo veloce per affrontare questo tipo di situazione, la sua soluzione dovrebbe essere l'impostazione degli appropriati permessi e gruppi proprietari per il file (vedere Sezione 1.2.3, «Permessi del file system»).
Ecco alcuni metodi di base per ottenere il prompt di shell per root usando la password di root.
root
al prompt di login a caratteri.
Digitare "su -l
" al prompt di shell di un utente
qualsiasi.
Digitare "su
" al prompt di shell di un utente qualsiasi.
Quando il menu del desktop non avvia gli strumenti con interfaccia grafica
per l'amministrazione di sistema con i privilegi appropriati, si può
avviarli dal prompt di shell di root dell'emulatore di terminale per X,
quali gnome-terminal
(1), rxvt
(1) o
xterm
(1). Vedere Sezione 1.1.4, «Il prompt di shell di root»
e Sezione 7.8.4, «Eseguire client X come root».
Non avviare mai il gestore di sessioni/display manager di X dall'account
root inserendo root
al prompt di un display manager come
gdm
(1).
Non eseguire mai in X Window programmi con interfaccia utente grafica non fidati da remoto quando sono visualizzate informazioni critiche, dato che potrebbero spiare lo schermo X.
Nel sistema Debian standard, ci sono sei console a caratteri in stile VT100 disponibili tra cui ci si può
spostare per avviare una shell di comando direttamente sull'host Linux. A
meno che non si sia in un ambiente con interfaccia grafica, si può passare
da una console virtuale all'altra usando simultaneamente il
tasto_Alt_sinistro
e uno dei tasti F1
— F6
. Ogni console a caratteri permette un login
indipendente nell'account e offre un ambiente multiutente. L'ambiente
multiutente è una bellissima caratteristica di Unix e ci si può abituare
presto a dipendere da esso.
Se si è nel Sistema X Window, si accedere alla console a caratteri 1
premendo i tasti Ctrl-Alt-F1
, cioè premendo
contemporaneamente il tasto_Ctrl_sinistro
, il
tasto_Alt_sinistro
e il tasto_F1
. Si
può tornare al Sistema X Window, che di solito è in esecuzione sulla console
virtuale 7, premendo Alt-F7
.
In alternativa ci si può spostare in un'altra console virtuale, per esempio la console 1, dalla riga di comando.
# chvt 1
Si digita Ctrl-D
, cioè il
tasto_Ctrl_sinistro
e il tasto_d
vengono premuti contemporaneamente al prompt dei comandi per chiuderà
l'attività della shell. Se si è nella console a caratteri, in questo modo si
ritorna al prompt di login. Anche se questi caratteri di controllo vengono
indicati con le lettere maiuscole, come "control D", non è necessario
premere il tasto Maiusc. Per indicare Ctrl-D
viene anche
usata l'espressione abbreviata ^D
. In alternativa si può
digitare "exit".
In quest'ultimo modo, se si è in un emulatore di terminale
(x-terminal-emulator
(1)), lo si può chiudere
Esattamente come ogni altro SO moderno in cui le operazioni su file comportano una cache dei dati in memoria per migliorare le prestazioni, il sistema Debian ha bisogno della appropriata procedura di spegnimento prima che l'alimentazione possa essere staccata in modo sicuro. Questo serve a preservare l'integrità dei file, forzando la scrittura su disco di tutti i cambiamenti avvenuti in memoria. Se è disponibile il controllo software dell'alimentazione, la procedura di spegnimento automaticamente toglie l'alimentazione al sistema. (In caso contrario può essere necessario tener premuto per alcuni secondi il tasto di accensione/spegnimento.)
Si può spegnere il sistema dalla riga di comando nella normale modalità multiutente.
# shutdown -h now
Si può spegnere il sistema dalla riga di comando nella modalità single-user.
# poweroff -i -f
In alternativa, se "/etc/inittab
" contiene
"ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -h now
" al suo
interno, per spegnere si può digitare Ctrl-Alt-Canc
(il
tasto_Ctrl_sinistro
, il
tasto_Alt_sinistro
e Canc
sono premuti
contemporaneamente). Per i dettagli vedere inittab
(5).
Quando, dopo aver fatto qualcosa di strano come "cat
<un-qualche-file-binario>
", lo schermo impazzisce digitare
"reset
" al prompt dei comandi. Mentre lo si digita il
comando potrebbe non essere visualizzato. Si può anche usare
"clear
" per pulire lo schermo.
Sebbene anche l'installazione minima del sistema Debian, senza alcun
ambiente desktop, fornisca le funzionalità Unix di base è una buona idea
installare con apt-get
(8) alcuni pacchetti aggiuntivi per
la riga di comando e i terminali a caratteri basati su curses, come
mc
e vim
con cui i principianti
possono fare i primi passi. Eseguire i comandi seguenti.
# apt-get update ... # apt-get install mc vim sudo ...
Se questi pacchetti sono già installati, nessun nuovo pacchetto sarà installato.
Tabella 1.1. Elenco di pacchetti con interessanti programmi in modalità testuale
pacchetto | popcon | dimensione | descrizione |
---|---|---|---|
mc
*
|
V:12, I:28 | 6508 | Gestore di file testuale a tutto schermo |
sudo
*
|
V:42, I:71 | 668 | Programma per garantire privilegi di root limitati agli utenti |
vim
*
|
V:15, I:33 | 1792 | Editor di testi Unix Vi IMproved, un editor di testi per programmatori (versione standard) |
vim-tiny *
|
V:16, I:92 | 776 | Editor di testi Unix Vi IMproved, un editor di testi per programmatori (versione compatta) |
emacs23 *
|
V:3, I:4 | 13016 | Emacs dal progetto GNU, l'editor di testi estensibile basato su Lisp (versione 23) |
w3m
*
|
V:24, I:84 | 1992 | Browser Web testuali |
gpm
*
|
V:3, I:4 | 484 | Taglia e Incolla in stile Unix nella console testuale (demone) |
Potrebbe essere una buona idea leggere un po' di documentazione.
Tabella 1.2. Elenco di pacchetti con documentazione interessante
pacchetto | popcon | dimensione | descrizione |
---|---|---|---|
doc-debian *
|
I:82 | 408 | Documentazione del Progetto Debian, (FAQ Debian) ed altri documenti |
debian-policy *
|
I:3 | 3500 | Manuale Debian Policy e documenti correlati |
developers-reference *
|
I:1.0 | 1388 | Linee guida ed informazioni per gli sviluppatori Debian |
maint-guide *
|
I:0.7 | 776 | Guida Debian per il nuovo Manutentore |
debian-history *
|
I:0.3 | 3736 | Storia del Progetto Debian |
debian-faq *
|
I:66 | 1224 | FAQ Debian |
doc-linux-text *
|
I:82 | 8616 | HOWTO e FAQ di Linux (testo semplice) |
doc-linux-html *
|
I:0.7 | 62564 | HOWTO e FAQ di Linux (html) |
sysadmin-guide *
|
I:0.2 | 964 | Guida per l'amministratore di sistema Linux |
Si possono installare alcuni di questi pacchetti usando i comandi seguenti.
# apt-get install nome_pacchetto
Se non si vuole usare il proprio account utente principale per le
esercitazioni descritte in seguito, si può creare un account utente per
esercitarsi, ad esempio pesce
con il comando seguente.
# adduser pesce
Rispondere a tutte le domande.
In questo modo si crea un nuovo account chiamato
pesce
. Dopo aver fatto pratica si può rimuover questo
account e la sua directory home digitando quanto segue.
# deluser --remove-home pesce
Per la tipica postazione di lavoro di un unico utente, come il sistema
desktop Debian su un PC portatile, è frequente l'uso di una semplice
configurazione di sudo
(8), come qui di seguito descritto,
per permettere all'utente non privilegiato, ad esempio
pinguino
, di ottenere privilegi di amministratore con la
sola propria password, senza quella dell'utente root.
# echo "pinguino ALL=(ALL) ALL" >> /etc/sudoers
In alternativa è uso comune usare la configurazione seguente per permettere
all'utente non privilegiato, ad esempio pinguino
, di
ottenere privilegi di amministratore senza alcuna password.
# echo "pinguino ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
Questo trucco dovrebbe essere usato esclusivamente per le postazioni di lavoro con un solo utente, in cui l'utente è anche l'amministratore.
Non impostare account per utenti regolari su postazioni di lavoro multi-utente in questo modo perché ciò sarebbe un grosso problema per la sicurezza del sistema.
Nell'esempio precedente la password e l'account di
pinguino
richiedono altrettanta protezione della password
e account dell'utente root.
I privilegi di amministrazione in questo contesto sono forniti a qualcuno che è autorizzato ad eseguire i compiti di amministrazione del sistema sulla macchina. Non dare mai tali privilegi ad un manager del dipartimento di Amministrazione della propria azienda o al proprio capo, a meno che non siano autorizzati e capaci.
Per fornire privilegi di accesso a specifici device e file, si dovrebbe
considerare l'uso dei gruppi per dare un
accesso limitato, invece di usare i privilegi di root
attraverso sudo
(8).
Con una configurazione più attenta e precisa, sudo
(8) può
garantire privilegi amministrativi limitati ad altri utenti in un sistema
condiviso, senza rendere nota la password di root. Questo può aiutare la
tracciabilità su host con più di un amministratore, in modo che si possa
dire chi ha fatto cosa. D'altra parte si potrebbe anche volere che nessuno
abbia tali privilegi.
Si è ora pronti a giocare con il sistema Debian senza rischi fintanto che si usa l'account utente non privilegiato.
Ciò è possibile perché il sistema Debian è, anche subito dopo l'installazione predefinita, configurato con i permessi dei file corretti che impediscono agli utenti non privilegiati di danneggiare il sistema. Ci possono essere naturalmente ancora dei punti deboli che possono essere sfruttati, ma chi si preoccupa di tali cose non dovrebbe leggere questa sezione ma piuttosto il manuale Securing Debian.
Si può imparare il sistema Debian, come sistema *nix nelle sezioni seguenti.
In GNU/Linux ed altri sistemi operativi *nix, i file sono
organizzati in directory. Tutti i file e
le directory sono organizzati in un unico grande albero che ha la sua radice
in "/
". Viene chiamato albero perché il file system, se
viene disegnato, ha l'aspetto di un albero però a sottosopra.
Questi file e directory possono essere sparsi su diversi
dispositivi. mount
(8) server per attaccare il file system
trovato su un qualche dispositivo al grande albero dei file. Al contrario,
umount
(8) lo stacca. Nei kernel Linux recenti
mount
(8) con alcune opzioni può collegare parte di un
albero dei file in qualche altra posizione o può montare file system come
condivisi, privati, slave o non-collegabili. Le opzioni di montaggio
supportate per ciascun file system sono disponibili in
"/share/doc/linux-doc-2.6.*/Documentation/filesystems/
".
Nei sistemi Unix vengono chiamate directory quelle che in altri sistemi sono chiamate
cartelle. Notare anche che non esiste in
nessun sistema Unix un concetto di unità,
come "A:
". C'è un solo unico file system e tutto vi è
incluso. Questo è un grandissimo vantaggio rispetto a Windows.
Ecco alcune nozioni di base sui file Unix.
MIOFILE
" e
"MioFile
" sono cioè file diversi.
/
". Non la si
confonda con la directory home dell'utente root: "/root
".
/
". La
directory radice è un'eccezione; il suo nome è "/
"
(pronunciato "slash" o "directory root/radice") e il suo nome non può essere
cambiato.
/
" e
c'è un carattere "/
" tra ciascuna directory o file nel
nome del file. Il primo carattere "/
" è la directory di
più alto livello e gli altri "/
" separano le directory
successive fino a che non si raggiunge l'ultima voce che è il nome del file
stesso. I termini usati possono creare confusione. Prendere in
considerazione come esempio il seguente nome file
pienamente qualificato come esempio:
"/usr/share/keytables/us.map.gz
"; anche se ci si
riferisce al solo nome base, "us.map.gz
" come al suo
nome file.
/etc/
" e "/usr/
". Queste
sottodirectory a loro volta si diramano in ulteriori sottodirectory, come
"/etc/init.d/
" e "/usr/local/
". Viste
tutte insieme vengono chiamate albero delle
directory. Si può pensare ad un nome file assoluto come ad un
percorso dalla base dell'albero ("/
") alla punta di un
ramo (un file). Si può anche sentir parlare dell'albero delle directory come
se fosse un albero genealogico: le
sottodirectory hanno perciò genitori e un
percorso mostra gli antenati completi di un file. Ci sono anche percorsi
relativi che iniziano da una qualche posizione che non sia la directory
radice. Si dovrebbe tenere a mente che la directory "../
"
si riferisce alla directory genitore. Questa terminologia si applica anche
ad altre strutture simili a quella delle directory, come le strutture di
dati gerarchici.
C:\
". (Esistono tuttavia directory che
si riferiscono ai dispositivi fisici come a parte del file system
normale. Vedere Sezione 1.2.2, «Aspetti tecnici del file system».)
Benché si possa usare quasi qualsiasi
lettera o simbolo nel nome di un file, in pratica farlo non è una bella
idea. È meglio evitare qualsiasi carattere che ha spesso un significato
particolare sulla riga di comando, inclusi spazi, tabulazioni, a capo e
altri caratteri speciali: { } ( ) [ ] ' ` " \ / > < | ; ! #
& ^ * % @ $
. Se si vuole separare parole all'interno di un
nome file, buone alternative sono un punto, un trattino ed il segno di
sottolineatura. Si può anche scrivere in maiuscolo ogni parola,
"InQuestoModo
". Gli utenti Linux esperti tendono ad
evitare l'uso degli spazi nei nomi dei file.
La parola "root" può significare l'"utente root" o la "directory root". Il contesto in cui il termine usato dovrebbe rendere chiaro il suo significato.
La parola percorso non è usata solamente per un nome di file pienamente qualificato come descritto in precedenza, ma anche per il percorso di ricerca dei comandi. Il significato è di solito reso chiaro dal contesto.
Le linee guida raccomandate per la gerarchia dei file sono descritte in
dettaglio nel Filesystem Hierarchy Standard
("/usr/share/doc/debian-policy/fhs/fhs-2.3.txt.gz
" e in
hier
(7)). Come inizio si dovrebbe tenere a mente quanto
segue.
Tabella 1.3. Elenco degli usi delle directory principali
directory | uso della directory |
---|---|
/
|
la directory root |
/etc/
|
file di configurazione a livello di sistema |
/var/log/
|
file di registro del sistema |
/home/
|
tutte le directory home degli utenti non privilegiati |
Nella scia della tradizione Unix, il
sistema Debian GNU/Linux fornisce il file
system in cui risiedono i dati fisici nel disco fisso e negli altri
dispositivi di memorizzazione, ed inoltre le interazioni con i dispositivi
hardware come gli schermi di console e le console seriali remote vengono
rappresentate in un modo unificato in "/dev/
".
Ogni file, directory, pipe con nome (un modo per due programmi di scambiare
dati) o dispositivo fisico presente in un sistema Debian GNU/Linux ha una
struttura di dati chiamata inode che descrive
gli attributi ad esso associati come l'utente che lo possiede
(proprietario), il gruppo a cui appartiene, la data dell'ultimo accesso ad
esso, ecc. Se si è interessati a questo aspetto, vedere
"/usr/include/linux/fs.h
per l'esatta definizione di
"struct inode
" nel sistema Debian GNU/Linux. L'idea di
rappresentare praticamente tutto nel file system è stata un'innovazione di
Unix e i kernel Linux moderni hanno sviluppato questa idea e sono andati
oltre. Ora anche le informazioni sui processi in esecuzione sul computer
possono essere trovate nel file system.
La rappresentazione astratta e unificata di entità fisiche e di processi interni è molto potente dato che permette di usare lo stesso comando per lo stesso tipo di operazione su molti tipi di device completamente diversi l'uno dall'altro. È anche possibile cambiare il modo in cui il kernel funziona scrivendo dati in file speciali che sono collegati ai processi in esecuzione.
Per identificare la corrispondenza tra l'albero dei file e le entità
fisiche, eseguire mount
(8) senza opzioni.
I permessi del file system di sistemi *nix sono definiti e influenzano tre categorie di utenti.
Per un file, a ciascun permesso corrispondono le seguenti azioni.
Per una directory, a ciascun permesso corrispondono le seguenti azioni.
In questo caso il permesso di esecuzione su una directory non solo significa poter leggere i file in quella directory ma anche poterne vedere gli attributi, come la dimensione e la data di modifica.
Per visualizzare le informazioni sui permessi (ed altro) di file e directory
si usa ls
(1). Quando chiamato con l'opzione
"-l
" mostra, nell'ordine elencato in seguito, le seguenti
informazioni.
Tabella 1.4. Elenco dei valori possibili per il primo carattere nell'output di
"ls -l
"
carattere | significato |
---|---|
-
|
file normale |
d
|
directory |
l
|
collegamento simbolico |
c
|
device a caratteri |
b
|
device a blocchi |
p
|
pipe con nome |
s
|
socket |
Per cambiare il proprietario di un file da un account root si usa
chown
(1). Per cambiare il gruppo di un file dall'account
del proprietario o da quello di root si usa chgrp
(1). Per
cambiare i permessi di accesso di file o directory dall'account del
proprietario o da quello di root si usa chmod
(1). La
sintassi di base per manipolare un file pippo
è la
seguente.
# chown <nuovoproprietario> pippo # chgrp <nuovogruppo> pippo # chmod [ugoa][+-=][rwxXst][,...] pippo
Per esempio si può fare in modo che l'utente pippo
sia il
proprietario di un albero di directory condivisa dal gruppo
pluto
con i seguenti comandi.
# cd /qualche/posizione/ # chown -R pippo:pluto . # chmod -R ug+rwX,o=rX .
Ci sono altri tre bit speciali di permessi.
Nell'output di "ls -l
" il valore di questi bit è
maiuscolo se il bit di permesso di
esecuzione nascosto da essi è non
impostato.
L'impostazione del bit set user ID per un file eseguibile permette ad un utente di eseguire quel file con l'ID del proprietario del file (per esempio root). In modo simile, l'impostazione del bit set group ID per un file eseguibile permette ad un utente di eseguire il file con l'ID del gruppo a cui appartiene il file (per esempio root). Poiché l'impostazione di questi bit può causare rischi in termini di sicurezza, il loro uso richiede una particolare cautela.
L'impostazione del bit set group ID per una directory abilita lo schema di creazione di file in stile BSD, in cui tutti i file creati nella directory appartengono al gruppo della directory.
L'impostazione dello sticky bit per una
directory impedisce la rimozione di un file nella directory da parte
dell'utente che non ne è il proprietario. Per preservare i contenuti di un
file in directory con permessi di scrittura per tutti, come
"/tmp
" o in directory con permessi di scrittura per un
gruppo, non solo si deve impostare il permesso di scrittura per il file, ma anche impostare lo
sticky bit per la directory. In caso
contrario, qualunque utente con i permessi di scrittura per la directory può
rimuovere il file crearne uno nuovo con lo stesso nome.
Ecco alcuni interessanti esempi di permessi dei file.
$ ls -l /etc/passwd /etc/shadow /dev/ppp /usr/sbin/exim4 crw------- 1 root root 108, 0 2007-04-29 07:00 /dev/ppp -rw-r--r-- 1 root root 1427 2007-04-16 00:19 /etc/passwd -rw-r----- 1 root shadow 943 2007-04-16 00:19 /etc/shadow -rwsr-xr-x 1 root root 700056 2007-04-22 05:29 /usr/sbin/exim4 $ ls -ld /tmp /var/tmp /usr/local /var/mail /usr/src drwxrwxrwt 10 root root 4096 2007-04-29 07:59 /tmp drwxrwsr-x 10 root staff 4096 2007-03-24 18:48 /usr/local drwxrwsr-x 4 root src 4096 2007-04-27 00:31 /usr/src drwxrwsr-x 2 root mail 4096 2007-03-28 23:33 /var/mail drwxrwxrwt 2 root root 4096 2007-04-29 07:11 /var/tmp
Esiste un metodo numerico alternativo per descrivere i permessi dei file con
chmod
(1); tale metodo numerico usa numero ottali (base=8)
di 3 o 4 cifre.
Tabella 1.5. Permessi in notazione numerica per i comandi chmod
(1)
cifra | significato |
---|---|
1ª cifra opzionale | somma di set user ID (=4), set group ID (=2) e sticky bit (=1) |
2ª cifra | somma dei permessi di lettura (=4), scrittura (=2) e esecuzione (=1) per l'utente |
3ª cifra | come sopra, ma per ilgruppo |
4ª cifra | come sopra, ma per gli altri |
Sembra complicato, ma è in realtà piuttosto semplice. Se si guardano le
prime colonne (2-10) nell'output del comando "ls -l
" e le
si leggono come una rappresentazione binaria (base=2) dei permessi sui file
(dove "-" equivale a "0" e "rwx" equivalgono a "1"), le ultime 3 cifre del
valore numerico dei permessi dovrebbero apparire come la corretta
rappresentazione dei permessi sui file in numerazione ottale (base=8).
Per esempio, provare a fare quanto segue.
$ touch pippo pluto $ chmod u=rw,go=r pippo $ chmod 644 pluto $ ls -l pippo pluto -rw-r--r-- 1 pinguin pinguino 17 2007-04-29 08:22 pippo -rw-r--r-- 1 pinguin pinguino 12 2007-04-29 08:22 pluto
Se si deve aver accesso alle informazioni visualizzate da "ls
-l
" in script di shell, si dovrebbero usare i comandi pertinenti,
come test
(1), stat
(1) e
readlink
(1). Si possono usare anche i comandi interni
della shell come "[
" o "test
".
I permessi che vengono applicati ad un file o una directory appena creati
sono limitati dal comando interno della shell
umask
. Vedere dash
(1),
bash
(1) e builtins
(7).
(permessi del file) = (permessi del file richiesti) & ~(valore di umask)
Tabella 1.6. Esempi di valori di umask
umask | permessi dei file creati | permessi delle directory create | uso |
---|---|---|---|
0022
|
-rw-r--r--
|
-rwxr-xr-x
|
scrivibile solo dall'utente |
0002
|
-rw-rw-r--
|
-rwxrwxr-x
|
scrivibile solo dal gruppo |
Il sistema Debian usa, in modo predefinito, uno schema UPG (User Private
Group, gruppo privato dell'utente). Ogni volta che viene aggiunto un nuovo
utente al sistema, viene creato un UPG; questo ha lo stesso nome dell'utente
per il quale è stato creato e quell'utente è l'unico membro dell'UPG. Lo
schema UPG rende sicura l'impostazione della umask a 0002
dato che ogni utente ha il proprio gruppo privato. (In alcune varianti di
Unix è abbastanza comune impostare tutti gli utenti normali come
appartenenti ad un unico gruppo users ed è
in quel caso una buona idea impostare umask a
0022 per
ragioni di sicurezza.)
Per far sì che i permessi di un gruppo siano applicati ad un particolare
utente, tale utente deve essere inserito come membro del gruppo usando
"sudo vigr
".
In alternativa, si possono aggiungere dinamicamente gli utenti ai gruppi
durante il processo di autenticazione aggiungendo la riga "auth
optional pam_group.so
" al file
"/etc/pam.d/common-auth
" e configurando
"/etc/security/group.conf
". (Vedere Capitolo 4, Autenticazione.)
I dispositivi hardware sono, in un sistema Debian, semplicemente un altro tipo di file. Se si hanno problemi ad accedere a dispositivi quali CD-ROM e chiavette USB da un account utente, si dovrebbe inserire quell'utente nel gruppo appropriato.
Alcuni importanti gruppi pre-impostati dal sistema permettono ai loro membri
l'accesso a file e device particolari senza i privilegi di
root
.
Tabella 1.7. Elenco dei principali gruppi forniti dal sistema per accesso ai file
gruppo | descrizione dei file e device accessibili |
---|---|
dialout
|
accesso diretto e completo alle porte seriali
("/dev/ttyS[0-3] ")
|
dip
|
accesso limitato alle porte seriali per connessione IP dialup a peer fidati |
cdrom
|
unità CD-ROM, DVD+/-RW |
audio
|
device audio |
video
|
device video |
scanner
|
scanner |
adm
|
registri di monitoraggio del sistema |
staff
|
alcune directory per compiti minori di amministrazione:
""/usr/local ", "/home "
|
È necessario far parte del gruppo dialout
per
riconfigurare il modem, comporre numeri, ecc. Se però
root
crea file di configurazione predefiniti per i peer
fidati in "/etc/ppp/peers/
", è necessario solamente far
parte del grupo dip
per creare una connessione IP dialup a tali peer fidati usando i comandi
pppd
(8), pon
(1) e
poff
(1).
Alcuni importanti gruppi pre-impostati dal sistema permettono ai loro membri
di eseguire particolari comandi senza i privilegi di
root
.
Tabella 1.8. Elenco dei principali gruppi forniti dal sistema per l'esecuzione di particolari comandi
gruppo | comandi accessibili |
---|---|
sudo
|
eseguire sudo senza password
|
lpadmin
|
eseguire comandi per aggiungere, modificare e rimuovere stampanti dal database delle stampanti |
plugdev
|
eseguire pmount (1) per dispositivi removibili come
memorie USB
|
Per l'elenco completo degli utenti e gruppi forniti dal sistema, vedere la
recente versione del documento "Utenti e gruppi" in
"/usr/share/doc/base-passwd/users-and-groups.html
"
fornito dal pacchetto base-passwd
.
Vedere passwd
(5), group
(5),
shadow
(5), newgrp
(1),
vipw
(8), vigr
(8) e
pam_group
(8) per informazioni sui comandi di gestione di
utenti e gruppi sul sistema.
Ci sono tre tipi di orari per un file GNU/Linux.
Tabella 1.9. Elenco dei tipi di data
tipo | significato |
---|---|
mtime |
orario di modifica del file (ls -l )
|
ctime |
orario di cambiamento di stato del file (ls -lc )
|
atime |
orario dell'ultimo accesso al file (ls -lu )
|
ctime non è l'orario di creazione del file.
Persino la semplice lettura di un file su un sistema Debian genera
normalmente un'operazione di scrittura sul file per aggiornare
l'informazione atime nell'inode. Montando un file system con le opzioni
"noatime
" o "relatime
" fa sì che il
sistema salti questa operazione e ciò ha come risultato un accesso ai file
in lettura più veloce. Viene spesso raccomandato per i portatili, perché
riduce l'attività del disco fisso e fa risparmiare energia. Vedere
mount
(8).
Usare il comando touch
(1) per cambiare l'orario di file
esistenti.
Per gli orari, il comando ls
produce stringhe diverse con
la moderna localizzazione in inglese ("en_US.UTF-8
")
rispetto alla vecchia ("C
").
$ LANG=en_US.UTF-8 ls -l pippo -rw-r--r-- 1 pinguino pinguino 3 2008-03-05 00:47 pippo $ LANG=C ls -l pippo -rw-r--r-- 1 pinguino pinguino 3 Mar 5 00:47 pippo
Vedere Sezione 9.2.5, «Visualizzazione personalizzata di date e orari» per
personalizzare l'output di "ls -l
".
Ci sono due metodi per associale un file "pippo
" ad un
diverso nome file "pluto
".
ln pippo pluto
"
Collegamento simbolico o symlink
ln -s pippo pluto
"
Vedere l'esempio seguente per notare i cambiamenti nel conteggio dei
collegamenti e le sottili differenze tra i risultati del comando
rm
.
$ echo "Contenuti originali" > pippo $ ls -li pippo 2398521 -rw-r--r-- 1 pinguino pinguino 20 2007-04-29 08:15 pippo $ ln pippo pluto # collegamento fisico $ ln -s pippo paperino # collegamento simbolico $ ls -li pippo pluto paperino 2398538 lrwxrwxrwx 1 pinguino pinguino 3 2007-04-29 08:16 paperino -> pippo 2398521 -rw-r--r-- 2 pinguino pinguino 20 2007-04-29 08:15 pippo 2398521 -rw-r--r-- 2 pinguino pinguino 20 2007-04-29 08:15 pluto $ rm pippo $ echo "Nuovi contenuti" > pippo $ ls -li pippo pluto paperino 2398538 lrwxrwxrwx 1 pinguino pinguino 3 2007-04-29 08:16 paperino -> pippo 2398540 -rw-r--r-- 1 pinguino pinguino 16 2007-04-29 08:17 pippo 2398521 -rw-r--r-- 1 pinguino pinguino 20 2007-04-29 08:15 pluto $ cat pluto Contenuti originali $ cat paperino Nuovi contenuti
Il collegamento fisico può essere creato all'interno dello stesso file
system e condivide uno stesso numero di inode, come rivela l'opzione
"-i
" di ls
(1).
Il collegamento simbolico ha sempre permissi di accesso nominali
"rwxrwxrwx
, come mostrato nell'esempio precedente, ma con
gli effettivi permessi di accesso stabiliti dai permessi del file a cui
punta.
In generale è una buona idea non creare collegamenti simbolici complicati o non creare collegamenti fisici per nulla, a meno di non avere una ragione molto buona per farlo. Possono diventare degli incubi quando la combinazione logica dei collegamenti simbolici crea cicli ricorsivi nel file system.
È in generale preferibile usare collegamenti simbolici piuttosto che fisici, a meno che non sia abbia una buona ragione per usare un collegamento fisico.
La directory ".
" punta alla directory in cui appare,
perciò il conteggio dei collegamenti per ogni nuova directory inizia da
2. La directory "..
" punta alla directory genitore,
perciò il conteggio dei collegamenti di una directory aumenta con l'aggiunta
di nuove sottodirectory.
Se si è appena passati da Windows a Linux, appare presto chiaro come sia ben progettato il collegamento dei nomi di file in Unix se paragonato con i collegamenti in ambiente Windows che sono l'equivalente più prossimo in quel sistema. Dato che sono implementati nel file system, le applicazioni non possono vedere alcuna differenza tra un file collegamento ed un originale. Nel caso di collegamenti fisici, non c'è realmente nessuna differenza.
Una pipe con nome è un file che si comporta da pipe. Si mette qualcosa dentro il file e questa cosa esce dall'altra parte. Questa è chiamata una FIFO (First-In-First_Out, primo ad entrare-primo ad uscire): la prima cosa che viene immessa nella pipe è la prima ad uscire dall'altra estremità.
Se si scrive su una pipe con nome, il processo che sta eseguendo la
scrittura nella pipe non termina fino a che l'informazione scritta nella
pipe non viene letta. Se si legge da una pipe con nome, il processo di
lettura attende che non ci sia più nulla da leggere prima di terminare. La
dimensione della pipe è sempre zero: non archivia dati, ma semplicemente
collega due processi come la pipe "|
" di shell. Tuttavia,
dato che questa pipe ha un nome, i due processi non devono essere nella
stessa riga di comando e nemmeno essere eseguiti dallo stesso utente. Le
pipe sono un'innovazione di Unix di grandissimo impatto.
Per esempio, provare a fare quanto segue.
$ cd; mkfifo miapipe $ echo "hello" >miapipe & # messo sullo sfondo [1] 8022 $ ls -l miapipe prw-r--r-- 1 pinguino pinguino 0 2007-04-29 08:25 miapipe $ cat miapipe hello [1]+ Done echo "hello" >miapipe $ ls miapipe miapipe $ rm miapipe
I socket sono usati moltissimo da tutte le comunicazioni Internet, da database e dal sistema operativo stesso. Sono simili alle pipe con nome (FIFO) e permettono ai processi di scambiare informazioni anche tra computer diversi. Per un socket, non è necessario che questi processi siano in esecuzione contemporaneamente, né di essere eseguiti come processi figli di uno stesso processo antenato. Questo è il punto culminante della comunicazione tra processi (IPC). Lo scambio di informazioni può avvenire sulla rete tra host diversi. I due più comuni sono il socket Internet e gli Unix domain socket.
"netstat -an
" fornisce una vista d'insieme molto utile
dei socket aperti su un dato sistema.
I file di device fanno riferimento a
dispositivi fisici o virtuali sul sistema, come i dischi fissi, la scheda
video, lo schermo o la tastiera. Un esempio di dispositivo virtuale è la
console, rappresentata da "/dev/console
".
Ci sono 2 tipi di file di device.
Device a caratteri
Device a blocchi
I file di device possono essere letti e scritti, anche se è probabile che i
file contengano dati binari che appaiono come farfuglii incomprensibili per
le persone. La scrittura diretta di dati in questi file è utile a volte per
trovare la soluzione a problemi con le connessioni hardware. Si può, per
esempio, fare il dump di un file di testo in un device di stampa
"/dev/lp0
" o inviare comandi del modem alla porta seriale
appropriata "/dev/ttyS0
". Ma, a meno che ciò non venga
fatto con cautela, può causare grandissimi disastri. Perciò essere prudenti.
Per il normale accesso ad una stampante, usare lp
(1).
I numeri di nodo dei device sono visualizzati se si esegue
ls
(1) come nell'esempio seguente.
$ ls -l /dev/hda /dev/ttyS0 /dev/zero brw-rw---- 1 root cdrom 3, 0 2007-04-29 07:00 /dev/hda crw-rw---- 1 root dialout 4, 64 2007-04-29 07:00 /dev/ttyS0 crw-rw-rw- 1 root root 1, 5 2007-04-29 07:00 /dev/zero
/dev/hda
" ha major number del device 3 e minor number
del device 0. È accessibile in lettura e scrittura dagli utenti che
appartengono al gruppo cdrom
.
/dev/ttyS0
" ha major number del device 4 e minor number
del device 64. È accessibile in lettura e scrittura dagli utenti che
appartengono al gruppo dialout
.
/dev/zero
" ha major number del device 1 e minor number
del device 5. È accessibile in lettura e scrittura da chiunque.
Nei sistemi Linux 2.6 il file system sotto "/dev
" viene
popolato automaticamente dal meccanismo udev
(7).
Ci sono alcuni file di device speciali.
Tabella 1.10. Elenco di file dei device speciali
file di device | azione | descrizione della risposta |
---|---|---|
/dev/null
|
lettura | restituisce il "carattere EOF (End of File, fine del file)" |
/dev/null
|
scrittura | non ritorna nulla (un pozzo senza fondo in cui buttare via dati) |
/dev/zero
|
lettura |
ritorna il "carattere \0 (NUL)", diverso dal numero zero
in ASCII
|
/dev/random
|
lettura | ritorna caratteri a caso da un vero generatore di numeri casuali che dà reale entropia (lento) |
/dev/urandom
|
lettura | ritorna caratteri casuali da un generatore di numeri pseudocasuali crittograficamente sicuro |
/dev/full
|
scrittura | ritorna l'errore di disco pieno (ENOSPC) |
Sono spesso usati insieme alla redirezione di shell (vedere Sezione 1.5.8, «Sequenze tipiche di comandi e ridirezione della shell»).
procfs e sysfs,
montati in "/proc
" e "/sys
" sono
pseudo-file system ed espongono strutture interne di dati del kernel nello
spazio utente. In altre parole, queste voci sono virtuali, funzionano cioè
come una comoda finestra sul funzionamento del sistema operativo.
La directory "/proc
" contiene (tra le altre cose) una
sottodirectory per ciascun processo in esecuzione sul sistema che prende
nome dall'ID del processo (PID). Le utilità di sistema, come
ps
(1), che accedono alle informazioni sui processi,
ottengono le loro informazioni da questa struttura di directory.
Le directory in "/proc/sys/
" contengono interfacce per
cambiare certi parametri del kernel durante l'esecuzione. (Si può fare la
stessa cosa tramite comandi sysctl
(8) specifici o tramite
il suo file di precaricamento/configurazione
"/etc/sysctrl.conf
".
Il kernel Linux può lamentarsi con un messaggio "Too many open files"
(troppi file aperti). Si può risolvere questo problema aumentando il valore
di "file-max
" dalla shell di root, per esempio con
"echo "65536" > /proc/sys/fs/file-max
" (questo era
necessario con i vecchi kernel).
Le persone spesso vanno in panico quando si accorgono di un file in
particolare, "/proc/kcore
" che è particolarmente
enorme. È (più o meno) una copia del contenuto della memoria del computer ed
è usato per fare il debug del kernel. È un file virtuale che punta alla
memoria del computer perciò non ci si preoccupi della sua dimensione.
La directory "/sys
" contiene strutture dati del kernel
esportate, i loro attributi e i collegamenti tra di esse. Contiene anche
interfacce per cambiare alcuni parametri del kernel durante l'esecuzione.
Vedere proc.txt(.gz)
",
"sysfs.txt(.gz)
" e altri documenti correlati nella
documentazione del kernel Linux
("/usr/share/doc/linux-doc-2.6.*/Documentation/filesystems/*
")
fornita dai pacchetti linux-doc-2.6.*
.
Midnight Commander (MC) è un "coltellino svizzero"" GNU per la console Linux ed altri ambienti in terminale. Dà ai principianti la possibilità di usare una console comandata da menu che è molto più facile da imparare dei comandi Unix standard.
Potrebbe essere necessario installare il pacchetto di Midnight Commander che
si chiama "mc
" con il seguente comando.
$ sudo apt-get install mc
Usare il comando mc
(1) per esplorare il sistema Debian. È
il modo migliore di imparare. Esplorare qualche posizione interessante
usando semplicemente i tasti freccia e il tasto Invio.
/etc
" e le sue sottodirectory
/var/log
" e le sue sottodirectory
/usr/share/doc
" e le sue sottodirectory
/sbin
" e "/bin
"
Per far sì che MC cambi la directory di lavoro in uscita e si sposti con
cd
nella directory, suggerisco di modificare
"~/.bashrc
" per includere uno scipt fornito nel pacchetto
mc
.
. /usr/share/mc/bin/mc.sh
Vedere mc
(1) (sotto l'opzione "-P
")
per capirne la ragione. (Se non è chiaro esattamento quello di cui sto
parlando, si può tornare a questo più tardi.)
MC può essere avviato nel modo seguente.
$ mc
MC si prende cura di tutte le operazioni sui file attraverso i suoi menu, richiedendo perciò solo un minimo sforzo da parte dell'utente. Premere semplicemente F1 per ottenere la schermata di aiuto. Si può giocherellare con MC premendo semplicemente i tasti freccia e i tasti funzione.
In alcune console, come gnome-terminal
(1), le battute sui
tasti funzione potrebbero essere rubate dal programma di console. Si possono
disabilitare queste funzionalità per gnome-terminal
in
"Modifica" → "Scorciatoie da tastiera".
Se si incontrano problemi di codifica dei caratteri con visualizzazione di
caratteri spazzatura, l'aggiunta dell'opzione "-a
" alla
riga di comando di MC può aiutare a prevenirli.
Se ciò non risolve i problemi di visualizzazione in MC, vedere Sezione 9.6.6, «Configurazione del terminale».
L'impostazione predefinita è con due pannelli di directory contenti gli
elenchi dei file. Un'altra utile modalità è l'impostazione della finestra
destra per contenere le "informazioni" per vedere informazioni sui privilegi
di accesso dei file, ecc. Di seguito sono elencati alcuni tasti
essenziali. Con il demone gpm
(8) in esecuzione, si può
anche usare il mouse in una console a caratteri Linux. (Assicurarsi di
premeri il tasto Maiusc per ottenere il comportamento normale di taglia e
incolla in MC.)
Tabella 1.11. Le associazioni dei tasti di MC
tasto | azione associata |
---|---|
F1
|
menu di aiuto |
F3
|
visualizzatore interno di file |
F4
|
editor interno |
F9
|
attiva il menu a tendina |
F10
|
esce da Midnight Commander |
Tab
|
sposta tra le due finestre |
Insert o Ctrl-T
|
segna il file per una operazione su più file, come la copia |
Del
|
cancella il file (essere prudenti: impostare MC per la modalità di cancellazione sicura) |
tasti freccia | intuitivi |
cd
cambia la directory mostrata nel pannello
selezionato.
Ctrl-Invio
o Alt-Invio
copia un nome
di file nella riga di comando. Usarlo con i comandi cp
(1)
e mv
(1) in congiunzione con la modifica della riga di
comando.
Alt-Tab
mostra le scelte date dall'espansione di shell
dei nomi di file.
mc /etc /root
".
Esc
+ tasto n
→ Fn
(cioè, Esc
+ 1
→
F1
, ecc.; Esc
+ 0
→
F10
)
Esc
prima di un tasto ha lo stesso effetto di
premere Alt
ed il tasto contemporaneamente; premere cioè
Esc
+ c
per
Alt-C
. Esc
è chiamato meta-tasto ed è
a volte indicato con "M-
".
L'editor interno ha un interessante schema per il taglia e incolla. La
pressione di F3
marca l'inizio di una selezione, una
seconda pressione di F3
marca la fine della selezione e
la evidenzia. Si può poi muovere il cursore. Se si preme F6, l'area
selezionata viene spostata nella posizione del cursore. Se si preme F5
l'area selezionata viene copiata ed inserita alla posizione del
cursore. F2
salva il file. F10
fa
uscire. La maggior parte dei tasti cursore funziona in modo intuitivo.
Si può avviare direttamente questo editor su di un file usando uno dei comandi seguenti.
$ mc -e nome_del_file_da_modificare
$ mcedit nome_del_file_da_modificare
Questo non è un editor multi-finestra, ma si possono usare più console Linux per ottenere lo stesso effetto. Per copiare tra finestre, usare i tasti Alt-F<n> per cambiare console virtuale e usare "File→Insert file" o "File→Copy to file" per spostare una porzione di un file in un altro file.
Questo editor interno può essere rimpiazzato da qualsiasi editor esterno a propria scelta.
Inoltre molti programmi usano la variabile d'ambiente
"$EDITOR
" o "$VISUAL
" per decidere
quale editor usare. Se inizialmente non ci si trova a proprio agio con
vim
(1) o nano
(1), si può impostare
queste variabili a "mcedit
" aggiungendo le righe seguenti
al file "~/.bashrc
".
export EDITOR=mcedit export VISUAL=mcedit
Io raccomando di impostarle a "vim
", se possibile.
Se non ci si trova a proprio agio con vim
(1), si può
continuare ad usare mcedit
(1) per la maggior parte dei
compiti di manutenzione del sistema.
MC è un visualizzatore molto intelligente. È un grande strumento per cercare
parole in documenti. Lo uso sempre per i file nella directory
"/usr/share/doc
". È il metodo più veloce per navigare tra
una massa di informazioni Linux. Questo visualizzatore può essere avviato
direttamente usando uno dei comandi seguenti.
$ mc -v percorso/del/nome_file_da_visualizzare
$ mcview percorso/del/nome_file_da_visualizzare
Se si preme Invio su di un file, un programma appropriato gestirà il contenuto del file (vedere Sezione 9.5.11, «Personalizzare i programmi da avviare»). Questa è una funzionalità molto comoda di MC.
Tabella 1.12. La reazione al tasto Invio in MC
tipo di file | reazione al tasto Invio |
---|---|
file eseguibile | esegue comando |
file man | invia i contenuti tramite pipe al software di visualizzazione |
file html | invia i contenuti tramite pipe al browser web |
file "*.tar.gz " e "*.deb "
|
naviga i suoi contenuti come se fosse una sottodirectory |
Per far sì che queste funzionalità di visualizzazione dei file e di file
virtuali funzionino, i file visualizzabili non dovrebbero essere impostati
come eseguibili. Cambiare il loro stato usando chmod
(1) o
attraverso il menu file di MC.
MC può essere usato per accedere a file in Internet usando FTP. Premere
F9
per andare nel menu, poi digitare
"p
" per attivare il file system FTP virtuale. Inserire un
URL nella forma
"nomeutente:password@nomehost.nomedominio
" e la directory
remota apparirà come una directory locale.
Provare "[http.us.debian.org/debian]" come URL e navigare nell'archivio Debian.
Anche se MC permette di fare quasi tutto, è bene imparare come usare gli strumenti a riga di comando invocati dal prompt di shell e prendere familiarità con l'ambiente di lavoro in stile Unix.
Si può selezionare la propria shell di login con chsh
(1).
Tabella 1.13. Elenco di programmi shell
pacchetto | popcon | dimensione | Shell POSIX | descrizione |
---|---|---|---|---|
bash
*
|
V:91, I:99 | 3536 | Sì | Bash: GNU Bourne Again SHell (standard de facto) |
tcsh
*
|
V:4, I:27 | 768 | No | TENEX C Shell: una versione migliorata di Berkeley csh |
dash
*
|
V:25, I:32 | 248 | Sì | Debian Almquist Shell, buona per script di shel |
zsh
*
|
V:3, I:6 | 12784 | Sì | Z shell: la shell standard con molti miglioramenti |
pdksh
*
|
V:0.2, I:1.1 | 468 | Sì | versione di dominio pubblico della Korn shell |
csh
*
|
V:0.6, I:2 | 404 | No | C Shell OpenBSD, una versione di Berkeley csh |
sash
*
|
V:0.2, I:1.0 | 856 | Sì |
Stand-alone shell con comandi interni
(non adatta per essere la "/bin/sh " standard)
|
ksh
*
|
V:0.5, I:1.6 | 2800 | Sì | la versione reale di AT&T della Korn shell |
rc
*
|
V:0.16, I:1.6 | 204 | No | implementazione della rc shell di AT&T Plan 9 |
posh
*
|
V:0.01, I:0.11 | 228 | Sì |
Policy-compliant Ordinary SHell (derivata da pdksh )
|
In questo capitolo del tutorial la shell interattiva considerata è sempre
bash
.
Si può personalizzare il comportamento di bash
(1) con
"~/.bashrc
".
Per esempio provare quanto segue.
# CD quando si esce da MC . /usr/share/mc/bin/mc.sh # impostare il CDPATH ad un buon valore CDPATH=.:/usr/share/doc:~:~/Desktop:~ export CDPATH PATH="${PATH}":/usr/sbin:/sbin # impostare PATH in modo da includere la directory bin privata dell'utente se esiste if [ -d ~/bin ] ; then PATH=~/bin:"${PATH}" fi export PATH EDITOR=vim export EDITOR
Si possono trovare altri suggerimenti sulla personalizzazione di
bash
(1), come Sezione 9.2.7, «Comandi colorati», in
Capitolo 9, Suggerimenti per il sistema.
Nell'ambiente *nix, ci sono alcune
associazioni di tasti che hanno un significato speciale. Notare che in una
console a caratteri Linux normale solo i tasti Ctrl
e
Alt
sinistri funzionano come atteso. Ecco alcune
combinazioni di tasti che vale la pena ricordare.
Tabella 1.14. Elenco di associazioni di tasti per bash
tasto | descrizione dell'associazione di tasti |
---|---|
Ctrl-U
|
cancella il contenuto della riga prima del cursore |
Ctrl-H
|
cancella il carattere prima del cursore |
Ctrl-D
|
termina l'input (se si sta usando la shell, esce dalla shell) |
Ctrl-C
|
termina un programma in esecuzione |
Ctrl-Z
|
arresta temporaneamente un programma spostandolo come compito sullo sfondo |
Ctrl-S
|
ferma l'output a schermo. |
Ctrl-Q
|
riattiva l'output a schermo. |
Ctrl-Alt-Del
|
riavvia/ferma il sistema, vedere inittab (5)
|
Left-Alt-key (opzionalmente, tasto
Windows )
|
meta-tasto per Emacs e interfacce utente simili |
freccia in su |
avvia la ricerca nello storico dei comandi in bash
|
Ctrl-R
|
inizia una ricerca incrementale nello storico dei comandi in
bash
|
Tab
|
completa l'input di un nome di file nella riga di comando in
bash
|
Ctrl-V Tab
|
inserisce in input un carattere Tab senza espansione
nella riga di comando in bash
|
La funzionalità di Ctrl-S
nel terminale può essere
disabilitata usando stty
(1).
Il funzionamento del mouse in stile Unix è basato sul sistema a 3 pulsanti.
Tabella 1.15. Elenco delle funzioni del mouse in stile Unix
azione | risposta |
---|---|
Clic sinistro e trascinamento | seleziona e copia negli appunti |
Clic sinistro | marca l'inizio della selezione |
Clic destro | marca la fine della selezione e copia negli appunti |
Clic di mezzo | incolla gli appunti alla posizione del cursore |
La rotella centrale nei moderni mouse che la hanno viene considerata come il
pulsante di mezzo e può essere usata per fare il corrispondente
clic. Cliccare contemporaneamente con i pulsanti destro e sinistro funziona
da clic di mezzo nelle situazioni in cui si hanno mouse a 2 pulsanti. Per
poter usare il mouse in una console a caratteri Linux è necessario che
gpm
(8) sia in esecuzione come demone.
less
(1) è il paginatore (navigatore del contenuto dei
file) migliorato. Premere "h
" per l'aiuto. Può fare molto
di più di more
(1) e può essere fornito di superpoteri
eseguendo "eval $(lesspipe)
" o "eval
$(lessfile)
" nello script di avvio della shell. Vedere ulteriori
informazioni in "/usr/share/doc/lessf/LESSOPEN
".
L'opzione "-R
" permette output raw e abilita le sequenze
di escape ANSI per i colori. Vedere less
(1).
Si dovrebbe diventare competenti in una delle varianti dei programmi Vim o Emacs che sono popolari sui sistemi *nix.
Penso che abituarsi ai comandi Vim sia la cosa giusta da fare, dato che un
editor Vi è sempre presente nel mondo Linux/Unix. (In realtà, il
vi
originale o il nuovo nvi
sono
programmi che si trovano ovunque. Io ho scelto invece Vim per i principianti
dato che offre l'aiuto attraverso il tasto F1
pur essendo
abbastanza simile e più potente.)
Se si sceglie invece Emacs o XEmacs come editor preferito, si sta facendo comunque davvero un'ottima scelta, specialmente per la programmazione. Emacs ha una vastità di altre funzionalità, incluso il funzionamento come newsreader, editor di directory, programma di posta, ecc. Quando usato per la programmazione o la scrittura di script, riconosce intelligentemente il formato che si sta usando e cerca di fornire assistenza. Alcune persone sostengono che l'unico programma di cui hanno bisogno su Linux è Emacs. Dieci minuti spesi ad imparare Emacs ora possono far risparmiare ore in futuro. È caldamente raccomandato avere a portata di mano il manuale di GNU Emacs da consultare quando si sta imparando Emacs.
Tutti questi programmi sono di solito forniti con un programma tutor che
aiuta ad impararli facendo pratica. Avviare Vim digitando
"vim
" e premere il tasto F1. Si dovrebbero leggere come
minimo le prime 35 righe. Poi seguire il corso di apprendimento in linea
muovendo il cursore su "|tutor|
" e premendo
Ctrl-]
.
I buoni editor, come Vim ed Emacs, possono essere usati per gestire correttamente testi UTF-8 e testi in altre codifiche esotiche usando l'opzione adatta in x-terminal-emulator in X con la localizzazione in UTF-8 e le corrette impostazioni del tipo di carattere. Fare riferimento alla loro documentazione sui testi multibyte.
Debian è fornita con svariati editor differenti. Si raccomanda di
installare, come detto in precedenza, il pacchetto vim
.
Debian fornisce un accesso unificato all'editor predefinito di sistema
attraverso il comando "/usr/bin/editor
" in modo che altri
programmi (ad esempio reportbug
(1)) possano
richiamarlo. Lo si può modificare con il comando seguente.
$ sudo update-alternatives --config editor
Io raccomando ai principianti la scelta di
"/usr/bin/vim.basic
" invece
di"/usr/bin/vim.tiny
" dato che supporta l'evidenziazione
della sintassi.
Molti programmi usano la variabile d'ambiente "$EDITOR
" o
"$VISUAL
" per decidere quale editor usare (vedereSezione 1.3.5, «L'editor interno di MC» e Sezione 9.5.11, «Personalizzare i programmi da avviare». Per coerenza, in un sistema
Debian, impostare queste variabili a
"/usr/bin/editor
". (Storicamente
"$EDITOR
" era "ed
" e
"$VISUAL
" era "vi
".)
Si può personalizzare il comportamento di vim
(1) tramite
"~/.vimrc
".
Per esempio, provare a fare quanto segue.
" ------------------------------- " Configurazione locale " set nocompatible set nopaste set pastetoggle=<f2> syn on if $USER == "root" set nomodeline set noswapfile else set modeline set swapfile endif " riempimento per evitare che la riga sopra sia considerata una modeline " riempimento " riempimento
L'output dei comandi di shell può scorrere fuori dallo schermo e potrebbe essere perduto per sempre. È buona norma registrare le attività di shell in un file in modo da poterle riguardare in seguito. Questo tipo di registro è essenziale quando si fa una qualsiasi attività di amministrazione del sistema.
Il metodo base per registrare l'attività di shell è di eseguirla sotto
script
(1).
Per esempio, provare a fare quanto segue.
$ script Script è avviato, il file è typescript
Eseguire qualsiasi comando di shell sotto script
.
Premere Ctrl-D
per uscire da script
.
$ vim typescript
Vedere Sezione 9.2.3, «Registrare le attività della shell in modo pulito».
È bene imparare i comandi Unix di base. Il termine "Unix" è qui usato in
senso lato; ogni SO clone di Unix offre di solito comandi equivalenti. Il
sistema Debian non fa eccezione. Non ci si preoccupi se, al momento, alcuni
comandi non funzionano come si vorrebbe. Se si usa alias
nella shell, i corrispondenti output dei comandi sono diversi. Questi esempi
non sono pensati per essere eseguiti necessariamente in questo ordine.
Provare tutti i comandi seguenti da un account utente non privilegiato.
Tabella 1.16. Elenco di comandi Unix di base
comando | descrizione |
---|---|
pwd
|
mostra il nome della directory attuale/di lavoro |
whoami
|
mostra il nome dell'utente attuale |
id
|
mostra l'identità dell'utente attuale (nome, uid, gid e gruppi associati) |
file <pippo>
|
mostra che tipo di file sia il file "<pippo> "
|
type -p <nomecomando>
|
mostra la posizione del file del comando
"<nomecomando> "
|
which <nomecomando>
|
" " |
type <nomecomando>
|
mostra informazioni sul comando "<nomecomando> "
|
apropos <parola-chiave>
|
trova comandi riguardanti "<parola-chiave> "
|
man -k <parola-chiave>
|
" " |
whatis <nomecomando>
|
mostra una spiegazione di una riga sul comando
"<nomecomando> "
|
man -a <nomecomando>
|
mostra una spiegazione del comando "<nomecomando> "
(in stile Unix)
|
info <nomecomando>
|
mostra una spiegazione piuttosto lunga del comando
"<nomecomando> " (in stile GNU)
|
ls
|
elenca il contenuto di directory (non i file punto e le directory) |
ls -a
|
elenca il contenuto di directory (tutti i file e directory) |
ls -A
|
elenca il contenuto di directory (quasi tutti i file e directory, cioè salta
".. " e ". ")
|
ls -la
|
elenca tutto il contenuto di directory con informazioni dettagliate |
ls -lai
|
elenca tutto il contenuto di directory con numeri di inode e informazioni dettagliate |
ls -d
|
elenca tutte le directory dentro la directory attuale |
tree
|
mostra il contenuto in forma di albero |
lsof <pippo>
|
mostra lo stato aperto per il file "<pippo> "
|
lsof -p <pid>
|
mostra i file aperti dal processo con ID "<pid> "
|
mkdir <pippo>
|
crea una nuova directory "<pippo> " nella directory
attuale
|
rmdir <pippo>
|
rimuove la directory "<pippo> " nella directory
attuale
|
cd <pippo>
|
cambia directory spostandosi nella directory
"<pippo> " nella directory attuale o in una
directory elencata nella variabile "$CDPATH "
|
cd /
|
cambia directory spostandosi nella directory radice |
cd
|
cambia directory spostandosi nella directory home dell'utente |
cd /<pippo>
|
cambia directory spostandosi nella directory con percorso assoluto
"/<pippo> "
|
cd ..
|
cambia directory spostandosi nella directory genitore |
cd ~<pippo>
|
cambia directory spostandosi nella directory home dell'utente
"<pippo> "
|
cd -
|
cambia directory spostandosi nella directory precedente |
</etc/motd pager
|
mostra il contenuto di "/etc/motd " usando il paginatore
predefinito
|
touch <filediprova>
|
crea un file "<filediprova> " vuoto
|
cp <pippo> <pluto>
|
copia un file "<pippo> " esistente in un nuovo file
"<pluto> "
|
rm <filediprova>
|
rimuove il file "<filediprova> "
|
mv <pippo> <pluto>
|
rinomina un file "<pippo> " esistente con il nuovo
nome "<pluto> " ("<pluto> "
non deve esistere)
|
mv <pippo> <pluto>
|
muove un file "<pippo> " esistente nella nuova
posizione "<pluto>/<pippo> " (la directory
"<pluto> " deve esistere)
|
mv <pippo> <pluto>/<paperino>
|
muove un file "<pippo> " esistente in una nuova
posizione con il nuovo nome
"<pluto>/<paperino> " (la directory
"<pluto> " deve esistere ma non deve esistere
"<bar>/<baz> ")
|
chmod 600 <pippo>
|
fa sì che il file "<pippo> " esistente sia non
leggibile e non scrivibile da altri (e non eseguibile per nessuno)
|
chmod 644 <pippo>
|
fa sì che il file "<pippo> " esistente sia leggibile
ma non scrivibile da altri (e non eseguibile per nessuno)
|
chmod 755 <pippo>
|
fa sì che il file "<pippo> " esistente sia leggibile
ma non scrivibile da altri (ed eseguibile per tutti)
|
find . -name <modello>
|
trova nomi di file corrispondenti al "<modello> " di
shell (lento)
|
locate -d . <modello>
|
trova nomi di file corrispondenti al "<pattern> " di
shell (più veloce, usa un database generato regolarmente)
|
grep -e "<modello>" *.html
|
trova un "<pattern>" in tutti i file nella directory attuale che
terminano con ".html " e mostra tutte le corrispondenze
|
top
|
mostra informazioni sui processi a tutto schermo, digitare
"q " per uscire
|
ps aux | pager
|
mostra informazioni su tutti i processi in esecuzione usando output in stile BSD |
ps -ef | pager
|
mostra informazioni su tutti i processi in esecuzione usando output in stile system V Unix |
ps aux | grep -e "[e]xim4*"
|
mostra tutti i processi che stanno eseguendo "exim " e
"exim4 "
|
ps axf | pager
|
mostra informazioni su tutti i processi in esecuzione usando output in ASCII art |
kill <1234>
|
uccide un processo identificato dall'ID "<1234>" |
gzip <pippo>
|
comprime <pippo> " per creare
"<pippo>.gz ", usando la codifica Lempel-Ziv (LZ77)
|
gunzip <pippo>.gz
|
decomprime "<pippo>.gz " per creare
"<pippo> "
|
bzip2 <pippo>
|
comprime "<pippo> " per creare
"<pippo>.bz2 ", usando l'algoritmo Burrows-Wheeler
per la compressione di testo con ordinamento di blocchi e la codifica
Huffman (compressione migliore di gzip )
|
bunzip2 <pippo>.bz2
|
decomprime "<pippo>.bz2 " per creare
"<pippo> "
|
xz <pippo>
|
comprime "<pippo> " per creare
"<pippo>.xz ", usando l'algoritmo Lempel–Ziv–Markov
chain (compressione migliore di bzip2 )
|
unxz <pippo>.xz
|
decomprime "<pippo>.xz " per creare
"<pippo> "
|
tar -xvf <pippo>.tar
|
estrae i file dall'archivio "<pippo>.tar "
|
tar -xvzf <pippo>.tar.gz
|
estrae file dall'archivio "<pippo>.tar.gz "
compresso con gzip
|
tar -xvjf <pippo>.tar.bz2
|
estrae file dall'archivio "<pippo>.tar.bz2 "
|
tar -xvJf <pippo>.tar.xz
|
estrae file dall'archivio "<pippo>.tar.xz "
|
tar -cvf <pippo>.tar <pluto>/
|
archivia i contenuti della directory "<pluto>/ "
nell'archivio "<pippo>.tar "
|
tar -cvzf <pippo>.tar.gz <pluto>/
|
archivia i contenuti della directory "<pluto>/ "
nell'archivio compresso "<pippo>.tar.gz "
|
tar -cvjf <pippo>.tar.bz2 <pluto>/
|
archivia i contenuti della directory "<plutor>/ "
nell'archivio "<pippo>.tar.bz2 "
|
tar -cvJf <pippo>.tar.xz <pluto>/
|
archivia i contenuti della directory "<plutor>/ "
nell'archivio "<pippo>.tar.xz "
|
zcat README.gz | pager
|
mostra i contenuti del file compresso "README.gz " usando
il paginatore predefinito
|
zcat README.gz > pippo
|
crea un file "pippo con i contenuti di
"README.gz " decompressi
|
zcat README.gz >> pippo
|
aggiunge i contenuti di "README.gz " decompressi in coda
al file "pippo " (se il file non esiste, lo crea)
|
Unix tradizionalmente nasconde i nomi di file che iniziano con
".
". Sono tradizionalmente file contenenti informazioni
di configurazione e preferenze dell'utente.
Per il comando cd
vedere builtins
(7).
Il paginatore predefinito del sistema di base di Debian è
more
(1) che non ha lo scorrimento
all'indietro. Installando il pacchetto less
, con la riga
di comando "apt-get install less
",
less
(1) diventa il paginatore predefinito e si può così
scorrere il testo all'indietro usando i tasti freccia.
I caratteri "[
" e "]
" nella
espressione regolare del comando "ps aux | grep -e
"[e]xim4*"
" sopra citato, permettono a grep
di
evitare di trovare corrispondenza con sé stesso. La parte
"4*
" nella espressione regolare signifa 0 o più
ripetizioni del carattere "4
" e perciò permette a
grep
di trovare corrispondenza sia con
"exim
" sia con "exim4
". Sebbene il
carattere "*
" sia usato nei nomi di file con
metacaratteri della shell e nelle espressioni regolari, il suo significato è
diverso nei due casi. Si possono imparare le espressioni regolari da
grep
(1).
Come esercizio, esplorare le directory e dare un'occhiata al sistema usando i comandi citati sopra. Se si hanno domande su uno qualsiasi dei comandi in console, assicurarsi di leggere la pagina di manuale.
Per esempio, provare a fare quanto segue.
$ man man $ man bash $ man builtins $ man grep $ man ls
Può essere un po' difficile abituarsi allo stile delle pagine man perché sono piuttosto concise, in particolar modo le più vecchie e tradizionali. Una volta che ci si fa la mano, però, si apprezza la loro concisione.
Notare che molti comandi in stile Unix, inclusi quelli da GNU e BSD, mostrano una breve informazione di aiuto se li si invoca in uno dei modi seguenti (o in alcuni casi se lo si fa senza usare opzioni).
$ <nomecomando> --help $ <nomecomando> -h
Ora si ha un'idea di come usare il sistema Debian; è tempo di dare uno
sguardo più approfondito al meccanismo di esecuzione dei comandi nel sistema
Debian. Qui la realtà è stata semplificata ad uso del principiante. Vedere
bash
(1) per una spiegazione esatta.
Un semplice comando è formato da una sequenza di componenti.
>
,
>>
, <
,
<<
, ecc.)
&&
,
||
, <a-capo> , ;
,
&
, (
, )
)
I valori di alcune environment variables cambiano il comportamento di alcuni comandi Unix.
I valori predefiniti delle variabili d'ambiente sono impostati inizialmente dal sistema PAM e poi alcuni di essi possono essere reimpostati da alcuni programmi applicativi.
gdm
, reimposta variabili
d'ambiente.
~/bash_profile
" e "~/.bashrc
".
Il valore completo di localizzazione impostato nella variabile
"$LANG
" consiste di 3 parti:
"xx_YY.ZZZZ
".
Tabella 1.17. Le 3 parti del valore di localizzazione
valore di localizzazione | significato |
---|---|
xx
|
codice ISO 639 della lingua (in minuscole), come "en" |
YY
|
codice ISO 3166 del paese (in maiuscole) come "US" |
ZZZZ
|
codeset, impostato sempre ad "UTF-8" |
Per i codici delle lingue e dei paesi, vedere le descrizioni pertinenti in
"info gettext
".
In un sistema Debian moderno il codeset dovrebbe essere sempre impostato a
UTF-8
, a meno che non
si voglia specificatamente usare uno usato in passato e avendo una buona
ragione e le conoscenze per farlo.
Per dettagli più specifici sulla configurazione della localizzazione vedere Sezione 8.3, «La localizzazione».
"LANG=en_US
" non è "LANG=C
" né
"LANG=en_US.UTF-8
". È
"LANG=en_US.ISO-8859-1
" (vedere Sezione 8.3.1, «Nozioni base sulla codifica»).
Tabella 1.18. Elenco di localizzazioni raccomandate
localizzazione raccomandata | lingua (zona) |
---|---|
en_US.UTF-8
|
inglese (USA) |
en_GB.UTF-8
|
inglese (Gran Bretagna) |
fr_FR.UTF-8
|
francese (Francia) |
de_DE.UTF-8
|
tedesco (Germania) |
it_IT.UTF-8
|
italiano (Italia) |
es_ES.UTF-8
|
spagnolo (Spagna) |
ca_ES.UTF-8
|
catalano (spagna) |
sv_SE.UTF-8
|
svedese (Svezia) |
pt_BR.UTF-8
|
portoghese (Brasile) |
ru_RU.UTF-8
|
russo (Russia) |
zh_CN.UTF-8
|
cinese (Repubblica Popolare Cinese) |
zh_TW.UTF-8
|
cinese (Taiwan Repubblica di Cina) |
ja_JP.UTF-8
|
giapponese (Giappone) |
ko_KR.UTF-8
|
coreano (Corea del Sud) |
vi_VN.UTF-8
|
vietnamita (Vietnam) |
Una tipica esecuzione di un comando usa una sequenza sulla riga della shell come la seguente.
$ date Sun Jun 3 10:27:39 JST 2007 $ LANG=fr_FR.UTF-8 date dimanche 3 juin 2007, 10:27:33 (UTC+0900)
In questo caso il programma date
(1) viene eseguito con
valori differenti della variabile d'ambiente "$LANG
".
$LANG
" è impostata al valore di
localizzazione predefinito di sistema:
"en_US.UTF-8
".
$LANG
" è impostata al valore di
localizzazione UTF-8 francese:
fr_FR.UTF-8
".
La maggior parte delle invocazioni di comandi non è solitamente preceduta da definizioni di variabili d'ambiente. In alternativa all'esempio precedente, si può eseguire quanto segue.
$ LANG=fr_FR.UTF-8 $ date dimanche 3 juin 2007, 10:27:33 (UTC+0900)
Come si può vedere, l'output del comando è in questo caso influenzato dalla variabile d'ambiente per produrre output in francese. Se si desidera che una variabile d'ambiente venga ereditata da sottoprocessi, ad esempio quando si invocano script di shell, è necessario invece esportarla nel modo seguente.
$ export LANG
Quando si segnala un bug, è una buona idea, se si usa un ambiente non
inglese, eseguire e controllare il comando nella localizzazione
"LANG=en_US.UTF-8
"
Vedere locale
(5) e locale
(7) per
"$LANG
" e variabili d'ambiente correlate.
Io raccomando di configurare l'ambiente di sistema usando solo la variabile
"$LANG
" e di tenersi alla larga dalle variabili
"$LC_*
" a meno che non sia strettamente necessario.
Quando si digita un comando nella shell, questa cerca il comando nelle
directory nell'elenco contenuto nella variabile d'ambiente
"$PATH
". Il valore della variabile d'ambiente
"$PATH
" è anche chiamato percorso di ricerca della shell.
In una installazione Debian standard, la variabile d'ambiente
"$PATH
" degli account utente può non includere
"/sbin
" e "/usr/sbin
". Il comando
ifconfig
, per esempio, deve essere eseguito con il
percorso completo, come in "/sbin/ifconfig
". (Il comando
simile ip
si trova in "/bin
".)
Si può modificare la variabile d'ambiente "$PATH
" della
shell Bash tramite il file "~/.bash_profile
" o
"~/.bashrc
".
Molti comandi memorizzano una configurazione specifica per l'utente nella
directory home e cambiano il loro comportamento in base al suo contenuto. La
directory home è identificata dalla variabile d'ambiente
"$HOME
".
Tabella 1.19. Elenco di valori di "$HOME
"
valore di "$HOME "
|
situazione di esecuzione del programma |
---|---|
/
|
programma eseguito da processo init (demone) |
/root
|
programma eseguito dalla normale shell di root |
/home/<utente_normale>
|
programma eseguito dalla shell di un utente normale |
/home/<utente_normale>
|
programma eseguito dal menu del desktop grafico di un utente normale |
/home/<utente_normale>
|
programma eseguito come root con "sudo programma "
|
/root
|
programma eseguito come root con "sudo -H programma "
|
La shell espande "~/
nella directory home dell'utente
attuale, cioè "$HOME/
". La shell espande
"~pippo/
" nella directory home di
pippo
, cioè "/home/pippo/
".
Alcuni comandi accettano argomenti. Gli argomenti che iniziano con
"-
" o "--
" sono chiamati opzioni e
controllano il comportamento del comando.
$ date dom apr 18 23:22:36 CEST 2010 $ date -R Sun, 18 Apr 2010 23:23:08 +0200
In questo caso l'opzione "-R
" sulla riga di comando
cambia il comportamento di date
(1) producendo in output
la data in una stringa conforme alla RFC2822.
Spesso si desidera che un comando abbia effetto su un gruppo di file senza dover digitarli tutti. I modelli di espansione dei nomi di file che usano i glob della shell, a volte detti metacaratteri o caratteri jolly, facilitano questo compito.
Tabella 1.20. Modelli di glob della shell
modello di glob della shell | descrizione della regola di corrispondenza |
---|---|
*
|
nome file (segmento) che non inizia con ". "
|
.*
|
nome file (segmento) che inizia con ". "
|
?
|
esattamente un carattere |
[…]
|
esattamente un carattere tra quelli racchiusi tra le parentesi quadre |
[a-z]
|
esattamente un carattere che sia un carattere compreso tra
"a " e "z "
|
[^…]
|
esattamente un carattere che non sia uno di quelli racchiusi tra parentesi
quadre (non contando "^ ")
|
Per esempio, provare a fare quanto segue.
$ mkdir prova; cd prova; touch 1.txt 2.txt 3.c 4.h .5.txt ..6.txt $ echo *.txt 1.txt 2.txt $ echo * 1.txt 2.txt 3.c 4.h $ echo *.[hc] 3.c 4.h $ echo .* . .. .5.txt ..6.txt $ echo .*[^.]* .5.txt ..6.txt $ echo [^1-3]* 4.h $ cd ..; rm -rf prova
Vedere glob
(7).
A differenza della normale espansione dei nomi della shell, il modello shell
"*
" cercato dal comando find
(1) con la
ricerca "-name
" ecc., trova corrispondenza anche con nomi
di file che iniziano con ".
". (Nuova funzionalità POSIX.)
Si può manipolare il comportamento di BASH in relazione ai modelli di glob
usando le sue opzioni shopt incorporate come "dotglob
",
"noglob
", "nocaseglob
",
"nullglob
", "nocaseglob
",
"extglob
", ecc. Vedere bash
(1).
Ogni comando restituisce il suo stato di uscita (variabile
"$?
") come valore restituito.
Tabella 1.21. Codici di uscita dei comandi
stato di uscita del comando | valore numerico restituito | valore logico restituito |
---|---|---|
successo | zero, 0 | VERO |
errore | non-zero, -1 | FALSO |
Per esempio provare quanto segue.
$ [ 1 = 1 ] ; echo $? 0 $ [ 1 = 2 ] ; echo $? 1
Notare che, nel contesto logico della shell, il successo è trattato come il valore logico VERO che ha valore numerico 0 (zero). Questo è in qualche modo non intuitivo ed è bene rimarcarlo.
È bene cercare di ricordare i seguenti idiomi per comandi di shell che vengono digitati sulla stessa riga come parte del comando di shell.
Tabella 1.22. Idiomi per comandi di shell
idioma per comando | descrizione |
---|---|
comando &
|
esegue comando sullo sfondo in una sotto-shell
|
comando1 | comando2
|
invia tramite pipe lo standard output di
comando1 allo standard input di
comando2 (esecuzione
concorrente)
|
comando1 2>&1 | comando2
|
invia tramite pipe sia lo standard output
sia lo standard error di comando1 allo standard input di
comando2 (esecuzione
concorrente)
|
comando1 ; comando2
|
esegue comando1 e comando2 in
sequenza
|
comando1 && comando2
|
esegue comando1 ; se ha successo, esegue
comando2 in sequenza
(restituisce lo stato di successo se sia comando1
sia comando2 hanno
successo)
|
comando1 || comando2
|
esegue comando1 ; se non ha successo, esegue
comando2 in sequenza
(restituisce lo stato di successo se comando1 o comando2 ha successo)
|
comando > pippo
|
ridirige lo standard output di comando al file
"pippo " (sovrascrivendolo)
|
comando 2> pippo
|
ridirige lo standard error di comando al file
"pippo " (sovrascrivendolo)
|
comando >> pippo
|
ridirige lo standard output di comando al file
"pippo " (aggiungendo in coda)
|
comando 2>> pippo
|
ridirige lo standard error di comando al file
"pippo " (aggiungendo in coda)
|
comando > pippo 2>&1
|
ridirige sia lo standard output sia lo standard error di
comando al file "pippo "
|
comando < pippo
|
usa come standard input di comando il file
"pippo "
|
comando << delimitatore
|
usa come standard input di comando le righe che seguono
fino a che non viene incontrato il testo "delimitatore "
(inserire un documento)
|
command <<- delimitatore
|
usa come standard input di comando le righe che seguono
fino a che non viene incontrato il testo "delimitatore ";
i caratteri di tabulazione iniziali vengono eliminate dal testo (inserire un
documento)
|
Il sistema Debian è un sistema multi-tasking. I compiti sullo sfondo
permettono agli utenti di eseguire più programmi in una singola shell. La
gestione dei processi sullo sfondo coinvolge i comandi interni della shell
jobs
, fg
, bg
e
kill
. Leggere le sezioni "SIGNALS" e "JOB CONTROL" di
bash(1) e builtins
(1).
Per esempio, provare a fare quanto segue.
$ </etc/motd pager
$ pager </etc/motd
$ pager /etc/motd
$ cat /etc/motd | pager
Benché tutti i 4 esempi di ridirezione della shell mostrino la stessa cosa,
l'ultimo esempio esegue un comando cat
aggiuntivo e
spreca risorse senza motivo.
La shell permette di aprire file usando il comando interno
exec
con un descrittore di file arbitrario.
$ echo Hello >pippo $ exec 3<pippo 4>pluto # apre i file $ cat <&3 >&4 # ridirige lo stdin in 3, lo stdout in 4 $ exec 3<&- 4>&- # chiude i file $ cat pluto Hello
In questo esempio, "n<&-
e
"n>&-
servono a chiudere il
descrittore di file "n
".
I descrittori di file 0-2 sono predefiniti.
Tabella 1.23. Descrittori di file predefiniti
device | descrizione | descrittore del file |
---|---|---|
stdin
|
standard input | 0 |
stdout
|
standard output | 1 |
stderr
|
standard error | 2 |
Si possono impostare alias per i comandi usati di frequente.
Per esempio, provare a fare quanto segue.
$ alias la='ls -la'
Ora "la
" funziona da scorciatoia per "ls
-la
" che elenca tutti i file nel formato di elencazione esteso.
Si possono elencare tutti gli alias esistenti con alias
(vedere la sezione "SHELL BUILTIN COMMANDS" in bash
(1)).
$ alias ... alias la='ls -la'
Si può identificare il percorso esatto o l'identità di un comando con
type
(vedere la sezione "SHELL BUILTIN COMMANDS") di
bash
(1)).
Per esempio, provare a fare quanto segue.
$ type ls ls is hashed (/bin/ls) $ type la la is aliased to ls -la $ type echo echo is a shell builtin $ type file file is /usr/bin/file
In questo caso ls
era stato cercato di recente mentre
"file
" no, percio "ls
" risulta
"hashed", cioè la shell ha un record interno per un accesso veloce alla
posizione del comando "ls
".
Nell'ambiente di lavoro Unix, l'elaborazione del testo viene fatta instradando il testo tramite pipe attraverso catene di strumenti standard per l'elaborazione del testo. Questa è stata un'altra fondamentale innovazione di Unix.
Ci sono alcuni strumenti di elaborazione del testo che sono usati molto spesso in un sistema *nix.
Senza l'uso di alcuna espressione regolare:
cat
(1) concatena file e produce in output il contenuto
totale.
tac
(1) concatena file e produce l'output in senso
inverso.
cut
(1) seleziona parti di righe e le produce in output.
head
(1) produce in output la prima parte di file.
tail
(1) produce in output l'ultima parte di file.
sort
(1) ordina righe in file di testo.
uniq
(1) rimuove righe duplicate da un file ordinato.
tr
(1) trasforma o elimina caratteri.
diff
(1) paragona file riga per riga.
Con l'uso di espressioni regolari di base (BRE):
grep
(1) trova corrispondenze di testo con modelli.
ed
(1) è un primitivo editor di riga.
sed
(1) è un editor di flussi.
vim
(1) è un editor a schermo.
emacs
(1) è un editor a schermo (con BRE un po' estese)
Con l'uso di espressioni regolari estese (ERE):
egrep
(1) trova corrispondenze di testo con modelli.
awk
(1) fa semplici elaborazioni di testo.
tcl
(3tcl) può fare ogni elaborazione di testo
immaginabile: re_syntax
(3). Spesso usato con
tk
(3tk).
perl
(1) può fare ogni elaborazione di testo
immaginabile. perlre
(1).
pcregrep
(1) dal pacchetto pcregrep
trova corrispondenze di testo con modelli PCRE (Perl Compatible Regular
Expressions).
python
(1) con il modulo re
può fare
ogni elaborazione di testo immaginabile. Vedere
"/usr/share/doc/python/html/index.html
".
Se non si è sicuri di cosa facciano esattamente questi comandi, usare
"man comando
" per scoprirlo.
Il criterio di ordinamento e le espressioni di intervalli dipendono dalla
localizzazione. Se si desidera ottenere il comportamento tradizionale di un
comando, usare la localizzazione C invece
di quelle UTF-8 anteponendo al comando
"LANG=C
" (vedere Sezione 1.5.2, «Variabile "$LANG
"» e Sezione 8.3, «La localizzazione»).
Le espressioni regolari Perl
(perlre
(1)), le PCRE (Perl Compatible Regular
Expressions) e le espressioni regolari Python fornite dal modulo re
hanno
molte estensioni comuni delle normali ERE.
Le espressioni regolari sono usate in molti strumenti di elaborazione del testo. Sono analoghe ai modelli di glob della shell, ma sono più complesse e potenti.
Una espressione regolare descrive il modello a cui trovare corrispondenza ed è composta da caratteri di testo e metacaratteri.
Un metacarattere è semplicemente un carattere con un significato speciale. Ci sono 2 stili principali, BRE e ERE, a seconda degli strumenti di testo descritti in precedenza.
Tabella 1.24. Metacaratteri per BRE e ERE
BRE | ERE | descrizione della espressione regolare |
---|---|---|
\ . [ ] ^ $ *
|
\ . [ ] ^ $ *
|
metacaratteri comuni |
\+ \? \( \) \{ \} \|
|
metacaratteri protetti dal carattere
"\ " di escape solo di BRE
|
|
+ ? ( ) { } |
|
metacaratteri non protetti dal carattere
"\ " di escape solo di ERE
|
|
c
|
c
|
corrisponde al non metacarattere
"c "
|
\c
|
\c
|
corrisponde al carattere letterale "c " anche se
"c " è in sé stesso un metacarattere
|
.
|
.
|
corrisponde a qualsiasi carattere incluso il carattere di a capo |
^
|
^
|
posizione all'inizio di una stringa |
$
|
$
|
posizione alla fine di una stringa |
\<
|
\<
|
posizione all'inizio di una parola |
\>
|
\>
|
posizione alla fine di una parola |
\[abc…\]
|
[abc…]
|
corrisponde ad ogni carattere in "abc... "
|
\[^abc…\]
|
[^abc…]
|
corrisponde ad ogni carattere eccetto a quelli in
"abc... "
|
r*
|
r*
|
corrisponde a zero o più occorrenze della espressione regolare identificata
da "r "
|
r\+
|
r+
|
corrisponde ad una o più occorrenza della espressione regolare identificata
da "r "
|
r\?
|
r?
|
corrisponde a zero o una occorrenza dell'espressione regolare identificata
da "r "
|
r1\|r2
|
r1|r2
|
corrisponde ad una occorrenza della espressione regolare identificata da
"r1 " o "r2 "
|
\(r1\|r2\)
|
(r1|r2)
|
corrisponde ad una occorrenza dell'espressione regolare identificata da
"r1 " o "r2 " e la tratta come una
espressione regolare tra parentesi
|
Le espressioni regolari di emacs
sono fondamentalmente
BRE, ma sono state estese per trattare
"+
" e "?
" come i metacaratteri nelle ERE. Perciò, nelle espressioni regolari di
emacs
, non è necessario proteggerli con il carattere di
escape "\
".
Per effettuare ricerche di testo usando espressioni regolari si può usare
grep
(1).
Per esempio, provare a fare quanto segue.
$ egrep 'GNU.*LICENSE|Yoyodyne' /usr/share/common-licenses/GPL GNU GENERAL PUBLIC LICENSE GNU GENERAL PUBLIC LICENSE Yoyodyne, Inc., hereby disclaims all copyright interest in the program
Per le espressioni di sostituzione alcuni caratteri hanno un significato particolare.
Tabella 1.25. L'espressione di sostituzione
espressione di sostituzione | descrizione del testo che sostituirà l'espressione di sostituzione |
---|---|
&
|
ciò che ha ha avuto corrispondenza con l'espressione regolare (usare
\& in emacs )
|
\n
|
ciò che ha avuto corrispondenza con la n-essima espressione regolare tra parentesi ("n" è un numero) |
Per sostituzioni di stringhe in Perl "$n
" viene usato al
posto di "\n
" e "&
" non ha un
significato particolare.
Per esempio, provare a fare quanto segue.
$ echo zzz1abc2efg3hij4 | \ sed -e 's/\(1[a-z]*\)[0-9]*\(.*\)$/=&=/' zzz=1abc2efg3hij4= $ echo zzz1abc2efg3hij4 | \ sed -e 's/\(1[a-z]*\)[0-9]*\(.*\)$/\2===\1/' zzzefg3hij4===1abc $ echo zzz1abc2efg3hij4 | \ perl -pe 's/(1[a-z]*)[0-9]*(.*)$/$2===$1/' zzzefg3hij4===1abc $ echo zzz1abc2efg3hij4 | \ perl -pe 's/(1[a-z]*)[0-9]*(.*)$/=&=/' zzz=&=
In questo esempio si faccia particolare attenzione allo stile delle espressioni regolari tra parentesi e come le stringhe corrispondenti siano usate nel processo di sostituzione del testo dai diversi strumenti.
Queste espressioni regolari possono essere usate per spostare il cursore e per fare sostituzioni di testo anche in alcuni editor.
La barra inversa, "\
" alla fine della prima riga nella
riga di comando di shell protegge il carattere di a capo rendendolo uno
spazio e continuando l'input della riga di comando di shell nella riga
successiva.
Leggere tutte le pagine man relative per imparare l'uso di questi comandi.
Il comando ed
(1) può sostituire tutte le occorrenze di
"DA_REGEX
" con "A_TESTO
" in
"file
".
$ ed file <<EOF ,s/DA_REGEX/A_TESTO/g w q EOF
Il comando sed
(1) può sostituire tutte le occorrenze di
"DA_REGEX
" con "A_TESTO
" in
"file
".
$ sed file 's/DA_REGEX/A_TESTO/g' | sponge file
Il comando sponge
(8) è uno strumento Unix non standard
fornito dal pacchetto moreutils
. È piuttosto utile quando
si desidera sovrascrivere il file originale.
Il comando vim
(1) può sostituire tutte le occorrenze di
"DA_REGEX
" with "A_TESTO
" in
"file
" usando il comando ex
(1).
$ vim '+%s/DA_REGEX/A_TESTO/gc' '+w' '+q' file
Il modificatore "c
" nell'esempio soprastante assicura che
venga chiesta la conferma interattiva per ciascuna sostituzione.
Si possono elaborare file multipli ("file1
",
"file2
" e "file3
") in modo simile con
vim
(1) o perl
(1).
$ vim '+argdo %s/DA_REGEX/A_TESTO/ge|update' '+q' file1 file2 file3
Il modificatore "e
" nell'esempio soprastante evita che un
errore di nessuna corrispondenza trovata ("No match") rompa il processo.
$ perl -i -p -e 's/DA_REGEX/A_TESTO/g;' file1 file2 file3
Nell'esmpio perl(1), "-i
" è per la modifica sullo stesso
file e "-p
" è per reiterare implicitamente il comando sui
diversi file.
L'uso dell'opzione "-i.bak
" invece di
"-i
" preserva una copia del file originale aggiungendo il
suffisso ".bak
" al suo nome file. Questo permette di
ripristinare le cose più facilmente in caso di errori in sostituzioni
complesse.
ed
(1) e vim
(1) usano BRE; perl
(1) usa ERE.
Considerare per esempio un file ti testo chiamato "DPL
"
in cui sono elencati, in un formato separato da spazi, alcuni nomi di leader
del progetto Debian pre-2004 e la data della loro installazione.
Ian Murdock Agosto 1993 Bruce Perens Aprile 1996 Ian Jackson Gennaio 1998 Wichert Akkerman Gennaio 1999 Ben Collins Aprile 2001 Bdale Garbee Aprile 2002 Martin Michlmayr Marzo 2003
Vedere "Una breve storia di Debian" per la storia della Guida del progetto Debian aggiornata.
Awk viene usato spesso per estrarre dati da questo tipo di file.
Per esempio, provare a fare quanto segue.
$ awk '{ print $3 }' <DPL # mese di inizio Agosto Aprile Gennaio Gennaio Aprile Aprile Marzo $ awk '($1=="Ian") { print }' <DPL # leader del progetto chiamato Ian Ian Murdock Agosto 1993 Ian Jackson Gennaio 1998 $ awk '($2=="Perens") { print $3,$4 }' <DPL # quando ha iniziato Perens Aprile 1996
Questo tipo di file può anche essere analizzato con le shell tipo Bash.
Per esempio, provare a fare quanto segue.
$ while read nome cognome mese anno; do echo $mese done <DPL ... stesso output del primo esempio Awk
In questo caso, il comando incorporato read
usa i
caratteri in "$IFS
" (internal field separator, separatore
di campi interno) per suddividere le righe in parole.
Se si modifica "$IFS
" in ":
", si
possono analizzare facilmente con la shell i file
"/etc/passwd
".
$ vecchioIFS="$IFS" # salva il vecchio valore $ IFS=':' $ while read utente password uid gid resto_della_riga; do if [ "$utente" = "bozo" ]; then echo "l'ID di $utente e' $uid" fi done < /etc/passwd l'ID di bozo e' 1000 $ IFS="$vecchioIFS" # ripristina il vecchio valore
(Se si usa Awk per fare la stessa cosa, usare "FS=':'
"
per impostare il separatore di campi.)
IFS viene anche usato dalla shell per suddividere i risultati dell'espansione di parametri, sostituzione di comandi ed espansioni aritmetiche. Queste non avvengono all'interno delle virgolette singole o doppie. Il valore predefinito di IFS è la combinazione di <spazio>, <tab> e <a capo>
Essere prudenti nell'uso di questi trucchetti di shell con IFS. Possono accadere strane cose quando la shell interpreta alcune parti dello script come suo input.
$ IFS=":," # usa ":" e "," come IFS $ echo IFS=$IFS, IFS="$IFS" # echo e' un comando interno di Bash IFS= , IFS=:, $ date -R # un output di comando qualunque Sat, 23 Aug 2003 08:30:15 +0200 $ echo $(date -R) # sotto-shell --> input alla shell principale Sat 23 Aug 2003 08 30 36 +0200 $ unset IFS # reimposta il valore predefinito di IFS $ echo $(date -R) Sat, 23 Aug 2003 08:30:50 +0200
Gli script seguenti fanno alcune cose carine se inseriti in una pipe.
Tabella 1.26. Elenco di frammenti di script per comandi con pipe
frammento di script (digitarlo in un'unica riga) | effetto del comando |
---|---|
find /usr -print
|
trova tutti i file in "/usr "
|
seq 1 100
|
stampa da 1 a 100 |
| xargs -n 1 <comando>
|
esegue ripetutamente il comando con ogni elemento dalla pipe come argomento |
| xargs -n 1 echo
|
suddivide elementi separati da spazio nella pipe su righe distinte |
| xargs echo
|
unisce tutte le righe dalla pipe in una riga |
| grep -e <modello_regex>
|
estrae dalla pipe le righe che contengono <modello_regex> |
| grep -v -e <modello_regex>
|
estrae dalla pipe le righe che non contengono <modello_regex> |
| cut -d: -f3 -
|
estrae dalla il terzo campo, separato da ": " (file
passwd, ecc.)
|
| awk '{ print $3 }'
|
estrae dalla pipe il terzo campo separato da spazi |
| awk -F'\t' '{ print $3 }'
|
estrae dalla pipe il terzo campo separato da tabulazioni |
| col -bx
|
rimuove i caratteri backspace ed espande le tabulazioni in sequenze di spazi |
| expand -
|
espande le tabulazioni |
| sort| uniq
|
ordina e rimuove i duplicati |
| tr 'A-Z' 'a-z'
|
converte le maiuscole in minuscole |
| tr -d '\n'
|
concatena le righe in un'unica riga |
| tr -d '\r'
|
rimuove i caratteri di a capo |
| sed 's/^/# /'
|
aggiunge "# " all'inizio di ogni riga
|
| sed 's/\.ext//g'
|
rimuove ".ext "
|
| sed -n -e 2p
|
stampa la seconda riga |
| head -n 2 -
|
stampa le prime due righe |
| tail -n 2 -
|
stampa le ultime due righe |
Script di shell di una riga possono operare reiteratamente su più file
usando find
(1) e xargs
(1) per fare
compiti piuttosto complicati. Vedere Sezione 10.1.5, «Esempi di invocazione per la selezione di file» e Sezione 9.5.9, «Ripetere un comando su diversi file».
Quando usare la shell in modalità interattiva diventa troppo complicato, considerare la scrittura di uno script di shell (vedere Sezione 12.1, «Script shell»).
Questo capitolo è stato scritto assumendo che il rilascio stabile più
recente abbia nome in codice: squeeze
.
Debian è un'organizzazione di volontari che crea distribuzioni coerenti di pacchetti binari precompilati di software libero e li distribuisce dal suo archivio.
L'archivio Debian viene fornito da molti siti mirror remoti per l'accesso con i metodi HTTP e FTP. È anche disponibile come CD-ROM/DVD.
Il sistema di gestione dei pacchetti di Debian, se usato in modo corretto, permette all'utente di installare dall'archivio insiemi coerenti di pacchetti binari sul sistema. Attualmente ci sono 30552 pacchetti disponibili per l'architettura amd64.
Il sistema di gestione dei pacchetti di Debian ha una storia ricca e fornisce molti programmi con interfacce per l'utente finale e molti metodi di backend per l'accesso agli archivi tra cui scegliere. Attualmente le scelte raccomandate sono le seguenti.
apt-get
(8) per tutte le operazioni dalla riga di comando,
incluse le installazioni e le rimozioni di pacchetti nonché gli
aggiornamenti dist-upgrade.
aptitude
(8) per un'interfaccia testuale interattiva per
gestire i pacchetti installati e per cercare i pacchetti disponibili.
update-manager
(8) per mantenere il sistema aggiornato se
si usa il desktop GNOME predefinito.
Tabella 2.1. Elenco degli strumenti Debian di gestione dei pacchetti
pacchetto | popcon | dimensione | descrizione |
---|---|---|---|
apt
*
|
V:90, I:99 | 5600 |
Advanced Packaging Tool (APT), frontend per dpkg che
fornisce i metodi "http ", "ftp " e
"file " per 'accesso agli archivi (inclusi i comandi
apt-get /apt-cache )
|
aptitude *
|
V:25, I:98 | 11916 |
gestore di pacchetti interattivo basato su terminale con
aptitude (8)
|
update-manager-gnome *
|
V:7, I:10 | 1221 |
Applicazione GNOME che gestisce gli aggiornamenti software con
update-manager (8)
|
tasksel *
|
V:5, I:93 | 904 | strumento per selezionare attività per l'installazione sul sistema Debian (frontend per APT) |
unattended-upgrades *
|
V:4, I:31 | 280 | pacchetto di estensione per APT per abilitare l'installazione automatica degli aggiornamenti di sicurezza |
dselect *
|
V:2, I:30 | 2404 | gestore di pacchetti basato su terminale (standard precedente, frontend per APT e altri vecchi metodi di accesso) |
dpkg
*
|
V:92, I:99 | 6804 | sistema di gestione dei pacchetti per Debian |
synaptic *
|
V:13, I:40 | 6464 | gestore grafico dei pacchetti (front-end GNOME per APT) |
apt-utils *
|
V:51, I:99 | 516 |
programmi di utilità APT: apt-extracttemplates (1),
apt-ftparchive (1) e apt-sortpkgs (1)
|
apt-listchanges *
|
V:11, I:17 | 280 | strumento di notifica dello storico dei cambiamenti dei pacchetti |
apt-listbugs *
|
V:1.4, I:2 | 508 | elenca i bug critici prima di ogni installazione di APT |
apt-file *
|
V:2, I:9 | 188 | utilità APT per ricerca di pacchetti, interfaccia a riga di comando |
apt-rdepends *
|
V:0.13, I:0.9 | 92 | elenca le dipendenze dei pacchetti in modo ricorsivo |
Questi sono alcuni punti fondamentali per la configurazione dei pacchetti in un sistema Debian.
debconf
(7), per aiutare nel
processo di configurazione iniziale del pacchetto.
Non installare pacchetti da una miscela casuale di suite. Probabilmente si disgrega la coerenza tra i pacchetti che richiede una conoscenza approfondita dalla gestione del sistema, come dell'ABI del compilatore, versione delle librerie, funzionalità dell'interprete, ecc.
L'amministratore di sistema novizio dovrebbe
rimanere con il rilascio stable
di Debian ed applicare
solo gli aggiornamenti di sicurezza. Ciò significa che alcune delle azione
spiegate in seguito, seppur valide, sono, come precauzione, da evitare fino
a che non si capisce il sistema Debian molto bene. Ecco alcune cose da
ricordare.
testing
o unstable
in
"/etc/apt/sources.list
".
/etc/apt/sources.list
".
/etc/apt/preferences
".
dpkg -i
<pacchetto_a_caso>
".
dpkg --force-all
-i <pacchetto_a_caso>
".
/var/lib/dpkg/
".
Non sovrascrivere file di sistema, installando direttamente programmi software compilati dai sorgenti.
/usr/local
" o
"/opt
"
Gli effetti causati dalle azioni descritte sopra al sistema di gestione dei pacchetti di Debian portano a incompatibilità che possono lasciare il sistema in uno stato inutilizzabile.
Gli amministratori di sistema Debian seri, che gestiscono server di importanza critica, dovrebbero usare particolari precauzioni.
Non installare alcun pacchetto, compreso quelli di aggiornamenti di sicurezza di Debian, senza averli attentamente testati con la propria particolare configurazione in condizioni sicure.
Nonostante le avvertenze dette prima, si sa che molti lettori di questo
documento desiderano usare le suite testing
o
unstable
di Debian come loro sistema principale per
ambienti Desktop auto-amministrati. Ciò
accade perché funzionano molto bene, sono aggiornate di frequente e offrono
le più recenti funzionalità.
Per i server di produzione, è
raccomandata la suite stable
con gli aggiornamenti di
sicurezza. Lo stesso vale per i PC desktop su cui si investono sforzi di
amministrazione limitati, ad esempio il PC di un genitore.
Non serve far altro che impostare semplicemente la stringa relativa alla
distribuzione nel file "/etc/apt/sources.list
" con il
nome della suite voluta: "testing
" o
"unstable
", o con il suo nome in codice:
"wheezy
o
"sid
". Questo farà vivere una
vita di aggiornamenti senza fine
.
L'uso di testing
o unstable
è
molto divertente ma comporta qualche
rischio. Anche se la suite unstable
del sistema Debian
sembra molto stabile per la maggior parte del tempo, ci sono stati alcuni
problemi con i pacchetti delle suite testing
e
unstable
e qualcuno di questi non era affatto banale da
risolvere. Può essere piuttosto doloroso
per l'utente. A volte si hanno pacchetti con dipendenze non soddisfatte o
funzionalità mancanti per qualche settimana.
Ecco alcune idee per assicurare un recupero facile e veloce da bug nei pacchetti Debian.
stable
di
Debian in un'altra partizione
apt-listbugs
per
controllare le informazioni del Sistema Debian di tracciamento dei Bug
(BTS) prima degli aggiornamenti
(Se non si è in grado di intraprendere nessuna di queste azioni
precauzionali, probabilmente non si è pronti per le suite
testing
e unstable
.)
L'illuminazione data dalla lettura di ciò che segue salva l'utente dall'eterna lotta karmica con l'inferno degli aggiornamenti e gli fa raggiungere il nirvana Debian.
Guardiamo l'archivio Debian dalla prospettiva dell'utente.
La politica ufficiale per gli archivi Debian è definita nel Capitolo 2 - "L'archivo Debian", del manuale Debian Policy.
Per il normale accesso HTTP, l'archivio viene specificato nel file
"/etc/apt/sources.list
" come nell'esempio seguente per
l'attuale sistema stable
=
squeeze
.
deb http://ftp.XX.debian.org/debian/ squeeze main contrib non-free deb-src http://ftp.XX.debian.org/debian/ squeeze main contrib non-free deb http://security.debian.org/ squeeze/updates main contrib deb-src http://security.debian.org/ squeeze/updates main contrib
Notare che è necessario sostituire a "ftp.XX.debian.org
"
l'appropriato URL del sito mirror per la propria località che può essere
trovato nell'elenco di siti
mirror di Debian in tutto il mondo; per gli USA è
"ftp.us.debian.org
". Si può controllare lo stato di
questi server sul Sito di controllo
dei mirror Debian.
Viene qui usato il nome in codice "squeeze
invece del nome della suite "stable
" per evitare sorprese
una volta che venga rilasciata la nuova stable
.
La struttura di "/etc/apt/sources.list
" è descritta in
sources.list
(5) ed i punti chiave sono i seguenti.
deb
" definiscono voci per pacchetti binari.
deb-src
" definiscono voci per i pacchetti
sorgenti.
Le righe "deb-src
" possono essere tranquillamente omesse
(o commentate aggiungendo il carattere "#" all'inizio della riga) se si usa
solo aptitude
che non accede ai metadati relativi ai
sorgenti. Si velocizza così l'aggiornamento dei metadati
dell'archivio. L'URL può essere "http://
",
"ftp://
", "file://
", ….
Se nell'esempio precedente si usa "sid
" invece di
"squeeze
, in
"/etc/apt/sources.list
" non è richiesta la riga
"deb: http://security.debian.org/…
"
per gli aggiornamenti di sicurezza. Ciò è dovuto al fatto che non esiste un
archivio per gli aggiornamenti di sicurezza per "sid
"
(unstable
).
Ecco l'elenco dei siti degli archivi Debian e dei nomi di suite e nomi in codice usati nel file di configurazione.
Tabella 2.2. Elenco dei siti con l'archivo Debian
URL dell'archivio | nome suite (nome in codice) | scopo |
---|---|---|
http://ftp.XX.debian.org/debian/ |
stable (squeeze )
|
rilascio stable (squeeze) |
http://ftp.XX.debian.org/debian/ |
testing (wheezy )
|
rilascio testing (wheezy) |
http://ftp.XX.debian.org/debian/ |
unstable (sid )
|
rilascio unstable (sid) |
http://ftp.XX.debian.org/debian/ |
experimental
|
pre-rilascio sperimentale (opzionale, solo per sviluppatori) |
http://ftp.XX.debian.org/debian/ |
stable-proposed-updates
|
aggiornamenti per il prossimo rilascio stabile minore (opzionale) |
http://security.debian.org/ |
stable/updates
|
aggiornamenti di sicurezza per il rilascio stable (importante) |
http://security.debian.org/ |
testing/updates
|
aggiornamenti di sicurezza per il rilascio testing (importante) |
http://ftp.XX.debian.org/debian/ |
squeeze-updates
|
aggiornamenti compatibili per filtri anti-spam, client di messaggistica istantanea, ecc. per squeeze |
http://backports.debian.org/debian-backports/ |
squeeze-backports
|
pacchetti più recenti in versione backport per squeeze (opzionale) |
Solo il puro rilascio stable
con gli aggiornamenti di
sicurezza fornisce la massima stabilità. Avere un sistema basato per lo più
sul rilascio stable
con mescolati alcuni pacchetti dai rilasci testing
o unstable
è più rischioso che
avere un sistema basato su un puro rilascio unstable
per ciò che riguarda
conflitti tra le versioni di libreria, ecc.. Se si ha veramente bisogno, nel
rilascio stable
,
dell'ultima versione di qualche programma usare pacchetti dal squeeze-updates e backports.debian.org (vedere Sezione 2.7.4, «Updates e Backports»). Questi servizi devono essere usati con
estrema cautela.
Fondamentalmente si dovrebbe mettere una sola tra le suite
stable
, testing
o
unstable
nelle righe "deb
". Se si
elenca una combinazione delle suite stable
,
testing
e unstable
nelle righe
"deb
", il programma APT verrà rallentato e solo
l'archivio più recente avrà effetto. Elencare più di una voce ha senso
quando viene usato il file "/etc/apt/preferences
" con
scopi ben precisi (vedere Sezione 2.7.3, «Modificare la versione candidata»).
Per i sistemi Debian con le suite stable
e
testing
è una buona norma includere nel file
"/etc/apt/sources.list
" le righe con
"http://security.debian.org/
" per abilitare gli
aggiornamenti di sicurezza, come nell'esempio prededente.
I bug che riguardano la sicurezza per l'archivio stable
vengono risolti dal Debian Security Team, la cui attività è piuttosto
rigorosa ed affidabile. I bug per l'archivio testing
possono essere risolti dal Debian Security Team. Per svariate ragioni
questa attività non è così rigorosa come quella per
stable
e potrebbe essere necessario attendere la
migrazione di pacchetti unstable
corretti. I bug per
l'archivio unstable
sono corretti dal manutentore del
pacchetto; i pacchetti unstable
attivamente mantenuti
sono solitamente in una forma piuttosto buona dato che sfruttano le più
recenti correzioni a monte relative alla sicurezza. Per informazioni sul
modo in cui Debian gestisce i bug relativi alla sicurezza, vedere le FAQ Debian sulla sicurezza.
Tabella 2.3. Elenco delle aree dell'archivio Debian
area | numero di pacchetti | criterio dei componenti del pacchetto |
---|---|---|
main
|
29887 |
aderenti alle DFSG e senza dipendenze da non-free
|
contrib
|
202 |
aderenti alle DFSG ma con dipendenze da non-free
|
non-free
|
463 | non aderenti alle DFSG |
Nella tabella soprastante il numero dei pacchetti è per l'architettura
amd64. A rigor di termini, solo l'area main
dell'archivio dovrebbe essere considerata come sistema Debian.
L'organizzazione dell'archivio Debian può essere studiata meglio puntando il
proprio browser a ciascuno degli URL dell'archivio con aggiunto in coda
dists
o pool
.
Ci si riferisce alla distribuzione in due modi, con la suite o con il nome in codice. In alternativa la parola distribuzione viene usata come sinonimo di suite in molta documentazione. La relazione tra la suite e il nome in codice può essere riassunta nel modo seguente.
Tabella 2.4. Relazione tra suite e nome in codice
periodo |
suite = stable
|
suite = testing
|
suite = unstable
|
---|---|---|---|
dopo il rilascio squeeze
|
nome in codice = squeeze
|
nome in codice = wheezy
|
nome in codice = sid
|
dopo il rilascio wheezy
|
nome in codice = wheezy
|
nome in codice = wheezy+1
|
nome in codice = sid
|
La storia dei nomi in codice è descritta nelle FAQ Debian: 6.3.1 Quali altri nomi in codice sono stati usati in passato?
Nella terminologia per gli archivi Debian più precisa, la parola "sezione" è usata specificatamente per la categorizzazione dei pacchetti in base all'area di applicazione. (Anche se l'espressione "sezione main" può essere a volte usata per descrivere l'area dell'archivio Debian chiamata "main".)
Ogni volta che uno sviluppatore Debian (DD) carica un nuovo pacchetto
nell'archivio unstable
(passando per incoming), gli viene richiesto di assicurare che i
pacchetti caricati siano compatibili con l'insieme più recente di pacchetti
nell'archivio unstable
più recente.
Se un DD rompe questa compatibilità intenzionalmente per importanti aggiornamenti di librerie, ecc. di solito viene fatto un annuncio nella mailing list debian-devel, ecc.
Prima di muovere un insieme di pacchetti dall'archivio
unstable
all'archivio testing
, lo
script di gestione degli archivio Debian non solo controlla la maturità
(circa 10 giorni di età) e lo stato delle segnalazioni di bug RC per i
pacchetti, ma cerca anche di assicurare che siano compatibili con il più
recente insieme di pacchetti nell'archivio
testing
. Questo processo rende l'archivio
testing
molto aggiornato e usabile.
Attraverso il graduale processo di freeze dell'archivio, giudato dal team di
rilascio, l'archivio testing
viene fatto maturare con un
po' di intervento manuale per renderlo completamente coerente e libero da
bug. Quindi viene creato il nuovo rilascio stable
assegnando il nome in codice per il vecchio archivio
testing
al nuovo archivio stable
e
creando il nuovo nome in codice per il nuovo archivio
testing
. Il contenuto iniziale del nuovo archivio
testing
è esattamente lo stesso dell'archivio
stable
appena rilasciato.
Sia l'archivio unstable
sia l'archivio
testing
possono soffrire di problemi temporanei a causa
di diversi fattori.
unstable
)
unstable
)
testing
sia per unstable
)
testing
) ecc.
Perciò se si decide di usare questi archivi, si dovrebbe essere in grado di risolvere o aggirare questo tipo di problemi.
Per qualche mese circa dopo un nuovo rilascio stable
, la
maggior parte degli utenti desktop dovrebbe usare l'archivio
stable
con i suoi aggiornamenti di sicurezza, anche se di
solito usano gli archivi unstable
o
testing
. Durante questo periodo di transizione, entrambi
gli archivi unstable
e testing
non
sono adatti alla maggior parte degli utenti. È difficile mantenere il
proprio sistema in condizioni buone di funzionamento con l'archivio
unstable
dato che è affetto da ondate di aggiornamenti
importanti di pacchetti fondamentali. Anche l'archivio
testing
non è molto utile perché contiene per lo più le
stesse cose dell'archivio stable
senza il suo supporto
per la sicurezza (Debian
testing-security-announce 2008-12). Dopo circa un mese, l'archivio
unstable
potrebbe essere utilizzabile se si è cauti.
Quando si usa l'archivio testing
, i problemi causati da
un pacchetto rimosso vengono solitamente aggirati installando il
corrispondente pacchetto dall'archivio unstable
che è
caricato per risolvere un bug.
Vedere il manuale Debian Policy per le definizioni degli archivi.
Il sistema Debian offre un insieme coerente di pacchetti binari grazie al suo meccanismo di dichiarazione, nei campi di controllo dei file, delle dipendenze binarie basate su versioni . Ecco una definizione molto semplificata delle dipendenze.
"Depends" (Dipende)
"Pre-Depends" (Pre-dipende)
"Recommends" (Raccomanda)
"Suggests" (Consiglia)
"Enhances" (Migliora)
"Breaks" (Rompe)
"Conflicts" (Va in conflitto)
"Replaces" (Sostituisce)
"Provides" (Fornisce)
Notare che una buona configurazione per un pacchetto virtuale deve avere "Provides", "Conflicts" e "Replaces" simultaneamente definiti. Questo assicura che in un dato momento possa essere installato un solo pacchetto reale che fornisce il pacchetto virtuale.
La definizione ufficiale, compresa quella di dipendenza dei sorgenti, può essere trovata nel manuale Debian Policy, Capitolo 7, Dichiarare le relazioni tra i pacchetti.
Ecco un riassunto semplificato del flusso di eventi nella gestione dei pacchetti con APT.
Update - aggiorna l'elenco dei pacchetti
("aptitude update
" o "apt-get
update
"):
Upgrade - aggiorna ("aptitude
safe-upgrade
" e "aptitude full-upgrade
", o
"apt-get upgrade
" e "apt-get
dist-upgrade
"):
Install - installa ("aptitude
install …
" o "apt-get install …
"):
Remove - rimuove ("aptitude
remove …
" o "apt-get remove …
"):
Purge - elimina del tutto
("aptitude purge …
" o "apt-get purge
…
"):
Sono stati intenzionalmente omessi dettagli tecnici a favore di una più chiara vista d'insieme.
Si dovrebbe leggere la bella documentazione ufficiale. Il primo documento da
leggere è il file specifico per Debian,
"/usr/share/doc/<nome_pacchetto>/README.Debian
".
Andrebbe consultata anche l'altra documentazione in
"/usr/share/doc/<nome_pacchetto>/
. Se la shell è
impostata come in Sezione 1.4.2, «Personalizzare bash», digitare quanto
segue.
$ cd <nome_pacchetto> $ pager README.Debian $ mc
Per informazioni dettagliate potrebbe essere necessario installare il
pacchetto di documentazione corrispondente il cui nome ha il suffisso
"-doc
".
Se si stanno avendo problemi con un pacchetto specifico, ricordarsi come prima cosa di controllare il sito del Sistema Debian di tracciamento dei bug (BTS).
Tabella 2.5. Elenco dei siti web importanti per la risoluzione di problemi con un pacchetto specifico
sito web | comando |
---|---|
Pagina web del Sistema Debian di tracciamento dei bug (BTS) |
sensible-browser "http://bugs.debian.org/"
|
Segnalazioni di bug di un pacchetto specifico |
sensible-browser
"http://bugs.debian.org/<nome_pacchetto>"
|
Segnalazione di bug corrispondente ad un numero di bug |
sensible-browser
"http://bugs.debian.org/<numero_bug>"
|
Cercare conGoogle con parole chiave e
aggiungendo "site:debian.org
",
"site:wiki.debian.org
",
"site:lists.debian.org
", ecc.
Quando si invia una segnalazione di bug, usare il comando
reportbug
(1).
Le operazioni di base della gestione dei pacchetti sul sistema Debian
possono essere eseguite da qualsiasi strumento di gestione dei pacchetti
disponibile sul sistema Debian. Qui, verranno spiegati gli strumenti base di
gestione dei pacchetti: apt-get
/
apt-cache
e aptitude
.
Per operazioni di gestione dei pacchetti che comportano l'installazione o l'aggiornamento dei metadati dei pacchetti, è necessario avere privilegi di root.
I comandi apt-get
e apt-cache
sono gli
strumenti di gestione dei pacchetti più a livello base.
apt-get
e apt-cache
offrono solo
l'interfaccia utente a riga di comando.
apt-get
è più adatto per gli aggiornamenti principali del sistema tra rilasci
diversi, ecc.
apt-get
offre un sistema solido e
stabile di risoluzione dei conflitti dei pacchetti che utilizza i
comuni dati sullo stato dei pacchetti.
apt-get
è stato aggiornato per supportare l'installazione
e la rimozione automatiche dei pacchetti raccomandati.
apt-get
è stato aggiornato per supportare la
registrazione delle attività del pacchetto.
apt-cache
offre una ricerca standard, basata su espressioni regolari, nei nomi
e nelle descrizioni dei pacchetti.
apt-get
e apt-cache
possono gestire
più versioni dei pacchetti usando /etc/apt/preferences
,
ma è piuttosto elaborato farlo.
Il comando aptitude
è lo strumento di gestione dei
pacchetti più versatile.
aptitude
offre un'interfaccia utente testuale interattiva
a schermo intero.
aptitude
offre anche un'interfaccia utente a riga di
comando.
aptitude
è più adatto per la gestione interattiva quotidiana dei pacchetti, come
l'ispezione dei pacchetti installati e la ricerca dei pacchetti disponibili.
aptitude
offre un sistema migliorato di risoluzione dei conflitti dei
pacchetti che usa anche dati extra sullo stato dei pacchetti utilizzati solo
da aptitude
.
aptitude
supporta l'installazione e la rimozione
automatiche dei pacchetti raccomandati.
aptitude
supporta la registrazione delle attività del
pacchetto.
apt-cache
offre una ricerca migliorata, basata su espressioni regolari, su
tutti i metadati dei pacchetti.
aptitude
può gestire più versioni dei pacchetti senza
usare /etc/apt/preferences
e farlo è piuttosto intuitivo.
Sebbene il comando aptitude
sia dotato di moltissime
funzionalità come il suo risolutore avanzato di conflitti tra pacchetti,
questa complessità ha causato (o può ancora causare) alcune regressioni
quali i Bug # 411123, Bug # 514930 e Bug #
570377. In caso di dubbio, preferire i comandi
apt-get
e apt-cache
al comando
aptitude
.
Ecco alcune operazioni base di gestione dei pacchetti dalla riga di comando
usando aptitude
(8) e apt-get
(8)
/apt-cache
(8).
Tabella 2.6. Operazioni base di gestione dei pacchetti dalla riga di comando usando
aptitude
(8) e apt-get
(8)
/apt-cache
(8)
sintassi per aptitude
|
sintassi per apt-get /apt-cache
|
descrizione |
---|---|---|
aptitude update
|
apt-get update
|
aggiorna i metadati dell'archivio dei pacchetti |
aptitude install pippo
|
apt-get install pippo
|
installa la versione candidata del pacchetto "pippo " con
le sue dipendenze
|
aptitude safe-upgrade
|
apt-get upgrade
|
installa le versioni candidate dei pacchetti installati senza rimuovere altri pacchetti |
aptitude full-upgrade
|
apt-get dist-upgrade
|
installa le versioni candidate dei pacchetti installati e rimuove, se necessario, altri pacchetti |
aptitude remove pippo
|
apt-get remove pippo
|
rimuove il pacchetto "pippo " lasciando i suoi file di
configurazione
|
N/D |
apt-get autoremove
|
rimuove i pacchetti installati automaticamente che non sono più necessari |
aptitude purge pippo
|
apt-get purge pippo
|
elimina completamente il pacchetto "pippo " con i suoi
file di configurazione
|
aptitude clean
|
apt-get clean
|
pulisce completamente il repository locale dei file dei pacchetti scaricati |
aptitude autoclean
|
apt-get autoclean
|
pulisce il repository locale dei file dei pacchetti scaricati che sono obsoleti |
aptitude show pippo
|
apt-cache show pippo
|
mostra informazioni dettagliate sul pacchetto "pippo "
|
aptitude search <regex>
|
apt-cache search <regex>
|
cerca i pacchetti che corrispondono all'espressione regolare |
aptitude why <regex>
|
N/D | spiega le ragioni per cui i pacchetti che corrispondono a <regex> dovrebbero essere installati |
aptitude why-not <regex>
|
N/D | spiega le ragioni per cui i pacchetti che corrispondono a <regex> non dovrebbero essere installati |
Dato che apt-get
e aptitude
, a partire
da lenny
, condividono le informazioni suipacchetti
installati automaticamente (vedere Sezione 2.5.5, «Lo stato dei pacchetti per APT»), si può mescolare l'uso diquesti
strumenti senza particolari problemi (vedere il Bug
#594490).
La differenza tra
"safe-upgrade
"/"upgrade
" e
"full-upgrade
"/"dist-upgrade
" viene a
galla solamente quando nuove versioni di pacchetti hanno una diverse
relazioni di dipendenza rispetto alle vecchie versioni. Il comando
"aptitude safe-upgrade
" non installa nuovi pacchetti né
rimuove pacchetti installati.
"aptitude why <regex>
" può mostrare ancor più
informazioni se usato come "aptitude -v why
<regex>
". Informazioni simili possono essere ottenute con
"apt-cache rdepends <pacchetto>
".
Quando il comando aptitude
è avviato in modalità a riga
di comando e si trova davanti a problemi come conflitti tra pacchetti, si
può passare alla modalità interattiva a tutto schermo premendo
successivamente il tasto "e
" al prompt.
Si possono usare opzioni per il comando immediatamente dopo
"aptitude
".
Tabella 2.7. Opzioni degne di nota per il comando aptitude
(8)
opzione per il comando | descrizione |
---|---|
-s
|
simula il risultato del comando |
-d
|
scarica solamente ma non installa/aggiorna |
-D
|
mostra delle brevi spiegazioni prima di installazioni e rimozioni automatiche |
Per maggiori informazioni vedere aptitude
(8) e il
"manuale utente di aptitude" in
"/usr/share/doc/aptitude/README
".
Il pacchetto dselect
è ancora disponibile ed è stato lo
strumento a tutto schermo interattivo di gestione dei pacchetti dei rilasci
passati.
Per la gestione interattiva dei pacchetti, si avvia
aptitude
in modalità interattiva dal prompt di shell
della console nel modo seguente.
$ sudo aptitude -u Password:
In questo modo si aggiorna la copia locale delle informazioni sull'archivio
e viene mostrato l'elenco dei pacchetti in una schermata a pieno
schermo. Aptitude posiziona la sua configurazione in
"~/.aptitude/config
".
Se si desidera usare la configurazione di root, invece di quella
dell'utente, usare "sudo -H aptitude …
" invece di
"sudo aptitude …
", come nell'esempio precedente.
Aptitude
imposta automaticamente le azioni pendenti quando viene avviato in modalità
interattiva. Se ciò non piace, si può reimpostarlo usando il menu: "Azioni"
→ "Annulla azioni in attesa".
Quelle che seguono sono le associazioni di tasti degne di nota usate, nella modalità a schermo intero, per sfogliare lo stato dei pacchetti e per impostare "azioni pianificate" su di essi.
Tabella 2.8. Elenco delle associazioni di tasti per aptitude
tasto | azione associata |
---|---|
F10 o Ctrl-t
|
menu |
?
|
mostra l'aiuto per i tasti (elenco più completo) |
F10 → Aiuto → Manuale utente
|
mostra il Manuale utente |
u
|
aggiorna le informazioni sull'archivio dei pacchetti |
+
|
segna il pacchetto per l'aggiornamento o l'installazione |
-
|
segna il pacchetto per la rimozione (mantiene i file di configurazione) |
_
|
segna il pacchetto per l'eliminazione completa (rimuove i file di configurazione) |
=
|
blocca il pacchetto |
U
|
segna tutti i pacchetti aggiornabili (funziona come full-upgrade) |
g
|
inizia a scaricare e installare i pacchetti selezionati |
q
|
esce dalla schermata attuale e salva i cambiamenti |
x
|
esce dalla schermata attuale e scarta i cambiamenti |
Invio
|
visualizza le informazioni su un pacchetto |
C
|
visualizza il registro dei cambiamenti di un pacchetto |
l
|
cambia la limitazione dei pacchetti visualizzati |
/
|
cerca la prima corrispondenza |
\
|
ripete l'ultima ricerca |
Le espressioni regolari usate per specificare il nome di pacchetto nella
riga di comando e nel prompt del menu dopo aver premuto
"l
" o "//
" sono descritte in seguito.
Le espressioni regolari di aptitude possono esplicitamente trovare
corrispondenze con nomi di pacchetto usando una stringa che inizia con
"~n
seguita dal nome del pacchetto.
È necessario premere "U
" per aggiornare tutti i pacchetti
installati alla versione candidata
nell'interfaccia interattiva. Altrimenti vengono aggiornati alla versione candidata solo i pacchetti selezionati e
quelli da una cui particolare versione dipendono altri.
Nella modalità interattiva a tutto schermo di
aptitude
(8), i pacchetti nell'elenco vengono mostrati
come nell'esempio seguente.
idA libsmbclient -2220kB 3.0.25a-1 3.0.25a-2
Il significato degli elementi di questa riga, partendo da sinistra, è il seguente.
L'elenco completo dei flag è fornito alla fine della schermata mostrata di
Aiuto mostrata se si preme
"?
".
La versione candidata è scelta in base
alle preferenze locali attuali (vedere apt_preferences
(5)
e Sezione 2.7.3, «Modificare la versione candidata»).
Diversi tipi di viste per i pacchetti sono disponibili nel menu
"Viste
".
Tabella 2.9. Elenco delle viste di aptitude
vista | stato | descrizione della vista |
---|---|---|
Vista dei pacchetti
|
Buona | vedere Tabella 2.10, «Organizzazione delle viste standard dei pacchetti» (vista standard) |
Controlla Raccomandati
|
Buona | elenca i pacchetti che sono raccomandati da alcuni dei pacchetti installati, ma non sono ancora installati |
Elenco unico dei pacchetti
|
Buona | elenca i pacchetti senza organizzarli in gruppi (per l'uso con espressioni regolari) |
Consultazione per «Debtags»
|
Molto usabile | elenca i pacchetti organizzati in base alle loro voci Debtags |
Consultazione per categorie
|
Deprecata |
elenca i pacchetti organizzati in base alla loro categoria (usare al suo
posto Consultazione per «Debtags» )
|
È estremamente benvenuto ogni aiuto per migliorare l'assegnazione di etichette Debtags ai pacchetti!
La "Vista dei pacchetti
" standard organizza i pacchetti
un po' nello stile di dselect
con alcune funzionalità
extra.
Tabella 2.10. Organizzazione delle viste standard dei pacchetti
categoria | descrizione della vista |
---|---|
Pacchetti aggiornabili
|
elenca i pacchetti organizzati in sezione →
area → pacchetto
|
Pacchetti nuovi
|
" " |
Pacchetti installati
|
" " |
Pacchetti non installati
|
" " |
Pacchetti obsoleti e creati localmente
|
" " |
Pacchetti virtuali
|
elenca i pacchetti con la stessa funzione |
Task
|
elenca i pacchetti con funzioni diverse solitamente necessarie per una stessa attività |
La vista dei Task
può essere usata per scegliere a uno a
uno i pacchetti per le proprie attività.
Aptitude offre diverse opzioni per cercare pacchetti usando il suo schema di espressioni regolari.
Nella riga di comando della shell:
aptitude search '<regex_aptitude>'
" per elencare
lo stato di installazione, il nome del pacchetto ed una descrizione breve
dei pacchetti che corrispondono.
aptitude show '<nome_pacchetto>'
" per elencare una
descrizione dettagliata del pacchetto
Nella modalità interattiva a tutto schermo:
l
" per limitare la vista dei pacchetti ai pacchetti che
corrispondono
/
" per cercare un pacchetto che corrisponda
\
" per cercare all'indietro un pacchetto che corrisponda
n
" per trovare il successivo
N
" per trovare il successivo (all'indietro)
La stringa <package_name> viene usata per trovare una corrispondenza
esatta con il nome di pacchetto a meno che non venga esplicitamente fatta
iniziare con "~
" per indicare una espressione regolare.
La struttura delle espressioni regolari di aptitude è quella di ERE (vedere Sezione 1.6.2, «Espressioni regolari»)
estese in stile mutt ed il significato delle speciali regole estese di
corrispondenza, specifiche di aptitude
, è il seguente.
Tabella 2.11. Elenco delle regole per espressioni regolari di aptitude
descrizione della regola estesa di corrispondenza | struttura della espressione regolare |
---|---|
corrispondenza con il nome di pacchetto |
~n<regex_nome>
|
corrispondenza con la descrizione |
~d<regex_descrizione>
|
corrispondenza con il nome del task |
~t<regex_task>
|
corrispondenza con il debtag |
~G<regex_debtag>
|
corrispondenza con il manutentore |
~m<regex_mantainer>
|
corrispondenza con la sezione del pacchetto |
~s<regex_sezione>
|
corrispondenza con la versione del pacchetto |
~V<regex_versione>
|
corrispondenza con l'archivio |
~A{sarge,etch,sid }
|
corrispondenza con l'origine |
~O{debian,… }
|
corrispondenza con la priorità |
~p{extra,important,optional,required,standard }
|
corrispondenza con pacchetti essenziali |
~E
|
corrispondenza con pacchetti virtuali |
~v
|
corrispondenza con pacchetti nuovi |
~N
|
corrispondenza con azioni pendenti |
~a{install,upgrade,downgrade,remove,purge,hold,keep }
|
corrispondenza con pacchetti installati |
~i
|
corrispondenza con pacchetti installati e con l'indicatore A (pacchetti installati automaticamente) |
~M
|
corrispondenza con i pacchetti installati e senza l'indicatore A (pacchetti selezionati dall'amministratore) |
~i!~M
|
corrispondenza con pacchetti installati che sono aggiornabili |
~U
|
corrispondenza con pacchetti rimossi ma non eliminati completamente |
~c
|
corrispondenza con pacchetti rimossi, eliminati o che possono essere rimossi |
~g
|
corrispondenza con pacchetti con relazioni con problemi |
~b
|
corrispondenza con pacchetti con problemi di dipendenze, predipendenze e conflitti |
~B<tipogt;
|
corrispondenza con pacchetti per i quali è definita la relazione di tipo <tipo> verso il pacchetto <termine> |
~D[<tipogt;:]<termine>
|
corrispondenza con pacchetti per i quali è definita una relazione di tipo <type> con problemi verso il pacchetto <termine> |
~DB[<tipo>:]<termine>
|
corrispondenza con pacchetti verso i quali il pacchetto <termine> definisce una relazione di tipo <tipo> |
~R[<tipo>:]<termine>
|
corrispondenza con pacchetti verso i quali il pacchetto <termine> definisce una relazione |
~RB[<tipo>:]<termine>
|
corrispondenza con pacchetti da cui dipende un qualche altro pacchetto installato |
~R~i
|
corrispondenza con pacchetti da cui non dipende alcun pacchetto installato |
!~R~i
|
corrispondenza con pacchetti da cui dipende o che vengono raccomandati da qualche altro pacchetto |
~R~i|~Rrecommends:~i
|
corrispondenza con pacchetti che la cui versione corrisponde al filtro e che corrispondono a <termine> |
~S filtro <termine>
|
corrispondenza con tutti i pacchetti (vero) |
~T
|
corrispondenza con nessun pacchetto (falso) |
~F
|
^
", ".*
",
"$
", ecc. come in egrep
(1),
awk
(1) e perl
(1).
Quando <modello_regex> è una stringa vuota, mettere
"~T
" immediatamente dopo il comando.
Ecco alcune scorciatoie.
~P<termine>
" ==
"~Dprovides:<termine>
"
~C<termine>
" ==
"~Dconflicts:<termine>
"
…~W termine
" == "(…|termine)
"
Gli utenti che hanno familiarità con mutt
imparano
presto, dato che la sintassi per le espressioni si è ispirata a mutt. Vedere
"SEARCHING, LIMITING, AND EXPRESSIONS" nel "Manuale utente",
"/usr/share/doc/aptitude/README
".
Con la versione lenny
di aptitude
(8),
può essere usata la nuova sintassi in forma
lunga come "?broken
" invece del vecchio
equivalente in forma breve "
"~b
". Il carattere di spazio "
" è ora
considerato uno dei caratteri che terminano l'espressione regolare, oltre al
carattere tilde "~
". Vedere il "Manuale utente" per la
sintassi della nuova forma lunga.
Se la voce di menuF10
→ Options → Gestione delle
dipendenze" è impostata in modo appropriato, selezionando un pacchetto in
aptitude
non si richiamano solamente i pacchetti definiti
nel suo elenco "Depends:
", ma anche quelli nell'elenco
"Recommends:
". Questi pacchetti installati
automaticamente vengo rimossi automaticamente se non sono più necessari
secondo aptitude
.
Prima del rilascio lenny
, apt-get
e
gli altri strumenti APT standard non offrivano la funzionalità di rimozione
automatica.
Si può controllare lo storico delle attività sui pacchetti nei file di registro.
Tabella 2.12. File di registro per le attività sui pacchetti
file | contenuto |
---|---|
/var/log/dpkg.log
|
Registro delle attività a livello dpkg per tutte le
attività sui pacchetti
|
/var/log/apt/term.log
|
Registro delle attività APT generiche |
/var/log/aptitude
|
Registro delle attività di comandi aptitude
|
In realtà non è facile ottenere delle informazioni immediatamente comprensibili da questi file di registro. Vedere Sezione 9.2.10, «Registrare i cambiamenti a file di configurazione» per un metodo più facile.
Ecco alcuni esempi di operazioni con aptitude
(8).
Il seguente comando elenca i pacchetti i cui nomi corrispondono alle espressioni regolari specificate.
$ aptitude search '~n(pam|nss).*ldap' p libnss-ldap - NSS module for using LDAP as a naming service p libpam-ldap - Pluggable Authentication Module allowing LDAP interfaces
È piuttosto utile se si desidera trovare il nome esatto di un pacchetto.
L'espressione regolare "~dipv6
" nel prompt di
"l
" nella vista "Nuovo elenco unico dei pacchetti",
limita la visualizzazione dei pacchetti a quelli la cui descrizione
corrisponde all'espressione "ipv6" e permette di sfogliare interattivamente
le loro informazioni.
Si possono eliminare tutti i file di configurazione rimasti di pacchetti rimossi.
Controllare il risultato del comando seguente.
# aptitude search '~c'
Se si pensa che sia giusto rimuover i pacchetti elencati, eseguire il comando seguente.
# aptitude purge '~c'
Si può fare la stessa cosa in modalità interattiva per avere un controllo più dettagliato.
Fornire l'espressione regolare "~c
" al prompt di
"l
" nella vista "Nuovo elenco unico dei pacchetti". In
questo modo si limita la visualizzazione a quei pacchetti che corrispondono
all'espressione regolare, cioè "rimossi ma non eliminati
completamente". Tutte le corrispondenze trovate possono essere mostrate
premendo "[
" nelle intestazioni di primo livello.
Premere poi "_
" nell'intestazione di primo livello, come
"Pacchetti installati". In questo modo vengono selezionati per
l'eliminazione completa solo quei pacchetti contenuti sotto l'intestazione
che corrispondono all'espressione regolare. Si possono escludere alcuni
pacchetti dall'eliminazione premendo "=
" per ciascuno di
essi.
Questa tecnica è piuttosto comoda e funziona per molti altri tasti di comando.
Ecco come faccio per mettere ordine nello stato di installazione automatico/non automatico per i pacchetti (dopo aver usato un installatore che non sia aptitude, ecc.).
aptitude
in modalità interattiva.
u
", "U
",
"f
" e "g
" per aggiornare l'elenco dei
pacchetti e i pacchetti stessi.
l
" per impostare la limitazione della
visualizzazione con "~i(~R~i|~Rrecommends:~i)
" e digitare
"M
" su "Pacchetti installati
" per
marcarli come installati automaticamente.
l
" per impostare la limitazione della
visualizzazione dei pacchetti con
"~prequired|~pimportant|~pstandard|~E
" e digitare
"m
" su "Pacchetti installati
" per
marcarli come installati manualmente.
l
" per impostare la limitazione della
visualizzazione dei pacchetti con "~i!~M
" e rimuovere i
pacchetti inutilizzati digitando "-
" su ciascuno di essi
dopo averli visualizzati digitando "[
" su
"Pacchetti installati
".
l
" per impostare la limitazione della
visualizzazione dei pacchetti con "~i
" e digitare
"m
" su "Task
" per marcarli come
installati manualmente.
aptitude
.
apt-get -s autoremove|less
" da root per
controllare quelli che non sono usati.
aptitude
in modalità interattiva e segnare i
pacchetti necessari con "m
".
apt-get -s autoremove|less
" da root per
controllare che in REMOVED siano contenuti soltanto i pacchetti attesi.
apt-get autoremove|less
" da root per rimuovere
automaticamente i pacchetti non utilizzati.
L'azione "m
" sopra "Task
" è opzionale
e server per prevenire situazioni di rimozioni di massa di pacchetti in
futuro.
Quando si passa ad un nuovo rilascio, ecc. si dovrebbe considerare una installazione pulita di un nuovo sistema anche se è possibile aggiornare Debian nel modo descritto in seguito. Ciò dà la possibilità di rimuovere la spazzatura raccolta nel tempo e fornisce la migliore combinazione dei pacchetti più nuovi. Naturalmente si dovrebbe fare un backup completo del sistema in un posto sicuro (vedere Sezione 10.1.6, «Backup e ripristino») prima di farlo. Raccomando di creare una configurazione con due sistemi avviabili usando due diverse partizioni per avere una transizione il più lineare possibile.
Si può fare l'aggiornamento completo del sistema ad un nuovo rilascio
cambiando il contenuto del file "/etc/apt/sources.list
"
facendolo puntare al nuovo rilascio ed eseguendo il comando
"apt-get update; apt-get dist-upgrade
".
Per aggiornare da stable
a testing
o
unstable
, sostituire
""squeeze
" nel file
"/etc/apt/sources.list
" di esempio descritto in Sezione 2.1.4, «Nozioni di base sugli archivi Debian» con
"wheezy
" o "sid
".
In realtà si possono dover affrontare alcune complicazioni a causa di
problemi di transizione dei pacchetti, per lo più a causa di dipendenze. Più
è grande la differenza nell'aggiornamento, più è probabile dover affrontare
problemi più grossi. Per la transizione dal vecchio rilascio
stable
al nuovo stable
si possono
leggere le nuove Note di rilascio e
seguire esattamente la procedura che vi è descritta per minimizzare i
problemi.
Quando si decide di passare da stable
a
testing
prima del suo rilascio formale non ci sono Note di rilascio che possano aiutare. La
differenza tra stable
e testing
potrebbe essere diventata piuttosto grande dopo il precendente rilascio
stable
e potrebbe rendere l'aggiornamento complicato.
SI dovrebbero prendere misure precauzionali per l'aggiornamento completo raccogliendo le informazioni più aggiornate da mailing list ed usando il buon senso.
script
(1).
aptitude unmarkauto vim
, per prevenire la loro
rimozione.
/etc/apt/preferences
" (disabilitare
apt-pinning).
oldstable
→
stable
→ testing
→
unstable
.
/etc/apt/sources.list
per farlo
puntare solamente al nuovo archivio ed eseguire "aptitude
update
".
aptitude install perl
".
apt-get -s dist-upgrade
" per avere
un'idea dell'impatto dell'aggiornamento.
apt-get dist-upgrade
".
Non è saggio saltare un rilascio principale Debian quando si aggiorna da un
rilascio stable
ad un altro.
Nelle "Note di rilascio" precedenti GCC, il kernel Linux, initrd-tools, Glibc, Perl, APT tool chain, ecc. hanno richiesto un po' di attenzione particolare per gli aggiornamenti dell'intero sistema.
Per gli aggiornamenti quotidiani in unstable
, vedere
Sezione 2.4.3, «Salvaguardarsi da problemi coi pacchetti».
Ecco un elenco di altre operazioni di gestione dei pacchetti per i quali
aptitude
è di livello troppo altro o manca delle
funzionalità richieste.
Tabella 2.13. Elenco delle operazioni avanzate per la gestione dei pacchetti
comando | azione |
---|---|
COLUMNS=120 dpkg -l <modello_nome_pacchetto>
|
elenca lo stato di un pacchetto installato per una segnalazione di bug |
dpkg -L <nome_pacchetto>
|
elenca il contenuto di un pacchetto installato |
dpkg -L <nome_pacchetto> | egrep
'/usr/share/man/man.*/.+'
|
elenca le pagine man di un pacchetto installato |
dpkg -S <modello_nome_file>
|
elenca i pacchetti installati che uno un file con un nome che corrisponde al modello |
apt-file search <modello_nome_file>
|
elenca i pacchetti nell'archivio che hanno un file con un nome che corrisponde al modello |
apt-file list <modello_nome_pacchetto>
|
elenca il contenuto dei pacchetti nell'archivio che corrispondono al modello |
dpkg-reconfigure <nome_pacchetto>
|
riconfigurare il pacchetto con esattamente quel nome |
dpkg-reconfigure -p=low <nome_pacchetto>
|
riconfigurare il pacchetto con esattamente quel nome ponendo le domande più dettagliate |
configure-debian
|
riconfigura i pacchetti da un'interfaccia a tutto schermo a menu |
dpkg --audit
|
controlla il sistema alla ricerca di pacchetti parzialmente installati |
dpkg --configure -a
|
configura tutti i pacchetti parzialmente installati |
apt-cache policy <nome_pacchetto_binario>
|
mostra la versione disponibile, la priorità e le informazioni nell'archivio di un pacchetto binario |
apt-cache madison <nome pacchetto>
|
mostra la versione disponibile e le informazioni nell'archivio di un pacchetto |
apt-cache showsrc <nome_pacchetto_binario>
|
mostra informazioni sul pacchetto sorgente di un pacchetto binario |
apt-get build-dep <nome_pacchetto>
|
installa i pacchetti richiesti per compilare un pacchetto |
apt-get source <nome_pacchetto>
|
scarica un sorgente (da un archivio standard) |
dget <URL del file dsc>
|
scarica un pacchetto sorgente (da un altro archivio) |
dpkg-source -x
<nome_pacchetto>_<versione>-<versione_debian>.dsc
|
crea un albero dei sorgetti a partire da un insieme di pacchetti sorgenti
("*.orig.tar.gz " e
"*.debian.tar.gz "/"*.diff.gz ")
|
debuild binary
|
compila pacchetti da un albero dei sorgenti locale |
make-kpkg immagine_kernel
|
compila un pacchetto kernel a partire da un albero dei sorgenti del kernel |
make-kpkg --initrd immagine_kernel
|
compila un pacchetto kernel con initramfs abilitato, a partire da un albero dei sorgenti |
dpkg -i
<nome_pacchetto><versione>-<versione_debian><arch>.deb
|
installa un pacchetto locale nel sistema |
debi
<nome_pacchetto><versione>-<versione_debian><arch>.dsc
|
installa pacchetti locali nel sistema |
dpkg --get-selections '*' >selection.txt
|
salva le informazioni di stato sui pacchetti selezionati a livello di
dpkg
|
dpkg --set-selections <selection.txt
|
imposta le informazioni di stato sui pacchetti selezionati a livello di
dpkg
|
echo <package_name> hold | dpkg --set-selections
|
impostare lo stato di selezione di un pacchetto a livello di
dpkg a hold
(equivalente a "aptitude hold<nome_pacchetto> ")
|
Gli strumenti per i pacchetti a più basso livello, come "dpkg -i
…
" e "debi …
" dovrebbero essere usati con molta
cura dall'amministratore di sistema. Non si prendono cura in modo automatico
delle dipendenze richieste dai pacchetti. Le opzioni
"--force-all
" e simili, per la riga di comando di dpkg
(vederedpkg
(1), sono pensate per essere usate solamente
da utenti esperti. Usarle senza comprenderne pienamente l'effetto potrebbe
portare tutto il sistema in uno stato problematico.
Notare quanto segue.
aptitude
che usa espressioni regolari
(vedere Sezione 1.6.2, «Espressioni regolari»), gli altri comandi di
gestione dei pacchetti usano espansioni di modelli in stile shell (vedere
Sezione 1.5.6, «Glob sella shell»).
apt-file
(1), fornito dal pacchetto
apt-file
, è necessario eseguire prima "apt-file
update
".
configure-debian
(8), fornito dal pacchetto
configure-debian
esegue
dpkg-reconfigure
(8) come suo backend.
dpkg-reconfigure
(8) esegue gli script dei pacchetti
usando debconf
(1) come suo backend.
apt-get build-dep
", "apt-get
source
" e "apt-cache showsrc
" richiedono la
voce "deb-src
" in
"/etc/apt/sources.list
".
dget
(1), debuild
(1) e
debi
(1) richiedono il pacchetto
devscripts
.
apt-get
source
" in Sezione 2.7.10, «Fare il port di un pacchetto nel sistema stabile».
make-kpkg
richiede il pacchetto
kernel_package
(vedere Sezione 9.7, «Il kernel»).
L'installazione di debsums
permette la verifica dei file
di pacchetto installati in base ai valori delle somme di controllo MD5sum
nei file "/var/lib/dpkg/info/*.md5sums
" con
debsums
(1). Per il funzionamento di MD%sum vedere Sezione 10.4.5, «Somme di controllo MD5».
Dato che il database MD5sum può essere manomesso da un intruso,
debsums
ha un'utilità limitata come strumento di
sicurezza. È adatto solo per controllare modifiche fatte dall'amministratore
o danni dovuti ad errori dei supporti.
Molti utenti preferiscono usare il rilascio unstable del sistema Debian per avere le nuove funzionalità ed i nuovi pacchetti. Questo rende il sistema più esposto a bug critici sui pacchetti.
L'installazione del pacchetto apt-listbugs
salvaguarda il
sistema dai bug critici controllando automaticamente, al momento degli
aggiornamenti fatti con il sistema APT, il BTS Debian alla ricerca dei bug
critici.
L'installazione del pacchetto apt-listchanges
fornisce
importanti notizie contenute in NEWS.Debian
quando si
fanno aggiornamenti con il sistema APT.
Sebbene visitare il sito Debian http://packages.debian.org/ faciliti oggi giorno la ricerca nei metadati dei pacchetti, ci sono metodi più tradizionali per farlo.
I comandi grep-dctrl
(1),
grep-status
(1) e grep-available
(1)
possono essere usati per cercare in qualsiasi file che sia nel formato
generico dei file di controllo dei pacchetti di Debian.
"dpkg -S <modello_nome_file>
" può essere usato per
cercare i pacchetti che contengono al loro interno file installati da
dpkg
il cui nome corrisponde al modello. Ma non trova i
file creati dagli script dei manutentori.
Se è necessario fare ricerche più elaborate sui metadati dei pacchetti, è
necessario eseguire il comando "grep -e modello_regex *
"
nella directory "/var/lib/dpkg/info/
". In questo modo si
cercano le parole indicate negli script e nei testi con le domande di
installazione dei pacchetti.
Se si desiderano vedere in modo ricorsivo le dipendenze dei pacchetti, si
dovrebbe usare apt-rdepends
(8).
Verranno ora trattati alcuni aspetti tecnici interni del funzionamento del sistema di gestione dei pacchetti Debian. Queste informazioni dovrebbero aiutare a trovare soluzioni proprie ai problemi con i pacchetti.
I file con i metadati per ciascuna distribuzione sono archiviati in
"dists/<codename>
" su ciascun sito mirror di
Debian, ad esempio "http://ftp.us.debian.org/debian/
". La
struttura del suo archivio può essere navigata con il browser web. Ci sono 6
tipi di metadati.
Tabella 2.14. Il contenuto dei metadati dell'archivio Debian
file | posizione | contenuto |
---|---|---|
Release
|
directory della distribuzione di più alto livello | descrizione dell'archivio e informazioni sull'integrità |
Release.gpg
|
directory della distribuzione di più alto livello |
file di firma per il file "Release " firmato con la chiave
dell'archivio
|
Contents-<architettura>
|
directory della distribuzione di più alto livello | elenca tutti i file per tutti i pacchetti nell'archivio relativo |
Release
|
directory più elevata per ciascuna combinazione distribuzione/area/architettura |
descrizione dell'archivio usata per le regole di
apt_preferences (5)
|
Packages
|
directory più elevata per ciascuna combinazione distribuzione/area/architettura-binaria |
dati debian/control concatenati dei pacchetti binari
|
Sources
|
directory più elevata per ciascuna combinazione distribuzione/area/source |
dati debian/control concatenati dei pacchetti sorgenti
|
Negli archivi recenti questi metadati sono memorizzati come file compressi e file di differenze per ridurre il traffico di rete.
Il file "Release
" nella directory di livello più alto è
usato per firmare gli archivi nel sistema secure
APT.
Ogni suite dell'archivio Debian ha un file "Release
"
nella sua directory di livello più alto, ad esempio
"http://ftp.us.debian.org/debian/dists/unstable/Release
",
di questo tipo.
Origin: Debian Label: Debian Suite: unstable Codename: sid Date: Sat, 26 Jan 2008 20:13:58 UTC Architectures: alpha amd64 arm hppa hurd-i386 i386 ia64 m68k mips mipsel powerpc s390 sparc Components: main contrib non-free Description: Debian x.y Unstable - Not Released MD5Sum: e9f11bc50b12af7927d6583de0a3bd06 22788722 main/binary-alpha/Packages 43524d07f7fa21b10f472c426db66168 6561398 main/binary-alpha/Packages.gz ...
Qui si può scoprire il motivo per cui un questa guida si è scelto di usare "suite" e "codename" in Sezione 2.1.4, «Nozioni di base sugli archivi Debian». Il termine "distribuzione" è usato per riferirsi sia a "suite" sia a "codename". Tutti i nomi delle "aree" dell'archivio offerte da un archivio sono elencate in "Componente".
L'integrità del file "Release
" nella directory base viene
verificata usando l'infrastruttura crittografica chiamata secure apt.
Release.gpg
" con la firma crittografica viene
creato a partire dal file "Release
" nella directory base
e dalla chiave segreta dell'archivio Debian.
La chiave pubblica dell'archivio Debian può essere inserita in
"/etc/apt/trusted.gpg
"
base-files
più recente o
gpg
o
apt-key
con la più recente chiave pubblica
dell'archivio pubblicata su ftp-master.debian.org .
Release
" di più
alto livello scaricato con questo file "Release.gpg
" e la
chiave pubblica dell'archivio Debian in
"/etc/apt/trusted.gpg
".
L'integrità di tutti i file "Packages
" e
"Sources
" viene verificata usando i valori MD5sum nel
file "Release
" nella ripsettiva directory
base. L'integrità di tutti i file di pacchetto viene verificata usando i
valori MD5sum nei file "Packages
" e
"Sources
". Vedere debsums
(1) e Sezione 2.4.2, «Verifica dei pacchetti installati».
Dato che la verifica crittografica della firma è un processo molto
dispendioso in termini di uso della CPU rispetto al calcolo di valori
MD5sum, l'uso di valori MD5sum per ciascun pacchetto mentre viene usata la
firma crittografica per il file "Release
" principale,
fornisce una buona sicurezza
con buone prestazioni (vedere Sezione 10.4, «Infrastruttura di sicurezza dei dati»).
I file "Release
" a livello di archivio sono usati per le
regole di apt_preferences
(5).
Ci sono file "Release
" a livello di archivio per tutte le
posizioni nell'archivio specificate dalla riga "deb
" in
"/etc/apt/sources.list
", come
"http://ftp.us.debian.org/debian/dists/unstable/main/binary-amd64/Release
"
o
"http://ftp.us.debian.org/debian/dists/sid/main/binary-amd64/Release
"
nell'esempio seguente.
Archive: unstable Component: main Origin: Debian Label: Debian Architecture: amd64
Nell'archivio Debian, per la voce
"Archive:
vengono usati i nomi di suite
("stable
", "testing
",
"unstable
", …), mentre vengono usati i nomi in codice
("dapper
", "feisty
",
"gutsy
", "hardy
",
"intrepid
", …) nell'archivio Ubuntu.
Per alcuni archivi, come experimental
e
squeeze-backports
, che contengono pacchetti che
non dovrebbero essere installati automaticamente, c'è una riga addizionale,
come ad esempio nell'esempio seguente da
"http://ftp.us.debian.org/debian/dists/experimental/main/binary-amd64/Release
".
Archive: experimental Component: main Origin: Debian Label: Debian NotAutomatic: yes Architecture: amd64
Notare che per gli archivi normali senza la riga "NotAutomatic:
yes
", il valore predefinito per la priorità di Pin è 500, mentre
per gli archivi speciali con "NotAutomatic: yes
", il
valore predefinito per la priorità di Pin è 1 (vedere
apt_preferences
(5) e Sezione 2.7.3, «Modificare la versione candidata»).
Quando si usano strumenti APT, quali aptitude
,
apt-get
, synaptic
,
apt-file
, auto-apt
…, è necessario
aggiornare le copie locali dei metadati contenenti le informazioni
sull'archivio Debian. Queste copie locali hanno i seguenti nomi di file che
corrispondono ai nomi di distribuzione
,
area
e architettura
specificati in
"/etc/apt/sources.list
" (vedere Sezione 2.1.4, «Nozioni di base sugli archivi Debian»).
/var/lib/apt/lists/ftp.us.debian.org_debian_dists_<distribuzione>_Release
"
/var/lib/apt/lists/ftp.us.debian.org_debian_dists_<distribuzione>_Release.gpg
"
/var/lib/apt/lists/ftp.us.debian.org_debian_dists_<distribuzione>_<area>_binary-<architettura>_Packages
"
/var/lib/apt/lists/ftp.us.debian.org_debian_dists_<distribuzione>_<area>_source_Sources
"
/var/cache/apt/apt-file/ftp.us.debian.org_debian_dists_<distribuzione>_Contents-<architettura>.gz
"
(per apt-file
)
I primi quattro tipi di file sono condivisi da tutti i comandi APT
pertinenti e vengono aggiornati dalla riga di comando con "apt-get
update
" e "aptitude update
". I metadati
"Packages
" sono aggiornati se esiste la riga
"deb
" in "/etc/apt/sources.list
". I
metadati "Sources
" sono aggiornati se esiste la riga
"deb-src
" in "/etc/apt/sources.list
".
I metadati "Packages
" e "Sources
"
contengono la voce "Filename:
" che punta alla posizione
dei file dei pacchetti binari e sorgenti. Attualmente questi pacchetti sono
posizionati nell'albero di directory "pool/
" per una
transizione migliore tra i rilasci.
Le copie locali dei metadati "Packages
" possono essere
ricercate interattivamente con l'aiuto di aptitude
. Il
comando specializzato di ricerca grep-dctrl
(1) può
cercare nelle copie locai dei metadati "Packages
" e
"Sources
".
La copia locale dei metadati
"Contents-<architettura>
" può essere aggiornata con
"apt-file update
" e la sua posizione è diversa da quella
degli altri quattro file. Vedere
apt-file
(1). (auto-apt
usa in modo
predefinito una posizione differente per la copia locale di
"Contents-<architettura>.gz
".)
In aggiunta ai metadati recuperati da remoto, lo strumento APT, a partire da
lenny
, memorizza le informazioni generate localmente
sullo stato delle installazioni in
"/var/lib/apt/extended_states
" che è usato da tutti gli
strumenti APT per tenere traccia dei pacchetti installati automaticamente.
In aggiunta ai metadati recuperati da remoto, il comando
aptitude
memorizza le informazioni generate localmente
sullo stato delle installazioni in
"/var/lib/aptitude/pkgstates
" che è usato solo da esso.
Tutti i pacchetti scaricati da remoto attraverso il meccanismo APT vengono
salvati nella directory "/var/cache/apt/packages
" fino a
che non vengono cancellati.
I file di pacchetto Debian hanno nomi con una particolare struttura.
Tabella 2.15. La struttura dei nomi dei pacchetti Debian
tipo di pacchetto | struttura del nome |
---|---|
Il pacchetto binario (alias deb )
|
<nome-pacchetto>_<epoca>:<versione-originale>-<versione.debian>-<architettura>.deb
|
Il pacchetto binario (alias udeb )
|
<nome-pacchetto>_<epoca>:<versione-originale>-<versione.debian>-<architettura>.udeb
|
Il pacchetto sorgente (sorgenti originali) |
<nome-pacchetto>_<epoca>:<versione-originale>-<versione.debian>.orig.tar.gz
|
Il pacchetto sorgente 1.0 (modifiche Debian)
|
<nome-pacchetto>_<epoca>:<versione-originale>-<versione.debian>.diff.gz
|
Il pacchetto sorgente 3.0 (quilt) (modifiche Debian)
|
<nome-pacchetto>_<epoca>:<versione-originale>-<versione.debian>.debian.tar.gz
|
Il pacchetto sorgente (descrizione) |
<nome-pacchetto>_<epoca>:<versione-originale>-<versione.debian>.dsc
|
Sono qui descritti solamente i formati base dei pacchetti sorgenti. Per
ulteriori informazioni vedere dpkg-source
(1).
Tabella 2.16. I caratteri utilizzabili all'interno di ciascuna porzione del nome dei pacchetti Debian
nome porzione | caratteri utilizzabili (espressione regolare) | presenza |
---|---|---|
<nome-pacchetto>
|
[a-z,A-Z,0-9,.,
|
richiesta |
<epoca>:
|
[0-9]+:
|
opzionale |
<versione-originale>
|
[a-z,A-Z,0-9,.,
|
richiesta |
<versione.debian>
|
[a-z,A-Z,0-9,.,
|
opzionale |
Si può controllare l'ordine delle versioni dei pacchetti con
dpkg
(1), per esempio con "dpkg
--compare-versions 7.0 gt 7.~pre1 ; echo $?
".
L'installatore Debian (d-i) usa
come estensione per i suoi pacchetti binari udeb
invece
della normale deb
. Un pacchetto udeb
è
un pacchetto deb
ridotto al minimo, con rimossi alcuni
contenuti non essenziali come la documentazione, per risparmiare spazio
seguendo meno rigorosamente i requisiti richiesti dalle norme per i
pacchetti. Entrambi i pacchetti deb
e
udeb
condividono la stessa struttura di pacchetto. La
"u
" sta per micro.
dpkg
(1) è lo strumento di più basso livello per la
gestione dei pacchetti Debian. È molto potente e deve essere usato con
cautela.
Quando installa un pacchetto chiamato
"<nome_pacchetto>
", dpkg
fa
nell'ordine elencato le seguenti operazioni.
ar -x
")
<nome_pacchetto>.preinst
" usando
debconf
(1)
tar -x
")
<nome_pacchetto>.postinst
" usando
debconf
(1)
Il sistema debconf
fornisce un'interazione standard con
l'utente con supporto per internazionalizzazione e localizzazione (Capitolo 8, I18N e L10N).
Tabella 2.17. I file degni di nota creati da dpkg
file | descrizione del contenuto |
---|---|
/var/lib/dpkg/info/<nome_pacchetto>.conffiles
|
elenco di file di configurazione (modificabile dall'utente) |
/var/lib/dpkg/info/<nome_pacchetto>.list
|
elenco dei file e delle directory installate dal pacchetto |
/var/lib/dpkg/info/<nome_pacchetto>.md5sums
|
elenco dei valori degli hash MD5 per i file installati dal pacchetto |
/var/lib/dpkg/info/<nome_pacchetto>.preinst
|
script eseguito prima dell'installazione del pacchetto |
/var/lib/dpkg/info/<nome_pacchetto>.postinst
|
script eseguito dopo l'installazione del pacchetto |
/var/lib/dpkg/info/<nome_pacchetto>.prerm
|
script eseguito prima della rimozione del pacchetto |
/var/lib/dpkg/info/<nome_pacchetto>.postrm
|
script eseguito dopo la rimozione del pacchetto |
/var/lib/dpkg/info/<nome_pacchetto>.config
|
script per il sistema debconf
|
/var/lib/dpkg/alternatives/<nome_pacchetto>
|
informazioni sulle alternative usate dal comando
update-alternatives
|
/var/lib/dpkg/available
|
informazioni sulla disponibilità per tutti i pacchetti |
/var/lib/dpkg/diversions
|
le informazioni sulle diversioni usate da dpkg (1) e
impostate con "dpkg-divert"(8)
|
/var/lib/dpkg/statoverride
|
le informazioni di sovrascrittura di stato usate da
dpkg (1) e impostate da "dpkg-statoverride"(8)
|
/var/lib/dpkg/status
|
le informazioni sullo stato per tutti i pacchetti |
/var/lib/dpkg/status-old
|
la prima generazione di backup del file
"var/lib/dpkg/status "
|
/var/backups/dpkg.status*
|
la seconda generazione e le generazioni precedenti di backup del file
"var/lib/dpkg/status "
|
Il file "status
" è anche usato da altri strumenti come
dpkg
(1): "dselect update
" e
"apt-get -u dselect-upgrade
".
Il comando di ricerca specializzato grep-dctrl
(1) può
ricercare nelle copie locali dei metadati "status
" e
"available
"
Nell'ambiente dell'installatore
Debian, viene usato il comando udpkg
per aprire i
pacchetti udeb
. Il comando udpkg
è una
versione ridotta al minimo del comando dpkg
.
Il sistema Debian ha un meccanismo per installare senza problemi programmi
che si sovrappongono nelle loro funzioni usando
update-alternatives
(8). Per esempio, si può far sì che il
comando vi
esegue vim
quando si sono
installati entrambi i pacchetti vim
e
nvi
.
$ ls -l $(type -p vi) lrwxrwxrwx 1 root root 20 2007-03-24 19:05 /usr/bin/vi -> /etc/alternatives/vi $ sudo update-alternatives --display vi ... $ sudo update-alternatives --config vi Selezione Percorso ---------------------------------------------- 1 /usr/bin/vim *+ 2 /usr/bin/nvi Premere Invio per mantenere il valore predefinito[*] o digitare il numero della selezione: 1
Il sistema delle alternative Debian mantiene le proprie selezioni in forma
di collegamenti simbolici in "/etc/alternatives/
". Il
procedimento di selezione usa i file corrispondenti in
"/var/lib/dpkg/alternatives/
".
La sovrascrittura dello stato fornita dal
comando dpkg-statoverride
(8) è un modo per dire a
dpkg
(1) di usare un proprietario o una modalità diversa
per un file quando viene installato un
pacchetto. Se viene specificato "--update
" e il file
esiste già, viene immediatamente impostato con il prorpietario e la modalità
nuovi.
La modifica diretta del proprietario o della modalità, usando
chmod
o chown
, di un file che appartiene ad un pacchetto da parte
dell'amministratore del sistema viene vanificata dal successivo
aggiornamento del pacchetto.
È stata usata la parola file, ma in
realtà si può trattare di un qualsiasi oggetto nel file system gestito da
dpkg
, inclusi directory, device, ecc.
Le deviazioni per i file fornite dal
comando dpkg-divert
(8) sono un modo per forzare
dpkg
(1) a non installare un file nella sua posizione
predefinita, ma in una posizione deviata. L'uso di dpkg-divert
è
pensato per gli script di manutenzione dei pacchetti. Il suo uso in maniera
superficiale da parte dell'amministratore di sistema è deprecato.
Quando si usa il sistema unstable
, l'amministratore deve
saper ripristinare le cose da una situazione problematica di gestione dei
pacchetti.
Alcuni dei metodi descritti comportano azioni ad alto rischio. Ci si consideri avvertiti!
Se un programma con interfaccia grafica per il desktop presenta problemi di instabilità dopo un importante aggiornamento della versione originale, si dovrebbero sospettare interferenze con vecchi file locali di configurazione creati da esso. Se è stabile per account utente creati da zero, questa ipotesi è confermata. (Questo è un bug nella creazione del pacchetto e viene solitamente evitato dal curatore del pacchetto.)
Per ripristinare la stabilità, si dovrebbero spostare i corrispondenti file locali di configurazione e riavviare il programma GUI. Potrebbe essere necessario leggere il contenuto dei vecchi file di configurazione per ripristinare successivamente le informazioni di configurazione. (Non cancellarli troppo di fretta.)
I sistemi di gestione dei pacchetti a livello dell'archivio, come
aptitude
(8) o apt-get
(1) non provano
nemmeno ad installare pacchetti con file sovrapposti, basandosi sulle
dipendenze dei pacchetti (vedere Sezione 2.1.5, «Dipendenze dei pacchetti»).
Errori dei manutentori dei pacchetti o l'uso di fonti degli archivi
mescolate in modo incoerente (vedere Sezione 2.7.2, «Pacchetti da fonti mescolate di archivi») dall'amministratore di
sistema possono creare situazioni con dipendenze dei pacchetti non
correttamente definite. Quando, in una situazione di questo tipo, si
installa un pacchetto con file sovrapposti usando
aptitude
(8) o apt-get
(1),
dpkg
(1) che spacchetta i pacchetti si assicura di
restituire un errore al programma che lo ha invocato senza sovrascrivere
file esistenti.
L'uso di pacchetti di terze parti introduce significativi rischi per il
sistema attraverso gli script dei manutentori che sono eseguiti con
privilegi di root e che possono fare qualsiasi cosa nel sistema. Il comando
dpkg
(1) protegge solo contro la sovrascrittura in fase di
spacchettamento.
Si possono risolvere installazioni problematiche di questo tipo rimuovendo
prima il vecchio pacchetto che crea problemi:
<vecchio-pacchetto>
.
$ sudo dpkg -P <vecchio-pacchetto>
Quando un comando nello script di un pacchetto restituisce un errore per una qualche ragione e lo script finisce con un errore, il sistema di gestione dei pacchetti cancella l'azione e finisce con pacchetti parzialmente installati. Quando un pacchetto contiene bug nei suoi script di rimozione, il pacchetto può diventare impossibile da rimuovere e fonte di problemi.
Per i problemi di script di pacchetto di
"<nome_pacchetto>
", si dovrebbe guardare negli
script di pacchetto seguenti.
/var/lib/dpkg/info/<nome_pacchetto>.preinst
"
/var/lib/dpkg/info/<nome_pacchetto>.postinst
"
/var/lib/dpkg/info/<nome_pacchetto>.prerm
"
/var/lib/dpkg/info/<nome_pacchetto>.postrm
"
Modificare dall'account root lo script di pacchetto che causa problemi usando le tecniche seguenti.
#
"
|| true
"
Configurare tutti i pacchetti parzialmente installati con il comando seguente.
# dpkg --configure -a
Dato che dpkg
è uno strumento per pacchetti a livello
molto basso, può funzionare anche in situazioni molto brutte come un sistema
non avviabile senza una connessione di rete. Assumiamo, per esempio, che il
pacchetto pippo
sia difettoso e debba essere sostituito.
Si possono trovare copie di versioni più vecchie del pacchetto
pippo
, libere dal bug, nella directory della cache dei
pacchetti: "/var/cache/apt/archives/
". (Se non ci sono,
se ne può scaricare una dall'archivio di http://snapshot.debian.net/ o copiarla
dalla cache dei pacchetti di una macchina funzionante.)
Se si può avviare il sistema, lo si può installare con il comando seguente.
# dpkg -i /percorso/di/pippo_<vecchia_versione>_<arch>.deb
Se il danno al sistema è piccolo, si può in alternativa retrocedere tutto il sistema ad una versione precedente come in Sezione 2.7.7, «Retrocessione di emergenza alla versione precedente», usando il sistema di più alto livello APT.
Se il sistema non è avviabile dal disco fisso, si dovrebbe cercare un altro modo per fare l'avvio.
/destinazione
".
pippo
con il comando seguente.
# dpkg --root /destinazione -i /percorso/di/pippo_<vecchia_versione>_<arch>.deb
Questo esempio funziona persino se il comando dpkg
sul
disco fisso è danneggiato.
Per ripristinare il sistema danneggiato, può essere usato in modo simile qualsiasi sistema GNU/Linux avviato da un altro sistema sul disco fisso, CD live GNU/Linux, chiavetta USB avviabile o avvio di rete.
Se il tentativo di installare un pacchetto in questo modo fallisce a causa
di qualche violazione di dipendenze e si deve necessariamente farlo come
ultima spiaggia, si possono sovrascrivere le dipendenze usando
"--ignore-depends
", "--force-depends
"
e altre opzioni di dpkg
. Se lo si fa, è necessario in
seguito fare tutti gli sforzi possibili per ripristinare le dipendenze
corrette. Per i dettagli vedere dpkg
(8).
Quando il sistema è seriamente danneggiato, se ne dovrebbe fare un backup completo in un posto sicuro (vedere Sezione 10.1.6, «Backup e ripristino») e fare un'installazione pulita. Ciò comporta meno perdita di tempo e alla fine produce un risultato migliore.
Se "/var/lib/dpkg/status
" diventa corrotto per una
qualsiasi ragione, il sistema Debian perde i dati sulla selezione dei
pacchetti e ne ha grave danno. Cercare il vecchio file
"/var/lib/dpkg/status
" in
"/var/lib/dpkg/status-old
" o
"/var/backups/dpkg.status.*
".
Mantenere "/var/backups/
" in una partizione separata può
essere una buona idea dato che questa directory contiene molti dati
importanti per il sistema.
Per danni molto seri, raccomando di fare una re-installazione pulita dopo
aver fatto il backup del sistema. Anche se tutto ciò che era in
"/var/
" è andato perduto, è sempre possibile recuperare
alcune informazioni dalle directory in "/usr/share/doc/
"
per guidare le nuove installazioni.
Reinstallare un sistema (desktop) minimale
# mkdir -p /percorso/del/vecchio/sistema
Montare il vecchio sistema in
"percorso/del/vecchio/sistema/
".
# cd /percorso/del/vecchio/sistema/usr/share/doc # ls -1 >~/ls1.txt # cd /usr/share/doc # ls -1 >>~/ls1.txt # cd # sort ls1.txt | uniq | less
Verranno mostrati i nomi dei pacchetti da installare. (Ci potrebbero essere
alcuni nomi non di pacchetto, come "texmf
".)
Si possono cercare i pacchetti che soddisfano i propri bisogni con
aptitude
in base alla descrizione del pacchetto o
dall'elenco in "Task".
Quando si incontrano più di due pacchetti simili e non si sa quale installare senza doverli installare per prova, si dovrebbe usare un po' di buon senso. Considero i punti seguenti un buon consiglio per i paccchetti da preferire.
python2.4
selezionato da python
)
Essendo Debian un progetto di volontari con modello di sviluppo distribuito, i suoi archivi contengono molti pacchetti con scopi e qualità molto differenti. Si deve scegliere con la propria testa che uso farne.
Installare pacchetti da fonti mescolate di archivi non è supportato dalla
distribuzione Debian ufficiale, tranne che per particolari combinazioni
supportate ufficialmente, come stable
con security updates e squeeze-updates.
Ecco un esempio di operazioni da fare per includere, sporadicamente,
versioni originali più recenti di specifici pacchetti presenti in
unstable
pur mantenendo testing
.
/etc/apt/sources.list
"
ad una singola voce "unstable
".
aptitude update
".
aptitude install <nome-pacchetto>
".
/etc/apt/sources.list
" originale
per testing
.
aptitude update
".
Con questo approccio manuale non si deve creare il file
"/etc/apt/preferences
" né ci si deve preoccupare dei pin
di apt. Ma è piuttosto laborioso.
Quando si usano fonti di archivi mescolate, si deve assicurare la compatibilità tra i pacchetti da soli, dato che Debian non la garantisce. Se esistono incompatibilità tra i pacchetti, si può danneggiare il sistema. Si deve essere in grado di giudicare queste esigenze tecniche. L'uso di fonti mescolate di archivi non correlati è una modalità di funzionamento totalmente opzionale e il suo uso non è per nulla raccomandato.
Le regole generali per installare pacchetti da archivi diversi sono le seguenti.
L'installazione di pacchetti non binari ("Architecture:
all
") è più sicura
.
L'installazione di pacchetti binari (non "Architecture:
all
") di solito comporta molte difficoltà e non è
sicura
.
Per rendere l'installazione di un pacchetto più sicura, possono essere forniti alcuni pacchetti binari applicativi commerciali non liberi con librerie completamente statiche. Si dovrebbe anche per essi controllare in ogni caso la compatibilità con ABI, ecc.
Installare pacchetti binari da archivi non ufficialmente supportati è generalmente una cattiva idea, tranne che per evitare pacchetti danneggiati per un breve tempo. Questo è vero anche se si usano i pin di APT (vedere Sezione 2.7.3, «Modificare la versione candidata»). Si dovrebbe considerare chroot o tecniche simili (vedere Sezione 9.8, «Sistema virtualizzato») per eseguire programmi da archivi differenti.
Senza il file "/etc/apt/preferences
", il sistema APT
sceglie la versione più recente disponibile come versione candidata usando la stringa di
versione. Questa è la situazione normale e l'uso raccomandato del sistema
APT. Tutte le combinazioni di archivi supportate ufficialmente non
necessitano del file "/etc/apt/preferences
", dato che gli
archivi che non dovrebbero essere usati come fonti automatica per gli
aggiornamenti sono marcati come NotAutomatic e trattati in modo appropriato.
La regola di comparazione della stringa di versione può essere verificata
con, ad esempio, "dpkg --compare-versions ver1.1 gt ver1.1~1; echo
$?
" (vedere dpkg
(1)).
Quando si installano regolarmente pacchetti da fonti di archivi mescolate
(vedere Sezione 2.7.2, «Pacchetti da fonti mescolate di archivi»), si
possono automatizzare queste operazioni complicate creando il file
"/etc/apt/preferences
" con le voci appropriate e
modificando la regola di selezione dei pacchetti per le versioni candidate come descritto in
apt_preferences
(5). Questo è chiamato usare i pin di APT.
L'uso dei pin di APT da parte di un utente inesperto è una fonte sicura di grossi problemi. Si dovrebbe evitare l'uso dei pin di APT se non strettamente necessario.
Quando si usano i pin di APT si deve assicurare la compatibilità dei pacchetti da soli dato che Debian non la garantisce. L'uso dei pin di APT è una modalità di funzionamento totalmente opzionale e il suo uso non è per nulla consigliato.
Per le regole di apt_preferences
(5) sono usati i file
Release a livello di archivio (vedere Sezione 2.5.3, «File "Release" a livello di archivio»). I pin di APT perciò funzionano
solo con il nome della "suite" per i normali archivi Debian e per gli archivi di sicurezza Debian. (Ciò è
diverso per gli archivi Ubuntu). Per esempio
nel file "/etc/apt/preferences
" si può usare
"Pin: release a=unstable
", ma non "Pin: release
a=sid
".
Quando si usano archivi non Debian con i pin di APT si dovrebbe controllare quale sia il loro scopo e la loro credibilità. Ubuntu e Debian, per esempio, non sono fatti per essere mescolati.
Anche se non si crea il file "/etc/apt/preferences
" si
possono fare operazioni piuttosto complesse (vedere Sezione 2.6.4, «Ripristinare con il comando dpkg» e Sezione 2.7.2, «Pacchetti da fonti mescolate di archivi») senza l'uso dei pin di
APT.
Quella che segue è una spiegazione semplificata delluso dei pin di APT.
Il sistema APT sceglie, dalle fonti per i pacchetti disponibili definite nel
file "/etc/apt/sources.list
", il pacchetto di aggiornamento con la priorità di pin più elevata
come versione candidata del pacchetto. Se
la priorità di pin del pacchetto è maggiore di 1000, la restrizione a
versioni di aggiornamento non viene
considerata per permettere la retrocessione ad una versione precedente
(vedere Sezione 2.7.7, «Retrocessione di emergenza alla versione precedente»).
Il valore della priorità di pin per ciascun pacchetto è definito dalle voci
"Pin-Priority" nel file "/etc/apt/preferences
o viene
usato il valore predefinito.
Tabella 2.18. Elenco dei valori predefiniti di priorità di pin per ciascun tipo di fonte dei pacchetti
priorità di pin predefinita | tipo di fonte dei pacchetti |
---|---|
990 | archivio del rilascio definito |
500 | archivio normale |
100 | pacchetto installato |
1 | archivio Non automatico |
L'archivio del rilascio definito può essere impostato in svariati modi.
/etc/apt/apt.conf
" con la
riga "APT::Default-Release "stable";
"
apt-get install
-t testing qualche-pacchetto
"
L'attributo di archivio Non automtico è
impostato dal server dell'archivio che ha il file Release a livello di
archivio (vedere Sezione 2.5.3, «File "Release" a livello di archivio») che
contiene "NotAutomatic: yes
".
La situazione dei pin di APT di
<pacchetto> da diverse fonti di archivi viene mostrata con
"apt-cache policy <pacchetto>
".
pacchetto pin:
" elenca la
versione del pacchetto di pin se è
definita un'associazione specifica per <pacchetto>, ad esempio
"Package pin: 0.190
".
Package pin:
" se non è
definita alcuna associazione solamente con <pacchetto>.
0.181 700
".
0
" alla destra di tutte le stringhe di
versione.
Package:
*
" nel file "/etc/apt/preferences
" sono
elencati alla sinistra di tutti i percorsi di archivio, ad esempio
"200 http://backports.debian.org/debian-backports/
squeeze-backports/main Packages
".
Quello che segue è un esempio di uso dei pin di
APT per includere pacchetti specifici con versioni originali più
recenti presenti in unstable
aggiornandoli regolarmente
pur mantenendo testing
. Si devono elencare nel file
"/etc/apt/sources.list
" tutti gli archivi necessari nel
modo seguente.
deb http://ftp.us.debian.org/debian/ testing main contrib non-free deb http://ftp.us.debian.org/debian/ unstable main contrib non-free deb http://security.debian.org/ testing/updates main contrib
Impostare il file "/etc/apt/preferences
" come segue.
Package: * Pin: release a=testing Pin-Priority: 500 Package: * Pin: release a=unstable Pin-Priority: 200
Quando, con questa configurazione, si desidera installare un pacchetto
chiamato "<nome-pacchetto>
" con le sue dipendenze
dall'archivio unstable
, usare il comando seguente che
cambia il rilascio definito con l'opzione "-t
" (la
priorità di pin di unstable
diventa 990.).
$ sudo apt-get install -t unstable <nome-pacchetto>
Con quessta configurazione, la normale esecuzione di "apt-get
upgrade
" e "apt-get dist-upgrade
" (o
"aptitude safe-upgrade
" e "aptitude
full-upgrade
") aggiorna i pacchetti che erano stati installati
dall'archivio testing
usando l'attuale archivio
testing
e i pacchetti che erano stati installati
dall'archivio unstable
usando l'attuale archivio
unstable
.
Fare attenzione a non rimuovere la voce "testing
" dal
file "/etc/apt/sources.list
". Senza di essa il sistema
APT aggiorna i pacchetti usando l'archivio unstable
più
recente.
Io di solito modifico il file "/etc/apt/sources.list
per
commentare le voci relative all'archivio "unstable
immediatamente dopo l'azione descritta sopra. Questo evita il rallentamento
del processo di aggiornamento dovuto a troppe voci nel file
"/etc/apt/sources.list
" anche se impedisce
l'aggiornamento, usando l'attuale archivio unstable
dei
pacchetti che erano stati installati dall'archivio
unstable
.
Se viene usato "Pin-Priority: 20
" invece di
"Pin-Priority: 200
" nel file
"/etc/apt/preferences
", i pacchetti già installati che
hanno 100 come valore della priorità di pin, non vengono aggiornati
dall'archivio unstable
nemmeno se viene rimossa la voce
"testing
" dal file
"/etc/apt/sources.list
".
Se si desidera tenere traccia automaticamente di particolari pacchetti in
unstable
senza l'iniziale installazione con "-t
unstable
", si deve creare il file
"/etc/apt/preferences
" ed elencarvi esplicitamente tutti
i pacchetti voluti nel modo seguente.
Package: <pacchetto-1> Pin: release a=unstable Pin-Priority: 700 Package: <pacchetto-2> Pin: release a=unstable Pin-Priority: 700
Questo imposta il valore della priorità di pin per ciascun pacchetto
specifico. Per esempio, per tenere traccia della versione più recente in
unstable
di questo manuale "Debian Reference" in inglese,
si dovrebbero avere, nel file "/etc/apt/preferences
" le
voci seguenti.
Package: debian-reference-en Pin: release a=unstable Pin-Priority: 700 Package: debian-reference-common Pin: release a=unstable Pin-Priority: 700
Questo modo di usare i pin di APT è valido anche quando si segue l'archivio
stable
. Per la mia esperienza, installare i pacchetti di
documentazione dall'archivio unstable
è sempre sicuro.
Quello che segue è un esempio di uso dei pin di
APT per includere pacchetti specifici con versioni originali più
recenti presenti in experimental
pur mantenendo
unstable
. Si devono elencare nel file
"/etc/apt/sources.list
" tutti gli archivi necessari nel
modo seguente.
deb http://ftp.us.debian.org/debian/ unstable main contrib non-free deb http://ftp.us.debian.org/debian/ experimental main contrib non-free deb http://security.debian.org/ testing/updates main contrib
Il valore predefinito della priorità di pin per l'archivio
experimental
è sempre 1 (<<100) dato che è un
archivio Non automatico (vedere Sezione 2.5.3, «File "Release" a livello di archivio»). Per usare semplicemente
l'archivio experimental
non c'è alcun bisogno di
impostare il valore di priorità di pin esplicitamente nel file
"/etc/apt/preferences
", a meno che non si desideri
aggiornare automaticamente da esso in futuro particolari pacchetti.
Esistono gli archivi del squeeze-updates e backports.debian.org che forniscono
pacchetti di aggiornamento per stable
(squeeze
).
Non usare tutti i pacchetti disponibili negli archivi Non automatici come
squeeze-backports
. Usare solo pacchetti
selezionati che rispondano alle proprie esigenze.
Quello che segue è un esempio di uso dei pin di
APT per includere pacchetti specifici con versioni originali più
recenti presenti in squeeze-backports
pur
mantenendo squeeze
e
squeeze-updates
. Si devono elencare nel file
"/etc/apt/sources.list
" tutti gli archivi necessari nel
modo seguente.
deb http://ftp.us.debian.org/debian/ squeeze main contrib non-free deb http://security.debian.org/ squeeze/updates main contrib deb http://ftp.us.debian.org/debian/ squeeze-updates main contrib non-free deb http://backports.debian.org/debian-backports/ squeeze-backports main contrib non-free
Il valore predefinito della priorità di pin per l'archivio backports.debian.org è sempre 1
(<<100) dato che è un archivio Non
automatico (vedere Sezione 2.5.3, «File "Release" a livello di archivio»). Per usare semplicemente
l'archivio backports.debian.org
non c'è alcun bisogno di impostare il valore di priorità di pin
esplicitamente nel file "/etc/apt/preferences
", a meno
che non si desideri aggiornare automaticamente da esso in futuro particolari
pacchetti.
Perciò quando si desidera installare un pacchetto chiamato
"<nome-pacchetto>
" con le sue dipendenze
dall'archivio squeeze-backports
, usare questo
comando che sposta il rilascio stabilito con l'opzione
"-t
".
$ sudo apt-get install -t squeeze-backports <nome-pacchetto>
Se si desidera aggiornare pacchetti particolari, è necessario creare il file
"/etc/apt/preferences
" ed elencarvi esplicitamente tutti
i pacchetti voluti nel modo seguente.
Package: <package-1> Pin: release o=Backports.org archive Pin-Priority: 700
In alternativa si può impostare il file
"/etc/apt/preferences
" nel modo seguente.
Package: * Pin: release a=stable , o=Debian Pin-Priority: 500 Package: * Pin: release a=squeeze-updates, o=Debian Pin-Priority: 500 Package: * Pin: release a=squeeze-backports, o=Backports.org archive Pin-Priority: 200
La normale esecuzione di "apt-get upgrade
" e
"apt-get dist-upgrade
" (o "aptitude
safe-upgrade
" e "aptitude full-upgrade
")
aggiorna i pacchetti che erano stati installati dall'archivio
stable
usando l'attuale archivio
stable
e i pacchetti che erano stati installati da altri
archivi usando l'archivio corrispondente per tutti gli archivi nel file
"/etc/apt/sources.list
".
Il pacchetto apt
viene fornito con il proprio script di
cron, "/etc/cron.daily/apt
" per permettere di scaricare
automaticamente i pacchetti. Questo script può essere migliorato,
installando il pacchetto unattended-upgrades
, per
effettuare l'aggiornamento automatico dei pacchetti. Può essere
personalizzato dai parametri in
"/etc/apt/apt.conf.d/02backup
" e
"/etc/apt/apt.conf.d/50unattended-upgrades
" come
descritto in "/usr/share/doc/unattended-upgrades/README
".
Il pacchetto "unattended-upgrades
è pensato
principalmente per gli aggiornamenti di sicurezza del sistema
stable
. Se il rischio di danneggiare un sistema
stable
esistente con gli aggiornamenti automatici è
minore di quello che il sistema venga danneggiato da un intruso, usando una
falla nella sicurezza chiusa dall'aggiornamento di sicurezza, si dovrebbe
considerare l'uso di questi aggiornamenti automatici con parametri simili ai
seguenti.
APT::Periodic::Update-Package-Lists "1"; APT::Periodic::Download-Upgradeable-Packages "1"; APT::Periodic::Unattended-Upgrade "1";
Se si sta usando un sistema unstable
, non è bene usare
gli aggiornamenti automatici perché certamente prima o poi danneggeranno il
sistema. Anche per unstable
però, per risparmiare tempo
nell'aggiornamento interattivo, si può volere scaricare i pacchetti in
anticipo usando parametri di configurazione come i seguenti.
APT::Periodic::Update-Package-Lists "1"; APT::Periodic::Download-Upgradeable-Packages "1"; APT::Periodic::Unattended-Upgrade "0";
Se si desidera limitare l'uso della banda da parte di APT per gli scaricamenti, per esempio a 800Kib/sec (=100kiB/sec), si devono usare i parametri di configurazione di APT nel modo seguente.
APT::Acquire::http::Dl-Limit "800";
La retrocessione ad una versione precedente non è ufficialmente supportata da Debian. Dovrebbe essere fatta solamente come parte di un processo di ripristino di emergenza. Nonostante questo è noto che funziona bene in caso di molti incidenti. Per i sistemi critici, si dovrebbe fare un backup di tutti i dati importanti sul sistema dopo l'operazione di ripristino e reinstallare un nuovo sistema da zero.
Si potrebbe essere fortunati e riuscire a retrocedere da un archivio più
recente ad uno più vecchio per ripristinare un aggiornamento di sistema
andato male, manipolando le versioni
candidate (vedere Sezione 2.7.3, «Modificare la versione candidata»). Questa è l'alternativa pigra al
lavoro tediosi di dover usare molti comandi "dpkg -i
<pacchetto-danneggiato>_<vecchia-versione>.deb
"
(vedereSezione 2.6.4, «Ripristinare con il comando dpkg»).
Cercare le righe nel file "/etc/apt/sources.list
" che
rimandano a unstable
, come la seguente.
deb http://ftp.us.debian.org/debian/ sid main contrib non-free
Sostituirle con la seguente per puntare a testing
.
deb http://ftp.us.debian.org/debian/ wheezy main contrib non-free
Impostare il file "/etc/apt/preferences
" come segue.
Package: * Pin: release a=testing Pin-Priority: 1010
Eseguire "apt-get dist-upgrade
" per forzare la
retrocessione dei pacchetti in tutto il sistema.
Rimuovere questo file speciale "/etc/apt/preferences
"
dopo la retrocessione di emergenza.
È una buona idea rimuovere (non eliminare completamente!) il maggior numero di pacchetti per minimizzare i problemi di dipendenza. Potrebbe essere necessario rimuovere o installare manualmente alcuni pacchetti per retrocedere il sistema. Il kernel Linux, il bootloader, udev, PAM, APT e i pacchetti relativi alla rete ed i loro file di configurazione richiedono particolare attenzione.
Anche se i nomi dei manutentori elencati in
"/var/lib/dpkg/available
"
e"/usr/share/doc/package_name/changelog
" forniscono
alcune informazioni su "chi stia dietro la pacchettizzazione", l'identità di
chi ha effettivamente caricato il pacchetto è un po'
oscura. who-uploads
(1) nel pacchetto
devscripts
identifica l'effettivo autore del caricamento
dei pacchetti sorgenti Debian.
Se si ha intenzione di compilare un programma dai sorgenti per rimpiazzare
un pacchetto Debian, la cosa migliore è creare un vero pacchetto
debianizzato locale (*.deb
) e usare un archivio privato.
Se si sceglie di compilare un programma dai sorgenti e di installarlo invece
in "/usr/local
", si può usare equivs
come ultima spiaggia per soddisfare le dipendenze mancanti del pacchetto.
Package: equivs Priority: extra Section: admin Description: Circumventing Debian package dependencies This is a dummy package which can be used to create Debian packages, which only contain dependency information.
Per aggiornamenti parziali del sistema stable
, è una
buona idea ricompilare un pacchetto, usando il pacchetto sorgente,
all'interno del suo ambiente. Questo evita massicci aggiornamenti di
pacchetti a causa delle dipendenze.
Aggiungere le voci seguenti al file
"/etc/apt/sources.list
" di un sistema
stable
.
deb-src http://http.us.debian.org/debian unstable main contrib non-free
Installare i pacchetti richiesti per la compilazione e scaricare il pacchetto sorgente, come nell'esempio seguente.
# apt-get update # apt-get dist-upgrade # apt-get install fakeroot devscripts build-essential $ apt-get build-dep foo $ apt-get source foo $ cd foo*
Cambiare i pacchetti da installare se necessario.
Eseguire quanto segue.
$ dch -i
Incrementare la versione del pacchetto, ad esempio aggiungendo
"+bp1
" in "debian/changelog
"
Compilare i pacchetti ed installarli nel sistema nel modo seguente.
$ debuild $ cd .. # debi pippo*.changes
Dato che fare il mirror di intere sottosezioni dell'archivio Debian spreca
spazio su disco e banda, l'utilizzo di un server proxy locale per APT è una
buona idea quando si amministrano molti sistemi in una LAN. APT può essere configurato per usare server proxy
web generici (http), quale squid
(vedere Sezione 6.10, «Altri server di rete») come descritto in
apt.confo
(5) ed in
"/usr/share/doc/apt/examples/configure-index.gz
". La
variabile d'ambiente "$http_proxy
" può essere usata per
scavalcare l'impostazione del server proxy nel file
"/etc/apt/apt.conf
".
Si sono strumenti proxy specifici per l'archivio Debian. Prima di usarli si dovrebbe contollare il BTS.
Tabella 2.19. Elenco degli strumenti proxy specifici per l'archivio Debian
pacchetto | popcon | dimensione | descrizione |
---|---|---|---|
approx *
|
V:0.3, I:0.3 | 3896 | server proxy con cache per i file di archivio Debian (programma OCaml compilato) |
apt-cacher *
|
V:0.3, I:0.4 | 308 | proxy con cache per file di pacchetto e sorgenti Debian (programma Perl) |
apt-cacher-ng *
|
V:0.3, I:0.4 | 1092 | proxy con cache per la distribuzione di pacchetti software (programma in C++ compilato) |
debtorrent *
|
V:0.12, I:0.17 | 1185 | proxy Bittorrent per scaricare pacchetti Debian (programma Python) |
Quando Debian riorganizza la struttura del suo archivio, questi strumenti proxy specializzati tendono ad aver bisogno di ritocchi al codice da parte del manutentore del pacchetto e possono non essere funzionanti per un po' di tempo. D'altra parte i server proxy web generici (http) sono più robusti e gestiscono questi cambiamenti più facilmente.
Exxo un esempio per creare un piccolo archivio pubblico di pacchetti compatibile con il moderno sistema APT sicuro (vedere Sezione 2.5.2, «File "Release" nella directory principale ed autenticità»). Consideriamo la situazione seguente.
pippo
"
www.esempio.com
"
apt-utils
, gnupg
ed altri
http://www.esempio.com/~pippo/
" ( →
"/home/pippo/public_html/index.html
")
amd64
"
Creare una chiave per l'archivio APT di Pippo nel sistema server, nel modo seguente.
$ ssh pippo@www.esempio.com $ gpg --gen-key ... $ gpg -K ... sec 1024D/3A3CB5A6 2008-08-14 uid Pippo (ARCHIVE KEY) <pippo@www.esempio.com> ssb 2048g/6856F4A7 2008-08-14 $ gpg --export -a 3A3CB5A6 >pippo.public.key
Pubblicare il file della chiave dell'archivio per Pippo,
"pippo.public.key
", con l'ID di chiave
"3A3CB5A6
"
Creare un albero di archivio chiamato "Origin: Pippo", nel modo seguente.
$ umask 022 $ mkdir -p ~/public_html/debian/pool/main $ mkdir -p ~/public_html/debian/dists/unstable/main/binary-amd64 $ mkdir -p ~/public_html/debian/dists/unstable/main/source $ cd ~/public_html/debian $ cat > dists/unstable/main/binary-amd64/Release << EOF Archive: unstable Version: 4.0 Component: main Origin: Pippo Label: Pippo Architecture: amd64 EOF $ cat > dists/unstable/main/source/Release << EOF Archive: unstable Version: 4.0 Component: main Origin: Pippo Label: Pippo Architecture: source EOF $ cat >aptftp.conf <<EOF APT::FTPArchive::Release { Origin "Pippo"; Label "Pippo"; Suite "unstable"; Codename "sid"; Architectures "amd64"; Components "main"; Description "Archivio pubblico di Pippo"; }; EOF $ cat >aptgenerate.conf <<EOF Dir::ArchiveDir "."; Dir::CacheDir "."; TreeDefault::Directory "pool/"; TreeDefault::SrcDirectory "pool/"; Default::Packages::Extensions ".deb"; Default::Packages::Compress ". gzip bzip2"; Default::Sources::Compress "gzip bzip2"; Default::Contents::Compress "gzip bzip2"; BinDirectory "dists/unstable/main/binary-amd64" { Packages "dists/unstable/main/binary-amd64/Packages"; Contents "dists/unstable/Contents-amd64"; SrcPackages "dists/unstable/main/source/Sources"; }; Tree "dists/unstable" { Sections "main"; Architectures "amd64 source"; }; EOF
Si possono automatizzare aggiornamenti regolari del contenuto dell'archivio
APT nel proprio sistema server configurando dupload
.
Mettere tutti i file pacchetto in
"~pippo/public_html/debian/pool/main/
" eseguendo
"dupload -t pippo changes_file
" nel client ed avendo il
file "~/.dupload.conf
" che contiene quanto segue.
$cfg{'pippo'} = { fqdn => "www.esempio.com", method => "scpb", incoming => "/home/pippo/public_html/debian/pool/main", # dinstall su ftp-master invia esso stesso email dinstall_runs => 1, }; $cfg{'pippo'}{postupload}{'changes'} = " echo 'cd public_html/debian ; apt-ftparchive generate -c=aptftp.conf aptgenerate.conf; apt-ftparchive release -c=aptftp.conf dists/unstable >dists/unstable/Release ; rm -f dists/unstable/Release.gpg ; gpg -u 3A3CB5A6 -bao dists/unstable/Release.gpg dists/unstable/Release'| ssh pippo@www.esempio.com 2>/dev/null ; echo 'Archivio dei pacchetti creato!'";
Lo script automatico postupload avviato
da dupload
(1) crea file di archivio aggiornati per
ciascun caricamento.
Si può aggiungere questo piccolo archivio pubblico nelle righe di apt del proprio sistema client con i comandi seguenti.
$ sudo bash # echo "deb http://www.esempio.com/~pippo/debian/ unstable main" \ >> /etc/apt/sources.list # apt-key add pippo.public.key
Se l'archivio si trova sul file system locale, si può usare invece
"deb file:///home/pippo/debian/ …
".
Si può creare una copia locale dello stato delle selezioni dei pacchetti e di debconf nel modo seguente
# dpkg --get-selections '*' > selection.dpkg # debconf-get-selections > selection.debconf
In questo esempio "*
" fa sì che
"selection.dpkg
" includa anche le voci dei pacchetti
"eliminati".
Questi 2 file possono essere trasferiti su un altro computer ed i pacchetti installati lì con i comandi seguenti.
# dselect update # debconf-set-selections < miaselezione.debconf # dpkg --set-selections < miaselezione.dpkg # apt-get -u dselect-upgrade # o dselect install
Se si ha in progetto di gestire molti server in un cluster con praticamente
la stessa configurazione, si dovrebbe considerare l'uso di pacchetti
specifici come fai
.per gestire l'intero sistema.
alien
(1) permette la conversione di pacchetti binari
forniti in file in formato Red Hat rpm
, Stampede
slp
, Slackware tgz
e Solaris
pkg
in pacchetti Debian deb
. Se si
vuole usare un pacchetto da una distribuzione Linux diversa da quella
installata sul proprio sistema, si può usare alien
per
convertire il formato di pacchetto ed installarlo. alien
supporta anche pacchetti LSB.
alien
(1) non dovrebbe essere usato per rimpiazzare
pacchetti di sistema essenziali, come sysvinit
,
libc66
, libpam-modules
, ecc. In
pratica, alien
(1) dovrebbe essere usato solamente per
pacchetti solo-binari non-free che sono
conformi a LSB o con link statico. Per i software liberi si dovrebbero usare
i loro pacchetti sorgenti per creare veri pacchetti Debian.
In qualsiasi ambiente *nix i contenuti di un
pacchetto "*.deb
" possono essere estratti senza usare
dpkg
(1) utilizzando le utilità standard
ar
(1) e tar
(1).
# ar x /percorso/di/dpkg_<versione>_<arch>.deb # ls total 24 -rw-r--r-- 1 bozo bozo 1320 2007-05-07 00:11 control.tar.gz -rw-r--r-- 1 bozo bozo 12837 2007-05-07 00:11 data.tar.gz -rw-r--r-- 1 bozo bozo 4 2007-05-07 00:11 debian-binary # mkdir control # mkdir data # tar xvzf control.tar.gz -C control # tar xvzf data.tar.gz -C data
Si può anche navigare il contenuto del pacchetto usando il comando
mc
.
Si possono ottenere molte altre informazioni sulla gestione dei pacchetti dalla documentazione seguente.
Documentazione principale sulla gestione dei pacchetti:
aptitude
(8), dpkg
(1),
tasksel
(8), apt-get
(8),
apt-config
(8), apt-key
(8),
sources.list
(5), apt.conf
(5) e
apt_preferences
(5);
/usr/share/doc/apt-doc/guide.html/index.html
" e
"/usr/share/doc/apt-doc/offline.html/index.html
" dal
pacchetto apt-doc
e
/usr/share/doc/aptitude/html/en/index.html
" dal
pacchetto aptitude-doc-en
.
Documentazione ufficiale dettagliata sull'archivio Debian:
Tutorial per gli utenti Debian sulla creazione di un pacchetto Debian:
È bene che l'amministratore di sistema conosca almeno a grandi linee come viene avviato e configurato il sistema Debian. Anche se i dettagli precisi sono nei file sorgenti dei pacchetti installati e nella loro documentazione, essi sono un po' troppo per la maggior parte degli utenti.
Ho cercato di fornire una veloce panoramica dei punti chiave del sistema Debian e della loro configurazione, come punto di riferimento per l'utente, in base alle conoscenze attuali e passate mie e di altri. Dato che il sistema Debian è in costante evoluzione, la situazione potrebbe essere cambiata. Prima di fare qualsiasi modifica al sistema, si dovrebbe far riferimento alla documentazione più recente per ciascun pacchetto.
Il sistema del computer passa attraverso varie fasi del processo di avvio, dall'accensione a quando offre all'utente il sistema operativo (SO) pienamente funzionante.
Per semplicità la spiegazione è limitata alla piattaforma PC tipica con l'installazione standard.
Il normale processo di avvio è come un razzo a quattro stadi. Ogni stadio del razzo passa il controllo del sistema allo stadio successivo.
Naturalmente questo può essere configurato in modo diverso. Per esempio, se è stato compilato un kernel personalizzato, si potrebbe saltare la fase con il mini-sistema Debian. Non dare per scontato che quanto detto vale per il proprio sistema fino a che non si è controllato direttamente.
Per piattaforme PC non sorpassate, come il sistema SUN o Macintosh, il BIOS nella ROM e la partizione sul disco possono essere alquanto differenti (Sezione 9.3.1, «Configurazione del partizionamento dei dischi»). In questi casi, cercare la documentazione piattaforma specifica altrove.
Il BIOS è il primo stadio del processo di avvio che viene avviato dall'accensione. Il BIOS, che risiede nella ROM (read only memory, memoria in sola lettura) è eseguito da un particolare indirizzo di memoria al quale è inizializzato, dall'accensione, il contatore di programma della CPU.
Il BIOS effettua l'inizializzazione base dell'hardware (POST (power on self test, auto-test di accensione) e passa il controllo del sistema allo stadio successivo fornito dall'utente. Il BIOS è di solito fornito con l'hardware.
La schermata di avvio del BIOS indica solitamente quale tasto o tasti premere per entrare nella schermata di impostazioni del BIOS, per configurarne il comportamento. Tasti comunemente usati sono F1, F2, F10, Esc, Ins e Canc. Se la schermata di avvio del BIOS è nascosta da una bella schermata grafica, si può premere dei tasti, come Esc, per disabilitarla. Quali tasti vanno premuti dipende fortemente dall'hardware.
Dalla schermata di impostazioni del BIOS si può scegliere la posizione hardware e la priorità del codice avviato dal BIOS. Tipicamente vengono caricati in memoria i primi pochi settori del primo dispositivo selezionato trovato (disco fisso, dischetto floppy, CD-ROM, ...) e viene eseguito questo codice iniziale che può essere una qualsiasi tra le cose seguenti.
Tipicamente il sistema viene avviato dalla partizione specificata del disco fisso primario. I primi 2 settori del disco fisso nei PC vecchi contengono ilmaster boot record (MBR). Le informazioni sulle partizioni del disco, inclusa la selezione per l'avvio sono memorizzate alla fine di questo MBR. Il primo codice boot loader eseguito dal BIOS occupa la parte restante di questo MBR.
Il bootloader è il secondo stadio del processo di avvio che è iniziato dal BIOS. Carica l'immagine kernel del sistema e l'immagine initrd in memoria e passa il controllo ad essi. L'immagine initrd è l'immagine del file system radice ed il suo supporto dipende dal bootloader usato
Il sistema Debian normalmente usa il kernel Linux come kernel predefinito del sistema. L'immagine initrd dell'attuale kernel Linux 2.6 è tecnicamente l'immagine initramfs (initial RAM filesystem). Questa è un archivio cpio compresso con gzip dei file nel filesystem root.
L'installazione predefinita del sistema Debian posiziona, per la piattaforma PC, il codice di primo stadio del bootloader GRUB nell'MBR. Sono disponibili molti bootloader e opzioni di configurazione.
Tabella 3.1. Elenco di bootloader
bootloader | pacchetto | popcon | dimensione | initrd | descrizione |
---|---|---|---|---|---|
GRUB Legacy | grub-legacy * | V:0.4, I:1.1 | 1984 | Supportato |
Intelligente abbastanza da capire partizioni su disco e filesystem come
vfat, ext3, ... (predefinito in lenny )
|
GRUB 2 | grub-pc * | V:7, I:25 | 2480 | Supportato | Intelligente abbastanza da capire partizioni su disco e filesystem come vfat, ext3, ... |
GRUB 2 | grub-rescue-pc * | V:0.04, I:0.5 | 3896 | Supportato | È l'immagine di ripristino avviabile di GRUB 2 (CD e floppy) (versione PC/BIOS) |
Lilo | lilo * | V:0.5, I:2 | 1236 | Supportato | Si basa sulla posizione dei settori dei dati sul disco fisso. (Vecchio) |
Isolinux | syslinux * | V:1.3, I:8 | 204 | Supportato | Capisce il filesystem ISO 9660. Usato dal CD di avvio. |
Syslinux | syslinux * | V:1.3, I:8 | 204 | Supportato | Capisce il filesystem MSDOS (FAT). Usato dai dischetti floppy di avvio. |
Loadlin | loadlin * | V:0.03, I:0.2 | 144 | Supportato | Il nuovo sistema viene avviato dal sistema FreeDOS/MSDOS. |
MBR di Neil Turton | mbr * | V:0.8, I:5 | 96 | Non supportato | Software libero che sostituisce MBR MSDOS. Capisce solo le partizioni su disco. |
Non mettere mano ai bootloader senza aver creato supporti avviabili di
ripristino (CD o floppy) da immagini nel pacchetto
grub-rescue-pc
. Questo permette di avviare il sistema
anche senza un bootloader funzionante sul disco fisso.
Per GRUB Legaci, il file di configurazione del menu è
"/boot/grub/menu.lst
". Contiene, per esempio, delle voci
come quella seguente.
title Debian GNU/Linux root (hd0,2) kernel /vmlinuz root=/dev/hda3 ro initrd /initrd.img
Per GRUB 2, il file di configurazione del menu è
"/boot/grub/grub.cfg
". Viene generato automaticamente da
"/usr/sbin/update-grub
" usando modelli da
"/etc/grub.d/*
" e impostazioni da
"/etc/default/grub
". Contiene, per esempio, delle voci
come quella seguente.
menuentry "Debian GNU/Linux" { set root=(hd0,3) linux /vmlinuz root=/dev/hda3 initrd /initrd.img }
Negli esempi precedenti i parametri di GRUB hanno i seguenti significati.
Tabella 3.2. Significato dei parametri di GRUB
parametro di GRUB | significato |
---|---|
root
|
usa la terza partizione sul primo disco fisso indicandola come
"(hd0,2) " in GRUB legacy o come
"(hd0,3) " in GRUB 2
|
kernel
|
usa il kernel che si trova in "/vmlinuz " con i parametri
"root=/dev/hda3 ro "
|
initrd
|
usa l'immagine initrd/initramfs che
si trova in "/initrd.img "
|
Il valore per il numero di partizione usato dal programma GRUB Legacy è minore di uno rispetto a quello normale usato dal kernel Linux e dagli strumenti di utilità. il programma GRUB 2 ha risolto questo problema.
Per identificare un particolare dispositivo a blocchi si può usare il suo
UUID (vedere Sezione 9.3.2, «Accedere alle partizioni usando UUID») invece del suo nome file come
"/dev/hda3
", ad esempio
"root=UUID=81b289d5-4341-4003-9602-e254a17ac232 ro
".
Si può avviare un bootloader da un altro bootloader usando una tecnica chiamata caricamento a catena.
Vedere "info grub
" e grub-install
(8).
Il mini-sistema Debian è il terzo stadio del processo di avvio che viene iniziato dal bootloader. Esegue il kernel del sistema con il suo filesystem root in memoria. Questo è uno stadio opzionale preparatorio del processo di avvio.
L'espressione "sistema Debian mini" è stata coniata per descrivere il terzo stadio del processo di avvio in questo documento. Normalmente ci si riferisce a questo sistema come sistema initrd o initramfs. Un sistema simile in memoria è usato dall'installatore Debian.
Lo script "/init
" viene eseguito come primo programma in
questo filesystem root in memoria. È un programma script di shell che
inizializza il kernel in spazio utente e passa il controllo allo stadio
successivo. Questo mini-sistema Debian offre flessibilità al processo di
avvio, come la possibilità di aggiungere moduli del kernel prima del
processo di avvio principale o di montare il filesystem root come cifrato.
Si può interrompere questa parte del processo di avvio per ottenere una
shell di root fornendo il parametro di avvio per il kernel
"break=init
" etc. Vedere lo script
"/init
" per ulteriori condizioni di interruzione. Questo
ambiente shell è abbastanza sofisticato da fare una buona ispezione
dell'hardware della macchina.
I comandi disponibili in questo mini-sistema Debian sono versioni minimali e
vengono principalmente forniti da uno strumento GNU chiamato
busybox
(1).
È necessario usare l'opzione "-n
" per il comando
mount
quando si è nel filesystem root in sola lettura.
Tabella 3.3. Elenco di utilità di avvio per il sistema Debian
pacchetto | popcon | dimensione | descrizione |
---|---|---|---|
initscripts *
|
V:91, I:99 | 284 | script per inizializzare ed arrestare il sistema |
sysvinit *
|
V:85, I:99 | 208 |
utilità init (8) in stile System-V
|
sysv-rc *
|
V:91, I:99 | 300 | meccanismo di cambiamento del runlevel in stile System-V |
sysvinit-utils *
|
V:91, I:99 | 224 |
utilità in stile System-V (startpar (8),
bootlogd (8), …)
|
lsb-base *
|
V:91, I:99 | 36 | funzionalità di script init Linux Standard Base 3.2 |
insserv *
|
V:22, I:26 | 292 | strumento per organizzare la sequenza di avvio usando dipendenze LSB negli script init.d |
upstart *
|
V:0.15, I:0.2 | 700 |
demone init (8) basato su eventi per concorrenza
(alternativa a sysvinit )
|
readahead-fedora *
|
V:0.3, I:0.5 | 144 |
readahead (8) per precaricare file del processo di avvio
|
uswsusp *
|
V:4, I:14 | 536 | strumenti per usare la sospensione software in spazio utente fornita da Linux |
kexec-tools *
|
V:0.17, I:0.5 | 320 |
strumento kexec per riavvii kexec (8) (riavvio a caldo)
|
bootchart *
|
V:0.13, I:0.7 | 132 | analizzatore delle prestazioni del processo di avvio |
bootchart-view *
|
V:0.10, I:0.6 | 280 | analizzatore delle prestazioni del processo di avvio (visualizzazione) |
mingetty *
|
V:0.2, I:0.5 | 64 |
getty (8) solo console
|
mgetty *
|
V:0.19, I:0.6 | 416 |
rimpiazzio di getty (8) per smart modem
|
Questa sezione descrive il sistema di avvio classico, in stile System V, di lenny
. Debian si sta
spostando ad un sistema di avvio guidato da eventi. Vedere Il futuro del sistema di avvio in
Debian e Sequenza di
avvio basata su dipendenze.
Tutti i meccanismi di avvio sono compatibili grazie agli script
"/etc/init.d/rc
", "/etc/init.d/rcS
",
"/usr/sbin/update-rc.d
" e
"/usr/sbin/invoke-rc.d
".
Il pacchetto readahead-fedora
può velocizzare l'avvio di
un sistema con una buona quantità di DRAM.
Il sistema Debian normale è il quarto stadio del processo di avvio che viene iniziato dal mini-sistema Debian. Il kernel di sistema del mini-sistema Debian continua ad essere in esecuzione anche in questo ambiente. Il filesystem root viene cambiato da quello in memoria all'effettivo filesystem sul disco fisso.
Il programma "/sbin/init
" viene eseguito per primo e
effettua il lavoro principale del processo di avvio. Debian normalmente usa
lo schema sysvinit tradizionale tramite il pacchetto
sysv-rc
. Vedere init
(8),
inittab
(5) e
"/usr/share/doc/sysv-rc/README.runlevels.gz
" per una
spiegazione dettagliata. Questo processo principale di avvio
fondamentalmente attraversa le fasi seguenti.
/etc/inittab
".
Il runlevel iniziale usato per la modalità multi-utente è specificato con il
parametro di avvio del kernel "init=
" o nella riga
"initdefault" del file "/etc/inittab
". Il sistema Debian,
nella configurazione predefinita, si avvia nel runlevel 2.
Tutti i file script effettivamente eseguiti dal sistema init sono contenuti
nella directory "/etc/init.d/
".
Ogni runlevel usa una directory per la propria configurazione e ha un significato specifico come descritto nella tabella seguente.
Tabella 3.4. Elenco dei runlevel e descrizione del loro uso
runlevel | directory | descrizione dell'uso del runlevel |
---|---|---|
N
|
nessuna |
livello di avvio del sistema (NONE) (nessuna directory
"/etc/rcN.d/ ")
|
0
|
/etc/rc0.d/
|
arresta il sistema |
S
|
/etc/rcS.d/
|
modalità utente-singolo all'avvio (alias "s ")
|
1
|
/etc/rc1.d/
|
modalità utente-singolo dalla modalità multi-utente |
2
|
/etc/rc2.d/
|
modalità multi-utente |
3
|
/etc/rc3.d/
|
"" |
4
|
/etc/rc4.d/
|
"" |
5
|
/etc/rc5.d/
|
"" |
6
|
/etc/rc6.d/
|
riavvia il sistema |
7
|
/etc/rc7.d/
|
modalità multi-utente valida ma normalmente non usata |
8
|
/etc/rc8.d/
|
"" |
9
|
/etc/rc9.d/
|
"" |
Si può cambiare il runlevel dalla console, per esempio a 4, nel modo seguente.
$ sudo telinit 4
Il sistema Debian non assegna nessuna differenza significativa airunlevel compresi tra 2 e 5. L'amministratore di un sistema Debian può cambiare questa situazione. (Cioè Debian non è Red Hat Linux né Solaris di Sun Microsystems né HP-UX di Hewlett Packard né AIX di IBM, né …)
Il sistema Debian non popola le directory per i runlevel tra 7 e 9 quando il pacchetto è installato. Le varianti di Unix tradizionali non usano questi runlevel.
In Debian squeeze
, viene usato l'ordine di avvio basato
sulle dipendenze fornito dal pacchetto insserv
, invece di
quello alfabetico classico. Il valore di "CONCURRENCY
" in
"/etc/default/rcS
" controlla la concorrenza:
"none
" per nessuna concorrenza,
"startpar
" per concorrenza con lo stesso numero di
seuqenza o "makefile
" per piena concorrenza. Vedere
"/usr/share/doc/insserv/README.Debian
".
Il nome dei collegamenti simbolici in ciascuna directory dei runlevel ha la
forma "S<numero-a-2-cifre><nome-originale>
" o
"K<numero-a-2-cifre><nome-originale>
". Il
numero a due cifre è usato per determinare l'ordine in cui eseguire gli
script. "S
sta per "Start" (avvia) e
"K
" sta per "Kill" (uccidi).
Con "CONCURRENCY=none
", quando i comandi
init
(8) o telinit
(8) vanno nel
runlevel "<n>", eseguono gli script seguenti.
/etc/rc<n>.d/
il cui nome inizia con
una "K
" vengono eseguiti in ordine alfabetico con l'unico
argomento "stop
". (uccisione dei servizi)
/etc/rc<n>.d/
il cui nome inizia con
una "S
" vengono eseguiti in ordine alfabetico con l'unico
argomento "start
". (avvio dei servizi)
Per esempio, se in una directory di runlevel sono presenti i collegamenti
"S10sysklogd
" e "S20exim4
",
"S10sysklogd
", che è un collegamento simbolico a
"../init.d/sysklogd
", viene eseguito prima di
"S20exim4
", che è un collegamento simbolico a
"../init.d/exim4
".
Con "CONCURRENCY=makefile
" (nuovo valore predefinito),
vengono usate le dipendenze di pacchetto definite nell'intestazione degli
script init per ordinare la loro esecuzione.
È sconsigliato fare qualsiasi cambiamento ai collegamenti simbolici in
"/etc/rcS.d/
" a meno che non si sia più esperti del
manutentore.
Per esempio, si può impostare il sistema dei runlevel in un modo che ricorda Red Hat Linux nel modo seguente.
init
avvia il sistema con runlevel=3 in modo predefinito.
init
non avvia gdm
(1) nei
runlevel=(0,1,2,6).
init
avvia gdm
(1) nei
runlevel=(3,4,5).
Si può ottenre questo modificando con un editor il file
"/etc/inittab
", per cambiare il runlevel di avvio, e
usando strumenti amichevoli di gestione dei runlevel come
sysv-rc-conf
o bum
, per modificare i
runlevel. Se si vuole invece usare solamente la riga di comando, si può
farlo nel modo seguente (dopo l'installazione standard del pacchetto
gdm
e avendolo selezionato come display manager
prescelto).
# cd /etc/rc2.d ; mv S21gdm K21gdm # cd /etc ; perl -i -p -e 's/^id:.:/id:3:/' inittab
Notare che il file "/etc/X11/default-display-manager
"
viene controllato quando vengono avviati i demoni per display manager:
xdm
, gdm
, kdm
e
wdm
.
Si può sempre avviare X da qualsiasi shell in console con il comando
startx
(1).
Il parametro predefinito per ciascun script init in
"/etc/init.d/
" è dato dal file corrispondente in
"/etc/default/
" che contiene solamente assegnazioni di variabili d'ambiente. Il
nome della directory è una scelta specifica di Debian. È grossomodo
l'equivalente della directory "/etc/sysconfig
" di Red Hat Linux e altre distribuzioni. Per
esempio, si può usare "/etc/default/cron
" per controllare
il funzionamento di "/etc/init.d/cron
".
Il file "/etc/default/rcS
" può essere usato per
personalizzare impostazioni standard dell'avvio per
motd
(5), sulogin
(8), ecc.
Se non si ottiene il comportamento voluto cambiando queste variabili, si possono modificare gli script init stessi. Questi sono file di configurazione modificabili dall'amministratore di sistema.
Il kernel gestisce il nome host del
sistema. Lo script init nel runlevel S, che è un collegamento simbolico a
"/etc/init.d/hostname.sh
" imposta il nome host del
sistema all'avvio (usando il comando hostname
) al nome
memorizzato in "/etc/hostname
". Questo file dovrebbe
contenere solamente il nome host del
sistema, non un nome di dominio pienamente qualificato.
Per visualizzare il nome host attuale eseguire
hostname
(1) senza alcun argomento.
Benché il filesystem root sia montato dal kernel quando viene avviato, gli altri filesystem sono montati nel runlevel S dagli scritp init seguenti.
`/etc/init.d/mountkernfs.sh
" per i filesystem del kernel
in "/proc
", "/sys
", ecc.
`/etc/init.d/mountdevsubfs.sh
" per i filesystem virtuali
in "/dev
"
`/etc/init.d/mountall.sh
" per i filesystem normali,
usando "/etc/fstab
"
`/etc/init.d/mountnfs.sh
" per i filesystem di rete,
usando using"/etc/fstab
"
Le opzioni usate per montare i filesystem sono impostate in
"/etc/fstab
". Vedere Sezione 9.3.5, «Ottimizzare il file system con opzioni di mount»
L'effettivo montaggio dei filesystem di rete attende l'avvio delle interfacce di rete.
Dopo aver montato tutti i filesystem, i file temporanei in
"/tmp
", "/var/lock
" e
"/var/run
" vengono ripuliti ad ogni avvio.
Le interfacce di rete sono inizializzate nel runlevel S dagli script init
che sono collegamenti simbolici a
"/etc/init.d/ifupdown-clean
" e
"/etc/init.d/ifupdown
". VedereCapitolo 5, Impostazione della rete per la loro configurazione.
Molti servizi di rete (vedere Capitolo 6, Applicazioni per la rete) sono
avviati nella modalità multi-utente direttamente, come processi demone,
all'avvio da script di init, per esempio,
"/etc/rc2.d/S20exim4
" (per RUNLEVEL=2) che è un
collegamento simbolico a "/etc/init.d/exim4
".
Alcuni servizi di rete possono essere avviati a richiesta, usando il super-server inetd
(o un
equivalente). inetd
viene avviato all'avvio da
"/etc/rc2.d/S20inetd
" (per RUNLEVEL=2) che è un
collegamento simbolico a
"/etc/init.d/inetd
". Fondamentalmente
inetd
permette ad un demone in esecuzione di invocarne
svariati altri, riducendo il carico sul sistema.
Quando al super-server
inetd
arriva una richiesta per un servizio, vengono
identificati il suo protocollo e il suo servizio cercandoli nei database in
"/etc/protocols
" e
"/etc/services
". inetd
quindi cerca un
servizio Internet normale nel database "/etc/inetd.conf
"
o un servizio basato su Open Network Computing Remote
Procedure Call (ONC RPC)/Sun RPC in
"/etc/rpc.conf
".
A volte, inetd
non avvia il servizio richiesto
direttamente, ma avvia il programma wrapper
TCP tcpd
(8), con il nome di servizio richiesto,
in "/etc/inetd.conf
", come argomento. In questo caso,
tcpd
esegue il programma server appropriato dopo aver
fatto la registrazione della richiesta e qualche altro controllo addizionale
usando "/etc/hosts.deny
" e
"/etc/hosts.allow
".
Per la sicurezza del sistema è bene disabilitare più servizi di rete possibile. Vedere Sezione 4.6.3, «Limitare l'accesso ad alcuni servizi server».
Vedere inetd
(8), inetd.conf
(5),
protocols
(5), services
(5),
tcpd
(8), hosts_access
(5),
hosts_options
(5), rpcinfo
(8),
portmap
(8) e
"/usr/share/doc/portmap/portmapper.txt.gz
".
I messaggi di sistema possono essere personalizzati da
"/etc/default/syslogd
" e
"/etc/syslog.conf
" sia per il file di registro sia per la
visualizzazione a schermo. Vedere syslogd
(8) e
syslog.conf
(5). Vedere anche Sezione 9.2.2, «Analizzatori di registro».
I messaggi del kernel possono essere personalizzati da
"/etc/default/klogd
" sia per il file di registro sia per
la visualizzazione a schermo. Impostare "KLOGD='-c 3'
" in
tale file ed eseguire "/etc/init.d/klogd restart
". Vedere
klogd
(8).
Si può cambiare direttamente il livello dei messaggi di errore mostrati con il comando seguente.
# dmesg -n3
Tabella 3.5. Elenco dei livelli di errore del kernel
valore del livello di errore | nome del livello di errore | significato |
---|---|---|
0 | KERN_EMERG | il sistema è inutilizzabile |
1 | KERN_ALERT | bisogna agire immediatamente |
2 | KERN_CRIT | condizione critica |
3 | KERN_ERR | condizione di errore |
4 | KERN_WARNING | condizione di avvertimento |
5 | KERN_NOTICE | condizione normale ma significativa |
6 | KERN_INFO | messaggio informativo |
7 | KERN_DEBUG | messaggio a livello di debug |
Per i kernel Linux 2.6, il sistema udev
fornisce un meccanismo di rilevazione e inizializzazione automatiche
dell'hardware (vedere udev
(7)). Per ogni dispositivo
rilevato dal kernel, il sistema udev avvia un processo utente che usa le
informazioni del filesystem sysfs (vedere Sezione 1.2.12, «procfs e sysfs»), carica, usando
modprobe
(8) (vedere Sezione 3.5.12, «L'inizializzazione dei moduli del kernel»), i moduli del kernel
necessari per il supporto del dispositivo e crea i nodi di device
corrispondenti.
Se, per una qualche ragione
"/lib/modules/<versione-kernel>/modules.dep
non
viene generato in modo appropriato dal depmod
(8), i
moduli non possono essere caricati come dovuto dal sistema udev. Per
risolvere il problema eseguire "depmod -a
".
Il nome dei nodi di device può essere configurato dai file di regole di udev
in "/etc/udev/rules.d/
". Le regole predefinite attuali
tendono a creare nomi generati dinamicamente che hanno come risultato nomi
di device non fissi, tranne che per dispositivi CD e di rete. Aggiungendo le
proprie regole personalizzate, in modo simile a quelle per i dispositivi CD
e di rete, si possono creare nomi di device statici anche per altri
dispositivi, come chiavette USB. Vedere "Scrivere regole udev" o
"/usr/share/doc/udev/writing_udev_rules/index.html
".
Dato che il sistema udev è in qualche modo in costante evoluzione, in questo documento sono fornite informazioni base, lasciando i dettagli ad altra documentazione.
Per le regole di montaggio in "/etc/fstab
", non è
necessario che i nodi di device siano statici. Si possono usare gli UUID per montare i dispositivi, al posto dei nomi di
device come "/dev/sda
". Vedere Sezione 9.3.2, «Accedere alle partizioni usando UUID».
Il programma modprobe
(8) permette di configurare il
kernel Linux in esecuzione da processi utente, aggiungendo e rimuovendo
moduli del kernel. Il sistema udev (vedere Sezione 3.5.11, «Il sistema udev») automatizza la sua invocazione per facilitare
l'inizializzazione dei moduli del kernel.
Ci sono moduli non-hardware e speciali moduli con driver hardware, come
quelli elencati in seguito, che devono essere precaricati elencandoli nel
file "/etc/modules
" (vedere
modules
(5)).
iptables
(8), Sezione 5.9, «Infrastruttura netfilter» e
I file di configurazione per il programma modprobe
(8)
sono contenuti nella directory "/etc/modprobes.d/
", come
spiegato in modprobe.conf
(5). (Se si desidera evitare
l'autocaricamento di alcuni moduli del kernel, considerare la loro aggiunta
nella lista nera nel file "/etc/modprobes.d/blacklist
".)
Il file "/lib/modules/<versione>/modules.dep
"
generato dal programma depmod
(8) descrive le dipendenze
dei moduli usate dal programma modprobe
(8).
Se si hanno problemi di caricamento dei moduli all'avvio o con
modprobe
(8), "depmod -a
" potrebbe
risolverli rigenerando il file "modules.dep
".
Il programma modinfo
(8) mostra informazioni su un modulo
del kernel Linux.
Il programma lsmod
(8) formatta in un bel modo i contenuti
di "/proc/modules
", mostrando quali moduli del kernel
siano attualmente caricati.
Si può identificare l'esatto hardware sul proprio sistema. Vedere Sezione 9.6.3, «Identificazione dell'hardware».
Si può configurare l'hardware all'avvio per attivare le funzionalità dell'hardware desiderate. Vedere Sezione 9.6.4, «Configurazione dell'hardware».
Si può aggiungere il supporto per il proprio dispositivo ricompilando il kernel. Vedere Sezione 9.7, «Il kernel».
Quando una persona (o un programma) richiede l'accesso al sistema, l'autenticazione verifica che l'identità sia fidata.
Errori di configurazione di PAM possono lasciare l'utente fuori dal proprio sistema. Si deve avere un CD di ripristino a portata di mano o impostare una partizione di avvio alternativa. Per fare il ripristino, avviare il sistema con uno di essi e correggere le cose da lì.
L'autenticazione Unix normale è fornita dal modulo
pam_unix
(8) sotto PAM (Pluggable Authentication
Modules). I suoi 3 importanti file di configurazione, con voci
separate da ":
", sono i seguenti.
Tabella 4.1. I 3 importanti file di configurazione per pam_unix
(8)
file | permessi | utente | gruppo | descrizione |
---|---|---|---|---|
/etc/passwd
|
-rw-r--r--
|
root
|
root
|
informazioni sugli account utente (ripulite) |
/etc/shadow
|
-rw-r-----
|
root
|
shadow
|
informazioni sicure sugli account utente |
/etc/group
|
-rw-r--r--
|
root
|
root
|
informazioni sui gruppi |
"/etc/passwd
" contiene righe come le seguenti.
... utente1:x:1000:1000:Utente1 Nome,,,:/home/utente1:/bin/bash utente2:x:1001:1001:Utente2 Nome,,,:/home/utente2:/bin/bash ...
Come spiegato in "passwd
(5), le voci separate da
":
in questo file hanno il significato seguente.
La seconda voce del file "/etc/passwd
" era usata per la
password cifrata. Dopo l'introduzione di "/etc/shadow
",
questa voce è usata per la specificazione della password.
Tabella 4.2. Il contenuto della seconda voce di "/etc/passwd
"
contenuto | significato |
---|---|
(vuoto) | account senza password |
x |
la password cifrata è in "/etc/shadow "
|
* | nessun login per questo account |
! | nessun login per questo account |
"/etc/shadow
" contiene righe come le seguenti.
... utente1:$1$Xop0FYH9$IfxyQwBe9b8tiyIkt2P4F/:13262:0:99999:7::: utente2:$1$vXGZLVbS$ElyErNf/agUDsm1DehJMS/:13261:0:99999:7::: ...
Come spiegato in "shadow
(5), le voci separate da
":
in questo file hanno il significato seguente.
$1$
" iniziali indicano
l'uso della cifratura MD5. "*" indica nessun login.)
"/etc/group
" contiene righe come le seguenti.
gruppo1:x:20:utente1,utente2
Come spiegato in "group
(5), le voci separate da
":
in questo file hanno il significato seguente.
"/etc/gshadow
" fornisce funzioni simili a
"/etc/shadow
" per "/etc/group
", ma non
è realmente usato.
Può essere dinamicamente aggiunta la reale appartenenza di un utente ad un
gruppo se viene aggiunta la riga "auth optional
pam_group.so
al file "/etc/pam.d/common-auth
" e
se viene impostata in "/etc/security/group.conf
". Vedere
pam_group
(8).
Il pacchetto base-passwd
contiene una lista autorevole di
utenti e gruppi:
"/usr/share/doc/base-passwd/users-and-groups.html
".
Quelli che seguono sono alcuni comandi degni di nota per gestire le informazioni sugli account
Tabella 4.3. Elenco di comandi per gestire informazioni su account
comando | funzione |
---|---|
getent passwd <nome_utente>
|
sfoglia le informazioni sull'account di
"<nome_utente> "
|
getent shadow <nome_utente>
|
sfoglia le informazioni shadow sull'account di
"<nome_utente> "
|
getent group <nome_gruppo>
|
sfoglia le informazioni sul gruppo "<nome_gruppo> "
|
passwd
|
gestisce la password per l'account |
passwd -e
|
imposta una password usa e getta per l'attivazione dell'account |
chage
|
gestisce le informazioni sulla scadenza della password |
Può essere necessario avere i privilegi di root per far funzionare alcune di
queste funzioni. Vedere crypt
(3) per la cifratura di
password e dati.
Nei sistemi configurati con PAM e NSS, come la macchina alioth Debian, il contenuto dei file locali
"/etc/passwd
", "/etc/group
" e
"/etc/shadow
" può non essere attivamente usato dal
sistema. I comandi sopra descritti sono validi anche in un ambiente di
questo tipo.
Quando si crea un account, durante l'installazione del sistema o con il
comando passwd
(1), si dovrebbe scegliere una buona password che consiste, secondo
passwd
(1), di un numero di caratteri da 6 a 8, incluso
uno o più caratteri da ciascuno dei seguenti insiemi.
Non scegliere come password parole indovinabili.
Ci sono strumenti indipendenti per generare password cifrate con salt
Tabella 4.4. Elenco di strumenti per generare password
pacchetto | popcon | dimensione | comando | funzione |
---|---|---|---|---|
whois
*
|
V:10, I:88 | 396 |
mkpasswd
|
frontend ricco di funzionalità per la libreria crypt (3)
|
openssl *
|
V:56, I:91 | 2380 |
openssl passwd
|
calcola hash di password (OpenSSL). passwd (1ssl)
|
I moderni sistemi *nix come il sistema Debian, forniscono all'amministratore di sistema i meccanismi PAM (Pluggable Authentication Modules) e NSS (Name Service Switch) per configurare il sistema. Il ruolo di questi meccanismi può essere riassunto nel modo seguente.
ls
(1) e id
(1).
Questi sistemi PAM e NSS devono essere configurati in modo coerente.
I pacchetti degni di nota relativi ai sistemi PAM e NSS sono i seguenti.
Tabella 4.5. Elenco dei pacchetti degni di nota per i sistemi PAM e NSS
pacchetto | popcon | dimensione | descrizione |
---|---|---|---|
libpam-modules *
|
V:88, I:99 | 1036 | Pluggable Authentication Modules, moduli di autenticazione inseribili (servizio base) |
libpam-ldap *
|
V:2, I:4 | 408 | Pluggable Authentication Module, modulo di autenticazione inseribile, che permette interfacce LDAP |
libpam-cracklib *
|
V:2, I:2 | 104 | Pluggable Authentication Module, modulo di autenticazione inseribile, che permette il supporto di cracklib |
libpam-doc *
|
I:0.6 | 1208 | Pluggable Authentication Modules, moduli di autenticazione inseribili (documentazione in html e testo semplice) |
libc6
*
|
V:97, I:99 | 10012 | Libreria GNU C: librerie condivise che forniscono anche il servizio "Name Service Switch" |
glibc-doc *
|
I:3 | 2008 | Libreria GNU C: pagine man |
glibc-doc-reference *
|
I:1.4 | 12156 | Libreria GNU C: manuale di riferimento nei formati info, pdf e html (non-free) |
libnss-mdns *
|
I:49 | 116 | Modulo NSS per la risoluzione dei nomi DNS Multicast |
libnss-ldap *
|
I:4 | 268 | Modulo NSS per l'uso di LDAP come servizio per i nomi |
libnss-ldapd *
|
V:0.18, I:0.5 | 144 |
Modulo NSS per l'uso di LDAP come servizio per i nomi (nuovo fork di
libnss-ldap )
|
libpam-doc
è essenziale per
imparare la configurazione di PAM.
glibc-doc-reference
è essenziale per imparare la
configurazione di NSS.
Si può ottenere un elenco più esteso ed aggiornato usando il comando
"aptitude search 'libpam-|libnss-'
". L'acronimo NSS può
anche significare "Network Security Service" che è una cosa diversa da "Name
Service Switch".
PAM è il metodo più basilare per inizializzare le variabili d'ambiente per ciascun programma con valori predefiniti a livello di sistema.
Quelli che seguono sono alcuni file degni di nota letti da PAM.
Tabella 4.6. Elenco di file di configurazione letti da PAM
file di configurazione | funzione |
---|---|
/etc/pam.d/<nome_programma>
|
imposta la configurazione PAM per il programma
"<nome_programma> "; vedere
pam (7) e pam.d (5)
|
/etc/nsswitch.conf
|
imposta la configurazione NSS con la voce per ciascun servizio. Vedere
nsswitch.conf (5)
|
/etc/nologin
|
limita il login utente con il modulo pam_nologin (8)
|
/etc/securetty
|
limita la tty per l'accesso root con il modulo
pam_securetty (8)
|
/etc/security/access.conf
|
imposta il limite di accesso con il modulo pam_access (8)
|
/etc/security/group.conf
|
imposta restrizioni basate su gruppi con il modulo
pam_group (8)
|
/etc/security/pam_env.conf
|
imposta le variabili d'ambiente con il modulo pam_env (8)
|
/etc/environment
|
imposta variabili d'ambiente aggiuntive con il modulo
pam_env (8) con l'argomento "readenv=1 "
|
/etc/default/locale
|
imposta la localizzazione con il modulo pam_env (8) con
l'argomento "readenv=1 envfile=/etc/default/locale "
(Debian)
|
/etc/security/limits.conf
|
imposta limitazioni alle risorse (ulimit, core, …) con il modulo
pam_limits (8)
|
/etc/security/time.conf
|
imposta limitazioni temporali con il modulo pam_time (8)
|
Le restrizioni sulla scelta delle password sono implementate dai moduli PAM
pam_unix
(8) e pam_cracklib
(8). Possono
essere configurati tramite i loro argomenti.
I moduli PAM usano il suffisso ".so
" nei loro nomi file.
La moderna gestione centralizzata del sistema può essere messa in atto usando il server del Protocollo LDAP (Lightweight Directory Access Protocol) per amministrare molti sistemi *nix e non *nix in rete. L'implementazione open source del protocollo LDAP è il software OpenLDAP.
Il server LDAP fornisce le informazioni sugli account attraverso l'uso di
PAM e NSS con i pacchetti per il sistema Debian
libpam-ldap
e libnss-ldap
. Per
abilitare ciò sono necessarie diverse azioni. (Non ho mai usato questa
configurazione e le informazioni che seguono sono di seconda mano. Tenerlo a
mente quando si legge quanto segue.)
slapd
(8).
Si modificano i file di configurazione di PAM nella directory
"/etc/pam.d/
" per usare "pam_ldap.so
"
invece del predefinito "pam_unix.so
".
/etc/pam_ldap.conf
" come file di
configurazione per libpam-ldap
e
"/etc/pam_ldap.secret
" come file per archiviare la
password di root.
Si modifica la configurazione di NSS nel file
"/etc/nsswitch.conf
" per usare "ldap
"
invece della scelta predefinita ("compat
" o
"file
").
/etc/libnss-ldap.conf
" come file di
configurazione per libnss-ldap
.
libpam-ldap
usi una connessione SSL (o TLS).
libnss-ldap
usi una connessione SSL (o TLS) a prezzo di un maggiore carico sulla
rete LDAP.
nscd
(8) localmente per mettere nella
cache ogni risultato di ricerche LDAP in modo da ridurre il traffico di rete
LDAP.
Vedere la documentazione in pam_ldap.conf
(5) e
"/usr/share/doc/libpam-doc/html/
" fornita dal pacchetto
libpam-doc
e in "info libc 'Name Service
Switch'
" fornita dal pacchetto glibc-doc
.
In modo simile si possono impostare sistemi centralizzati alternativi con altri metodi.
Questa è la famosa sezione scritta da Richard M. Stallman, alla fine della
vecchia pagina "info su
. Non c'è da preoccuparsi:
l'attuale comando su
in Debian usa PAM, perciò questo può
limitare la possibilità di usare su
verso il gruppo
root
abilitando la riga con
"pam_wheel.so
" in "/etc/pam.d/su
".
L'installazione del pacchetto libpam-cracklib
permette di
imporre regole più stringenti sulle password, per esempio usando righe
attive nel file "/etc/pam.d/common-password
" come le
seguenti.
Per lenny
:
password required pam_cracklib.so retry=3 minlen=9 difok=3 password required pam_unix.so use_authtok nullok md5
Per squeeze
:
password required pam_cracklib.so retry=3 minlen=9 difok=3 password [success=1 default=ignore] pam_unix.so use_authtok nullok md5 password requisite pam_deny.so password required pam_permit.so
Vedere Sezione 9.5.15, «Tasto Alt-SysRq» per limitare la funzionalità SAK (Secure Attention Key) del kernel.
sudo
(8) è un programma progettato per permettere ad un
sysadmin di dare privilegi di root limitati ad utenti e di registrare
l'attività come root. sudo
richiede solo la password di
un utente regolare. Installare il pacchetto sudo
e
attivarlo impostando le opzioni in "/etc/sudoers
". Vedere
un esempio di configurazione in
"/usr/share/doc/sudo/examples/sudoers
".
Il mio uso di sudo
per un sistema con un singolo utente
(vedere Sezione 1.1.12, «Configurazione di sudo») è mirato a proteggere me
stesso dalla mia stupidità. Personalmente condidero l'uso di
sudo
come un'alternativa migliore all'uso costante del
sistema dall'account root. Per esempio, il comando seguente cambia il
proprietario di "<un_certo_file>
" in
"<mio_nome>
".
$ sudo chown <mio_nome> <un_certo_file>
Naturalmente se si conosce la password di root (come accade per ogni utente
Debian che ha installato il proprio sistema), qualsiasi comando può essere
eseguito come utente root da qualsiasi account utente usando "su
-c
".
SELinux (Security-Enhanced Linux) è un'infrastruttura per rendere il modello basato su privilegi più restrittivo del modello ordinario di sicurezza in stile Unix, usando politiche di controllo obbligatorio degli accessi (MAC, mandatory access control). I poteri di root possono essere limitati in determinate condizioni.
Per la sicurezza del sistema è una buona idea disabilitare il maggior numero di programmi server possibile. Questo aspetto diventa critico per i server di rete. Avere server inutilizzati, attivati direttamente come demoni o attraverso un programma super-server, è considerato un rischio per la sicurezza.
Molti programmi, come sshd
(8), usano un controllo degli
accessi basato su PAM. Ci sono molti modi per limitare gli accessi ad un
qualche servizio server.
/etc/default/<nome_programma>
"
/etc/inetd.conf
" per il super-server
/etc/hosts.deny
" e "/etc/hosts.allow
"
per il wrapper TCP,
tcpd
(8)
/etc/rpc.conf
" per Sun RPC
/etc/at.allow
" e "/etc/at.deny
" per
atd
(8)
/etc/cron.allow
" e "/etc/cron.deny
"
per crontab
(1)
Vedere Sezione 3.5.3, «Esempio di gestione dei runlevel», Sezione 3.5.4, «Il parametro predefinito per ciascuno script init», Sezione 4.5.1, «File di configurazione letti da PAM e NSS», Sezione 3.5.8, «Inizializzazione dei servizi di rete» e Sezione 5.9, «Infrastruttura netfilter».
I servizi Sun RPC devono essere attivi per i programmi NFS ed altri programmi basati su RPC.
Se si hanno problemi con l'accesso remoto in sistemi Debian recenti,
commentare la configurazione responsabile come "ALL: PARANOID" in
"/etc/hosts.deny
", se esiste. (Essere però consapevoli
dei rischi per la sicurezza che questo tipo di azione comporta.)
Le informazioni fornite in questo documento potrebbe non essere sufficienti per le proprie necessità di sicurezza ma dovrebbero essere un buon punto di partenza.
Molti servizi per livello di trasporto popolari comunicano i loro messaggi, compresa l'autenticazione con password, in puro testo. È una pessima idea trasmettere password in puro testo attraverso l'Internet selvaggia dove possono essere intercettate. Si possono eseguire questi servizi attraverso "TLS" (Transport Layer Security, sicurezza del livello di trasporto), o il suo predecessore "SSL" (Secure Sockets Layer, livello per socket sicuri), per rendere sicura tramite cifratura tutta la comunicazione, compresa la password.
Tabella 4.7. Elenco di servizi e porte sicuri e non sicuri
nome del servizio non sicuro | porta | nome del servizio sicuro | porta |
---|---|---|---|
www (http) | 80 | https | 443 |
smtp (posta) | 25 | ssmtp (smtps) | 465 |
ftp-data | 20 | ftps-data | 989 |
ftp | 21 | ftps | 990 |
telnet | 23 | telnets | 992 |
imap2 | 143 | imaps | 993 |
pop3 | 110 | pop3s | 995 |
ldap | 389 | ldaps | 636 |
La cifratura ha un costo in termini di tempo CPU. Come alterativa leggera per la CPU, si può mantenere la comunicazione in testo semplice, rendendo allo stesso tempo sicura la sola password con un protocollo di autenticazione sicura come "APOP" (Authenticated Post Office Protocol) per POP e "CRAMD-MD5" (Challenge-Response Authentication Mechanism MD5) per SMTP e IMAP. (Per inviare messaggi di posta elettronica via Internet dal proprio programma di posta al proprio server di posta è diventato popolare recentemente l'uso per SMTP della porta 587 invece della porta tradizionale 25, per evitare il blocco da parte del fornitore del servizio Internet della porta 25 autenticandosi allo stesso tempo con CRAM-MD5.)
Il programma Secure Shell (SSH
fornisce comunicazioni sicure cifrate tra due host non fidati attraverso una
rete non sicura, grazie ad un'autenticazione sicura. Consiste del client
OpenSSH, ssh
(1) e del
demone OpenSSH,
sshd
(8). SSH può essere usato per fare da tunnel sicuro
attraverso Internet per le comunicazioni con protocollo non sicuro come POP
ed X, con la funzionalità di inoltro delle porte.
Il client cerca di autenticarsi usando un'autenticazione basata sull'host, su una chiave pubblica, challenge-response o con password. L'uso di un'autenticazione con chiave pubblica permette il login remoto senza password. Vedere Sezione 6.9, «Il server e le utilità per l'accesso remoto (SSH)».
Anche quando si eseguono servizi sicuri, come server SSH (Secure shell) e PPTP (Point-to-Point Tunneling Protocol), esiste sempre la possibilità di un'intrusione da Internet con attacchi basati sull'indovinare la password usando metodi con forza bruta, ecc. L'uso di una politica di firewall (vedere Sezione 5.9, «Infrastruttura netfilter») insieme agli strumenti di sicurezza elencati in seguito, può migliorare la sicurezza generale.
Tabella 4.8. Elenco di strumenti per fornire misure aggiuntive di sicurezza
pacchetto | popcon | dimensione | descrizione |
---|---|---|---|
knockd *
|
V:0.15, I:0.3 | 164 |
piccoli demone, knockd (1), e client,
knock (1) per bussare alle porte
|
denyhosts *
|
V:2, I:2 | 356 | utilità per aiutare gli amministratori di sistema a contrastare hacker ssh |
fail2ban *
|
V:4, I:5 | 660 | strumento per interdire IP che causano errori di autenticazione multipli |
libpam-shield *
|
V:0.01, I:0.05 | 104 | blocca all'esterno gli attacchi remoti che cercano di indovinare le password |
Per impedire che qualcuno possa accedere alla propria macchina con privilegi di root, è necessario compiere le azioni seguenti.
Avendo accesso fisico al disco fisso, reimpostare la password di root è relativamente semplice seguendo i passi seguenti.
/etc/passwd
" nella partizione root e
rendere la seconda voce per l'account di root
vuota.
Se si ha l'accesso in modifica alle voci di menu di GRUB (vedere Sezione 3.3, «Stadio 2: il bootloader») per grub-rescue-pc
all'avvio, è ancora più semplice, seguendo i passi seguenti.
root=/dev/hda6 rw init=/bin/sh
".
/etc/passwd
" e rendere la seconda
voce per l'account di root
vuota.
Si può ora accedere alla shell di root del sistema senza password.
Una volta ottenuto l'accesso alla shell di root, si ha l'accesso a qualsiasi
cosa sul sistema e si può reimpostare qualsiasi password. Inoltre, si
possono compromettere le password per tutti gli account utente usando
strumenti di violazione delle password con attacchi a forza bruta, come
quelli nei pacchetti john
e crack
(vedere Sezione 9.6.11, «Verifica della sicurezza e dell'integrità del sistema»). Queste
password violate possono portare alla compromissione di altri sistemi.
L'unica soluzione software ragionevole per evitare tutte queste
preoccupazioni è l'uso di una partizione root (o partizione
"/etc
") cifrata, usando dm-crypt e initramfs (vedere Sezione 9.4, «Suggerimenti per la cifratura dei dati»). Tuttavia è sempre necessaria la password
per avviare il sistema.
Per una guida generica all'uso della rete in GNU/Linux, leggere la Linux Network Administrators Guide.
In questa sezione viene descritta in breve l'infrastruttura base di rete in un sistema Debian moderno.
Tabella 5.1. Elenco degli strumenti di configurazione della rete
pacchetto | popcon | dimensione | tipo | descrizione |
---|---|---|---|---|
ifupdown *
|
V:60, I:99 | 228 | config::ifupdown | strumento standard per attivare e disattivare la rete (specifico di Debian) |
ifplugd *
|
V:0.4, I:0.9 | 244 | " " | gestisce automaticamente la rete cablata |
ifupdown-extra *
|
V:0.04, I:0.2 | 124 | " " |
script per testare la rete di supporto al pacchetto
"ifupdown "
|
ifmetric *
|
V:0.02, I:0.10 | 100 | " " | imposta la metrica di routing per un'interfaccia di rete |
guessnet *
|
V:0.07, I:0.3 | 516 | " " |
script di mappatura di supporto al pacchetto "ifupdown ",
attraverso il file "/etc/network/interfaces "
|
ifscheme *
|
V:0.03, I:0.08 | 132 | " " |
script di mappatura di supporto al pacchetto "ifupdown "
|
ifupdown-scripts-zg2 *
|
V:0.00, I:0.04 | 232 | " " | script di interfaccia di Zugschlus per il metodo manuale di ifupdown |
network-manager *
|
V:24, I:33 | 2628 | config::NM | NetworkManager (demone): gestisce la rete automaticamente |
network-manager-gnome *
|
V:17, I:29 | 5616 | " " | NetworkManager (frontend GNOME) |
network-manager-kde *
|
V:2, I:3 | 264 | " " | NetworkManager (frontend KDE) |
cnetworkmanager *
|
V:0.05, I:0.2 | 208 | " " | NetworkManager (client a riga di comando) |
wicd
*
|
V:0.5, I:2 | 88 | config::wicd | gestore della rete cablata e wireless (metapacchetto) |
wicd-cli *
|
V:0.04, I:0.2 | 128 | " " | gestore della rete cablata e wireless (client a riga di comando) |
wicd-curses *
|
V:0.15, I:0.4 | 236 | " " | gestore della rete cablata e wireless (client Curses) |
wicd-daemon *
|
V:1.9, I:2 | 1780 | " " | gestore della rete cablata e wireless (demone) |
wicd-gtk *
|
V:1.6, I:2 | 772 | " " | gestore della rete cablata e wireless (client GTK+) |
iptables *
|
V:27, I:99 | 1316 | config::Netfilter | strumenti amministrativi per filtraggio di pacchetti di rete e NAT (Netfilter) |
iproute *
|
V:41, I:88 | 1044 | config::iproute2 |
iproute2, IPv6 e altra configurazione di
rete avanzata: ip (8), tc (8), ecc.
|
ifrename *
|
V:0.2, I:0.6 | 236 | " " |
rinomina le interfacce di rete in base a vari criteri statici:
ifrename (8)
|
ethtool *
|
V:4, I:13 | 208 | " " | mostra e modifica le impostazioni dei device Ethernet |
iputils-ping *
|
V:36, I:99 | 96 | test::iproute2 | testa la raggiungibilità di rete di un host remoto con nome host o indirizzo IP (iproute2) |
iputils-arping *
|
V:0.6, I:6 | 36 | " " | testa la raggiungibilità di rete di un host remoto specificato con il suo indirizzo ARP |
iputils-tracepath *
|
V:0.4, I:2 | 72 | " " | traccia il percorso di rete verso un host remoto |
net-tools *
|
V:70, I:99 | 1016 | config::net-tools |
toolkit di rete NET-3 (net-tools,
configurazione di rete IPv4): ifconfig (8), ecc.
|
inetutils-ping *
|
V:0.03, I:0.12 | 296 | test::net-tools | testa la raggiungibilità della rete di un host remoto con nome host o indirizzo IP (datato, GNU) |
arping *
|
V:0.5, I:3 | 104 | " " | testa la raggiungibilità di rete di un host remoto specificato con il suo indirizzo ARP (datato) |
traceroute *
|
V:13, I:99 | 192 | " " | traccia il percorso di rete verso un host remoto (datato, console) |
dhcp3-client *
|
V:32, I:92 | 60 | config::low-level | client DHCP |
wpasupplicant *
|
V:28, I:39 | 828 | " " | supporto client per WPA e WPA2 (IEEE 802.11i) |
wireless-tools *
|
V:7, I:22 | 420 | " " | strumenti per manipolare le estensioni wireless per Linux |
ppp
*
|
V:6, I:26 | 1016 | " " |
connessione PPP/PPPoE con chat
|
pppoeconf *
|
V:0.4, I:3 | 344 | config::helper | strumento di aiuto di configurazione per la connessione PPPoE |
pppconfig *
|
V:0.2, I:2 | 964 | " " |
strumento di aiuto per la connessione PPP con chat
|
wvdial *
|
V:0.5, I:2 | 416 | " " |
strumento di aiuto per la connessione PPP con wvdial e
ppp
|
mtr-tiny *
|
V:2, I:26 | 120 | test::low-level | traccia il percorso di rete verso un host remoto (curses) |
mtr
*
|
V:0.7, I:3 | 180 | " " | traccia il percorso di rete verso un host remoto (curses e GTK+) |
gnome-nettool *
|
V:2, I:33 | 2848 | " " | strumenti per operazioni comuni sulle informazioni di rete (GNOME) |
nmap
*
|
V:6, I:31 | 7112 | " " | strumento per mappatura della rete / esplorazione delle porte (Nmap, console) |
zenmap *
|
V:0.2, I:1.3 | 2400 | " " | strumento per mappatura della rete /esplorazione delle porte (GTK+) |
knmap
*
|
V:0.10, I:0.6 | 712 | " " | strumento per mappatura della rete /esplorazione delle porte (KDE) |
tcpdump *
|
V:3, I:24 | 1020 | " " | analizzatore del traffico di rete (Tcpdump, console) |
wireshark *
|
V:1.4, I:9 | 2052 | " " | analizzatore del traffico di rete (Wireshark, GTK+) |
tshark *
|
V:0.4, I:3 | 276 | " " | analizzatore del traffico di rete (console) |
nagios3 *
|
V:1.0, I:1.8 | 32 | " " | sistema di monitoraggio e gestione per host, servizi e reti (Nagios) |
tcptrace *
|
V:0.05, I:0.4 | 436 | " " |
produce un riassunto delle connessioni dall'output di
tcpdump
|
snort
*
|
V:0.6, I:0.8 | 1260 | " " | sistema flessibile di rilevazione delle intrusioni di rete (Snort) |
ntop
*
|
V:1.2, I:2 | 11124 | " " | mostra l'uso della rete nel browser web |
dnsutils *
|
V:14, I:90 | 412 | " " |
client di rete forniti con BIND:
nslookup (8), nsupdate (8),
dig
|
dlint
*
|
V:0.4, I:6 | 96 | " " | controlla l'informazione DNS di zona usando interrogazioni del server di nomi |
dnstracer *
|
V:0.11, I:0.5 | 92 | " " | traccia una catena di server DNS fino alla sorgente |
La scelta del nome di dominio è un punto un po' problematico per gli utenti con normali postazioni di lavoro PC. La postazione di lavoro potrebbe essere una portatile che si sposta nella rete oppure essere posta dietro un firewall NAT e inaccessibile da Internet. Per questo è bene che il nome di dominio non sia un nome valido per evitare collisioni di nomi.
Quando si utilizza un nome di dominio non valido, è necessario falsificare il nome di dominio usato da alcuni programmi, come gli MTA per il loro corretto funzionamento. Vedere Sezione 6.3.3, «La configurazione dell'indirizzo di posta».
In base alla rfc2606, una scelta possibile
per il dominio di più alto livello (TLD,
Top Level Domain) è "invalid
" per creare nomi di
dominio che sicuramente non sono validi per Internet.
Il protocollo di rilevazione della rete mDNS (Apple Bonjour / Apple Rendezvous, Avahi in Debian) usa "local" come pseudo-dominio di più alto livello. Anche Microsoft sembra promuovere "local" come TLD per reti locali.
Se il servizio DNS della propria LAN usa "local
come TLD
per la LAN, potrebbe interferire con mDNS.
Altre scelte popolari per TLD non validi sembrano essere
"localdomain
", "lan
",
"localnet
" o "home
" stando all'analisi
della mia posta in entrata.
La risoluzione del nome host è attualmente supportata dal meccanismo NSS (Name Service Switch). Il flusso di eventi nella risoluzione è il seguente.
/etc/nsswitch.conf
" con blocchi tipo
"hosts: files dns
" detta l'ordine di risoluzione dei nomi
di host. (Questo rimpiazza la vecchia funzionalità del blocco
"order
in "/etc/host.conf
".)
files
è invocato per primo. Se il nome host
viene trovato nel file "/etc/hosts
", vengono restituiti
tutti gli indirizzi validi per esso e il programma termina. (Il file
"/etc/host.conf
" contiene "multi on
".)
dns
. Se il nome host viene
trovato dalla interrogazione al DNS (Internet Domain Name System,
sistema dei nomi di dominio Internet), identificato dal file
"/etc/resolv.conf
", vengono restituiti tutti gli
indirizzi validi per esso e il programma termina.
Il file "/etc/hosts
" associa indirizzi IP con nomi
host e contiene dati simili ai seguenti.
127.0.0.1 localhost 127.0.1.1 <nome_host>.<nome_dominio> <nome_host> # Le righe seguenti sono desiderabili per host con supporto per IPv6 ::1 ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters ff02::3 ip6-allhosts
In questo file <nome_host> corrisponde con il proprio nome host, come
definito in "/etc/hostname
", e <nome_dominio> è il
nome di dominio pienamente
qualificato (FQDN) dell'host.
Per il <nome_dominio> di un PC portatile senza un vero FQDN, si può
scegliere un TLD finto e sicuro come "lan
",
"home
", "invalid
",
"localdomain
", "none
" e
"private
".
Il file "/etc/resolv.conf
" è un file statico se non è
installato il pacchetto resolvconf
. Se invece
quest'ultimo è installato il file è un collegamento simbolico. In ogni caso
contiene le informazioni che inizializzano le routine del risolutore. Se il
DNS si trova all'IP="192.168.11.1
", il file conterrà la
riga seguente.
nameserver 192.168.11.1
Il pacchetto resolvconf
rendo questo file
"/etc/resolv.conf
" un collegamento simbolico e gestisce
il suo contenuto con script eseguiti in automatico.
La risoluzione del nome host con DNS Multicast (usando Zeroconf, ossia Apple Bonjour /Apple
Rendezvous), che permette la risoluzione dei nomi in modo efficace
da parte dei comuni programmi Unix/Linux nel dominio mDNS ad-hoc
"local
", può essere fornita installando il pacchetto
libnss-mdns
. Per abilitare questa funzionalità il file
"/etc/nsswitch.conf
" dovrebbe contenere un blocco come
"hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4
".
Il nome dell'interfaccia di rete, ad esempio eth0
, viene
assegnato a ciascun hardware, quando viene rilevato, nel kernel Linux
attraverso il meccanismo di configurazione in spazio utente
udev
(vedere Sezione 3.5.11, «Il sistema udev»). Il nome
dell'interfaccia di rete è chiamato interfaccia
fisica in ifup
(8) e
interfaces
(5).
Per garantire che ciascuna interfaccia di rete abbia un nome persistente ad
ogni avvio, usando indirizzi MAC ecc.,
esiste un file di memorizzazione:
"/etc/udev/rules.d/70-persistent-net.rules
". Questo file
viene generato automaticamente dal programma
"/lib/udev/write_net_rules
" eseguito probabilmente dal
file "persistent-net-generator.rules
". Lo si può
modificare per cambiare le regole di assegnazione dei nomi.
Quando si modifica il file delle regole
"/etc/udev/rules.d/70-persistent-net.rules
", si deve
mantenere ciascuna regola su una singola riga e l'indirizzo MAC in lettere minuscole. Per esempio,
se si trova in quessto file una voce "Firewire device" e una "PCI device",
probabilmente si vorrà chiamare "PCI device" eth0
e
configurarla come interfaccia di rete primaria.
Ecco un ripasso degli intervalli di indirizzi IPv4 a 32 bit in ciascuna classe, riservati per l'uso in reti locali (LAN) dalla rfc1918. È garantito che questi indirizzi non creino conflitti con altri indirizzi della vera e propria rete Internet.
Tabella 5.2. Elenco di intervalli di indirizzi di rete
Classe | indirizzi di rete | maschera di rete | maschera rete /bit | numero di sottoreti |
---|---|---|---|---|
A | 10.x.x.x | 255.0.0.0 | /8 | 1 |
B | 172.16.x.x — 172.31.x.x | 255.255.0.0 | /16 | 16 |
C | 192.168.0.x — 192.168.255.x | 255.255.255.0 | /24 | 256 |
Se uno di questi indirizzi viene assegnato ad un host, allora l'host non deve accedere ad Internet direttamente, ma deve accedervi attraverso un gateway che agisca da proxy per i singoli servizi o che, in alternativa, faccia da NAT (Network Address Translation, traduzione degli indirizzi di rete). I router a banda larga di solito agiscono da NAT per l'ambiente LAN dell'utente finale.
Nonostante la maggior parte dei dispositivi hardware sia supportata dal sistema Debian, ci sono alcuni dispositivi di rete che necessitano, per essere supportati, di driver esterni non liberi secondo la definizione nelle DFSG. Vedere Sezione 9.7.8, «Driver non liberi per l'hardware».
I sistemi Debian squeeze
possono gestire la connessione
di rete attraverso software per demoni di
gestione come NetworkManager (NM)
(network-manager e pacchetti associati) oppure Wicd (wicd e pacchetti associati).
ifupdown
.
Non usare questi strumenti di configurazione automatica della rete per server. Sono pensati principalmente per utenti con desktop mobili su portatili.
Questi strumenti moderni di configurazione della rete devono essere
configurati in modo corretto per evitare conflitti con il datato pacchetto
ifupdown
e con il suo file di configurazione
"/etc/network/interfaces
".
Alcune funzionalità di questi strumenti automatici di configurazione della
rete possono soffrire dei problemi. Non sono così robusti come il vecchio
pacchetto ifupdown
. Controllare il BTS di network-manager e il BTS di wicd per vedere i problemi e i limiti
attuali.
La documentazione ufficiale per NM e Wicd su Debian è fornita
rispettivamente in
"/usr/share/doc/network-manager/README.Debian
" e
"/usr/share/doc/wicd/README.Debian
".
Fondamentalmente, la configurazione di rete per il desktop viene fatta nel modo seguente.
Aggiungere l'utente desktop, ad esempio pippo
, al gruppo
"netdev
" con il comando seguente. (In alternativa farlo
automaticamente attraverso D-bus nei moderni
ambienti desktop come GNOME e KDE).
$ sudo adduser pippo netdev
Mantenere la configurazione di "/etc/network/interfaces
"
semplice come la seguente.
auto lo iface lo inet loopback
Riavviare NM o Wicd con il comando seguente.
$ sudo /etc/init.d/network-manager restart
$ sudo /etc/init.d/wicd restart
Solo le interfacce che non sono elencate
in "/etc/network/interfaces
" o che sono state configurate
con "auto …
" o "allow-hotplug …
" e
"iface … inet dhcp
" (e con nessuna altra opzione) sono
gestite da NM, per evitare conflitti con ifupdown
.
Se si desirano estendere le capacità di configurazione della rete di NM,
cercare i moduli plugin appropriati e i pacchetti supplementari, quali
network-manager-openconnect
,
network-manager-openvpn-gnome
,
network-manager-pptp-gnome
,
mobile-broadband-provider-info
,
gnome-bluetooth
, ecc. Lo stesso vale per quelli di Wicd.
Questi strumenti di configurazione automatica della rete possono non essere
compatibili con alcune configurazioni esotiche del datato
ifupdown
contenute in
"/etc/network/interfaces
", come quelle in Sezione 5.5, «Configurazione base della rete con ifupdown (metodo vecchio)» e Sezione 5.6, «Configurazione avanzata della rete con ifupdown (strumento datato)». Per
informazioni sui problemi e le limitazioni attualmente esistenti,
controllare il BTS di
network-manager e il BTS di wicd.
Quando il metodo descritto in Sezione 5.2, «La configurazione moderna della rete per il desktop» non è sufficiente per le proprie necessità, si dovrebbe usare il metodo datato di connessione e configurazione della rete che combina assieme diversi strumenti più semplici.
La connessione di rete in vecchio stile è specifica per ciascun metodo (vedere Sezione 5.4, «Il metodo di connessione alla rete (datato)»).
Esistono 2 tipi di programma per la configurazione a basso livello della rete in Linux (vedere Sezione 5.7.1, «Comandi iproute2»).
ifconfig
(8), …) provengono dal sistema di rete Linux
NET-3. La maggior parte di essi è ora superata.
ip
(8), …) formano l'attuale sistema Linux di rete.
Anche se questi programmi di rete a basso livello sono potenti, sono complicati da usare. Perciò sono stati creati strumenti di configurazione della rete di alto livello.
Il pacchetto ifupdown
è lo standard de facto per una
configurazione di rete di altro livello di questo tipo in Debian. Permette
di attivare la rete semplicemente eseguendo, per esempio, "ifup
eth0
". Il suo file di configurazione è il file
"/etc/network/interfaces
" e i suoi contenuti hanno
tipicamente un aspetto simile al seguente.
auto lo iface lo inet loopback auto eth0 iface eth0 inet dhcp
Il pacchetto resolvconf
è stato creato per fornire al
sistema ifupdown
il supporto per una riconfigurazione
indolore della risoluzione degli indirizzi di rete, riscrivendo
automaticamente il file "/etc/resolv.conf
" di
configurazione del risolutore. Attualmente la maggior parte dei pacchetti di
configurazione della rete in Debian sono modificati per usare il pacchetto
resolvconf
(vedere
"/usr/share/doc/resolvconf/README.Debian
").
Per automatizzare la configurazione dinamica di ambienti di rete come un PC
portatile in una LAN cablata, sono stati creati script di aiuto per il
pacchetto ifupdown
, come ifplugd
,
guessnet
, ifscheme
, ecc. Essi sono
relativamente difficili da usare ma si comportano bene con il sistema
ifupdown
esistente.
Questi sono spiegati in dettaglio con esempi (vedere Sezione 5.5, «Configurazione base della rete con ifupdown (metodo vecchio)» e Sezione 5.6, «Configurazione avanzata della rete con ifupdown (strumento datato)»).
I metodi per testare la connessione descritti in questa sezione sono pensati
per fare prove. Non sono pensati per essere usati direttamente per
connettersi alla rete quotidianamente. È consigliato il loro uso con NM,
Wicd o il pacchetto ifupdown
(vedere Sezione 5.2, «La configurazione moderna della rete per il desktop» e Sezione 5.5, «Configurazione base della rete con ifupdown (metodo vecchio)»).
I metodi di connessione tipici alla rete e i percorsi tipici per la connessione per un PC possono essere schematizzati nel modo seguente.
Tabella 5.3. Elenco dei metodi di connessione alla rete e dei percorsi di connessione
PC | metodo di connessione | percorso di connessione |
---|---|---|
Porta seriale (ppp0 )
|
PPP | ⇔ modem ⇔ POTS ⇔ punto di accesso dial-up ⇔ ISP |
Porta ethernet (eth0 )
|
PPPoE/DHCP/Statico | ⇔ modem BB (banda larga) ⇔ servizio BB ⇔ punto di accesso BB ⇔ ISP |
Porta ethernet (eth0 )
|
DHCP/Statico | ⇔ LAN ⇔ router BB (banda larga) con NAT (traduzione degli indirizzi di rete (⇔ modem BB …) |
Quella che segue è una schematizzazione degli script di configurazione per ciascun metodo di connessione.
Tabella 5.4. Elenco di configurazioni della connessione di rete
metodo di connessione | configurazione | pacchetto(i) backend |
---|---|---|
PPP |
pppconfig per creare chat deterministiche
|
pppconfig , ppp
|
PPP (alternativo) |
wvdialconf per creare chat euristiche
|
ppp , wvdial
|
PPPoE |
pppoeconf per creare chat deterministiche
|
pppoeconf , ppp
|
DHCP |
descritto in "/etc/dhcp3/dhclient.conf "
|
dhcp3-client
|
IP statico (IPv4) |
descritto in "/etc/network/interfaces "
|
net-tools
|
IP statico (IPv6) |
descritto in "/etc/network/interfaces "
|
iproute
|
Gli acronimi per le connessioni di rete hanno il significato seguente.
Tabella 5.5. Elenco di acronimi per le connessioni di rete
acronimo | significato |
---|---|
POTS | Plain Old Telephone Service, il semplice vecchio servizio telefonico |
BB | banda larga |
servizio BB (BB-service) | ad esempio, la linea digitale (DSL), la TV via cavo o fibre ottiche |
modem BB | ad esempio, il modem DSL, il modem via cavo o l'ONT, il terminale di rete ottica |
LAN | rete locale (Local Area Network) |
WAN | rete geografica (Wide Area Network) |
DHCP | Protocollo di Configurazione Dinamica dell'Host |
PPP | protocollo Point-to-Point |
PPPoE | protocollo Point-to-Point via Ethernet |
ISP | Fornitore di servizi Internet (Internet Service Provider) |
I servizi di connessione WAN attraverso la TV via cavo sono generalmente serviti da DHCP o PPPoE. Quelli ADSL e FTTP sono generalmente serviti da PPPoE. Si deve consultare il proprio fornitore di servizi Internet per i requisiti esatti di configurazione della connessione WAN.
Quando un router BB è usato per creare un ambiente LAN domestico, i PC della LAN sono connessi alla WAN attraverso il router BB con NAT (traduzione degli indirizzi di rete). In questi casi alle interfacce di rete dei PC nella LAN sono assegnati dal router BB indirizzi IP statici o DHCP. Il router BB deve essere configurato per connettersi alla WAN seguendo le istruzioni del proprio fornitore di servizi Internet.
Le reti tipiche moderne per le abitazioni e le piccole aziende, cioè le LAN, sono connese alla WAN (Internet) usando un router per banda larga economico. La LAN dietro questo router è di solito servita dal server DHCP (protocollo di configurazione dinamica dell'host) in esecuzione sul router.
Installare semplicemente il pacchetto dhcp3-client
per
Ethernet con DHCP
(protocollo di configurazione dinamica dell'host).
Per Ethernet con IP statico non è necessaria alcuna azione particolare.
Lo script di configurazione pppconfig
imposta la
connessione PPP interattivamente chiedendo
all'utente di selezionare solamente quanto segue.
Tabella 5.6. Elenco dei file di configurazione per la connessione PPP con pppconfig
file | funzione |
---|---|
/etc/ppp/peers/<nome_isp>
|
Il file di configurazione per pppd specifico per il
fornitore di servizi <nome_isp>, generato da
pppconfig
|
/etc/chatscripts/<nome_isp>
|
Il file di configurazione per chat specifico per il
fornitore di servizi <nome_isp>, generato da
pppconfig
|
/etc/ppp/options
|
I parametri generici di esecuzione per ppd
|
/etc/ppp/pap-secret
|
Dati di autenticazione per PAP (rischio per la sicurezza) |
/etc/ppp/chap-secret
|
Dati di autenticazione per PAP (più sicuri) |
Se i comandi pon
e poff
vengono
invocati senza argomenti, "<nome_isp>" viene impostato a
"provider
".
Si può testare la configurazione usando strumenti di configurazione di rete a basso livello come nel modo seguente.
$ sudo pon <nome_isp> ... $ sudo poff <nome_isp>
Vedere "/usr/share/doc/ppp/README.Debian.gz
".
Un approccio diverso all'uso di pppd
(8) è la sua
esecuzione tramite wvdial
(1) che è fornito nel pacchetto
"wvdial
. Invece di essere pppd
ad
eseguire chat
(8) per comporre il numero e negoziare la
connessione, è wvdial
che fa queste cose e poi avvia
pppd
per tutto il resto.
Lo script di configurazione wvdialconf
imposta la
connessione PPP interattivamente chiedendo all'utente di selezionare
solamente quanto segue.
Nella maggior parte dei casi wvdial
crea la connessione
con successo e mantiene automaticamente un elenco dei dati di
autenticazione.
Tabella 5.7. Elenco dei file di configurazione per la connessione PPP con wvdialconf
file | funzione |
---|---|
/etc/ppp/peers/wvdial
|
Il file di configurazione per pppd specifico per
wvdial , generato da wvdialconf
|
/etc/wvdial.conf
|
Il file di configurazione creato da wvdialconf
|
/etc/ppp/options
|
I parametri generici di esecuzione per ppd
|
/etc/ppp/pap-secret
|
Dati di autenticazione per PAP (rischio per la sicurezza) |
/etc/ppp/chap-secret
|
Dati di autenticazione per PAP (più sicuri) |
Si può testare la configurazione usando strumenti di configurazione di rete a basso livello come nel modo seguente.
$ sudo wvdial ... $ sudo killall wvdial
Vedere wvdial
(1) e wvdial.conf
(5).
Quando il fornitore di servizi Internet dà una connessione PPPoE e si decide
di connettere il proprio PC direttamente alla WAN, la rete del proprio PC
deve essere configurata con PPPoE. PPPoE sta per "PPP over Ethernet" (PPP
via Ethernet). Lo script di configurazione pppoeconf
configura la connessione PPPoE in modo interattivo.
I file di configurazione sono i seguenti.
Tabella 5.8. Elenco dei file di configurazione per la connessione PPPoE con pppoeconf
file | funzione |
---|---|
/etc/ppp/peers/dsl-provider
|
Il file di configurazione per pppd specifico per
pppoe , generato da pppoeconf
|
/etc/ppp/options
|
I parametri generici di esecuzione per ppd
|
/etc/ppp/pap-secret
|
Dati di autenticazione per PAP (rischio per la sicurezza) |
/etc/ppp/chap-secret
|
Dati di autenticazione per PAP (più sicuri) |
Si può testare la configurazione usando strumenti di configurazione di rete a basso livello come nel modo seguente.
$ sudo /sbin/ifconfig eth0 up $ sudo pon dsl-provider ... $ sudo poff dsl-provider $ sudo /sbin/ifconfig eth0 down
Vedere "/usr/share/doc/pppoeconf/README.Debian
".
La configurazione tradizionale della rete
TCP/IP in un sistema Debian usa il pacchetto
ifupdown
come strumento ad alto livello. Ci sono 2 casi
tipici.
resolvconf
che
permette di cambiare facilmente la configurazione di rete (vedere Sezione 5.5.4, «Interfaccia di rete servita da DHCP»).
resolvconf
e
mantere semplice il proprio sistema (vedere Sezione 5.5.5, «Interfaccia di rete con IP statico»).
Questi metodi di impostazione tradizionali sono piuttosto utili se si desidera impostare una configurazione avanzata (vedere Sezione 5.5, «Configurazione base della rete con ifupdown (metodo vecchio)»).
Il pacchetto ifupdown
fornisce l'infrastruttura standard
per la configurazione di rete di alto livello nel sistema Debian. In questa
sezione viene descritta la configurazione base della rete con
ifupdown
con un'introduzione semplificata e molti esempi
tipici.
Il pacchetto ifupdown
contiene 2 comandi:
ifup
(8) e ifdown
(8). Offrono una
configurazione della rete di alto livello in base al file di configurazione
"/etc/network/interfaces".
Tabella 5.9. Elenco di comandi base per la configurazione della rete con ifupdown
comando | azione |
---|---|
ifup eth0
|
attiva una interfaccia di rete eth0 con la configurazione
di eth0 se esiste un blocco "iface
eth0 "
|
ifdown eth0
|
disattiva una interfaccia di rete eth0 con la
configurazione di eth0 se esiste un blocco
"iface eth0 "
|
Non usare strumenti di configurazione a basso livello, come i comandi
ifconfig
(8) e ip
(8), per configurare
un'interfaccia nello stato attivo (up).
Non esiste un comando ifupdown
.
La sintassi di base di "/etc/network/interfaces
", come
spiegato in interfaces
(5), può essere riassunta nel modo
seguente.
Tabella 5.10. Elenco dei blocchi in "/etc/network/interfaces
"
blocco | significato |
---|---|
"auto <nome_interfaccia> "
|
attiva l'interfaccia <nome_interfaccia> all'avvio del sistema |
"allow-auto <nome_interfaccia> "
|
" " |
"allow-hotplug <nome_interfaccia> "
|
attiva l'interfaccia <nome_interfaccia> quando il kernel rileva un evento hotplug dall'interfaccia |
Le righe che iniziano con "iface <nome_config> … "
|
definiscono la condigurazione di rete <nome_config> |
Le righe che iniziano con "mapping <glob_nome_interfaccia>
"
|
definiscono i valori di mappatura di <nome_config> al corrispondente <nome_interfaccia> |
Le righe che iniziano con un carattere cancelletto "# "
|
sono commenti e vengono ignorate (i commenti di fine riga non sono supportati) |
Le righe che terminano con una barra rovesciata "\ "
|
estendono la configurazione alla riga seguente |
Le righe con un blocco iface
hanno la sintassi
seguente.
iface <nome_config> <famiglia_indirizzi> <nome_metodo> <opzione1> <valore1> <opzione2> <valore2> ...
Per la configurazione di base non vengono usati i blocchi mapping
ma viene usato il nome
dell'interfaccia di rete come nome della configurazione di rete (vedere
Sezione 5.6.5, «Il blocco di mappatura "mapping"»).
Non creare definizioni duplicate per un blocco "iface
"
per un'interfaccia di rete in "/etc/network/interfaces
".
La voce di configurazione seguente, nel file
"/etc/network/interfaces
" attiva l'interfaccia di rete
loopback, lo
, all'avvio del sistema (attraverso il blocco
auto
).
auto lo iface lo inet loopback
Questo blocco esiste sempre nel file
"/etc/network/interfaces
".
Dopo aver preparato il sistema con Sezione 5.4.1, «Connessione DHCP con Ethernet», l'interfaccia di rete
con DHCP viene configurata creando una voce di configurazione nel file
"/etc/network/interfaces
" nel modo seguente.
allow-hotplug eth0 iface eth0 inet dhcp hostname "miamacchina"
Quando il kernel Linux rileva l'interfaccia fisica eth0
,
il blocco allow-hotplug
fa sì che
ifup
attivi l'interfaccia e il blocco iface
fa sì che
ifup
usi DHCP per configurare l'interfaccia.
L'interfaccia di rete con IP statico viene configurata creando una voce di
configurazione nel file "/etc/network/interfaces
" nel
modo seguente.
allow-hotplug eth0 iface eth0 inet static address 192.168.11.100 netmask 255.255.255.0 broadcast 192.168.11.255 gateway 192.168.11.1 dns-domain lan dns-nameservers 192.168.11.1
Quando il kernel Linux rileva l'interfaccia fisica eth0
,
il blocco allow-hotplug
fa sì che
ifup
attivi l'interfaccia e il blocco iface
fa sì che
ifup
usi l'IP statico per configurare l'interfaccia.
In questo esempio sono stati dati per veri i seguenti dati.
192.168.11.0
-
192.168.11.255
192.168.11.1
192.168.11.100
resolvconf
è installato.
lan
"
192.168.11.1
Quando il pacchetto resolvconf
non è installato, la
configurazione relativa al DNS deve essere fatta manualmente modificando
"/etc/resolv.conf
" nel modo seguente.
nameserver 192.168.11.1 domain lan
L'indirizzo IP usato nell'esempio soprastante non deve essere copiato pari pari. È necessario mettere i numeri IP della reale configurazione della propria rete.
La LAN wireless (in breve WLAN) fornisce connettività veloce wireless attraverso comunicazioni con espansione di spettro in bande radio senza licenza basate sull'insieme di standard chiamato IEEE 802.11.
Le interfacce WLAN sono quasi come normali interfacce Ethernet, ma
richiedono alcuni dati sull'identità della rete e sulla chiave di cifratura
per essere usate una volta inizializzate. Gli strumenti di rete di alto
livello per esse sono esattamente gli stessi delle interfacce di rete,
tranne che i nomi delle interfacce sono un po' diversi come
eth1
, wlan0
, ath0
,
wifi0
, … a seconda dei driver del kernel utilizzati.
Il device wmaster0
è il device master che è un device
interno usato solamente da SoftMAC con la
nuova API mac80211 di Linux.
Quelle che seguono sono alcune parole chiave relative alla WLAN che è bene ricordare.
Tabella 5.11. Elenco di acronimi per WLAN
acronimo | forma estesa | significato |
---|---|---|
NWID | Network ID (ID di rete) | identificativo di rete a 16 bit usato da reti WaveLAN pre-802.11 (molto deprecato) |
(E)SSID | (Extended) Service Set Identifier (Identificativo di insieme di servizi (esteso)) | il nome di rete dei punti di accesso wireless (Wireless Access Points, AP) interconnessi a formare una LAN wireless 802.11; identificativo del dominio |
WEP, (WEP2) | Wired Equivalent Privacy (Privacy equivalente alla cablata) | standard di cifratura per wireless a 64 bit (128 bit) di prima generazione con chiave a 40-bit (deprecato) |
WPA | Wi-Fi Protected Access (Accesso Wi-Fi protetto) | standard di cifratura per wireless di seconda generazione (maggior parte del 802.11i), compatibile con WEP |
WPA2 | Wi-Fi Protected Access 2 (Accesso Wi-Fi protetto 2) | standard di cifratura per wireless di terza generazione (tutto il 802.11i), non compatibile con WEP |
Di fatto la scelta del protocollo è di solito limitata dal router wireless che si possiede.
È necessario installare il pacchetto wpasupplicant
per
supportare la WLAN con i nuovi WPA/WPA2.
In caso di IP DHCP per la connessione WLAN, la
voce nel file "/etc/network/interfaces
" dovrebbe essere
come la seguente.
allow-hotplug ath0 iface ath0 inet dhcp wpa-ssid zonacasa # la chiave di cifratura, psk, esadecimale e' codificata da una passphrase in puro testo wpa-psk 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f
Vedere "/usr/share/doc/wpasupplicant/README.modes.gz
".
È necessario installare il pacchetto wireless-tools
per
supportare la rete WLAN con il vecchio WEP. (Il proprio router economico
potrebbe usare ancora questa infrastruttura non sicura, ma è meglio di
niente.)
Notare che il traffico di rete in una WLAN con WEP può essere spiato da altri.
In caso di IP DHCP per la connessione WLAN, la
voce nel file "/etc/network/interfaces
" dovrebbe essere
come la seguente.
allow-hotplug eth0 iface eth0 inet dhcp wireless-essid Casa wireless-key1 0123-4567-89ab-cdef wireless-key2 12345678 wireless-key3 s:password wireless-defaultkey 2 wireless-keymode open
Vedere "/usr/share/doc/wireless-tools/README.Debian
".
È necessario come prima cosa configurare la connessione PPP come descritto
in precedenza (vedere Sezione 5.4.3, «Connessione PPP con pppconfig»). Quindi aggiungere nel file
"/etc/network/interfaces
" la voce per il device PPP
primario ppp0
nel modo seguente.
iface ppp0 inet ppp provider <nome_isp>
È necessario come prima cosa configurare la connessione PPP alternativa con
wvdial
, come descritto in precedenza (vedere Sezione 5.4.4, «Connessione PPP alternativa con wvdialconf»). Quindi
aggiungere nel file "/etc/network/interfaces
" la voce per
il device PPP primario ppp0
nel modo seguente.
iface ppp0 inet wvdial
Per i PC connessi direttamente alla WAN con servizio PPPoE, è necessario
configurare il sistema con la connessione PPPoE come descritto in precedenza
(vedere Sezione 5.4.5, «Connessione PPPoE con pppoeconf»). Quindi
aggiungere nel file "/etc/network/interfaces
" la voce per
il device PPPoE primario eth0
nel modo seguente.
allow-hotplug eth0 iface eth0 inet manual pre-up /sbin/ifconfig eth0 up up ifup ppp0=dsl down ifdown ppp0=dsl post-down /sbin/ifconfig eth0 down # Quello che segue e' usato solo internamente iface dsl inet ppp provider dsl-provider
Il file "/etc/network/run/ifstate
" memorizza gli stati
previsti di configurazione della rete per
tutte le interfacce di rete attualmente attive gestite dal
pacchettoifupdown
. Sfortunatamente, anche se il tentativo
del sistema ifupdown
di attivare un'interfaccia come
previsto fallisce, il file "/etc/network/run/ifstate
" la
elenca come attiva.
Se l'output del comando ifconfig
(8) per un'interfaccia
non ha una riga come quella dell'esempio seguente, l'interfaccia non può
essere usata come parte di una rete IPV4.
inet addr:192.168.11.2 Bcast:192.168.11.255 Mask:255.255.255.0
Per i dispositivi Ethernet connessi con PPPoE, l'output di
ifconfig
(8) manca di una riga come quella dell'esempio
precedente.
Quando si cerca di riconfigurare un'interfaccia, ad esempio
eth0
, per prima cosa è necessario disattivarla con il
comando "sudo ifdown
eth0
". Questo rimuove la voce corrispondente ad
eth0
dal file
"/etc/network/run/ifstate
". (Potrebbero essere generati
messaggi di errore se eth0
non è attiva o se non era
stata configurata in modo conrretto.) Per il momento, fare questa azione per
una postazione di lavoro per singolo utente sembra sicuro in qualunque
momento.
Si può ora modificare liberamente il contenuto di
"/etc/network/interfaces
" in base alle proprie necessità
per riconfigurare l'interfaccia di rete eth0
.
In seguito si può riattivare eth0
con il comando
"sudo ifup eth0
".
Si può (re)inizializzare l'interfaccia di rete semplicemente usando
"sudo ifdown eth0;sudo ifup
eth0
".
Il pacchetto ifupdown-extra
fornisce facili testi della
connessione di rete per l'uso con il pacchetto ifupdown
.
network-test
(1) può essere usato dalla shell.
ifup
.
Il comando network-test
libera l'utente dal faticoso
compito di eseguire comandi a basso livello per analizzare i problemi di
rete.
Gli script automtici vengono installati in
"/etc/network/*/
" e effettuano le azioni seguenti.
/etc/network/routes
"
/var/log/syslog
"
Queste voci nel syslog sono piuttosto utili per l'amministrazione di problemi di rete nel sistema remoto.
Il comportamento automatico del pacchetto ifupdown-extra
è configurabile con "/etc/default/network-test
". Alcuni
di questi controlli automatici rallentano un po' il sistema all'avvio dato
che è necessario un po' di tempo per restare in ascolto per le risposte
ARP.
Le funzionalità del pacchetto ifupdown
possono essere
migliorate andando oltre quanto è stato descritto in Sezione 5.5, «Configurazione base della rete con ifupdown (metodo vecchio)», con
qualche informazione più avanzata.
Le funzionalità descritte in questa sezione sono completamente opzionali. Essendo io pigro e minimalista, raramente faccio lo sforzo di usarle.
Se non si è riusciti a configurare la connessione di rete usando le informazioni in Sezione 5.5, «Configurazione base della rete con ifupdown (metodo vecchio)», cercare una soluzione nelle informazioni che seguono non farà che peggiorare le cose.
Il pacchetto ifplugd
è un vecchio strumento di
configurazione della rete che può gestire soltanto connessioni
Ethernet. Risolve problemi di cavi Ethernet sconnessi/ricconessi per PC
portatili, ecc. Se è installato NetworkManager o Wicd (vedere Sezione 5.2, «La configurazione moderna della rete per il desktop»), questo pacchetto
non è necessario.
Questo pacchetto viene eseguito come demone e
rimpiazza le funzionalità auto o
allow-hotplug (vedere Tabella 5.10, «Elenco dei blocchi in "/etc/network/interfaces
"») ed abilita le interfacce quando queste
vengono connesse alla rete.
Ecco come usare il pacchetto ifplugd
per la porta
Ethernet interna, ad esempio eth0
.
auto eth0
" o "allow-hotplug
eth0
" dal file "/etc/network/interfaces
".
iface eth0 inet …
" e
"mapping …
" nel file
"/etc/network/interfaces
".
ifplugd
.
sudo dpkg-reconfigure ifplugd
".
eth0
come "interfaccia statica che ifplugd deve
osservare".
Ora, dopo la riconfigurazione, la rete funziona come voluto.
All'avvio o al rilevamento dell'hardware, l'interfaccia non viene attivata da sé stessa.
Gli argomenti del comando ifplugd
(8) possono impostare il
suo comportamento, come il ritardo nella riconfigurazione delle interfacce.
Il pacchetto ifmetric
permette di manipolare la metrica
di instradamenti a posteriori, anche per DHCP.
Le azioni seguenti impostano l'interfaccia eth0
come
preferita rispetto alla interfaccia wlan0
.
ifmetric
.
metric 0
"
immediatamente sotto alla riga "iface eth0 inet dhcp
".
metric 1
"
immediatamente sotto alla riga "iface wlan0 inet dhcp
".
"metric 0" significa instradamento con la più alta priorità ed è quello
predefinito. Un valore di metrica più alto indica instradamenti con priorità
più bassa. L'indirizzo IP dell'interfaccia attiva con il valore di metrica
più basso diventa quello di origine. Vedere ifmetric
(8).
Una singola interfaccia fisica Ethernet può essere configurata come interfacce virtuali multiple con indirizzi IP differenti. Di solito ciò ha lo scopo di connettere un'interfaccia a diverse sottoreti di IP. Per esempio, un'applicazione di questo tipo è l'hosting web virtuale basato su indirizzi IP con una singola interfaccia di rete.
Per esempio, si supponga quanto segue.
192.168.0.x/24
.
eth0
.
192.168.0.1
con l'interfaccia virtuale
eth0:0
per la LAN.
I blocchi seguenti in " /etc/network/interfaces
"
configurano la rete.
iface eth0 inet dhcp metric 0 iface eth0:0 inet static address 192.168.0.1 netmask 255.255.255.0 network 192.168.0.0 broadcast 192.168.0.255 metric 1
Anche se questo esempio di configurazione con traduzione degli indirizzi di rete (NAT) usando netfilter/iptables (vedere Sezione 5.9, «Infrastruttura netfilter») può fornire un router a basso prezzo per la LAN usando una sola interfaccia, non c'è alcuna reale funzionalità di firewall con una configurazione di questo tipo. Si dovrebbero usare 2 interfacce fisiche con NAT per rendere sicura la rete locale rispetto ad Internet.
Il pacchetto ifupdown
offre funzionalità di
configurazione avanzata della rete usando il nome di configurazione della rete e il nome dell'interfaccia di rete. Viene qui usata una
terminologia leggermente diversa da quella usata in
ifup
(8) e interfaces
(5).
Tabella 5.12. Elenco della terminologia per i device di rete
terminologia delle pagine man | terminologia di questo documento | esempi nel testo seguente | descrizione |
---|---|---|---|
nome dell'interfaccia fisica | nome dell'interfaccia di rete |
lo , eth0 ,
<nome_interfaccia>
|
nome dato dal kernel Linux (usando il meccanismo udev )
|
nome dell'interfaccia logica | nome della configurazione di rete |
config1 , config2 ,
<nome_config>
|
elemento indicante il nome che segue la parola iface nel file
"/etc/network/interfaces "
|
I comandi base per la configurazione della rete descritti in Sezione 5.5.1, «Sintassi di base dei comandi» richiedono che, nel file
"/etc/network/interfaces
", il nome della configurazione di rete indicato nel blocco
iface
corrisponda al
nome dell'interfaccia di rete.
I comandi avanzati per la configurazione della rete permettono, nel file
"/etc/network/interfaces
", la distinzione tra il nome
della configurazione di rete e della
interfaccia di rete
Tabella 5.13. Elenco di comandi avanzati per la configurazione della rete con ifupdown
comando | azione |
---|---|
ifup eth0=config1
|
attiva una interfaccia di rete eth0 con la configurazione
config1
|
ifdown eth0=config1
|
disattiva una interfaccia di rete eth0 con la
configurazione config1
|
ifup eth0
|
attiva una interfaccia di rete eth0 con la configurazione
scelta dal blocco di mappatura mapping
|
ifdown eth0
|
disattiva una interfaccia di rete eth0 con la
configurazione scelta dal blocco di mappatura mapping
|
Nella sezione Sezione 5.5.2, «Sintassi di base di "/etc/network/interfaces"»
è stata saltata la spiegazione del blocco mapping
nel file
"/etc/network/interfaces
", per evitare
complicazioni. Questo blocco ha la sintassi seguente.
mapping <glob_nome_interfaccia> script <nome_script> map <script_input1> map <script_input2> map ...
Ciò fornisce funzionalità avanzate al file
"/etc/network/interfaces
" automatizzando la scelta della
configurazione con lo script di mappatura specificato da
<nome_script>
.
Ecco cosa succede quando viene eseguito il comando seguente.
$ sudo ifup eth0
Quando il "<glob_nome_interfaccia>
trova
corrispondenza con "eth0
", l'esecuzione di questo comando
produce, per configurare automaticamente eth0
,
l'invocazione del comando seguente.
$ sudo ifup eth0=$(echo -e '<script_input1> \n <script_input2> \n ...' | <nome_script> eth0)
Le righe, per l'input dello script, che iniziano con
"map
" sono opzionali e possono essere ripetute.
L'espressione glob per il blocco mapping
funziona come i
metacaratteri dei glob per nomi di file della shell (vedere Sezione 1.5.6, «Glob sella shell»).
Quella che segue è una descrizione di come commutare manualmente tra diverse
configurazioni di rete senza dover riscrivere il file
"/etc/network/interfaces
" come in Sezione 5.5.13, «Riconfigurazione base della rete».
Per tutte le configurazioni di rete alle quali si deve accedere è
sufficiente creare un solo file "/etc/network/interfaces
"
come quello seguente.
auto lo iface lo inet loopback iface config1 inet dhcp hostname "miamacchina" iface config2 inet static address 192.168.11.100 netmask 255.255.255.0 broadcast 192.168.11.255 gateway 192.168.11.1 dns-domain lan dns-nameservers 192.168.11.1 iface pppoe inet manual pre-up /sbin/ifconfig eth0 up up ifup ppp0=dsl down ifdown ppp0=dsl post-down /sbin/ifconfig eth0 down # Quello che segue e' usato solo internamente iface dsl inet ppp provider dsl-provider iface pots inet ppp provider provider
Notare che il nome di configurazione della
rete, che è l'elemento che viene dopo iface
, non usa il nome dell'interfaccia di rete. Inoltre non ci sono
blocchi auto
, né
allow-hotplug
per
attivare l'interfaccia di rete eth0
automaticamente in
base ad eventi.
Ora tutto è pronto per commutare tra le configurazioni di rete.
Spostare il PC in una LAN con DHCP. L'interfaccia di
rete (l'interfaccia fisica) eth0
viene
attivata assegnandole il nome di configurazione
della rete (il nome dell'interfaccia logica)
config1
nel modo seguente.
$ sudo ifup eth0=config1 Password: ...
L'interfaccia eth0
è attiva, configurata con DHCP e
connessa alla LAN.
$ sudo ifdown eth0=config1 ...
L'interfaccia di rete eth0
è disattivata e disconnessa
dalla LAN.
Spostare il PC in una LAN con IP statico. L'interfaccia di rete eth0
viene
attivata assegnandole il nome di configurazione
della rete config2
nel modo seguente.
$ sudo ifup eth0=config2 ...
L'interfaccia eth0
è attiva, configurata con IP statico e
connessa alla LAN. I parametri aggiuntivi dns-*
forniti
configurano il contenuto di "/etc/resolv.conf
". Tale file
"/etc/resolv.conf
" viene gestito meglio se è installato
il pacchetto resolvconf
.
$ sudo ifdown eth0=config2 ...
L'interfaccia di rete eth0
è di nuovo disattivata e
disconnessa dalla LAN.
Spostare il PC su una porta di un modem per banda larga connesso ad un
servizio PPPoE. L'interfaccia di rete
eth0
viene attivata assegnandole il nome di configurazione della rete pppoe
nel modo seguente.
$ sudo ifup eth0=pppoe ...
L'interfaccia eth0
è attiva, configurata per la
connessione PPPoE diretta con il fornitore di servizi Internet.
$ sudo ifdown eth0=pppoe ...
L'interfaccia di rete eth0
è di nuovo disattivata e
disconnessa.
Spostare il PC in una postazione senza LAN o modem per banda larga, ma con
una linea telefonica ed un modem. L'interfaccia di
rete ppp0
viene attivata assegnandole il nome
di configurazione della rete
pots
nel modo seguente.
$ sudo ifup ppp0=pots ...
L'interfaccia ppp0
è attiva e connessa ad Internet con
PPP.
$ sudo ifdown ppp0=pots ...
L'interfaccia di rete ppp0
è disattivata e disconnessa da
Internet.
Si dovrebbe controllare nel file
"/etc/network/run/ifstate
" lo stato attuale della
configurazione di rete del sistema ifupdown
.
Potrebbe essere necessario cambiare i numeri alla fine di
eth*
, ppp*
, ecc., se si ha più di
un'interfaccia di rete.
Il sistema ifupdown
esegue automaticamente gli script
installati in "/etc/network/*/
" esportando le variabili
d'ambiente negli script.
Tabella 5.14. Elenco delle variabili d'ambiente passate da sistema ifupdown
variabile d'ambiente | valore passato |
---|---|
"$IFACE "
|
nome fisico (nome dell'interfaccia) dell'interfaccia in fase di elaborazione |
"$LOGICAL "
|
nome logico (nome dell'interfaccia) dell'interfaccia in fase di elaborazione |
"$ADDRFAM "
|
<famiglia_indirizzi> dell'interfaccia |
"$METHOD "
|
<nome_metodo> dell'interfaccia (es., "static") |
"$MODE "
|
"start" se invocato da ifup , "stop" se invocato da
ifdown
|
"$PHASE "
|
come per "$MODE ", ma in modo più dettagliato,
distinguendo le fasi pre-up , post-up ,
pre-down e post-down
|
"$VERBOSITY "
|
indica se è stato usato "--verbose "; se lo è stato viene
impostata a 1, altrimenti a 0
|
"$PATH "
|
percorso di ricerca dei comandi:
"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin "
|
"$IF_<OPZIONE> "
|
valore della opzione corrispondente all'interno del blocco iface
|
In questo caso, ciascuna variabile d'ambiente di tipo
"$IF_<OPZIONE>
" viene creata a partire dal nome
dell'opzione corrispondente, come <opzione1> e <opzione2>,
preceduto da "$IF_
" e convertendo tutte le lettere in
maiuscolo, sostituendo i caratteri di sottolineatura con trattini e
scartando i caratteri non alfanumerici.
Vedere Sezione 5.5.2, «Sintassi di base di "/etc/network/interfaces"» per <famiglia_indirizzi>, <nome_metodo>, <opzione1> e <opzione2>.
Il pacchetto ifupdown-extra
(vedere Sezione 5.5.14, «Pacchetto ifupdown-extra») usa queste variabili d'ambiente per
estendere la funzionalità del pacchetto ifupdown
. Il
pacchetto ifmetric
(vedere Sezione 5.6.2, «Il pacchetto ifmetric») installa lo script
"/etc/network/if-up.d/ifmetric
" che imposta la metrica
attraverso la variabile "$IF_METRIC
". Anche il pacchetto
guessnet
(vedere Sezione 5.6.8, «Mappatura con guessnet»), che fornisce un'infrastruttura semplice
e potente per la selezione automatica della configurazione di rete tramite
il meccanismo di mappatura , usa queste variabili.
Per esempi più dettagliati di script personalizzati per la configurazione
della rete che usano queste variabili d'ambiente, controllare gli script
d'esempio in "/usr/share/doc/ifupdown/examples/*
" e gli
script usati nei pacchetti ifscheme
e
ifupdown-scripts-zg2
. Questi script addizionali hanno
alcune funzionalità che si sovrappongono in parte a quelle dei pacchetti
base ifupdown-extra
e guessnet
. Se si
installano questi script addizionali, si dovrebbe persanalizzarli in modo da
evitare interferenze.
Invece di scegliere manualmente la configurazione, come descritto in Sezione 5.6.6, «Configurazione della rete commutabile manualmente», si può usare il meccanismo di mappatura descritto in Sezione 5.6.5, «Il blocco di mappatura "mapping"» per selezionare automaticamente la configurazione di rete con script personalizzati.
Il comando guessnet-ifupdown
(8) fornito nel pacchetto
guessnet
è pensato per essere usato come uno script di
mappatura e fornisce un'infrastruttura potente per migliorare il sistema
ifupdown
.
iface
, si elencano delle
condizioni da testare come valore per le opzioni di guessnet
.
iface
che dà come risultato un
non-ERRORE.
Questo doppio uso del file "/etc/network/interfaces
" da
parte dello script di mappatura, guessnet-ifupdown
, e
dell''infrastruttura originale di configurazione della rete,
ifupdown
, non causa impatti negativi dato che le opzioni
guessnet
esportano
solo variabili d'ambiente extra a script eseguiti dal sistema
ifupdown
. Vedere i dettagli in
guessnet-ifupdown
(8).
Quando in "/etc/network/interfaces
è necessaria più di
una riga di opzione guessnet
, usare righe di opzione
che iniziano con guessnet1
, guessnet2
e così via, dato che
il pacchetto ifupdown
non permette ripetizioni della
stringa iniziale delle righe di opzione.
I comandi Iproute2 offrono funzionalità complete di configurazione della rete a basso livello. Quella che segue è una tabella di traduzione dai comandi obsoleti di net-tools ai nuovi comandi iproute2 ecc.
Tabella 5.15. Tabella di traduzione dai comandi obsoleti net-tools
ai
nuovi comandi iproute2
net-tools obsoleti | nuovi iproute2, ecc. | manipolazione |
---|---|---|
ifconfig (8)
|
ip addr
|
indirizzo di protocollo (IP o IPv6) di un device |
route (8)
|
ip route
|
voce nella tabella di instradamento |
arp (8)
|
ip neigh
|
voce nella cache ARP o NDISC |
ipmaddr
|
ip maddr
|
indirizzo multicast |
iptunnel
|
ip tunnel
|
tunnel over IP |
nameif (8)
|
ifrename (8)
|
nomina le interfacce di rete in base all'indirizzo MAC |
mii-tool (8)
|
ethtool (8)
|
impostazioni del device Ethernet |
Vedere ip
(8) e IPROUTE2 Utility Suite Howto.
Si possono usare i comandi a basso livello per la rete seguenti in modo sicuro dato che non cambiano la configurazione della rete.
Tabella 5.16. Elenco di comandi di rete a basso livello
comando | descrizione |
---|---|
ifconfig
|
mostra lo stato del collegamento e l'indirizzo delle interfacce attive |
ip addr show
|
mostra lo stato del collegamento e l'indirizzo delle interfacce attive |
route -n
|
mostra tutta la tabella di instradamento in indirizzi numerici |
ip route show
|
mostra tutta la tabella di instradamento in indirizzi numerici |
arp
|
mostra l'attuale contenuto delle tabelle cache ARP |
ip neigh
|
mostra l'attuale contenuto delle tabelle cache ARP |
plog
|
mostra il registro del demone ppp |
ping yahoo.com
|
controlla la connessione Internet verso "yahoo.com "
|
whois yahoo.com
|
controlla chi ha registrato "yahoo.com " nel database dei
domini
|
traceroute yahoo.com
|
traccia la connessione Internet verso "yahoo.com "
|
tracepath yahoo.com
|
traccia la connessione Internet verso "yahoo.com "
|
mtr yahoo.com
|
traccia la connessione Internet verso "yahoo.com "
(ripetutamente)
|
dig [@dns-server.com] esempio.com [{a|mx|any}]
|
controlla i record DNS di
"esempio.com " con "dns-server.com "
alla ricerca di un record "a ", "mx " o
"any "
|
iptables -L -n
|
controlla il filtraggio dei pacchetti |
netstat -a
|
trova tutte le porte aperte |
netstat -l --inet
|
trova le porte in ascolto |
netstat -ln --tcp
|
trova le porte (numeriche) TCP in ascolto |
dlint esempio.com
|
controlla le informazioni DNS di zona per "esempio.com "
|
Alcuni di questi strumenti di configurazione di basso livello della rete
sono contenuti in "/sbin/
". Potrebbe essere necessario
fornire il percorso completo dei comandi, come
"/sbin/ifconfig
" o aggiungere "/sbin
"
all'elenco in "$PATH
" nel proprio file
"~/.bashrc
".
L'ottimizzazione generale della rete va oltre gli scopi che questo documento si prefigge. Vengono trattati solo quegli argomenti che interessano le connessioni dei computer personali.
Tabella 5.17. Elenco degli strumenti di ottimizzazione della rete
pacchetto | popcon | dimensione | descrizione |
---|---|---|---|
iftop
*
|
V:1.3, I:7 | 72 | mostra informazioni sull'uso della banda su di un'interfaccia di rete |
iperf
*
|
V:0.5, I:3 | 200 | strumento di misurazione della banda del protocollo Internet |
apt-spy *
|
V:0.17, I:1.7 | 204 |
scrive un file "/etc/apt/sources.list " in base a test
sulla banda
|
ifstat *
|
V:0.2, I:1.2 | 88 | Monitoraggio delle STATistiche sulle InterFacce |
bmon
*
|
V:0.2, I:0.9 | 188 | strumento portabile per monitoraggio della banda e stime della velocità |
ethstatus *
|
V:0.10, I:0.7 | 84 | script che misura velocemente la quantità di dati passanti per un device di rete |
bing
*
|
V:0.08, I:0.6 | 96 | tester empirico stocastico della banda |
bwm-ng *
|
V:0.2, I:1.2 | 152 | strumento piccolo e semplice basato sulla console per il monitoraggio della banda |
ethstats *
|
V:0.05, I:0.3 | 52 | strumento basato su console per il monitoraggio delle statistiche Ethernet |
ipfm
*
|
V:0.04, I:0.19 | 156 | strumento di analisi della banda |
Il valore di MTU (Maximum
Transmission Unit, unità massima di trasmissione) può essere
determinato sperimentalmente con ping
(8) usando l'opzione
"-M do
" che invia pacchetti ICMP con una dimensione dei
dati a partire da 1500 (con un offset di 28 byte per l'intestazione IP+ICMP)
e trova la dimensione maggiore che non comporta frammentazione IP.
Per esempio, provare a fare quanto segue.
$ ping -c 1 -s $((1500-28)) -M do www.debian.org PING www.debian.org (194.109.137.218) 1472(1500) bytes of data. From 192.168.11.2 icmp_seq=1 Frag needed and DF set (mtu = 1454) --- www.debian.org ping statistics --- 0 packets transmitted, 0 received, +1 errors
Provare 1454 invece di 1500
Come si può vedere ping
(8) ha avuto successo con 1454.
Questo processo si chiama "Path MTU
(PMTU) discovery (RFC1191) e il
comado tracepath
(8) può automatizzarlo.
L'esempio precedente di PMTU con un valore di 1454 è per il mio precedente fornitore FTTP che usava ATM (Asynchronous Transfer Mode) come rete backbone e forniva ai clienti un servizio PPPoE. Il valore effettivo di PMTU dipende dal proprio ambiente, ad esempio è 1500 per il mio nuovo fornitore FTTP.
Tabella 5.18. Linee guida di base per il valore di MTU ottimale
ambiente di rete | MTU | motivo |
---|---|---|
collegamento dial-up (IP: PPP) | 576 | standard |
collegamento Ethernet (IP: DHCP o statico) | 1500 | standard e predefinito |
collegamento Ethernet (IP: PPPoE) | 1492 (=1500-8) | 2 byte per l'intestazione PPP e 6 byte per l'intestazione PPPoE |
collegamento Ethernet (backbone del fornitore servizi: ATM, IP: DHCP o statico) | 1462 (=48*31-18-8) | ipotesi dell'autore: 18 per l'intestazione Ethernet, 8 per la coda SAR |
collegamento Ethernet (backbone del fornitore servizi: ATM, IP: PPPoE) | 1454 (=48*31-8-18-8) | vedere Configurazione ottimale dell'MTU per connessioni ADSL con PPPoE" per il ragionamento |
In aggiunta a queste linee guida di base si dovrebbe sapere quanto segue.
Quelli che seguono sono alcuni esempi di come impostare il valore di MTU dal suo valore predefinito 1500 a 1454.
Per DHCP (vedere Sezione 5.5.4, «Interfaccia di rete servita da DHCP»), si possono
sostituire le righe pertinenti nei blocchi iface
nel file
"/etc/network/interfaces
" con blocchi come il seguente.
iface eth0 inet dhcp hostname "miamacchina" pre-up /sbin/ifconfig $IFACE mtu 1454
Per IP statico (vedere Sezione 5.5.5, «Interfaccia di rete con IP statico»), si possono
sostituire le righe pertinenti nei blocchi iface
nel file
"/etc/network/interfaces
" con blocchi come il seguente.
iface eth0 inet static address 192.168.11.100 netmask 255.255.255.0 broadcast 192.168.11.255 gateway 192.168.11.1 mtu 1454 dns-domain lan dns-nameservers 192.168.11.1
Per la connessione PPPoE diretta (vedere Sezione 5.4.5, «Connessione PPPoE con pppoeconf», si possono sostituire le
riga "mtu
" pertinente nel file
"/etc/ppp/peers/dsl-provider
" con la seguente.
mtu 1454
Il valore di MSS (Maximum Segment Size, dimensione massima di segmento)MSS è usato come misura alternativa della dimensione dei pacchetti. Le relazioni tra MSS e MTU sono le seguenti.
L'ottimizzazione basata su iptables
(8) (vedere Sezione 5.9, «Infrastruttura netfilter») può bloccare la dimensione dei
pacchetti al valore MSS ed è utile per il router. Vedere "TCPMSS" in
iptables
(8).
Il flusso TCP può essere massimizzato regolando i parametri di dimensione del buffer TCP come descritto in "TCP Tuning Guide" e "TCP tuning" per le moderne WAN a larga banda e alta latenza. Per adesso, le attuali impostazioni predefinite di Debian funzionano bene persino per la mia LAN connessa con un servizio FTTP veloce a 1Gbps.
Netfilter fornisce un'infrastruttura per firewall con stati e traduzione di indirizzi di rete (NAT) con moduli del kernel Linux (vedere Sezione 3.5.12, «L'inizializzazione dei moduli del kernel»).
Tabella 5.19. Elenco di strumenti per firewall
pacchetto | popcon | dimensione | descrizione |
---|---|---|---|
iptables *
|
V:27, I:99 | 1316 | strumenti di amministrazione per netfilter |
iptstate *
|
V:0.14, I:0.9 | 152 |
monitora continuamente lo stato di netfilter (in modo simile a
top (1))
|
shorewall-perl *
|
V:0.15, I:0.5 | 76 | generatore di file di configurazione per netfilter Shoreline Firewall (basato su Perl,
raccomandato per lenny )
|
shorewall-shell *
|
I:1.9 | 76 | generatore di file di configurazione per netfilter Shoreline Firewall (basato su shell,
alternativa per lenny )
|
Il principale programma in spazio utente di netfilter è iptables
(8). Si può
configurare manualmente netfilter in modo
interattivo dalla shell, salvare il suo stato con
iptables-save
(8) e ripristinarlo attraverso uno script di
init con iptables-restore
(8) al riavvio del sistema.
Script di aiuto per la configurazione come shorewall facilitano questo processo.
Vedere la documentazione all'indirizzo http://www.netfilter.org/documentation/
(o in "/usr/share/doc/iptables/html/
").
Anche se questi documenti sono stati scritti per Linux 2.4, sia il comando iptables
(8)
sia la funzione netfilter del kernel sono validi per l'attuale Linux
2.6.
Dopo aver stabilito la connessione di rete (vedere Capitolo 5, Impostazione della rete), si possono eseguire svariate applicazioni per la rete.
Ci sono molti pacchetti per browser web per accedere a contenuti remoti tramite HTTP (Hypertext Transfer Protocol).
Tabella 6.1. Elenco di browser web
pacchetto | popcon | dimensione | tipo | descrizione del browser web |
---|---|---|---|---|
iceweasel *
|
V:30, I:48 | 3761 | per X | Mozilla Firefox senza marchi |
iceape-browser *
|
V:1.4, I:2 | 35686 | " " | Mozilla senza marchi rimosso a causa di problemi con la sicurezza: bug#505565 |
epiphany-browser *
|
V:13, I:34 | 1060 | " " | Epiphany, per GNOME, aderente alle HIG |
galeon *
|
V:0.9, I:1.4 | 1776 | " " | Galeon, per GNOME, superato da Epiphany |
konqueror *
|
V:8, I:15 | 3584 | " " | Konqueror, per KDE |
w3m
*
|
V:24, I:84 | 1992 | testuali | w3m |
lynx
*
|
I:22 | 252 | " " | Lynx |
elinks *
|
V:2, I:5 | 1448 | " " | ELinks |
links
*
|
V:3, I:9 | 1380 | " " | Links (solo testo) |
links2 *
|
V:0.7, I:3 | 3288 | grafici | Links (grafica in console senza X) |
Per alcuni browser si può accedere alle loro impostazioni usando le seguenti stringhe URL speciali.
about:
"
about:config
"
about:plugins
"
Debian offre, nell'area main dell'archivio, molti pacchetti liberi con plugin per browser che possono gestire non soltanto Java (piattaforma software) e Flash, ma anche file MPEG, MPEG2, MPEG4, DivX, Windows Media Video (.wmv), QuickTime (.mov), MP3 (.mp3), file Ogg/Vorbis, DVD, VCD, ecc. Debian offre anche, nell'aree contrib o non-free dell'archivio, programmi di aiuto per installare pacchetti con plugin non liberi per il browser.
Tabella 6.2. Elenco di pacchetti con plugin per browser
pacchetto | popcon | dimensione | area | descrizione |
---|---|---|---|---|
icedtea6-plugin *
|
V:0.9, I:1.6 | 272 | main | Plugin Java basato su OpenJDK e IcedTea |
sun-java6-plugin *
|
I:10 | 100 | non-free | Plugin Java per Java SE 6 di Sun (solo per i386) |
mozilla-plugin-gnash *
|
V:0.4, I:4 | 60 | main | Plugin Flash basato su Gnash |
flashplugin-nonfree *
|
V:1.3, I:15 | 132 | contrib | Strumento di aiuto per plugin Flash, per installare Adobe Flash Player (soli i386 e amd64) |
mozilla-plugin-vlc *
|
V:3, I:4 | 128 | main | Plugin multimediale basato sul riproduttore multimediale VLC |
totem-mozilla *
|
V:20, I:34 | 544 | main | Plugin multimediale basato sul riproduttore multimediale Totem di GNOME |
gecko-mediaplayer *
|
V:0.6, I:0.8 | 724 | main | Plugin multimediale basato su MPlayer (GNOME) |
nspluginwrapper *
|
V:1.8, I:3 | 472 | contrib | Wrapper per eseguire plugin Netscape per i386 sull'architettura amd64 |
Benché l'uso dei pacchetti Debian elencati sopra sia molto più facile, è
sempre possibile abilitare i plugin manualmente installando i file "*.so"
nelle directory dei plugin (ad esempio,
"/usr/lib/iceweasel/plugins/
") e riavviando il browser
Alcuni siti web rifiutano la connessione in base alla stringa user-agent del
browser. Si può aggirare questa situazione mimando la stringa
user-agent. Per esempio, può essere fatto aggiungendo nei file di
configurazione, come
"~/.gnome2/epiphany/mozilla/epiphany/user.js
" o
"~/.mozilla/firefox/*.default/user.js
", la riga seguente.
user_pref{"general.useragent.override","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)"};
In alternativa si può aggiungere e reimpostare questa variabile digitando
"about:config
" al posto dell'URL e cliccando con il
pulsante destro sul suo contenuto.
La stringa user-agent falsificata può causare dei brutti effetti collaterali con Java.
Se si desidera impostare il server di posta per scambiare la posta direttamente con Internet, si dovrebbe leggere una documentazione più dettagliata di questo documentazione base.
Gli esempi di configurazione che seguono sono validi solamente per la postazione di lavoro mobile su connessioni Internet di largo consumo.
Per limitare i problemi di spam (posta elettronica indesiderata e non richiesta), molti fornitori di servizi Internet che forniscono connessioni Internet domestiche stanno implementando contromisure.
Queste nuove limitazioni vanno tenute a mente quando si configura il proprio server di posta o si cerca di risolvere problemi di consegna della posta.
Alla luce di queste limitazioni e situazioni ostili in Internet, alcuni fornitori di servizi di posta via Internet indipendenti, come Yahoo.com e Gmail.com, offrono un servizio di posta sicuro a cui ci si può connettere da qualsiasi parte di Internet usando TLS (Transport Layer Security) e il suo predecessore SSL (Secure Sockets Layer).
Avere in esecuzione un server SMTP su una rete ad uso personale per inviare
posta direttamente ad host remoti in modo affidabile non è un'ipotesi
realistica. Si deve usare un qualche servizio smarthost offerto dal proprio
fornitore di servizi Internet o da fornitori di servizi di posta via
Internet indipendenti. Per semplicità, nel testo che segue si assume che lo
smarthost sia alla posizione "smtp.hostname.dom
", che
richieda SMTP AUTH e che usi la porta di
inoltro dei messaggi (587).
La configurazione di posta più semplice possibile è che la posta sia inviata
allo smarthost del fornitore di servizi Internet e ricevuta dal server POP3
del fornitore di servizi dal programma di posta (vedere Sezione 6.4, «Programma di posta (MUA, Mail User Agent)») stesso. Questo tipo di configurazione è
popolare per i programmi di posta completi basati su interfaccia utente
grafica come icedove
(1), evolution
(1),
ecc. Se si necessita di filtrare la posta in base alla sua tipologia, si
usano le funzioni di filtro del programma di posta. In questo caso l'MTA
(vedere Sezione 6.3, «Agente di trasporto della posta (MTA)») locale deve solo fare
la consegna locale della posta.
La configurazione di posta alternativa prevede che la posta sia inviata
attraverso l'MTA locale allo smarthost del fornitore di servizi Internet e
ricevuta dal server POP3 del fornitore di servizi dal programma di recupero
della posta (vedere Sezione 6.5, «L'utilità per il recupero della posta da remoto e l'inoltro») che la mette
nella casella di posta locale. Se si necessita di filtrare la posta in base
alla sua tipologia, si usa un MDA con filtri (vedere Sezione 6.6, «Agente di consegna della posta (MDA, Mail Delivery Agent) con filtri») per smistare la posta in
caselle diverse. Questo tipo di configurazione è popolare con i semplici
programmi di posta basati sulla console come mutt
(1),
gnus
(1), ecc., anche se è possibile con qualsiasi
programma di posta (vedere Sezione 6.4, «Programma di posta (MUA, Mail User Agent)»). In
questo caso l'MTA (vedere Sezione 6.3, «Agente di trasporto della posta (MTA)»)
locale deve fare sia la consegna allo smarthost sia quella locale. Dato che
le postazioni di lavoro mobile non hanno un FQDN valido, è necessario
configurare l'MTA locale in modo che nasconda e falsifichi il vero nome
locale del sistema di posta nei messaggi di posta in uscita per evitare
errori nella consegna della posta (vedere Sezione 6.3.3, «La configurazione dell'indirizzo di posta»).
Si potrebbe voler configurare i MUA e MDA in modo che usino il formato Maildir per archiviare i messaggi di posta elettronica da qualche parte nella propria directory home.
Per le normali postazioni PC, la scelta più comune per il server di posta
(MTA) sono i pacchetti exim4-*
o
postfix
. La scelta spetta all'utente.
Tabella 6.3. Elenco di pacchetti base relativi ai server di trasporto della posta per postazioni PC
pacchetto | popcon | dimensione | descrizione |
---|---|---|---|
exim4-daemon-light *
|
V:60, I:65 | 1104 | agente di trasporto della posta Exim4 (MTA predefinito in Debian) |
exim4-base *
|
V:62, I:68 | 1688 | documentazione (formato testo) e file comuni per Exim4 |
exim4-doc-html *
|
I:0.6 | 3440 | documentazione per Exim4 (in formato HTML) |
exim4-doc-info *
|
I:0.3 | 556 | documentazione per Exim4 (in formato info) |
postfix *
|
V:18, I:20 | 3492 | agente di trasferimento della posta Postfix (MTA alternativo) |
postfix-doc *
|
I:1.9 | 3420 | documentazione per Postfix (formati HTML e testo) |
sasl2-bin *
|
V:2, I:5 | 448 | implementazione dell'API SASL Cyrus (di supporto a Postfix per SMTP AUTH) |
cyrus-sasl2-doc *
|
I:2 | 284 | SASL Cyrus - documentazione |
Anche dal conteggio dei voti popcon exim4-*
sembra
svariate volte più popolare di postfix
, ciò non significa
che postfix
non sia popolare tra gli sviluppatori
Debian. Il sistema server Debian usa sia exim4
sia
postfix
. Anche l'analisi delle intestazioni della posta
sui messaggi delle mailing list, da parte di sviluppatori Debian di spicco,
indica che i due MTA sono ugualmente popolari.
I pacchetti exim4-*
sono conosciuti per il loro consumo
di memoria molto basso e per essere molto flessibili nella
configurazione. Il pacchetto postfix
è conosciuto per
essere compatto, veloce, facile e sicuro. Entrambi sono forniti con un'ampia
documentazione, sono di alta qualità ed hanno una buona licenza.
Nell'archivio Debian ci sono molte scelte per i pacchetti con agenti di trasporto della posta (MTA) con capacità e scopi diversi.
Tabella 6.4. Elenco delle scelte per l'agente di trasporto della posta (MTA) tra i pacchetti dell'archivio Debian
pacchetto | popcon | dimensione | capacità e scopo |
---|---|---|---|
exim4-daemon-light *
|
V:60, I:65 | 1104 | completa |
postfix *
|
V:18, I:20 | 3492 | completa (sicurezza) |
exim4-daemon-heavy *
|
V:1.7, I:1.9 | 1220 | completa (flessibilità) |
sendmail-bin *
|
V:1.9, I:2 | 2052 | completa (solo se si ha già familiarità con esso) |
nullmailer *
|
V:0.7, I:0.8 | 436 | ridotta, niente posta locale |
ssmtp
*
|
V:1.2, I:1.7 | 0 | ridotta, niente posta locale |
courier-mta *
|
V:0.14, I:0.15 | 12316 | molto completa (interfaccia web, ecc.) |
xmail
*
|
V:0.14, I:0.16 | 836 | leggera |
masqmail *
|
V:0.04, I:0.05 | 624 | leggera |
esmtp
*
|
V:0.09, I:0.2 | 172 | leggera |
esmtp-run *
|
V:0.07, I:0.11 | 64 |
leggera (estensioni per la compatibilità con sendmail per
esmtp )
|
msmtp
*
|
V:0.3, I:0.8 | 340 | leggera |
msmtp-mta *
|
V:0.11, I:0.15 | 32 |
leggera (estensioni per la compatibilità con sendmail per
msmtp )
|
Per la posta di Internet attraverso uno smarthost, riconfigurare i pacchetti
exim4-*
nel modo seguente.
$ sudo /etc/init.d/exim4 stop $ sudo dpkg-reconfigure exim4-config
Selezionare "posta inviata tramite «uno smarthost», ricevuta via SMTP o fetchmail" per "Tipo di configurazione del sistema di posta".
Impostare "Mail name del sistema:" al suo valore predefinito come FQDN (vedere Sezione 5.1.2, «Risoluzione dei nomi di host»).
Impostare "indirizzi IP sui quali attendere connessioni SMTP in ingresso:" al suo valore predefinito "127.0.0.1 ; ::1".
Svuotare il contenuto di "Altre destinazioni per conto delle quali accettare posta:".
Svuotare il contenuto di "Sistemi per i quali fare il "relay":".
Impostare l'"Indirizzo IP o nome host dello smarthost per la posta in uscita:" a "smtp.hostname.dom:587".
Selezionare "<No>" per "Omettere il mail name locale dai messaggi in
uscita?". (Usare invece "/etc/email-addresses
" come in
Sezione 6.3.3, «La configurazione dell'indirizzo di posta».)
Rispondere a "Mantenere al minimo il numero di richieste DNS (Dial-on-Demand)?" in uno dei modi seguenti.
Impostare "Modalità di consegna per la posta locale:" a "Formato mbox in /var/mail/".
Selezionare "<Sì>" per "Dividere la configurazione in molti piccoli file?:".
Creare voci per la password dello smarthost modificando il file
"/etc/exim4/passwd.client
".
$ sudo vim /etc/exim4/passwd.client ... $ cat /etc/exim4/passwd.client ^smtp.*\.hostname\.dom:nomeutente@hostname.dom:password
Avviare exim4
con il comando seguente.
$ sudo /etc/init.d/exim4 start
Il nome host in "/etc/exim4/passwd.client
" non dovrebbe
essere l'alias. Si può controllare il vero nome host nel modo seguente.
$ host smtp.hostname.dom smtp.hostname.dom is an alias for smtp99.hostname.dom. smtp99.hostname.dom has address 123.234.123.89
Per aggirare il problema degli alias, io uso espressioni regolari nel file
"/etc/exim4/passwd.client
" SMTP AUTH probabilmente
funziona anche se il fornitore di servizi Internte sposta l'host a cui punta
l'alias.
Dopo aver modificato manualmente i file di configurazione di
exim4
in "/etc/exim4/
", è necessario
eseguire update-exim4.conf
(8).
Se si è scelta la ripsosta "No" (risposta predefinita) per la domanda di
debconf "Mantenere al minino il numero di richieste DNS (Dial-on-Demand)?"
ed il sistema non è connesso ad Internet,
l'avvio di exim4
può richiedere un tempo molto lungo.
Leggere la guida ufficiale in
"/usr/share/doc/exim4-base/README.Debian.gz
" e
update-exim4.conf
(8).
Si può creare il file di personalizzazione locale
"/etc/exim4/exim4.conf.localmacros
" per impostare
MACRO. Per esempio, si dice che il server di posta Yahoo richieda "MAIN_TLS_ENABLE =
true
" e "AUTH_CLIENT_ALLOW_NOTLS_PASSWORDS =
yes
in esso.
Se si sta cercando un MTA leggero che rispetti
"/etc/aliases
" per il proprio PC portatile, si dovrebbe
considerare la configurazione di exim4
(8) con
"QUEUERUNNER='queueonly'
",
"QUEUERUNNER='nodaemon'
ecc. in
"/etc/default/exim4
".
Per la posta Internet via smarthost, si dovrebbe come prima cosa leggere la documentazione di Postfix e le pagine man principali.
Tabella 6.5. Elenco delle pagine di manuale di Postfix importanti
comando | funzione |
---|---|
postfix (1)
|
programma di controllo di Postfix |
postconf (1)
|
utilità di configurazione per Postfix |
postconf (5)
|
parametri di configurazione di Postfix |
postmap (1)
|
gestione delle tabelle di consultazione di Postfix |
postalias (1)
|
gestione del database degli alias di Postfix |
Si possono (ri)configurare i pacchetti postfix
e
sasl2-bin
nel modo seguente.
$ sudo /etc/init.d/postfix stop $ sudo dpkg-reconfigure postfix
Scegliere "Internet con smarthost".
Impostare "relay host SMTP (vuoto per nessuno):" a
"[smtp.hostname.dom]:587
" e configurarlo nel modo
seguente.
$ sudo postconf -e 'smtp_sender_dependent_authentication = yes' $ sudo postconf -e 'smtp_sasl_auth_enable = yes' $ sudo postconf -e 'smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd' $ sudo postconf -e 'smtp_sasl_type = cyrus' $ sudo vim /etc/postfix/sasl_passwd
Creare le voci con le password per lo smarthost.
$ cat /etc/postfix/sasl_passwd [smtp.hostname.dom]:587 nomeutente:password $ sudo postmap hash:/etc/postfix/sasl_passwd
Avviare postfix
con il comando seguente.
$ sudo /etc/init.d/postfix start
In questo caso l'uso di "[
" e "]
" nel
dialogo di dpkg-reconfigure
e in
"/etc/postfix/sasl_passwd
" assocura che non venga
controllato il record MX, ma usato direttamente l'esatto nome host
specificato. Vedere "Abilitare l'autenticazione SASL nel client SMTP di
Postfix" in
"/usr/share/doc/postfix/html/SASL_README.html
".
Ci sono diversi file di configurazione dell'indirizzo di posta per gli strumenti di trasporto della posta, di consegna e per i programma di posta.
Tabella 6.6. Elenco dei file di configurazione correlati all'indirizzo di posta
file | funzione | applicazione |
---|---|---|
/etc/mailname
|
nome host predefinito per la posta (in uscita) |
specifico di Debian, mailname (5)
|
/etc/email-addresses
|
sostituzione del home host per la posta in uscita | specifico di exim (8),
exim4-config_files (5)
|
/etc/postfix/generic
|
sostituzione del home host per la posta in uscita | specifico di postfix (1), attivato dopo l'esecuzione del
comando postmap (1)
|
/etc/aliases
|
alias dei nomi degli account per la posta in entrata |
generale, attivato dopo l'esecuzione del comando
newaliases (1)
|
Il nomeposta nel file
"/etc/mailname
" è solitamente un nome di dominio
pienamente qualificato (FQDN) che è risolto ad uno degli indirizzi IP
dell'host. Per le postazioni mobili che non hanno un nome host con un
indirizzo IP risolvibile, impostare questo nomemail al valore di "hostname
-f
". (Questa è una scelta sicura e funziona sia per
exim4-*
sia per postfix
.)
Il contenuto di "/etc/mailname
" è usato da molti
programmi non MTA per determinare il loro comportamento predefinito. Per
mutt
, impostare le variabili
"hostname
" e from
" nel file
~/muttrc
per sovrascrivere il valore di mailname. Per i programmi nel pacchetto
devscripts
, come bts
(1) e
dch
(1), esportare le variabili d'ambiente
"$DEBFULLNAME
" e "$DEBEMAIL
" per
sovrascriverlo.
Il pacchetto popularity-contest
normalmente invia posta
dall'account di root con FQDN. È necessario impostare
MAILFROM
in
/etc/popularity-contest.conf
come descritto nel file
/usr/share/popularity-contest/default.conf
. In caso
contrario la posta verrà rigettata dal server SMTP dello smarthost. Sebbene
sia una scocciatura, questo approccio è più sicuro della riscrittura
dell'indirizzo sorgente di tutta la posta di root da parte dell'MTA e
dovrebbe essere usato per altri demoni e script cron.
Qunado si imposta mailname al valore di
"hostname -f
", la modifica dell'indirizzo di posta
d'origine con il MTA può essere fatta nel modo seguente.
/etc/email-addresses
" per
exim4
(8), come spiegato in
exim4-config_files
(5).
/etc/postfix/generic
" per
postfix
(8), come spiegato in
generic
(5).
Per postfix
sono necessarie, in aggiunta, le azioni
seguenti.
# postmap hash:/etc/postfix/generic # postconf -e 'smtp_generic_maps = hash:/etc/postfix/generic' # postfix reload
Si può testare la configurazione dell'indirizzo di posta nel modo seguente.
exim
(8) con le opzioni -brw, -bf, -bF, -bV,
…
postmap
(1) con l'opzione -q
.
Exim viene fornito con svariati programmi di utilità, come
exiqgrep
(8) e exipick
(8). Per
conoscere i comandi disponibili vedere "dpkg -L exim4-base|grep
man8/
".
Ci sono svariate operazioni di base degli MTA. Alcune possono essere fatte
usando l'interfaccia di compatibilità con sendmail
(1).
Tabella 6.7. Elenco di operazioni base degli MTA
comando exim | comando postfix | descrizione |
---|---|---|
sendmail
|
sendmail
|
legge la posta dallo standard input e gestisce la consegna
(-bm )
|
mailq
|
mailq
|
elenca la coda della posta con stato e ID dei messaggi in coda
(-bp )
|
newaliases
|
newaliases
|
inizializza il database degli alias (-I )
|
exim4 -q
|
postqueue -f
|
invia tutta la posta in attesa (-q )
|
exim4 -qf
|
postsuper -r ALL deferred; postqueue -f
|
invia tutta la posta |
exim4 -qff
|
postsuper -r ALL; postqueue -f
|
invia anche la posta congelata |
exim4 -Mg id_in_coda
|
postsuper -h id_in_coda
|
congela un messaggio in base al suo ID nella coda |
exim4 -Mrm id_in_coda
|
postsuper -d id_in_coda
|
rimuove un messaggio in base al suo ID nella coda |
N/D |
postsuper -d ALL
|
rimuove tutti i messaggi |
Può essere una buona idea far inviare tutta la posta da uno script in
"/etc/ppp/ip-up.d/*
".
Se ci si iscrive ad una mailing list relativa a Debian, può essere una buona
idea usare programmi di posta come mutt
e
gnus
che sono lo standard de facto per i partecipanti e
che si comportano come previsto.
Tabella 6.8. Elenco di programmi di posta (MUA)
pacchetto | popcon | dimensione | tipo |
---|---|---|---|
iceweasel *
|
V:30, I:48 | 3761 | programma per X con interfaccia utente grafica (Mozilla Firefox senza marchi) |
evolution *
|
V:16, I:34 | 4724 | programma per X con interfaccia utente grafica (parte di una suite groupware) |
icedove *
|
V:8, I:12 | 38864 | programma per X con interfaccia utente grafica (Mozilla Thunderbird senza marchi) |
mutt
*
|
V:26, I:83 | 6004 |
programma basato su terminale a caratteri probabilmente usato con
vim
|
gnus
*
|
V:0.06, I:0.3 | 6453 |
programma basato su terminale a caratteri in (x)emacs
|
Per usare mutt
come programma di posta (MUA) in
combinazione con vim
, persoonalizzare
"~/.muttrc
" nel modo seguente.
# # File di configurazione utente per sovrascrivere le impostazioni in /etc/Muttrc # # falsifica gli indirizzi di posta sorgenti set use_from set hostname=esempio.dom set from="Nome Cognome <nomeutente@esempio.dom>" set signature="~/.signature" # vim: "gq" per riformattare le citazioni set editor="vim -c 'set tw=72 et ft=mail'" # "mutt" apre la posta in entrata, mentre "mutt -y" elenca le caselle di posta set mbox_type=Maildir # usa il formato Maildir di qmail per creare mbox set mbox=~/Mail # mette tutte le caselle di posta in $HOME/Mail/ set spoolfile=+Inbox # posta consegnata in $HOME/Mail/Inbox set record=+Outbox # salva la posta fcc in $HOME/Mail/Outbox set postponed=+Postponed # mette la posta posposta in $HOME/Mail/postponed set move=no # non spostare gli elementi nella posta in entrata in mbox set quit=ask-yes # non uscire con il semplice uso di "q" set delete=yes # all'uscita cancella sempre senza chiedere set fcc_clear # salva fcc come non cifrate # Caselle di posta in Maildir (aggiornamento automatico) mailboxes `cd ~/Mail; /bin/ls -1|sed -e 's/^/+/' | tr "\n" " "` unmailboxes Maillog *.ev-summary ## Predefinito #set index_format="%4C %Z %{%b %d} %-15.15L (%4l) %s" ## Indice con thread con mittenti (collassato) set index_format="%4C %Z %{%b %d} %-15.15n %?M?(#%03M)&(%4l)? %s" ## Predefinito #set folder_format="%2C %t %N %F %2l %-8.8u %-8.8g %8s %d %f" ## solo i nomi delle cartelle set folder_format="%2C %t %N %f"
Per visualizzare la posta HTML e gli allegati MS Word all'interno del
messaggio, aggiungere a "/etc/mailcap
" o a
"~/.mailcap
" le righe seguenti.
text/html; lynx -force_html %s; needsterminal; application/msword; /usr/bin/antiword '%s'; copiousoutput; description="Microsoft Word Text"; nametemplate=%s.doc
Mutt può essere usato come client IMAP e
convertitore di formato per le caselle di posta. Si possono marcare messaggi
con "t
", "T
", ecc. Questi messaggi
marcati possono essere copiati con ";C
" tra caselle di
posta diverse e cancellati in un'unica volta con ";d
".
Anche se fetchmail
(1) è stato lo standard de facto in
GNU/Linux per il recupero della posta da remoto, l'autore preferisce
getmail
(1). Se si desidera rifiutare la posta prima di
scaricarla per salvare banda, potrebbero essere utili
mailfilter
o mpop
. Qualsiasi strumento
di recupero della posta si usi, è una buona idea configurare il sistema in
modo che la posta recuperata venga consegnata ad un MDA, come
maildrop
, attraverso una pipe.
Tabella 6.9. Elenco di utilità per il recupero della posta da remoto e l'inoltro
pacchetto | popcon | dimensione | descrizione |
---|---|---|---|
fetchmail *
|
V:2, I:5 | 2588 | strumento di recupero della posta (POP3, APOP, IMAP) (vecchio) |
getmail4 *
|
V:0.3, I:0.9 | 668 | strumento di recupero della posta (POP3, IMAP4 e SDPS) (semplice, sicuro e affidabile) |
mailfilter *
|
V:0.00, I:0.07 | 332 | strumento di recupero della posta (POP3) con capacità di filtraggio con espressioni regolari |
mpop
*
|
V:0.01, I:0.08 | 324 | strumento di recupero della posta (POP3) e MDA con capacità di filtraggio con espressioni regolari |
La configurazione di getmail
(1) è descritta nella documentazione di getmail. Quelle
seguenti sono le mie impostazioni per accedere ad account POP3 multipli come
utente.
Creare il file "/usr/local/bin/getmails
" nel modo
seguente.
#!/bin/sh set -e if [ -f $HOME/.getmail/running ]; then echo "getmail is already running ... (if not, remove $HOME/.getmail/running)" >&2 pgrep -l "getmai[l]" exit 1 else echo "getmail has not been running ... " >&2 fi if [ -f $HOME/.getmail/stop ]; then echo "do not run getmail ... (if not, remove $HOME/.getmail/stop)" >&2 exit fi if [ "x$1" = "x-l" ]; then exit fi rcfiles="/usr/bin/getmail" for file in $HOME/.getmail/config/* ; do rcfiles="$rcfiles --rcfile $file" done date -u > $HOME/.getmail/running eval "$rcfiles $@" rm $HOME/.getmail/running
Configurarlo nel modo seguente.
$ sudo chmod 755 /usr/local/bin/getmails $ mkdir -m 0700 $HOME/.getmail $ mkdir -m 0700 $HOME/.getmail/config $ mkdir -m 0700 $HOME/.getmail/log
Creare i file "$HOME/.getmail/config/nome_pop3
", uno per
ciascun account POP3, nel modo seguente.
[retriever] type = SimplePOP3SSLRetriever server = pop.eesempio.com username = nome_pop3@esempio.com password = segreta [destination] type = MDA_external path = /usr/bin/maildrop unixfrom = True [options] verbose = 0 delete = True delivered_to = False message_log = ~/.getmail/log/nome_pop3.log
Configurarlo nel modo seguente.
$ chmod 0600 $HOME/.getmail/config/*
Pianificare l'esecuzione di "/usr/local/bin/getmails
"
ogni 15 minuti usando cron
(8), eseguendo "sudo
crontab -e -u <nome_utente>
" e aggiungendo la riga seguente
alle voci di cron dell'utente.
5,20,35,50 * * * * /usr/local/bin/getmails --quiet
Eventuali problemi nell'accesso POP3 potrebbero non derivare da
getmail
. Alcuni servizi POP3 gratuiti popolari possono
violare il protocollo POP3 e i loro filtri anti-SPAM possono non essere
perfetti. Per esempio, possono cancellare i messaggi subito dopo aver
ricevuto il comando RETR, prima di ricevere il comando DELE, e possono
mettere messaggi in quarantena nella casella dello Spam. Si dovrebbero
minimizzare i danni configurandoli in modo da archiviare i messaggi a cui si
ha avuto accesso, senza cancellarli. Vedere anche Alcuni messaggi di posta non sono stati
scaricati.
La maggior parte dei programmi MTA, come postfix
e
exim4
, funziona anche da MDA (Mail Delivery Agent, agente
di consegna della posta). Ci sono MDA specializzati con capacità di
filtraggio.
Anche se procmail
(1) è stato lo standard de facto in
GNU/Linux per ciò riguarda gli MDA con filtri, l'autore preferisce
maildrop
(1). Qualsiasi strumento di filtraggio si usi, è
una buona idea configurare il sistema per inviare la posta filtrata ad una
Maildir in stile qmail.
Tabella 6.10. Elenco di MDA con filtri
pacchetto | popcon | dimensione | descrizione |
---|---|---|---|
procmail *
|
V:19, I:84 | 368 | MDA con filtri (vecchio) |
mailagent *
|
V:0.3, I:5 | 1692 | MDA con filtri Perl |
maildrop *
|
V:0.3, I:0.8 | 1000 | MDA con linguaggio strutturato per i filtri |
La configurazione di maildrop
(1) è descritta nella documentazione di
maildropfilter. Quello che segue è un esempio di configurazione per
"$HOME/.mailfilter
".
# Configurazione locale MAILROOT="$HOME/Mail" # impostare questo al contenuto di /etc/mailname MAILHOST="esempio.dom" logfile $HOME/.maildroplog # le regole sono fatte per sovrascrivere il valore precedente con quello successivo. # posta di mailing list ? if ( /^Precedence:.*list/:h || /^Precedence:.*bulk/:h ) { # regole per la posta di mailing list # casella di posta predefinita per i messaggi di mailing list MAILBOX="Inbox-list" # casella di posta predefinita per i messaggi di debian.org if ( /^(Sender|Resent-From|Resent-Sender): .*debian.org/:h ) { MAILBOX="service.debian.org" } # casella di posta predefinita per i messaggi di bugs.debian.org (BTS) if ( /^(Sender|Resent-From|Resent-sender): .*@bugs.debian.org/:h ) { MAILBOX="bugs.debian.org" } # casella di posta per ogni mailing list correttamente mantenuta con "List-Id: pippo" o "List-Id: ...<pippo.pluto>" if ( /^List-Id: ([^<]*<)?([^<>]*)>?/:h ) { MAILBOX="$MATCH2" } } else { # regole per messaggi non di mailing list # casella di posta in entrata predefinita MAILBOX="Inbox-unusual" # messaggi di posta locali if ( /Envelope-to: .*@$MAILHOST/:h ) { MAILBOX="Inbox-local" } # messaggi di posta html (al 99% posta indesiderata) if ( /DOCTYPE html/:b ||\ /^Content-Type: text\/html/ ) { MAILBOX="Inbox-html" } # regola per la lista nera per la posta indesiderata if ( /^X-Advertisement/:h ||\ /^Subject:.*BUSINESS PROPOSAL/:h ||\ /^Subject:.*URGENT.*ASISSTANCE/:h ||\ /^Subject: *I NEED YOUR ASSISTANCE/:h ) { MAILBOX="Inbox-trash" } # regola per la lista bianca per la posta normale if ( /^From: .*@debian.org/:h ||\ /^(Sender|Resent-From|Resent-Sender): .*debian.org/:h ||\ /^Subject: .*(debian|bug|PATCH)/:h ) { MAILBOX="Inbox" } # regola per la lista bianca dei messaggi relativi al BTS if ( /^Subject: .*Bug#.*/:h ||\ /^(To|Cc): .*@bugs.debian.org/:h ) { MAILBOX="bugs.debian.org" } # regola per la lista bianca per messaggi di cron relativi a getmail if ( /^Subject: Cron .*getmails/:h ) { MAILBOX="Inbox-getmails" } } # controlla esistenza di $MAILBOX `test -d $MAILROOT/$MAILBOX` if ( $RETURNCODE == 1 ) { # crea una casella di posta maildir per $MAILBOX `maildirmake $MAILROOT/$MAILBOX` } # consegna nella maildir $MAILBOX to "$MAILROOT/$MAILBOX/" exit
A differenza di procmail
, maildrop
non
crea automaticamente le directory maildir mancanti. Devono essere create
prima manualmente usando maildirmake
(1) come
nell'esempio di file "$HOME/.mailfilter
" precedente.
Quello che segue è un file di configurazione simile
"$HOME/.procmailrc
" per procmail
(1).
MAILDIR=$HOME/Maildir DEFAULT=$MAILDIR/Inbox/ LOGFILE=$MAILDIR/Maillog # posta palesemente con brutto aspetto: gettarla in X-trash e uscire :0 * 1^0 ^X-Advertisement * 1^0 ^Subject:.*BUSINESS PROPOSAL * 1^0 ^Subject:.*URGENT.*ASISSTANCE * 1^0 ^Subject: *I NEED YOUR ASSISTANCE X-trash/ # Consegna dei messaggi di mailinglist :0 * 1^0 ^Precedence:.*list * 1^0 ^Precedence:.*bulk * 1^0 ^List- * 1^0 ^X-Distribution:.*bulk { :0 * 1^0 ^Return-path:.*debian-devel-admin@debian.or.jp jp-debian-devel/ :0 * ^Resent-Sender.*debian-user-request@lists.debian.org debian-user/ :0 * ^Resent-Sender.*debian-devel-request@lists.debian.org debian-devel/ :0 * ^Resent-Sender.*debian-announce-request@lists.debian.org debian-announce :0 mailing-list/ } :0 Inbox/
Se la propria directory home diventa piena e la consegna con
procmail
(1) fallisce, sarà necessario consegnare
manualmente la posta da "/var/mail/<nomeutente>
"
alle proprie caselle di posta distinte nella directory home. Dopo aver fatto
spazio nella directory home, eseguire quanto segue.
# /etc/init.d/${MAILDAEMON} stop # formail -s procmail </var/mail/<nomeutente> # /etc/init.d/${MAILDAEMON} start
Se si deve eseguire un server privato in una LAN, si può prendere in considerazione l'esecuzione di un server POP3 / IMAP4 per la consegna della posta ai client nella LAN.
Tabella 6.11. Elenco di server POP3/IMAP4
pacchetto | popcon | dimensione | tipo | descrizione |
---|---|---|---|---|
qpopper *
|
V:1.1, I:4 | 636 | POP3 | Server POP3 BSD migliorato della Qualcomm |
courier-pop *
|
V:1.6, I:2 | 244 | POP3 | Server di posta Courier - server POP3 (solo formato maildir) |
ipopd
*
|
V:0.10, I:0.18 | 212 | POP3 | Server POP2 e POP3 dell'Università di Washington |
cyrus-pop3d-2.2 *
|
V:0.18, I:0.3 | 852 | POP3 | sistema di posta Cyrus (supporto POP3) |
xmail
*
|
V:0.14, I:0.16 | 836 | POP3 | Server di posta ESMTP/POP3 |
courier-imap *
|
V:2, I:3 | 1624 | IMAP | Server di posta Courier - server IMAP (solo formato maildir) |
uw-imapd *
|
V:0.7, I:4 | 280 | IMAP | Server IMAP dell'Università di Washington |
cyrus-imapd-2.2 *
|
V:0.4, I:0.6 | 2632 | IMAP | sistema di posta Cyrus (supporto IMAP) |
Nei vecchi sistemi *nix, lo standard era il demone di stampa BSD. Dato che il formato standard per l'output di stampa del software libero nei sistemi in stile Unix è PostScript, veniva usato un sistema di filtri insieme a Ghostscript per permettere la stampa su stampanti non-PostScript.
Di recente il nuovo standard de facto è CUPS (Common UNIX Printing System). CUPS usa il protocollo IPP (Internet Printing Protocol). IPP è ora supportato da altri sistemi operativi come Windows XP e Mac OS X ed è diventato il nuovo standard de facto multipiattaforma per la stampa da remoto con capacità di comunicazione bidirezionale.
Il formato standard per i dati stampabili per le applicazioni nel sistema Debian è il formato PostScript (PS) che è un linguaggio di descrizione della pagina. I dati in formato PS vengono passati all'interprete PosPostScript Ghostscript per produrre i dati stampabili specifici per la stampante. Vedere Sezione 11.3.1, «Ghostscript».
Grazie alla funzionalità di auto-conversione in base al formato dei file del
sistema CUPS, il semplice passaggio di qualsiasi tipo di dati al comando
lpr
dovrebbe generare l'output di stampa atteso. (In
CUPS, il comando lpr
può essere abilitato installando il
pacchetto cups-bsd
.)
Il sistema Debian ha alcuni pacchetti degni di nota per ciò che riguarda i server e le utilità di stampa
Tabella 6.12. Elenco di server e utilità di stampa
pacchetto | popcon | dimensione | porta | descrizione |
---|---|---|---|---|
lpr
*
|
V:2, I:2 | 440 | printer (515) | lpr/lpd BSD (Line printer daemon, demone di stampa in linea) |
lprng
*
|
V:0.6, I:1.3 | 2904 | " " | " " (Migliorato) |
cups
*
|
V:33, I:44 | 15540 | IPP (631) | server CUPS di stampa Internet |
cups-client *
|
V:17, I:46 | 908 | " " |
comandi System V per la stampa
con CUPS: lp (1), lpstat (1),
lpoptions (1), cancel (1),
lpmove (8), lpinfo (8),
lpadmin (8), …
|
cups-bsd *
|
V:7, I:41 | 420 | " " |
comandi BSD per la stampa con
CUPS: lpr (1), lpq (1),
lprm (1), lpc (8)
|
cups-driver-gutenprint *
|
V:12, I:38 | 1212 | Non applicabile | driver di stampa per CUPS |
Si può configurare il sistema CUPS indirizzando il proprio browser web all'indirizzo "http://localhost:631/".
SSH (Secure SHell) è il metodo sicuro per connettersi in Internet. Una versione
libera di SSH chiamata OpenSSH è disponibile
nei pacchetti Debian openssh-client
e
openssh-server
.
Tabella 6.13. Elenco dei server e delle utilità per l'accesso remoto
pacchetto | popcon | dimensione | strumento | descrizione |
---|---|---|---|---|
openssh-client *
|
V:52, I:99 | 2104 |
ssh (1)
|
client SSH |
openssh-server *
|
V:70, I:83 | 700 |
sshd (8)
|
server SSH |
ssh-askpass-fullscreen *
|
V:0.08, I:0.4 | 92 |
ssh-askpass-fullscreen (1)
|
chiede all'utente una passphrase per ssh-add (GNOME2) |
ssh-askpass *
|
V:0.7, I:5 | 156 |
ssh-askpass (1)
|
chiede all'utente una passphrase per ssh-add (X semplice) |
Se il proprio SSH è accessibile da Internet, vedere Sezione 4.7.3, «Misure aggiuntive di sicurezza per Internet».
Per permettere al processo della shell remota di sopravvivere
all'interruzione della connessione, usare il programma
screen
(1) (vedere Sezione 9.1, «Il programma screen»).
Se si desidera eseguire il server OpenSSH, non deve esistere il file
"/etc/ssh/sshd_not_to_be_run
".
SSH ha due protocolli di autenticazione
Tabella 6.14. Elenco dei protocolli e dei metodi di autenticazione di SSH
protocollo SSH | metodo SSH | descrizione |
---|---|---|
SSH-1 |
"RSAAuthentication "
|
autenticazione utente RSA basata su chiave identificativa |
" " |
"RhostsAuthentication "
|
autenticazione di host basata su ".rhosts " (insicura,
disabilitata)
|
" " |
"RhostsRSAAuthentication "
|
autenticazione di host basata su ".rhosts " in
combinazione con chiave RSA per host(disabilitata)
|
" " |
"ChallengeResponseAuthentication "
|
autenticazione RSA challenge-response |
" " |
"PasswordAuthentication "
|
autenticazione basata su password |
SSH-2 |
"PubkeyAuthentication "
|
autenticazione utente basata su chiave pubblica |
" " |
"HostbasedAuthentication "
|
autenticazione di host basata su "~/.rhosts " o
"/etc/hosts.equiv " in combinazione con autenticazione
dell'host client con chiave pubblica (disabilitata)
|
" " |
"ChallengeResponseAuthentication "
|
autenticazione challenge-response |
" " |
"PasswordAuthentication "
|
autenticazione basata su password |
Se si usa un sistema non Debian si faccia attenzione a queste differenze.
Per i dettagli vedere
"/usr/share/doc/ssh/README.Debian.gz
",
ssh
(1), sshd
(8),
ssh-agent
(1) e ssh-keygen
(1).
Di seguito è riportato l'elenco dei file di configurazione più importanti.
Tabella 6.15. Elenco dei file di configurazione per SSH
file di configurazione | descrizione del file di configurazione |
---|---|
/etc/ssh/ssh_config
|
impostazioni predefinite per il client SSH, vedere
ssh_config (5)
|
/etc/ssh/sshd_config
|
impostazioni predefinite per il server SSH, vedere
ssh_config (5)
|
~/.ssh/authorized_keys
|
chiavi SSH pubbliche predefinite che i client usano per connettersi a questo account su questo server SSH |
~/.ssh/identity
|
chiave RSA SSH-1 segreta dell'utente |
~/.ssh/id_rsa
|
chiave RSA SSH-2 segreta dell'utente |
~/.ssh/id_dsa
|
chiave DSA SSH-2 segreta dell'utente |
Per l'uso delle chiavi SSH pubbliche e segrete, vedere
ssh-keygen
(1), ssh-add
(1) e
ssh-agent
(1).
Assicurarsi di verificare le impostazioni testando la connessione. In caso
di problemi, usare "ssh -v
".
Si può cambiare successivamente la passphrase per cifrare le chiavi SSH
segrete locali usando "ssh-keygen -p
".
Si possono aggiungere opzioni alle voci in
"~/.ssh/authorized_keys
" per limitare gli host e per
eseguire comandi specifici. Per i dettagli vedere
sshd
(8).
I comandi seguenti avviano una connessione ssh
(1) da un
client.
Tabella 6.16. Elenco di esempi di avvio di client SSH
comando | descrizione |
---|---|
ssh nomeutente@nomehost.dominio.ext
|
connette nella modalità predefinita |
ssh -v nomeutente@nomehost.dominio.ext
|
connette nella modalità predefinita con messaggi di debug |
ssh -1 nomeutente@nomehost.dominio.ext
|
forza la connessione con SSH versione 1 |
ssh -1 -o RSAAuthentication=no -l nomeutente
nomehost.dominio.ext
|
forza l'uso di password con SSH versione 1 |
ssh -o PreferredAuthentications=password -l nomeutente
nomehost.dominio.ext
|
forza l'uso di password con SSH versione 2 |
Se si usa lo stesso nome utente sull'host locale e su quello remoto, si può
evitare di digitare la parte "nomeutente@
". Anche se si
usa un nome utente diverso nell'host locale rispetto a quello remoto, si può
evitare di digitare quella parte usando il file
"~/.ssh/config
". Per il servizio Debian Alioth con nome account
"pippo-guest
", impostre
"~/.ssh/config
" in modo che contenga quanto segue.
Host alioth.debian.org svn.debian.org git.debian.org User pippo-guest
Per l'utente ssh
(1) funziona come un
telnet
(1) più intelligente e più sicuro. A differenza del
comando telnet
, ssh
non va in crash a
seguito del carattere di escape di telnet
(impostazione
predefinita iniziale CTRL-]).
Per stabilire una pipe per connettersi alla porta 25 del
server-remoto
dalla porta 4025 dell'host
locale
e alla porta 110 del server-remoto
dalla
porta 4110 dell'host locale
attraverso
ssh
, eseguire sull'host locale il comando seguente.
# ssh -q -L 4025:server-remoto:25 4110:server-remoto:110 nomeutente@server-remoto
Questo è un metodo sicuro di creare connessioni a server SMTP/POP3 in
Internet. Impostare nel file "/etc/ssh/sshd_config
"
dell'host remoto la voce "AllowTcpForwarding
" a
"yes
".
Si può evitare di doversi ricordare le password per sistemi remoti usando
"RSAAuthentication
" (protocollo SSH-1) o
"PubkeyAuthentication
" (protocollo SSH-2).
Sul sistema remoto impostare el file
"/etc/ssh/sshd_config
" le rispettive voci
"RSAAuthentication yes
" o "PubkeyAuthentication
yes
".
Generare localmente le chiavi di autenticazione ed installare la chiave pubblica sul sistema remoto con i comandi seguenti.
RSAAuthentication
": chiave RSA per SSH-1 (deprecata
perché superata)
$ ssh-keygen $ cat .ssh/identity.pub | ssh utente1@remote "cat - >>.ssh/authorized_keys"
PubkeyAuthentication
": chiave RSA per SSH-2
$ ssh-keygen -t rsa $ cat .ssh/id_rsa.pub | ssh utente1@remote "cat - >>.ssh/authorized_keys"
PubkeyAuthentication
": chiave DSA per SSH-2 (deprecata
perché lenta)
$ ssh-keygen -t dsa $ cat .ssh/id_dsa.pub | ssh utente1@remote "cat - >>.ssh/authorized_keys"
L'uso di una chiave DSA per SSH-2 è deprecato perché la chiave è più piccola e più lenta. Non esistono più motivi per aggirare i brevetti RSA usando DSA, dato che essi sono scaduti. DSA sta per Algoritmo di firma digitale (Digital Signature Algotithm ed è lento. Vedere anche DSA-1571-1.
Affinché "HostbasedAuthentication
" funzioni con SSH-2, si
deve impostare la voce "HostbasedAuthentication
" a
"yes
" in entrambi i file
"/etc/ssh/sshd_config
" nell'host server e i
"/etc/ssh/ssh_config
" o
"~/.ssh/config
" nell'host client.
Sono disponibili alcuni client SSH liberi per altre piattaforme.
Tabella 6.17. Elenco di client SSH per altre piattaforme
ambiente | programma ssh libero |
---|---|
Windows | puTTY (http://www.chiark.greenend.org.uk/~sgtatham/putty/) (GPL) |
Windows (cygwin) | SSH in cygwin (http://www.cygwin.com/) (GPL) |
Macintosh Classic | macSSH (http://www.macssh.com/) (GPL) |
Mac OS X |
OpenSSH; usare ssh nell'applicazione Terminale (GPL)
|
È meglio per ragioni di sicurezza proteggere la propria chiave segreta di
autenticazione SSH con una passphrase. Se non è già stata impostata una
passphrase usare "ssh-keygen -p
" per farlo.
Mettere la propria chiav SSH pubblica (ad esempio
"~/.ssh/id_rsa.pub
") in
"~/.ssh/authorized_keys
" su un host remoto usando una
connessione all'host remoto basata su password, come descritto in
precedenza.
$ ssh-agent bash $ ssh-add ~/.ssh/id_rsa Enter passphrase for /home/<nomeutente>/.ssh/id_rsa: Identity added: /home/<nomeutente>/.ssh/id_rsa (/home/<nomeutente>/.ssh/id_rsa)
Per il comando successivo non sarà più necessaria da questo momento la password remota.
$ scp pippo <nomeutente>@host.remoto:pippo
Premere ~D per terminare la sessione ssh-agent.
Per il server X, il normale script di avvio Debian esegue
ssh-agent
come processo genitore. Perciò è necessario
eseguire ssh-add
una volta sola. Per ulteriori
informazioni, leggere ssh-agent
(1) e
ssh-add
(1).
È necessario proteggere il processo che esegue "shutdown -h
now
" (vedere Sezione 1.1.8, «Come spegnere il sistema») dalla
terminazione di SSH usando il comando at
(1) (vedere Sezione 9.5.13, «Pianificare compiti da eseguire una volta sola») nel modo seguente.
# echo "shutdown -h now" | at now
Eseguire "shutdown -h now
" in una sessione
screen
(1) (vedere Sezione 9.1, «Il programma screen»)
è un altro modo di ottenere lo stesso risultato.
Se si hanno problemi, controllare i permessi dei file di configurazione ed
eseguire ssh
con l'opzione "-v
".
Se si è root e si hanno problemi con un firewall usare l'opzione
"-P
"; questo evita l'uso delle porte 1 - 1023 del server.
Se le connessioni ssh
ad un sito remoto smettono di
funzionare improvvisamente, potrebbe essere a causa di modifiche fatte
dall'amministratore di sistema, molto probabilmente cambiamenti in
"host-key
" durante l'amministrazione del sistema. Dopo
essersi accertati che questa sia davvero la causa e che nessuna stia
cercando di falsificare l'host remoto con qualche trucchetto, si può
riottenere una connessione rimuovendo la voce "host-key
"
dal file "~/.ssh/known_hosts
" sull'host locale.
Ecco un elenco di altri server applicativi di rete.
Tabella 6.18. Elenco di altri server applicativi di rete
pacchetto | popcon | dimensione | protocollo | descrizione |
---|---|---|---|---|
telnetd *
|
V:0.4, I:1.1 | 156 | TELNET | server TELNET |
telnetd-ssl *
|
V:0.10, I:0.3 | 152 | " " | " " (supporto SSL) |
nfs-kernel-server *
|
V:12, I:21 | 412 | NFS | condivisione di file Unix |
samba
*
|
V:18, I:31 | 23096 | SMB | condivisione di file e stampanti Windows |
netatalk *
|
V:5, I:9 | 3428 | ATP | condivisione di file e stampanti Apple/Mac (AppleTalk) |
proftpd-basic *
|
V:6, I:7 | 4064 | FTP | scaricamento generico di file |
wu-ftpd *
|
V:0.4, I:0.6 | 820 | " " | " " |
apache2-mpm-prefork *
|
V:38, I:42 | 68 | HTTP | server web generico |
apache2-mpm-worker *
|
V:6, I:7 | 68 | " " | " " |
squid
*
|
V:6, I:7 | 1848 | " " | server proxy web generico |
squid3 *
|
V:1.5, I:1.8 | 3600 | " " | " " |
slpd
*
|
V:0.14, I:0.2 | 180 | SLP | server OpenSLP come server LDAP |
bind9
*
|
V:10, I:17 | 1080 | DNS | indirizzo IP per altri host |
dhcp3-server *
|
V:5, I:10 | 64 | DHCP | indirizzo IP per il client stesso |
CIFS (Common Internet File System Protocol) è lo stesso protocollo di SMB (Server Message Block) ed è ampiamente usato da Microsoft Windows.
L'uso di server proxy come squid
è molti più efficiente
per risparmiare banda rispetto all'uso di server mirror locali con il
completo contenuto dell'archivio Debian.
Ecco un elenco di altri client applicativi di rete.
Tabella 6.19. Elenco di altri client applicativi di rete
pacchetto | popcon | dimensione | protocollo | descrizione |
---|---|---|---|---|
netcat *
|
I:28 | 36 | TCP/IP | coltellino svizzero TCP/IP |
openssl *
|
V:56, I:91 | 2380 | SSL | eseguibile SSL (Secure Socket Layer) e strumenti crittografici relativi |
stunnel4 *
|
V:0.6, I:2 | 512 | " " | wrapper SSL universale |
telnet *
|
V:13, I:89 | 200 | TELNET | client TELNET |
telnet-ssl *
|
V:0.2, I:1.1 | 208 | " " | " " (supporto SSL) |
nfs-common *
|
V:49, I:81 | 660 | NFS | condivisione di file Unix |
smbclient *
|
V:6, I:35 | 45200 | SMB | client per condivisione di file e stampanti MS Windows |
smbfs
*
|
V:5, I:24 | 56 | " " | comandi mount e umount per file MS Windows remoti |
ftp
*
|
V:9, I:85 | 168 | FTP | client FTP |
lftp
*
|
V:1.3, I:6 | 1876 | " " | " " |
ncftp
*
|
V:1.4, I:7 | 1276 | " " | client FTP a tutto schermo |
wget
*
|
V:33, I:99 | 2364 | HTTP e FTP | scaricatore per web |
curl
*
|
V:7, I:23 | 352 | " " | " " |
bind9-host *
|
V:43, I:91 | 188 | DNS |
host (1) da bind9, "Priorità: standard "
|
dnsutils *
|
V:14, I:90 | 412 | " " |
dig (1) da bind, "Priorità: standard "
|
dhcp3-client *
|
V:32, I:92 | 60 | DHCP | ottiene indirizzo IP |
ldap-utils *
|
V:2, I:7 | 672 | LDAP | ottiene dati da server LDAP |
Il programma telnet
permette la connessione manuale ai
demoni di sistema e la loro diagnosi.
Per testare il semplice servizio POP3 provare il comando seguente.
$ telnet mail.nomeisp.net pop3
Per testare il servizio POP3 con TLS/SSL abilitato di alcuni fornitori di servizi
Internet, è necessario un client telnet
con TLS/SSL
abilitato fornito dal pacchdetto telnet-ssl
o
openssl
.
$ telnet -z ssl pop.gmail.com 995
$ openssl s_client -connect pop.gmail.com:995
Le seguenti RFC forniscono le conoscenze necessarie per ciascun demone di sistema.
L'uso delle porte è descritto in "/etc/services
".
Il sistema X Window in Debian è basato sui sorgenti di X.org. A partire da luglio 2009 sono X11R7.1(etch), X11R7.3(lenny), X11R7.3(squeeze) e X11R7.4(sid).
Per facilitare l'installazione sono forniti alcuni (meta)pacchetti
Tabella 7.1. Elenco di (meta)pacchetti fondamentali per X Window
(meta)pacchetto | popcon | dimensione | descrizione |
---|---|---|---|
xorg
*
|
I:43 | 80 | librerie X, un server X, un insieme di tipi di carattere e un gruppo di client e utilità X di base (metapacchetto) |
xserver-xorg *
|
V:30, I:51 | 228 | insiee completo del server X e della sua configurazione |
xbase-clients *
|
V:3, I:47 | 132 | vari client X assortiti |
x11-common *
|
V:41, I:92 | 568 | infrastruttura del filesystem per il sistema X Window |
xorg-docs *
|
I:6 | 1956 | documentazione varia per la suite software X.Org |
menu
*
|
V:28, I:52 | 2060 | genera il menu Debian per tutte le applicazioni con supporto per il menu |
gksu
*
|
V:23, I:46 | 540 |
frontend Gtk+ a su (1) o sudo (8)
|
menu-xdg *
|
I:47 | 76 | converte la struttura del menu Debian nella struttura del menu xdg di freedesktop.org |
xdg-utils *
|
V:16, I:46 | 300 | utilità per integrare l'ambiente desktop fornito da freedesktop.org |
gnome-desktop-environment *
|
I:29 | 44 | ambiente desktop GNOME standard (metapacchetto) |
kde-standard *
|
I:3 | 36 | ambiente desktop KDE di base (metapacchetto) |
xfce4
*
|
I:4 | 40 | ambiente desktop leggero Xfce (metapacchetto) |
lxde-core *
|
I:2 | 36 | ambiente desktop leggero LXDE (metapacchetto) |
fluxbox *
|
V:0.9, I:2 | 4424 | Fluxbox: pacchetto per un gestore di finestre per X altamente configurabile e con basso uso di risorse |
Per le nozioni base su X fare riferimento a X
(7) e il
XWindow-User-HOWTO del LDP.
Un ambiente desktop è solitamente una combinazione di un gestore di finestre per X, un gestore di file e una suite di utilità compatibili.
Si può configurare un ambiente desktop completo come GNOME, KDE, Xfce o LXDE da aptitude nel menu dei task.
Il menu dei task potrebbe non essere in sincrono con le più recenti
transizioni di pacchetti negli ambienti Debian
unstable
/testing
. In questo caso è
necessario deselezionare alcuni (meta)pacchetti elencati nel menu dei task
di aptitude
(8) per evitare conflitti tra
pacchetti. Quando si deselezionano (meta)pacchetti, è necessario selezionare
manualmente alcuni pacchetti che forniscono le loro dipendenze per evitare
che vengano automaticamente rimossi.
In alternativa è possibile impostare manualmente un ambiente semplice con semplicemente un gestore di finestre per X come Fluxbox.
Vedere Gestori di finestre per X per una guida ai gestori di finestre per X e agli ambienti desktop.
Il sistema del menu Debian fornisce
un'interfaccia generale ai programmi sia testuali sia orientati ad X,
tramite update-menus
(1) nel pacchetto
menu
. Ciascun pacchetto installa i propri dati per il
menu nella directory "/usr/share/menu/
". Vedere
"/usr/share/menu/README
".
Ogni pacchetto conforme al sistema di menu xdg di Freedesktop.org installa i
propri dati di menu forniti da "*.desktop
" in
"/usr/share/applications/
". Gli ambienti desktop moderni
che sono conformi agli standard Freedesktop.org usano questi dati per
generare i propri menu usando il pacchetto
xdg-utils
. Vedere
"/usr/share/doc/xdg-utils/README
".
Per ottenere l'accesso al menu Debian tradizionale nell'ambiente desktop
GNOME, si deve installare il pacchetto menu-xdg
, cliccare
su "Sistema" → "Preferenze" → "Menu principale" e spuntare la casella per
"Debian".
Potrebbe essere necessario fare un'azione simile per altri ambienti desktop moderni che sono conformi allo standard Freedesktop.org.
Il sistema X Window è attivato come combinazione di programmi server e client. Il significato delle parole server e client in relazione alle parole locale e remoto richiede un po' di attenzione.
Tabella 7.2. Elenco della terminologia per server/client
tipo | descrizione |
---|---|
server X | un programma eseguito su un host locale connesso al display dell'utente e ai device di input |
client X | un programma in esecuzione su un host remoto che elabora dati e comunica con il server X |
application server | un programma in esecuzione su un host remoto che elabora dati e comunica con i client |
client applicativo | un programma eseguito su un host locale connesso al display dell'utente e ai device di input |
Per informazioni sul server X vedere xorg
(1).
Il server X (post-lenny
) è stato riscritto per usare, per
la sua configurazione, più informazioni da servizi standard del sistema
operativo, come HAL e D-bus, piuttosto che dal file
"/etc/X11/xorg.conf
". Perciò i contenuti del file
"/etc/X11/xorg.conf
" si sono ridotti. Potrebbe essere
necessario aggirare alcuni
problemi di transizione del server X
I comandi seguenti (ri)configurano un server X generando un nuovo file
"/etc/X11/xorg.conf
" usando dexconf
(1)
# dpkg-reconfigure --priority=low x11-common # dpkg-reconfigure --priority=low xserver-xorg
Se il file "/etc/X11/xorg.conf
" è stato modificato
manualmente ma si desidera che venga aggiornato automaticamente, eseguire il
comando seguente.
# sudo dpkg-reconfigure -phigh xserver-xorg
Controllare attentamente la propria configurazione di X in relazione alle specifiche del proprio monitor. Per alte risoluzioni di monitor CRT, è una buona idea impostare la frequenza di aggiornamento al valore più alto gestito dal monitor (85 Hz è un valore ottimo, 75 Hz è OK) per ridurre lo sfarfallio. Per i monitor LCD frequenze di aggiornamento standard più basse (60Hz) vanno solitamente bene a causa della risposta più lenta.
Fare attenzione a non usare una frequenza di aggiornamento troppo alta che potrebbe causare danni hardware critici al monitor.
Ci sono diversi modi per far sì che il "server X" (lato display) accetti connessioni da un "client X" (lato applicazione).
Tabella 7.3. Elenco di metodi di connessione al server X
metodo | pacchetto | popcon | dimensione | utente | cifratura | uso collegato |
---|---|---|---|---|---|---|
comando xhost
|
xbase-clients *
|
V:3, I:47 | 132 | non controllato | no | deprecato |
comando xauth
|
xbase-clients *
|
V:3, I:47 | 132 | controllato | no | connessione locale attraverso una pipe |
comando ssh -X
|
openssh-client *
|
V:52, I:99 | 2104 | controllato | sì | connessione di rete remota |
GNOME display manager |
gdm
*
|
V:22, I:33 | 16548 | controllato | no (XDMCP) | connessione locale attraverso una pipe |
KDE display manager |
kdm
*
|
V:8, I:11 | 5510 | controllato | no (XDMCP) | connessione locale attraverso una pipe |
gestore dello schermo di X |
xdm
*
|
V:0.7, I:1.8 | 780 | controllato | no (XDMCP) | connessione locale attraverso una pipe |
WindowMaker display manager |
wdm
*
|
V:24, I:84 | 1992 | controllato | no (XDMCP) | connessione locale attraverso una pipe |
LTSP display manager |
ldm
*
|
V:0.02, I:0.09 | 392 | controllato | sì | connessione SSH di rete remota (thin client) |
Non usare connessioni remote TCP/IP su reti non sicure
per la connessione X a meno che non esistano ragioni molto buone per farlo,
come l'uso di cifratura. Una connessione remota via socket TCP/IP senza
cifratura è esposta ad attacchi di
spionaggio ed è disabilitata in modo predefinito nel sistema
Debian. Usare "ssh -X
".
Non usare nemmeno connessioni XDMCP su reti non sicure. Inviano dati attraverso UDP/ IP senza cifratura e sono esposte ad attacchi di spionaggio.
Se si è in un ambiente completamente sicuro, si può osare e abilitare le connessioni TCP/IP remote
impostando "DisallowTCP=false
" in
"/etc/gdm/gdm.conf
" per sovrascrivere
"/usr/share/gdm/defaults.conf
" e rimuovendo
"-nolisten
" dalle righe trovate con "find
/etc/X11 -type f -print0 | xargs -0 grep nolisten
".
LTSP sta per Linux Terminal Server Project (progetto per server terminale Linux.
Il sistema X Window è solitamente avviato come una sessine X, che è la combinazione di un server X e di client X connessi. Per un normale sistema desktop entrambe le componenti sono eseguite su una macchina.
La sessione X viene avviata in uno dei modi seguenti.
startx
avviato dalla riga di comando
*dm
avviati al termine dello script di avvio
nella directory "/etc/rc?.d/
" (dove
"?
" corrisponde al runlevel)
Lo script di avvio dei demoni display manager controlla il contenuto del
file "/etc/X11/default-display-manager
" prima della
effettivo avvio del demone. ciò assicura che venga attivato un solo
programma demone per display manager di
X.
Vedere Sezione 8.3.5, «Localizzazione specifica solamente in X Window» per le variabili d'ambiente iniziali del display manager per X.
Essenzialmente tutti questi programmi eseguono lo script
"/etc/X11/Xsession
"; poi questo script effettua un'azione
simile a run-parts
(8) per eseguire tutti gli script nella
directory "/etc/X11/Xsession.d/
". Ciò è fondamentalmente
l'esecuzione, con il comando interno exec
, del primo
programma trovato cercando nell'ordine seguente.
/etc/X11/Xsession
" dal display manager di X, se
definito.
~/.xsession
" o
"~/.Xsession
", se definito.
/usr/bin/x-session-manager
", se definito.
/usr/bin/x-window-manager
", se definito.
/usr/bin/x-terminal-emulator
", se definito.
Questo processo è influenzato dal contenuto di
"/etc/X11/Xsession.options
". I programmi effettivi a cui
puntano questi comandi "/usr/bin/x-*
" sono determinati
dal sistema di alternative di Debian e possono essere modificati con
"update-alternatives --config x-session-manager
", ecc.
gdm
(1) permette di selezionare dal suo menu il tipo di
sessione (o l'ambiente desktop: Sezione 7.2, «Impostare l'ambiente desktop») e la lingua (o la
localizzazione: Sezione 8.3, «La localizzazione») della sessione X. Archivia il
valore selezionato predefinito in "~/.dmrc
" nel formato
seguente.
[Desktop] Session=default Language=ja_JP.UTF-8
In un sistema in cui "/etc/X11/Xsession.options
" contiene
una riga "allow-user-xsession
" non preceduta da nessun
carattere "#
, qualsiasi utente che configuri
"~/.xsession
" o "~/.Xsession
" è in
grado di personalizzare il comportamento di
"/etc/X11/Xsession
" sovrascrivendo completamente il
codice del sistema. L'ultimo comando nel file
"~/.xsession
dovrebbe essere nella forma "exec
un-qualche-gestore-di-finestre/sessione
" per avviare il proprio
gestore di finestre/sessione di X preferito.
Quelli che seguono sono metodi nuovi per personalizzare la sessione X senza sovrascrivere completamente le impostazioni di sistema come nell'esempio precedente.
gdm
può selezionare una specifica
sessione ed impostarla come argomento di
"/etc/X11/Xsession
".
~/.xsessionrc
" è eseguito come parte del
processo di avvio. (indipendente dal desktop)
~/.gnomerc
" è eseguito come parte del processo
di avvio (solo desktop GNOME)
~/.gnome2/session
", ecc.
L'uso di "ssh -X
" permette una connessione sicura da un
server X locale ad un application server remoto.
Impostare le voci "X11Forwarding
" a
"yes
" nel file "/etc/ssh/sshd_config
"
dell'host remoto, se si vuole evitare l'opzione "-X
"
nella riga di comando.
Avviare il server X sull'host locale
Aprire un xterm
sull'host locale.
Eseguire ssh
(1) per stabilire una connessione con il sito
remoto nel modo seguente.
nomelocale @ hostlocale $ ssh -q -X nomelogin@hostremoto.dominio Password:
Eseguire un comando applicativo X, ad esempio "gimp
", sul
sito remoto nel modo seguente.
nomelogin @ hostremoto $ gimp &
Questo metodo può mostrare l'output da un client X remoto come se fosse connesso localmente attraverso un socket UNIX locale.
Un terminale X sicuro via Internet, che mostri in remoto l'intero ambiente
desktop X, può essere ottenuto facilmente usando pacchetti specializzati,
come ldm
. La macchina locale diventa un thin client
sicuro per l'application server remoto connesso via SSH.
Se si vuole aggiungere una funzione simile al proprio display manager
normale gdm
, creare uno script di shell eseguibile
"/usr/local/bin/ssh-session
" come il seguente.
#!/bin/sh -e # Basato su gdm-ssh-session nei sorgenti di gdm (GPL) ZENITY=$(type -p zenity) TARGETHOST=$($ZENITY --width=600 \ --title "Host a cui connettersi" --entry \ --text "Inserire il nome dell'host su cui fare il login come utente@host.dom:") TARGETSESSION=$($ZENITY --width=600 --height=400 \ --title "Nome della sessione remota" --list --radiolist --text "Selezionarne una" \ --column " " --column "Sessione" --column "descrizione" --print-column 2 \ TRUE "/etc/X11/Xsession" "Debian" \ FALSE "/etc/X11/xinit/Xclients" "Varianti RH" \ FALSE "gnome-session" "Sessione GNOME" \ FALSE "xterm" "Scelta sicura" \ FALSE "rxvt" "Scelta sicura" \ FALSE "gnome-terminal" "Scelta sicura") echo "Connessione a "$TARGETHOST" con $TARGETSESSION in corso" /usr/bin/ssh -A -X -T -n "$TARGETHOST" "$TARGETSESSION" #SSH_ASKPASS=/usr/bin/ssh-askpass /usr/bin/ssh -A -X -T -n "$TARGETHOST" "$TARGETSESSION"
Aggiungere a "/etc/dm/Sessions/ssh.desktop
" quanto segue.
[Desktop Entry] Encoding=UTF-8 Name=SSH Comment=Questa sessione fa il login su un host remoto usando ssh Exec=/usr/local/bin/ssh-session Type=Application
Fontconfig 2.0 è stato creato nel 2002
per fornire una libreria indipendente dalla distribuzione per configurare e
personalizzare l'accesso ai tipi di carattere. Debian a partire da
squeeze
usa Fontconfig
2.0 per la sua configurazione.
Il supporto dei tipi di carattere nel sistema X Window può essere riassunto nel modo seguente.
Sistema datato di supporto dei tipi di carattere dal lato server X
Sistema moderno di supporto dei tipi di carattere dal lato client X
fonts.conf
(5).
Tabella 7.4. Tabella dei pacchetti che supportano i sistemi dei tipi di carattere in X Window
pacchetto | popcon | dimensione | descrizione |
---|---|---|---|
xfonts-utils *
|
V:23, I:71 | 516 | programmi di utilità del sistema X Window per i tipi di carattere |
libxft2 *
|
V:44, I:74 | 148 | Xft, una libreria che connette le applicazioni X con la libreria di rasterizzazione dei caratteri FreeType |
libfreetype6 *
|
V:58, I:87 | 740 | libreria di rasterizzazione dei tipi di carattere FreeType 2.0 |
fontconfig *
|
V:21, I:73 | 472 | Fontconfig, una libreria generica per la configurazione dei tipi di caratteri - binari di supporto |
fontconfig-config *
|
I:81 | 440 | Fontconfig, una libreria generica per la configurazione dei tipi di caratteri - dati di configurazione |
È possibile controllare le informazioni sulla configurazione dei tipi di carattere nei modi seguenti.
xset q
" per il percorso dei tipi di carattere base di
X11
fc-match
" per le impostazioni predefinite per i tipi di
carattere di fontconfig
fc-list
" per l'elenco dei tipi di carattere di
fontconfig disponibili
"The Penguin and Unicode" è una buona panoramica sul sistema X Window moderno. Altra documentazione all'indirizzo http://unifont.org/ dovrebbe fornire buone informazioni su tipi di carattere Unicode, software che gestisce Unicode, internazionalizzazione e problematiche correlate all'uso di Unicode su sistemi operativi free/libre/liberi/open source (FLOSS).
Ci sono due tipi principali di caratteri per computer.
Mentre il ridimensionamento dei caratteri bitmap causa immagini dentellate, il ridimensionamento dei caratteri outline/stroke produce un'immagine pulita.
I caratteri bitmap nel sistema Debian sono di solito forniti da file di caratteri bitmap pcf per X11
compressi, la cui estensione è ".pcf.gz
".
I caratteri outline nel sistema Debian sono forniti dai tipi seguenti.
.pfb
" (file di caratteri binario) e
".afm
" (file della metrica dei caratteri).
.ttf
".
OpenType è pensato per rendere superati sia TrueType sia PostScript Type 1.
Tabella 7.5. Tabella dei tipi di carattere PostScript Type 1
pacchetto con i caratteri | popcon | dimensione | carattere sans serif | carattere serif | carattere monospace | origine del carattere |
---|---|---|---|---|---|---|
PostScript | N/D | N/D | Helvetica | Times | Courier | Adobe |
gsfonts * | V:18, I:66 | 4632 | Nimbus Sans L | Nimbus Roman No9 L | Nimbus Mono L | URW (dimensione Adobe-compatibile) |
gsfonts-x11 * | I:30 | 116 | Nimbus Sans L | Nimbus Roman No9 L | Nimbus Mono L | supporto per i caratteri per X con caratteri PostScript Type 1 |
t1-cyrillic * | I:1.9 | 5008 | Free Helvetian | Free Times | Free Courier | URW esteso (dimensione Adobe-compatibile) |
lmodern * | V:2, I:16 | 45644 | LMSans* | LMRoman* | LMTypewriter* | caratteri PostScript e OpenType scalabili basati su Computer Modern (da TeX) |
Tabella 7.6. Tabella dei tipi di carattere TrueType
pacchetto con i caratteri | popcon | dimensione | carattere sans serif | carattere serif | carattere monospace | origine del carattere |
---|---|---|---|---|---|---|
ttf-mscorefonts-installer * | I:11 | 200 | Arial | Times New Roman | Courier New | Microsoft (dimensione Adobe-compatibile) (Installa dati non liberi) |
ttf-liberation * | I:43 | 1724 | Liberation Sans | Liberation Serif | Liberation Mono | Progetto Liberation Fonts (dimensione Microsoft-compatibile) |
ttf-freefont * | V:10, I:26 | 4204 | FreeSans | FreeSerif | FreeMono | GNU freefont (dimensione Microsoft-compatibile) |
ttf-dejavu * | I:77 | 68 | DejaVu Sans | DejaVu Serif | DejaVu Sans Mono | DejaVu, Bitstream Vera con copertura di Unicode |
ttf-dejavu-core * | I:72 | 2592 | DejaVu Sans | DejaVu Serif | DejaVu Sans Mono | DejaVu, Bitstream Vera con copertura di Unicode (sans, sans-bold, serif, serif-bold, mono, mono-bold) |
ttf-dejavu-extra * | I:69 | 5788 | N/D | N/D | N/D | DejaVu, Bitstream Vera with Unicode coverage (oblique, italic, bold-oblique, bold-italic, condensed) |
ttf-unifont * | I:4 | 16060 | N/D | N/D | unifont | GNU Unifont, con tutti i codici di carattere stampabili in Unicode 5.1 BMP (Basic Multilingual Plane) |
I tipi di carattere DejaVu sono basati sui caratteri Bitstream Vera di cui sono un sovrainsieme.
aptitude
(8) aiuta a trovare facilmente caratteri
aggiuntivi.
~Gmade-of::data:font
"
~nxfonts-
"
~nttf-
"
Dato che i tipi di carattere Liberi sono a volte limitati, l'installazione o la condivisione di caratteri TrueType commerciali è un'opzione da considerare per un utente Debian. Per facilitare ciò sono stati creati alcuni pacchetti di comodo.
ttf-mathematica4.1
ttf-mscorefonts-installer
Si avrà un'ottima selezione di caratteri TrueType al prezzo della contaminazione del proprio sistema Libero con tipi di carattere non-Liberi.
In questa sezione ci sono alcune nozioni fondamentali centrate sull'uso di tipi di carattere con caratteri CJK.
Tabella 7.7. Tabella delle parole chiave usate nei nomi dei tipi di carattere CJK per indicarne il tipo
tipologia del carattere | nome del tipo di carattere in giapponese | nome del tipo di carattere in cinese | nome del tipo di carattere in coreano |
---|---|---|---|
sans-serif | gothic, ゴチック | hei, gothic | dodum, gulim, gothic |
serif | mincho, 明朝 | song, ming | batang |
I tipi di carattere con nomi come "VL PGothic", dove la "P" sta per carattere proporzionale, sono la versione proporzionale dei corrispondenti caratteri a spaziatura fissa, come "VL Gothic".
Per esempio la tabella dei codici Shift_JIS comprende 7070 caratteri che possono essere raggruppati nel modo seguente.
I caratteri a doppio-byte occupano, nei terminali console che usano tipi di
carattere CJK a spaziatura fissa, una larghezza doppia. Per gestire tale
situazione, possono essere usati i file HBF (Hanzi Bitmap Font), con
estensione ".hbf
", per avere tipi di carattere
contententi caratteri a byte-singolo e doppio-byte.
Per risparmiare spazio, per i file di caratteri TrueType, si possono usare file con raccolte di
tipi di carattere TrueType con estensione
".ttc
.
Per gestire complesse spaziature dei caratteri, i tipi di carattere PostScript CID Type 1 sono usati con file CMap
che iniziano con "%!PS-Adobe-3.0 Resource-CMap
". Ciò
viene raramente usato per il normale display X, ma è usato per la resa in
file PDF, ecc. (vedere Sezione 7.7.2, «Applicazioni di utilità per X»).
Per alcuni punti della codifica Unicode sono
presenti glifi multipli, a causa della unificazione Han. Un esmpio di glifi più
problematici sono "U+3001 IDEOGRAPHIC COMMA" e "U+3002 IDEOGRAPHIC FULL
STOP" la cui posizione è diversa tra le nazioni CJK. La configurazione della
priorità dei caratteri pensati per il giapponese, rispetto a quelli cinesi,
usando " ~/.fonts.conf
" dovrebbe dare un po' di pace agli
utenti giapponesi.
Ecco un elenco di applicazioni base per l'ufficio (OO è OpenOffice.org).
Tabella 7.8. Elenco di applicazioni base da ufficio per X
pacchetto | popcon | dimensione del pacchetto | tipo | descrizione |
---|---|---|---|---|
openoffice.org-writer *
|
V:21, I:41 | 26892 | OO | elaboratore di testi |
openoffice.org-calc *
|
V:21, I:40 | 20524 | OO | foglio di calcolo |
openoffice.org-impress *
|
V:18, I:40 | 4208 | OO | presentazioni |
openoffice.org-base *
|
V:16, I:39 | 10708 | OO | gestione di database |
openoffice.org-draw *
|
V:18, I:40 | 10720 | OO | editor di grafica vettoriale (draw) |
openoffice.org-math *
|
V:17, I:40 | 2712 | OO | editor di equazioni matematiche e formule |
abiword *
|
V:6, I:10 | 4776 | GNOME | elaboratore di testi |
gnumeric *
|
V:5, I:11 | 7860 | GNOME | foglio di calcolo |
gimp
*
|
V:12, I:44 | 13560 | GTK | editor di grafica bitmap (paint) |
inkscape *
|
V:15, I:32 | 87436 | GNOME | editor di grafica vettoriale (draw) |
dia-gnome *
|
V:1.4, I:2 | 576 | GNOME | editor di grafi e diagrammi di flusso |
planner *
|
V:0.4, I:4 | 6704 | GNOME | gestione progetti |
kword
*
|
V:0.6, I:1.5 | 5334 | KDE | elaboratore di testi |
kspread *
|
V:0.6, I:1.6 | 8792 | KDE | foglio di calcolo |
kpresenter *
|
V:0.5, I:1.3 | 2877 | KDE | presentazioni |
kexi
*
|
V:0.2, I:1.6 | 7625 | KDE | gestione di database |
karbon *
|
V:0.6, I:1.4 | 2403 | KDE | editor di grafica vettoriale (draw) |
krita
*
|
V:0.6, I:1.6 | 11822 | KDE | editor di grafica bitmap (paint) |
kchart *
|
V:0.8, I:1.9 | 2503 | KDE | programma di disegno di grafici e grafi |
kformula *
|
V:0.4, I:1.3 | 2065 | KDE | editor di equazioni matematiche e formule |
kplato *
|
V:0.15, I:1.4 | 5978 | KDE | gestione progetti |
Ecco un elenco di utilità base che hanno attirato la mia attenzione.
Tabella 7.9. Elenco di applicazioni base di utilità per X
pacchetto | popcon | dimensione del pacchetto | tipo | descrizione |
---|---|---|---|---|
evince *
|
V:26, I:38 | 1116 | GNOME | visualizzatore di documenti (pdf) |
okular *
|
V:4, I:6 | 3408 | KDE | visualizzatore di documenti (pdf) |
evolution *
|
V:16, I:34 | 4724 | GNOME | gestione di informazioni personali (groupware e posta elettronica) |
kontact *
|
V:1.3, I:8 | 1326 | KDE | gestione di informazioni personali (groupware e posta elettronica) |
scribus *
|
V:0.5, I:3 | 26888 | KDE | editor di impaginazione per il desktop |
glabels *
|
V:0.16, I:0.7 | 1148 | GNOME | editor di etichette |
kbarcode *
|
V:0.05, I:0.3 | 2180 | KDE | applicazione per stampa di codici a barre ed etichette |
gnucash *
|
V:0.7, I:2 | 5748 | GNOME | contabilità personale |
homebank *
|
V:0.09, I:0.4 | 1092 | GTK | contabilità personale |
kmymoney2 *
|
V:0.06, I:0.5 | 144 | KDE | contabilità personale |
xsane
*
|
V:5, I:36 | 748 | GTK | frontend per lo scanner |
Per far sì che evince
e okular
visualizzino documenti PDF CJK usando dati Cmap (Sezione 7.6.3, «Tipi di carattere CJK»), deve essere installato il pacchetto
poppler-data
(precedentemente non libero, vedere Sezione 11.3.1, «Ghostscript»).
L'installazione di software come scribus
(KDE)
nell'ambiente desktop GNOME è piuttosto accettabile dato che le funzionalità
corrispondenti non sono disponibili in GNOME. Tuttavia l'installazione di
troppi pacchetti con le stesse funzionalità ingombra il menu.
xmodmap
(1) è un'utilità per modificare mappature di
tastiera e dei pulsanti del dispositivo di puntamento nel sistema X
Window. Per ottenere il codice dei tasti,
eseguire xev
(1) in X e premere i tasti. Per capire il
significato di keysym, guardare la
definizione di MACRO nel file
"/usr/include/X11/keysymdef.h
" (pacchetto
x11proto-core-dev
). Tutte le dichiarazioni
"#define
" in questo file hanno un nome che inizia con
"XK_
" che è seguito da i nomi keysym.
La maggior parte dei programmi client X tradizionali, come
xterm
(1), può essere avviata con un insieme di opzioni a
riga di comando standard per specificare la geometria, il tipo di carattere
e il display.
Usano anche il database delle risorse X per configurare il loro aspetto. I
valori predefiniti a livello di sistema delle risorse X sono memorizzati in
"/etc/X11/Xresources/*
" e i valori predefiniti per le
singole applicazioni sono memorizzati in
"/etc/X11/app-defaults/*
". Usare queste impostazioni come
punto di partenza.
Il file "~/.Xresources
" viene usato per memorizzare
valori specifici dell'utente per le risorse. Questo file viene
automaticamente unito ai valori predefiniti delle risorse X al momento del
login. Per fare cambiamenti a queste impostazioni e rendere attivo
immediatamente il loro effetto, unire le loro impostazioni al database
usando il comando seguente.
$ xrdb -merge ~/.Xresources
Vedere x
(7) e xrdb
(1).
Si può imparare tutto ciò che c'è da sapere su xterm
(1)
all'indirizzo http://dickey.his.com/xterm/xterm.faq.html.
Non avviare mai il gestore di display/sessione X dall'account root digitando
"root
al prompt di un display manager come
gdm
, perché è considerato rischioso (non sicuro), anche
quando si ha in mente di eseguire attività di amministrazione del
sistema. L'intera architettura X è considerata non sicura se eseguita come
utente root. Bisogna sempre utilizzare il livello di privilegi più basso
possibile, come un account di un utente regolare.
Un modo facile di eseguire un particolare client X, ad esempio
"pippo
", come root è l'uso di sudo
(8)
ecc., nel modo seguente.
$ sudo pippo &
$ sudo -s # pippo &
$ gksu pippo &
$ ssh -X root@localhost # pippo &
L'uso di ssh
(1) solo per questo scopo, come nell'esempio
precedente, è uno spreco di risorse.
Per fare sì che il client X si connetta al server X, tenere a mente quanto segue.
$XAUTHORITY
" e
"$DISPLAY
" del vecchio utente devono essere copiati nelle
variabili del nuovo utente.
$XAUTHORITY
".
Il pacchetto gksu
(popcon: V:23, I:46) è un pacchetto
specializzato, con interfaccia utente grafica GTK+, per ottenere i privilegi
di root. Può essere configurato per usare su
(1) o
sudo
(8) come backend, a seconda della chiave di gconf
"/apps/gksu/sudo-mode
". Si può modificare la chiave di
gconf usando gconf-editor
(1) (menu: "Applicazioni" →
"Strumenti di sistema" → "Editor della configurazione").
Il supporto per le lingue native o M17N (Multilingualization) per un software applicativo è ottenuto in 2 passi.
Ci sono 17, 18 o 10 lettere tra le lettere "m" e "n", "i" e "n" o "l" e "n" in, rispettivamente, "multilingualization", "internazionalization" e "localization" che sono i termini inglesi corrispondenti a M17N, I18N e L10N.
Il software moderno, come GNOME e KDE ha il supporto per le lingue native. È
internazionalizzato rendendolo capace di gestire dati UTF-8 e localizzato fornendo i messaggi tradotti
attraverso l'infrastruttura gettext
(1). I messaggi
tradotti possono essere forniti in pacchetti separati di localizzazione e
possono essere selezionati semplicemente impostando al valore di
localizzazione appropriato le variabili d'ambiente pertinenti.
La più semplice rappresentazione di dati testuali è ASCII che è sufficiente per l'inglese ed usa meno di 127 caratteri (rappresentabili con 7 bit). Al fine di supportare molti più caratteri per il supporto internazionale, sono stati inventati molti sistemi di codifica dei caratteri. Il sistema di codifica moderno e intelligente è UTF-8 che può in pratica gestire tutti i caratteri conosciuti (vedere Sezione 8.3.1, «Nozioni base sulla codifica»).
Vedere Introduzione all'i18n per i dettagli.
Il supporto internazionale per l'hardware viene abilitato con dati di configurazione dell'hardware localizzati.
Il sistema Debian può essere configurato per funzionare con molte disposizioni di tastiera internazionali.
Tabella 8.1. Elenco di metodi di riconfigurazione della tastiera
ambiente | comando |
---|---|
Console Linux |
dpkg-reconfigure --priority=low console-data
|
X Window |
dpkg-reconfigure --priority=low xserver-xorg
|
Ciò supporta l'input da tastiera per i caratteri accentati di molte lingue Europee tramite la funzione dead-key. Per le lingue asiatiche, è necessario il supporto per metodi di input più complessi, come IBus che sarà trattato in seguito.
La configurazione dell'input per più lingue per il sistema Debian è
semplificato dall'uso della famiglia di pacchetti IBus con il pacchetto
im-config
. Quello che segue è un elenco dei pacchetti
IBus.
Tabella 8.2. Elenco dei metodi di input supportati da IBus
pacchetto | popcon | dimensione | localizzazioni supportate |
---|---|---|---|
ibus * | V:0.2, I:0.2 | 4220 | infrastruttura per metodo di input che usa dbus |
ibus-anthy * | V:0.04, I:0.10 | 684 | giapponese |
ibus-skk * | V:0.00, I:0.03 | 404 | " " |
ibus-pinyin * | V:0.06, I:0.09 | 1184 | cinese (per zh_CN) |
ibus-chewing * | V:0.01, I:0.02 | 252 | " " (per zh_TW) |
ibus-hangul * | V:0.01, I:0.03 | 216 | coreano |
ibus-table * | V:0.05, I:0.10 | 680 | motore di tabelle per IBus |
ibus-table-thai * | I:0.00 | 156 160 | thailandese |
ibus-unikey * | V:0.00, I:0.00 | 316 | vietnamita |
ibus-m17n * | V:0.02, I:0.05 | 180 | multilingue: indico, arabico e altri |
Il metodo kinput2 e altri classici metodi di input dipendenti dalla localizzazione per le lingue asiatiche esistono sempre, ma non sono raccomandati per i moderni ambienti X UTF-8. Gli insiemi di strumenti SCIM e uim costituiscono un approccio un po' più datato al metodo di input internazionale per gli ambienti X UTF-8 moderni.
Trovo che il metodo di input per il giapponese avviato dall'ambiente inglese
("en_US.UTF-8
") sia molto utile. Ecco come farlo con
Ibus.
ibus-anthy
insieme ai pacchetti che esso raccomanda, come
im-config
.
im-config
" da una shell utente e selezionare
"ibus
".
im-config
".
Notare quanto segue.
im-config
(8) si comporta in modo diverso a seconda se è
eseguito da root o no.
im-config
(8) abilita il miglior metodo di input sul
sistema come impostazione predefinita senza alcuna azione dell'utente.
im-config
(8) è disabilitata in
modo predefinito per evitare sovraffollamenti.
Se si desidera inserire dell'input senza passare da XIM, impostare il valore
di "$XMODIFIERS
" a "none" quando si avvia un
programma. Una situazione di questo tipo potrebbe verificarsi quando si usa
l'infrastruttura di input in giapponese egg
in
emacs
(1). Dalla shell usare il comando seguente.
$ XMODIFIERS=none emacs
Per modificare il comando eseguito dal menu Debian, posizionare una
configurazione personalizzata in "/etc/menu/
" seguendo il
metodo descritto in "/usr/share/doc/menu/html
".
La console Linux può mostrare solamente un numero limitato di caratteri. (È
necessario usare speciali programmi per terminale come
jfbterm
(1) per mostrare lingue non Europee nella console
non-X.)
X Window può mostrare qualsiasi carattere in UTF-8 purché esistano i tipi di carattere richiesti. (La codifica dei dati dei tipi di carattere originali viene gestita dal sistema X Window in modo trasparente per l'utente.)
Questa sezione si concentra sulla localizzazione per applicazioni eseguite
nell'ambiente X Window avviato da gdm
(1).
La variabile d'ambiente "LANG=xx_YY.ZZZZ
" imposta la
localizzazione al codice di lingua "xx
", alla codice di
nazione "yy
" e alla codifica "ZZZZ
"
(vedere Sezione 1.5.2, «Variabile "$LANG
"»).
Il sistema Debian attuale normalmente imposta la localizzazione come
"LANG=xx_YY.UTF-8
" che fa uso della codifica UTF-8 con l'insieme di caratteri Unicode. Il sistema di codifica UTF-8 è un sistema multibyte e usa i punti del codice
in modo intelligente.I dati ASCII, che
consistono solamente di codici a 7 bit, sono comunque dati UTF-8 validi che
usano 1 solo byte per carattere.
I sistemi Debian precedenti impostavano la localizzazione come
"LANG=C
" o "LANG=xx_YY
" (senza
".UTF-8
").
LANG=C
" o "LANG=POSIX
" viene
usato l'insieme di carattteri ASCII.
LANG=xx_YY
".
I sistemi di codifica tradizionale di fatto usati per
"LANG=xx_YY
" possono essere identificati controllando
"/usr/share/i18n/SUPPORTED
". Per esempio,
"en_US
" usa la codifica ISO-8859-1
" e
"it_IT@euro
" usa la codifica
"ISO-8859-15
".
Per il significato dei valori delle codifiche vedere Tabella 11.2, «Elenco dei valori delle codifiche e loro uso».
La codifica UTF-8 è il sistema di codifica moderno e razionale per l'internazionalizzazione e permette di rappresentare i caratteri Unicode, cioè praticamente tutti i caratteri conosciuti. UTF sta per schemi Unicode Transformation Format (formato di trasformazione di Unicode).
È raccomandato l'uso della localizzazione UTF-8
per il desktop, per esempio "LANG=en_US.UTF-8
". La prima
parte della localizzazione determina i messaggi presentati dalle
applicazioni. Per esempio, gedit
(1) (un editor di testi
per il desktop GNOME) nella localizzazione
"LANG=it_IT.UTF-8
" può mostrare e modificare testi in
caratteri cinesi e allo stesso tempo presentare i menu in italiano, a patto
che siano installati i necessari tipi di carattere e metodi di input.
È raccomandabile anche impostare la localizzazione usando solamente la
variabile d'ambiente "$LANG
". Non vedo la convenienza
nell'impostare nella localizzazione UTF-8 una complessa combinazione di
variabili "LC_*
" (vedere locale
(1)).
Anche un testo in semplice inglese può contenere caratteri non ASCII; le virgolette singole destra e sinistra per esempio non sono disponibili in ASCII.
“citazione tra virgolette doppie” ‘citazione tra virgolette singole’
Quando dati di testo in puro ASCII sono convertiti in UTF-8 hanno esattamente gli stessi contenuto e dimensioni dei dati ASCII originali. Perciò non si può perdere nulla usando la localizzazione UTF-8.
Alcuni programmi usano più memoria dopo l'inclusione del supporto per l'internazionalizzazione. Questo avviene perché il loro codice è programmato per usare internamente UTF-32(UCS4) per supportare Unicode al fine di ottimizzare la velocità e consumano 4 byte per ogni dato di carattere ASCII, indipendentemente dalla localizzazione selezionata. Ancora una volta usando la localizzazione UTF-8 non si perde nulla.
I vecchi sistemi di codifica non UTF-8 specifici di produttori, tendono ad avere piccolissime, ma noiose, differenze per molte nazioni in alcuni caratteri come quelli grafici. L'uso del sistema UTF-8 da parte dei sistemi operativi moderni ha praticamente risolto questi problemi di conflitti tra le codifiche.
Per far sì che un sistema abbia accesso ad una localizzazione particolare, è
necessario che i dati della localizzazione siano stati compilati a partire
dal database della localizzazione. (Il sistema Debian non viene fornito con tutte le localizzazioni
disponibili già compilate a meno che non si sia installato il pachetto
locales-all
.) L'elenco completo delle localizzazioni
supportate disponibili per la compilazione è contenuto in
"/usr/share/i18n/SUPPORTED
" che elenca tutti i nomi
esatti delle localizzazioni. Il comando seguente elenca tutte le
localizzazioni UTF-8 già compilate in forma binaria.
$ locale -a | grep utf8
Si può riconfigurare il pacchetto locales
eseguendo il
comando seguente.
# dpkg-reconfigure locales
Questo processo comprende 3 passi successivi.
/etc/defaults/locale
".
L'elenco delle localizzazioni disponibili dobrebbe includere
"en_US.UTF-8
" e tutte le lingue desiderate con
"UTF-8
".
La localizzazione predefinita raccomandata è
"en_US.UTF-8
" per l'inglese statunitense. Per le altre
lingue, assicurasi di scegliere la localizzazione con
"UTF-8
"; ognuna di queste può gestire qualsiasi carattere
internazionale.
Benché l'impostazione della localizzazione a "C
" usi i
messaggi in inglese statunitense, gestisce solo i caratteri ASCII.
Il valore della variabile d'ambiente "$LANG
" viene
impostato e modificato da molte applicazioni.
login
(1)
per i programmi nelle console Linux locali
ssh
(1)
per i programmi nelle console remote
gdm
(1) per
tutti i programmi X
~/.xsessionrc
" per tutti i programmi X (funzionalità di
lenny
)
~/.bashrc
" per tutti i programmi in console
È una buona installare la localizzazione predefinita per tutto il sistema
come "en_US.UTF-8
" per avere la massima compatibilità.
Si può scegliere una localizzazione specifica solo sotto X Window, indipendentemente dalla localizzazione predefinita di sistema, usando la personalizzazione di PAM (vedere Sezione 4.5, «PAM e NSS») nel modo descritto in seguito.
Questo ambiente dovrebbe fornire la migliore esperienza desktop possibile mantenendo la stabilità. Si ha accesso ad un terminale a caratteri funzionante con messaggi leggibili, anche quando il sistema X Window non funziona. Ciò diventa essenziale per le lingue che usano caratteri non romani, come cinese, giapponese e coreano.
Potrebbe essere disponibile un modo alternativo per ottenere lo stesso
risulato, visti i miglioramenti che avvengono nei pacchetti dei gestori
delle sessioni X, ma la lettura di quanto segue fornisce un metodo generico
di base per l'impostazione della localizzazione. Per
gdm
(1), è possibile selezionare la localizzazione della
sessione X dal suo menu.
La riga seguente definisce la posizione del file dell'ambiente della lingua,
nel file di configurazione di PAM, come "/etc/pam.d/gdm
".
auth required pam_env.so read_env=1 envfile=/etc/default/locale
Cambiare tale riga nel modo seguente
auth required pam_env.so read_env=1 envfile=/etc/default/locale-x
Per il giapponese, creare un file
"/etc/defaults/locale-gdm
" permessi "-rw-r--r--
1 root root
" contenente quanto segue.
LANG="ja_JP.UTF-8"
Mantenere il file predefinito "/etc/defaults/locale
" per
l'uso da parte di altri programmi nel modo seguente.
LANG="en_US.UTF-8"
Questa è la tecnica più generica per personalizzare la localizzazione e
rende localizzato il dialogo di selezione stesso del menu di
gdm
(1).
In alternativa in questo caso, si può semplicemente cambiare la
localizzazione usando il file "~/.xsessionrc
".
Per lo scambia di dati interpiattaforma (vedere Sezione 10.1.10, «Supporti di archiviazione removibili»), può essere necessario montare alcuni
file system con codifiche particolari. Per esempio,
mount
(8), se usato senza opzioni, assume che venga usata
la codifica CP437 per il file system vfat. È necessario fornire
esplicitamente opzioni di montaggio per usare nomi di file UTF-8 o CP932.
Quando una chiavetta USB inseribile a caldo viene automaticamente montata in un ambiente desktop moderno come GNOME, si può fornire una informazione di montaggio di questo tipo cliccando con il tasto destro sull'icona del dispositivo sul desktop, cliccare sulla scheda "Drive", cliccare per espandere "Impostazioni" ed inserire "utf8" in "Opzioni di mount:". La prossima volta che questa chiavetta di memoria verrà montata, sarà abilitato il montaggio con UTF-8.
Se si sta facendo l'aggiornamento di un sistema o spostando dischi da un sistema non UTF-8, i nomi di file con caratteri non ASCII potranno essere codificati con codifiche usate una volta e ora deprecate, come ISO-8859-1 o eucJP. Cercare aiuto sugli strumenti di conversione dei testi per convrtirli in UTF-8. Vedere Sezione 11.1, «Strumenti di conversione di dati testuali».
Samba usa in modo predefinito Unicode per i
client più moderni (Windows NT, 200x, XP), ma usa CP850 per client più vecchi (DOS e Windows
9x/Me). Questo comportamento predefinito per i client più vecchi può essere
modificato usando "dos charset
" nel file
"/etc/samba/smb.conf
", per esempio usando "CP932" per il giapponese.
Esistono le traduzioni di molti dei messaggi di testo e dei documenti che sono mostrati nel sistema Debian, come messaggi di errore, output standard dei programmi, menu e pagine di manuale. L'insieme di strumenti GNU gettext(1) è usato come strumento di backend per la maggior parte delle attività di traduzione.
aptitude
(8) fornisce in "Task" → "Localizzazione" un
ampio elenco di utili pacchetti binari che aggiungono alle applicazioni
messaggi localizzati e che forniscono documentazione nella versione
tradotta.
Per esempio, si possono ottenere i messaggi localizzati per le pagine man
installando il pacchetto manpages-<LINGUA>
. Per
leggere le pagine man di <nomeprogramma> in italiano contenute in
"/usr/share/man/it/
", eseguire il comando seguente.
LANG=it_IT.UTF-8 man <nomeprogramma>
La disposizione dell'ordinamento dei caratteri con
sort
(1) è influenzata dalla lingua scelta dalla
localizzazione. Le localizzazioni spagnola e inglese ordinano in modo
diverso.
Il formato della data mostrato da ls
(1) è influenzato
dalla localizzazione. Il formato della data di "LANG=C ls
-l
" è differente da quello con
"LANG=en_US.UTF-8
" (vedere Sezione 9.2.5, «Visualizzazione personalizzata di date e orari»).
I caratteri di punteggiatura usati per i numeri sono diversi nelle varie
localizzazioni. Per esempio, nella localizzazione inglese mille virgola uno
è rappresentato come "1,000.1
", mentre nella
localizzazione in tedesco è mostrato come "1.000,1
". Si
può vedere questa differenza nei programmi per fogli di calcolo.
In questa sezione vengono descritti suggerimenti base per configurare e gestire il sistema, per lo più dalla console.
screen
(1) è uno strumento molto utile per permettere alle
persone di accedere a siti remoti attraverso una connessione non affidabile
o intermittente, dato che supporta connessioni interrotte.
Tabella 9.1. Elenco di programmi che supportano connessioni di rete interrotte
pacchetto | popcon | dimensione | descrizione |
---|---|---|---|
screen *
|
V:11, I:34 | 952 | multiplexer per terminale con emulazione di terminale VT100/ANSI |
screen
(1) non permette solamente il funzionamento di una
finestra di terminale con processi multipli, ma permette anche ai processi in shell remote di sopravvivere a connessioni
interrotte. Quello che segue è un tipico scenario di uso di
screen
(1).
screen
in una consola singola.
screen
create
con ^A c
("Control-A" seguito da "c").
screen
create con
^A n
("Control-A" seguito da "n").
Si può scollegare la sessione
screen
in uno qualsiasi dei metodi seguenti.
^A d
("Control-A" seguito da "d") e fare
manualmente il log out dalla connessione remota.
^A DD
("Control-A" seguito da "DD") per far si
che screen
si scolleghi e faccia il log out.
screen
con "screen -r
".
screen
magicamente ricollega tutte le finestre
screen
precedente con tutti i programmi in esecuzione
attivi.
Con screen
si può risparmiare sui costi di connessioni
per connessioni a tempo, come dial-up o conteggiate a pacchetti, perché si
può lasciare un processo attivo mentre si è disconnessio e poi
ricollegarvisi successivamente quando è possibile connettersi di nuovo.
In una sessione screen
tutto l'input da tastiera viene
inviato alla finestra attuale, tranne per le combinazioni di tasti per i
comandi. Tutte le combinazioni di tasti per i comandi di
screen
vengono inserite digitando ^A
("Control-A") più un singolo tasto [più eventuali parametri]. Ecco alcune
combinazioni di tasti importanti da ricordare.
Tabella 9.2. Elenco di associazioni di tasti per screen
azione associata | significato |
---|---|
^A ?
|
mostra una schermata di aiuto (visualizza le associazioni di tasti) |
^A c
|
crea una nuova finestra e si sposta in essa |
^A n
|
va alla finestra successiva |
^A p
|
va alla finestra precedente |
^A 0
|
va alla finestra numero 0 |
^A 1
|
va alla finestra numero 1 |
^A w
|
mostra l'elenco delle finestre |
^A a
|
invia Ctrl-A alla finestra attuale come input da tastiera |
^A h
|
scrive una copia della schermata della finestra attuale in un file |
^A H
|
inizia/termina la registrazione dell'attività della finestra attuale in un file |
^A ^X
|
blocca il terminale (protetto da password) |
^A d
|
scollega la sessione screen dal terminale |
^A DD
|
scollega la sessione di screen e fa il log out |
Vedere screen
(1) per i dettagli.
Molti programmi registrano le proprie attività nella directory
"/var/log/
".
klogd
(8)
syslogd
(8)
Vedere Sezione 3.5.9, «I messaggi di sistema» e Sezione 3.5.10, «I messaggi del kernel».
Quelli che seguono sono alcuni analizzatori di registro degni di nota
("~Gsecurity::log-analyzer
" in
aptitude
(8)).
Tabella 9.3. Elenco di analizzatori del registro di sistema
pacchetto | popcon | dimensione | descrizione |
---|---|---|---|
logwatch *
|
V:3, I:3 | 2592 | analizzatore di registro scritto on Perl con un bell'output |
fail2ban *
|
V:4, I:5 | 660 | strumento per interdire IP che causano errori di autenticazione multipli |
analog *
|
V:1.0, I:16 | 4520 | analizzatore del registro di server web |
awstats *
|
V:1.8, I:3 | 5200 | analizzatore potente e ricco di funzionalità per registro di server web |
sarg
*
|
V:1.9, I:2 | 644 | generatore di rapporti sull'analisi di squid |
pflogsumm *
|
V:0.3, I:0.7 | 160 | strumento per riassunti delle voci di registro di Postfix |
syslog-summary *
|
V:0.2, I:0.9 | 84 | riassume i contenuti di un file di registro di sistema |
lire
*
|
V:0.15, I:0.17 | 5304 | analizzatore di file di registro e generatore di rapporti ricco di funzionalità |
fwlogwatch *
|
V:0.10, I:0.2 | 440 | analizzatore del registro del firewall |
squidview *
|
V:0.11, I:0.6 | 244 | monitora e analizza i file access.log di squid |
visitors *
|
V:0.09, I:0.3 | 228 | analizzatore veloce del registro di server web |
swatch *
|
V:0.06, I:0.2 | 112 | visualizzatore di file di registro con corrispondenze con espressioni regolari, evidenziazione ed eventi |
crm114 *
|
V:0.06, I:0.18 | 1300 | Controllable Regex Mutilator e filtro per spam (CRM114) |
icmpinfo *
|
V:0.04, I:0.2 | 84 | interpreta i messaggi ICMP |
CRM114 fornisce un'infrastruttura basata su un linguaggio per scrivere filtri fuzzy con la libreria per espressioni regolari TRE. Il suo utilizzo pià comune è come filtro per la posta spazzatura, ma può anche essere usato come analizzatore di registro.
Il semplice uso di script
(1) (vedere Sezione 1.4.9, «Registrare le attività della shell») per registrare l'attività della
shell produce un file con caratteri di controllo. Ciò può essere evitato
usando col
(1) nel modo seguente.
$ script Script è avviato, il file è typescript
Fare tutto quello che si vuole … e poi premere Ctrl-D
per
uscire da script
.
$ col -bx <typescript >filepulito $ vim filepulito
Se script
non è disponibile (per esempio, durante il
processo di avvio in initramfs), si può usare invece il comando seguente.
$ sh -i 2>&1 | tee typescript
Alcuni x-terminal-emulator
(emulatori di terminale in X),
come Terminale di GNOME
hanno la funzione di
registrazione. Si potrebbe voler ampliare il buffer delle righe per
scorrerle all'indietro.
Si può usare screen
(1) con "^A H
"
(vedere Sezione 9.1.2, «Associazioni dei tasti per il comando screen») per
registrare la console.
È possibile usare emacs
(1) con "M-x
shell
", "M-x eshell
" o "M-x
term
" per registrare la console. Si può successivamente usare
"C-x C-w
" per scrivere il buffer in un file.
Sebbene gli strumenti di paginazione, come more
(1) e
less
(1) (vedere Sezione 1.4.5, «Il paginatore») e gli
strumenti personalizzati per l'evidenziazione e la formattazione (vedere
Sezione 11.1.8, «Evidenziare e formattare dati in puro testo») possano
mostrare il testo in un modo piacevole, gli editor generici (vedere Sezione 1.4.6, «L'editor di testo») sono più versatili e personalizzabili.
Per vim
(1) e la sua modalità per paginatore, ossia
view
(1), ":set hls
" abilita la ricerca
con evidenziazione.
Il formato predefinito per la visualizzazione delle date e degli orari per
il comando "ls -l
" dipende dalla localizzazione (vedere Sezione 1.2.6, «Orari» per il valore). Si fa dapprima riferimento alla
variabile "$LANG
" che può essere scavalcata dalla
variabile "$LC_TIME
".
Il formato effettivo di visualizzazione predefinito per ciascuna
localizzazione dipende dalla versione della libreria C (il pacchetto
libc6
) usata. Differenti rilasci di Debian hanno cioè
valori predefiniti diversi.
Se si desidera veramente personalizzare questo formato di visualizzazione
delle date e degli orari, oltre a ciò che è fatto con la localizzazione, si deve impostare il valore dello stile degli orari con l'opzione
"--time-style
" o con il valore di
"$TIME_STYLE
" (vedere ls
(1),
date
(1), "info coreutils 'ls
invocation'
").
Tabella 9.4. Esempi di visualizzazione di date e orari per il comando "ls
-l
" per lenny
valore dello stile per gli orari | localizzazione | visualizzazione di data e ora |
---|---|---|
iso
|
qualsiasi |
01-19 00:15
|
long-iso
|
qualsiasi |
2009-01-19 00:15
|
full-iso
|
qualsiasi |
2009-01-19 00:15:16.000000000 +0900
|
locale
|
C
|
Jan 19 00:15
|
locale
|
en_US.UTF-8
|
2009-01-19 00:15
|
locale
|
es_ES.UTF-8
|
ene 19 00:15
|
+%d.%m.%y %H:%M
|
qualsiasi |
19.01.09 00:15
|
+%d.%b.%y %H:%M
|
C o en_US.UTF-8
|
19.Jan.09 00:15
|
+%d.%b.%y %H:%M
|
es_ES.UTF-8
|
19.ene.09 00:15
|
Si può evitare di digirare lunghe opzioni nella riga di comando usando
alias, per esempio "alias ls='ls --time-style=+%d.%m.%y\
%H:%M'
" (vedere Sezione 1.5.9, «Alias di comandi»).
Per i formati iso viene seguito lo standard ISO 8601.
L'output inviato a schermo dalla shell nella maggior parte dei terminali
moderni può essere colorato usando codici di
escape ANSI (vedere
"/usr/share/doc/xterm/ctlseqs.txt.gz
").
Per esempio, provare a fare quanto segue.
$ RED=$(printf "\x1b[31m") $ NORMAL=$(printf "\x1b[0m") $ REVERSE=$(printf "\x1b[7m") $ echo "${RED}TESTO-ROSSO${NORMAL} ${REVERSE}TESTO-IN-NEGATIVO${NORMAL}"
I comandi colorati sono comodi per ispezionare il loro output in modo
interattivo. Nel mio file "~/.bashrc
" io includo quanto
segue.
if [ "$TERM" != "dumb" ]; then eval "`dircolors -b`" alias ls='ls --color=always' alias ll='ls --color=always -l' alias la='ls --color=always -A' alias less='less -R' alias ls='ls --color=always' alias grep='grep --color=always' alias egrep='egrep --color=always' alias fgrep='fgrep --color=always' alias zgrep='zgrep --color=always' else alias ll='ls -l' alias la='ls -A' fi
Questo uso degli alias limita gli effetti colorati all'uso interattivo dei
comandi. Ha il vantaggio, rispetto all'esportazione della variabile
d'ambiente "export GREP_OPTIONS='--color=auto'
", che i
colori possono essere visti in programmi di paginazione come
less
(1). Se si desidera eliminare i colori quando si
invia l'output con una pipe ad altri comandi, usare nell'esempio precedente
per "~/.bashrc
" "--color=auto
".
Questi alias di colorazione possono essere disattivati nell'ambiente
interattivo invocando la shell con il comando "TERM=dumb
bash
".
È possibile registrare le attività dell'editor per ripetere azioni complesse.
Per vim fare nel modo seguente.
qa
": avviare la registrazione dei caratteri digitati in
un registro chiamato "a
".
q
": terminare la registrazione dei caratteri digitati.
@a
": exeguire il contenuto del registro
"a
".
Per Emacs fare nel modo seguente.
C-x (
": iniziare la definizione di una macro da
tastiera.
C-x )
": terminare la definizione di una macro da
tastiera.
C-x e
": eseguire la definizione di una macro da
tastiera.
Ci sono alcuni modi per registrare l'immagine grafica di un'applicazione X,
incluso il display di un xterm
.
Tabella 9.5. Elenco di strumenti di manipolazione di immagini grafiche
pacchetto | popcon | dimensione | comando |
---|---|---|---|
xbase-clients *
|
V:3, I:47 | 132 |
xwd (1)
|
gimp
*
|
V:12, I:44 | 13560 | menu della GUI |
imagemagick *
|
V:13, I:35 | 268 |
import (1)
|
scrot
*
|
V:0.3, I:1.4 | 80 |
scrot (1)
|
Esistono strumenti specializzati per registrare i cambiamenti nei file di configurazione con l'aiuto del sistema DVCS.
Tabella 9.6. Elenco di pacchetti per registrare la cronologia della configurazione in VCS
pacchetto | popcon | dimensione | descrizione |
---|---|---|---|
etckeeper *
|
V:1.0, I:1.5 | 376 | archivia i file di configurazione ed i loro metadati con Git (predefinito), Mercurial o Bazaar (nuovo) |
changetrack *
|
V:0.07, I:0.09 | 152 | archivia i file di configurazione con RCS (vecchio) |
Io raccomando l'uso del pacchetto etckeeper
con
git
(1) che mette l'intera directory
"/etc
" sotto il controllo di VCS. La sua guida di
installazione ed il suo tutorial si trovano in
"/usr/share/doc/etckeeper/README.gz
".
Fondamentalmente, l'esecuzione di "sudo etckeeper init
"
inizializza il repository git per "/etc
", esattamente
come nel procedimento spiegato in Sezione 10.9.5, «Git per registrare la cronologia della configurazione» ma con speciali script
attivati da eventi per impostazioni più accurate.
Quando si cambia la configurazione, si può usare normalmente
git
(1) per registrare i cambiamenti. Esso registra
automaticamente i cambiamenti in modo comodo anche ogni volta che vengono
eseguiti i comandi di gestione dei pacchetti.
Si può sfogliare la cronologia dei cambiamenti di "/etc
"
eseguendo "sudo GIT_DIR=/etc/.git
" ottenendo una chiara
visualizzazione dei nuovi pacchetti installati, di quelli rimossi e dei
cambiamenti di versione dei pacchetti.
L'avvio del sistema con un CD live Linux o un CD del debian-installer in modalità ripristino rende semplice la riconfigurazione dell'archiviazione dei dati sul dispositivo di avvio. Vedere anche Sezione 10.3, «I dati binari».
Per la configurazione del partizionamento dei
dischi, benché fdisk
(8) sia considerato lo
strumento standard, parted
(8) merita un po' di
attenzione. "Dati di partizionamento del disco", "tabella delle partizioni",
"mappa delle partizioni" e "etichetta del disco" sono tutti sinonimi.
La maggior parte dei PC usa il classico schema basato su MBR (Master Boot Record) per contenere i dati sul partizionamento del disco nel primo settore, cioè il settore LBA 0 (512 byte).
Alcuni PC più recenti con EFI (Extensible Firmware Interface), compresi i Mac basati su Intel, usano lo schema GPT (GUID Partition Table) per contenere i dati sul partizionamento del disco non nel primo settore.
Sebbene fdisk
(8) sia stato lo strumento standard per il
partizionamento dei dischi, parted
(8) lo sta sostituendo.
Tabella 9.7. Elenco di pacchetti di gestione delle partizioni dei dischi
pacchetto | popcon | dimensione | GPT | descrizione |
---|---|---|---|---|
util-linux *
|
V:91, I:99 | 2216 | Non supportato |
utilità di sistema varie inclusi fdisk (8) e
cfdisk (8)
|
parted *
|
V:1.0, I:9 | 236 | Supportato | programma GNU Parted per il ridimensionamento delle partizioni dei dischi |
gparted *
|
V:3, I:31 | 4548 | Supportato |
editor delle partizioni di GNOME basato su libparted
|
qtparted *
|
V:0.10, I:0.9 | NOT_FOUND | Supportato |
editor delle partizioni di KDE basato su libparted
|
gptsync *
|
V:0.01, I:0.18 | 72 | Supportato | sincronizza una tabella delle partizioni MBR classica con una GPT |
kpartx *
|
V:1.0, I:1.8 | 132 | Supportato | programma per creare la mappatura a device per le partizioni |
Sebbene parted
(8) sostenga di creare e ridimensionare
anche i file system, è più sicuro fare queste cose usando gli strumenti
specializzati meglio mantenuti, come mkfs
(8)
(mkfs.msdos
(8), mkfs.ext2
(8),
mkfs.ext3
(8), …) e resize2fs
(8).
Per poter commutare tra GPT e MBR, è necessario cancellare direttamente i primi pochi
blocchi del contenuto del disco (vedere Sezione 10.3.6, «Pulire il contenuto di file») e usare "parted /dev/sdx
mklabel gpt
" o "parted /dev/sdx mklabel msdos
",
per fare il cambiamento. Notare che in questo contesto è usato
"msdos
" per MBR.
Anche se la riconfigurazione delle partizioni o l'ordine di attivazione di supporti di archiviazione removibili può portare ad avere nomi diversi per le partizioni, è possibili accedere ad esse in modo coerente. Ciò è utile anche se sia hanno più dischi ed il BIOS non assegna loro un nome di dispositivo costante.
mount
(8) con l'opzione "-U
" può
montare un device a blocchi usando l'UUID invece
di usare il suo nome di file come "/dev/sda3
".
/etc/fstab
" (vedere fstab
(5))
può usare gli UUID.
Si può scoprire l'UUID di un device a blocchi
speciale con blkid
(8).
I nodi di device dei dispositivi come i supporti di archiviazione rimovibili possono essere resi statici usando regole udev, se necessario. Vedere Sezione 3.5.11, «Il sistema udev».
Per il file system ext3, il pacchetto
e2fsprogs
fornisce gli strumenti seguenti.
I comandi mkfs
(8) e fsck
(8) sono
forniti dal pacchetto e2fsprogs
come front-end per vari
programmi dipendenti dal file syste (mkfs.tipofs
e
fsck.tipofs
). Per il file system ext3 , sono mkfs.ext3
(8) e
fsck.ext3
(8) (sono un collegamento fisico a
mke2fs
(8) e e2fsck
(8)).
Sono disponibili comandi simili per ciascun file system supportato da Linux.
Tabella 9.8. Elenco di pacchetti di gestione dei file system
pacchetto | popcon | dimensione | descrizione |
---|---|---|---|
e2fsprogs *
|
V:60, I:99 | 1924 | utilità per i file system ext2/ext3/ext4 |
reiserfsprogs *
|
V:2, I:8 | 1200 | utilità per i file system Reiserfs |
dosfstools *
|
V:3, I:31 | 192 | utilità per i file system FAT (Microsoft: MS-DOS, Windows) |
xfsprogs *
|
V:2, I:10 | 3272 | utilità per i file system XFS (SGI: IRIX) |
ntfsprogs *
|
V:3, I:20 | 676 | utilità per i file system NTFS (Microsoft: Windows NT, …) |
jfsutils *
|
V:0.5, I:2 | 1112 | utilità per i file system JFS (IBM: AIX, OS/2) |
reiser4progs *
|
V:0.09, I:0.7 | 1264 | utilità per i file system Reiser4 |
hfsprogs *
|
V:0.06, I:0.8 | 316 | utilità per i file system HFS e HFS Plus (Apple: Mac OS) |
btrfs-tools *
|
V:0.3, I:0.6 | 1288 | utilità per i file system btrfs |
zerofree *
|
V:0.10, I:0.7 | 56 | programma per impostare a 0 i blocchi liberi in file system ext2/3 |
Il file system Ext3 è quello predefinito per il
sistema Linux ed il suo uso è caldamente raccomandato a meno che non si
abbiano buone ragioni specifiche per non farlo. A partire dal kernel Linux
2.6.30 (Debian squeeze
), è disponibile anche il file
system ext4 che dovrebbe diventare il prossimo
file system predefinito per Linux. Ancora più in futuro, il file system
btrfs dovrebbe diventare il file system
predefinito per i sistemi Linux dopo ext4.
Dato che ext4 è nuovo potrebbe comportare alcune limitazioni per l'utente; per esempio, è necessario un kernel Linux 2.6.30 o successivo per ridimensionare una partizione ext4.
Alcuni strumenti permettono l'accesso a file system non supportati del kernel Linux (vedere Sezione 10.3.2, «Manipolare file senza montare i dischi»).
In un sistema Linux, il comando mkfs
(8) crea i file
system ed il comando fsck
(8) fornisce funzioni di
controllo dell'integrità e di riparazione dei file system.
In generale l'esecuzione di fsck
su file system montati non è sicura.
Per vedere i risultati del comando fsck
(8) avviato dallo
script di avvio, controllare i file in "/var/log/fsck/
".
Per forzare l'esecuzione del comando fsck
(8) in modo
sicuro su tutti i file system, compreso il file system root, al prossimo
avvio usare "shutdown -F -r now
. Vedere la pagina man di
shutdown
(8) per ulteriori dettagli.
Le prestazioni e le caratteristiche di un file system possono essere
ottimizzate usando per esso opzioni per il montaggio (vedere
fstab
(5) e mount
(8)).Alcune opzioni
importanti sono le seguenti.
defaults
" implica le opzioni predefinite:
"rw,suid,dev,exec,auto,nouser,async
". (Uso generico)
noatime
" o "relatime
" è
molto efficace nel velocizzare l'accesso in lettura. (Uso generico)
user
" permette ad un normale utente di montare
il file system. Questa opzione implica la combinazione di opzioni
"noexec,nosuid,nodev
". (Uso generico, usato per CD e
floppy)
noexec,nodev,nosuid
" è usate
per migliorare la sicurezza. (Uso generico)
noauto
" limita il montaggio solamente a quando
esplicitamente richiesto. (Uso generico)
data=journal
" per ext3fs può migliorare la
salvaguardia dell'integrità dei dati contro interruzioni dell'alimentazione
a prezzo della perdita di un po' di velocità in scrittura.
Per utilizzare una modalità di journaling non predefinita per il file system
root, è necessario fornire i parametri di avvio del kernel (vedere Sezione 3.3, «Stadio 2: il bootloader»), ad esempio
"rootflags=data=journal
". Per lenny
la
modalità di journaling predefinita è
"rootflags=data=ordered
"; per squeeze
è "rootflags=data=writeback
".
Le caratteristiche di un file system possono essere ottimizzate attraverso
il suo superblocco usando il comando tune2fs
(8).
sudo tune2fs -l /dev/hda1
" mostra il
contenuto del superblocco del file system in "/dev/hda1
".
sudo tune2fs -c 50 /dev/hda1
" cambia per
"/dev/hda1
" la frequenza dei controlli dei file system
(l'esecuzione di fsck
all'avvio) a 50 avvii.
sudo tune2fs -j /dev/hda1
" aggiunge la
funzionalità di journaling al file system in "/dev/hda1
",
cioè converte il file system da ext2 a ext3. (Eseguire questo comando su file system non
montati.)
sudo tune2fs -O extents,uninit_bg,dir_index
/dev/hda1 && fsck -pf /dev/hda1
" converte il filesystem in
"/dev/hda1
" da ext3 a ext4. (Eseguire questo comando su file system non
montati.)
La conversione del file system del dispositivo di avvio al file system ext4 dovrebbe essere evitato fino a che il boot loader GRUB non supporti bene il file system ext4 e non sia stata installata la versione 2.6.30, o una più recente, del kernel Linux.
Prima di giocare con la configurazione dei dischi controllare il proprio
hardware e leggere la pagina man di hdparam
(8), perché è
una cosa piuttosto pericolosa per l'integrità dei dati.
Si può testare la velocità di accesso ai dischi di un disco rigido, ad
esempio "/dev/hda
" con "hdparm -tT
/dev/hda
". È possibile velocizzare alcuni dischi fissi connessi
con (E)IDE con "hdparm -q -c3 -d1 -u1 -m16 /dev/hda
" che
abilita il "supporto (E)IDE per I/O a 32 bit", l'uso dell'opzione
"using_dma", imposta l'opzione "interrupt-unmask" e imposta l'"I/O di
settori multipli a 16" (pericoloso!).
Si possono testare le capacità della cache in scrittura di un disco fisso,
ad esempio "/dev/sda
", con "hdparm -W
/dev/sda
". Si può disabilitare la funzionalità di cache in
scrittura con "hdparm -W 0 /dev/sda
".
Potrebbe essere possibile leggere CDROM masterizzati male in unità CD-ROM
moderne ad alta velocità rallentandole con "setcd -x 2
".
Con il demone smartd
(8) è possibile monitorare e
registrare i dischi fissi che sono conformi a SMART.
smartmontools
.
Identificare i dispositivi dei dischi fissi usando df
(1).
/dev/hda
".
Controllare l'output di "smartctl -a /dev/hda
" per vedere
se la funzionalità SMART è veramente abilitata.
smartctl -s on -a /dev/hda
".
Abilitare l'esecuzione del demone smartd
(8) nel modo
seguente.
start_smartd=yes
" nel file
"/etc/default/smartmontools
".
smartd
(8) con il comando
"sudo /etc/init.d/smartmontools restart
".
Il demone smartd
(8) può essere personalizzato con il file
/etc/smartd.conf
, incluso per ciò che riguarda le
notifiche dei messaggi di avvertimento.
Le partizioni create al momento dell'installazione su LVM (Logical Volume Manager (funzionalità di Linux) possono essere facilmente ridimensionate concatenando ad esse delle estensioni o suddividendo le loro estensioni su dispositivi di archiviazione multipli senza riconfigurazioni importanti del sistema.
L'uso del sistema LVM attuale può diminuire le garanzie contro la corruzione del file system offerte dai file system con journaling, come ext3fs, a meno di sacrificare le prestazioni di sistema disabilitando la cache in scrittura dei dischi fissi.
Se è disponibile una nuova partizione vuota (per esempio
"/dev/sdx
"), la si può formattare con
mkfs.ext3
(1) e montarla con mount
(8)
in una directory in cui è necessario avere più spazio. (È necessario copiare
il contenuto originale della directory.)
$ sudo mv dir-da-usare vecchia-dir $ sudo mkfs.ext3 /dev/sdx $ sudo mount -t ext3 /dev/sdx dir-da-usare $ sudo cp -a vecchia-dir/* dir-da-usare $ sudo rm -rf vecchia-dir
In alternativa si può montare un file immagine vuoto del disco (vedere Sezione 10.2.5, «Creare un file con immagine di disco vuoto») come device loop (vedere Sezione 10.2.3, «Montare un file con un'immagine di disco»). Il reale uso del disco cresce mano a mano che vengono archiviati i dati.
Se è disponibile una directory vuota (ad esempio
"/percorso/della/dir-vuota
" in un'altra partizione con
spazio disponibile, si può creare un collegamento simbolico alla directory
con ln
(8).
$ sudo mv dir-da-usare vecchia-dir $ sudo mkdir -p /percorso/della/dir-vuota $ sudo ln -sf /percorso/della/dir-vuota dir-da-usare $ sudo cp -a vecchia-dir/* dir-da-usare $ sudo rm -rf vecchia-dir
Certo software può non funzionare bene con un "collegamento simbolico ad una directory".
Se è disponibile dello spazio utilizzabile in un'altra partizione (ad
esempio "/percorso/della/
"), si può creare in essa una
directory e impilarla nella directory in cui si ha bisogno di spazio usando
aufs.
$ sudo mv dir-da-usare vecchia-dir $ sudo mkdir dir-da-usare $ sudo mkdir -p /percorso/della/dir-vuota $ sudo mount -t aufs -o br:/percorso/della/dir-vuota:vecchia-dir none dir-da-usare
Non è una buona idea usare aufs per archiviazione di dati a lungo termine, dato che è uno strumento in fase di sviluppo e cambiamenti nella sua struttura potrebbero causare problemi.
Avendo l'accesso fisico alla macchina, chiunque può facilmente ottenere privilegi di root e accedere a tutti i file nel PC (vedere Sezione 4.7.4, «Rendere sicura la password di root»). Ciò significa che il sistema delle password di login non può mettere al sicuro i dati privati e sensibili contro un possibile furto del PC. Per farlo deve essere usata una tecnologia di cifratura dei dati. Sebbene GNU Privacy Guard (vedere Sezione 10.4, «Infrastruttura di sicurezza dei dati») possa cifrare file, richiede un po' di lavoro da parte dell'utente.
dm-crypt e eCryptfs facilitano la cifratura automatica dei dati in modo nativo attraverso moduli del kernel Linux con un minimo lavoro da parte dell'utente.
Tabella 9.9. Elenco di utilità per la cifratura dei dati
pacchetto | popcon | dimensione | descrizione |
---|---|---|---|
cryptsetup *
|
V:3, I:5 | 1172 | utilità per device a blocchi cifrati (dm-crypt / LUKS) |
cryptmount *
|
V:0.2, I:0.5 | 360 | utilità per device a blocchi cifrati (dm-crypt / LUKS) con particolare attenzione al montaggio/smontaggio da parte di utenti normali |
ecryptfs-utils *
|
V:0.2, I:0.3 | 416 | utilità per file system stack cifrati (eCryptfs) |
Dm-crypt è un file system crittografico che usa device-mapper. Device mapper mappa un blocco di un device ad un altro.
eCryptfs è un altro file system crittografico che usa un file system stack; quest'ultimo si sovrappone ad una directory esistente in un file system montato.
La cifratura dei dati consuma tempo CPU, ecc. Valutare bene i suoi costi e i benefici.
È possibile installare un intero file system Debian in un disco cifrato con l'Installatore Debian (lenny o successivo) usando dm-crypt/LUKS e initramfs.
Per lo strumento di cifratura in spazio utente GNU Privacy Guard vedere Sezione 10.4, «Infrastruttura di sicurezza dei dati».
Si può cifrare il contenuto di device di memorizzazione di massa removibili,
ad esempio una chiavetta USB in "/dev/sdx
", usando dm-crypt/LUKS. Formattarla semplicemente nel modo seguente.
# badblocks -c 10240 -s -w -t random -v /dev/sdx # shred -v -n 1 /dev/sdx # fdisk /dev/sdx ... "n" "p" "1" "return" "return" "w" # cryptsetup luksFormat /dev/sdx1 ... # cryptsetup luksOpen /dev/sdx1 sdx1 ... # ls -l /dev/mapper/ total 0 crw-rw---- 1 root root 10, 60 2008-10-04 18:44 control brw-rw---- 1 root disk 254, 0 2008-10-04 23:55 sdx1 # mkfs.vfat /dev/mapper/sdx1 ... # cryptsetup luksClose sdx1
Si può poi montarla come una chiavetta qualunque in
"/media/<etichetta_disco>
", tranne per il fatto che
verrà chiesta la password (vedere Sezione 10.1.10, «Supporti di archiviazione removibili») nei moderni ambienti desktop, come
GNOME che usa gnome-mount
(1). La differenza è che ogni
dato scritto in essa è cifrato. In alternativa è possibile formattare il
supporto in un formato diverso, ad esempio ext3 usando "mkfs.ext3
/dev/sdx1
".
Se si è veramente paranoici per ciò che riguarda la sicurezza dei propri dati, potrebbe essere necessario sovrascrivere diverse volte nell'esempio precedente. Questa operazione richiede però parecchio tempo.
In questo esempio si suppone cheil file "/etc/fstab
"
originale contenga quanto segue.
/dev/sda7 swap sw 0 0
Si può abilitare la cifratura della partizione di swap usando dm-crypt nel modo seguente.
# aptitude install cryptsetup # swapoff -a # echo "cswap /dev/sda7 /dev/urandom swap" >> /etc/crypttab # perl -i -p -e "s/\/dev\/sda7/\/dev\/mapper\/cswap/" /etc/fstab # /etc/init.d/cryptdisks restart ... # swapon -a
È possibile cifrare automaticamente i file scritti in
"~/Private/
" usando eCryptfs e il pacchetto
ecryptfs-utils
.
ecryptfs-setup-private
(1) e impostare
"~/Private/
" nei prompt mostrati.
~/Private/
" eseguendo
ecryptfs-mount-private
(1).
Spostare i file con dati sensibili in "~/Private/
" e
creare i collegamenti simbolici necessari.
~/.fetchmailrc
",
"~/.ssh/identity
", "~/.ssh/id_rsa
",
"~/.ssh/id_dsa
" e altri file con permessi
"go-rwx
"
Spostare le directory con dati sensibili in una sottodirectory in
"~/Private/
" e creare i collegamenti simbolici necessari.
~/.gnupg
" e altre directory
con permessi "go-rwx
"
~/Desktop/Private/
"
a "~/Private/
" per facilitare le operazioni dal desktop.
~/Private/
" eseguendo
ecryptfs-umount-private
(1).
~/Private/
" eseguendo
ecryptfs-mount-private
(1) quando sono necessari dati
cifrati..
Dato che eCryptfs cifra selettivamente solo
i file sensibili, il suo costo in termini di risorse di sistema è molto
minore dell'uso di dm-crypt sull'intero
device root o "/home
". Non richiede nessun lavoro
speciale di archiviazione su disco, ma non può mantenere confidenziali tutti
i metadati del file system.
Se si usa la propria password di login come wrapper per le chiavi di cifratura, si può automatizzare il montaggio di eCryptfs tramite PAM (Pluggable Authentication Modules).
Inserire la riga seguente immediatamente prima di
"pam_permit.so
" in
"/etc/pam.d/common-auth
".
auth required pam_ecryptfs.so unwrap
Inserire la riga seguente come ultima riga in
"/etc/pam.d/common-session
".
session optional pam_ecryptfs.so unwrap
Insrire la riga seguente come prima riga attiva in
"/etc/pam.d/common-password
".
password required pam_ecryptfs.so
Ciò risulta molto comodo.
Errori di configurazione di PAM possono lasciare l'utente chiuso fuori dal proprio sistema. Vedere Capitolo 4, Autenticazione.
Se si usa la propria password di login per fare da wrapper alle chiavi di cifratura, i dati cifrati sono sicuri tanto quanto la password di login dell'utente (vedere Sezione 4.3, «Password buone»). A meno che non si scelga prudentemente una password forte, i propri dati saranno a rischio se qualcuno esegue software di forzatura della password dopo aver rubato il portatile (vedere Sezione 4.7.4, «Rendere sicura la password di root»).
Le attività dei programmi possono essere monitorare e controllate usando strumenti specializzati.
Tabella 9.10. Elenco di strumenti per monitorare e controllare l'attività dei programmi.
pacchetto | popcon | dimensione | descrizione |
---|---|---|---|
coreutils *
|
V:92, I:99 | 13828 |
nice (1): esegue un programma con priorità di
schedulazione modificata
|
bsdutils *
|
V:77, I:99 | 196 |
renice (1): modifica la priorità di schedulazione di un
processo in esecuzione
|
procps *
|
V:86, I:99 | 772 |
utilità per il file system "/proc ":
ps (1), top (1),
kill (1), watch (1), …
|
psmisc *
|
V:47, I:88 | 716 |
utilità per il file system "/proc ":
killall (1), fuser (1),
peekfd (1), pstree (1)
|
time
*
|
V:6, I:84 | 152 |
time (1): esegue un programma per riportare l'uso delle
risorse di sistema in funzione del tempo
|
sysstat *
|
V:4, I:9 | 872 |
sar (1), iostat (1),
mpstat (1), …: strumenti per le prestazioni di sistema per
Linux
|
isag
*
|
V:0.07, I:0.4 | 152 | Interactive System Activity Grapher (tracciamento interattivo dell'attivita) per sysstat |
lsof
*
|
V:16, I:90 | 444 |
lsof (8): elenca, usando l'opzione
"-p ", i file aperti da un processo in esecuzione
|
strace *
|
V:5, I:39 | 396 |
strace (1): traccia le chiamate e i segnali di sistema
|
ltrace *
|
V:0.3, I:2 | 188 |
ltrace (1): traccia le chiamate di libreria
|
xtrace *
|
V:0.02, I:0.18 | 372 |
xtrace (1): traccia la comunicazione tra client e server
X11
|
powertop *
|
V:0.7, I:12 | 524 |
powertop (1): informazioni sull'uso dell'alimentazione in
portatili basati su Intel
|
cron
*
|
V:91, I:99 | 240 |
esegue processi dal demone cron (8) sullo sfondo in base
ad una pianificazione
|
anacron *
|
V:41, I:44 | 120 | pianificatore di comandi in stile cron, per i sistemi che non sono in esecuzione 24 ore al giorno |
at
*
|
V:50, I:83 | 220 |
at (1) o batch (1): esegue un compito ad
un orario specificato o quando il carico di sistema scende sotto un certo
livello
|
Il pacchetto procps
fornisce strumenti estremamente di
base per monitorare, controllare ed avviare le attività dei programmi. È
consigliabile imparare ad usarli tutti.
Mostrare il tempo usato dal processo invocato da un comaando.
# time un_qualche_comando >/dev/null real 0m0.035s # tempo di orologio (tempo reale trascorso) user 0m0.000s # tempo in modalità utente sys 0m0.020s # tempo in modalità kernel
Per controllare la priorità di schedulazione di un processo è usato il valore di nice.
Tabella 9.11. Elenco di valori di nice per la priorità di schedulazione
valore di nice | priorità di schedulazione |
---|---|
19 | processo dalla priorità più bassa possibile (nice - gentile) |
0 | processo a priorità molto alta per l'utente |
-20 | processo a priorità molto alta per root (not-nice - non gentile) |
# nice -19 top # molto gentile # nice --20 wodim -v -eject speed=2 dev=0,0 disk.img # molto veloce
A volte un valore molto alto di nice fa più male che bene al sistema; usare quindi questo comando con molta cautela.
Il comando ps
(1) in Debian supporta sia le funzionalità
BSD sia quelle SystemV ed aiuta ad identificare l'attività dei processi in
modo statico.
Tabella 9.12. Elenco degli stili per il comando ps
stile | comando tipico | funzione |
---|---|---|
BSD |
ps aux
|
mostra %CPU %MEM |
System V |
ps -efH
|
mostra PPID |
È possibile uccidere i processi figli zombie (defunti) tramite l'ID di
processo del genitore identificato dal campo "PPID
".
Il comando pstree
(1) mostra un albero dei processi.
top
(1) in Debian ha molte funzionalità e aiuta ad
indentificare in modo dinamico i processi che si stanno comportando in modo
strano.
Tabella 9.13. Elenco dei comandi per top
tasto del comando | descrizione della risposta |
---|---|
h o ?
|
mostra l'aiuto |
f
|
imposta/reimposta i campi mostrati |
o
|
riordina i campi mostrati |
F
|
imposta il campo da usare come chiave di ordinamento |
k
|
uccide un processo |
r
|
modifica il valore di nice di un processo |
q
|
esce dal comando top
|
È possibile elencare tutti i file aperti da un processo attraverso il suo PID (Identificativo di processo), ad esempio 1, con il comando seguente.
$ sudo lsof -p 1
Di solito il processo con PID=1 è il programma init
.
Si può tenere traccia dell'attività di un programma con
strace
(1), ltrace
(1) o
xtrace
(1) rispettivamente per quello che riguarda
chiamate e segnali di sistema, chiamate di libreria o comunicazioni tra
client e server X11.
Si può tenere traccia delle chiamte di sistema del comando
ls
nel modo seguente.
$ sudo strace ls
Usando fuser
(1) è anche possibile identificare i processi
in base ai file usando, ad esempio per
"/var/log/mail.log
" con il comando seguente.
$ sudo fuser -v /var/log/mail.log USER PID ACCESS COMMAND /var/log/mail.log: root 2946 F.... syslogd
Come si vede il file "/var/log/mail.log
" è aperto in
scrittura dal comando syslogd
(8).
Usando fuser
(1) si può anche identificare i processi in
base ai socket, ad esempio per "smtp/tcp
" con il comando
seguente.
$ sudo fuser -v smtp/tcp USER PID ACCESS COMMAND smtp/tcp: Debian-exim 3379 F.... exim4
Ora si può vedere che sul sistema è in esecuzione
exim4
(8) per gestire le connessioni TCP alla porta SMTP (25).
watch
(1) esegue un programma in modo ripetitivo ad
intervalli regolari mostrando il suo output sullo schermo.
$ watch w
Questo comando mostra chi è attualmente connesso al sistema in modo aggiornato ogni 2 secondi.
Ci sono svariati modi di ripetere uno stesso comando su diversi file che
rispondono ad una qualche condizione, ad esempio che corrispondono al
modello glob "*.ext
".
for x in *.ext; do if [ -f "$x"]; then comando "$x" ; fi; done
find
(1) e xargs
(1):
find . -type f -maxdepth 1 -name '*.ext' -print0 | xargs -0 -n 1 comando
find
(1) con l'opzione "-exec
" con un
comando:
find . -type f -maxdepth 1 -name '*.ext' -exec comando '{}' \;
find
(1) con l'opzione "-exec
" con un
breve script di shell:
find . -type f -maxdepth 1 -name '*.ext' -exec sh -c "comando '{}' && echo 'esecuzione con successo'" \;
Gli esempi precedenti sono stati scritti per assicurare la gestione
appropriata di nomi di file particolari come quelli contenenti spazi. Per
usi più avanzati di find
(1), vedere Sezione 10.1.5, «Esempi di invocazione per la selezione di file».
È possibile avviare un processo dalla interfaccia utente grafica (GUI).
Nell'ambiente desktop GNOME, un programma può essere avviato con le opzioni appropriate facendo doppio clic sulla icona del lanciatore, trascinando e rilasciando un'icona di file sull'icona del lanciatore o usando la voce di menu"Apri con …" che si ottiene cliccando con il pulsante destro sull'icona di un file. Anche in KDE si possono fare le azioni equivalenti.
Quello che segue è un esempio per GNOME di creazione di un'icona di
lanciatore per mc
(1) avviato in
gnome-terminal
(1).
Creare un programma "mc-term
" eseguibile nel modo
seguente.
# cat >/usr/local/bin/mc-term <<EOF #!/bin/sh gnome-terminal -e "mc \$1" EOF # chmod 755 /usr/local/bin/mc-term
Creare un lanciatore sul desktop nel modo seguente.
Crea lanciatore…
".
Applicazione
".
mc
".
mc-term %f
".
Creare un'associazione Apri-con nel modo seguente.
Apri
con altra applicazione…
".
mc-term %f
".
Un lanciatore è un file in "~/Desktop
" con estensione
".desktop
".
Alcuni programmi avviano automaticamente altri programmi. Quelli che seguono sono alcuni punti fondamentali per la personalizzazione di questo processo.
Menu di configurazione delle applicazioni:
mc
(1): "/etc/mc/mc.ext
"
$BROWSER
",
"$EDITOR
", "$VISUAL
" e
"$PAGER
" (vedere eviron
(7))
update-alternatives
(8) per i programmi come
"editor
", "view
",
"x-www-browser
", "gnome-www-browser
" e
"www-browser
" (vedere Sezione 1.4.7, «Impostare un editor di testi predefinito»)
~/.mailcap
" e
"/etc/mailcap
" che associano i tipi MIME con programmi (vedere
mailcap
(5))
~/.mime.types
" e
"/etc/mime.types
" che associano le estensioni dei nomi di
file con tipi MIME (vedere
run-mailcap
(1))
update-mime
(8) aggiorna il file
"/etc/mailcap
" usando il file
"/etc/mailcap.order
" (vedere
mailcap.order
(5)).
Il pacchetto debianutils
fornisce
sensible-browser
(1),
sensible-editor
(1) e sensible-pager
(1)
che prendono decisioni sensate riguardo, rispettivamente, a quale browser
web, editor e paginatore invocare. La lettura di questi script di shell è
raccomandata.
Per eseguire un'applicazione per console, come mutt
, come
applicazione preferita in X si dovrebbe creare un'applicazione X nel modo
seguente ed impostare "/usr/local/bin/mutt-term
" come
applicazione preferite da avviare come descritto in precedenza.
# cat /usr/local/bin/mutt-term <<EOF #!/bin/sh gnome-terminal -e "mutt \$@" EOF chmod 755 /usr/local/bin/mutt-term
Per uccidere un processo (o inviare ad esso un segnale) in base al suo ID
(identificativo) usare kill
(1).
Per fare la stessa cosa ma in base al nome del comando del processo o ad
altri attributi, usare killall
(1) o
pkill
(1).
Tabella 9.14. Elenco dei segnali usati comunemente con il comando kill
valore del segnale | nome del segnale | funzione |
---|---|---|
1 | HUP | riavvia il demone |
15 | TERM | normale uccisione |
9 | KILL | uccisione forzata |
Per pianificare un compito da eseguire una volta soltanto eseguire il
comando at
(1) nel modo seguente.
$ echo 'comando -argomenti'| at 3:40 monday
Per pianificare compiti in modo regolare usare
cron
(8). Vedere crontab
(1) e
crontab
(5).
Se si è membri del gruppo crontab
, si può pianificare
l'esecuzione di processi come utente normale, ad esempio l'utente
pippo
, creando un file crontab
(5) come
"/var/spool/cron/crontabs/pippo
" con il comando
"crontab -e
".
Quello seguente è un esempio di file crontab
(5).
# usare /bin/sh per eseguire i comandi, qualsiasi cosa dica /etc/passwd SHELL=/bin/sh # inviare per posta l'output a paolo, chiunque sia il proprietario di questo crontab MAILTO=paolo # Min Ora GiornoMese Mese GiornoSett comando (Giorni... sono combinati con OR) # eseguito alle 00:05, ogni giorno 5 0 * * * $HOME/bin/compito.quotidiano >> $HOME/tmp/output 2>&1 # eseguito alle 14:15 il primo giorno di ogni mese -- output inviato a paolo 15 14 1 * * $HOME/bin/mensile # eseguito alle 22:00 nei giorni infrasettimanali(1-5), disturbare Gianni. % per a capo, ultimo % per cc: 0 22 * * 1-5 mail -s "Sono le 10pm" giannie%Gianni,%%dove sono i tuoi ragazzi?%.%% 23 */2 2 * echo "eseguito 23 minuti dopo le 0am, 2am, 4am ..., il giorno 1 Feb " 5 4 * * sun echo "eseguito alle 04:05 ogni domenica" # eseguito alle 03:40 il primo lunedi' di ogni mese 40 3 1-7 * * [ "$(date +%a)" == "Mon" ] && comando -opzioni
Per i sistemi non in esecuzione in maniera continuata, installare il
pacchetto anacron
per pianificare l'esecuzione di comandi
periodici, in maniera il più possibile vicina agli intervalli specificati,
in base a quanto permesso dal tempo di attività della macchina. Vedere
anacron
(8) e anacrontab
(5).
Gli script con compiti pianificati di amministrazione del sistema possono
essere eseguiti periodicamente dall'account di root, ponendoli in
"/etc/cron.hourly/
",
"/etc/cron.daily/
",
"/etc/cron.weekly/
" o
"/etc/cron.monthly/
". L'orario di esecuzione di questi
script può essere personalizzato con "/etc/crontab
" e
"/etc/anacrontab
".
L'opzione "Magic SysRq key" (tasto R Sist), di compilazione del kernel, che è ora lo standard per i kernel Debian, fornisce una garanzia contro i malfunzionamenti del sistema. Premendo Alt-R Sist seguito da uno dei tasti seguenti, si ottiene magicamente di recuperare il controllo del sistema.
Tabella 9.15. Elenco di tasti per il comando SAK
tasto premuto dopo Alt-R_Sist | descrizione della azione |
---|---|
r
|
ripristina la tastiera dalla modalità raw dopo un crash di X |
0
|
cambia il livello di visualizzazione del registro sulla console a 0 per ridurre i messaggi di errore |
k
|
uccide (kill) tutti i processi nella console virtuale attuale |
e
|
invia un segnale SIGTERM a tutti i
processi, tranne init (8)
|
i
|
invia un segnale SIGKILL a tutti i
processi, tranne init (8)
|
s
|
sincronizza tutti i file system montati |
u
|
monta nuovamente tutti i file system in sola letturra (umount) |
b
|
riavvia (reboot) il sistema senza sincronizzare o smontare i file system |
La combinazione di "Alt-R_Sist s", "Alt-R_Sist u" e "Alt-R_Sist r" è buona per uscire da situazioni veramente brutte.
Vedere
"/usr/share/doc/linux-doc-2.6.*/Documentation/sysrq.txt.gz
".
La funzione Alt-R_Sist può essere considerata un rischio per la sicurezza
dato che permette agli utenti l'accesso a funzioni con privilegi di
root. Per disabilitale la funzione Alt-R_Sist mettere "echo 0
>/proc/sys/kernel/sysrq
" in "/etc/rc.local
"
o "kernel.sysrq = 0
" in
"/etc/sysctl.conf
".
Si può usare la funzione Alt-R_Sist da un terminale SSH, ecc. scrivendo su
"/proc/sysrq-trigger
". Per esempio, "echo s >
/proc/sysrq-trigger; echo u > /proc/sysrq-trigger
" dal prompt
di shell di root sincronizza ed esegue
umount per tutti i file system montati.
Si può controllare chi è connesso al sistema nei modi seguenti.
who
(1) mostra chi ha fatto il login ed è ancora
connesso.
w
(1) mostra l'elenco di chi ha fatto il login ed è
connesso e cosa sta facendo.
last
(1) mostra l'elenco degli utenti che hanno fatto il
login più recentemente.
lastb
(1) mostra l'elenco degli utenti che hanno tentato
il login non riuscendovi più recentemente.
Queste informazioni sugli utenti sono contenute in
"/var/run/utmp
", "/var/log/wtmp
" e
"/var/run/utmp
". Vedere login
(1) e
utmp
(5).
Si può mandare un messaggio a tutti gli utenti che sono connessi al sistema
con wall
(1) nel modo seguente.
$ echo "Arresto pianificato del sistema tra 1 ora" | wall
Per i dispositivi di tipo simile PCI (AGP, PCI-Express,
CardBus, ExpressCard, ecc.), lspci
(8)
(probabilmente con l'opzione "-nn
") è un buon punto di
partenza per l'identificazione dell'hardware.
In alternativa, si può identificare l'hardware leggendo il contenuto di
"/proc/bus/pci/devices
" o sfogliando l'albero di
directory in "/sys/bus/pci
" (vedere Sezione 1.2.12, «procfs e sysfs»).
Tabella 9.16. Elenco di strumenti per l'identificazione dell'hardware
pacchetto | popcon | dimensione | descrizione |
---|---|---|---|
pciutils *
|
V:15, I:92 | 908 |
utilità PCI Linux: lspci (8)
|
usbutils *
|
V:38, I:97 | 604 |
utilità Linux USB: lsusb (8)
|
pcmciautils *
|
V:0.8, I:13 | 100 |
utilità PCMCIA per Linux 2.6: pccardctl (8)
|
scsitools *
|
V:0.18, I:1.1 | 484 |
raccosta di strumenti per la gestione dell'hardware
SCSI:lsscsi (8)
|
pnputils *
|
V:0.01, I:0.16 | 108 |
utilità BIOS Plug and Play: lspnp (8)
|
procinfo *
|
V:0.3, I:3 | 164 |
informazioni sul sistema ottenute da "/proc ":
lsdev (8)
|
lshw
*
|
V:1.2, I:7 | 604 |
informazioni sulla configurazione hardware: lshw (1)
|
discover *
|
V:2, I:15 | 120 |
sistema di identificazione dell'hardware: discover (8)
|
Sebbene nei moderni sistemi desktop con interfaccia grafica, come GNOME e KDE, la maggior parte della configurazione dell'hardware possa essere gestita attraverso strumenti di configurazione con interfaccia grafica da essi forniti, è bene conoscere alcuni metodi di base di configurazione.
Tabella 9.17. Elenco di strumenti di configurazione dell'hardware
pacchetto | popcon | dimensione | descrizione |
---|---|---|---|
hal
*
|
V:37, I:49 | 1668 |
HAL (Hardware Abstraction Layer): lshal (1)
|
console-tools *
|
V:47, I:84 | 956 | utilità Linux per i tipi di carattere e la mappa di tastiera in console |
x11-xserver-utils *
|
V:34, I:51 | 544 |
utilità del server X: xset (1),
xmodmap (1)
|
acpid
*
|
V:51, I:91 | 208 | demone per gestire eventi inviati dall'ACPI (Advanced Configuration and Power Interface, interfaccia avanzata per configurazione ed energia) |
acpi
*
|
V:4, I:35 | 92 | utilità per mostrare informazioni sui device ACPI |
apmd
*
|
V:1.2, I:11 | 252 | demone per gestire eventi inviati dall'APM (Advanced Power Management, gestione avanzata dell'energia) |
noflushd *
|
V:0.04, I:0.09 | 248 | demone per permettere di fermare la rotazione dei dischi fissi inattivi |
sleepd *
|
V:0.07, I:0.09 | 148 | demone per sospendere un portatile durante l'inattività |
hdparm *
|
V:11, I:38 | 304 | ottimizzazione degli accessi al disco fisso (vedere Sezione 9.3.7, «Ottimizzare il disco rigido») |
smartmontools *
|
V:7, I:23 | 1076 | controllo e monitoraggio dei sistemi di archiviazione usando S.M.A.R.T. |
setserial *
|
V:1.5, I:3 | 180 | raccolta di strumenti per la gestione delle porte seriali |
memtest86+ *
|
V:0.5, I:5 | 652 | raccolta di strumenti per la gestione di hardware di memoria |
scsitools *
|
V:0.18, I:1.1 | 484 | raccolta di strumenti per la gestione di hardware SCSI |
tpconfig *
|
V:0.3, I:0.5 | 220 | utilità per configurare i dispositivi touchpad |
setcd
*
|
V:0.06, I:0.3 | 28 | ottimizzazione dell'accesso alle unità CD |
big-cursor *
|
I:0.16 | 68 | puntatori del mouse più grandi per X |
ACPI è un'infrastruttura per il sistema di gestione dell'energia più nuovo di APM
La modifica della frequenza della CPU nei sistemi moderni è controllata da
moduli del kernel come acpi_cpufreq
.
I comandi seguenti impostano l'ora di sistema e hardware a MM/GG hh:mm, AAAA.
# date MMGGhhmmAAAA # hwclock --utc --systohc # hwclock --show
Nei sistemi Debian, gli orari sono mostrati normalmente come ora locale, ma l'ora di sistema e quella hardware usano di solito l'ora UT(GMT).
Se l'ora hardware (BIOS) è impostata ad UT, modificare l'impostazione nel
file "/etc/default/rcS
" ad "UTC=yes
".
Se si desidera tenere aggiornata l'ora di sistema attraverso la rete, si
consideri l'uso del servizion NTP con pacchetti
come ntp
, ntpdate
e
chrony
.
Vedere la documentazione seguente.
ntp-doc
ntptrace
(8), nel pacchetto ntp
può
tracciare una catena di server NTP all'indietro fino alla fonte originaria.
Ci sono diversi componenti per configurare le funzionalità della console a
caratteri e il sistema ncurses
(3).
/etc/terminfo/*/*
"
(terminfo
(5))
$TERM
"
(term
(7))
setterm
(1), stty
(1),
tic
(1) e toe
(1)
:(Se, con un xterm
non Debian, la voce
terminfo
per xterm
non funziona,
cambiare il tipo di terminale "$TERM
" da
"xterm
" ad una delle versioni con funzionalità limitate
come "xterm-r6
" quando si fa il login ad un sistema
Debian da remoto. Per ulteriori iedere
"/usr/share/doc/libncurses5/FAQ
" .
I driver di dispositivo per le schede audio per l'attuale Linux 2.6 sono forniti da ALSA (Advanced Linux Sound Architecture). ALSA fornisce una modalità di emulazione per la compatibilità con il precedente sistema OSS (Open Sound System).
Eseguire "dpkg-reconfigure linux-sound-base
" per
selezionare l'uso di ALSA per il sistema audio attraverso l'inserimento in
una lista nera di moduli del kernel. A meno di avere hardware audio
estremamente recente, l'infrastruttura udev dovrebbe configurare il sistema
audio.
Per testare l'altoparlante usare "cat /dev/urandom >
/dev/audio
" oppure speaker-test
(1). (^C per
interrompere)
Se non si ottiene l'audio, è possibile che l'altroparlante sia connesso ad
un output impostato come muto. I moderni sistemi sonori hanno svariati
output. alsamixer
(1) nel pacchetto
alsa-utils
è utile per configurare le impostazioni del
volume e di muto.
I software applicativi possono essere configurati non solo per accedere direttamente a device audio, ma anche per accedervi attraverso un qualche sistema server sonoro standardizzato.
Tabella 9.18. Elenco di pacchetti relativi all'audio
Normalmente esiste un motore audio comune per ciascun ambiente desktop. Ciascun motore audio usato dalle applicazioni può scegliere di connettersi a diversi server audio.
Per disabilitare il salvaschermo usare i comandi seguenti.
Tabella 9.19. Elenco di comandi per disabilitare il salvaschermo
ambiente | comando |
---|---|
Console Linux |
setterm -powersave off
|
X Window (disabilitare il salvaschermo) |
xset s off
|
X Window (disabilitare DPMS) |
xset -dpms
|
X Window (configurazione tramite GUI del salvaschermo) |
xscreensaver-command -prefs
|
Per disabilitare i bip sonori è sempre possibile disconnettere
l'altoparlante del PC; la rimozione del modulo pcspkr
del
kernel fa stessa cosa per conto dell'utente.
Il comando seguente evita che il programma readline
(3)
usato da bash
(1) emetta suoni bip quando incontra
"\a
" (ASCII=7).
$ echo "set bell-style none">> ~/.inputrc
I messaggi di avvio del kernel nel file "/var/log/dmesg
"
contengono la dimensione esatta della memoria disponibile.
free
(1) e top
(1) mostrano informazioni
sulle risorse di memoria nel sistema mentre è in funzione.
$ grep '\] Memory' /var/log/dmesg [ 0.004000] Memory: 990528k/1016784k available (1975k kernel code, 25868k reserved, 931k data, 296k init) $ free -k total used free shared buffers cached Mem: 997184 976928 20256 0 129592 171932 -/+ buffers/cache: 675404 321780 Swap: 4545576 4 4545572
Non ci si deve preoccupare della grande dimensione del valore
"used
" (usata) e della piccolo valore di
"free
" (libera) nella riga "Mem:
", ma
si può invece leggere la riga sottostante (con 675404 e 321780 nell'esempio
precedente) e rilassarsi.
Per il mio MacBook con 1GB=1048576k DRAM (il sistema video ne ruba un po'), vedo le informazioni seguenti.
Tabella 9.20. Elenco di dimensioni della memoria riportate
fonte | dimensione |
---|---|
Dimensione totale in dmesg | 1016784k = 1GB - 31792k |
Libera in dmesg | 990528k |
Dimensione totale nella shell | 997184k |
Libera nella shell | 20256k (ma in effetti 321780k) |
Una cattiva manutenzione del sistema può esporlo ad attacchi esterni.
Per verificare la sicurezza e l'integrità del sistema, si dovrebbe iniziare dai punti seguenti.
debsums
. Vedere
debsums
(1) e Sezione 2.5.2, «File "Release" nella directory principale ed autenticità».
chkrootkit
. Vedere
chkrootkit
(1).
clamav
. Vedere
clamscan
(1) e freahclam
(1).
Tabella 9.21. Elenco di strumenti per verificare la sicurezza e l'integrità del sistema
pacchetto | popcon | dimensione | descrizione |
---|---|---|---|
logcheck *
|
V:3, I:3 | 152 | demone per inviare via posta anomalie nei file di registro di sistema all'amministratore |
debsums *
|
V:2, I:3 | 320 | utilità per controllare i file dei pacchetti installati con le somme di controllo MD5 |
chkrootkit *
|
V:2, I:6 | 808 | rilevatore di rootkit |
clamav *
|
V:2, I:11 | 616 | utilità anti-virus per Unix - interfaccia a riga di comando |
tiger
*
|
V:0.8, I:1.0 | 3148 | riporta vulnerabilità nella sicurezza di sistema |
tripwire *
|
V:0.6, I:0.7 | 9456 | strumento di controllo dell'integrità di file e directory |
john
*
|
V:0.7, I:2 | 532 | strumento di violazione delle password attive |
aide
*
|
V:0.2, I:0.4 | 1213 | AIDE - ambiente avanzato di rilevamento delle intrusioni - binario statico |
bastille *
|
V:0.12, I:0.4 | 1960 | strumento di rafforzamento della sicurezza |
integrit *
|
V:0.08, I:0.16 | 440 | programma di controllo dell'integrità di file |
crack
*
|
V:0.03, I:0.2 | 204 | programma per indovinare password |
Con il piccolo script seguente è possibile controllare la presenza di tipici errori con permessi di scrittura per tutti per i file sbagliati.
# find / -perm 777 -a \! -type s -a \! -type l -a \! \( -type d -a -perm 1777 \)
Data che il pacchetto debsums
usa le somme di controllo
MD5 salvate localmente, non può essere
completamente affidabile come strumento di controllo della sicurezza del
sistema contro attacchi malevoli.
Debian distribuisce, per le architetture supportate, kernel Linux modulari contenuti in pacchetti.
Nel kernel Linux 2.6 ci sono alcune funzionalità degne di nota rispetto alla versione 2.4.
ide-scsi
.
iptable
del kernel.
Molte caratteristiche di Linux possono essere configurate tramite parametri del kernel, nei modi seguenti.
syscrl
(8) durante l'esecuzione del sistema.
modprobe
(8) al momento dell'attivazione di un modulo
(vedere Sezione 10.2.3, «Montare un file con un'immagine di disco»)
Vedere "kernel-parameters.txt(.gz)
" e altri documenti
correlati nella documentazione del kernel Linux
("/usr/share/doc/linux-doc-2.6.*/Documentation/filesystems/*
")
fornita dai pacchetti linux-doc-2.6.*
.
La maggior parte dei normali programmi
non ha bisogno degli header del kernel per essere compilata, anzi di fatto
può corrompersi se si usano direttamente gli header. Questi programmi
dovrebbero essere compilati nel sistema Debian usando gli header in
"/usr/include/linux
" e
"/usr/include/asm
" forniti dal pacchetto
libc6-dev
(creato dal pacchetto sorgente
glibc
).
Per compilare alcuni programmi specifici per il kernel, come moduli per il
kernel da fonti esterne e il demone automounter (amd
), è
necessario includere nella propria riga di comando il percorso ai
corrispondenti header del kernel, ad esempio
"-I/usr/src/linux-particular-version/include/
".
module-assistant
(8) (o la suo forma abbbreviata
m-a
) aiuta l'utente a compilare ed installare pacchetti
di moduli in modo semplice per uno o più kernel personalizzati.
Debian ha un proprio metodo di compilazione del kernel e dei moduli relativi.
Tabella 9.22. Elenco di pacchetti chiave da installare per la ricompilazione del kernel in un sistema Debian
pacchetto | popcon | dimensione | descrizione |
---|---|---|---|
build-essential *
|
I:47 | 48 |
pacchetti essenziali per compilare pacchetti Debian:
make , gcc , …
|
bzip2
*
|
V:51, I:79 | 132 | utilità di compressione e decompressione per file bz2 |
libncurses5-dev *
|
V:4, I:25 | 6900 | librerie di sviluppo e documentazione per ncurses |
git
*
|
V:5, I:17 | 10632 | git: sistema distribuito di controllo delle revisioni usato dal kernel Linux |
fakeroot *
|
V:4, I:32 | 444 | fornisce un ambiente fakeroot per compilare pacchetti da utente non root |
initramfs-tools *
|
V:49, I:98 | 468 | strumento per compilare un initramfs (specifico di Debian) |
kernel-package *
|
V:1.5, I:14 | 2316 | strumento per compilare pacchetti con kernel Linux (specifico di Debian) |
module-assistant *
|
V:2, I:18 | 568 | strumento per aiutare a compilare pacchetti con moduli (specifico di Debian) |
dkms
*
|
V:6, I:9 | 468 | DKMS (Dynamic Kernel Module Support, supporto dinamico per i noduli del kernel) (generico) |
devscripts *
|
V:2, I:11 | 1696 | script di aiuto per i manutentori di pacchetti Debian (specifico di Debian) |
linux-tree-2.6.*
|
N/D | N/D | pacchetto con l'albero dei sorgenti del kernel Linux (specifico di Debian) |
Se si usa initrd
nello Sezione 3.3, «Stadio 2: il bootloader», ci si assicuri di leggere le
informazioni relative in initramfs-tools
(8),
update-initramfs
(8), mkinitramfs
(8) e
initramfs.conf
(5).
Quando si compilano i sorgenti del kernel Linux, non mettere collegamenti
simbolici alle directory nell'albero dei sorgenti (ad esempio,
"/usr/src/linux*
") in
"/usr/include/linux
" e
"/usr/include/asm
". (Alcuni documenti ormai datati
suggeriscono di farlo.)
Quando si compila il kernel Linux più recente nel sistema Debian
stable
, potrebbe essere necessario l'uso delle versioni
backport degli strumenti piu recenti da Debian unstable
.
Il DKMS (Dynamic Kernel Module
Support, supporto dinamico per i moduli del kernel) è un nuova
infrastruttura indipendente dalla distribuzione progettata per permettere
l'aggiornamento di singoli moduli del kernel senza cambiare tutto il
kernel. Verrà utilizzata per squeeze
per il mantenimento
dei moduli esterni all'albero dei sorgenti. Rende anche molto facile la
ricompilazione dei moduli quando si aggiornano i kernel.
Il metodo Debian standard per compilare i sorgenti del kernel per creare un
pacchetto con kernel personalizzato usa make-kpkg
(1). La
documentazione ufficiale è nel file
"/usr/share/doc/kernel-package/README.gz
" (alla
fine). Per la personalizzazione vedere kernel-pkg.conf
(5)
e kernel-img.conf
(5).
Questo è un esempio per un sistema amd64.
# aptitude install linux-tree-<versione> $ cd /usr/src $ tar -xjvf linux-source-<versione>.tar.bz2 $ cd linux-source-<versione> $ cp /boot/config-<vecchiaversione> .config $ make menuconfig ... $ make-kpkg clean $ fakeroot make-kpkg --append_to_version -amd64 --initrd --revision=rev.01 kernel_image modules_image $ cd .. # dpkg -i linux-image*.deb
Riavviare il sistema con il nuovo kernel con "shutdown -r
now
".
Quando si vuole creare un kernel non-modulare compilato per una sola
macchina, invocare make-kpkg
senza l'opzione
"--initrd
", dato che initrd non è in quel caso usato. Non
è necessario invocare i comandi "make oldconfig
" e
"make dep
" dato che sono invocati da "make-kpkg
kernel_image
".
Il metodo Debian standard per creare ed installare un pacchetto con un
modulo personalizzato per un pacchetto con kernel personalizzato fa uso dei
pacchetti module-assistant
(8) e module-source. Ad esempio
i comandi seguenti compilano ed installano il pacchetto per il modulo
unionfs
per il kernel.
$ sudo aptitude install module-assistant ... $ sudo aptitude install unionfs-source unionfs-tools unionfs-utils $ sudo m-a update $ sudo m-a prepare $ sudo m-a auto-install unionfs ... $ sudo apt-get autoremove
È sempre possibile compilare il kernel Linux dai sorgenti originali con il metodo classico. In questo caso è necessario prendersi cura manualmente dei dettagli della configurazione del sistema.
$ cd /usr/src $ wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-<versione>.tar.bz2 $ tar -xjvf linux-<versione>.tar.bz2 $ cd linux-<versione> $ cp /boot/config-<versione> .config $ make menuconfig ... $ make dep; make bzImage $ make modules # cp ./arch/x86_64/boot/bzImage /boot/vmlinuz-<versione> # make modules_install # depmod -a # update-initramfs -c -k <versione>
Impostare il bootloader in uno dei modi seguenti.
/etc/lilo.conf
" ed eseguire
"/sbin/lilo
", se si usa lilo
.
/boot/grub/menu.lst
", se si usa
grub
.
Riavviare il sistema con il nuovo kernel con "shutdown -r
now
".
Sebbene la maggior parte dei driver per l'hardware sia disponibile come software libero e come parte del sistema Debian, potrebbe essere necessario caricare alcuni driver non liberi esterni per supportare dell'hardware specifico, come Winmodem, sul proprio sistema.
Controllare le risorse di informazioni pertinenti.
L'uso di sistemi virtualizzati permette di eseguire più istanze di un sistema simultaneamente su un singolo hardware.
Ci sono diversi pacchetti in Debian relativi alla virtualizzazione ed emulazione di sistema che vanno oltre il semplice chroot. Alcuni pacchetti aiutano anche nell'impostazione di tali sistemi.
Tabella 9.23. Elenco di strumenti di virtualizzazione
pacchetto | popcon | dimensione | descrizione |
---|---|---|---|
schroot *
|
V:1.0, I:1.6 | 2460 | strumento specializzato per eseguire pacchetti Debian binari in chroot |
sbuild *
|
V:0.11, I:0.3 | 428 | strumento per compilare pacchetti Debian binari da sorgenti Debian |
pbuilder *
|
V:0.5, I:2 | 1192 | creatore di pacchetti personali per pacchetti Debian |
debootstrap *
|
V:1.6, I:12 | 268 | avviare un sistema Debian base (scritto in sh) |
cdebootstrap *
|
V:0.3, I:2 | 116 | avviare un sistema Debian (scritto in C) |
rootstrap *
|
V:0.02, I:0.17 | 156 | strumento per creare immagini complete di un file system Linux |
virt-manager *
|
V:0.5, I:1.6 | 5908 | Virtual Machine Manager: applicazione desktop per gestire macchine virtuali |
libvirt-bin *
|
V:1.4, I:2 | 2240 | programmi per la libreria libvirt |
user-mode-linux *
|
V:0.07, I:0.3 | 20540 | Linux User-mode (kernel) |
bochs
*
|
V:0.05, I:0.3 | 3280 | Bochs: emulatore PC IA-32 |
qemu
*
|
V:0.6, I:6 | 460 | QEMU: veloce emulatore generico di processore |
qemu-system *
|
V:2, I:3 | 38196 | QEMU: binari per emulazione completa del sistema |
qemu-user *
|
V:0.3, I:3 | 16716 | QEMU: binari per emulazione in spazio utente |
qemu-utils *
|
V:0.4, I:3 | 756 | QEMU: utilità |
qemu-kvm *
|
V:1.3, I:2 | 4308 | KVM: virtualizzazione completa su hardware x86 convirtualizzazione assistita da hardware |
virtualbox-ose *
|
V:2, I:4 | 31728 | VirtualBox: soluzione per virtualizzazione i dx86 su i386 e amd64 |
xen-tools *
|
V:0.2, I:1.9 | 1236 | strumenti per gestire server virtuali XEN Debian |
wine
*
|
V:1.7, I:13 | 96 | Wine: implementazione della API Windows (suite standard) |
dosbox *
|
V:0.5, I:2 | 2460 | DOSBox: emulatore x86 con grafica Tandy/Herc/CGA/EGA/VGA/SVGA, suono e DOS |
dosemu *
|
V:0.2, I:1.2 | 5940 | DOSEMU: emulatore DOS di Linux |
vzctl
*
|
V:0.7, I:1.1 | 1056 | OpenVZ, soluzione per virtualizzazione server - strumenti di controllo |
vzquota *
|
V:0.7, I:1.2 | 204 | OpenVZ, soluzione per virtualizzazione server - strumenti per quote |
lxc
*
|
V:0.05, I:0.2 | 744 | strumenti in spazio utente per contenitori Linux containers |
Vedere l'articolo di Wikipedia Comparison of platform virtual machines per una comparazione dettagliata di diverse soluzioni per la virtualizzazione di piattaforme.
Alcune funzionalità descritte in seguito sono disponibili solamente in
squeeze
.
I kernel Debian predefiniti hanno il supporto per KVM a partire da lenny
.
Il tipico processo di virtualizzazione comporta diverse fasi.
Creare un file system vuoto (un albero di file o un'immagine di disco).
mkdir -p
/percorso/di/chroot
".
dd
(1) (vedere Sezione 10.2.1, «Creare un file con un'immagine di disco» e Sezione 10.2.5, «Creare un file con immagine di disco vuoto»).
qemu-img
(1) per creare e convertire file
immagine di dischi supportati da QEMU.
Montare l'immagine del disco con mount
(8) nel file system
(opzionale).
Popolare il file system obiettivo con i dati di sistema necessari.
debootstrap
e
cdebootstrap
aiuta questo processo (vedere Sezione 9.8.4, «Sistema chroot»).
Eseguire un programma in un ambiente virtualizzato.
Per i file immagine raw di disco, vedere Sezione 10.2, «Immagine del disco».
Per altri file immagine di dischi virtuali, si può usare
qemu-nbd
(8) per esportarli usando il protocollo per
device a blocchi di rete e
montarli usando il modulo nbd
del kernel.
qemu-nbd
(8) supporta i formati di disco supportati da
QEMU; QEMU supporta
i seguenti formati di dischi: raw, qcow2,
qcow, vmdk, vdi, bochs, cow
(copy-on-write di user-mode Linux), parallels, dmg, cloop, vpc, vvfat (VFAT
virtuale) e host_device.
I device a blocchi di rete possono
supportare partizioni nello stesso modo dei device loop (vedere Sezione 10.2.3, «Montare un file con un'immagine di disco»). Si può montare la prima
partizione di "disk.img
" nel modo seguente.
# modprobe nbd max_part=16 # qemu-nbd -v -c /dev/nbd0 disk.img ... # mkdir /mnt/part1 # mount /dev/nbd0p1 /mnt/part1
È possibile esportare solamente la prima partizione di
"disk.img
" usando l'opzione "-P 1
"per
qemu-nbd
(8).
chroot
(8) offre il metodo più basilare per eseguire
diverse istanze dell'ambiente GNU/Linux simultaneamente in un singolo
sistema senza riavviare.
Gli esempi seguenti presuppongono che entrambi i sistemi, quello genitore e quello chroot, condividano la stessa architettura.
Si può imparare a impostare ed usare chroot
(8) eseguendo
il programma pbuilder
(8) in script
(1)
nel modo seguente.
$ sudo mkdir /sid-root $ sudo pbuilder --create --no-targz --debug --buildplace /sid-root
Si può vedere come debootstrap
(8) o
cdebootstrap
(1) popoli i dati di sistema per l'ambiente
sid
in "/sid-root
".
L'installatore Debian usa debootstrap
(8) o
cdebootstrap
(1) per l'installazione Debian. Possono anche essere
usati per installare Debian in un sistema senza usare un disco di
installazione Debian, ma invece uno di un'altra distribuzione GNU/Linux.
$ sudo pbuilder --login --no-targz --debug --buildplace /sid-root
Si può vedere come venga creata una shell di sistema in esecuzione
nell'ambiente sid
, nel modo seguente.
"/etc/hosts
",
"/etc/hostname
", "/etc/resolv.conf
")
/proc
"
/dev/pts
"
/usr/sbin/policy-rc.d
" che restituisca sempre il
codice 101
chroot /sid-root bin/bash -c 'exec -a -bash
bin/bash'
"
Alcuni programmi in chroot per funzionare possono aver bisogno dell'accesso
ad più file nel sistema genitore di quanti ne fornisca
pbuilder
. Per esempio, per essere montati con bind o
copiati, possono essere necessari "/sys
",
"/etc/passwd
", "/etc/group
",
"/var/run/utmp
", "/var/log/wtmp
", ecc.
Il file "/usr/sbin/policy-rc.d
" evita che, in un sistema
Debian, i programmi demone vengano avviati automaticamente. Vedere
"/usr/share/doc/sysv-rc/README.policy-rc.d.gz
".
Lo scopo originale del pacchetto specializzato chroot,
pbuilder
è di costruire un sistema chroot e di compilare
un pacchetto all'interno del chroot. È un sistema ideale per controllare che
le dipendenze di compilazione di un pacchetto siano corrette e per
assicurare che, nel pacchetto risultante, non ci siano dipendenze sbagliate
o superflue.
Il pacchetto simile schroot
può dare un'idea di come
eseguire un sistema chroot i386
in un sistema genitore
amd64
.
Io raccomando l'uso di QEMU o VirtualBox per eseguire, in un sistema Debian
stable
, sistemi desktop multipli in maniera sicura usando
la virtualizzazione. Permettono di
eseguire applicazioni desktop di Debian unstable
e
testing
senza i comuni rischi ad essi associati.
Dato che QEMU puro è molto lento, è raccomandata la sua velocizzazione con KVM quando il sistema host lo permette.
L'immagine disco virtuale "virtdisk.qcow2
" contenente il
sistema Debian per QEMU si può creare con
ipiccoli CD dell'installatore
Debian nel modo seguente.
$ wget http://cdimage.debian.org/debian-cd/5.0.3/amd64/iso-cd/debian-503-amd64-netinst.iso $ qemu-img create -f qcow2 virtdisk.qcow2 5G $ qemu -hda virtdisk.qcow2 -cdrom debian-503-amd64-netinst.iso -boot d -m 256 ...
Vedere altri suggerimenti su Debian Wiki: QEMU.
VirtualBox è fornito con strumenti con interfaccia utente grafica Qt piuttosto intuitivi. I suoi strumenti grafici e a riga di comando sono spiegati nel Manuale utente di VirtualBox e Manuale utente di VirtualBox (PDF).
Eseguire altre distribuzioni GNU/Linux come Ubuntu e Fedora in una virtualizzazione è un ottimo metodo per imparare trucchetti di configurazione. Anche altri sistemi operativi proprietari possono essere eseguiti tranquillamente in queste virtualizzazioni GNU/Linux.
In questo capitolo sono descritti strumenti e trucchi per gestire dati binari e di testo in un sistema Debian.
L'accesso in scrittura non coordinato a device a cui si sta attivamente
accedendo e a file da parte di processi diversi deve essere evitato per
prevenire le race condition. Per
evitare ciò devono essere usati i meccanismi di lock dei file utilizzando
flock
(1).
La sicurezza dei dati e la loro condivisione controllata hanno diversi aspetti.
Queste azioni possono essere realizzate usando una combinazione di strumenti.
Ecco una tabella riassuntiva degli strumenti di archiviazione e compressione disponibili per il sistema Debian.
Tabella 10.1. Elenco di strumenti di archiviazione e compressione
pacchetto | popcon | dimensione | comando | estensione | commento |
---|---|---|---|---|---|
tar
*
|
V:61, I:99 | 2660 |
tar (1)
|
.tar
|
strumento di archiviazione standard (standard de facto) |
cpio
*
|
V:41, I:99 | 920 |
cpio (1)
|
.cpio
|
strumento di archiviazione Unix in stile System V, da usare con
find (1)
|
binutils *
|
V:58, I:74 | 11996 |
ar (1)
|
.ar
|
strumento di archiviazione per la creazione di librerie statiche |
fastjar *
|
V:7, I:31 | 216 |
fastjar (1)
|
.jar
|
strumento di archiviazione per Java (simile a zip) |
pax
*
|
V:1.5, I:6 | 172 |
pax (1)
|
.pax
|
nuovo strumento POSIX di archiviazione, compromesso tra
tar e cpio
|
afio
*
|
V:0.3, I:1.7 | 240 |
afio (1)
|
.afio
|
cpio esteso con compressione per ogni file, ecc.
|
gzip
*
|
V:91, I:99 | 284 |
gzip (1), zcat (1), …
|
.gz
|
utilità GNU di compressione LZ77 (standard de facto) |
bzip2
*
|
V:51, I:79 | 132 |
bzip2 (1), bzcat (1), …
|
.bz2
|
utilità per compressione con
ordinamento dei blocchi Burrows-Wheeler con maggiore rapporto di
compressione di gzip (1) (più lenta di
gzip con sintassi simile)
|
lzma
*
|
V:8, I:80 | 172 |
lzma (1)
|
.lzma
|
utilità di compressione LZMA con maggiore
rapporto di compressione di gzip (1) (deprecata)
|
xz-utils *
|
V:5, I:26 | 460 |
xz (1), xzdec (1), …
|
.xz
|
utilità di compressione XZ con maggiore rapporto
di compressione di bzip2 (1) (più lenta di
gzip , ma più veloce di bzip2 ;
sostituto dell'utilità di compressione LZMA)
|
p7zip
*
|
V:2, I:23 | 1052 |
7zr (1), p7zip (1)
|
.7z
|
strumento di archiviazione file 7-Zip con alto rapporto di compressione (compressione LZMA) |
p7zip-full *
|
V:14, I:26 | 3612 |
7z (1), 7za (1)
|
.7z
|
strumento di archiviazione file 7-Zip con alto rapporto di compressione (compressione LZMA e altre) |
lzop
*
|
V:0.7, I:6 | 144 |
lzop (1)
|
.lzo
|
utilità di compressione LZO con velocità di
compressione e decompressione più alta di quella di
gzip (1) (più basso rapporto di compressione di
gzip con sintassi simile)
|
zip
*
|
V:8, I:52 | 632 |
zip (1)
|
.zip
|
InfoZIP: strumento di archiviazione e compressione per DOS |
unzip
*
|
V:24, I:69 | 408 |
unzip (1)
|
.zip
|
InfoZIP: strumento di estrazione di archivi e decompressione per DOS |
Non impostare la variabile "$TAPE
" a meno che non si
sappia esattamente cosa aspettarsi. Cambia il comportamento di
tar
(1).
Gli archivi tar
(1) compressi con gzip usano l'estensione
di file ".tgz
" o ".tar.gz
".
Gli archivi tar
(1) compressi con xz usano l'estensione di
file ".txz
" o ".tar.xz
".
La popolarità dei metodi di compressione negli strumenti FOSS come tar
(1) è cambiata nel
tempo nel modo seguente gzip
→ bzip2
→
xz
cp
(1), scp
(1) e
tar
(1) possono avere alcune limitazioni per file
speciali. cpio
(1) e afio
(1) sono gli
strumenti più versatili.
cpio
(1) e afio
(1) sono progettati per
essere usati con find
(1) ed altri comandi adatti per
creare script di backup, dato che la porzione di selezione dei file dello
script può essere testata in modo autonomo.
afio
(1) comprime ciascun file nell'archivio. Questo rende
afio
molto più sicuro in caso di corruzione dei file
rispetto agli archivi compressi globalmente, come tar
o
cpio
, e ne fa lo strumento
migliore per archivi per l'uso in script di backup.
La struttura interna dei file di dati di OpenOffice è quella dei file
".jar
".
Ecco una tabella riassuntiva dei semplici strumenti di copia e backup disponibili in un sistema Debian.
Tabella 10.2. Elenco di strumenti di copia e sincronizzazione
pacchetto | popcon | dimensione | strumento | funzione |
---|---|---|---|---|
coreutils *
|
V:92, I:99 | 13828 | GNU cp | copia file e directory localmente ("-a" per modalità ricorsiva) |
openssh-client *
|
V:52, I:99 | 2104 | scp |
copia file e directory da remoto (client, "-r " per
modalità ricorsiva)
|
openssh-server *
|
V:70, I:83 | 700 | sshd | copia file e directory da remoto (server remoto) |
rsync
*
|
V:19, I:52 | 704 | - | sincronizzazione e backup in remoto unidirezionale |
unison *
|
V:0.9, I:3 | 1816 | - | sincronizzazione e backup in remoto bidirezionale |
La copia dei file con rsync
(8) offre un insieme di
funzionalità più ricco di altri strumenti.
--exclude
" e "--exclude-from
"
simili a quelle di tar
(1)
L'esecuzione, tramite cron
(8), dello script
bkup
citato in Sezione 10.1.9, «Uno script di copia per backup di dati» con l'opzione
"-gl
", dovrebbe fornire funzionalità moltio simili a
dumpfs
di Plan9 per un archivio di dati statici.
Gli strumenti di controllo delle versioni VCS (Version control system) in Tabella 10.16, «Elenco di strumenti per sistemi di controllo delle versioni» possono essere usati come strumenti di copia e sincronizzazione multidirezionali.
Ecco diversi modi di archiviare ed estrarre archivi con l'intero contenuto
della directory "./sorgente
", usando diversi strumenti.
GNU tar
(1):
$ tar cvzf archivio.tar.gz ./sorgente $ tar xvzf archivio.tar.gz
cpio
(1):
$ find ./sorgente -xdev -print0 | cpio -ov --null > archivio.cpio; gzip archivio.cpio $ zcat archivio.cpio.gz | cpio -i
afio
(1):
$ find ./sorgente -xdev -print0 | afio -ovZ0 archivio.afio $ afio -ivZ archivio.afio
Ecco diversi modi di copiare l'intero contenuto della directory
"./sorgente
", usando diversi strumenti.
./sorgente
" → directory
"/dest
"
./sourgente
" sull'host locale →
directory "/dest
" sull'host
"utente@host.dom
"
rsync
(8):
# cd ./sorgente; rsync -av . /dest # cd ./sorgente; rsync -av . utente@host.dom:/dest
In alternativa si può usare la sintassi con "una barra / alla fine della directory sorgente".
# rsync -av ./sorgente/ /dest # rsync -av ./sourgente/ utente@host.dom:/dest
GNU cp
(1) e openSSH scp
(1):
# cd ./sorgente; cp -a . /dest # cd ./sorgente; scp -pr . utente@host.dom:/dest
GNU tar
(1):
# (cd ./sorgente && tar cf - . ) | (cd /dest && tar xvfp - ) # (cd ./sorgente && tar cf - . ) | ssh utente@host.dom '(cd /dest && tar xvfp - )'
cpio
(1):
# cd ./sorgente; find . -print0 | cpio -pvdm --null --sparse /dest
afio
(1):
# cd ./sorgente; find . -print0 | afio -pv0a /dest
In tutti gli esempi contenenti ".
", si può sostituire
".
" con "pippo
" per copiare i file
dalla directory "./sorgente/pippo
" alla directory
"/dest/pippo
".
In tutti gli esempi contententi ".
", si può sostituire
".
" con il percorso assoluto
"/percorso/di/sorgente/pippo
" per evitare di fare
"cd ./sorgente;
". I file verranno copiati in posizioni
diverse a seconda dello strumento utilizzato, come descritto qui di seguito.
/dest/pippo
": rsync
(8), GNU
cp
(1) e scp
(1)
/dest/percorso/di/sorgente/pippo
": GNU
tar
(1), cpio
(1) e
afio
(1)
rsync
(8) e GNU cp
(1) hanno l'opzione
"-u
" per saltare i file che sono più recenti nella
destinazione.
find
(1) viene usato per selezionare i file per i comandi
di archiviazione e copia (vedere Sezione 10.1.3, «Esempi di invocazione per archivi» e
Sezione 10.1.4, «Esempi di invocazione per la copia») o per xargs
(1)
(vedere Sezione 9.5.9, «Ripetere un comando su diversi file»). Questo
funzionamento può essere migliorato usando le sue opzioni di comando.
La sintassi base di find
(1) può essere riassunta nel modo
seguente.
-o
" tra condizioni) ha una precedenza più bassa
dell'operatore "AND logico" (specificato
da "-a
" o dall'assenza di un operatore tra condizioni).
!
" prima di una condizione) ha una precedenza più alta
di un operatore "AND logico".
-prune
" restituisce sempre una condizione di
VERO logico e, se si tratta di una
directory, la ricerca si ferma a questo punto.
-name
trova corrispondenze con il nome base
del file tramite espressioni glob di shell (vedere Sezione 1.5.6, «Glob sella shell»), ma fa corrispondenza anche con il carattere
iniziale ".
" con l'uso di metacaratteri come
"*
" e "?
". (Nuova funzionalità POSIX.)
-regex
" trova corrispondenze con il percorso
completo usando, in modo predefinito, BRE
in stile emacs (vedere Sezione 1.6.2, «Espressioni regolari»).
-size
" trova corrispondenze con file in base
alla loro dimensione (valori preceduti da "+
" o
"-
" per cercare dimensioni, rispettivamente, più grandi o
piccole del valore).
-newer
" trova corrispondenze con file più
recenti di quello specificato come argomento dell'opzione.
-print0
" restituisce sempre il valore logico
VERO e stampa il nome file completo
(terminato dal carattere null) sullo
standard output.
find
(1) è spesso usato con uno stile di invocazione come
il seguente.
# find /percorso/di \ -xdev -regextype posix-extended \ -type f -regex ".*\.afio|.*~" -prune -o \ -type d -regex ".*/\.git" -prune -o \ -type f -size +99M -prune -o \ -type f -newer /percorso/di/marcaturaorario -print0
Il comando precedente si traduce nelle azioni seguenti.
/percorso/di
"
.*\.afio
" o ".*~
" dalla ricerca
fermando la loro elaborazione
.*/\.git
" dalla ricerca fermando la loro elaborazione
/percorso/di/marcaturaorario
"
Notare nell'esempio precedente l'uso della parte di comando "-prune
-o
per escludere file.
Alcune opzioni per find
(1) potrebbero non essere
supportate per i sistemi *nix non Debian. In
questi casi, cambiare le invocazioni in quelle adatte corrispondenti e
sostituire "-print0
" con
"-print
". Potrebbe essere necessario modificare anche
comandi corelati.
Tutti sanno che i computer a volte si danneggiano oppure errori umani causano danni al sistema e ai dati. Le operazioni di backup e ripristino sono una parte essenziale di un'amministrazione di sistema di successo. Tutte i possibili modi in cui si possono creare danni si verificano prima o poi.
Mantenere il proprio sistema di backup semplice e fare il backup di sistema spesso. Avere dati di backup è più importante della qualità tecnica del metodo di backup.
Ci sono 3 fattori chiave che determinano la reale politica di backup e ripristino.
Sapere di cosa fare il backup ed il ripristino
~/
"
/var/
" (tranne "/var/cache/
",
"/var/run/
" e "/var/tmp/
")
/etc/
"
/usr/local/
" o
"/opt/
"
Sapere come fare il backup ed il ripristino
Valutazione dei rischi e dei costi
Per quanto riguarda il rendere sicura l'archiviazione dei dati, questi dovrebbero essere come minimo in una partizione diversa del disco e preferibilmente su dischi e macchine diversi per sopravvivere alla corruzione del file system. È preferibile archiviare i dati importanti su supporti scrivibili una sola volta, come CD/DVD-R per prevenire incidenti di sovrascrittura. (Vedere Sezione 10.3, «I dati binari» per come scrivere sul supporto di archiviazione dalla riga di comando. L'ambiente desktop GNOME con interfaccia grafica fornisce un facile accesso tramite menu: "Risorse→Creazione CD/DVD".)
Durante il backup dei dati può essere preferibile fermare alcuni demoni applicativi come l'MTA (vedere Sezione 6.3, «Agente di trasporto della posta (MTA)»).
Si dovrebbe dare un'attenzione particolare al backup ed al ripristino di
file con dati relativi all'identità dell'utente, come
"/etc/ssh/ssh_host_dsa_key
",
"/etc/ssh/ssh_host_rsa_key
",
"~/.gnupg/*
", "~/.ssh/*
",
"/etc/passwd
", "/etc/shadow
",
"/etc/fetchmailrc
",
"popularity-contest.conf
",
"/etc/ppp/pap-secrets
" e
"/etc/exim4/passwd.client
". Alcuni di questi dati non
possono essere ricreati inserendo la stessa stringa di input nel sistema.
Se si esegue un compito di cron come processo di un utente, si deve
ripristinare i file nella directory
"/var/spool/cron/crontabs
" e riavviare
cron
(8). Vedere Sezione 9.5.14, «Pianificare compiti in modo regolare» per informazioni su
cron
(8) e crontab
(1).
Quello che segue è un elenco di importanti suite di utilità di backup disponibili in un sistema Debian
Tabella 10.3. Elenco di suite con utilità di backup
pacchetto | popcon | dimensione | descrizione |
---|---|---|---|
rdiff-backup *
|
V:1.4, I:3 | 804 | backup incrementali (remoti) |
dump
*
|
V:0.4, I:1.5 | 716 |
dump (8) and restore (8) di BSD 4.4 per file system ext2/ext3
|
xfsdump *
|
V:0.3, I:1.9 | 628 |
dump e ripristino con xfsdump (8) e
xfsrestore (8) per file system XFS in GNU/Linux e IRIX
|
backupninja *
|
V:0.5, I:0.6 | 452 | sistema di meta-backup leggero ed estensibile |
mondo
*
|
V:0.11, I:0.5 | 1168 | Mondo Rescue: suite di backup per ripristino da disastri |
sbackup *
|
V:0.05, I:0.16 | 488 | semplice suite di backup per il desktop GNOME |
keep
*
|
V:0.13, I:0.3 | 1232 | sistema di backup per KDE |
bacula-common *
|
V:1.3, I:2 | 1404 | Bacula: backup, ripristino e controllo in rete - file comuni di supporto |
bacula-client *
|
I:0.9 | 84 | Bacula: backup, ripristino e controllo in rete - metapacchetto client |
bacula-console *
|
V:0.3, I:1.2 | 184 | Bacula: backup, ripristino e controllo in rete - console testuale |
bacula-server *
|
I:0.5 | 84 | Bacula: backup, ripristino e controllo in rete - metapacchetto server |
amanda-common *
|
V:0.4, I:0.8 | 6924 | Amanda: Advanced Maryland Automatic Network Disk Archiver (Librerie) |
amanda-client *
|
V:0.4, I:0.8 | 748 | Amanda: Advanced Maryland Automatic Network Disk Archiver (Client) |
amanda-server *
|
V:0.11, I:0.3 | 916 | Amanda: Advanced Maryland Automatic Network Disk Archiver (Server) |
backuppc *
|
V:0.8, I:1.0 | 2460 | BackupPC è un sistema ad altre prestazioni di qualità professionale per il backup di PC (basato su dischi) |
backup-manager *
|
V:0.4, I:0.6 | 672 | strumento di backup a riga di comando |
backup2l *
|
V:0.2, I:0.3 | 152 | strumento di backup/ripristino per supporti montabile (basato su dischi) che richiede bassa manutenzione |
Gli strumenti di backup hanno una propria specializzazione.
sbackup
e keep
forniscono
agli utenti desktop un semplice frontend con interfaccia grafica per fare
backup regolari dei loro dati. Una funzione equivalente può essere svolta da
un semplice script (Sezione 10.1.8, «Uno script di esempio per il backup di sistema») e
cron
(8).
Gli strumenti base descritti in Sezione 10.1.1, «Strumenti di archiviazione e compressione» e Sezione 10.1.2, «Strumenti di copia e sincronizzazione» possono essere usati per facilitare il backup di sistema attraverso script personalizzati. Tali script possono essere migliorati con gli strumenti seguenti.
rdiff-backup
permette backup incrementali
(remoti).
dump
aiuta ad archiviare e ripristinare
tutto il file system in maniera incrementale ed efficiente.
Per imparare ulteriori informazioni sul pacchetto dump
,
vedere i file in "/usr/share/doc/dump/
" e "Is dump really deprecated? (dump è davvero
deprecato?).
Per un sistema desktop Debian personale con la suite
unstable
, devo proteggere solo i dati personali e quelli
critici; tanto reinstallo comunque il sistema una volta all'anno. Perciò non
ho ragione di fare il backup dell'intero sistema o di installare un'utilità
completa di backup.
Uso un semplice script per fare un archivio di backup e masterizzarlo su CD/DVD usando una GUI. Ecco uno script di esempio che fa proprio questo.
#!/bin/sh -e # Copyright (C) 2007-2008 Osamu Aoki <osamu@debian.org>, Public Domain BUUID=1000; USER=osamu # UID e nome dell'utente che accede ai file di backup BUDIR="/var/backups" XDIR0=".+/Mail|.+/Desktop" XDIR1=".+/\.thumbnails|.+/\.?Trash|.+/\.?[cC]ache|.+/\.gvfs|.+/sessions" XDIR2=".+/CVS|.+/\.git|.+/\.svn|.+/Downloads|.+/Archive|.+/Checkout|.+/tmp" XSFX=".+\.iso|.+\.tgz|.+\.tar\.gz|.+\.tar\.bz2|.+\.afio|.+\.tmp|.+\.swp|.+~" SIZE="+99M" DATE=$(date --utc +"%Y%m%d-%H%M") [ -d "$BUDIR" ] || mkdir -p "BUDIR" umask 077 dpkg --get-selections \* > /var/lib/dpkg/dpkg-selections.list debconf-get-selections > /var/cache/debconf/debconf-selections { find /etc /usr/local /opt /var/lib/dpkg/dpkg-selections.list \ /var/cache/debconf/debconf-selections -xdev -print0 find /home/$USER /root -xdev -regextype posix-extended \ -type d -regex "$XDIR0|$XDIR1" -prune -o -type f -regex "$XSFX" -prune -o \ -type f -size "$SIZE" -prune -o -print0 find /home/$USER/Mail/Inbox /home/$USER/Mail/Outbox -print0 find /home/$USER/Desktop -xdev -regextype posix-extended \ -type d -regex "$XDIR2" -prune -o -type f -regex "$XSFX" -prune -o \ -type f -size "$SIZE" -prune -o -print0 } | cpio -ov --null -O $BUDIR/BU$DATE.cpio chown $BUUID $BUDIR/BU$DATE.cpio touch $BUDIR/backup.stamp
Questo è pensato come esempio di script che deve essere eseguito da root.
Modificarlo ed eseguirlo nel modo seguente.
find … -print0
" con "find … -newer
$BUDIR/backup.stamp -print0
" per fare backup incrementali.
scp
(1) o rsync
(1) o masterizzarli su
CD/DVD per una maggiore sicurezza dei dati. (Io uso la GUI del desktop GNOME
per masterizzare i CD/DVD.. Vedere Sezione 12.1.8, «Esempio di script di shell con zenity» per l'inserimento di dati di
ridondanza.)
Mantenere le cose semplici!
Si possono ripristinare i dati di configurazione di debconf con
"debconf-set-selections debconf-selections
" ed i dati
delle selezioni di dpkg con "dpkg --set-selection
<dpkg-selections.list
".
Per l'insieme dei dati in un albero di directory, la copia con "cp
-a
" fornisce normali backup.
Per un grande insieme di dati statici non sovrascritti in un albero di
directory, come quello nella directory
"/var/cache/apt/packages/
", i collegamenti fisici creati
con "cp -al
" forniscono un'alternativa ai normali backup
con un uso efficiente dello spazio su disco.
Ecco uno script di copia, che ho chiamato bkup
, per il
backup di dati. Questo script copia tutti i file (non-VCS) contenuti nella
directory attuale in una directory datata nella directory genitore o in un
host remoto.
#!/bin/sh -e # Copyright (C) 2007-2008 Osamu Aoki <osamu@debian.org>, Public Domain fdot(){ find . -type d \( -iname ".?*" -o -iname "CVS" \) -prune -o -print0;} fall(){ find . -print0;} mkdircd(){ mkdir -p "$1";chmod 700 "$1";cd "$1">/dev/null;} FIND="fdot";OPT="-a";MODE="CPIOP";HOST="localhost";EXTP="$(hostname -f)" BKUP="$(basename $(pwd)).bkup";TIME="$(date +%Y%m%d-%H%M%S)";BU="$BKUP/$TIME" while getopts gcCsStrlLaAxe:h:T f; do case $f in g) MODE="GNUCP";; # cp (GNU) c) MODE="CPIOP";; # cpio -p C) MODE="CPIOI";; # cpio -i s) MODE="CPIOSSH";; # cpio/ssh S) MODE="AFIOSSH";; # afio/ssh t) MODE="TARSSH";; # tar/ssh r) MODE="RSYNCSSH";; # rsync/ssh l) OPT="-alv";; # hardlink (GNU cp) L) OPT="-av";; # copy (GNU cp) a) FIND="fall";; # find all A) FIND="fdot";; # find non CVS/ .???/ x) set -x;; # trace e) EXTP="${OPTARG}";; # hostname -f h) HOST="${OPTARG}";; # user@remotehost.example.com T) MODE="TEST";; # test find mode \?) echo "use -x for trace." esac; done shift $(expr $OPTIND - 1) if [ $# -gt 0 ]; then for x in $@; do cp $OPT $x $x.$TIME; done elif [ $MODE = GNUCP ]; then mkdir -p "../$BU";chmod 700 "../$BU";cp $OPT . "../$BU/" elif [ $MODE = CPIOP ]; then mkdir -p "../$BU";chmod 700 "../$BU" $FIND|cpio --null --sparse -pvd ../$BU elif [ $MODE = CPIOI ]; then $FIND|cpio -ov --null | ( mkdircd "../$BU"&&cpio -i ) elif [ $MODE = CPIOSSH ]; then $FIND|cpio -ov --null|ssh -C $HOST "( mkdircd \"$EXTP/$BU\"&&cpio -i )" elif [ $MODE = AFIOSSH ]; then $FIND|afio -ov -0 -|ssh -C $HOST "( mkdircd \"$EXTP/$BU\"&&afio -i - )" elif [ $MODE = TARSSH ]; then (tar cvf - . )|ssh -C $HOST "( mkdircd \"$EXTP/$BU\"&& tar xvfp - )" elif [ $MODE = RSYNCSSH ]; then rsync -rlpt ./ "${HOST}:${EXTP}-${BKUP}-${TIME}" else echo "Any other idea to backup?" $FIND |xargs -0 -n 1 echo fi
Questo script è pensato per essere un esempio per i comandi; leggerlo e modificarlo prima di usarlo.
Io tengo questo script bkup
nella mia directory
"/usr/local/bin/
" ed eseguo il comando
bkup
senza opzioni nella directory di lavoro ogni volta
che ho bisogno di un backup istantaneo temporaneo.
Per creare uno storico delle istantanee di un albero di file sorgenti o di
un albero di file di configurazione, l'uso di git
(7) è
più semplice e più efficiente in termini di spazio (vedere Sezione 10.9.5, «Git per registrare la cronologia della configurazione»).
Un support di archiviazione removibile può essere uno dei seguenti.
Questi supporti di archiviazione removibili possono essere montati
automaticamente come utente normale in un ambiente desktop moderno, come
accade in GNOME con gnome-mount
(1).
Il punto di mount in GNOME viene scelto come
"/media/<etichetta_disco>
" che può essere
personalizzata nel modo seguente.
mlabel
(1) per file system FAT
genisoimage
(1) con l'opzione "-V
" per
file system ISO9660
tune2fs
(1) con l'opzione "-L
" per file
system ext2/ext3
Nei moderni ambienti desktop il montaggio automatico avviene solo quando i
device dei supporti removibili non sono elencati in
"/etc/fstab
".
Quando si hanno problemi poiché si è fornita una opzione di montaggio
sbagliata, cancellare l'impostazione corrispondente in
"/system/storage/
" usando
gconf-editor
(1).
Tabella 10.4. Elenco di pacchetti che permettono agli utenti normali di montare supporti
removibili senza una voce corrispondente in "/etc/fstab
"
pacchetto | popcon | dimensione | descrizione |
---|---|---|---|
gnome-mount *
|
V:15, I:28 | NOT_FOUND | wrapper per (s)montare ed espellere dispositivi di archiviazione (usato da GNOME) |
pmount *
|
V:4, I:19 | 548 | monta dispositivi removibili da utente normale (usato da KDE) |
cryptmount *
|
V:0.2, I:0.5 | 360 | gestione e montaggio in modalità utente di file system cifrati |
usbmount *
|
V:0.4, I:1.4 | 112 | montaggio e smontaggio automatici di dispositivi di archiviazione USB |
Quando si condividono dati con un altro sistema attraverso dispositivi di archiviazione removibili, quest'ultimi andrebbero formattati con un filesystem comune supportato da entrambi i sistemi. Quelle che segue è un elenco delle scelte possibili per il file system.
Tabella 10.5. Elenco di possibili scelte per il file system di dispositivi di archiviazione removibili con scenari di uso tipici
file system | descrizione dello scenario di uso tipico |
---|---|
FAT12 | condivisione interpiattaforma di dati su dischetti floppy (<32MiB) |
FAT16 | condivisione interpiattaforma di dati su dispositivi come piccoli dischi fissi (<2GiB) |
FAT32 | condivisione interpiattaforma di dati su dispositivi come grandi dischi fissi (<8TiB, supportato da sistemi più recenti di MS Windows95 OSR2) |
NTFS | condivisione interpiattaforma di dati su dispositivi come grandi dischi fissi (supportato nativamente su MS Windows NT e versioni successive e supportato da NTFS-3G attraverso FUSE in Linux) |
ISO9660 | condivisione interpiattaforma di dati statici su CD-R e DVD+/-R |
UDF | scrittura incrementale di dati su CD-R e DVD+/-R (nuovo) |
file system MINIX | archiviazione, efficiente in termini di spazio, di file dati unix su dischetti floppy |
file system ext2 | condivisione di dati su dispositivi come dischi fissi con sistemi Linux più vecchi |
file system ext3 | condivisione di dati su dispositivi come dischi fissi con sistemi Linux attuali (file system con journaling) |
Vedere Sezione 9.4.1, «Cifratura di dischi removibili con dm-crypt/LUKS» per la condivisione interpiattaforma di dati usando cifratura a livello di dispositivo.
Il file system FAT è supportato da quasi tutti i sistemi operativi moderni ed è piuttosto utile per scopi di scambio di dati attraverso supporti come dischi fissi removibili.
Quando si formatta un dispositivo come un disco fisso removibile con il file system FAT per la condivisione interpiattaforma di dati, le scelte seguenti dovrebbero essere quelle più sicure.
Partizionare con fdisk
(8), cfdisk
(8) o
parted
(8) (vedere Sezione 9.3.1, «Configurazione del partizionamento dei dischi») creando un'unica partizione
primaria e marcarla nel modo seguente.
Formattare la partizione primaria con mkfs.vfat
(8) nel
modo seguente.
/dev/sda1
".
-F 32 /dev/sda1
"
Quando si usano i file system FAT o ISO9660 per la condivisione dei dati, per essere sicuri dei risultati, si dovrebbero considerare i seguenti aspetti.
tar
(1), cpio
(1) o
afio
(1) per mantenere i nomi di file lunghi, i
collegamenti simbolici, i permessi Unix sui file originali e le informazioni
sui proprietari.
split
(1) per proteggerli da limitazioni sulla dimensione
dei file.
Il file system FAT, per sua stessa natura, permette una dimensione massima
per i file di (2^32 - 1) byte = (4GiB - 1 byte)
. Per
alcune applicazioni su sistemi operativi a 32 bit più vecchi, la dimensione
massima per i file era ancora più piccola: (2^31 - 1) byte = (2GiB
- 1 byte)
. Debian non soffre di quest'ultima limitazione.
La stessa Microsoft non raccomanda l'uso di FAT per le unità o le partizioni più grandi di 200 MB. Microsoft evidenzia le sue limitazioni, quali un uso inefficiente dello spazio su disco, nel documento "Overview of FAT, HPFS, and NTFS File Systems". Naturalmente per Linux si dovrebbe normalmente usare il file system ext3.
Per maggiori informazioni sui file system e sull'accesso ad essi, leggere il "Filesystems HOWTO".
Quando si condividono dati con un altro sistema attraverso una rete, si dovrebbero tenere a mente i servizi comuni. Ecco alcuni suggerimenti.
Tabella 10.6. Elenco dei servizi di rete da scegliere in base allo scenario di uso tipico
servizio di rete | descrizione dello scenario di uso tipico |
---|---|
file system montato di rete SMB/CIFS con Samba |
condivisione di file attraverso "rete Microsoft Windows", vedere
smb.conf (5) e The Official Samba 3.2.x HOWTO and
Reference Guide o il pacchetto samba-doc
|
file system montato di rete NFS con il kernel Linux |
condivisione di file attraverso "rete Unix/Linux", vedere
exports (5) e Linux
NFS-HOWTO
|
servizio HTTP | condivisione di file tra client/server web |
servizio HTTPS | condivisione di file tra client/server web con SSL (Secure Sockets Layer) cifrato o TLS (Transport Layer Security) |
servizio FTP | condivisione di file tra client/server FTP |
Sebbene questi file system montati in rete e metodi di trasferimento di file attraverso la rete siano piuttosto comodi per la condivisione dei dati, possono essere non sicuri. La loro connessione di rete deve essere resa sicura nel modo seguente.
Vedere anche Sezione 6.10, «Altri server di rete» e Sezione 6.11, «Altri client di rete».
Quando si deve scegliere il supporto di archiviazione di dati informatici per un importante archivio di dati, si dovrebbe porre attenzione alle limitazioni dei supporti. Per piccoli backup di dati personali, io uso CD-R e DVD-R scegliendoli in base alla marca del produtttore e conservandoli in un ambiente fresco, all'ombra, asciutto e pulito. (I supporti di archiviazione a nastro sembrano molto popolari per gli usi professionali.)
Le casseforti a prova di fuoco sono pensate per i documenti cartacei. La maggior parte dei supporti di archiviazione di dati informatici ha una tolleranza più bassa alle alte temperature rispetto alla carta. Di solito mi affido a copie multiple cifrate sicure conservate in diverse posizioni sicure.
Durata di vita ottimistica di diversi supporti di archiviazione da dati raccolti in rete (per lo più dalle informazioni dei produttori).
Questi tempi non tengono conto dei danni meccanici causati dal maneggiamento, ecc.
Cicli di scrittura ottimistici di diversi supporti di archiviazione da dati raccolti in rete (per lo più dalle informazioni dei produttori).
I valori di durata di vita e dei cicli di scrittura riportati non dovrebbero essere usati per prendere decisioni riguardo all'archiviazione di dati critici. Consultare le informazioni specifiche per ciascun prodotto forniti dal produttore.
Dato che i CD/DVD-R e la carta hanno un solo ciclo di scrittura, prevengono per loro stessa natura le perdite accidentali di dati per sovrascrittura. Questo è un vantaggio!
Se è necessario fare backup frequenti e veloci di una grande quantità di dati, un disco fisso su un host remoto connesso con una connessione veloce, potrebbe essere l'unica soluzione realistica.
Questa sezione tratta della manipolazione di immagini di dischi. Vedere anche Sezione 9.3, «Suggerimenti per l'archiviazione dei dati».
Si può creare un file di immagine del disco, "disco.img
",
di un dispositivo non montato, ad esempio la seconda unità SCSI
"/dev/sdb
" usando cp
(1) o
dd
(1) nel modo seguente.
# cp /dev/sdb disco.img # dd if=/dev/sdb of=disco.img
Si può creare l'immagine del disco del MBR (master boot record) dei PC
tradizionali (vedere Sezione 9.3.1, «Configurazione del partizionamento dei dischi»), che
risiede nel primo settore del disco IDE primario usando
dd
(1) nel modo seguente.
# dd if=/dev/hda of=mbr.img bs=512 count=1 # dd if=/dev/hda of=mbr-nopart.img bs=446 count=1 # dd if=/dev/hda of=mbr-part.img skip=446 bs=1 count=66
mbr.img
": MBR con tabella delle partizioni
mbr-nopart.img
": MBR senza tabella delle partizioni
part.img
": solamente la tabella delle partizioni
nell'MBR
Se il disco di avvio è un un dispositivo SCSI (incluse le nuove unità Serial
ATA), sostituire "/dev/hda
" con
"/dev/sda
".
Se si sta creando l'immagine di una partizione del disco originale,
sostituire "/dev/hda
" con "/dev/hda1
",
ecc.
Il file immagine del disco, "disco.img
" può essere
scritto in un dispositivo non montato, ad esempio la seconda unità SCSI
"/dev/sdb
" di dimensione corrispondente nel modo
seguente.
# dd if=disco.img of=/dev/sdb
Analogamente il file immagine di una partizione del disco,
"partizione.img
" può essere scritto in una partizione non
montata, ad esempio la prima partizione della seconda unità SCSI
"/dev/sdb1
" di dimensione corrispondente nel modo
seguente.
# dd if=partizione.img of=/dev/sdb1
Un'immagine di disco "partizione.img
" contenente
l'immagine di un'unica partizione, può essere montata e smontata usando il
device loop nel modo seguente.
# losetup -v -f partizione.img Loop device is /dev/loop0 # mkdir -p /mnt/loop0 # mount -t auto /dev/loop0 /mnt/loop0 ...bla...bla...bla # umount /dev/loop0 # losetup -d /dev/loop0
Questo può essere semplificato nel modo seguente.
# mkdir -p /mnt/loop0 # mount -t auto -o loop partizione.img /mnt/loop0 ...bla...bla...bla # umount partizione.img
Ogni partizione di un'immagine di disco "disco.img
"
contentente più partizioni, può essere montata usando il device loop. Dato che quest'ultimo non gestisce
in modo predefinito le partizioni, è necessario riconfigurarlo nel modo
seguente.
# modinfo -p loop # verifica la capacita del kernel max_part:Maximum number of partitions per loop device max_loop:Maximum number of loop devices # losetup -a # verifica che nulla stia usando il device loop # rmmod loop # modprobe loop max_part=16
Ora il device loop può gestire fino a 16 partizioni.
# losetup -v -f disco.img Loop device is /dev/loop0 # fdisk -l /dev/loop0 Disk /dev/loop0: 5368 MB, 5368709120 bytes 255 heads, 63 sectors/track, 652 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Disk identifier: 0x452b6464 Device Boot Start End Blocks Id System /dev/loop0p1 1 600 4819468+ 83 Linux /dev/loop0p2 601 652 417690 83 Linux # mkdir -p /mnt/loop0p1 # mount -t ext3 /dev/loop0p1 /mnt/loop0p1 # mkdir -p /mnt/loop0p2 # mount -t ext3 /dev/loop0p2 /mnt/loop0p2 ...bla...bla...bla # umount /dev/loop0p1 # umount /dev/loop0p2 # losetup -d /dev/loop0
In alternativa, un risultato simile può essere ottenuto utilizzando i device mapper creati da
kpartx
(8), contenuto nel pacchetto
kpartx
, nel modo seguente.
# kpartx -a -v disco.img ... # mkdir -p /mnt/loop0p2 # mount -t ext3 /dev/mapper/loop0p2 /mnt/loop0p2 ... ...bla...bla...bla # umount /dev/mapper/loop0p2 ... # kpartx -d /mnt/loop0
È anche possibile montare una singola partizione di una tale immagine di disco con un device loop indicando un offset per saltare l'MBR, ecc., ma questo metodo è più esposto agli errori.
Si può pulire un file con immagine di disco "disco.img
"
da tutti i file cancellati creando un'immagine pulita
"nuova.img
" nel modo seguente.
# mkdir vecchia; mkdir nuova # mount -t auto -o loop disco.img vecchia # dd bs=1 count=0 if=/dev/zero of=nuova.img seek=5G # mount -t auto -o loop nuova.img nuova # cd vecchia # cp -a --sparse=always ./ ../nuova/ # cd .. # umount nuova.img # umount disco.img
Se "disco.img
" è in ext2 o ext3, si può anche usare
zerofree
(8), contenuto nel pacchetto
zerofree
, nel modo seguente.
# losetup -f -v disco.img Loop device is /dev/loop3 # zerofree /dev/loop3 # cp --sparse=always disco.img nuovo.img
Si può creare un'immagine di disco vuota "disco.img
", che
può crescere fino a 5GiB, usando dd
(1) nel modo seguente.
$ dd bs=1 count=0 if=/dev/zero of=disco.img seek=5G
È possibile creare un file system ext3 in questa immagine di disco,
"disco.img
" usando il device
loop nel modo seguente.
# losetup -f -v disco.img Loop device is /dev/loop1 # mkfs.ext3 /dev/loop1 ...bla...bla...bla # losetup -d /dev/loop1 $ du --apparent-size -h disco.img 5.0G disco.img $ du -h disco.img 83M disco.img
La dimensione del file "disco.img
" è di 5.0GiB e il suo
effettivo uso del disco è di soli 83MiB. Questa discrepanza è resa possibile
dal fatto che il file system ext2 può
contentere file sparsi.
L'uso effettivo del disco dei file sparsi cresce insieme ai dati che in essi sono scritti.
Usando operazioni simili su device creati dal device loop o dal device mapper, come in Sezione 10.2.3, «Montare un file con un'immagine di disco», si può partizionare tale immagine
di disco "disco.img
" usando parted
(8)
o fdisk
(8) e si può creare in essa file system usando
mkfs.ext3
(8), mkswap
(8), ecc.
Si può creare un file immagine ISO9660
"cd.iso
" dell'albero di directory originale in
"directory_sorgente
" usando
genisoimage
(1) fornito da cdrkit nel modo seguente.
# genisoimage -r -J -T -V ID_volume -o cd.iso directory_sorgente
Analogamente, si può creare un file immagine ISO9660 avviabile,
"cdboot.iso
", da un albero di directory simile a quello
del debian-installer
in
"directory_sorgente
" nel modo seguente.
# genisoimage -r -o cdboot.iso -V ID_volume \ -b isolinux/isolinux.bin -c isolinux/boot.cat \ -no-emul-boot -boot-load-size 4 -boot-info-table directory_sorgente
In questo esempio viene usato per l'avvio il bootloader Isolinux (vedere Sezione 3.3, «Stadio 2: il bootloader»).
Si può calcolare il valore md5sum e creare l'immagine ISO9660 direttamente dal device CD-ROM nel modo seguente.
$ isoinfo -d -i /dev/cdrom CD-ROM is in ISO 9660 format ... Logical block size is: 2048 Volume size is: 23150592 ... # dd if=/dev/cdrom bs=2048 count=23150592 conv=notrunc,noerror | md5sum # dd if=/dev/cdrom bs=2048 count=23150592 conv=notrunc,noerror > cd.iso
Per ottenere un risultato corretto, si deve accuratamente evitare il bug di Linux riguardante il read ahead del file system ISO9660, come nell'esempio precedente.
Per wodim
(1), fornito da cdrkit, un DVD è semplicemente un grande CD.
Si può trovare un device utilizzabile usando il comando seguente.
# wodim --devices
Poi si inserisce un CD-R vergine nell'unità CD e si scrive il file immagine
ISO9660 "cd.iso
" su questo device, ad esempio
"/dev/hda
", usando wodim
(1) nel modo
seguente.
# wodim -v -eject dev=/dev/hda cd.iso
Se viene usato un CD-RW invece di un CD-R, usare quest'altro comando.
# wodim -v -eject blank=fast dev=/dev/hda cd.iso
Se il sistema desktop usato monta automaticamente i CD, prima di usare
wodim
(1) smontarlo usando "sudo umount
/dev/hda
".
Se "cd.iso
" contiene un'immagine ISO9660, lo si può
montare manualmente in "/cdrom
" usando il comando
seguente.
# mount -t iso9660 -o ro,loop cd.iso /cdrom
I sistemi desktop moderni montano automaticamente i supporti removibili (vedere Sezione 10.1.10, «Supporti di archiviazione removibili»).
Questa sezione tratta della manipolazione diretta dei dati binari su supporti di archiviazione. Vedere anche Sezione 9.3, «Suggerimenti per l'archiviazione dei dati».
Il metodo di visualizzazione dei dati binai più basilare è l'uso del comando
"od -t x1
".
Tabella 10.7. Elenco di pacchetti che visualizzano e modificano dati binari
pacchetto | popcon | dimensione | descrizione |
---|---|---|---|
coreutils *
|
V:92, I:99 | 13828 |
pacchetto base che contiene od (1) per fare il dump di
file (HEX, ASCII, OCTAL, …)
|
bsdmainutils *
|
V:81, I:99 | 768 |
pacchetto di utilità che contiene hd (1) per fare il dump
di file (HEX, ASCII, OCTAL, …)
|
hexedit *
|
V:0.3, I:1.9 | 108 | visualizzatore ed editor binario (HEX, ASCII) |
bless
*
|
V:0.08, I:0.3 | 1232 | editor esadecimale completo (GNOME) |
okteta *
|
V:0.4, I:3 | 2528 | editor esadecimale completo (KDE4) |
ncurses-hexedit *
|
V:0.07, I:0.5 | 192 | visualizzatore ed editor binario (HEX, ASCII, EBCDIC) |
lde
*
|
V:0.04, I:0.3 | 992 | Linux Disk Editor |
beav
*
|
V:0.03, I:0.3 | 164 | visualizzatore ed editor binario (HEX, ASCII, EBCDIC, OCTAL, …) |
hex
*
|
V:0.01, I:0.09 | 84 | strumento per dump esadecimale (supporta codici giapponesi a 2 byte) |
HEX è usato come acronimo per il formato esadecimale con base 16. OCTAL è usato per il formato ottale con base 8. ASCII è usato per American Standard Code for Information Interchange, cioè la normale codifica per testi in inglese. EBCDIC è usato per Extended Binary Coded Decimal Interchange Code usato nei sistemi operativi deimainframe IBM.
Esistono strumenti per leggere e scrivere file senza montare i dischi.
I sistemi software RAID offerti dal kernel Linux forniscono un livello di ridondanza dei dati nel file system a livello del kernel, allo scopo di ottenere una più alta affidabilità dell'archiviazione.
Esistono strumenti per aggiungere dati ridondanti a file a livello di programmi applicativi per ottenere anche in questo modo una più alta affidabilità dell'archiviazione.
Tabella 10.9. Elenco di strumenti per aggiungere dati ridondanti a file
pacchetto | popcon | dimensione | descrizione |
---|---|---|---|
par2
*
|
V:0.5, I:1.7 | 272 | insiemi di volumi di archivi di parità, per controllare e riparare file |
dvdisaster *
|
V:0.14, I:0.7 | 1388 | protezione contro perdita di dati/graffi/invecchiamento di supporti CD/DVD |
dvbackup *
|
V:0.01, I:0.09 | 544 |
strumento di backup che usa camcorder MiniDV (fornisce
rsbep (1))
|
vdmfec *
|
V:0.00, I:0.02 | 88 | recupera blocchi perduti usando Forward Error Correction |
Esistono strumenti per recuperare file dati e fare analisi forensi.
Tabella 10.10. Elenco di pacchetti per recupero di file dati ed analisi forensi.
pacchetto | popcon | dimensione | descrizione |
---|---|---|---|
testdisk *
|
V:0.3, I:3 | 4620 | utilità per scansione delle partizione e ripristino di dischi |
magicrescue *
|
V:0.07, I:0.5 | 344 | utilità per ripristinare file cercando byte magici |
scalpel *
|
V:0.03, I:0.2 | 124 | strumento di escavazione di file frugale e ad alte prestazioni |
myrescue *
|
V:0.02, I:0.18 | 84 | recupera dati da dischi fissi danneggiati |
recover *
|
V:0.07, I:0.6 | 104 | utilità per decancellare file da file system ext2 |
e2undel *
|
V:0.07, I:0.5 | 244 | utilità per decancellare file da file system ext2 |
ext3grep *
|
V:0.08, I:0.6 | 300 | strumento per aiutare a recuperare file cancellati da file system ext3 |
scrounge-ntfs *
|
V:0.03, I:0.4 | 80 | programma di recupero di dati da file system NTFS |
gzrt
*
|
V:0.01, I:0.12 | 68 | insieme di strumenti di recupero di gzip |
sleuthkit *
|
V:0.13, I:0.7 | 540 | strumenti per analisi forensi (Sleuthkit) |
autopsy *
|
V:0.07, I:0.4 | 1372 | interfaccia grafica per SleuthKit |
foremost *
|
V:0.11, I:0.8 | 140 | applicazione forense per il recupero dei dati |
guymager *
|
V:0.00, I:0.02 | 688 | strumento forense per immagini basato su Qt |
tct
*
|
V:0.03, I:0.2 | 604 | utilità relative alle analisi forensi |
dcfldd *
|
V:0.03, I:0.2 | 124 |
versione migliorata di dd per analisi forensi e sicurezza
|
rdd
*
|
V:0.01, I:0.11 | 200 | programma di copia per uso forense |
Quando dei dati sono troppo grandi affinché ne venga fatto il backup in un file singolo, si può fare il backup dei suoi contenuti dopo averlo suddiviso in pezzi di, ad esempio 2000MiB, che saranno successivamente riuniti a formare il file originale.
$ split -b 2000m file_grande $ cat x* >file_grande
Assicurarsi di non avere altri file che iniziano con "x
"
per evitare conflitti nei nomi.
Per ripulire i contenuti di un file, come un file di registro, non usare
rm
(1) per cancellarlo e poi crearne un altro, perché
nell'intervallo tra i due comandi potrebbe essere ancora possibile accedere
al file. Quello che segue è il metodo sicuro per pulire il contenuto di un
file.
$ :>file_da_pulire
I comandi seguenti creano file fittizi o vuoti.
$ dd if=/dev/zero of=5kb.file bs=1k count=5 $ dd if=/dev/urandom of=7mb.file bs=1M count=7 $ touch zero.file $ : > semprezero.file
Dovrebbero essere ora presenti i seguenti file.
5kb.file
" è costituito da 5KB di zero.
7mb.file
" è costituito da 7MB di dati casuali.
zero.file
" potrebbe essere un file di 0 byte. Se fosse
stato preesistente, il suo orario mtime
sarebbe stato
aggiornato mentre sarebbero stati mantenuti i suoi contenuti e la sua
grandezza.
semprezero.file
" è sempre un file di 0 byte. Se fosse
stato preesistente, il suo orario mtime
sarebbe stato
aggiornato e il suo contenuto azzerato.
Esistono diversi modi di cancellare completamente i dati da un intero device
simile ad un disco fisso, ad esempio una chiavetta USB in
"/dev/sda
".
Prima di eseguire i comandi indicati in seguito controllare la posizione
della chiavetta USB con mount
(8). Il device a cui punta
"/dev/sda
" potrebbe essere il disco fisso SCSI o
Serial-ATA che contiene l'intero sistema.
Cancellare tutti i contenuti del disco reimpostando tutti i dati a 0 con il comando seguente.
# dd if=/dev/zero of=/dev/sda
Cancellare tutto sovrascrivendo dati casuali con il comando seguente.
# dd if=/dev/urandom of=/dev/sda
Cancellare tutto sovrascrivendo dati casuali in modo molto efficiente con il comando seguente.
# shred -v -n 1 /dev/sda
Dato che dd
(1) è disponibile dalla shell di molti CD
Linux avviabili, come il CD dell'installatore Debian, si può cancellare
completamente il sistema installato su un disco fisso, ad esemio
"/dev/hda
", "/dev/sda
", ecc.,
eseguendo un comando di cancellazione da un supporto CD simile.
Area inutilizzate di un disco fisso (o di una chiavetta USB), ad esempio
"/dev/sdb1
", potrebbero contenere ancora i dati
cancellati stessi, dato che questi sono semplicemente scollegati dal file
system. È possibile pulire queste aree sovrascrivendole.
# mount -t auto /dev/sdb1 /mnt/pippo # cd /mnt/pippo # dd if=/dev/zero of=spazzatura dd: writing to `spazzatura': No space left on device ... # sync # umount /dev/sdb1
Solitamente questo procedimento è sufficientemente buono per le chiavette USB. Ma non è perfetto. La maggior parte dei nomi di file cancellati e dei loro attributi potrebbe ancora essere nascosta e rimanere nel file system.
Anche se un file è stato cancellato per errore, fintanto che è usato da un'applicazione (in lettura o scrittura), è possibile recuperarlo.
Per esempio, provare a fare quanto segue.
$ echo pippo > pluto $ less pluto $ ps aux | grep ' less[ ]' bozo 4775 0.0 0.0 92200 884 pts/8 S+ 00:18 0:00 less pluto $ rm pluto $ ls -l /proc/4775/fd | grep bar lr-x------ 1 bozo bozo 64 2008-05-09 00:19 4 -> /home/bozo/pluto (deleted) $ cat /proc/4775/fd/4 >pluto $ ls -l -rw-r--r-- 1 bozo bozo 4 2008-05-09 00:25 pluto $ cat pluto pippo
Quando si ha il pacchetto lsof
installato, eseguire in un
altro terminale quanto segue.
$ ls -li pluto 2228329 -rw-r--r-- 1 bozo bozo 4 2008-05-11 11:02 pluto $ lsof |grep pluto|grep less less 4775 bozo 4r REG 8,3 4 2228329 /home/bozo/pluto $ rm pluto $ lsof |grep pluto|grep less less 4775 bozo 4r REG 8,3 4 2228329 /home/bozo/pluto (deleted) $ cat /proc/4775/fd/4 >pluto $ ls -li pluto 2228302 -rw-r--r-- 1 bozo bozo 4 2008-05-11 11:05 pluto $ cat pluto pippo
I file con collegamenti fisici possono essere identificati usando
"ls -li
".
$ ls -li total 0 2738405 -rw-r--r-- 1 root root 0 2008-09-15 20:21 paperino 2738404 -rw-r--r-- 2 root root 0 2008-09-15 20:21 pippo 2738404 -rw-r--r-- 2 root root 0 2008-09-15 20:21 pluto
Entrambi "pippo
" e "pluto
" hanno il
numero di collegamenti uguale a "2" (>1), il che mostra che hanno
collegamenti fisici. Hanno il numero di inode,
"2738404", in comune. Ciò significa che sono lo stesso file con un
collegamento fisico. Nell'eventualità che non si trovino tutti i file con
collegamento fisico, li si possono cercare in base all'inode, ad esempio "2738404", nel modo seguente.
# find /percorso/del/punto/di/mount -xdev -inum 2738404
L'infrastruttura di sicurezza dei dati viene fornita dalla combinazione di strumenti di cifratura dei dati, strumenti message digest e strumenti di firma.
Tabella 10.11. Elenco di strumenti per l'infrastruttura di sicurezza dei dati
comando | pacchetto | popcon | dimensione | descrizione |
---|---|---|---|---|
gpg (1)
|
gnupg
*
|
V:43, I:99 | 5288 | GNU Privacy Guard - strumento OpenPGP di cifratura e firma |
N/D |
gnupg-doc *
|
I:1.1 | 4124 | documentazione di GNU Privacy Guard |
gpgv (1)
|
gpgv
*
|
V:59, I:99 | 436 | GNU Privacy Guard - strumento di verifica delle firme |
paperkey (1)
|
paperkey *
|
V:0.01, I:0.10 | 88 | estrae solamente le informazioni segrete da chiavi OpenPGP segrete |
cryptsetup (8), …
|
cryptsetup *
|
V:3, I:5 | 1172 | utilità per la cifratura dm-crypto per i device a blocchi con supporto LUKS |
ecryptfs (7), …
|
ecryptfs-utils *
|
V:0.2, I:0.3 | 416 | utilità per cifratura di file system stack ecryptfs |
md5sum (1)
|
coreutils *
|
V:92, I:99 | 13828 | calcola e controlla message digest MD5 |
sha1sum (1)
|
coreutils *
|
V:92, I:99 | 13828 | calcola e controlla message digest SHA1 |
openssl (1ssl)
|
openssl *
|
V:56, I:91 | 2380 |
calcola message digest con "openssl dgst " (OpenSSL)
|
Per dm-crypto e ecryptfs che implementano infrastrutture di cifratura automatica dei dati attraverso moduli del kernel Linux, vedere Sezione 9.4, «Suggerimenti per la cifratura dei dati».
Quelli che seguono sono alcuni comandi per GNU Privacy Guard per la gestione base delle chiavi.
Tabella 10.12. Elenco di comandi per GNU Privacy Guard per la gestione delle chiavi
comando | descrizione |
---|---|
gpg --gen-key
|
Genera una nuova chiave |
gpg --gen-revoke mio_ID_utente
|
genera una chiave di revoca per mio_ID_utente |
gpg --edit-key user_ID
|
modifica la chiave in modo interattivo, "help" per l'aiuto |
gpg -o file --exports
|
esporta tutte le chiavi in un file |
gpg --imports file
|
importa tutte le chiavi da un file |
gpg --send-keys ID_utente
|
invia la chiave di ID_utente al server di chiavi |
gpg --recv-keys ID_utente
|
riceve la chiave di ID_utente dal server di chiavi |
gpg --list-keys ID_utente
|
elenca le chiavi di ID_utente |
gpg --list-sigs ID_utente
|
elenca le firme di ID_utente |
gpg --check-sigs ID_utente
|
controlla le firme di ID_utente |
gpg --fingerprint ID_utente
|
controlla le impronte digitali di ID_utente |
gpg --refresh-keys
|
aggiorna il portachiavi locale |
Quelli seguenti sono i significati dei codici di fiducia.
Tabella 10.13. Elenco dei significati dei codici di fiducia
codice | descrizione della fiducia |
---|---|
-
|
nessuna fiducia assegnata dal proprietario / ancora non calcolata |
e
|
calcolo della fiducia fallito |
q
|
informazioni insufficienti per il calcolo |
n
|
non fidarsi mai di questa chiave |
m
|
marginalmente affidabile |
f
|
completamente fidata |
u
|
definitivamente fidata |
Il comando seguente carica la mia chiave "1DD8D791
" sul
popolare server di chiavi "hkp://keys.gnupg.net
".
$ gpg --keyserver hkp://keys.gnupg.net --send-keys 1DD8D791
Un buon server di chiavi predefinito impostato in
"~/.gnupg/gpg.conf
" (o nella vecchia posizione
"~/.gnupg/options
") si ottiene la voce seguente.
keyserver hkp://keys.gnupg.net
Il comando seguente recupera le chiavi sconosciute dal server di chiavi.
$ gpg --list-sigs --with-colons | grep '^sig.*\[User ID not found\]' |\ cut -d ':' -f 5| sort | uniq | xargs gpg --recv-keys
In OpenPGP Public Key Server
(versioni pre-0.9.6) esisteva un bug che corrompeva le chiavi con più di 2
sottochiavi. I pacchetti GnuPG
più recenti (>1.2.1-2)
possono gestire queste sottochiavi corrotte. Vedere l'opzione
"--repair-pks-subkey-bug
in gpg
(1).
Quelli seguenti sono esempi di comandi per usare GNU Privacy Guard su file.
Tabella 10.14. Elenco di comandi GNU Privacy Guard per file
comando | descrizione |
---|---|
gpg -a -s file
|
firma un file in file.asc con corazza ASCII |
gpg --armor --sign file
|
" " |
gpg --clearsign file
|
inserisce una firma leggibile nel messaggio |
gpg --clearsign file|mail pippo@example.org
|
invia un messaggio di posta firmato leggibile a
pippo@example.org
|
gpg --clearsign --not-dash-escaped patchfile
|
inserisce una firma leggibile in patchfile |
gpg --verify file
|
verifica un file con firma leggibile |
gpg -o file.sig -b file
|
crea una firma staccata |
gpg -o file.sig --detach-sig file
|
" " |
gpg --verify file.sig file
|
verifica file con file.sig |
gpg -o cifr_file.gpg -r nome -e file
|
cifratura di file nel file binario cifr_file.gpg usando la chiave pubblica indirizzata a nome |
gpg -o cifr_file.gpg --recipient nome --encrypt file
|
" " |
gpg -o cifr_file.asc -a -r nome -e file
|
cifratura di file nel file con cifratura corazzata ASCII cifr_file.asc usando la chiave pubblica indirizzata a nome |
gpg -o cifr_file.gpg -c file
|
cifratura simmetrica da file a cifr_file.gpg |
gpg -o cifr_file.gpg --symmetric file
|
" " |
gpg -o cifr_file.asc -a -c file
|
cifratura simmetrica pensata per nome di file nel file con cifratura corazzata ASCII cifr_file.asc |
gpg -o file -d cifr_file.gpg -r nome
|
decifratura |
gpg -o file --decrypt cifr_file.gpg
|
" " |
Aggiungere quanto seguie al file "~/.muttrc
" per evitare
che il lento GnuPG venga avviato automaticamente, permettendo allo stesso
tempo di richiamarlo digitando "S
" nel menu della vista
indice.
macro index S ":toggle pgp_verify_sig\n" set pgp_verify_sig=no
Il plugin gnupg
permette di eseguire GnuPG in modo
trasparente per i file con estensione ".gpg
",
".asc
" e ".pgp
".
# aptitude install vim-scripts vim-addon-manager $ vim-addons install gnupg
md5sum
(1) fornisce un'utilità per creare un file digest
usando il metodo descritto nella rfc1321 e
per verificare i file con esso.
$ md5sum pippo pluto >paperino.md5 $ cat paperino.md5 d3b07384d113edec49eaa6238ad5ff00 pippo c157a79031e1c40f85931829bc5fc552 pluto $ md5sum -c paperino.md5 pippo: OK pluto: OK
Il calcolo delle somme di controllo MD5 è meno dispendioso in termini di CPU di quello delle firme crittografiche di GNU Privacy Guard (GnuPG). Di solito solamente il file digest di più alto livello è firmato crittograficamente per assicurare l'integrità dei dati.
Esistono molti strumenti per la fusione di codice sorgente. Quello che segue è un elenco di strumenti che hanno catturato la mia attenzione.
Tabella 10.15. Elenco di strumenti per la fusione di codice sorgente
comando | pacchetto | popcon | dimensione | descrizione |
---|---|---|---|---|
diff (1)
|
diff
*
|
V:68, I:85 | 36 | confronta i file riga per riga |
diff3 (1)
|
diff
*
|
V:68, I:85 | 36 | confronta e fonde tre file riga per riga |
vimdiff (1)
|
vim
*
|
V:15, I:33 | 1792 | confronta 2 file uno di fianco all'altro in vim |
patch (1)
|
patch
*
|
V:10, I:92 | 244 | applica un file diff ad un originale |
dpatch (1)
|
dpatch *
|
V:1.4, I:11 | 344 | gestisce serie di patch per pacchetti Debian |
diffstat (1)
|
diffstat *
|
V:2, I:15 | 92 | produce un istogramma delle modifiche apportate da un diff |
combinediff (1)
|
patchutils *
|
V:1.8, I:14 | 292 | crea una patch cumulativa da due patch incrementali |
dehtmldiff (1)
|
patchutils *
|
V:1.8, I:14 | 292 | estrae un diff da una pagina HTML |
filterdiff (1)
|
patchutils *
|
V:1.8, I:14 | 292 | estrae o esclude diff da un file diff |
fixcvsdiff (1)
|
patchutils *
|
V:1.8, I:14 | 292 |
aggiusta file diff creati da CVS che sono male interpretati da
patch (1)
|
flipdiff (1)
|
patchutils *
|
V:1.8, I:14 | 292 | scambia l'ordine di due patch |
grepdiff (1)
|
patchutils *
|
V:1.8, I:14 | 292 | mostra quali file siano modificati da una patch che fa corrispondenza con un'espressione regolare |
interdiff (1)
|
patchutils *
|
V:1.8, I:14 | 292 | mostra le differenze tra due file diff unificati |
lsdiff (1)
|
patchutils *
|
V:1.8, I:14 | 292 | mostra quali file vengano modificati da una patch |
recountdiff (1)
|
patchutils *
|
V:1.8, I:14 | 292 | ricalcola conteggi e offset in diff unificati |
rediff (1)
|
patchutils *
|
V:1.8, I:14 | 292 | aggiusta conteggi ed offset di un diff modificato a mano |
splitdiff (1)
|
patchutils *
|
V:1.8, I:14 | 292 | separa due patch incrementali |
unwrapdiff (1)
|
patchutils *
|
V:1.8, I:14 | 292 | ripristina patch il cui contenuto è stato mandato a capo automaticamente |
wiggle (1)
|
wiggle *
|
V:0.01, I:0.11 | 232 | applica le patch respinte |
quilt (1)
|
quilt
*
|
V:1.5, I:9 | 872 | gestisce serie di patch |
meld (1)
|
meld
*
|
V:0.7, I:2 | 2576 | confronta e fonde file (GTK) |
xxdiff (1)
|
xxdiff *
|
V:0.2, I:1.3 | 1352 | confronta e fonde file (X semplice) |
dirdiff (1)
|
dirdiff *
|
V:0.08, I:0.6 | 224 | mostra le differenze ed apporta i cambiamenti tra alberi di directory |
docdiff (1)
|
docdiff *
|
V:0.01, I:0.14 | 688 | confronta due file parola per parola / carattere per carattere |
imediff2 (1)
|
imediff2 *
|
V:0.02, I:0.10 | 76 | strumento interattivo a tutto schermo di applicazione di modifiche bidirezionale |
makepatch (1)
|
makepatch *
|
V:0.01, I:0.17 | 148 | genera file patch estesi |
applypatch (1)
|
makepatch *
|
V:0.01, I:0.17 | 148 | applica file patch estesi |
wdiff (1)
|
wdiff
*
|
V:1.6, I:14 | 1024 | mostra le differenze di parole tra file di testo |
Si possono estrarre le differenze tra due file sorgenti e creare file diff
unificati "file.patch0
" o
"file.patch1
", a seconda della posizione del file, con
una delle procedure seguenti.
$ diff -u file.vecchio file.nuovo > file.patch0 $ diff -u vecchio/file nuovo/file > file.patch1
I file diff (chiamati anche file patch) sono usati per inviare aggiornamenti per un programma. Chi li riceve applica questo aggiornamento ad un altro file nel modo seguente.
$ patch -p0 file < file.patch0 $ patch -p1 file < file.patch1
Ecco un riassunto dei sistemi di controllo delle versioni (VCS) nel sistema Debian.
Se non si ha esperienza di sistemi VCS, si dovrebbe iniziare ad imparare con Git che sta acquistando sempre più popolarità.
Tabella 10.16. Elenco di strumenti per sistemi di controllo delle versioni
pacchetto | popcon | dimensione | strumento | tipo di VCS | commento |
---|---|---|---|---|---|
cssc
*
|
V:0.00, I:0.04 | 2240 | CSSC | locale | clone di SCCS Unix (deprecato) |
rcs
*
|
V:1.3, I:7 | 772 | RCS | locale | "SCCS Unix fatto bene" |
cvs
*
|
V:3, I:21 | 3660 | CVS | remoto | precedente standard per VCS remoto |
subversion *
|
V:10, I:31 | 4288 | Subversion | remoto | "CVS fatto bene", il nuovo standard di fatto per VCS remoto |
git
*
|
V:5, I:17 | 10632 | Git | distribuito | veloce DVCS in C (usato dal kernel Linux ed altri) |
mercurial *
|
V:1.8, I:6 | 368 | Mercurial | distribuito | DVCS in Python e un po' di C |
bzr
*
|
V:1.1, I:3 | 16220 | Bazaar | distribuito |
DVCS influenzato da tla , scritto in Python (usato da
Ubuntu)
|
darcs
*
|
V:0.19, I:1.4 | 9504 | Darcs | distribuito | DVCS con algebra intelligente per le patch (lento) |
tla
*
|
V:0.17, I:1.4 | 932 | GNU arch | distribuito | DVCS principalmente di Tom Lord (storico) |
monotone *
|
V:0.04, I:0.3 | 5272 | Monotone | distribuito | DVCS in C++ |
tkcvs
*
|
V:0.08, I:0.4 | 2476 | CVS, … | remoto | visualizzazione GUI di alberi di archivi VCS (CVS, Subversion, RCS) |
gitk
*
|
V:0.8, I:4 | 900 | Git | distribuito | visualizzazione GUI di alberi di repository VCS (Git) |
Un VCS viene a volte chiamato sistema di controllo delle revisioni (RCS) o gestione della configurazione software (SCM).
Al giorno d'oggi i VCS distribuiti come Git sono gli strumenti preferiti. CVS e Subversion possono essere ancora utili per aggregarsi ad alcune realtà di programmi open source esistenti.
Debian fornisce servizi VCS liberi attraverso il servizio Debian Alioth che supporta praticamente tutti i VCS. La sua documentazione è reperibile su http://wiki.debian.org/Alioth.
In Lenny il pacchetto git
conteneva "GNU Interactive
Tools" e il pacchetto git-core
era DVCS.
Ci sono alcune nozioni base da ricordare per creare un accesso condiviso ad un archivio VCS.
umask 002
" (vedere Sezione 1.2.4, «Controlle dei permessi per i file appena creati: umask»)
Quella che segue è una comparazione ipersemplificata, per dare un'idea generale dei comandi VCS nativi. La sequenza di comandi usata tipicamente può richiedere opzioni ed argomenti.
Tabella 10.17. Comparazione di comandi VCS nativi
CVS | Subversion | Git | funzione |
---|---|---|---|
cvs init
|
svn create
|
git init
|
creazione dell'archivio (locale) |
cvs login
|
- | - | login all'archivio remoto |
cvs co
|
svn co
|
git clone
|
fare il check out dell'archivio remoto come albero di directory di lavoro |
cvs up
|
svn up
|
git pull
|
aggiornare l'albero di lavoro fondendovi l'archivio remoto |
cvs add
|
svn add
|
git add .
|
aggiungere il/i file nell'albero di lavoro al VCS |
cvs rm
|
svn rm
|
git rm
|
rimuovere il/i file nell'albero di lavoro dal VCS |
cvs ci
|
svn ci
|
- | fare il commit dei cambiamenti all'archivio remoto |
- | - |
git commit -a
|
fare il commit dei cambiamenti all'archivio locale |
- | - |
git push
|
aggiornare l'archivio remoto con l'archivio locale |
cvs status
|
svn status
|
git status
|
visualizza lo stato dell'albero di lavoro dal VCS |
cvs diff
|
svn diff
|
git diff
|
diff <archivio_diriferimento> <albero_di_lavoro> |
- | - |
git repack -a -d; git prune
|
reimpacchetta l'archivio locale in un singolo pacchetto |
tkcvs
|
tkcvs
|
gitk
|
visualizzazione GUI dell'alberi dell'archivio VCS |
A partire dall'inizio del 2006, l'invocazione diretta, dalla riga di
comando, di un sottocomando di git
come
"git-xyz
" è diventata deprecata.
Gli strumenti con interfaccia utente grafica, come
tkcvs
(1) e gitk
(1), aiutano realmente
a tenere traccia della cronologia delle revisioni dei file. L'interfaccia
web fornita da molti archivi pubblici per la navigazione dei loro repository
è anch'essa piuttosto utile.
Git può lavorare direttamente con diversi archivi VCS, come quelli forniti
da CVS e Subversion, e fornisce archivi locali per modifiche locali tramite
i pacchetti git-cvs
e git-svn
. Vedere
Git per utenti CVS e la Sezione 10.9.4, «Git per repository Subversion».
Git ha comandi che non hanno equivalenti in CVS e Subversion: "fetch", "rebase", "cherry-pick", …
Vedere la documentazione seguente.
cvs
(1)
/usr/share/doc/cvs/html-cvsclient
"
/usr/share/doc/cvs/html-info
"
/usr/share/doc/cvsbook
"
info cvs
"
La configurazione seguente permette solo ai membri del gruppo
"src
" di fare commit nell'archivio CVS e solo ai membri
del gruppo "staff
" di amministrare il CVS, riducendo
perciò le possibilità di autodanneggiarsi.
# cd /var/lib; umask 002; mkdir cvs # export CVSROOT=/srv/cvs/progetto # cd $CVSROOT # chown root:src . # chmod 2775 . # cvs -d $CVSROOT init # cd CVSROOT # chown -R root:staff . # chmod 2775 . # touch val-tags # chmod 664 history val-tags # chown root:src history val-tags
Si può limitare la creazione di nuovi progetti modificando il proprietario
della directory "$CVSROOT
" in
"root:staff
" e i suoi permessi in
"3775
".
L'archivio CVS predefinito è indicato da "$CVSROOT
". Il
comando seguente imposta "$CVSROOT
" per l'accesso locale.
$ export CVSROOT=/srv/cvs/progetto
Molti server CVS pubblici forniscono accesso remoto solo in lettura
all'account "anonymous
" tramite il servizio pserver. I
contenuti del sito Debian, per esempio, sono mantenuti dal progetto webwml attraverso CVS sul servizio
Debian Alioth. Il comando seguente imposta "$CVSROOT
" per
l'accesso remoto al suo archivio CVS.
$ export CVSROOT=:pserver:anonymous@cvs.alioth.debian.org:/cvsroot/webwml $ cvs login
Dato che pserver è esposto ad attacchi di spionaggio ed è insicuro, l'accesso in scrittura è solitamente disabilitato dagli amministratori del server.
Il comando seguente imposta "$CVS_RSH
" e
"$CVSROOT
" per l'accesso remoto con SSH all'archivio CVS
del progetto webwml.
$ export CVS_RSH=ssh $ export CVSROOT=:ext:account@cvs.alioth.debian.org:/cvs/webwml
Si può anche usare l'autenticazione con chiave pubblica per SSH che elimina la richiesta di inserimento della password remota.
Creare un nuovo albero di sorgenti locale in
"~/percorso/di/modulo1
" con il comando seguente.
$ mkdir -p ~/percorso/di/modulo1; cd ~/percorso/di/modulo1
Popolare il nuovo albero di sorgenti locale in
"~/percorso/di/modulo1
" con i file.
Importarlo nel CVS con i parametri seguenti.
modulo1
"
Ramo-principale
" (etichetta per
l'intero ramo)
Rilascio-iniziale
" (etichetta per un
rilascio specifico)
$ cd ~/percorso/di/modulo1 $ cvs import -m "Inizio di modulo1" Ramo-principale Rilascio-iniziale $ rm -Rf . # opzionale
CVS non sovrascrive i file attuali nell'archivio, ma li sostituisce con
altri. Perciò i permessi di scrittura della directory dell'archivio sono
fondamentali. Per ogni nuovo modulo di modulo1
"
nell'archivio in "/srv/cvs/progetto
", eseguire i comandi
seguenti per assicurare che i permessi siano corretti, se necessario.
# cd /srv/cvs/progetto # chown -R root:src modulo1 # chmod -R ug+rwX modulo1 # chmod 2775 modulo1
Ecco un esempio di una sequenza tipica di azioni svolte nell'uso di CVS.
Controllare tutti i moduli disponibili dal progetto CVS a cui punta
"$CVSROOT
" con il comando seguente.
$ cvs rls CVSROOT modulo1 modulo2 ...
Fare il checkout di "modulo1
" nella sua directory
predefinita "./modulo1
" con il comando seguente.
$ cd ~/percorso/di $ cvs co modulo1 $ cd modulo1
Fare i cambiamenti desiderati necessari ai contenuti.
Controllare i cambiamenti facendo l'equivalente di "diff -u
[archivio] [locale]
" con il comando seguente.
$ cvs diff -u
Si scopre, ad esempio, di aver corrotto gravemente un file
"file_da_ripristinare
", ma gli altri file sono a posto.
Sovrascrivere "file_da_ripristinare
" con una copia pulita
dal CVS con il comando seguente.
$ cvs up -C file_da_ripristinare
Salvare l'albero dei sorgenti locale aggiornato sul CVS con il comando seguente.
$ cvs ci -m "Descrivere qui i cambiamenti"
Creare ed aggiungere il file "file_da_aggiungere
" al CVS
con il comando seguente.
$ vi file_da_aggiungere $ cvs add file_da_aggiungere $ cvs ci -m "Aggiunto file_da_aggiungere"
Fondere la versione più recente dal CVS con il comando seguente.
$ cvs up -d
Prestare attenzione alle righe che iniziano con "C
nomefile
" che indicano le modifiche che creano conflitti.
Cercare il codice non modificato in
".#nomefile.versione
".
Per trovare le modifiche che creano conflitti cercare
"<<<<<<<
" e
">>>>>>>
" nei file.
Modificare i file in modo da risolvere i conflitti.
Aggiungere un'etichetta di rilascio "Rilascio-1
" nel modo
seguente.
$ cvs ci -m "ultimo commit per Rilascio-1" $ cvs tag Rilascio-1
Modificare ulteriormente.
Rimuovere l'etichetta di rilascio "Rilascio-1
" con il
comando seguente.
$ cvs tag -d Rilascio-1
Fare il commit delle modifiche sul CVS con il comando seguente.
$ cvs ci -m "ultimissimo commit per Rilascio-1"
Riaggiungere l'etichetta di rilascio "Rilascio-1
"
all'HEAD CVS aggiornato principale con il comando seguente.
$ cvs tag Rilascio-1
Creare un ramo con un'etichetta permanente
"Rilascio-iniziale-risoluzionebug
" dalla versione
originale a cui punta l'etichetta "Rilascio-iniziale
" e
farne il checkout nella directory "~/percorso/di/vecchio
"
nel modo seguente.
$ cvs rtag -b -r Rilascio-iniziale Rilascio-iniziale-risoluzionebug modulo1 $ cd ~/percorso/di $ cvs co -r Rilascio-iniziale-risoluzionebug -d vecchio modulo1 $ cd vecchio
Per specificare una particolare data come punto di ramificazione, usare
"-D 2005-12-20
" (formato ISO
8601 per le date) invece di "-r
Rilascio-iniziale
".
Lavorare in questo albero locale di sorgenti che ha l'etichetta permanente
"Rilascio-iniziale-risoluzionebug
" e che è basato sulla
versione originale.
Lavorare in questo ramo da soli … fino a che qualcun altro non si aggiunge
al ramo "Rilascio-iniziale-risoluzionebug
".
Fare la sincronizzazione dei file modificati da altri in questo ramo, creando contemporaneamente nuove directory se necessario, con il comando seguente.
$ cvs up -d
Modificare i file in modo da risolvere i conflitti.
Fare il commit delle modifiche sul CVS con il comando seguente.
$ cvs ci -m "fatto il commit in questo ramo"
Aggiornare l'albero locale con l'HEAD del principale, rimuovendo allo stesso
tempo l'etichetta permanente ("-A
") e senza espansione
delle parole chiave ("-kk
"), con il comando seguente.
$ cvs up -d -kk -A
Aggiornare l'albero locale (contenuto = HEAD del principale) fondendo dal
ramo "Rilascio-iniziale-risoluzionebug
" e senza
espansione delle parole chiave con il comando seguente.
$ cvs up -d -kk -j Rilascio-iniziale-risoluzionebug
Correggere i conflitti con l'editor.
Fare il commit delle modifiche sul CVS con il comando seguente.
$ cvs ci -m "fusione con Rilascio-iniziale-risoluzionebug"
Creare un file archivio nel modo seguente.
$ cd .. $ mv vecchio vecchio-modulo1-risoluzionebug $ tar -cvzf vecchio-modulo1-risoluzionebug.tar.gz vecchio-modulo1-risoluzionebug $ rm -rf vecchio-modulo1-risoluzionebug
Il comando "cvs up
" accetta l'opzione
"-d
" per creare nuove directory e l'opzione
"-P
" per eliminare le directory vuote.
Si può fare il checkout solamente di una sottodirectory di
"modulo1
" fornendo il suo nome come in "cvs co
modulo1/sottodir
".
Tabella 10.18. Opzioni importanti per comandi CVS (da usare come primi argomenti di
cvs
(1))
opzione | significato |
---|---|
-n
|
esecuzione di prova, nessun effetto |
-t
|
visualizza i messaggi che mostrano i passi dell'attività di cvs |
Per ottenere i file più recenti dal CVS usare "tomorrow
"
nel modo seguente.
$ cvs ex -D tomorrow nome_modulo
Aggiungere l'alias "mx
" per un modulo ad un progetto CVS
(server locale) usando il comando seguente.
$ export CVSROOT=/srv/cvs/progetto $ cvs co CVSROOT/moduli $ cd CVSROOT $ echo "mx -a modulo1" >>moduli $ cvs ci -m "Ora mx e' un alias per modulo1" $ cvs release -d .
Ora si può fare il checkout di "modulo1
" (alias:
"mx
") dal CVS alla directory "nuova
"
nel modo seguente.
$ cvs co -d nuova mx $ cd nuova
Per seguire la procedura precedente sono necessari gli adeguati permessi sui file.
Quando si fa il checkout di file dal CVS viene mantenuto il loro bit del permesso di esecuzione.
Ogni volta si incontrano problemi con i permessi di esecuzione di un file di
cui si è fatto il checkout, ad esempio "nomefile
", per
risolverli cambiare i suoi permessi nell'archivio CVS corrispondente nel
modo seguente.
# chmod ugo-x nomefile
Subversion è un sistema di controllo delle versioni di recente generazione che rimpiazza il più vecchio CVS. Ha la maggior parte delle funzionalità di CVS, tranne le etichette ed i rami.
Per impostare un server Subversion è necessario installare i pacchetti
subversion
, libapache2-svn
e
subversion-tools
.
Attualmente il pacchetto subversion
non imposta un
archivio, perciò è necessario farlo manualmente. Una possibile collocazione
per un archivio è in "/srv/svn/progetto
".
Crear una directory con il comando seguente
# mkdir -p /srv/svn/progetto
Creare il database dell'archivio con il comando seguente.
# svnadmin create /srv/svn/progetto
Se si accede all'archivio Subversion solamente attraverso il server Apache2, è necessario soltanto rendere l'archivio scrivibile dal server WWW, nel modo seguente.
# chown -R www-data:www-data /srv/svn/progetto
Per permettere l'accesso all'archivio tramite autenticazione dell'utente
aggiungere (o decommentare) quanto segue in
"/etc/apache2/mods-available/dav_svn.conf
".
<Location /progetto> DAV svn SVNPath /srv/svn/progetto AuthType Basic AuthName "Subversion repository" AuthUserFile /etc/subversion/passwd <LimitExcept GET PROPFIND OPTIONS REPORT> Require valid-user </LimitExcept> </Location>
Creare un file di autenticazione dell'utente con il comando seguente.
# htpasswd2 -c /etc/subversion/passwd un-qualche-nomeutente
Riavviare Apache2.
Il nuovo archivio Subversion è accessibile da svn
(1) agli
URL "http://localhost/progetto
" e
"http://esempio.com/progetto
" (assumendo che l'URL del
proprio server web sia "http://esempio.com/
").
I comandi seguenti impostano l'archivio Subversion per l'accesso locale da
parte di un gruppo, ad esempio progetto
.
# chmod 2775 /srv/svn/progetto # chown -R root:src /srv/svn/progetto # chmod -R ug+rwX /srv/svn/progetto
Il nuovo archivio Subversion è accessibile con svn
(1) per
gli utenti locali che appartengono al gruppo progetto
,
all'URL "file:///localhost/srv/svn/progetto
" o
"file:///srv/svn/progetto
". Per assicurare l'accesso al
gruppo è necessario usare i programmi come svn
,
svnserve
, svnlook
e
svnadmin
con "umask 002
".
Se esiste un archivio Subversion accessibile da un gruppo all'URL
"esempio.com:/srv/svn/progetto
", si può accedere ad esso
con svn
(1) e SSH all'URL
"svn+ssh://esempio.com:/srv/svn/progetto
".
Per compensare la mancanza di rami ed etichette in Subversion, molti progetti usano con esso un albero di directory simile al seguente.
----- modulo1 | |-- branches | |-- tags | | |-- rilascio-1.0 | | `-- rilascio-2.0 | | | `-- trunk | |-- file1 | |-- file2 | `-- file3 | `-- modulo2
Per marcare i rami e le etichette è necessario usare il comando
"svn copy …
". Ciò assicura che Subversion regisstri la
cronologia dei cambiamenti dei file in maniera corretta e risparma spazio.
Creare un nuovo albero di sorgenti locale in
"~/percorso/di/modulo1
" con il comando seguente.
$ mkdir -p ~/percorso/di/modulo1; cd ~/percorso/di/modulo1
Popolare il nuovo albero di sorgenti locale in
"~/percorso/di/modulo1
" con i file.
Importarlo In Subversion con i parametri seguenti.
modulo1
"
file:///srv/svn/progetto
"
modulo1/trunk
"
modulo1/tags/Rilascio-iniziale
"
$ cd ~/percorso/di/modulo1 $ svn import file:///srv/svn/progetto/modulo1/trunk -m "Inizo di modulo1" $ svn cp file:///srv/svn/progetto/modulo1/trunk file:///srv/svn/progetto/modulo1/tags/Rilascio-iniziale
In alternativa usare i comandi seguenti.
$ svn import ~/percorso/di/modulo1 file:///srv/svn/progetto/modulo1/trunk -m "Inizo di modulo1" $ svn cp file:///srv/svn/progetto/modulo1/trunk file:///srv/svn/progetto/modulo1/tags/Rilascio-iniziale
Si possono sostituire gli URL come "file:///…
" con URL in
qualsiasi altro formato, come "http://…
" e
"svn+ssh://…
".
Ecco un esempio di una sequenza tipica di azioni svolte nell'uso di Subversion con il suo client nativo.
I comandi client forniti dal pacchetto git-svn
possono
offrire un metodo alternativo di lavoro con Subversion con l'uso del comando
git
. Vedere Sezione 10.9.4, «Git per repository Subversion».
Controllare tutti i moduli disponibili dal progetto Subversion a cui punta
l'URL "file:///srv/svn/progetto
" con il comando seguente.
$ svn list file:///srv/svn/progetto modulo1 modulo2 ...
Fare il checkout di "modulo1/trunk
" in una directory
"./modulo1
" con il comando seguente.
$ cd ~/percorso/di $ svn co file:///srv/svn/progetto/modulo1/trunk modulo1 $ cd modulo1
Fare i cambiamenti desiderati necessari ai contenuti.
Controllare i cambiamenti facendo l'equivalente di "diff -u
[archivio] [locale]
" con il comando seguente.
$ svn diff
Si scopre, ad esempio, di aver corrotto gravemente un file
"file_da_ripristinare
", ma gli altri file sono a posto.
Sovrascrivere "file_da_ripristinare
" con una copia pulita
da Subversion con il comando seguente.
$ svn revert file_da_ripristinare
Salvare l'albero dei sorgenti locale aggiornato su Subversion con il comando seguente.
$ svn ci -m "Descrivere qui i cambiamenti"
Creare ed aggiungere il file "file_da_aggiungere
" a
Subversion con il comando seguente.
$ vi file_da_aggiungere $ svn add file_da_aggiungere $ svn ci -m "Aggiunto file_da_aggiungere"
Fondere la versione più recente da Subversion con il comando seguente.
$ svn up
Prestare attenzione alle righe che iniziano con "C
nomefile
" che indicano le modifiche che creano conflitti.
Cercare codice non modificato in, ad esempio
"nomefile.r6
", "nomefile.r9
" e
"nomefile.mio
".
Per trovare le modifiche che creano conflitti cercare
"<<<<<<<
" e
">>>>>>>
" nei file.
Modificare i file in modo da risolvere i conflitti.
Aggiungere un'etichetta di rilascio "Rilascio-1
" nel modo
seguente.
$ svn ci -m "ultimo commit per Rilascio-1" $ svn cp file:///srv/svn/progetto/modulo1/trunk file:///srv/svn/progetto/modulo1/tags/Rilascio-1
Modificare ulteriormente.
Rimuovere l'etichetta di rilascio "Rilascio-1
" con il
comando seguente.
$ svn rm file:///srv/svn/progetto/modulo1/tags/Rilascio-1
Fare il commit delle modifiche su Subversion con il comando seguente.
$ svn ci -m "ultimissimo commit per Rilascio-1"
Riaggiungere l'etichetta di rilascio "Rilascio-1
"
all'HEAD CVS aggiornato di trunk con il comando seguente.
$ svn cp file:///srv/svn/progetto/modulo1/trunk file:///srv/svn/progetto/modulo1/tags/Rilascio-1
Creare un ramo con percorso
"modulo1/branches/Rilascio-iniziale-risoluzionebug
" dalla
versione originale a cui punta il percorso
"modulo1/tags/Rilascio-iniziale
" e farne il checkout
nella directory "~/percorso/di/vecchio
" nel modo
seguente.
$ svn cp file:///srv/svn/progetto/modulo1/tags/Rilascio-initzale file:///srv/svn/progetto/modulo1/branches/Rilascio-iniziale-risoluzionebug $ cd ~/percorso/di $ svn co file:///srv/svn/progetto/modulo1/branches/Rilascio-iniziale-risoluzionebug vecchio $ cd vecchio
Per specificare una particolare data come punto di ramificazione, usare
"modulo1/trunk@{2005-12-20}
" (formato ISO 8601 per le date) invece di
"modulo1/tags/Rilascio-iniziale
".
Lavorare in questo albero locale di sorgenti che punta al ramo
"Rilascio-iniziale-risoluzionebug
" e che è basato sulla
versione originale.
Lavorare in questo ramo da soli … fino a che qualcun altro non si aggiunge
al ramo "Rilascio-iniziale-risoluzionebug
".
Fare la sincronizzazione con i file in questo ramo modificati da altri, con il comando seguente.
$ svn up
Modificare i file in modo da risolvere i conflitti.
Fare il commit delle modifiche su Subversion con il comando seguente.
$ svn ci -m "fatto il commit in questo ramo"
Aggiornare l'albero locae con HEAD di trunk nel modo seguente.
$ svn switch file:///srv/svn/progetto/modulo1/trunk
Aggiornare l'albero locale (contenuto = HEAD di trunk) fondendo dal ramo
"Rilascio-iniziale-risoluzionebug
" con il comando
seguente.
$ svn merge file:///srv/svn/progetto/modulo1/branches/Rilascio-iniziale-risoluzionebug
Correggere i conflitti con l'editor.
Fare il commit delle modifiche su Subversion con il comando seguente.
$ svn ci -m "fusione con Rilascio-iniziale-risoluzionebug"
Creare un file archivio nel modo seguente.
$ cd .. $ mv vecchio vecchio-modulo1-risoluzionebug $ tar -cvzf vecchio-modulo1-risoluzionebug.tar.gz vecchio-modulo1-risoluzionebug $ rm -rf vecchio-modulo1-risoluzionebug
Si possono sostituire gli URL come "file:///…
" con URL in
qualsiasi altro formato, come "http://…
" e
"svn+ssh://…
".
Si può fare il checkout solamente di una sottodirectory di
"modulo1
" fornendo il suo nome come in "svn co
file:///srv/svn/progetto/modulo1/trunk/sottodir modulo1/sottodir
",
ecc.
Tabella 10.19. Opzioni importanti per comandi Subversion (da usare come primi argomenti di
svn
(1))
opzione | significato |
---|---|
--dry-run
|
esecuzione di prova, nessun effetto |
-v
|
visualizza messaggi dettagliati sull'attività di svn |
Git può fare tutto ciò che riguarda la gestione di codice sorgente, sia in locale sia in remoto. Ciò significa che è possibile registrare i cambiamenti al codice sorgente senza bisogno di connessione di rete all'archivio remoto.
È possibile che si desideri impostare diverse configurazioni globali, come
il nome e l'indirizzo di posta elettronica usati da Git, in
"~/.gitconfig
" nel modo seguente.
$ git config --global user.name "Nome Cognome" $ git config --global user.email proprionome@esempio.com
Se si è abituati ai comandi di CVS o Subversion, si potrebbe volere impostare alcuni alias per i comandi nel modo seguente.
$ git config --global alias.ci "commit -a" $ git config --global alias.co checkout
La configurazione globale può essere controllata con il comando seguente.
$ git config --global --list
Vedere la documentazione seguente.
/usr/share/doc/git-doc/git.html
)
/usr/share/doc/git-doc/user-manual.html
)
/usr/share/doc/git-doc/gittutorial.html
)
/usr/share/doc/git-doc/gittutorial-2.html
)
/usr/share/doc/git-doc/everyday.html
)
git per gli utenti CVS
(/usr/share/doc/git-doc/gitcvs-migration.html
)
Altre risorse git disponibili in rete
/usr/share/doc/gitmagic/html/index.html
)
I comandi git-gui
(1) e gitk
(1) rendono
l'uso di Git molto semplice.
Non usare stringhe per etichette contenenti spazi, anche se alcuni strumenti
come gitk
(1) lo permettono. Altri comandi
git
potrebbero avere problemi con esse.
Anche se l'archivio a monte usa un diverso VCS, potrebbe essere una buona
idea usare git
(1) per l'attività locale, dato che si può
gestire la propria copa locale dell'albero dei sorgenti senza una
connessione di rete con l'archivio a monte. Ecco alcuni pacchetti e comandi
usati con git
(1).
Tabella 10.20. Elenco di pacchetti e comandi relativi a Git
comando | pacchetto | popcon | dimensione | descrizione |
---|---|---|---|---|
N/D |
git-doc *
|
I:3 | 7436 | documentazione uffiicia per Git |
N/D |
gitmagic *
|
I:0.3 | 920 | "Git Magic", una guida per Git più semplice da capire |
git (7)
|
git
*
|
V:5, I:17 | 10632 | Git, il sistema di controllo delle revisioni veloce, scalabile e distribuito |
gitk (1)
|
gitk
*
|
V:0.8, I:4 | 900 | browser degli archivi Git con interfaccia utente grafica e cronologia |
git-gui (1)
|
git-gui *
|
V:0.3, I:2 | 1612 | interfaccia utente grafica per Git (senza cronologia) |
git-svnimport (1)
|
git-svn *
|
V:0.5, I:3 | 552 | importa i dati da Subversion in Git |
git-svn (1)
|
git-svn *
|
V:0.5, I:3 | 552 | fornisce operazioni bidirezionali tra Subversion e Git |
git-cvsimport (1)
|
git-cvs *
|
V:0.17, I:1.6 | 676 | importa i dati da CVS in Git |
git-cvsexportcommit (1)
|
git-cvs *
|
V:0.17, I:1.6 | 676 | esporta un commit a un checkout CVS da Git |
git-cvsserver (1)
|
git-cvs *
|
V:0.17, I:1.6 | 676 | emulatore di server CVS per Git |
git-send-email (1)
|
git-email *
|
V:0.12, I:1.7 | 404 | invia una raccolta di patch come messaggio di posta da Git |
stg (1)
|
stgit
*
|
V:0.07, I:0.7 | 1864 | quilt sopra a git (Python) |
git-buildpackage (1)
|
git-buildpackage *
|
V:0.2, I:1.1 | 596 | automatizza la creazione di pacchetti Debian con Git |
guilt (7)
|
guilt
*
|
V:0.01, I:0.11 | 336 | quilt sopra a git (SH/AWK/SED/…) |
Con git
(1) si lavora su un ramo locale con molti commit e
si usa successivamente un comando simile a "git rebase -i
master
" per riorganizzare la cronologia dei cambiamenti. Ciò
permette di avere cronologie dei cambiamenti pulite. Vedere
git-rebase
(1) e git-cherry-pick
(1).
Quando si vuole tornare ad una directory di lavore pulita senza perdere lo
stato attuale della directory di lavoro, si può usare "git
stash
". Vedere git-stash
(1).
Si può fare il check out di un repository Subversion su
"svn+ssh://svn.example.org/project/module/trunk
" in un
repository Git locale in "./dest
" fare poi nuovamente il
commit sul repository Subversion.
Ad esempio:
$ git svn clone -s -rHEAD svn+ssh://svn.esempio.org/progetto dest $ cd dest ... fare i cambiamenti $ git commit -a ... continuare a lavorare localmente con git $ git svn dcommit
L'uso di "-rHEAD
" permette di evitare di dover clonare
tutti i contenuti della cronologia del repository Subversion.
Si può registrare manualmente la cronologia della configurazione usando
strumenti Git. Quello che segue è un semplice
esempio che insegna a registrare il contenuto di
"/etc/apt/
".
$ cd /etc/apt/ $ sudo git init $ sudo chmod 700 .git $ sudo git add . $ sudo git commit -a
Fare il commit della configurazione con una descrizione.
Modificare i file di configurazione
$ cd /etc/apt/ $ sudo git commit -a
Fare il commit della configurazione con una descrizione e andare a vanti con la propria vita.
$ cd /etc/apt/ $ sudo gitk --all
Si avrà una completa cronologia della configurazione.
Per lavorare con tutti i tipi di permessi dei dati di configurazione è
necessario sudo
(8). Per i dati di configurazione
dell'utente, si può saltare l'uso di sudo
.
Il comando "chmod 700 .git
" nell'esempio precedente è
necessario per proteggere i dati dell'archivio da accessi non autorizzati.
Per l'impostazione di un sistema di registrazione della configurazione più
completo, guardare il pacchetto etckeeper
: Sezione 9.2.10, «Registrare i cambiamenti a file di configurazione».
In questo capitolo sono descritti strumenti e trucchi per convertire tra diversi formati di dati in un sistema Debian.
Gli strumenti standard sono eccellenti, ma il supporto per i formati proprietari per i dati è limitato.
Quelli che seguono sono pacchetti per la conversione dei dati testuali che hanno attirato la mia attenzione.
Tabella 11.1. Elenco di strumenti di conversione di dati testuali
pacchetto | popcon | dimensione | parola chiave | descrizione |
---|---|---|---|---|
libc6
*
|
V:97, I:99 | 10012 | set di caratteri |
convertitore della codifica del testo tra localizzazioni usando
iconv (1) (fondamentale)
|
recode *
|
V:1.5, I:7 | 772 | set caratteri+carattere fine riga | convertitore della codifica del testo tra localizzazioni (versatile, maggior numero di alias e funzionalità) |
konwert *
|
V:0.4, I:4 | 192 | set di caratteri | convertitore della codifica tra localizzazioni (elegante) |
nkf
*
|
V:0.2, I:2 | 300 | set di caratteri | traduttore del set di caratteri per il giapponese |
tcs
*
|
V:0.02, I:0.14 | 544 | set di caratteri | traduttore del set di caratteri |
unaccent *
|
V:0.01, I:0.09 | 76 | set di caratteri | sostituisce le lettere accentate con le equivalenti senza accento |
tofrodos *
|
V:1.1, I:7 | 48 | carattere fine riga |
convertitore del formato di testo tra DOS e Unix:
fromdos (1) e todos (1)
|
macutils *
|
V:0.05, I:0.5 | 320 | carattere fine riga |
convertitore del formato di testo tra Macintosh e Unix:
frommac (1) e tomac (1)
|
iconv
(1) viene fornito come parte del pacchetto
libc6
ed è sempre disponibile praticamente su tutti i
sistemi, per fare la conversione della codifica dei caratteri.
Si può convertire la codifica di un file di testo con
iconv
(1) nel modo seguente.
$ iconv -f codifica1 -t codifica2 input.txt >output.txt
Nel trovare corrispondenze con i valori delle codifiche non viene tenuto
conto delle lettere maiuscole o minuscole e vengono ignorati i caratteri
"-
" e "_
". Si possono controllare le
codifiche supportate con il comando "iconv -l
".
Tabella 11.2. Elenco dei valori delle codifiche e loro uso
valore della codifica | uso |
---|---|
ASCII. | American Standard Code for Information Interchange, codifica americana standard per lo scambio di informazioni, codice a 7 bit senza caratteri accentati |
UTF-8 | attuale standard multilingua per tutti i sistemi operativi moderni |
ISO-8859-1 | vecchio standard per le lingue europee occidentali, ASCII + caratteri accentati |
ISO-8859-2 | vecchio standard per le lingue europee orientali, ASCII + caratteri accentati |
ISO-8859-15 | vecchio standard per le lingue europee occidentali, ISO-8859-1 con simbolo dell'euro |
CP850 | code page 850, caratteri Microsoft DOS con caratteri grafici per le lingue europee occidentali, variante di ISO-8859-1 |
CP932 | code page 932, variante in stile Microsoft Windows di Shift-JIS per il giapponese |
CP936 | code page 936, variante in stile Microsoft Windows di GB2312, GBK o GB18030 per il cinese semplificato |
CP949 | code page 949, variante in stile Microsoft Windows di EUC-KR o Unified Hangul Code per il coreano |
CP950 | code page 950, variante in stile Microsoft Windows di Big5 per il cinese tradizionale |
CP1251 | code page 1251, codifica in stile Microsoft Windows per l'alfabeto cirillico |
CP1252 | code page 1252, variante in stile Microsoft Windows di ISO-8859-15 per le lingue europee occidentali |
KOI8-R | vecchio standard UNIX russo per l'alfabeto cirillico |
ISO-2022-JP | codifica standard per la posta elettronica in giapponese che usa solo codici a 7 bit |
eucJP | vecchio standard UNIX giapponese con codici a 8 bit completamente diverso da Shift-JIS |
Shift-JIS | standard JIS X 0208 Appendix 1 per il giapponese (vedere CP932) |
Alcune codifiche non sono gestite in fase di conversione dei dati e non sono utilizzate come valori di localizzazione (Sezione 8.3.1, «Nozioni base sulla codifica»).
Per i set di caratteri contenuti in un singolo byte, come i set di caratteri ASCII e ISO-8859, la codifica di carattere è quasi la stessa cosa del set di caratteri.
Per i set di caratteri con molti caratteri, come JIS X 0213 per il giapponese o Universal Character Set (UCS, Unicode, ISO-10646-1) per praticamente tutte le lingue, esistono molti schemi di codifica per inserirli nella sequenza dei byte dati.
In questi casi c'è una netta differenza tra il set di caratteri e la codifica di caratteri.
Il termine code page è usato come sinonimo di tabella di codifica dei caratteri per alcune tabelle specifiche di produttori.
Notare che la maggior parte dei sistemi di codifica condividono con ASCII
gli stessi codici per i caratteri a 7 bit. Ci sono però alcune eccezioni. Se
si stanno convertendo dati di vecchi programmi C o URL in giapponese dal
formato di codifica volgarmente chiamato Shift-JIS in formato UTF-8, usare
"CP932
" come nome di codifica invece di
"shift-JIS
" per ottenere i risultati attesi:
0x5C
→ "\
" e 0x7E
→
"~
". Altrimenti questi vengono convertiti nei caratteri
sbagliati.
Si può anche usare recode
(1) che offre più della semplice
combinazione delle funzionalità di iconv
(1),
fromdos
(1), todos
(1),
frommac
(1) e tomac
(1). Per maggiori
informazioni vedere "info recode
".
Si può controllare se un file di testo è nella codifica UTF-8 usando
iconv
(1) nel modo seguente.
$ iconv -f utf8 -t utf8 input.txt >/dev/null || echo "trovato non-UTF-8"
Usare l'opzione "--verbose
" nell'esempio precedente per
trovare il primo carattere non UTF-8.
Ecco uno script d'esempio per convertire in una directory la codifica dei nomi di file dai nomi creati in un vecchio sistema operativo a quelli UTF-8 moderni.
#!/bin/sh ENCDN=iso-8859-1 for x in *; do mv "$x" $(echo "$x" | iconv -f $ENCDN -t utf-8) done
La variabile "$ENCDN
" deve essere impostata al valore
della codifica appropriato Tabella 11.2, «Elenco dei valori delle codifiche e loro uso».
Per scenari più complessi, montare, usando come opzione di
mount
(8) la codifica appropriata (vedere Sezione 8.3.6, «Codifica per i nomi di file»), il file system (ad esempio una partizione
in un disco fisso) contenente tali nomi di file e copiare usando il comando
"cp-a
" il suo intero contenuto in un altro file system
montato come UTF-8.
Il formato dei file di testo e specificatamente il codice EOL (End of line, fine riga) è dipendente dalla piattaforma.
Tabella 11.3. Elenco di stili per EOL per differenti piattaforme
piattaforma | codice EOL | carattere di controllo | decimale | esadecimale |
---|---|---|---|---|
Debian (unix) | LF |
^J
|
10 | 0A |
MSDOS e Windows | CR-LF |
^M^J
|
13 10 | 0D 0A |
Macintosh di Apple | CR |
^M
|
13 | 0D |
I programmi di conversione del formato di EOL,
fromdos
(1), todos
(1),
frommac
(1) e tomac
(1), sono piuttosto
comodi. Anche recode
(1) è utile.
Alcuni dati nel sistema Debian, come i dati della pagina wiki per il
pacchetto python-moinmoin
, usano CR-LF in stile MSDOS
come codice EOL. Perciò la regola sopra descritta è solamente una regola
generale.
La maggior parte degli editor (es. vim
,
emacs
, gedit
, …) può gestire file con
EOL in stile MSDOS in modo trasparente.
È meglio usare "sed -e '/\r$/!s/$/\r/'
" invece di
todos
(1) quando si desidere unificare lo stile EOL allo
stile MSDOS da uno stile misto MSDOS e Unix (ad esempio dopo la fusione di 2
file in stile MSDOS con diff3
(1)). Questo perché
todos
aggiunge CR a tutte le righe.
Esistono alcuni programmi popolari specializzati nella conversione dei codici di tabulazione.
Tabella 11.4. Elenco di comandi di conversione di TAB dai pacchetti
bsdmainutils
e coreutils
funzione |
bsdmainutils
|
coreutils
|
---|---|---|
espande le tabulazioni in spazi |
"col -x "
|
expand
|
de-espande gli spazi in tabulazioni |
"col -h "
|
unexpand
|
indent
(1) nel pacchetto indent
riformatta completamente gli spazi bianchi nei programmi C.
Anche programmi editor come vim
ed
emacs
possono essere usati per la conversione di TAB. Per
esempio con vim
, è possibile espandere i TAB con la
sequenza di comandi ":set expandtab
" e
":%retab
". Si può annullare questa azione con la sequenza
di comandi ":set noexpandtab
" e
":%retab!
".
Gli editor moderni intelligenti come il programmavim
sono
piuttosto bravi e gestiscono bene qualsiasi sistema di codifica e formato di
file. Per una migliore compatibilità questi editor andrebbero usati con la
localizzazione UTF-8 in console con capacità UTF-8.
Un vecchio file di testo Unix in lingua europea occidentale,
"u-file.txt
" salvato nella codifica latin1 (iso-8859-1)
può essere modificato con vim
semplicemente con il
comando seguente.
$ vim u-file.txt
Ciò è reso possibile dal fatto che il meccanismo di rivelazione automatica
della codifica dei file di vim
presuppone come prima cosa
che la codifica sia UTF-8 e, se ciò fallisce, presuppone che sia latin1.
Un vecchio file di testo Unix in lingua polacca,
"pu-file.txt
" salvato nella codifica latin1 (iso-8859-1)
può essere modificato con vim
con il comando seguente.
$ vim '+e ++enc=latin2 pu-file.txt'
Un vecchio file di testo Unix in giapponese,
"ju-file.txt
" salvato nella codifica eucJP può essere
modificato con vim
con il comando seguente.
$ vim '+e ++enc=eucJP ju-file.txt'
Un vecchio file di testo MS-Windows in giapponese,
"jw-file.txt
" salvato nella cosiddetta codifica shift-JIS
(più precisamente CP932) può essere modificato con vim
con il comando seguente.
$ vim '+e ++enc=CP932 ++ff=dos jw-file.txt'
Quando un file viene aperto con le opzioni "++enc
" e
"++ff
", l'uso di ":w
" nella riga di
comando di Vim lo salva nel formato originale sovrascrivendo il file
originale. Si può anche specificare nella riga di comando di Vim il formato
e il nome con cui salvare il file, ad esempio ":w ++enc=utf8
nuovo.txt
".
Fare riferimento a mbyte.txt per il "supporto di testi multi-byte"
nell'aiuto in linea di vim
e a Tabella 11.2, «Elenco dei valori delle codifiche e loro uso» per i valori delle localizzazione usati
con "++enc
".
La famiglia di programmi emacs
può svolgere funzioni
equivalenti.
Il comando seguente legge una pagina web mettendola in un file di testo. È
molto utile quando si copiano configurazioni dal Web o per applicare
strumenti di testo base Unix come grep
(1) sulla pagina
web.
$ w3m -dump http://www.sito-remoto.com/help-info.html >filetesto
In modo analogo, si possono estrarre dati in testo puro da altri formati con gli strumenti seguenti.
Tabella 11.5. Elenco di strumenti per estrarre dati in testo puro
pacchetto | popcon | dimensione | parola chiave | funzione |
---|---|---|---|---|
w3m
*
|
V:24, I:84 | 1992 | html→testo puro |
conversione da HTML a testo semplice con il comando "w3m
-dump "
|
html2text *
|
V:15, I:37 | 248 | html→testo puro | convertitore avanzato da HTML a testo semplice (ISO 8859-1) |
lynx
*
|
I:22 | 252 | html→testo puro |
conversione da HTML a testo semplice con il comando "lynx
-dump "
|
elinks *
|
V:2, I:5 | 1448 | html→testo puro |
conversione da HTML a testo semplice con il comando "elinks
-dump "
|
links
*
|
V:3, I:9 | 1380 | html→testo puro |
conversione da HTML a testo semplice con il comando "links
-dump "
|
links2 *
|
V:0.7, I:3 | 3288 | html→testo puro |
conversione da HTML a testo semplice con il comando "links2
-dump "
|
antiword *
|
V:1.3, I:2 | 796 | MSWord→testo puro, ps | converte file MSWord in testo puro o ps |
catdoc *
|
V:1.0, I:2 | 2580 | MSWord→testo puro, TeX | converte file MSWord in testo puro o TeX |
pstotext *
|
V:0.8, I:1.4 | 148 | ps/pdf→testo puro | estrae testo da file PostScript e PDF |
unhtml *
|
V:0.02, I:0.14 | 76 | html→testo puro | rimuove i tag marcatori da file HTML |
odt2txt *
|
V:0.8, I:1.4 | 100 | odt→testo puro | converte da OpenDocument Text in testo puro |
wpd2sxw *
|
V:0.02, I:0.13 | 156 | WordPerfect→sxw | convertitore di documenti da WordPerfect a elaboratrore di testi OpenOffice.org/StarOffice |
È possibile evidenziare e formattare dati in testo puro usando gli strumenti seguenti.
Tabella 11.6. Elenco di strumenti per evidenziare dati in testo puro
pacchetto | popcon | dimensione | parola chiave | descrizione |
---|---|---|---|---|
vim-runtime *
|
V:3, I:38 | 25864 | evidenziare |
MACRO Vim per convertire codice sorgente in HTML con ":source
$VIMRUNTIME/syntax/html.vim "
|
cxref
*
|
V:0.05, I:0.4 | 1252 | c→html | convertitore per programmi C in latex e HTML (linguaggio C) |
src2tex *
|
V:0.03, I:0.2 | 1968 | evidenziare | converte molti codici sorgenti in TeX (linguaggio C) |
source-highlight *
|
V:0.14, I:1.1 | 2164 | evidenziare | converte molti codici sorgenti in file HTML, XHTML, LaTeX, Texinfo, sequenze di escape per colori ANSI e DocBook con evidenziazione (C++) |
highlight *
|
V:0.2, I:1.3 | 756 | evidenziare | converte molti codici sorgenti in file HTML, XHTML, RTF, LaTeX, TeX o XSL-FO con evidenziazione (C++) |
grc
*
|
V:0.05, I:0.12 | 164 | testo→colori | colorazione generica per tutto (Python) |
txt2html *
|
V:0.08, I:0.5 | 296 | testo→html | convertitore da testo semplice in HTML (Perl) |
markdown *
|
V:0.07, I:0.4 | 96 | testo→html | formattatore markdown di documenti di testo in (X)HTML (Perl) |
asciidoc *
|
V:0.15, I:1.1 | 3028 | testo→tutto | formattatore AsciiDoc di documenti di testo in XML/HTML (Python) |
python-docutils *
|
V:0.4, I:3 | 5740 | testo→tutto | formattatore di documenti ReStructured Text in XML (Python) |
txt2tags *
|
V:0.06, I:0.3 | 1028 | testo→tutto | conversione di documenti da testo semplice a HTML, SGML, LaTeX, pagine man, MoinMoin, Magic Point e PageMaker (Python) |
udo
*
|
V:0.01, I:0.07 | 556 | testo→tutto | utilità universale di elaborazione di documenti - testo (linguaggio C) |
stx2any *
|
V:0.00, I:0.04 | 484 | testo→tutto | convertitore di documenti da testo semplice strutturato in altri formati (m4) |
rest2web *
|
V:0.01, I:0.08 | 576 | testo→html | convertitore di documenti da ReStructured Text in HTML (Python) |
aft
*
|
V:0.01, I:0.06 | 340 | testo→tutto | sistema di preparazione di documenti a "modello libero" (Perl) |
yodl
*
|
V:0.01, I:0.06 | 564 | testo→tutto | pre-linguaggio per documenti e strumenti per elaborarlo (linguaggio C) |
sdf
*
|
V:0.01, I:0.08 | 1940 | testo→tutto | semplice analizzatore di documenti (Perl) |
sisu
*
|
V:0.01, I:0.07 | 14384 | testo→tutto | infrastruttura per strutturazione, pubblicazione e ricerca di documenti (Ruby) |
XML (Extensible Markup Language) è un linguaggio a marcatori per documenti contenenti informazioni strutturate.
Vedere informazioni introduttive su XML.COM.
I testi XML hanno un aspetto simile all'HTML. Permettono di gestire formati di output multipli
per un documento. Un facile sistema per XML è il pacchetto
docbook-xsl
che è stato usato per questo documento.
Ogni file XML inizia con una dichiarazione XML standard come la seguente.
<?xml version="1.0" encoding="UTF-8"?>
La sintassi di base per un elemento XML usa un marcatore come il seguente.
<nome attributo="valore">contenuto</nome>
Gli elementi XML senza contenuto sono indicati nella seguente forma breve.
<nome attributo="valore"/>
La parte "attributo="valore"
" negli esempi precedenti è
opzionale.
In XML una sezione di commento è marcata nel modo seguente.
<!-- commento -->
A parte l'aggiunta dei marcatori, XML richiede solo una minima conversione dei contenuti usando entità predefinite per i caratteri seguenti.
Tabella 11.7. Elenco di entità predefinite per XML
entità predefinita | carattere da convertire |
---|---|
"
|
" : virgolette
|
'
|
' : apostrofo
|
<
|
< : minore-di
|
>
|
> : maggiore-di
|
&
|
& : e-commerciale
|
"<
" e "&
" non possono essere
usati in attributi o elementi.
Quando vengono usate entità definite in stile SGML, ad esempio
"&qualche-tag:
", la prima definizione prevale su
tutte le altre. La definizione di entità è espressa nella forma
"<!ENTITY qualche-tag "valore entità">
".
Fintanto che i marcatori XML sono usati in modo coerente con un certo set dei nomi di tag (qualche dato usato come contenuto o valore di attributo), la conversione in un altro XML è un compito banale usando XSLT (Extensible Stylesheet Language Trasformations.
Sono disponibili molti strumenti per elaborare file XML, come l'XSL (Extensible Stylesheet Language).
Fondamentalmente, una volta creato un file XML ben formato, lo si può convertire in qualsiasi formato usando XSLT (Extensible Stylesheet Language Transformation).
XSL-FO (Extensible
Stylesheet Language for Formatting Object), linguaggio per fogli di
stile estensibile per la formattazione di oggetti, è pensato per essere una
soluzione per la formattazione. Il pacchetto fop
è ancora
nell'archivio Debian contrib
(non in
main
). Perciò il codice LaTeX è solitamente generato
dall'XML usando XSLT ed il sistema LaTeX viene usato per creare file adatti
alla stampa come DVI, PostScript e PDF.
Tabella 11.8. Elenco di strumenti XML
pacchetto | popcon | dimensione | parola chiave | descrizione |
---|---|---|---|---|
docbook-xml *
|
I:47 | 2488 | xml | DTD (Document Type Definition) XML per DocBook |
xsltproc *
|
V:4, I:46 | 152 | xslt | elaboratore a riga di comando XSLT (XML→ XML, HTML, testo semplice, ecc.) |
docbook-xsl *
|
V:0.5, I:7 | 12792 | xml/xslt | fogli di stile XSL per elaborare XML DocBook con XSLT in vari formati di output |
xmlto
*
|
V:0.3, I:2 | 268 | xml/xslt | convertitore da-XML-a-tutto con XSLT |
dblatex *
|
V:0.2, I:2 | 7340 | xml/xslt | converte file DocBook con XSLT in documenti DVI, PostScript, PDF |
fop
*
|
V:0.3, I:2 | 2280 | xml/xsl-fo | converte file XML DocBook in PDF |
Dato che XML è un sottoinsieme di SGML (Standard Generalized Markup Language), può essere elaborato dagli strumenti completi disponibili per SGML, come DSSSL (Document Style Semantics and Specification Language).
Tabella 11.9. Elenco di strumenti DSSSL
pacchetto | popcon | dimensione | parola chiave | descrizione |
---|---|---|---|---|
openjade *
|
V:0.4, I:3 | 1212 | dsssl | elaboratore standard DSSSL ISO/IEC 10179:1996 (più recente) |
openjade1.3 *
|
V:0.02, I:0.14 | 2336 | dsssl | elaboratore standard DSSSL ISO/IEC 10179:1996 (serie 1.3.x) |
jade
*
|
V:0.3, I:2 | 1056 | dsssl | elaboratore DSSSL originale di James Clark (serie 1.2.x) |
docbook-dsssl *
|
V:0.5, I:4 | 3100 | xml/dsssl | fogli di stile DSSSL per elaborare XML DocBook con DSSSL in vari formati di output |
docbook-utils *
|
V:0.2, I:2 | 440 | xml/dsssl |
utilità per file DocBook, inclusa la conversione in altri formati (HTML,
RTF, PS, man, PDF) con comandi docbook2* con DSSSL
|
sgml2x *
|
V:0.00, I:0.06 | 216 | SGML/dsssl | convertitore da SGML e XML che usa fogli di stile DSSSL |
Si possono esstrarre dati HTML o XML da altri formati usando gli strumenti seguenti.
Tabella 11.10. Elenco di strumenti di estrazione di dati XML
pacchetto | popcon | dimensione | parola chiave | descrizione |
---|---|---|---|---|
wv
*
|
V:1.3, I:2 | 2116 | MSWord→tutto | convertitore di documenti da Microsoft Word a HTML, LaTeX, ecc. |
texi2html *
|
V:0.3, I:2 | 2076 | texi→html | convertitore da texinfo a HTML |
man2html *
|
V:0.2, I:1.2 | 372 | pagine man→html | convertitore da pagine man a HTML (supporto CGI) |
tex4ht *
|
V:0.3, I:2 | 924 | tex↔html | convertitore tra (La)TeX e HTML |
xlhtml *
|
V:0.5, I:1.1 | 184 | MSExcel→html | convertitore da .xls di MSExcel in HTML |
ppthtml *
|
V:0.5, I:1.1 | 120 | MSPowerPoint→html | convertitore da MSPowerPoint a HTML |
unrtf
*
|
V:0.4, I:0.9 | 224 | rtf→html | convertitore di documenti da RTF a HTML, ecc. |
info2www *
|
V:0.6, I:1.2 | 156 | info→html | convertitore da GNU info a HTML (supporto CGI) |
ooo2dbk *
|
V:0.03, I:0.16 | 941 | sxw→xml | convertitore da documenti SXW OpenOffice.org in XML DocBook |
wp2x
*
|
V:0.01, I:0.07 | 240 | WordPerfect→tutto | da file WordPerfect 5.0 e 5.1 a TeX, LaTeX, troff, GML e HTML |
doclifter *
|
V:0.00, I:0.03 | 424 | troff→xml | convertitore da troff a XML DocBook |
I file HTML non-XML possono essere convertiti in XHTML che è un'istanza di XML ben strutturato. XHTML può essere elaborato con strumenti XML.
Tabella 11.11. Elenco di strumenti per belle stampe XML
pacchetto | popcon | dimensione | parola chiave | descrizione |
---|---|---|---|---|
libxml2-utils *
|
V:3, I:49 | 160 | xml↔html↔xhtml |
strumento XML a riga di comando con xmllint (1) (controllo
di sintassi, riformattazione, eliminazione sporcizia, …)
|
tidy
*
|
V:1.0, I:9 | 108 | xml↔html↔xhtml | controllore della sintassi e riformattatore per HTML |
Una volta che è stato generato codice XML corretto, si può usare la tecnologia XSLT per estrarre dati in base al contesto dei marcatori
In un sistema Debian i dati stampabili sono presentati in formato PostScript. CUPS (Common Unix Printing System) usa Ghostscript come suo programma backend per la rasterizzazione per le stampanti non-PostScript.
Il cuore centrale della manipolazione dei dati da stampare è l'interprete PostScript (PS) Ghostscript che genera immagini raster.
La licenza dell'ultima versione a monte di Ghostscript di Artifex è passata da AFPL a GPL e sono state fuse in un rilasciu unificato tutte le più recenti modifiche alle versioni ESP, come quelle relative a CUPS nel rilascio 8.60.
Tabella 11.12. Elenco di interpreti PostScript Ghostscript
pacchetto | popcon | dimensione | descrizione |
---|---|---|---|
ghostscript *
|
V:18, I:56 | 6716 | interprete PostScript/PDF GPL Ghostscript |
ghostscript-x *
|
V:13, I:28 | 220 | interprete PostScript/PDF GPL Ghostscript - supporto per display X |
gs-cjk-resource *
|
V:0.04, I:0.4 | 4528 | file risorsa per gs-cjk, estensione Ghostscript per CJK-TrueType |
cmap-adobe-cns1 *
|
V:0.03, I:0.3 | 1572 | CMaps per Adobe-CNS1 (per supporto per cinese tradizionale) |
cmap-adobe-gb1 *
|
V:0.03, I:0.3 | 1552 | CMaps per Adobe-GB1 (per supporto per cinese semplificato) |
cmap-adobe-japan1 *
|
V:0.08, I:0.7 | 2428 | CMaps per Adobe-Japan1 (per supporto per giapponese standard) |
cmap-adobe-japan2 *
|
I:0.4 | 416 | CMaps per Adobe-Japan2 (per supporto per giapponese extra) |
cmap-adobe-korea1 *
|
V:0.01, I:0.19 | 872 | CMaps per Adobe-Korea1 (per supporto per coreano) |
libpoppler5 *
|
V:4, I:21 | 2368 | libreria di rendering per PDF basata sul visualizzatore di PDF xpdf |
libpoppler-glib4 *
|
V:7, I:19 | 504 | libreria di rendering per PDF (libreria condivisa basata su GLib) |
poppler-data *
|
I:3 | 12232 | CMaps per la libreria di rendering per PDF (per supporto CJK: Adobe-*) |
La configurazione di Ghostscript può essere visualizzata con "gs
-h
".
È possibile unire due file PostScript
(PS) o PDF (Portable
Document Format) usando gs
(1) di Ghostscript.
$ gs -q -dNOPAUSE -dBATCH -sDEVICE=pswrite -sOutputFile=bla.ps -f pippo1.ps pippo2.ps $ gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=bla.pdf -f pippo1.pdf pippo2.pdf
Il formato PDF che è ampiamente usato per dati stampabili multipiattaforma, è essenzialmente il formato PS compresso con alcune funzionalità ed estensioni aggiuntive.
Per manipolare dalla riga di comando documenti PostScript sono utili
psmerge
(1) e altri comandi nel pacchetto
psutils
. I comandi nel pacchetto
pdfjam
lavorano in modo simile per manipolare documenti
PDF. Anche pdftk
(1), nel pacchetto
pdftk
, è utile per manipolare documenti PDF.
Quello che segue è un elenco di pacchetti con utilità per dati stampabili che hanno attirato la mia attenzione.
Tabella 11.13. Elenco di utilità per dati stampabili
pacchetto | popcon | dimensione | parola chiave | descrizione |
---|---|---|---|---|
poppler-utils *
|
V:8, I:49 | 536 | pdf→ps,testo,… |
utilità PDF: pdftops , pdfinfo ,
pdfimages , pdftotext ,
pdffonts
|
psutils *
|
V:3, I:21 | 380 | ps→ps | strumenti di conversione di documenti PostScript |
poster *
|
V:1.2, I:9 | 80 | ps→ps | crea grandi poster da pagine PostScript |
xpdf-utils *
|
V:0.9, I:4 | 76 | pdf→ps,testo,… |
utilità PDF: pdftops , pdfinfo ,
pdfimages , pdftotext ,
pdffonts
|
enscript *
|
V:1.6, I:14 | 2464 | testo→ps, html, rtf | converte testo ASCII in PostScript, HTML, RTF o Pretty-Print |
a2ps
*
|
V:1.7, I:8 | 4292 | testo→ps | convertitore e creatore di belle stampe "Da tutto a PostScript" |
pdftk
*
|
V:1.0, I:5 | 200 | pdf→pdf |
strumento di conversione di documenti PDF: pdftk
|
mpage
*
|
V:0.18, I:1.5 | 224 | testo,ps→ps | stampa più pagine in un foglio |
html2ps *
|
V:0.2, I:1.7 | 260 | html→ps | converte da HTML aPostScript |
pdfjam *
|
V:0.2, I:1.8 | 228 | pdf→pdf |
strumenti di conversione di documenti PDF: pdf90 ,
pdfjoin e pdfnup
|
gnuhtml2latex *
|
V:0.07, I:0.6 | 60 | html→latex | convertitore da HTML a latex |
latex2rtf *
|
V:0.14, I:1.0 | 508 | latex→rtf | converte documenti da LaTeX a RTF leggibili da MS Word |
ps2eps *
|
V:1.3, I:12 | 116 | ps→eps | converte da PostScript a EPS (Encapsulated PostScript) |
e2ps
*
|
V:0.01, I:0.10 | 188 | testo→ps | convertitore da testo a PostScript con supporto per la codifica giapponese |
impose+ *
|
V:0.03, I:0.2 | 180 | ps→ps | Utilità PostScript |
trueprint *
|
V:0.02, I:0.13 | 188 | testo→ps | belle stampe di molti tipi di codice sorgente (C, C++, Java, Pascal, Perl, Pike, Sh e Verilog) in PostScript. (linguaggio C) |
pdf2svg *
|
V:0.10, I:0.5 | 60 | ps→svg | convertitore da PDF al formato SVG (Scalable Vector Graphics) |
pdftoipe *
|
V:0.02, I:0.16 | 88 | ps→ipe | convertitore da PDF al formato XML di IPE |
Entrambi i comandi lp
(1) e lpr
(1)
forniti da CUPS (Common Unix
Printing System) forniscono opzioni per stampe personalizzate dei
dati stampabili.
Si possono stampare 3 copie fascicolate di un file usando uno dei comandi seguenti.
$ lp -n 3 -o Collate=True nomefile
$ lpr -#3 -o Collate=True nomefile
Si può personalizzare ulteriormente l'operazione di stampa usando opzioni
come "-o number-up=2
", "-o
page-set=even
", "-o page-set=odd
", "-o
scaling=200
", "-o natural-scaling=200
", ecc.,
documentate in Stampa dalla
riga di comando ed opzioni relative.
Per semplici impaginazioni si può usare il programma Unix troff sviluppato da AT&T. Viene di solito usato per creare pagine man.
TeX, creato da Donald Knuth è uno strumento di impaginazione molto potente ed è lo standard di fatto. LaTeX, scritto originariamente da Leslie Lamport, permette un accesso alla potenza di TeX a più alto livello.
Tabella 11.14. Elenco di strumenti per impaginazione
pacchetto | popcon | dimensione | parola chiave | descrizione |
---|---|---|---|---|
texlive *
|
V:0.5, I:9 | 124 | (La)TeX | sistema TeX per impaginazione, anteprima e stampa |
groff
*
|
V:0.9, I:7 | 9116 | troff | sistema di formattazione di testi GNU troff |
Tradizionalmente il sistema di elaborazione di testi Unix principale è
roff. Vedere roff
(7),
groff
(7), groff
(1),
grotty
(1), troff
(1),
groff_mdoc
(7), groff_man
(7),
groff_ms
(7), groff_me
(7),
groff_mm
(7) e "info groff
".
Si può leggere o stampare un buon tutorial e documento di consultazione
sulla macro "-me
" in
"/usr/share/doc/groff/
", dopo aver installato il
pacchetto groff
.
"groff -Tascii -me -
" produce output in puro testo con
codici di escape ANSI. Se si desidera
produrre un output in stile pagine man con molti "^H" e "_", usare invece
"GROFF_NO_SGR=1 groff -Tascii -me -
".
Per rimuovere i "^H" e "_" da un file di testo generato con
groff
, filtrarlo con "col -b -x
".
La distribuzione software TeX Live offre un
sistema TeX completo. Il metapacchetto texlive
fornisce
una buona selezione dei pacchetti TeX Live
che dovrebbe essere sufficiente per la maggior parte dei compiti più comini.
Ci sono molti documenti consultabili disponibili per TeX e LaTeX.
tex
(1)
latex
(1)
Questo è l'ambiente di impaginazione più potente. Molti elaboratori SGML lo usano come backend per l'elaborazione del
testo. Lyx, fornito dal pacchetto
lyx
, e GNUTeXmacs,
fornito dal pacchetto texmacs
, offrono un bell'ambiente
WYSIWYG per LaTeX; inoltre molti usano Emacs e Vim come scelta di
editor per i sorgenti.
Sono disponibili molte risorse in rete.
/usr/share/doc/texlive-doc-base/english/texlive-en/live.html
")
(pacchetto texlive-doc-base
)
Quando i documenti crescono di dimensioni, a volte TeX può generare
errori. Per risolvere queto problema si deve aumentare la dimensione di pool
in "/etc/texmf/texmf.cnf
" (o in modo più corretto,
modificare "/etc/texmf/texmf.d/95NonPath
" ed eseguire
update-texmf
(8)).
Il sorgenti TeX di "The TeXbook" sono disponibili all'indirizzo http://tug.ctan.org/tex-archive/systems/knuth/dist/tex/texbook.tex.
Questo file contiene la maggior parte delle macro necessarie. Mi è stato
detto che si può elaborare questo documento con tex
(1)
dopo aver commentato le righe da 7 a 10 ed aggiungendo "\input
manmac \proofmodefalse
". È caldamente raccomandabile comprare
questo libro (e tutti gli altri libri di Donald E. Knuth) invece di usare le
versioni in rete, ma il sorgente è un meraviglioso esempio di input TeX!
Si può stampare una pagina di manuale in PostScript in un bel modo usando uno dei comandi seguenti.
$ man -Tps una_qualche_paginaman | lpr
$ man -Tps una_qualche_paginaman | mpage -2 | lpr
Il secondo esempio stampa 2 pagine in un foglio.
Benché sia possibile scrivere una pagina di manuale (pagina man) in formato troff semplice, ci sono alcuni pacchetti di aiuto per farlo.
Tabella 11.15. Elenco di pacchetti che aiutano a creare una pagina man
pacchetto | popcon | dimensione | parola chiave | descrizione |
---|---|---|---|---|
docbook-to-man *
|
V:0.3, I:2 | 240 | SGML→paginaman | convertitore da SGML DocDook in macro roff man |
help2man *
|
V:0.13, I:1.1 | 376 | testo→paginaman | generatore automatico di pagine man da --help |
info2man *
|
V:0.02, I:0.15 | 204 | info→paginaman | convertitore da GNU info a POD o pagine man |
txt2man *
|
V:0.02, I:0.2 | 88 | testo→paginaman | converte testo in puro ASCII nel formato delle pagine man |
Quelli che seguono sono pacchetti per la conversione dei dati di posta che hanno attirato la mia attenzione.
Tabella 11.16. Elenco di pacchetto che aiutano a convertire dati di posta
pacchetto | popcon | dimensione | parola chiave | descrizione |
---|---|---|---|---|
sharutils *
|
V:2, I:32 | 904 | posta |
shar (1), unshar (1),
uuencode (1), uudecode (1)
|
mpack
*
|
V:1.5, I:23 | 84 | MIME |
codificatore e decodificatore di messaggiMIME:
mpack (1) e munpack (1)
|
tnef
*
|
V:0.8, I:1.5 | 164 | ms-tnef | spacchettamento di allegati MIME di tipo "application/ms-tnef" che è un formato esclusivo di Microsoft |
uudeview *
|
V:0.17, I:1.6 | 132 | posta | codificatore e decodificatore per i seguenti formati: uuencode, xxencode, BASE64, quoted printable e BinHex |
readpst *
|
V:0.04, I:0.3 | 228 | PST | converte file PST di Outlook di Microsoft nel formato mbox |
Se il software del programma di posta può essere configurato per usarlo, anche il server IMAP4 (Internet Message Access Protocol, versione 4) (vedere Sezione 6.7, «Server POP3/IMAP4») può essere usato per spostare la posta da sistemi proprietari.
I dati di posta (SMTP) dovrebbero essere limitati ai dati a 7 bit. Perciò dati binari e testi a 8 bit sono codificati in un formato a 7 bit con MIME (Multipurpose Internet Mail Extensions) e la seleione del set di caratteri (vedere Sezione 8.3.1, «Nozioni base sulla codifica»).
Il formato standard per l'archiviazione della posta è mbox strutturato
seguendo la RFC2822 (che aggiorna
RFC822). Vedere mbox
(5) (fornito dal pacchetto
mutt
).
Per le lingue europee, per la posta viene di solito usato
"Content-Transfer-Encoding: quoted-printable
" con il set
di caratteri ISO-8859-1 dato che non ci sono molti caratteri a 8 bit. Se il
testo europeo è codificato in UTF-8, è probabile venga usato
"Content-Transfer-Encoding: quoted-printable
" dato che
sono per la maggior parte dati a 7 bit.
Per il giapponese, per la posta viene tradizionalmente usato
"Content-Type: text/plain; charset=ISO-2022-JP
" per
mantenere il testo a 7 bit. Ma sistemi Microsoft più vecchi possono inviare
dati di posta in Shift-JIS senza una dichiarazione appropriata. Se il testo
giapponese è codificato in UTF-8, è probabile venga usato Base64 dato che contiene molti dati a 8 bit. La
situazione delle altre lingue asiatiche è simile.
Se i dati di posta non-Unix sono accessibili da un software di posta non-Debian che può comunicare con il server IMAP4, potrebbe essere possibile spostarli eseguendo un proprio server IMAP4 (vedere Sezione 6.7, «Server POP3/IMAP4»).
Se si usano altri formati di archiviazione, spostarli nel formato mbox è un
buon primo passo. Un versatile programma client come
mutt
(1) può essere di aiuto in questo caso.
Si può suddividere il contenuto di una casella di posta nei singoli messaggi
usando procmail
(1) e formail
(1).
Ciascun messaggio di posta può essere spachettato usando
munpack
(1), dal pacchetto mpack
, (o
con altri strumenti specializzati) per ottenere i contenuti codificati MIME.
Quelli che seguono sono pacchetti per la conversione, la modifica e l'organizzazione di dati grafici che hanno attirato la mia attenzione.
Tabella 11.17. Elenco di strumenti per dati grafici
pacchetto | popcon | dimensione | parola chiave | descrizione |
---|---|---|---|---|
gimp
*
|
V:12, I:44 | 13560 | immagine(bitmap) | GNU Image Manipulation Program, programma GNU di manipolazione di immagini |
imagemagick *
|
V:13, I:35 | 268 | immagine(bitmap) | programmi di manipolazione immagini |
graphicsmagick *
|
V:1.6, I:3 | 4532 | immagine(bitmap) |
programmi di manipolazione di immagini (fork di
imagemagick )
|
xsane
*
|
V:5, I:36 | 748 | immagine(bitmap) | frontend X11 basato su GTK+ per SANE (Scanner Access Now Easy) |
netpbm *
|
V:4, I:29 | 4612 | immagine(bitmap) | strumenti di conversione di dati grafici |
icoutils *
|
V:0.3, I:1.3 | 200 | png↔ico(bitmap) | converte icone e puntatori MS Windows da e verso il formato PNG (favicon.ico) |
scribus *
|
V:0.5, I:3 | 26888 | ps/pdf/SVG/… | editor DTP Scribus |
openoffice.org-draw *
|
V:18, I:40 | 10720 | immagine(vettoriale) | suite per ufficio OpenOffice.org - disegno |
inkscape *
|
V:15, I:32 | 87436 | immagine(vettoriale) | editor SVG (Scalable Vector Graphics) |
dia-gnome *
|
V:1.4, I:2 | 576 | immagine(vettoriale) | editor di diagrammi (GNOME) |
dia
*
|
V:3, I:5 | 572 | immagine(vettoriale) | editor di diagrammi (Gtk) |
xfig
*
|
V:2, I:4 | 1676 | immagine(vettoriale) | strumento per la generazione interattiva di figure in X11 |
pstoedit *
|
V:1.9, I:16 | 708 | ps/pdf→immagine(vettoriale) | convertitore di file PostScript e PDF in grafica vettoriale modificabile (SVG) |
libwmf-bin *
|
V:1.4, I:13 | 68 | Windows/immagine(vettoriale) | strumenti di conversione di metafile windows (dati di grafica vettoriale) |
fig2sxd *
|
V:0.03, I:0.2 | 200 | fig→sxd(vettoriale) | converte file XFig nel formato di Draw di OpenOffice.org |
unpaper *
|
V:0.2, I:1.7 | 736 | immagine→immagine | strumento di post-elaborazione per pagine scansionate per OCR |
tesseract-ocr *
|
V:0.7, I:3 | 3196 | immagine→testo | software OCR libero basato sul motore OCR commerciale di HP |
tesseract-ocr-eng *
|
V:0.2, I:2 | 1752 | immagine→testo | dati per motore OCR: file di lingua tesseract-ocr per testi in inglese |
gocr
*
|
V:0.8, I:5 | 492 | immagine→testo | software OCR libero |
ocrad
*
|
V:0.4, I:4 | 364 | immagine→testo | software OCR libero |
gtkam
*
|
V:0.3, I:1.7 | 1100 | immagine(Exif) | manipola file da fotocamere digitali (GNOME) - interfaccia utente grafica |
gphoto2 *
|
V:0.3, I:2 | 1008 | immagine(Exif) | manipola file da fotocamere digitali (GNOME) - interfaccia a riga di comando |
kamera *
|
V:0.7, I:13 | 312 | immagine(Exif) | manipola file da fotocamere digitali (KDE) |
jhead
*
|
V:0.5, I:3 | 132 | immagine(Exif) | manipola la parte non-immagine di file JPEG (fotografie digitali) aderenti conformi ad Exif |
exif
*
|
V:0.2, I:1.7 | 184 | immagine(Exif) | utilità a riga di comando per mostrare informazioni EXIF in file JPEG |
exiftags *
|
V:0.14, I:0.9 | 248 | immagine(Exif) | utilità per leggere i tag EXIF da un file JPEG di una fotocamera digitale |
exiftran *
|
V:0.4, I:3 | 56 | immagine(Exif) | trasforma immagini JPEG di fotocamere digitali |
exifprobe *
|
V:0.08, I:0.5 | 484 | immagine(Exif) | legge metadati da immagini digitali |
dcraw
*
|
V:0.9, I:5 | 444 | immagine(Raw)→ppm | decodifica immagini raw di fotocamere digitali |
findimagedupes *
|
V:0.06, I:0.4 | 140 | immagine→fingerprint | trova immagini simili visivamente o duplicati |
ale
*
|
V:0.02, I:0.17 | 768 | immagine→immagine | fonde immagini per migliorarne la fedeltà o creare mosaici |
imageindex *
|
V:0.03, I:0.2 | 192 | immagine(Exif)→html | genera gallerie HTML statiche da immagini |
f-spot *
|
V:0.5, I:1.8 | 9488 | immagine(Exif) | applicazione per la gestione di fotografie personali (GNOME) |
bins
*
|
V:0.02, I:0.15 | 2008 | immagine(Exif)→html | genera album fotografici HTML statici usando XML e i tag EXIF |
gallery2 *
|
V:0.2, I:0.4 | 62548 | immagine(Exif)→html | genera album fotografici HTML navigabili con miniature |
outguess *
|
V:0.02, I:0.14 | 252 | jpeg,png | strumento steganografico universale |
qcad
*
|
V:1.5, I:2 | 3944 | DXF | editor di dati CAD (KDE) |
blender *
|
V:0.5, I:3 | 28336 | blend, TIFF, VRML, … | editor di contenuti 3D per animazioni, ecc. |
mm3d
*
|
V:0.04, I:0.3 | 4536 | ms3d, obj, dxf, … | editor di modelli 3D basato su OpenGL |
open-font-design-toolkit *
|
I:0.03 | 36 | ttf, ps, … | metapacchetto per creazione di tipi di caratteri open |
fontforge *
|
V:0.2, I:1.7 | 6612 | ttf, ps, … | editor di tipi di carattere per caratteri PS, TrueType e OpenType |
xgridfit *
|
V:0.01, I:0.07 | 1060 | ttf | programa per il gridfitting e l'hinting di tipi di carattere TrueType |
gbdfed *
|
V:0.01, I:0.11 | 496 | bdf | editor di tipi di carattere BDF |
Cercare ulteriori strumenti per le immagini usando l'espressione regolare
"~Gworks-with::image
" in aptitude
(8)
(vedere Sezione 2.2.6, «Opzioni per i metodi di ricerca in aptitude»).
Sebbene programmi con interfaccia utente grafica come
gimp
(1) siano molto potenti, strumenti a riga di comando
come imagemagick
(1) sono piuttosto utili per manipolare
in modo automatico immagini con script.
Il formato standard di fatto per i file immagini delle fotocamere digitali è EXIF (Exchangeable Image File Format) che è il formato per file immagine JPEG con tag aggiuntivi con metadati. Può contenere informazioni come la data, l'orario e le impostazioni della fotocamera.
I diritti sulla compressione senza perdita di dati Lempel-Ziv-Welch (LZW) sono scaduti. Le utilità GIF (Graphics Interchange Format) che usano il metodo di compressione LZW sono ora disponibili liberamente sul sistema Debian.
Qualsiasi fotocamera digitale o scanner con un supporto di archiviazione removibile funziona in Linux attraverso i lettori di archiviazione USB dato che segue le regole progettuali per i file system delle fotocamere e usa il file system FAT. Vedere Sezione 10.1.10, «Supporti di archiviazione removibili».
Ci sono molti altri programmi per convertire dati. I pacchetti seguenti,
trovati usando l'espressione regolare "~Guse::converting
"
in aptitude
(8) (vedere Sezione 2.2.6, «Opzioni per i metodi di ricerca in aptitude»), hanno catturato la mia
attenzione.
Tabella 11.18. Elenco di strumenti di conversione di dati vari
pacchetto | popcon | dimensione | parola chiave | descrizione |
---|---|---|---|---|
alien
*
|
V:1.2, I:11 | 244 | rpm/tgz→deb | convertitore di pacchetti estranei in pacchetti Debian |
freepwing *
|
V:0.00, I:0.03 | 568 | EB→EPWING | convertitore da "Electric Book" (popolare in Giappone) in un singolo formato JIS X 4081 (un sottoinsieme di EPWING V1) |
Si possono estrarre i dati dal formato RPM anche nel modo seguente.
$ rpm2cpio file.src.rpm | cpio --extract
Vengono forniti in questo capitolo alcune informazioni base da cui partire per imparare a programmare su un sistema Debian abbastanza da seguire il codice sorgente impacchettato. Quello che segue è un elenco dei pacchetti importanti per la programmazione e dei corrispettivi pacchetti di documentazione.
Tabella 12.1. Elenco di pacchetti di aiuto per la programmazione
pacchetto | popcon | dimensione | documentazione |
---|---|---|---|
autoconf *
|
V:4, I:25 | 2256 |
"info autoconf " fornito da
autoconf-doc
|
automake *
|
V:3, I:21 | 1812 |
"info automake " fornito da
automake1.10-doc
|
bash
*
|
V:91, I:99 | 3536 |
"info bash " fornito da bash-doc
|
bison
*
|
V:2, I:15 | 1504 |
"info bison " fornito da bison-doc
|
cpp
*
|
V:38, I:82 | 32 |
"info cpp " fornito da cpp-doc
|
ddd
*
|
V:0.3, I:2 | 3852 |
"info ddd " fornito da ddd-doc
|
exuberant-ctags *
|
V:1.2, I:5 | 284 |
exuberant-ctags (1)
|
flex
*
|
V:2, I:15 | 1352 |
"info flex " fornito da flex-doc
|
gawk
*
|
V:28, I:32 | 2172 |
"info gawk " fornito da gawk-doc
|
gcc
*
|
V:17, I:67 | 28 |
"info gcc " fornito da gcc-doc
|
gdb
*
|
V:4, I:22 | 4812 |
"info gdb " fornito da gdb-doc
|
gettext *
|
V:8, I:46 | 7272 |
"info gettext " fornito da gettext-doc
|
gfortran *
|
V:0.9, I:6 | 8 |
"info gfortran " fornito da
gfortran-doc (Fortran 95)
|
gpc
*
|
V:0.07, I:0.5 | 8 |
"info gpc " fornito da gpc-doc (Pascal)
|
fpc
*
|
I:0.4 | 40 |
fpc (1) e html forniti da fp-docs
(Pascal)
|
glade
*
|
V:0.3, I:2 | 1652 | aiuto fornito attraverso menu (compilatore UI) |
glade-gnome *
|
V:0.09, I:1.2 | 508 | aiuto fornito attraverso menu (compilatore UI) |
libc6
*
|
V:97, I:99 | 10012 |
"info libc " fornito da glibc-doc e
glibc-doc-reference
|
make
*
|
V:21, I:72 | 1220 |
"info make " fornito da make-doc
|
xutils-dev *
|
V:1.7, I:15 | 1728 |
imake (1), xmkmf (1), ecc.
|
mawk
*
|
V:66, I:99 | 244 |
mawk (1)
|
perl
*
|
V:88, I:99 | 18528 |
perl (1) e pagine html forniti da
perl-doc e perl-doc-html
|
python *
|
V:62, I:97 | 736 |
python (1) e pagine html forniti da
python-doc
|
tcl8.4 *
|
V:8, I:46 | 3332 |
tcl (3) e pagine dettagliate del manuale forniti da
tcl8.4-doc
|
tk8.4
*
|
V:5, I:34 | 2712 |
tk (3) e pagine dettagliate di manuale forniti da
tk8.4-doc
|
ruby
*
|
V:9, I:24 | 120 |
ruby (1) e guida interattiva di riferimento forniti da
ri
|
vim
*
|
V:15, I:33 | 1792 |
menu di aiuto(F1) fornito da vim-doc
|
susv2
*
|
I:0.03 | 48 | scarica le specifiche "The Single Unix Specifications v2" |
susv3
*
|
I:0.07 | 48 | scarica le specifiche "The Single Unix Specifications v3" |
Guide di riferimento in linea sono disponibili digitando "man
nome
" dopo aver installato i pacchetti manpages
e manpages-dev
. Le guide di riferimento in linea per gli
strumenti GNU sono disponibili digitando "info
nome_programma
", dopo aver installato i pertinenti pacchetti di
documentazione. Può essere necessario includere gli archivi
"contrib
e non-free
, oltre
all'archivio main
, dato che alcune documentazioni GFDL
non sono considerate conformi alle DFSG.
Non usare "test
" come nome di un file di prova
eseguibile. "test
" è un comando interno della shell.
I programmi software compilati direttamente dai sorgenti andrebbero
installati in "/usr/local
" o "/opt
"
per evitare conflitti
Esempi di codice per creare la "Canzone 99 bottiglie di birra" dobrebbe dare una buona idea di praticamente tutti i linguaggi di programmazione.
Uno script di shell è un file di testo con il bit di esecuzione impostato e contiene i comandi nel formato seguente.
#!/bin/sh ... righe di comando
La prima riga specifica l'interprete di shell che legge ed esegue il contenuto di questo file.
Leggere script di shell è il modo migliore per capire come funzioni un sistema *nix. In questa sezione vengono forniti alcune nozioni di riferimento e promemoria per la programmazione di shell. Vedere "Errori in shell" (http://www.greenend.org.uk/rjk/2001/04/shell.html) per imparare dagli errori.
A differenza della modalità interattiva della shell (vedere Sezione 1.5, «Il semplice comando di shell» e Sezione 1.6, «Elaborazione di testo stile Unix»), gli script di shell usano spesso parametri, costrutti condizionali e cicli.
Molti script di sistema possono essere interpretati da una qualsiasi delle
shell POSIX (vedere Tabella 1.13, «Elenco di programmi shell»). La shell predefinita per il sistema è
"/bin/sh
" che è un collegamento simbolico che punta al
programma reale.
bash
(1) per lenny
o precedenti
dash
(1) per squeeze
o successivi
Evitare di scrivere uno script di shell con bashismi o zshismi per renderlo portabile tra tutte le shell
POSIX. Si può controllare uno script con
checkbashisms
(1).
Tabella 12.2. Elenco di bashismi tipici
Buono: POSIX | Da evitare: bashismo |
---|---|
if [ "$pippo" = "$pluto" ] ; then …
|
if [ "$pippo" == "$pluto" ] ; then …
|
diff -u file.c.orig file.c
|
diff -u file.c{.orig,}
|
mkdir /pippopluto /pippopaperino
|
mkdir /pippo{pluto,paperino}
|
nomefunzione() { … }
|
function nomefunzione() { … }
|
formato ottale: "\377 "
|
formato esadecimale: "\xff "
|
Il comando "echo
" deve essere usato con le precauzioni
seguenti dato che la sua implementazione è diversa negli svariati comandi
interni della shell ed esterni.
-e
" e
"-E
".
-n
".
Sebbene l'opzione "-n
" non faccia veramente parte della sintassi POSIX, è
generalmente accettata.
Se è necessario inserire sequenze di escape nella stringa in output, usare
il comando "printf
" al posto del comando
"echo
".
Negli script di shell vengono spesso usati parametri speciali.
Tabella 12.3. Elenco di parametri di shell
parametro di shell | valore |
---|---|
$0
|
nome della shell o dello script di shell |
$1
|
primo (1) argomento di shell |
$9
|
nono (9) argomento di shell |
$#
|
numero di parametri posizionali |
"$*"
|
"$1 $2 $3 $4 … "
|
"$@"
|
"$1" "$2" "$3" "$4" …
|
$?
|
stato d'uscita del comando più recente |
$$
|
PID dello script di shell |
$!
|
PID del compito sullo sfondo avviato più recentemente |
Le nozioni base da ricordare riguardanti la espansione dei parametri sono le seguenti.
Tabella 12.4. Elenco di espansioni di parametri di shell
forma della espressione con parametri |
valore se var è impostata
|
valore se var non è impostata
|
---|---|---|
${var:-stringa}
|
"$var "
|
"stringa "
|
${var:+stringa}
|
"stringa "
|
"null "
|
${var:=stringa}
|
"$var "
|
"stringa " (ed esegue "var=stringa ")
|
${var:?string}
|
"$var "
|
invia con echo "stringa " allo stderr (ed esce con stato di errore)
|
I due punti ":
" in tutti gli operatori nell'elenco
precedente sono di fatto opzionali.
:
" l'operatore =
controlla che il suo operando esista e
sia non nullo
:
" l'operatore
= controlla solo che il suo operando esista
Tabella 12.5. Elenco di sostituzioni chiave di parametri di shell
forma della sostituzione di parametri | risultato |
---|---|
${var%suffisso}
|
rimuove il più piccolo modello di suffisso |
${var%%suffisso}
|
rimuove il più grande modello di suffisso |
${var#prefisso}
|
rimuove il più piccolo modello di prefisso |
${var##prefisso}
|
rimuove il più grande modello di prefisso |
Ogni comando resiituisce uno stato di uscita che può essere usato in costrutti condizionali.
"0" nel contesto condizionale della shell significa "Vero", mentre "0" nel contesto condizionale in C significa "Falso".
"[
" è l'equivalente del comando "test
che valuta i propri argomenti sino a "]
" come
un'espressione condizionale.
Le espressioni condizionali di base che è bene ricordare sono le seguenti.
<comando> &&
<se_successo_esegue_anche_questo_comando> || true
"
<comando> ||
<se_non_successo_esegue_anche_questo_comando> || true
"
if [ <espressione_condizionale> ]; then <se_successo_esegue_questo_comando> else <se_non_successo_esegue_questo_comando> fi
In questo caso il "|| true
" finale era necessario per
assicurare che lo script non termini accidentalmente a tale riga quando la
shell è invocata con l'opzione "-e
".
Tabella 12.6. Elenco di operatori per paragonare file in espressioni condizionali
equazione | condizione perché venga restituito il valore logico "vero" |
---|---|
-e <file>
|
<file> esiste |
-d <file>
|
<file> esiste ed è una directory |
-f <file>
|
<file> esiste ed è un file regolare |
-w <file>
|
<file> esiste ed è scrivibile |
-x <file>
|
<file> esiste ed è eseguibile |
<file1> -nt <file2>
|
<file1> è più recente di <file2> (data di modifica) |
<file1> -ot <file2>
|
<file1> è più vecchio di <file2> (data di modifica) |
<file1> -ef <file2>
|
<file1> e <file2> sono sullo stesso device e stesso numero inode |
Tabella 12.7. Elenco di operatori per paragonare stringhe in espressioni condizionali
equazione | condizione perché venga restituito il valore logico "vero" |
---|---|
-z <str>
|
la lunghezza di <str> è zero |
-n <str>
|
la lunghezza di <str> è diversa da zero |
<str1> = <str2>
|
<str1> e <str2> sono uguali |
<str1> != <str2>
|
<str1> e <str2> non sono uguali |
<str1> < <str2>
|
se ordinate, <str1> viene prima di <str2> (dipendente dalla localizzazione) |
<str1> > <str2>
|
se ordinate, <str1> viene dopo di <str2> (dipendente dalla localizzazione) |
Gli operatori aritmetici di comparazione
di interi nelle espressioni condizionali sono "-eq
",
"-ne
", "-lt
",
"-le
", "-gt
" e
"-ge
".
Ci sono diverse espressioni per cicli usaili nella shell POSIX.
for x in pippo1 pippo2 … ; do comando ; done
" ripete il
ciclo assegnando gli elementi nell'elenco "pippo1 pippo2
…
" alla variabile "x
" ed eseguendo
"comando
".
while condizione ; do comando ; done
" ripete
"comando
" fintanto che "condizione
" è
vera.
until condizione ; do comando ; done
" ripete
"comando
" fintanto che "condition
" è
non vera.
break
" permette di uscire dal ciclo.
continue
" permette di riprendere dalla successiva
iterazione del ciclo.
L'iterazione numerica in stile linguaggio C può
essere realizzata usando seq
(1) come "pippo1
pippo2 …
"
Vedere Sezione 9.5.9, «Ripetere un comando su diversi file».
A grandi linee la shell elabora uno script nel modo seguente.
"…"
o
'…'
.
La shell spezza le altre parti della riga in elementi in base ai caratteri seguenti.
<spazio> <tabulazione> <a
capo>
< > | ; & ( )
La shell controlla, per ciascun elemento non racchiuso tra
"…"
o '…'
, la presenza di parole riservate per regolare il proprio
comportamento.
if then elif
else fi for in while unless do done case esac
"…"
o '…'
.
La shell espande il carattere tilde se
non è racchiuso in "…"
o '…'
.
~
" → directory home dell'utente attuale
~<utente>
" → directory home di
<utente>
La shell espande parametri nei loro
valori, se non sono racchiusi in '…'
.
$PARAMETRO
" o "${PARAMETRO}
"
La shell espande sostituzioni di comandi,
se non sono racchiuse in '…'
.
$( comando )
" → output di "comando
"
` command `
" → output di "comando
"
La shell espande glob di nomi percorso
nei nomi di file corrispondenti, se non sono racchiusi in
"…"
o '…'
.
*
→ qualsiasi carattere
?
→ un carattere
[…]
→ uno qualunque dei caratteri in
"…
"
La shell cerca comando tra le cose seguenti e lo esegue.
$PATH
"
Virgolette singole all'interno di virgolette doppie non hanno alcun effetto.
L'esecuzione di "set -x
" nella shell o l'invocazione
della shell con l'opzione "-x
" fanno sì che la shell
stampi tutti i comandi eseguiti. Ciò è piuttosto utile per il debug.
Per far sì che il proprio programma di shell sia il più portabile possibile tra i sistemi Debian, è una buona idea limitare i programmi di utilità a quelli forniti dai pacchetti essenziali.
aptitude search ~E
" elenca i pacchetti essenziali.
dpkg -L <nome_pacchetto> |grep '/man/man.*/'
"
elenca le pagine man per i comandi forniti dal pacchetto
<nome_pacchetto>
.
Tabella 12.8. Elenco di pacchetti contenenti piccoli programmi di utilità per script di shell
pacchetto | popcon | dimensione | descrizione |
---|---|---|---|
coreutils *
|
V:92, I:99 | 13828 | Utilità GNU di base |
debianutils *
|
V:93, I:99 | 260 | utilità varie specifiche di Debian |
bsdmainutils *
|
V:81, I:99 | 768 | raccolte di ulteriori utilità da FreeBSD |
bsdutils *
|
V:77, I:99 | 196 | utilità di base per 4.4BSD-Lite |
moreutils *
|
V:0.3, I:1.5 | 220 | utilità Unix aggiuntive |
Sebbene moreutils
possa non esistere al di fuori di
Debian, offre piccoli programmi interessanti. Quello più degno di nota è
sponge
(8). Vedere Sezione 1.6.4, «Sostituzione globale con espressioni regolari».
L'interfaccia utente di un semplice programma shell può essere migliorata
dalla banale interazione con i comandi echo
e
read
ad una più interattiva con l'uso dei cosiddetti
programmi di dialogo ecc.
Tabella 12.9. Elenco di programmi per interfaccia utente
pacchetto | popcon | dimensione | descrizione |
---|---|---|---|
x11-utils *
|
V:26, I:53 | 652 |
xmessage (1): mostra un messaggio o richiesta in una
finestra (X)
|
whiptail *
|
V:42, I:99 | 104 | mostra riquadri di dialogo amichevoli da script di shell (newt) |
dialog *
|
V:4, I:25 | 1592 | mostra riquadri di dialogo amichevoli da script di shell (ncurses) |
zenity *
|
V:8, I:41 | 4992 | mostra riquadri di dialogo grafici da script di shell (gtk2.0) |
ssft
*
|
V:0.01, I:0.11 | 152 | Shell Scripts Frontend Tool, strumento per frontend per script di shell (contenitore per zenity, kdialog, e dialog con gettext) |
gettext *
|
V:8, I:46 | 7272 |
"/usr/bin/gettext.sh ": traduce messaggi
|
Questo è un semplice script che crea un'immagine ISO con dati RS02 forniti
da dvdisaster
(1).
#!/bin/sh -e # gmkrs02 : Copyright (C) 2007 Osamu Aoki <osamu@debian.org>, Public Domain #set -x error_exit() { echo "$1" >&2 exit 1 } # Inizializza le variabili DATA_ISO="$HOME/Desktop/iso-$$.img" LABEL=$(date +%Y%m%d-%H%M%S-%Z) if [ $# != 0 ] && [ -d "$1" ]; then DATA_SRC="$1" else # Seleziona la directory per creare l'immagine ISO dalla cartella sul desktop DATA_SRC=$(zenity --file-selection --directory \ --title="Seleziona la radice dell'albero di directory per creare l'immagine ISO") \ || error_exit "Uscita durante la selezione della directory" fi # Controlla la dimensione dell'archivio xterm -T "Controllo dimensione $DATA_SRC" -e du -s $DATA_SRC/* SIZE=$(($(du -s $DATA_SRC | awk '{print $1}')/1024)) if [ $SIZE -le 520 ] ; then zenity --info --title="Dvdisaster RS02" --width 640 --height 400 \ --text="La dimensione dei dati va bene per un CD di backup:\\n $SIZE MB" elif [ $SIZE -le 3500 ]; then zenity --info --title="Dvdisaster RS02" --width 640 --height 400 \ --text="La dimensione dei dati va bene per un DVD di backup:\\n $SIZE MB" else zenity --info --title="Dvdisaster RS02" --width 640 --height 400 \ --text="Dimensione dei dati troppo grande per farne il backup: $SIZE MB" error_exit "Dimensione dei dati troppo grande per farne il backup :\\n $SIZE MB" fi # solo xterm sicuramente ha un'opzione -e funzionante # Crea immagine raw ISO rm -f "$DATA_ISO" || true xterm -T "genisoimage $DATA_ISO" \ -e genisoimage -r -J -V "$LABEL" -o "$DATA_ISO" "$DATA_SRC" # Crea dati ridondanti RS02 supplementari xterm -T "dvdisaster $DATA_ISO" -e dvdisaster -i "$DATA_ISO" -mRS02 -c zenity --info --title="Dvdisaster RS02" --width 640 --height 400 \ --text="dati ISO/RS02 ($SIZE MB) \\n creati per: $DATA_ISO" # EOF
Si potrebbe voler creare un lanciatore sul desktop con un comando definito
in modo simile a "/usr/local/bin/gmkrs02 %d
".
Make è un'utilità per mantenere gruppi di
programmi. Quando make
(1) viene eseguito legge il file di
regole, "Makefile
" e aggiorna il file target se dipende
da file prerequisiti che sono stati modificati dall'ultima volta che esso
stesso è stato modificato oppure se il file target non esiste. L'esecuzione
di questi aggiornamenti può avvenire in modo concorrente.
La sintassi del file di regole è la seguente.
target: [ prerequisiti ... ] [TAB] comaando1 [TAB] -comando2 # ignora errori [TAB] @comando3 # sopprime echo
Qui " [TAB]
è il codice di TAB. Ciascuna riga è
interpretata dalla shell dopo la sostituzione delle variabili di make. Usare
"\
" alla fine di una riga per continuare lo script. Usare
"$$
" per inserire "$
" per valori di
ambiente per uno script di shell.
Regole implicite per il target ed i prerequisiti possono essere scritte, per esempio, nel modo seguente.
%.o: %.c header.h
In questo caso il target contiene il carattere "%
"
(esattamente un carattere). Il "%
" fa corrispondenza con
qualsiasi sottostringa non vuota nei nomi di file dei target
effettivi. Similmente i prerequisiti usano "%
" per
mostrare come i loro nomi trovino corrispondenza nei nomi dei target
effettivi.
Tabella 12.10. Elenco di variabili automatiche di make
variabile automatica | valore |
---|---|
$@
|
target |
$<
|
primo prerequisito |
$?
|
tutti i prerequisiti più recenti |
$^
|
tutti i prerequisiti |
$*
|
"% " nome base con corrispondenza con il modello target
|
Tabella 12.11. Elenco di espansioni delle variabili di make
espansione di variabile | descrizione |
---|---|
pippo1 := pluto
|
espansione valida una volta sola |
pippo2 = pluto
|
espansione ricorsiva |
pippo3 += pluto
|
accoda |
Eseguire "make -p -f/dev/null
" per vedere le regole
interne automatiche.
Si può impostare l'ambiente appropriato per compilare programmi scritti nel linguaggio di programmazione C nel modo seguente.
# apt-get install glibc-doc manpages-dev libc6-dev gcc build-essential
Il pacchetto libc6-dev
, cioè la libreria GNU C, fornisce
la libreria standard C che è una
raccolta di file header e routine di libreria usati dal linguaggio di
programmazione C.
Vedere come documenti di riferimento per C i seguenti.
info libc
" (documento di riferimento per le funzioni
della libreria C)
gcc
(1) e "info gcc
"
ogni_nome_di_funzione_della_libreria_C
(3)
Un semplice esempio "esempio.c
" può essere compilato con
una libreria "libm
" in un eseguibile
"eseg_esempio
" nel modo seguente.
$ cat > esempio.c << EOF #include <stdio.h> #include <math.h> #include <string.h> int main(int argc, char **argv, char **envp){ double x; char y[11]; x=sqrt(argc+7.5); strncpy(y, argv[0], 10); /* previeni buffer overflow */ y[10] = '\0'; /* riempi per assicurare che la stringa finisca con '\0' */ printf("%5i, %5.3f, %10s, %10s\n", argc, x, y, argv[1]); return 0; } EOF $ gcc -Wall -g -o eseg_esempio esempio.c -lm $ ./eseg_esempio 1, 2.915, ./run_exam, (null) $ ./eseg_esempio 1234567890qwerty 2, 3.082, ./run_exam, 1234567890qwerty
In questo esempio, l'uso di "-lm
" è necessario per fare
il link alla libreria "/usr/lib/libm.so
" nel pacchetto
libc6
per sqrt
(3). La libreria reale è
in "/lib/
" con nome file "libm.so.6
",
che è un collegamento simbolico a "libm-2.7.so
".
Si guardi l'ultimo elemento nel testo di output: ci sono più di 10 caratteri
anche se è stato specificato "%10s
".
L'uso di funzioni che operano su puntatori di memoria senza controlli sui
limiti, come sprintf
(3) e strcpy
(3) è
deprecato per prevenire exploit di tipo buffer overflow che sfruttano gli
effetti di superamento dei limiti di grandezza dei dati.
Il debug è un'importante fase del processo di programmazione. Sapere come fare il debug dei programmi rende buoni utenti Debian in grado di creare segnalazioni di bug significative.
Lo strumento di debug principale in Debian è
gdb
(1) che permette di ispezionare un programma mentre
viene eseguito.
Installare gdb
e i programmi correlati nel modo seguente.
# apt-get install gdb gdb-doc build-essential devscripts
Un buon tutorial su gdb
viene fornito da "info
gdb
" o lo si può trovare altrove
in rete. Quello che segue è un piccolo esempio d'uso di
gdb
(1) su di un "programma
" compilato
con l'opzione "-g
" per produrre informazioni di debug.
$ gdb program (gdb) b 1 # imposta un punto di interruzione alla riga 1 (gdb) run argomenti # esegue programma con argomenti (gdb) next # riga successiva ... (gdb) step # passo successivo ... (gdb) p param # stampa parametro ... (gdb) p param=12 # imposta il valore a 12 ... (gdb) quit
Molti comandi gdb
(1) possono essere
abbreviati. L'espansione del tasto di tabulazione funziona come nella shell.
Dato che tutti i binari installati in un sistema Debian dovrebbero essere,
in modo predefinito, snelliti con strip, la maggior parte dei simboli di
debug non è presente nei normali pacchetti. Per poter fare il debug di
pacchetti Debian con gdb
(1) devono essere installati i
corrispondenti pacchetti *-dbg
(ad esempio
libc6-dbg
per libc6
).
Se un pacchetto di cui si deve fare il debug non fornisce il proprio
pacchetto *-dbg
corrispondente, è necessario installarlo
dopo averlo ricompilato nel modo seguente.
$ mkdir /percorso/nuovo ; cd /percorso/nuovo $ sudo apt-get update $ sudo apt-get dist-upgrade $ sudo apt-get install fakeroot devscripts build-essential $ sudo apt-get build-dep nome_pacchetto_sorgente $ apt-get source nome_pacchetto $ cd nome_pacchetto*
Correggere i bug se necessario.
Spostare la versione del pacchetto ad una che non crei conflitti con le
versioni ufficiali di Debian, ad esempio una che termini con
"+debug1
" quando si ricompilano versioni di cui esiste un
pacchetto, o una che termini con "~pre1
" quando si
ricompilano versioni non ancora rilasciate in pacchetti nel modo seguente.
$ dch -i
Compilare ed installare i pacchetti con i simboli di debug nel modo seguente.
$ export DEB_BUILD_OPTIONS=nostrip,noopt $ debuild $ cd .. $ sudo debi nome_pacchetto*.changes
È necessario controllare gli script di compilazione del pacchetto ed
assicurarsi di usare "CFLAGS=-g -Wall
" per la
compilazione di binari.
Quando un programma va in crash, è una buona idea inviare un segnalazione di bug riportando le informazioni di backtrace.
Il backtrace può essere ottenuto eseguendo le azioni seguenti.
gdb
(1).
Riprodurre il crash.
gdb
.
bt
" al prompt di gdb
.
Nel caso in cui in programma si blocca, si può farlo andare in crash
premendo Ctrl-C
nel terminale in cui è in esecuzione
gdb
, ottenendo così il prompt di gdb
.
Spesso si vede un backtrace in cui una o più delle prime righe sono in
"malloc()
" o "g_malloc()
". Quando ciò
accade è probabile che il backtrace non sia molto utile. Il metodo più
semplice per trovare informazioni utili è di impostare la variabile
d'ambiente "$MALLOC_CHECK_
" al valore 2
(malloc
(3)). Lo si può fare mentre si esegue
gdb
nel modo seguente.
$ MALLOC_CHECK_=2 gdb hello
Tabella 12.12. Elenco di comandi gdb avanzati
comando | descrizione degli scopi del comando |
---|---|
(gdb) thread apply all bt
|
ottenere un backtrace per tutti i thread di un programma multi-thread |
(gdb) bt full
|
ottenere i parametri nello stack delle chiamate di funzione |
(gdb) thread apply all bt full
|
ottenere un backtrace e parametri: combinazione delle due opzioni precedenti |
(gdb) thread apply all bt full 10
|
ottenere un backtrace e i parametri per le prime dieci chiamate nello stack per eliminare l'output irrilevante |
(gdb) set logging on
|
scrivere un registro dell'output di gdb in un file (il
file predefinito è "gdb.txt ")
|
Se un programma gnome preview1
ha ricevuto un errore X,
si dovrebbe leggere un messaggio del tipo seguente.
The program 'preview1' received an X Window System error.
Se ciò avviene, si può provare ad eseguire il programma con
"--sync
" ed interrompere alla funzione
"gdk_x_error
" per ottenere un backtrace.
Per scoprire le dipendenze di un programma da librerie, usare
ldd
(1) nel modo seguente.
$ ldd /bin/ls librt.so.1 => /lib/librt.so.1 (0x4001e000) libc.so.6 => /lib/libc.so.6 (0x40030000) libpthread.so.0 => /lib/libpthread.so.0 (0x40153000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
Affinché ls
(1) funzioni in un ambiente "chroot", le
librerie in questione devono essere disponibili nell'ambiente "chroot".
Vedere Sezione 9.5.6, «Tenere traccia delle attività di un programma».
In Debian sono disponibili svariati strumenti di rilevazione di memory leak.
Tabella 12.13. Elenco di strumenti per rilevazione di memory leak
pacchetto | popcon | dimensione | descrizione |
---|---|---|---|
libc6-dev *
|
V:46, I:68 | 11292 |
mtrace (1): funzionalità di debug malloc in glibc
|
valgrind *
|
V:1.3, I:6 | 136416 | strumento di debug e profilazione per la memoria |
kmtrace *
|
V:0.3, I:2 | 324 |
tracciatore per memory leak di KDE che usa mtrace (1) di
glibc
|
alleyoop *
|
V:0.05, I:0.3 | 596 | frontend per Valgrind, programma di controllo della memoria |
electric-fence *
|
V:0.05, I:0.8 | 120 | strumento di debug malloc (3)
|
leaktracer *
|
V:0.01, I:0.11 | 116 | tracciatore di memory leak per programmi C++ |
libdmalloc5 *
|
V:0.01, I:0.2 | 356 | libreria per il debug dell'allocazione di memoria |
mpatrolc2 *
|
V:0.00, I:0.01 | 3592 | libreria per il debug dell'allocazione di memoria |
Esistono strumenti simili a lint per l'analisi statica del codice.
Tabella 12.14. Elenco di strumenti per l'analisi statica del codice
pacchetto | popcon | dimensione | descrizione |
---|---|---|---|
splint *
|
V:0.06, I:0.5 | 1836 | strumento per controllare staticamente la presenza di bug in programmi C |
rats
*
|
V:0.06, I:0.2 | 876 | Rough Auditing Tool for Security, strumento di controllo grezzo per la sicurezza (codice C, C++, PHP, Perl e Python) |
flawfinder *
|
V:0.01, I:0.15 | 192 | strumento per esaminare codice sorgente C/C++ e per cercare punti deboli per la sicurezza |
perl
*
|
V:88, I:99 | 18528 |
interprete con controllore interno statico del codice:
B::Lint (3perl)
|
pylint *
|
V:0.2, I:0.7 | 576 | strumento di controllo statico del codice Python |
jlint
*
|
V:0.01, I:0.09 | 156 | strumento di controllo per programmi Java |
weblint-perl *
|
V:0.10, I:0.7 | 28 | strumento di controllo della sintassi e dello stile di base per HTML |
linklint *
|
V:0.05, I:0.3 | 432 | controllore veloce di collegamenti e strumento per manutenzione di siti web |
libxml2-utils *
|
V:3, I:49 | 160 |
utilità con xmllint (1) per convalidare file XML
|
Flex è un veloce generatore di analizzatori lessicali compatibile con Lex.
Un tutorial per flex
(1) viene fornito da "info
flex
".
È necessario fornire i propri "main()
" e
"yywrap()
". Altrimenti il proprio programma flex dovrebbe
apparire così per compilare senza una libreria. Questo è dovuto al fatto che
"yywrap
" è una macro e "%option main
"
abilita implicitamente "%option noyywrap
".
%o Fabbrica componente Echo
In alternativa si può compilare con l'opzione per linker "
-lfl
" alla fine della propria riga di comando
cc
(1) (come "-ll
" per
AT&T-Lex). In questo caso non è necessario usare
"%option
".
Svariati pacchetti Debian forniscono un generatore di parser LR lookahead o parser LALR combatibile con Yacc.
Tabella 12.15. Elenco di generatori di parser LALR compatibili con Yacc
pacchetto | popcon | dimensione | descrizione |
---|---|---|---|
bison
*
|
V:2, I:15 | 1504 | generatore GNU di parser LALR |
byacc
*
|
V:0.09, I:1.2 | 168 | generatore Berkeley di parser LALR |
btyacc *
|
V:0.00, I:0.07 | 248 |
generatore di parser backtracking basato su byacc
|
Un tutorial per bison
(1) viene fornito da "info
bison
".
È necessario fornire i propri "main()
" e
"yyerror()
". "main()
" chiama
"yyparse()
" che a sua volta chiama
"yylex()
", solitamente creato con Flex.
%% %%
Autoconf è uno strumento per produrre script shell che configurano automaticamente pacchetti software di codice sorgente, in modo da adattarsi a molti tipi di sistemi *nix usando l'intero sistema di compilazione GNU.
autoconf
(1) produce lo script di configurazione
"configure
". "configure
" crea
automaticamente un "Makefile
" personalizzato usando il
modello "Makefile.in
".
Non sovrascrivere mai file di sistema quando si installano programmi compilati in proprio.
Debian non tocca i file in "/usr/local/
" o
"/opt
". Perciò se si compila un programma dai sorgenti,
installarlo in "/usr/local/
" in modo che non interferisca
con Debian.
$ cd src $ ./configure --prefix=/usr/local $ make $ make install # questo mette i file nel sistema
Se si hanno i sorgenti originali e questi usano
autoconf
(1)/automake
(1), e se ci si
ricorda la configurazione usata, eseguire quanto segue per disinstallare un
programma.
$ ./configure "tutte-le-opzioni-che-erano-state-usate" # make uninstall
In alternativa, se si è assolutamente certi che il processo di installazione
mette i file solo in "/usr/local/
" e lì non c'è nulla di
importante, si può cancellare tutto ciò che contiene con la riga di comando
seguente.
# find /usr/local -type f -print0 | xargs -0 rm -f
Se non si è sicuri di dove siano installati i file, si dovrebbe prendere in
considerazione l'uso di checkinstall
(8) dal pacchetto
checkinstall
, che fornisce un'indicazione per una
disinstallazione pulita.
Benché qualsiasi script AWK possa essere
riscritto automaticamente in Perl usando
a2p
(1), gli script AWK di una sola riga si convertono
meglio manualmente in script Perl di una riga.
Si consideri il seguente pezzetto di script AWK.
awk '($2=="1957") { print $3 }' |
Ciò equivale ad una qualsiasi delle righe seguenti.
perl -ne '@f=split; if ($f[1] eq "1957") { print "$f[2]\n"}' |
perl -ne 'if ((@f=split)[1] eq "1957") { print "$f[2]\n"}' |
perl -ne '@f=split; print $f[2] if ( $f[1]==1957 )' |
perl -lane 'print $F[2] if $F[1] eq "1957"' |
perl -lane 'print$F[2]if$F[1]eq+1957' |
L'ultima è una sorta di indovinello; sfrutta le seguenti caratteristiche di Perl.
Per le opzioni per la riga di comando vedere
perlrun
(1). Per altri script Perl pazzi può essere
interessante guardare Perl Golf.
Pagine web dinamiche interattive di base possono essere create nel modo seguente.
La compilazione e il cliccare sulle voci nel modulo invia una delle stringhe URL seguenti con i parametri codificati dal browser al web server.
http://www.foo.dom/cgi-bin/program.pl?VAR1=VAL1&VAR2=VAL2&VAR3=VAL3
"
http://www.foo.dom/cgi-bin/program.py?VAR1=VAL1&VAR2=VAL2&VAR3=VAL3
"
http://www.foo.dom/program.php?VAR1=VAL1&VAR2=VAL2&VAR3=VAL3
"
%nn
" nell'URL viene sostituito dal carattere con valore
esadecimale nn
.
QUERY_STRING="VAR1=VAL1
VAR2=VAL2 VAR3=VAL3"
".
program.*
") sul server web è eseguito con la variabile
d'ambiente "$QUERY_STRING
".
stdout
del programma CGI viene inviato al browser web
ed è presentato come pagina web dinamica interattiva.
Per ragioni di sicurezza è bene non creare a mano nuovi metodi per analizzare i parametri CGI. Per loro esistono moduli Perl e Python comprovati. PHP è fornito con queste funzionalità. Quando è necessaria l'archiviazione dei dati client vengono usati i cookie HTTP. Quando è necessaria l'elaborazione dei dati lato client, viene spesso usato Javascript.
Per maggiori informazioni vedere CGI (Common Gateway Interface), Apache Software Foundation e JavaScript.
Cercare "CGI tutorial" su Google digitando l'URL codificato http://www.google.com/search?hl=en&ie=UTF-8&q=CGI+tutorial direttamente nell'indirizzo del browser è un buon modo per vedere lo script CGI in azione sul server di Google.
Esistono programmi per convertire codice sorgente.
Tabella 12.16. Elenco di strumenti per la traduzione di codice sorgente
pacchetto | popcon | dimensione | parola chiave | descrizione |
---|---|---|---|---|
perl
*
|
V:88, I:99 | 18528 | AWK→PERL |
converte codice sorgente da AWK a PERL:a2p (1)
|
f2c
*
|
V:0.12, I:1.2 | 448 | FORTRAN→C |
converte codice sorgente da FORTRAN 77 a C/C++: f2c (1)
|
protoize *
|
V:0.00, I:0.09 | 100 | ANSI C | crea/rimuove prototipi ANSI da codice C |
intel2gas *
|
V:0.01, I:0.07 | 344 | intel→gas | convertitore da NASM (formato Intel) a GAS (GNU Assembler) |
Se si desidera creare un pacchetto Debian, leggere i documenti seguenti.
debuild
(1), pbuilder
(1) e
pdebuild
(1)
maint-guide
)
developers-reference
)
debian-policy
)
Ci sono pacchetti come dh-make
,
dh-make-perl
, ecc., che aiutano nella creazione dei
pacchetti.
Ecco il dietro le quinte di questo documento.
Il sistema Linux è una piattaforma informatica molto potente per un computer in rete. Tuttavia imparare come usare tutte le sue funzionalità non è semplice. Impostare la stampa LPR con una stampante non PostScript è stato un buon esempio di problema su cui si può inciampare. (Ora non ci sono più problemi dato che le installazioni più recenti usano il nuovo sistema CUPS.)
Esiste una mappa dettagliata completa chiamata "CODICE SORGENTE". È molto accurata, ma estremamente difficile da capire. Esistono anche documenti di consultazione chiamati HOWTO e mini-HOWTO; sono più facili da comprendere ma tendono a dare troppi dettagli e a perdere di vista il quadro generale. Io ho a volte dei problemi a trovare la giusta sezione in un lungo HOWTO quando ho bisogno di trovare un paio di comandi da eseguire.
Spero che questa "Debian Reference (versione 2)" possa fornire un buon punto di partenza per le persone nel labirinto Debian.
La Debian Reference è stata iniziata da Osamu Aoki <osamu at debian dot org> come promemoria personale per l'amministrazione di sistema. Molti dei contenuti derivano dalle conoscenze ottenute dalla mailing-list debian-user e da altre risorse Debian.
Seguendo un suggerimento di Josip Rodin, che è stato molto attivo nel DDP (Debian Documentation Project), è stata creata la "Debian Reference (versione 1, 2001-2007) come parte della documentazione del DDP.
Dopo 6 anni, Osamu ha realizzato che la "Debian Reference (versione 1)" era sorpassata ed ha iniziato a riscrivere molti dei suoi contenuti. La nuova "Debian Reference (versione 2)" è stata rilasciata nel 2008.
Si può rintracciare l'origine e l'ispirazione del tutorial nelle fonti seguenti.
"Linux User's Guide" di Larry Greenfield (dicembre 1996)
"Debian Tutorial" di Havoc Pennington. (11 dicembre, 1998)
"Debian GNU/Linux: Guide to Installation and Usage" di John Goerzen ed Ossama Othman (1999)
Si può rintracciare parte dell'origine e dell'ispirazione per la descrizione dei pacchetti e degli archivi nei documenti seguenti.
Si può rintracciare parte dell'origine e dell'ispirazione per gli altri contenuti nei documenti seguenti.
"Debian Reference (versione 1)" di Osamu Aoki (2001–2007)
La precedente "Debian Reference (versione 1)" è stata creata con il contributo di molti.
Molte pagine di manuale e info del sistema Debian sono state usate come riferimento principale per la stesura di questo documento. Tanto che Osamu Aoki ha ritenuto nei limiti del fair use molte parti de esse, specialmente le definizioni dei comandi, che sono state riprese letteralmente dopo attenti sforzi editoriali per inserirle nello stile e nello scopo di questo documento.
La descrizione dello strumento di debug gdb è stata estesa usando i contenuti del Debian wiki sul backtrace con il consenso di Ari Pollak, Loïc Minier e Dafydd Harries.
I contenuti della "Debian Reference (versione 2)" sono per la maggior parte miei tranne per quanto specificato in precedenza. Anche questi sono stati aggiornati grazie a contributi.
Il documento "Debian Reference (versione 1)" è stato tradotto da Davide Di Lazzaro (mc0315 at mclink dot it).
Il documento "Debian Reference (versione 2)" è tradotto da Beatrice Torracca (beatricet at libero dot it), usando laddove il testo aveva subito modifiche marginali rispetto alla versione 1 parti del lavoro di traduzione di Davide Di Lazzaro, dopo i necessari cambiamenti.
L'autore, Osamu Aoki, ringrazia tutti coloro che con il loro aiuto hanno reso questo documento possibile.
I sorgenti del documento originale in inglese sono attualmente scritti usando file di testo AsciiDoc; quest'ultimo è usato per motivi di comodità dato che richiede meno scrittura del puro XML e supporta le tabelle in un formato molto intuitivo. Si dovrebbero considerare i file XML e PO come i veri file sorgenti. Attraverso script di compilazione è convertito nel formato XML DocBook e i dati generati automaticamente sono inseriti a formare il sorgente XML Docbook finale. Questo sorgente finale può essere convertito in HTML, testo semplice, PostScript e PDF. Attualmente sono abilitate solamente le conversioni in HTML e testo semplice.