Effacer l'espace inutilisé avec des zéros (btrfs)

10

Comment effacer l'espace inutilisé avec des zéros? (Je demande un outil pour le système de fichiers btrfs )

Je cherche quelque chose de plus intelligent que

cat /dev/zero > /mnt/X/big_zero ; sync; rm /mnt/X/big_zero

Comme FSArchiver recherche "l'espace utilisé" et ignore le site inutilisé mais opposé.

Objectif: je voudrais compresser les images de partition, il est donc fortement recommandé de remplir l'espace inutilisé avec des zéros.

Btw. Pour ext3, ext4: effacez l'espace inutilisé avec des zéros (ext3, ext4) . Ici je demande des btrfs

Clarification de "l'algorithme plus intelligent": Comme je vois que "l'algorithme plus intelligent" prête à confusion, j'ai finalement décidé d'ajouter une ligne à ce sujet. Cher lecteur, veuillez considérer le système de fichiers comme une infrastructure de données. À des fins de simplification, imaginons une carte contenant un arbre rouge-noir à équilibrage automatique, qui est utilisée comme clé d'association -> tableau de valeurs, où les valeurs sont des entiers. L'objectif est d'effacer toutes les valeurs négatives avec des zéros. Un algorithme "pas intelligent" va itérer dessus et ajouter des paires clé: valeur à la nouvelle carte (avec éventuellement une modification négative à zéro). L'algorithme intelligent détectera simplement les endroits où les valeurs négatives sont stockées et les effacera sur place .

Grzegorz Wierzowiecki
la source
2
Avez-vous essayé la sfillsuggestion ? Il semble qu'il ne nécessite pas d'extX.
Kevin
1. Je sais que vous pouvez remplir des fichiers existants avec des zéros avec shred, mais ce n'est probablement pas le cas, non? 2.Comment faites-vous ces images? Vous pouvez peut-être faire la troncature là-bas?
Zlatko
@kevin: c'est pourquoi j'ai posté la réponse sfill dans la question d'origine. J'utilise rarement les systèmes de fichiers ext2,3,4 moi-même, donc je trouve que les utilitaires qui fonctionnent uniquement sur ext * sont inutiles.
ČAS
J'ai besoin de quelque chose de "intelligent". Quelque chose qui remplit uniquement l'espace vide avec des zéros sans toucher à d' autres endroits - je veux dire sans affecter les structures de données internes, comme les B-Trees (si vous êtes curieux, j'ai écrit en question "compression" mais j'en ai aussi besoin à d'autres fins, comme la déduplication d'images fs, l'analyse et la recherche)
Grzegorz Wierzowiecki
il suffit d'utiliser truncateet / oufallocate
mikeserv

Réponses:

4

Voici une nouvelle version modifiée et bien plus étendue de ma réponse à votre question précédente:

sfilldu secure-deletepaquet peut faire ce que vous voulez.

Contrairement à zerofree (qui ne fonctionne qu'avec les systèmes de fichiers ext2, ext3 et ext4), sfill fonctionnera avec n'importe quel système de fichiers.

par exemple

sfill -l -l -z /mnt/X

La page d'accueil sfill / secure-delete semble maintenant avoir disparu, mais elle est empaquetée pour debian et ubuntu. probablement d'autres distributions aussi. si vous avez besoin de code source, celui-ci peut être trouvé dans les archives debian si vous ne le trouvez nulle part ailleurs.

REMARQUE: sfill ne fonctionne que sur un système de fichiers monté. Si vous remplissez à zéro les fichiers d'image à partir du système hôte plutôt qu'à partir d'une machine virtuelle, vous devrez monter l'image fs sur l'hôte. La méthode exacte varie en fonction du type de fichier image dont il s'agit (par exemple qcow2 ou raw).

Le montage d'images «brutes» est simple et direct. Utilisez simplement kpartxle fichier image pour créer un périphérique de bouclage et / dev / mapper / entrées pour chaque partition peut ensuite être monté individuellement.

voici un script partiel modifié à partir d'un fragment du script que j'utilise pour monter des images de disques durs libérés net-bootable (utilisé pour les mises à jour du bios sur les machines où flashrom ne fonctionne pas):

image="myrawimagefile.img"

# use kpartx to build /dev/mapper device nodes
KP=$(kpartx -a -v "$image")

# now mount each partition under ./hd/
for p in $(echo "$KP" | awk '/^add map/ {print $3}') ; do
  dm="/dev/mapper/$p"
  fp=$(echo "$p" | sed -r -e 's/^loop[0-9]+//')
  mkdir -p "./hd/$fp"
  mount "$dm" "./hd/$fp"
  sfill -l -l -v "./hd/$fp"
  umount "$dm"
done

# now remove the loopback device and /dev/mapper entries
kpartx -d "$image"

REMARQUE: cela suppose que chaque partition de l'image est montable. vrai dans mon cas d'utilisation (une image hd de freedos avec une partition). pas vrai si l'une des partitions est, disons, swap space. Détecter de telles partitions et utiliser dd pour mettre à zéro la partition de swap reste un exercice pour le lecteur :)

Cette méthode, ou une variante de celle-ci, devrait également fonctionner pour les volumes LVM.

Si vos images sont qcow, vous pouvez utiliser l' qemu-nbdoutil du qemu-utilspackage, qui présentera le fichier image et ses partitions en tant que périphériques de bloc réseau - par exemple / dev / nbd0 / dev / ndb0p1 - qui peut être utilisé de la même manière que le / périphériques dev / mapper ci-dessus.

Il est peut-être plus facile et moins compliqué (mais plus long) d'utiliser qemu-imgpour convertir de qcow en raw, utilisez la méthode pour raw ci-dessus, puis reconvertissez l'image brute modifiée en qcow2 compressé. Cela entraînera probablement des images légèrement plus petites que l'utilisation de qemu-nbd car vous compresserez la nouvelle image qcow2 lors de sa création.

cas
la source
1
Ce que je veux dire, c'est que ce n'est pas considéré comme un moyen "intelligent" de remplir l'espace inutilisé avec des zéros. C'est la manière la plus évidente et typique de le faire. Je ne demande pas des choses comme ça.
Grzegorz Wierzowiecki
1
Veuillez décrire un algorithme "intelligent" qui n'est pas spécifique à une famille de systèmes de fichiers particulière (comme zerofill pour ext2 / 3/4). Vous vouliez un programme qui pourrait faire le travail. Vous n'avez pas dit que cela devait aussi être magique.
cas
1
et, vraiment, si le système de fichiers n'est pas utilisé (parce que, par exemple, il est monté sur l'hôte pour le remplissage à zéro), quelle importance a l'algorithme? Parcourir les métadonnées fs à la recherche de secteurs vides ne sera pas plus rapide ni meilleur que d'écrire un énorme remplissage plein de NULs ... le système de fichiers lui-même est déjà suffisamment intelligent pour déterminer où se trouve l'espace vide.
cas
2
D'une part, pour vos besoins, cela suffit - donc ma question contient déjà un extrait de code avec cette solution - donc votre réponse ne fournit rien de nouveau. D'un autre côté, mes besoins nécessitent ce que je spécifie, car je veux effacer l'espace inutilisé avec des zéros sans modifier les structures internes (par exemple rééquilibrer "Dancing B-Trees" ou tout autre type de structure de données (par exemple pour les analyses et la déduplication) fins)
Grzegorz Wierzowiecki
2
@cas - Je pense que vous manquez le fait que le remplissage à zéro est une étape essentielle avant de compacter des disques durs virtuels dans des VM. Si vous disposez d'un disque extensible de 500 Go, avec 10 Go de fichiers et 10 Go d'espace "vide" (c'est-à-dire des fichiers supprimés), l'exécution de l'approche naïve du "fichier zéro géant" prendra beaucoup plus de temps et nécessitera que le VHD gonfle jusqu'à les 500 Go. Je parierais que l'OP suppose que l'utilitaire doit également être spécifique à FS.
Fake Name
3

La façon correcte et "intelligente" de vider l'espace libre consiste à utiliser:

fstrim /mountpoint

Utilisez-le sur un système de fichiers monté.

Il est important de noter qu'il n'y a aucun avantage de sécurité à cela. Si vous souhaitez effacer votre disque pour des raisons de sécurité, sauvegardez vos fichiers, mettez à zéro le disque entier avec une commande comme "déchiqueter" puis restaurez vos fichiers.

Cependant, la solution fonctionne correctement si votre disque est une provision allégée sur un système de fichiers clairsemé et que vous souhaitez récupérer l'espace inutilisé.

DustWolf
la source