J'ai un tas d'images de disque, faites avec ddrescue, sur une partition EXT, et je veux réduire leur taille sans perdre de données, tout en étant montable.
Comment puis-je remplir l'espace vide du système de fichiers de l'image avec des zéros, puis convertir le fichier en fichier clairsemé afin que cet espace vide ne soit pas réellement stocké sur le disque?
Par exemple:
> du -s --si --apparent-size Jimage.image
120G Jimage.image
> du -s --si Jimage.image
121G Jimage.image
Cela n'a en fait que 50 G de données réelles, donc la deuxième mesure devrait être beaucoup plus petite.
Cela remplira censément l'espace vide avec des zéros:
cat /dev/zero > zero.file
rm zero.file
Mais si les fichiers clairsemés sont traités de manière transparente , cela peut en fait créer un fichier clairsemé sans écrire quoi que ce soit sur le disque virtuel, ce qui m'empêche ironiquement de transformer l'image de disque virtuel en un fichier clairsemé lui-même. :) Est-ce que c'est?
Remarque: Pour une raison quelconque, sudo dd if=/dev/zero of=./zero.file
fonctionne lorsque cat
ne se trouve pas sur une image disque montée.
la source
sudo cat /dev/zero > zero.file
ne fonctionne pas car votre bash (qui s'exécute comme vous, pas root) fait la redirection avant d'exécuter lasudo
commande. Voir unix.stackexchange.com/questions/1416/…Réponses:
Tout d'abord, les fichiers épars ne sont traités de manière transparente que si vous recherchez, pas si vous écrivez des zéros.
Pour être plus clair, l'exemple de Wikipedia
n'écrit pas de zéros, il ouvrira le fichier de sortie, recherchera (sautera) 5 Mo, puis écrira zéro zéros (c'est-à-dire rien du tout). Cette commande ( pas de Wikipedia)
écrira 5 Mo de zéros et ne créera pas de fichier clairsemé!
Par conséquent, un fichier qui n'est pas déjà clairsemé ne deviendra pas par magie clairsemé plus tard.
En second lieu , pour créer un fichier avec beaucoup de zéros rares, vous devez cp il
ou vous pouvez également utiliser l' option --sparse de tar ou rsync .
la source
cat /dev/zero > zero.file
c'est parfaitement OK pour remplir un espace vide avec des zéros?dd
pour écrire des zéros ou pour rechercher.cat
commande remplira l'intégralité de votre disque (ou au moins la quantité non réservée à la racine ou par quotas) avec de "vrais" zéros, et ne créera pas de fichiers épars.La façon la plus simple de réduire un fichier en place serait peut-être d'utiliser l'
fallocate
utilitaire comme suit:fallocate (1) est fourni par le paquet util-linux sur Debian .
la source
fallocate --dig-holes
fichier 103GiB a été créé à partir de l'original 299GiB, tout encp --sparse=always
me donnant 93GiB - tous avec la même somme SHA1 (tailles vérifiées viadu -B1G
vsdu --apparent-size -B1G
). Donc ,fallocate
semble donner des résultats inférieurs.Modification de ma réponse pour l'exhaustivité:
losetup --partscan --find --show disk.img
Supposons qu'il donne / dev / loop1 comme disque et qu'il n'y ait qu'une seule partition, sinon nous devons répéter cela pour chaque partition avec FS montable (ignorer la partition de swap, etc.).
mkdir -p /mnt/tmp mount /dev/loop1p1 /mnt/tmp dd if=/dev/zero of=/mnt/tmp/tempfile
Laissez-le finir à l'échec avec ENOSPC.
/bin/rm -f /mnt/tmp/tempfile umount /mnt/tmp losetup -d /dev/loop1
'dd' a une option pour convertir un fichier avec des zéros en un fichier clairsemé:
dd if=disk.img of=disk-sparse.img conv=sparse
la source
zerofree
peut être plus rapide que de monter et d'écrire des zéros sur le système de fichiers, et de réduire l'image disque si elle contient déjà beaucoup de zéros.Voulez-vous dire que votre image créée par ddrescue est, disons, de 50 Go et en réalité quelque chose de bien moins suffirait?
Si tel est le cas, ne pourriez-vous pas tout d'abord créer une nouvelle image avec dd:
puis créez-y un système de fichiers:
puis montez simplement l'image et copiez tout de l'ancienne image à la nouvelle? Cela marcherait-il pour toi?
la source
PartImage peut créer des images de disque qui stockent uniquement les blocs utilisés d'un système de fichiers, réduisant ainsi considérablement l'espace requis en ignorant les blocs inutilisés. Je ne pense pas que vous puissiez monter directement les images résultantes, mais en allant:
Devrait produire ce que vous voulez (peut-être même possible de coller la dernière étape, je n'ai pas essayé).
la source
Il existe maintenant un outil appelé virt-sparsify qui fera cela. Il remplit l'espace vide avec des zéros, puis copie l'image dans un fichier clairsemé. Cela nécessite cependant l'installation de nombreuses dépendances.
la source
Je suppose que vous aurez besoin d'un programme personnalisé écrit dans cette spécification si c'est vraiment ce que vous voulez faire. Mais est-ce ...?
Si vous avez réellement beaucoup de zones entièrement nulles, tout bon outil de compression le réduira considérablement. Et essayer d'écrire des fichiers clairsemés ne fonctionnera pas dans tous les cas. Si je me souviens bien, même les fichiers clairsemés occupent au moins 1 bloc de stockage de sortie où le bloc d'entrée contient TOUT bit différent de zéro. Par exemple - disons que vous aviez un fichier qui avait en moyenne même 1 bit non nul par bloc de 512 octets - il ne peut pas être écrit "avec parcimonie". Au fait, vous n'allez pas perdre de données si vous compressez le fichier avec zip, bzip, bzip2 ou p7zip. Ils ne sont pas comme la compression mpeg ou jpeg qui est avec perte.
D'un autre côté, si vous devez effectuer des lectures aléatoires dans le fichier, la compression peut être plus problématique que cela en vaut la peine et vous revenez à l'écriture clairsemée. Un programmeur C ou C ++ compétent devrait être capable d'écrire quelque chose comme ça en une heure ou moins.
la source
cp --sparse=always
fonctionne bien