Newsgroup: it.comp.os.linux.iniziare
Titolo: creare sparse file

Salve.
Sto giocando un po' con i sparse file.
Per convertire un file normale in uno sparse, è sufficiente dare
$ cp --sparse=always origfile newfile
$ rm origfile
ora newfile ha lo stesso contenuto e ls -l mostra la stessa
dimensione, ma è di tipo sparse e così risparmio spazio su disco.
Quindi se devo creare un file sparse:
$ dd if=/dev/zero of=origfile bs=1000000 count=100
$ cp --sparse=always origfile newfile
$ rm origfile
du -sk newfile mi dice 4Kb contro i 100Mb di origfile.
Ma se le dimensioni crescono le cose diventano più complicate in
quando mi ci mette molto tempo inoltre ha poco senso.
C'è un sistema per crearlo direttamente sparse?
Matteo

 
Luca

> $ dd if=/dev/zero of=file bs=1 seek=100G count=1
Fantastico.. non ci avrei mai pensato a fare un seek al termine di un
file... inesitente.
Grazie.


Perche' sei giovane. :-)
Era il sistema classico per recuperare dati da supporti rovinati o
cancellati: scrivi un file (su file system che non supportano sparse)
ma ne scrivi solo l'EOF dando come offset tutto lo spazio disponibile
sul file system.
Poi, con calma, ti leggi il file risultante, che a quel punto contiene
tutto il disco/partizione/floppy/...
-- 
           |Save our planet!
    Ciao   |Save wildlife!
   roberto |For your E-MAIL use ONLY recycled Bytes  !!
           |roberto poggi   
rpo...@softhome.net

 sul file system.
  Ma per scrivere solo l'EOF non si deve usare anche l'opzione skip? Certo
che con /dev/zero come sorgente è inutile ma scritto così copia il BOF alla
fine del file grande.
-- 
Non pretendo che comprendiate il significato di quello che ho scritto senza
averlo riletto un certo numero di volte. Personalmente, vi riterrei degli
stupidi se lo faceste. Io l'ho letto sei volte ed ancora non l'ho capito.

 fine del file grande.
Il che sarebbe comunque ininfluente, direi, quel sistema serve a creare
un file che poi andra' riempito con accesso diretto, o nel mio caso,
per essere letto con accesso diretto, ben sapendo che qualcosa si perde.
Cosa ci sia nel primo o nell'ultimo byte non dovrebbe interessare.



mmm. sarò giovane forse (33 anni di cui 11 di linux e i precedenti di
studi informatici),
ma non riesco a capire come funziona...
vediamo...
diciamo che ho un floppy fat16 con diciamo qualche settore danneggiato
al centro.
L'output dei comandi è ad intuito (per vedere se ho capito)
# dd if=/dev/zero of=/mnt/floppy/pippo bs=1 count=1 seek=1474559
# ls -l /mnt/floppy/pippo
 1474560 pippo
# du -sk pippo
1440 pippo
# file pippo
pippo: filesystem di tipo FAT16
# cp pippo /tmp
comincia a copiare tutti i settori del floppy su disco.. e quando
arriva a quelli danneggiati? si ferma? dopo il timeout si ferma o va
avanti?
mmm... qualcosa mi dice che non ne ho azzeccata una, a partire dai
termini del problema
Ciao,
Matteo

 termini del problema
Beh, non c'eri lontanissimo.
E' che non e' semplice mettersi nell'ottica di NON avere alcuni
strumenti che oggi sono naturalmente inclusi in ogni distro.



mmm... non ho capito un granchè. Comunque ora ho un floppy a
disposizione (ho faticato un po' a trovarlo :-). Facciamo un passo
alla volta.
# mkdosfs /dev/fd0
# mount /dev/fd0 /mnt/floppy
# df
Filesystem        blocchi di   1K   Usati Disponib. Uso% Montato su
/dev/fd0                  1424         0      1424   0% /mnt/floppy
Fingiamo che abbia qualche settore danneggiato.
# dd if=/dev/zero of=/mnt/floppy/pippo bs=1 count=1 seek=1474559
dd: truncating at 1474559 bytes in output file `/mnt/floppy/pippo': No
space left on device
Matteo


Due errori:
1) Al massimo, puoi saltare 1457511 byte su un floppy msdos.
2) fat non supporta gli sparse file, e dd non accetterebbe comunque il
seek su un file system del genere.
Se il floppy lo usi con ext2 dd non si lamenta, ma il risultato non e'
quello richiesto dal recupero dati.
Oltretutto, come si diceva, dd-rescue e' un dd che non si ferma in caso
di errore I/O e serve benissimo allo scopo di recuperare il recuperabile
da un device con errori.
Lo si faceva costruendosi alcuni programmelli, di solito in c, se
esistente su quella piattaforma.
Esempio buttato giu' in pochi minuti, senza troppi controlli:
proliant:/ulocal/poggir/floppypippo# cat lseek.c
#define NULL 0
#define PMODE 0644
main(argc,argv)
int argc;
char *argv[];
{
         int f1 ,i;
         long atol(), n;
         if (argc != 3)
                 errore("Parametri: lseek nomefile numero", NULL);
         if ((f1 = creat(argv[1], PMODE)) == -1)
                 errore("Non posso creare file %s ", argv[1]);
         n = atol(argv[2]);
         lseek(f1, n, 0);
         i = write(f1, ' ', 1);
         close(f1);
         exit(0);
}
errore(s1, s2)
char *s1, *s2;
{
         printf(s1,s2);
         printf("\n");
         exit(1);
}
proliant:/ulocal/poggir/floppypippo# cc lseek.c -o lseek
proliant:/ulocal/poggir/floppypippo# mkdosfs /dev/fd0
mkdosfs 2.11 (12 Mar 2005)
proliant:/ulocal/poggir/floppypippo# mount /floppy
proliant:/ulocal/poggir/floppypippo# ls -la /floppy
total 11
drwxr-xr-x   2 root root 7168 Jan  1  1970 .
drwxr-xr-x  40 root root 4096 Apr 11  2007 ..
proliant:/ulocal/poggir/floppypippo# ./lseek /floppy/pippo 1457511
proliant:/ulocal/poggir/floppypippo# ls -la /floppy
total 1435
drwxr-xr-x   2 root root    7168 Oct 11 21:23 .
drwxr-xr-x  40 root root    4096 Apr 11  2007 ..
-rwxr-xr-x   1 root root 1457512 Oct 11 21:23 pippo
proliant:/ulocal/poggir/floppypippo# df -h /floppy/pippo
Filesystem            Size  Used Avail Use% Mounted on
/dev/fd0              1.4M  1.4M     0 100% /floppy
proliant:/ulocal/poggir/floppypippo#
PS: il programma in se' funziona, ma anche questo non fa il suo
mestiere, sotto linux. ;-)
Spostare avanti oltre la fine del file riempie di byte a zero il
file ottenuto, come sarebbe giusto aspettarsi.
Ti posso assicurare che in dos e altri sistemi strani funzionava
benissimo.


scusa... avevo capito che nel il giochetto del seek=tuttoildisco stavi
parlando di fat (infatti mi sembrava strano)
# mke2fs /dev/fd0
# mount /dev/fd0 /mnt/floppy/
# cd /mnt/floppy
# dd if=/dev/zero of=pippo bs=1 count=1 seek=1474559
1+0 records in
1+0 records out
1 byte (1 B) copied, 4,2213e-05 s, 23,7 kB/s
# ls -l
totale 15
drwx------ 2 root root   12288 12 ott 14:34 lost+found
-rw-r--r-- 1 root root 1474560 12 ott 14:39 pippo
# du -sk pippo
3       pippo
Ma ora questo file pippo, sarebbe uno sparse vuoto o visualizzando
quel file posso visualizzare il contenuto di TUTTO il floppy?
# cd /tmp/
# dd if=/dev/zero of=/tmp/prova bs=1 count=1 seek=1474559
1+0 records in
1+0 records out
1 byte (1 B) copied, 6,2583e-05 s, 16,0 kB/s
# md5sum /tmp/prova
b37823c7a90d1917f719ba5927b23da8  prova
# md5sum /mnt/floppy/pippo
b37823c7a90d1917f719ba5927b23da8  pippo
che è quello che mi aspettavo...
come lo recupero il floppy?
Ho provato il tuo lseek.c
# mke2fs /dev/fd0
# mount /dev/fd0 /mnt/floppy/
# cd /mnt/floppy/
/mnt/floppy # /tmp/lseek pippo 1474560
/mnt/floppy # ls -l pippo
-rw-r--r-- 1 root root 1474561 12 ott 14:53 pippo
/mnt/floppy # /tmp/lseek pippo 1474559
/mnt/floppy # md5sum pippo
b37823c7a90d1917f719ba5927b23da8  pippo
/mnt/floppy # du -sk pippo
3       pippo
Matteo

 # mke2fs /dev/fd0
Ehi, non vale, su ext2 lo "sparsa". :-)
Se lo fai su fat, anche il df ti dara' l'occupazione totale del
floppy.


bah,
sono troppe le cose che non ho chiaro.
Magari riprendo quando ho un po' più di tempo.
Per ora, almeno, ho imparato a fare uno sparse file, e tanto basta
(per adesso)
Matteo