[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico] [home] [volume] [parte]


Capitolo 198.   Libreria per la conservazione dei dati cancellati

I sistemi operativi commerciali, rivolti al pubblico generale, offrono solitamente la possibilità di ripescare i dati cancellati, in quanto questi finiscono di norma all'interno di un «cestino». Nei sistemi Unix sono i programmi usati nel sistema grafico che, in qualche modo, forniscono questo tipo di funzionalità, ma sempre in modo scoordinato, nel senso che programmi diversi potrebbero usare cestini differenti.

Volendo realizzare un cestino generalizzato dei dati cancellati in un sistema Unix, utilizzato da tutti i programmi nello stesso modo, occorre che le librerie standard siano ritoccate appositamente per tale scopo, in modo che le funzioni volte alla cancellazione di un file, invece di farlo realmente accantonino il file in una directory convenuta per questo scopo.

Nei sistemi GNU/Linux sono esistiti ed esistono lavori di questo tipo, utilizzando un meccanismo di sovrapposizione alle librerie standard, attraverso l'uso della variabile di ambiente LD_PRELOAD, con la quale si informano i programmi di utilizzare prima una certa libreria e poi quelle comuni.

In questo capitolo viene descritto un procedimento per utilizzare la libreria Libdelsafe, del pacchetto Delsafe. Va osservato però che una qualunque libreria del genere, intervenendo sul controllo di funzioni delicate del sistema operativo, deve fare preoccupare un po' di più l'amministratore del sistema.

198.1   Variabile di ambiente «LD_PRELOAD»

Un programma che fa uso di librerie dinamiche, quando all'interno della variabile di ambiente LD_PRELOAD trova l'indicazione di un percorso, tenta di caricare il file indicato in qualità di libreria, usando le sue funzioni con precedenza rispetto alle altre librerie per le quali è predisposto. Per esempio, se la variabile di ambiente LD_PRELOAD contiene la stringa /lib/lib-mia.so, la libreria costituita dal file /lib/lib-mia.so viene caricata e usata prima di altre librerie eventuali.

La variabile di ambiente LD_PRELOAD può contenere un elenco di librerie che, in tal caso, sono separate dai due punti verticali «:», come per esempio: /lib/lib-mia.so:/lib/lib-tua.so:/lib/lib-sua.so.

Per fare in modo che gli utenti si trovino a operare con un certo insieme di variabili di ambiente, di norma si impostano tali valori utilizzando il file /etc/profile o qualunque altra cosa sia riconosciuta dalla shell, testuale o grafica che sia.

In presenza di una certa configurazione delle variabili di ambiente, si può avviare un programma con una configurazione differente, anteponendo al comando di avvio la nuova configurazione per le variabili. Per esempio, per far sì che un certo programma veda la variabile LD_PRELOAD vuota, basta un comando come quello seguente:

LD_PRELOAD="" comando[Invio]

198.2   Delsafe

Il pacchetto Delsafe,(1) composto dalla libreria Libdelsafe e da alcuni programmi di contorno, consente di organizzare in un sistema GNU/Linux dei «cestini», uno per ogni unità di memorizzazione per la quale ci si voglia proteggere dalle cancellazioni accidentali di file.

In pratica, la libreria Libdelsafe viene fatta caricare preventivamente ai programmi attraverso la variabile di ambiente LD_PRELOAD. Quando un programma tenta di cancellare un file, facendo uso delle funzioni comuni destinate a tale scopo, la libreria verifica se per quell'unità di memorizzazione è presente la directory destinata a fare da cestino e se al suo interno c'è una sottodirectory con il nome dell'utente per conto del quale quel programma sta operando. Se è così, invece di cancellare il file, lo rinomina, trasferendolo all'interno di tale gerarchia, aggiungendo un'estensione che consente di risalire al momento della cancellazione formale.

I programmi di contorno che fanno parte del pacchetto Delsafe, servono principalmente a predisporre le directory da usare come cestini e a ripulire queste dai dati più vecchi, quando la mancanza di spazio lo richiede.

Il pacchetto Delsafe prevede l'uso di un file di configurazione, costituito normalmente da /etc/delsafe.conf, il quale ha lo scopo principale di informare i programmi di contorno sulla collocazione delle directory usate come cestini e sulle modalità di ripulitura delle stesse. La libreria, invece, non interpella il file di configurazione e, per adattarla alle esigenze del proprio contesto, va compilata fornendo le opzioni appropriate.

Va osservato che del pacchetto Delsafe, solo la libreria Libdelsafe è indispensabile, perché gli altri programmi non svolgono compiti tanto sofisticati e un amministratore farebbe bene ad avere un controllo maggiore di tale gestione.

L'interposizione della libreria Libdelsafe a mediare le operazioni di cancellazione dei file, costituisce un elemento delicato nell'amministrazione del sistema, essendo giustificabile solo in un contesto dove la possibilità di recupero dei dati cancellati è molto importante. Tuttavia, per questa gestione deve essere coinvolto un amministratore competente e consapevole, il quale deve avere il massimo controllo su tale questione. Pertanto, di fronte al rischio che un uso errato dei programmi di contorno di Delsafe possa procurare dei danni inaspettati, è molto meglio predisporre manualmente le directory dei cestini e i propri script ritenuti appropriati alle necessità.

198.3   Preparazione di Libdelsafe

Sulla base delle considerazioni fatte nella sezione precedente, qui viene proposta la procedura per compilare e utilizzare la libreria Libdelsafe da sola. Si fa riferimento all'edizione 0.4.0 del pacchetto Delsafe che la contiene, distribuito in un solo file denominato delsafe-0.4.0.bin, il quale è uno script che incorpora un archivio compresso da estrarre. Una volta scaricato questo file, avendolo collocato in una directory appropriata, si procede all'estrazione del suo contenuto:

chmod +x delsafe-0.4.0.bin[Invio]

./delsafe-0.4.0.bin[Invio]

Lo script che avviluppa il pacchetto estrae i dati nella directory delsafe-0.4.0/ e poi mostra la documentazione del pacchetto che viene fatta scorrere con l'ausilio di un programma come more o less. Concludendo il funzionamento del programma usato per scorrere la documentazione, lo script si appresta a fare una serie di domande per configurare la libreria e i programmi prima della compilazione. Qui si suggerisce di interrompere lo script e di procedere manualmente:

q

Trash name - .Trash? [Ctrl c]

Nella directory delsafe-0.4.0/ si trova il file libdelsafe.c che può andare bene così, oppure si potrebbe ritoccare per le proprie esigenze.

cd delsafe-0.4.0[Invio]

Ciò che potrebbe essere modificato, eventualmente dopo che si ha guadagnato un po' di esperienza nell'uso di tale libreria, è quanto appare nel listato seguente, dove le voci modificabili sono evidenziate:

...
  /*** BEGIN OF DEFAULT STATIC OPTIONS (from config at install time) */
  char *d_mtab="/etc/mtab";
#if defined DEBUG
  char *d_trash_rootname=".Lixo";
#else
  char *d_trash_rootname=".Trash";
#endif
  char *d_exclude_heads[]={
    "/tmp/",
    "/proc/",
    "/dev/",
    "/sys/",
    "/var/",
    "/root/.xauth",
    "/root/.Xauthority",
    "/root/.DCOPserver",
    "/root/.ICEauthority",
    "/root/.xauth",
    ""
  };
  char *d_exclude_tails[]={
    "~",
    ".o",
    ""
  };
  char *d_exclude_files[]={
    "/etc/mtab",
    ""
  };
  char *d_exclude_patts[]={
    "^/home/.+/\\.kde",
    "^/home/.+/\\.Xauthority.*",
    "^/home/.+/\\.DCOPserver.+",
    "^/home/.+/\\.ICEauthority.*",
    "^/home/.+/\\.fonts\\.cache.*",
    "^/home/.+/\\.serverauth.*",
    "^/home/.+/\\.beagle/.*",
    ""
  };
  int   d_error_action=LEAVE;
  int   d_xdev_action=FORCE;
  /*** END OF DEFAULT STATIC OPTIONS (from config at install time) */
...

Secondo le intenzioni dell'autore, le voci che qui sono state evidenziate, sono da definire attraverso il file di configurazione, il quale viene usato per modificare automaticamente il file libdelsafe.c, prima della compilazione. Nel metodo proposto per procedere alla compilazione, questa modifica automatica non avviene.

Una volta modificato il file libdelsafe.c, ammesso che lo si voglia modificare effettivamente, per la compilazione si deve entrare nella directory Relise/ e da lì eseguire i comandi necessari.

pwd[Invio]

.../delsafe-0-4-0

cd Relise[Invio]

make -f makefile clean[Invio]

make -f makefile[Invio]

A questo punto, nella stessa directory Relise/ si deve trovare il file libdelsafe-0.4.0.so che costituisce la libreria compilata.

Dopo la compilazione, la libreria va collocata in una posizione appropriata e, di conseguenza, bisogna provvedere a configurare la variabile di ambiente LD_PRELOAD in modo che sia utilizzata. Si può supporre che il file libdelsafe-0.4.0.so sia collocato nella directory /lib/ e, di conseguenza, nel file /etc/profile potrebbe apparire una coppia di istruzioni come quella seguente:

...
LD_PRELOAD="/lib/libdelsafe-0.4.0.so"
export LD_PRELOAD
...

A questo punto, i programmi che incontrano la variabile di ambiente LD_PRELOAD con il contenuto ipotizzato sopra, utilizzano sempre la libreria Libdelsafe prima di altre, ma la libreria non è efficace se non trova le directory da usare come cestino.

198.4   Predisposizione dei cestini

La libreria Libdelsafe è sostanzialmente inerte se non trova le directory destinate alla conservazione dei file che formalmente vengono rimossi. In condizioni normali, si tratta delle directory .Trash/ collocate all'inizio delle gerarchie delle unità di memorizzazione in cui si vuole prevenire la cancellazione. Per esempio, se ci si vuole salvaguardare dalla cancellazione dei dati contenuti nel file system innestato a partire da /home/, occorre ci sia la directory /home/.Trash/; nello stesso modo, se ci si vuole salvaguardare per il file system principale, occorre la directory /.Trash/.

Il nome di questa directory è definito nella libreria e può essere modificato. Per la precisione si tratta dell'istruzione seguente, già vista in precedenza:

...
  char *d_trash_rootname=".Trash";
...

Tuttavia, le directory .Trash/, da sole, non bastano: occorre che ogni utente, per il quale si vuole garantire la possibilità di recuperare i file cancellati, sia presente una sottodirectory con il nome dell'utenza stessa. Per esempio, se si vuole che l'utente tizio possa recuperare i propri file cancellati, occorre che sia presente la directory .Trash/tizio/. Naturalmente, le sottodirectory degli utenti devono appartenere agli utenti relativi e devono avere i permessi 07008, in modo da impedire a tutti gli altri di accedervi.

Se si vuole che anche l'utente root possa recuperare i dati che cancella, occorre che sia predisposta la directory .Trash/root/, secondo le stesse modalità già descritte. Tuttavia, sarebbe auspicabile che per tale utente questa misura non fosse necessaria.

La libreria Libdelsafe, quando trova la directory corretta per la conservazione dei file cancellati, ricrea, a partire dalla stessa, il percorso del file cancellato, usando per il file un nome con un'estensione costituita dalla data e dall'ora della cancellazione. Nel caso un utente fosse interessato al recupero di un certo file, non dovrebbe fare altro che spostarlo, cambiandogli nome nel modo più appropriato.

198.5   Script ausiliari a Libdelsafe

Il pacchetto Delsafe, oltre alla libreria Libdelsafe, fornisce dei programmi che possono facilitare il recupero dei file cancellati e consentono di tenere sotto controllo lo spazio utilizzato, eliminando periodicamente ciò che diventa troppo vecchio. Questi programmi non sono indispensabili e si può provvedere autonomamente alla scrittura dei propri script.

Per prima cosa è necessario fornire un modo agli utenti per eseguire dei programmi senza l'ausilio della libreria Libdelsafe. Per ottenere tale risultato è sufficiente fornire a questi programmi la variabile di ambiente vuota, tuttavia si può predisporre un piccolo script:

#!/bin/sh

TRASH=OFF LD_PRELOAD="" "$@"

Per fare in modo che le directory contenenti i cestini vengano ripulite periodicamente, si può predisporre uno script come quello seguente, da avviare giornalmente attraverso Cron (di norma è sufficiente collocarlo materialmente nella directory /etc/cron.daily). In questo caso i file più vecchi di una settimana vengono eliminati, assieme a eventuali directory vuote:

#!/bin/sh

for TRASH in /home/.Trash/*     # Modificare in base alla collocazione effettiva.
do
    find $TRASH -mtime +7 -and -ctime +7 -and \( -not -type d \) -exec rm \{\} \;
    find $TRASH -type d -exec rmdir --ignore-fail-on-non-empty \{\} \;
done

198.6   E2undel

E2undel(2) è un pacchetto, composto da un programma e da una libreria, per il recupero dei file cancellati da un file system Ext2. La libreria, in particolare, nota con il nome Libundel, viene fatta utilizzare ai programmi attraverso il meccanismo della variabile di ambiente LD_PRELOAD (esattamente come per Libdelsafe), con la differenza che non accantona i file cancellati formalmente, ma annota in un diario la loro collocazione originale per facilitarne poi il recupero.

Tuttavia, il pacchetto E2undel si basa sulle caratteristiche del file system Ext2, per cui il numero inode di un file cancellato mantiene i riferimenti ai blocchi di dati che costituivano il file; pertanto, la libreria Libundel annota nel proprio diario il numero inode originale. Purtroppo, in un file system Ext3 questo meccanismo diventa privo di utilità, perché il numero inode di un file cancellato perde il riferimento ai blocchi di dati originali.

198.7   Riferimenti


1) Delsafe   GNU GPL

2) E2undel   GNU GPL


Appunti di informatica libera 2008 --- Copyright © 2000-2008 Daniele Giacomini -- <appunti2 (ad) gmail·com>


Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome libreria_per_la_conservazione_dei_dati_cancellati.htm

[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico] [home]

Valid ISO-HTML!

CSS validator!

Gjlg Metamotore e Web Directory