Effacer l'espace inutilisé avec des zéros (ext3, ext4)


73

Comment effacer l'espace inutilisé avec des zéros? (ext3, ext4)

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: J'aimerais compresser les images de partition. Il est donc vivement recommandé de remplir de zéros les espaces inutilisés.

Btw. Pour btrfs: effacez l' espace inutilisé avec des zéros (btrfs)



1
Deux types de réponses sont possibles. Qu'essayez-vous de réaliser? Soit 1) la sécurité, en interdisant à quelqu'un de lire ces données, ou 2) l' optimisation de la compression de la partition entière ou de [performances du disque SSD] ( en.wikipedia.org/wiki/Trim_(computing) ?
Totor

Réponses:


77

Un tel utilitaire est zerofree.

De sa description:

Zerofree trouve les blocs non alloués et non mis à zéro dans un système de fichiers ext2 ou ext3 et les remplit de zéros. Ceci est utile si le périphérique sur lequel réside ce système de fichiers est une image disque. Dans ce cas, en fonction du type d'image disque, un utilitaire secondaire peut éventuellement réduire la taille de l'image disque après l'exécution de zerofree. Zerofree exige que le système de fichiers soit démonté ou monté en lecture seule.

La méthode habituelle pour obtenir le même résultat (réinitialisation des blocs inutilisés) consiste à exécuter "dd". Créez un fichier contenant des zéros occupant tout l'espace disponible sur le lecteur, puis supprimez ce fichier. Cela présente de nombreux inconvénients, que zerofree atténue:

  • c'est lent
  • cela fait que l'image disque (temporairement) grandit au maximum
  • il (temporairement) utilise tout l'espace disponible sur le disque, ainsi d'autres actions d'écriture simultanées peuvent échouer.

Zerofree a été écrit pour être exécuté à partir de systèmes GNU / Linux installés en tant que systèmes d'exploitation invités dans une machine virtuelle. Si ce n'est pas votre cas, vous n'avez presque certainement pas besoin de ce paquet.

MISE À JOUR # 1

La description du paquet .deb contient maintenant le paragraphe suivant, ce qui implique que cela fonctionnera également avec ext4.

Description: zéro bloc libre des systèmes de fichiers ext2, ext3 et ext4 Zerofree trouve les blocs non alloués avec un contenu de valeur non nulle dans un système de fichiers ext2, ext3 ou ext4 et les remplit de zéros ...

Autres utilisations

Une autre application de cet utilitaire consiste à compresser des images de disque qui sont une sauvegarde d’un disque réel. Un exemple typique de ceci est le vidage de la carte SD dans un BeagleBone ou un Raspberry Pi. Une fois que les espaces vides ont été mis à zéro, les images de sauvegarde peuvent être compressées plus efficacement.


1
Est-ce la page officielle de l'outil intgat.tigress.co.uk/rmy/uml/index.html ? Pensez-vous que l'utilisation avec ext4 est sans danger?
Grzegorz Wierzowiecki

2
@GrzegorzWierzowiecki: oui, c'est la page, mais pour debian et ses amis, elle est déjà dans le dépôt. J'ai utilisé sur une partition ext4 d'un disque virtuel pour réduire successivement l'image du fichier de disque, et je n'ai rencontré aucun problème.
enzotib

1
Ce n'est pas équivalent à la ddméthode brute de la question d'origine, car cela ne fonctionne pas sur les systèmes de fichiers montés.
Jlh

zerofree page parle d'un correctif qui vous permet de faire "le système de fichiers est monté avec l'option zerofree" afin qu'il supprime toujours les fichiers supprimés en permanence. cela nécessite-t-il alors la recompilation du noyau? Y a-t-il un moyen plus facile d'accomplir la même chose?
endolith

2
Attention, j'ai perdu le système de fichiers ext4 avec zerofreeAstralinux (basé sur Debian)…
Hubbitus

33

Résumé des méthodes (mentionnées dans cette question et ailleurs) pour effacer l'espace inutilisé sur ext2 / ext3 / ext4:

Réduction de l'espace inutilisé

Le système de fichiers n'est pas monté

  • Si le "disque" sur lequel votre système de fichiers est allumé est à allocation dynamique (par exemple, un disque SSD moderne prenant en charge TRIM, un fichier de machine virtuelle dont le format prend en charge la dispersion, etc.) et que votre noyau indique que le périphérique bloc le comprend, vous pouvez utiliser e2fsck -E discard src_fspour supprimer l'espace inutilisé (requiert e2fsprogs 1.42.2 ou supérieur).
  • Utiliser zerofree (par exemple zerofree src_fs) pour écrire explicitement des zéros sur des blocs inutilisés.
  • Utiliser e2image -rap src_fs dest_fspour ne copier que les blocs en cours d'utilisation (le nouveau système de fichiers doit se trouver sur un "disque" sinon mis à zéro, nécessite e2fsprogs 1.42.9 ou supérieur).

Le système de fichiers est monté

  • Si le "disque" sur lequel votre système de fichiers est allumé est provisionné fin (par exemple, un disque SSD moderne prenant en charge TRIM, un fichier de machine virtuelle dont le format prend en charge la dispersion, etc.), votre noyau indique que le périphérique bloc le comprend et que le pilote de système de fichiers ext le prend en charge, vous pouvez l'utiliser. fstrim /mnt/fs/demander au système de fichiers de supprimer l'espace inutilisé.
  • Using cat /dev/zero > /mnt/fs/zeros; sync; rm /mnt/fs/zeros( sfillfrom secure-delete utilise cette technique). Cette méthode est inefficace, elle n'est pas recommandée par Ted Ts'o (auteur d'ext4), peut ne pas mettre à zéro certaines choses et peut ralentir les futurs fscks.

Avoir le système de fichiers démonté donnera de meilleurs résultats que de l'avoir monté. L'élimination a tendance à être la méthode la plus rapide lorsqu'un grand nombre d'espace précédemment utilisé doit être mis à zéro, mais l'utilisation zerofreeaprès le processus d'élimination peut parfois être légèrement supérieure à zéro (en fonction de la manière dont l'élimination est mise en œuvre sur le "disque").

Rendre le fichier image plus petit

L'image est dans un format de VM dédié

Vous devrez utiliser un outil d'image disque approprié (tel que qemu-img convert src_image dst_image) pour permettre de récupérer l'espace mis à zéro et pour permettre au fichier représentant l'image de devenir plus petit.

L'image est un fichier brut

Une des techniques suivantes peut être utilisée pour rendre le fichier fragmenté (les exécutions de zéro cessent donc de prendre de la place):

  • cp --sparse=always src_image dst_image.
  • fallocate -d src_image (nécessite util-linux v2.25 ou supérieur).

De nos jours, il pourrait être plus facile d'utiliser un outil tel que virt-sparsify pour effectuer ces étapes et plus encore en une fois.

 Sources


15

sfillde -suppression sécurisée peut faire et plusieurs autres emplois connexes.

par exemple

sfill -l -l -z /mnt/X

MISE À JOUR # 1

Il existe une arborescence source qui semble être utilisée par le projet ArchLinux sur github qui contient la source pour sfilllaquelle un outil est inclus dans le package Secure-Delete.

Vous trouverez également une copie de sfillla page de manuel de:


cette URL est obsolète. aucune idée où sa page d'accueil est maintenant (ou même si elle en a toujours une), mais elle est packagée pour Debian et Ubuntu. probablement d'autres distributions aussi. si vous avez besoin de code source, vous pouvez le trouver dans les archives Debian si vous ne le trouvez nulle part ailleurs.
cas le

L'URL de page de manuel obsolète est maintenant corrigée. On dirait que "Digipédia" n'est plus une chose.
mwfearnley le

8

Si vous avez la version 1.42.9 de e2fsprogs, vous pouvez utiliser e2imagepour créer l’image de partition sans l’espace libre, afin de pouvoir ignorer l’étape de mise à zéro.


Je ne pouvais (facilement) trouver aucune information en ligne sur ces paramètres, mais ils sont en effet donnés dans les notes de publication de la version 1.42.9: e2fsprogs.sf.net/e2fsprogs-release.html#1.42.9
mwfearnley

1
C'est un outil précieux! Cependant, votre réponse serait meilleure si elle expliquait également comment l'utiliser. C'est e2image -ar /dev/foo1 | gzip > fs.img.gz, ou une de leurs variations. Inclure -fà utiliser sur un fs monté.
Marcel


0

si vous ne souhaitez pas recourir à des outils supplémentaires, cette méthode devrait être plus rapide que cat /dev/zero > /mnt/fs/zeros:

dd if=/dev/zero of="/mnt/fs/filler" bs=10485760
dd if=/dev/zero of="/mnt/fs/filler1" bs=1
rm /mnt/fs/filler
rm /mnt/fs/filler1

Pourquoi serait-ce plus rapide que cat? (Non, l'argument de taille de bloc de ddn'aide pas)
marcelm


2
Oui, mais ça ne va pas ddplus vite. En fait, ça va probablement catplus vite. La taille des blocs est importante uniquement pour réduire la surcharge des appels système et pour optimiser l'utilisation du cache du processeur. Avec la surcharge système, vous entrez dans la zone des rendements décroissants. La mémoire cache commence à faire mal au-dessus, disons, 1 Mo. Et quand vous travaillez sur de vrais disques, vous êtes quand même lié aux entrées / sorties et le problème est essentiellement théorique. Essayez de le comparer vous-même.
Marcel
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.