Capitolo 10. Gestione dei dati

Indice

10.1. Condividere, copiare ed archiviare
10.1.1. Strumenti di archiviazione e compressione
10.1.2. Strumenti di copia e sincronizzazione
10.1.3. Esempi di invocazione per archivi
10.1.4. Esempi di invocazione per la copia
10.1.5. Esempi di invocazione per la selezione di file
10.1.6. Backup e ripristino
10.1.7. Suite con utilità di backup
10.1.8. Uno script di esempio per il backup di sistema
10.1.9. Uno script di copia per backup di dati
10.1.10. Supporti di archiviazione removibili
10.1.11. Scelta del file system per la condivisione di dati
10.1.12. Condividere dati attraverso una rete
10.1.13. Supporti di archiviazione
10.2. Immagine del disco
10.2.1. Creare un file con un'immagine di disco
10.2.2. Scrivere direttamente sul disco
10.2.3. Montare un file con un'immagine di disco
10.2.4. Pulire un file con un'immagine di disco
10.2.5. Creare un file con immagine di disco vuoto
10.2.6. Creare un file con un'immagine ISO9660
10.2.7. Scrivere direttamente sul CD/DVD-R/RW
10.2.8. Montare un file con un'immagine ISO9660
10.3. I dati binari
10.3.1. Visualizzare e modificare dati binari
10.3.2. Manipolare file senza montare i dischi
10.3.3. Dati ridondanti
10.3.4. recupero di file dati ed analisi forensi
10.3.5. Suddividere un file grande in file più piccoli
10.3.6. Pulire il contenuto di file
10.3.7. File fittizi
10.3.8. Cancellare un intero disco fisso
10.3.9. Cancellare area inutilizzate di un disco fisso
10.3.10. De-cancellare file cancellati ma ancora aperti
10.3.11. Cercare tutti i collegamenti fisici
10.3.12. Consumo invisibile dello spazio su disco
10.4. Infrastruttura di sicurezza dei dati
10.4.1. Gestione delle chiavi per GnuPG
10.4.2. Usare GnuPG su file
10.4.3. Usare GnuPG con Mutt
10.4.4. Usare GnuPG con Vim
10.4.5. Somme di controllo MD5
10.5. Strumenti per la fusione di codice sorgente
10.5.1. Estrarre differenze da file sorgenti
10.5.2. Fondere aggiornamenti per file sorgenti
10.5.3. Aggiornare con fusioni a 3 vie
10.6. Sistemi di controllo delle versioni
10.6.1. Comparazione di comandi VCS
10.7. CVS
10.7.1. Configurazione di archivi CVS
10.7.2. Accesso locale al CVS
10.7.3. Accesso remoto a CVS con pserver
10.7.4. Accesso remoto a CVS con ssh
10.7.5. Importare un nuovo sorgente in CVS
10.7.6. Permessi dei file negli archivi CVS
10.7.7. Sequenza di azioni tipiche nell'uso di CVS
10.7.8. File più recenti dal CVS
10.7.9. Amministrazione del CVS
10.7.10. Bit di esecuzione per il checkout CVS
10.8. Subversion
10.8.1. Configurazione di archivi Subversion
10.8.2. Accedere a Subversion tramite il server Apache2
10.8.3. Accesso locale a Subversion da parte di un gruppo
10.8.4. Accesso remoto a Subversion con SSH
10.8.5. Struttura delle directory di Subversion
10.8.6. Importare un nuovo sorgente in Subversion
10.8.7. Sequenza di azioni tipiche nell'uso di Subversion
10.9. Git
10.9.1. Configurazione del client Git
10.9.2. Documenti di consultazione per Git
10.9.3. Comandi Git
10.9.4. Git per repository Subversion
10.9.5. Git per registrare la cronologia della configurazione

In questo capitolo sono descritti strumenti e trucchi per gestire dati binari e di testo in un sistema Debian.

[Avvertimento] Avvertimento

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).

10.1. Condividere, copiare ed archiviare

La sicurezza dei dati e la loro condivisione controllata hanno diversi aspetti.

  • La creazione di archivi di dati

  • L'accesso ad archivi remoti

  • La duplicazione

  • Il tenere traccia della cronologia delle modifiche

  • La facilitazione della condivisione dei dati

  • Il prevenire l'accesso non autorizzato ai file

  • La rilevazione di modifiche non autorizzate ai file

Queste azioni possono essere realizzate usando una combinazione di strumenti.

  • Strumenti di archiviazione e compressione

  • Strumenti di copia e sincronizzazione

  • file system di rete

  • Supporti di archiviazione removibili

  • Secure Shell

  • Il sistema di autenticazione

  • Strumenti per sistemi di controllo delle versioni

  • Strumenti crittografici per hash e cifratura

10.1.1. Strumenti di archiviazione e compressione

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 estensione comando commento
tar V:568, I:999 2464 .tar tar(1) strumento di archiviazione standard (standard de facto)
cpio V:508, I:998 855 .cpio cpio(1) strumento di archiviazione Unix in stile System V, da usare con find(1)
binutils V:550, I:741 14618 .ar ar(1) strumento di archiviazione per la creazione di librerie statiche
fastjar V:13, I:130 191 .jar fastjar(1) strumento di archiviazione per Java (simile a zip)
pax V:23, I:82 181 .pax pax(1) nuovo strumento POSIX di archiviazione, compromesso tra tar e cpio
gzip V:901, I:999 202 .gz gzip(1), zcat(1), … utilità GNU di compressione LZ77 (standard de facto)
bzip2 V:491, I:812 91 .bz2 bzip2(1), bzcat(1), … 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:27, I:304 144 .lzma lzma(1) utilità di compressione LZMA con maggiore rapporto di compressione di gzip(1) (deprecata)
xz-utils V:196, I:831 470 .xz xz(1), xzdec(1), … 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:11, I:101 986 .7z 7zr(1), p7zip(1) strumento di archiviazione file 7-Zip con alto rapporto di compressione (compressione LZMA)
p7zip-full V:256, I:449 3895 .7z 7z(1), 7za(1) strumento di archiviazione file 7-Zip con alto rapporto di compressione (compressione LZMA e altre)
lzop V:4, I:42 112 .lzo lzop(1) 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:63, I:388 597 .zip zip(1) InfoZIP: strumento di archiviazione e compressione per DOS
unzip V:287, I:714 377 .zip unzip(1) InfoZIP: strumento di estrazione di archivi e decompressione per DOS

[Avvertimento] Avvertimento

Non impostare la variabile "$TAPE" a meno che non si sappia esattamente cosa aspettarsi. Cambia il comportamento di tar(1).

[Nota] Nota

Gli archivi tar(1) compressi con gzip usano l'estensione di file ".tgz" o ".tar.gz".

[Nota] Nota

Gli archivi tar(1) compressi con xz usano l'estensione di file ".txz" o ".tar.xz".

[Nota] Nota

La popolarità dei metodi di compressione negli strumenti FOSS come tar(1) è cambiata nel tempo nel modo seguente gzipbzip2xz

[Nota] Nota

cp(1), scp(1) e tar(1) possono avere alcune limitazioni per file speciali. cpio(1) è più versatile.

[Nota] Nota

cpio(1) è progettato per essere usato 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.

[Nota] Nota

La struttura interna dei file di dati di OpenOffice è quella dei file ".jar".

10.1.2. Strumenti di copia e sincronizzazione

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:901, I:999 14184 GNU cp copia file e directory localmente ("-a" per modalità ricorsiva)
openssh-client V:563, I:995 2276 scp copia file e directory da remoto (client, "-r" per modalità ricorsiva)
openssh-server V:683, I:843 708 sshd copia file e directory da remoto (server remoto)
rsync V:198, I:612 638 - sincronizzazione e backup in remoto unidirezionale
unison V:8, I:29 1987 - sincronizzazione e backup in remoto bidirezionale

La copia dei file con rsync(8) offre un insieme di funzionalità più ricco di altri strumenti.

  • l'algoritmo delta-transfer, che invia solamente le differenze tra il file sorgente ed il file esistente nella destinazione

  • algoritmo veloce di verifica (predefinito) che cerca i file la cui dimensione o il cui orario di ultima modifica sono cambiati

  • opzioni "--exclude" e "--exclude-from" simili a quelle di tar(1)

  • sintassi con "una barra / alla fine della directory sorgente" che evita di dover creare un livello aggiuntivo di directory nella destinazione

[Suggerimento] Suggerimento

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.

[Suggerimento] Suggerimento

Gli strumenti di controllo delle versioni VCS (Version control system) in Tabella 10.15, «Elenco di strumenti per sistemi di controllo delle versioni» possono essere usati come strumenti di copia e sincronizzazione multidirezionali.

10.1.3. Esempi di invocazione per archivi

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

10.1.4. Esempi di invocazione per la copia

Ecco diversi modi di copiare l'intero contenuto della directory "./sorgente", usando diversi strumenti.

  • Copia locale: directory "./sorgente" → directory "/dest"

  • Copia remota: directory "./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

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 contenenti ".", 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.

  • in "/dest/pippo": rsync(8), GNU cp(1) e scp(1)

  • "/percorso/di/sorgente/pippo": GNU tar(1) e cpio(1)

[Suggerimento] Suggerimento

rsync(8) e GNU cp(1) hanno l'opzione "-u" per saltare i file che sono più recenti nella destinazione.

10.1.5. Esempi di invocazione per la selezione di file

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.

  • Gli argomenti condizionali sono valutati da sinistra a destra.

  • Questa valutazione si ferma una volta che il risultato è determinato.

  • L'operatore "OR logico" (specificato con "-o" tra condizioni) ha una precedenza più bassa dell'operatore "AND logico" (specificato da "-a" o dall'assenza di un operatore tra condizioni).

  • L'operatore "NOT logico" (specificato da "!" prima di una condizione) ha una precedenza più alta di un operatore "AND logico".

  • L'opzione "-prune" restituisce sempre una condizione di VERO logico e, se si tratta di una directory, la ricerca si ferma a questo punto.

  • L'opzione "-name trova corrispondenze con il nome base del file tramite espressioni glob di shell (vedere Sezione 1.5.6, «Glob della shell»), ma fa corrispondenza anche con il carattere iniziale "." con l'uso di metacaratteri come "*" e "?". (Nuova funzionalità POSIX.)

  • L'opzione "-regex" trova corrispondenze con il percorso completo usando, in modo predefinito, BRE in stile emacs (vedere Sezione 1.6.2, «Espressioni regolari»).

  • L'opzione "-size" trova corrispondenze con file in base alla loro dimensione (valori preceduti da "+" o "-" per cercare dimensioni, rispettivamente, più grandi o piccole del valore).

  • L'opzione "-newer" trova corrispondenze con file più recenti di quello specificato come argomento dell'opzione.

  • L'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 /path/to \
    -xdev -regextype posix-extended \
    -type f -regex ".*\.cpio|.*~" -prune -o \
    -type d -regex ".*/\.git" -prune -o \
    -type f -size +99M -prune -o \
    -type f -newer /path/to/timestamp -print0

Il comando precedente si traduce nelle azioni seguenti.

  1. Cercare tutti i file a partire da "/percorso/di"

  2. Limitare globalmente la ricerca al file system da cui è richiamato e usare espressioni regolari ERE (vedere Sezione 1.6.2, «Espressioni regolari»)

  3. Escludere i file che corrispondono all'espressione regolare ".*\.cpio" o ".*~" dalla ricerca fermando la loro elaborazione

  4. Escludere le directory che corrispondono all'espressione regolare ".*/\.git" dalla ricerca fermando la loro elaborazione

  5. Escludere i file più grandi di 99 Megabyte (unità di 1048576 byte) dalla ricerca fermando la loro elaborazione

  6. Stampare i nomi di file che soddisfano le condizioni di ricerca precedenti e che siano più recenti di "/percorso/di/marcaturaorario"

Notare nell'esempio precedente l'uso della parte di comando "-prune -o per escludere file.

[Nota] Nota

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 correlati.

10.1.6. Backup e ripristino

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.

[Suggerimento] Suggerimento

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.

  1. Sapere di cosa fare il backup ed il ripristino

    • I file dati direttamente creati dall'utente: in "~/"

    • I file dati creati da applicazioni usate dall'utente: dati in "/var/" (tranne "/var/cache/", "/var/run/" e "/var/tmp/")

    • File di configurazione del sistema: dati in "/etc/"

    • Software locali: dati in "/usr/local/" o "/opt/"

    • Informazioni di installazione del sistema: un memorandum in puro testo sui passi chiave (partizioni, …)

    • Insiemi di dati comprovati: confermati da operazioni preventive sperimentali di ripristino

  2. Sapere come fare il backup ed il ripristino

    • Rendere sicura l'archiviazione dei dati: protezione da sovrascritture e fallimenti del sistema

    • Backup frequenti: backup pianificati

    • Backup ridondanti: mirror di dati

    • Procedura a prova di idioti: singolo facile comando di backup

  3. Valutazione dei rischi e dei costi

    • Valore dei dati se persi

    • Risorse necessarie per il backup: umane, hardware, software, …

    • Modi in cui le cose possono andare storte e loro probabilità

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".)

[Nota] Nota

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)»).

[Nota] Nota

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.

[Nota] Nota

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).

10.1.7. Suite con utilità di backup

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
obnam V:0, I:1 409 backup incrementali (remoti)
rdiff-backup V:13, I:29 704 backup incrementali (remoti)
dump V:3, I:12 716 dump(8) e restore(8) di BSD 4.4 per file system ext2/ext3
xfsdump V:1, I:20 595 dump e ripristino con xfsdump(8) e xfsrestore(8) per file system XFS in GNU/Linux e IRIX
backupninja V:4, I:5 277 sistema di meta-backup leggero ed estensibile
sbackup V:0, I:0 488 semplice suite di backup per il desktop GNOME
bacula-common V:12, I:25 1148 Bacula: backup, ripristino e controllo in rete - file comuni di supporto
bacula-client I:8 102 Bacula: backup, ripristino e controllo in rete - metapacchetto client
bacula-console V:3, I:11 162 Bacula: backup, ripristino e controllo in rete - console testuale
bacula-server I:4 102 Bacula: backup, ripristino e controllo in rete - metapacchetto server
amanda-common V:3, I:6 6825 Amanda: Advanced Maryland Automatic Network Disk Archiver (Librerie)
amanda-client V:3, I:6 718 Amanda: Advanced Maryland Automatic Network Disk Archiver (Client)
amanda-server V:0, I:2 845 Amanda: Advanced Maryland Automatic Network Disk Archiver (Server)
backuppc V:7, I:9 1956 BackupPC è un sistema ad altre prestazioni di qualità professionale per il backup di PC (basato su dischi)
backup-manager V:3, I:5 615 strumento di backup a riga di comando
backup2l V:1, I:2 86 strumento di backup/ripristino per supporti montabile (basato su dischi) che richiede bassa manutenzione

Gli strumenti di backup hanno una propria specializzazione.

  • Mondo Rescue è un sistema di backup per facilitare il ripristino veloce di un sistema completo a partire da backup su CD/DVD ecc., senza dover affrontare il normale processo di installazione del sistema.

  • I pacchetti 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).

  • Bacula, Amanda e BackupPC sono suite di utilità di backup complete che sono pensate per backup regolari in rete.

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.

  • Il pacchetto rdiff-backup permette backup incrementali (remoti).

  • Il pacchetto dump aiuta ad archiviare e ripristinare tutto il file system in maniera incrementale ed efficiente.

[Suggerimento] Suggerimento

Per imparare ulteriori informazioni sul pacchetto dump, vedere i file in "/usr/share/doc/dump/" e "Is dump really deprecated? (dump è davvero deprecato?).

10.1.8. Uno script di esempio per il backup di sistema

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 and name of a user who accesses backup files
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|.+\.cpio|.+\.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.

Mantenere le cose semplici!

[Suggerimento] Suggerimento

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".

10.1.9. Uno script di copia per backup di dati

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
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 = 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.

[Suggerimento] Suggerimento

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.

[Suggerimento] Suggerimento

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»).

10.1.10. Supporti di archiviazione removibili

Un support di archiviazione removibile può essere uno dei seguenti.

Possono essere connessi in uno dei modi seguenti.

Gli ambienti desktop moderni, come GNOME e KDE, possono montare questi dispositivi removibili automaticamente senza una voce corrispondente in "/etc/fstab".

  • Il pacchetto udisks fornisce un demone e le utilità associate per montare e smontare questi dispositivi.

  • D-bus crea eventi per dare inizio ai processi automatici.

  • PolicyKit fornisce i privilegi necessari.

[Suggerimento] Suggerimento

I dispositivi montati automaticamente hanno l'opzione di mount "uhelper=" che viene usata da umount(8).

[Suggerimento] Suggerimento

Nei moderni ambienti desktop il montaggio automatico avviene solo quando i device dei supporti removibili non sono elencati in "/etc/fstab".

Il punto di mount negli ambienti desktop moderni 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/ext4

[Suggerimento] Suggerimento

Può essere necessario fornire come opzione di montaggio la scelta della codifica (vedere Sezione 8.3.6, «Codifica per i nomi di file»).

10.1.11. Scelta del file system per la condivisione di dati

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. Quello che segue è un elenco delle scelte possibili per il file system.

Tabella 10.4. 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 più vecchi
file system ext4 condivisione di dati su dispositivi come dischi fissi con sistemi Linux recenti

[Suggerimento] Suggerimento

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.2, «Configurazione del partizionamento dei dischi») creando un'unica partizione primaria e marcarla nel modo seguente.

    • Tipo "6", cioè FAT16, per supporti più piccoli di 2GB.

    • Tipo "c", cioè FAT32 (LBA), per supporti più grandi.

  • Formattare la partizione primaria con mkfs.vfat(8) nel modo seguente.

    • Per FAT16, semplicemente con il suo nome di device, ad esempio "/dev/sda1".

    • Per FAT32, con il suo nome di device e l'opzione esplicita, ad esempio "-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.

  • Archiviare prima i file in un file di archivio usando tar(1) o cpio(1) per mantenere i nomi di file lunghi, i collegamenti simbolici, i permessi Unix sui file originali e le informazioni sui proprietari.

  • Suddividere il file di archivio in pezzi più piccoli di 2 GiB con il comando split(1) per proteggerli da limitazioni sulla dimensione dei file.

  • Cifrare il file archivio per proteggere i suoi contenuti da accesso non autorizzato.

[Nota] Nota

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.

[Nota] Nota

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 ext4.

[Suggerimento] Suggerimento

Per maggiori informazioni sui file system e sull'accesso ad essi, leggere il "Filesystems HOWTO".

10.1.12. Condividere dati attraverso una rete

Quando si condividono dati con un altro sistema attraverso una rete, si dovrebbero tenere a mente i servizi comuni. Ecco alcuni suggerimenti.

Tabella 10.5. 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.

  • Cifrarli con SSL/TLS

  • Usarli in tunnel SSH

  • Usarli in tunnel VPN

  • Limitarli dietro ad un firewall sicuro

Vedere anche Sezione 6.10, «Altri server di rete» e Sezione 6.11, «Altri client di rete».

10.1.13. Supporti di archiviazione

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.)

[Nota] Nota

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).

  • 100+ anni: carta senza acidi con inchiostro

  • 100 anni: supporti ottici (CD/DVD, CD/DVD-R)

  • 30 anni: supporti magnetici (nastri, dischetti floppy)

  • 20 anni: supporti ottici a cambio di fase (CD-RW)

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).

  • 250,000+ cicli: unità a disco fisso

  • 10,000+ cicli: memoria flash

  • 1,000 cicli: CD/DVD-RW

  • 1 ciclo: CD/DVD-R, carta

[Attenzione] Attenzione

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.

[Suggerimento] Suggerimento

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!

[Suggerimento] Suggerimento

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.

10.2. Immagine del disco

Questa sezione tratta della manipolazione di immagini di dischi. Vedere anche Sezione 9.3, «Suggerimenti per l'archiviazione dei dati».

10.2.1. Creare un file con un'immagine di disco

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.2, «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.

10.2.2. Scrivere direttamente sul disco

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

10.2.3. Montare un file con un'immagine di disco

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
[Nota] Nota

È 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.

10.2.4. Pulire un file con un'immagine di disco

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

10.2.5. Creare un file con immagine di disco vuoto

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.

[Suggerimento] Suggerimento

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.

10.2.6. Creare un file con un'immagine ISO9660

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
[Avvertimento] Avvertimento

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.

10.2.7. Scrivere direttamente sul CD/DVD-R/RW

[Suggerimento] Suggerimento

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
[Suggerimento] Suggerimento

Se il sistema desktop usato monta automaticamente i CD, prima di usare wodim(1) smontarlo usando "sudo umount /dev/hda".

10.2.8. Montare un file con un'immagine ISO9660

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
[Suggerimento] Suggerimento

I sistemi desktop moderni montano automaticamente i supporti removibili (vedere Sezione 10.1.10, «Supporti di archiviazione removibili»).

10.3. I dati binari

Questa sezione tratta della manipolazione diretta dei dati binari su supporti di archiviazione. Vedere anche Sezione 9.3, «Suggerimenti per l'archiviazione dei dati».

10.3.1. Visualizzare e modificare dati binari

Il metodo di visualizzazione dei dati binai più basilare è l'uso del comando "od -t x1".

Tabella 10.6. Elenco di pacchetti che visualizzano e modificano dati binari

pacchetto popcon dimensione descrizione
coreutils V:901, I:999 14184 pacchetto base che contiene od(1) per fare il dump di file (HEX, ASCII, OCTAL, …)
bsdmainutils V:867, I:999 558 pacchetto di utilità che contiene hd(1) per fare il dump di file (HEX, ASCII, OCTAL, …)
hexedit V:2, I:17 108 visualizzatore ed editor binario (HEX, ASCII)
bless V:0, I:4 991 editor esadecimale completo (GNOME)
okteta V:5, I:44 321 editor esadecimale completo (KDE4)
ncurses-hexedit V:0, I:4 192 visualizzatore ed editor binario (HEX, ASCII, EBCDIC)
beav V:0, I:2 164 visualizzatore ed editor binario (HEX, ASCII, EBCDIC, OCTAL, …)

[Suggerimento] Suggerimento

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.

10.3.2. Manipolare file senza montare i dischi

Esistono strumenti per leggere e scrivere file senza montare i dischi.

Tabella 10.7. Elenco di pacchetti per manipolare file senza montare i dischi

pacchetto popcon dimensione descrizione
mtools V:50, I:483 341 utilità per file MSDOS senza montarli
hfsutils V:1, I:15 236 utilità per file HFS e HFS+ senza montarli

10.3.3. Dati ridondanti

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.8. Elenco di strumenti per aggiungere dati ridondanti a file

pacchetto popcon dimensione descrizione
par2 V:5, I:17 272 insiemi di volumi di archivi di parità, per controllare e riparare file
dvdisaster V:0, I:5 1481 protezione contro perdita di dati/graffi/invecchiamento di supporti CD/DVD
dvbackup V:0, I:0 392 strumento di backup che usa camcorder MiniDV (fornisce rsbep(1))
vdmfec V:0, I:0 88 recupera blocchi perduti usando Forward Error Correction

10.3.4. recupero di file dati ed analisi forensi

Esistono strumenti per recuperare file dati e fare analisi forensi.

Tabella 10.9. Elenco di pacchetti per recupero di file dati ed analisi forensi.

pacchetto popcon dimensione descrizione
testdisk V:4, I:40 1153 utilità per scansione delle partizione e ripristino di dischi
magicrescue V:0, I:4 344 utilità per ripristinare file cercando byte magici
scalpel V:0, I:3 124 strumento di escavazione di file frugale e ad alte prestazioni
myrescue V:0, I:1 84 recupera dati da dischi fissi danneggiati
recover V:0, I:4 104 utilità per decancellare file da file system ext2
e2undel V:0, I:4 244 utilità per decancellare file da file system ext2
ext3grep V:0, I:5 286 strumento per aiutare a recuperare file cancellati da file system ext3
scrounge-ntfs V:0, I:3 80 programma di recupero di dati da file system NTFS
gzrt V:0, I:0 56 insieme di strumenti di recupero di gzip
sleuthkit V:0, I:5 750 strumenti per analisi forensi (Sleuthkit)
autopsy V:0, I:3 1372 interfaccia grafica per SleuthKit
foremost V:1, I:8 83 applicazione forense per il recupero dei dati
guymager V:0, I:0 949 strumento forense per immagini basato su Qt
dcfldd V:0, I:2 109 versione migliorata di dd per analisi forensi e sicurezza
rdd V:0, I:0 200 programma di copia per uso forense

10.3.5. Suddividere un file grande in file più piccoli

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
[Attenzione] Attenzione

Assicurarsi di non avere altri file che iniziano con "x" per evitare conflitti nei nomi.

10.3.6. Pulire il contenuto di file

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

10.3.7. File fittizi

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.

10.3.8. Cancellare un intero disco fisso

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".

[Attenzione] Attenzione

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.

10.3.9. Cancellare area inutilizzate di un disco fisso

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
[Avvertimento] Avvertimento

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.

10.3.10. De-cancellare file cancellati ma ancora aperti

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

10.3.11. Cercare tutti i collegamenti fisici

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

10.3.12. Consumo invisibile dello spazio su disco

Tutti i file cancellati ma aperti consumano spazio su disco, anche se non sono visibili con il normale comando du(1). Possono essere elencati, insieme alla loro dimensione, nel modo seguente.

# lsof -s -X / |grep deleted

10.4. Infrastruttura di sicurezza dei dati

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.10. Elenco di strumenti per l'infrastruttura di sicurezza dei dati

pacchetto popcon dimensione comando descrizione
gnupg V:482, I:998 4957 gpg(1) GNU Privacy Guard - strumento OpenPGP di cifratura e firma
gnupg-doc I:8 4124 N/D documentazione di GNU Privacy Guard
gpgv V:568, I:997 433 gpgv(1) GNU Privacy Guard - strumento di verifica delle firme
paperkey V:0, I:0 88 paperkey(1) estrae solamente le informazioni segrete da chiavi OpenPGP segrete
cryptsetup V:46, I:63 295 cryptsetup(8), … utilità per la cifratura dm-crypto per i device a blocchi con supporto LUKS
ecryptfs-utils V:4, I:6 308 ecryptfs(7), … utilità per cifratura di file system stack ecryptfs
coreutils V:901, I:999 14184 md5sum(1) calcola e controlla message digest MD5
coreutils V:901, I:999 14184 sha1sum(1) calcola e controlla message digest SHA1
openssl V:752, I:969 1080 openssl(1ssl) 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».

10.4.1. Gestione delle chiavi per GnuPG

Quelli che seguono sono alcuni comandi per GNU Privacy Guard per la gestione base delle chiavi.

Tabella 10.11. 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.12. 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).

10.4.2. Usare GnuPG su file

Quelli seguenti sono esempi di comandi per usare GNU Privacy Guard su file.

Tabella 10.13. 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 " "

10.4.3. Usare GnuPG con Mutt

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

10.4.4. Usare GnuPG con Vim

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

10.4.5. Somme di controllo MD5

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
[Nota] Nota

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.

10.5. Strumenti per la fusione di codice sorgente

Esistono molti strumenti per la fusione di codice sorgente. Quello che segue è un elenco di strumenti che hanno catturato la mia attenzione.

Tabella 10.14. Elenco di strumenti per la fusione di codice sorgente

pacchetto popcon dimensione comando descrizione
diffutils V:735, I:826 1114 diff(1) confronta i file riga per riga
diffutils V:735, I:826 1114 diff3(1) confronta e fonde tre file riga per riga
vim V:167, I:399 1877 vimdiff(1) confronta 2 file uno di fianco all'altro in vim
patch V:144, I:943 218 patch(1) applica un file diff ad un originale
dpatch V:6, I:65 237 dpatch(1) gestisce serie di patch per pacchetti Debian
diffstat V:19, I:144 45 diffstat(1) produce un istogramma delle modifiche apportate da un diff
patchutils V:15, I:119 221 combinediff(1) crea una patch cumulativa da due patch incrementali
patchutils V:15, I:119 221 dehtmldiff(1) estrae un diff da una pagina HTML
patchutils V:15, I:119 221 filterdiff(1) estrae o esclude diff da un file diff
patchutils V:15, I:119 221 fixcvsdiff(1) aggiusta file diff creati da CVS che sono male interpretati da patch(1)
patchutils V:15, I:119 221 flipdiff(1) scambia l'ordine di due patch
patchutils V:15, I:119 221 grepdiff(1) mostra quali file siano modificati da una patch che fa corrispondenza con un'espressione regolare
patchutils V:15, I:119 221 interdiff(1) mostra le differenze tra due file diff unificati
patchutils V:15, I:119 221 lsdiff(1) mostra quali file vengano modificati da una patch
patchutils V:15, I:119 221 recountdiff(1) ricalcola conteggi e offset in diff unificati
patchutils V:15, I:119 221 rediff(1) aggiusta conteggi ed offset di un diff modificato a mano
patchutils V:15, I:119 221 splitdiff(1) separa due patch incrementali
patchutils V:15, I:119 221 unwrapdiff(1) ripristina patch il cui contenuto è stato mandato a capo automaticamente
wiggle V:0, I:0 203 wiggle(1) applica le patch respinte
quilt V:12, I:92 814 quilt(1) gestisce serie di patch
meld V:9, I:38 2023 meld(1) confronta e fonde file (GTK)
dirdiff V:0, I:5 224 dirdiff(1) mostra le differenze ed apporta i cambiamenti tra alberi di directory
docdiff V:0, I:0 543 docdiff(1) confronta due file parola per parola / carattere per carattere
imediff2 V:0, I:0 76 imediff2(1) strumento interattivo a tutto schermo di applicazione di modifiche bidirezionale
makepatch V:0, I:0 148 makepatch(1) genera file patch estesi
makepatch V:0, I:0 148 applypatch(1) applica file patch estesi
wdiff V:15, I:141 902 wdiff(1) mostra le differenze di parole tra file di testo

10.5.1. Estrarre differenze da file sorgenti

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

10.5.2. Fondere aggiornamenti per file sorgenti

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

10.5.3. Aggiornare con fusioni a 3 vie

Se si hanno tre versioni di un codice sorgente, è possibile effettuare una fusione a 3 vie in maniera efficace usando diff3(1) nel modo seguente.

$ diff3 -m file.mio file.vecchio file.tuo > file

10.6. Sistemi di controllo delle versioni

Ecco un riassunto dei sistemi di controllo delle versioni (VCS) nel sistema Debian.

[Nota] Nota

Se non si ha esperienza di sistemi VCS, si dovrebbe iniziare ad imparare con Git che sta acquistando sempre più popolarità.

Tabella 10.15. Elenco di strumenti per sistemi di controllo delle versioni

pacchetto popcon dimensione strumento tipo di VCS commento
cssc V:0, I:0 2240 CSSC locale clone di SCCS Unix (deprecato)
rcs V:8, I:44 1211 RCS locale "SCCS Unix fatto bene"
cvs V:19, I:130 4059 CVS remoto precedente standard per VCS remoto
subversion V:81, I:283 3899 Subversion remoto "CVS fatto bene", il nuovo standard di fatto per VCS remoto
git V:130, I:414 13134 Git distribuito veloce DVCS in C (usato dal kernel Linux ed altri)
mercurial V:20, I:79 371 Mercurial distribuito DVCS in Python e un po' di C
bzr V:9, I:39 98 Bazaar distribuito DVCS influenzato da tla, scritto in Python (usato da Ubuntu)
darcs V:1, I:10 13424 Darcs distribuito DVCS con algebra intelligente per le patch (lento)
tla V:1, I:11 881 GNU arch distribuito DVCS principalmente di Tom Lord (storico)
monotone V:0, I:2 5150 Monotone distribuito DVCS in C++
tkcvs V:0, I:3 1400 CVS, … remoto visualizzazione GUI di alberi di archivi VCS (CVS, Subversion, RCS)
gitk V:11, I:52 1048 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.

Ci sono alcune nozioni base da ricordare per creare un accesso condiviso ad un archivio VCS.

10.6.1. Comparazione di comandi VCS

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.16. 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'albero dell'archivio VCS

[Attenzione] Attenzione

A partire dall'inizio del 2006, l'invocazione diretta, dalla riga di comando, di un sottocomando di git come "git-xyz" è diventata deprecata.

[Suggerimento] Suggerimento

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.

[Suggerimento] Suggerimento

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».

[Suggerimento] Suggerimento

Git ha comandi che non hanno equivalenti in CVS e Subversion: "fetch", "rebase", "cherry-pick", …

10.7. CVS

Vedere la documentazione seguente.

  • cvs(1)

  • "/usr/share/doc/cvs/html-cvsclient"

  • "/usr/share/doc/cvs/html-info"

  • "/usr/share/doc/cvsbook"

  • "info cvs"

10.7.1. Configurazione di archivi 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
[Suggerimento] Suggerimento

Si può limitare la creazione di nuovi progetti modificando il proprietario della directory "$CVSROOT" in "root:staff" e i suoi permessi in "3775".

10.7.2. Accesso locale al CVS

L'archivio CVS predefinito è indicato da "$CVSROOT". Il comando seguente imposta "$CVSROOT" per l'accesso locale.

$ export CVSROOT=/srv/cvs/progetto

10.7.3. Accesso remoto a CVS con pserver

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
[Nota] Nota

Dato che pserver è esposto ad attacchi di spionaggio ed è insicuro, l'accesso in scrittura è solitamente disabilitato dagli amministratori del server.

10.7.4. Accesso remoto a CVS con ssh

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.

10.7.5. Importare un nuovo sorgente in CVS

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.

  • Nome modulo: "modulo1"

  • Etichetta fornitore: "Ramo-principale" (etichetta per l'intero ramo)

  • Etichetta rilascio: "Rilascio-iniziale" (etichetta per un rilascio specifico)

$ cd ~/percorso/di/modulo1
$ cvs import -m "Inizio di modulo1" Ramo-principale Rilascio-iniziale
$ rm -Rf . # opzionale

10.7.6. Permessi dei file negli archivi CVS

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

10.7.7. Sequenza di azioni tipiche nell'uso di CVS

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
[Suggerimento] Suggerimento

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
[Suggerimento] Suggerimento

Il comando "cvs up" accetta l'opzione "-d" per creare nuove directory e l'opzione "-P" per eliminare le directory vuote.

[Suggerimento] Suggerimento

Si può fare il checkout solamente di una sottodirectory di "modulo1" fornendo il suo nome come in "cvs co modulo1/sottodir".

Tabella 10.17. 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

10.7.8. File più recenti dal CVS

Per ottenere i file più recenti dal CVS usare "tomorrow" nel modo seguente.

$ cvs ex -D tomorrow nome_modulo

10.7.9. Amministrazione del CVS

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
[Nota] Nota

Per seguire la procedura precedente sono necessari gli adeguati permessi sui file.

10.7.10. Bit di esecuzione per il checkout CVS

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

10.8. Subversion

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.

10.8.1. Configurazione di archivi Subversion

Attualmente il pacchetto subversion non imposta un archivio, perciò è necessario farlo manualmente. Una possibile collocazione per un archivio è in "/srv/svn/progetto".

Creare 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

10.8.2. Accedere a Subversion tramite il server Apache2

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/").

10.8.3. Accesso locale a Subversion da parte di un gruppo

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".

10.8.4. Accesso remoto a Subversion con SSH

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".

10.8.5. Struttura delle directory di Subversion

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
[Suggerimento] Suggerimento

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.

10.8.6. Importare un nuovo sorgente in Subversion

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.

  • Nome modulo: "modulo1"

  • URL sito Subversion: "file:///srv/svn/progetto"

  • Directory Subversion: "modulo1/trunk"

  • Etichetta Subversion: "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
[Suggerimento] Suggerimento

Si possono sostituire gli URL come "file:///…" con URL in qualsiasi altro formato, come "http://…" e "svn+ssh://…".

10.8.7. Sequenza di azioni tipiche nell'uso di Subversion

Ecco un esempio di una sequenza tipica di azioni svolte nell'uso di Subversion con il suo client nativo.

[Suggerimento] Suggerimento

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
[Suggerimento] Suggerimento

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
[Suggerimento] Suggerimento

Si possono sostituire gli URL come "file:///…" con URL in qualsiasi altro formato, come "http://…" e "svn+ssh://…".

[Suggerimento] Suggerimento

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.18. 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

10.9. Git

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.

10.9.1. Configurazione del client Git

È 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

10.9.2. Documenti di consultazione per Git

Vedere la documentazione seguente.

I comandi git-gui(1) e gitk(1) rendono l'uso di Git molto semplice.

[Avvertimento] Avvertimento

Non usare stringhe per etichette contenenti spazi, anche se alcuni strumenti come gitk(1) lo permettono. Altri comandi git potrebbero avere problemi con esse.

10.9.3. Comandi Git

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 copia 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.19. Elenco di pacchetti e comandi relativi a Git

pacchetto popcon dimensione comando descrizione
git-doc I:28 8405 N/D documentazione ufficiale per Git
gitmagic I:3 740 N/D "Git Magic", una guida per Git più semplice da capire
git V:130, I:414 13134 git(7) Git, il sistema di controllo delle revisioni veloce, scalabile e distribuito
gitk V:11, I:52 1048 gitk(1) browser degli archivi Git con interfaccia utente grafica e cronologia
git-gui V:3, I:31 1670 git-gui(1) interfaccia utente grafica per Git (senza cronologia)
git-svn V:5, I:42 689 git-svnimport(1) importa i dati da Subversion in Git
git-svn V:5, I:42 689 git-svn(1) fornisce operazioni bidirezionali tra Subversion e Git
git-cvs V:1, I:18 782 git-cvsimport(1) importa i dati da CVS in Git
git-cvs V:1, I:18 782 git-cvsexportcommit(1) esporta un commit a un checkout CVS da Git
git-cvs V:1, I:18 782 git-cvsserver(1) emulatore di server CVS per Git
git-email V:1, I:20 533 git-send-email(1) invia una raccolta di patch come messaggio di posta da Git
stgit V:0, I:7 1628 stg(1) quilt sopra a git (Python)
git-buildpackage V:2, I:12 2530 git-buildpackage(1) automatizza la creazione di pacchetti Debian con Git
guilt V:0, I:0 360 guilt(7) quilt sopra a git (SH/AWK/SED/…)

[Suggerimento] Suggerimento

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).

[Suggerimento] Suggerimento

Quando si vuole tornare ad una directory di lavoro pulita senza perdere lo stato attuale della directory di lavoro, si può usare "git stash". Vedere git-stash(1).

10.9.4. Git per repository Subversion

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
[Suggerimento] Suggerimento

L'uso di "-rHEAD" permette di evitare di dover clonare tutti i contenuti della cronologia del repository Subversion.

10.9.5. Git per registrare la cronologia della configurazione

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 avanti con la propria vita.

$ cd /etc/apt/
$ sudo gitk --all

Si avrà una completa cronologia della configurazione.

[Nota] Nota

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.

[Nota] Nota

Il comando "chmod 700 .git" nell'esempio precedente è necessario per proteggere i dati dell'archivio da accessi non autorizzati.

[Suggerimento] Suggerimento

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».