Prima di tutto, i file sparsi vengono gestiti in modo trasparente solo se cerchi, non se scrivi zeri.
Per renderlo più chiaro, l'esempio da Wikipedia
dd if=/dev/zero of=sparse-file bs=1k count=0 seek=5120
non scrivi qualsiasi zero, aprirà il file di output, cercherà (salta oltre) 5 MB e poi scriverà zero zeri (cioè niente). Questo comando (not da Wikipedia)
dd if=/dev/zero of=sparse-file bs=1k count=5120
scriverà 5 MB di zeri e non creerà un file sparse!
Di conseguenza, un file che è già non sparso non diventerà magicamente sparso in seguito.
Secondo, per creare un file con molti zeri sparsi, devi copiarlo
cp --sparse=always original sparsefile
oppure puoi usare anche l'opzione --sparse di tar o rsync.
Forse il modo più semplice per sparsificare un file sul posto sarebbe usare fallocate
utilità come segue:
fallocate -v --dig-holes {file_name}
fallocate(1) è fornito dal pacchetto util-linux su Debian.
Modifica della mia risposta per completezza:
- Blocca lo spazio FS vuoto con zeri (ATTENZIONE:questo cambia l'immagine del tuo disco):
losetup --partscan --find --show disk.img
Supponiamo che dia /dev/loop1 come disco e che ci sia solo una partizione, altrimenti dobbiamo ripeterlo per ogni partizione con FS montabile al suo interno (ignora la partizione di swap ecc.).
mkdir -p /mnt/tmp
mount /dev/loop1p1 /mnt/tmp
dd if=/dev/zero of=/mnt/tmp/tempfile
Fallo finire con ENOSPC.
/bin/rm -f /mnt/tmp/tempfile
umount /mnt/tmp
losetup -d /dev/loop1
- Copia in un'immagine sparsa:
'dd' ha un'opzione per convertire un file con zeri in un file sparse:
dd if=disk.img of=disk-sparse.img conv=sparse