12
votes

Comment se fait-il récupérer des blocs à zéro à zéro d'un fichier rare?

Considérez un fichier rare avec 1S écrit dans une partie du fichier.

Je souhaite récupérer l'espace réel sur le disque pour ces 1S car je n'ai plus besoin de cette partie du fichier de race. La partie du fichier contenant ces 1s devrait devenir un "trou" tel qu'il était avant que les 1s n'étaient eux-mêmes écrits. P>

Pour ce faire, j'ai effacé la région à 0s. Cela fait pas strong> récupérer les blocs sur le disque. P>

Comment puis-je réellement faire le fichier rare, bien, rare à nouveau? P>

Cette question est similaire à Celui-ci a > Mais il n'y a pas de réponse acceptée pour cette question. P>

Considérez la séquence d'événements suivante Exécuter sur un serveur de stock Linux: P>

$ cat /tmp/test.c
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <string.h>

int main(int argc, char **argv) {
    int fd;
    char c[1024];

    memset(c,argc==1,1024);

    fd = open("test",O_CREAT|O_WRONLY,0777);
    lseek(fd,10000,SEEK_SET);
    write(fd,c,1024);
    close(fd);

    return 0;
}

$ gcc -o /tmp/test /tmp/test.c

$ /tmp/test

$ hexdump -C ./test
00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00002710  01 01 01 01 01 01 01 01  01 01 01 01 01 01 01 01  |................|
*
00002b10

$ du -B1 test; du -B1 --apparent-size test
4096        test
11024       test

$ /tmp/test clear

$ hexdump -C ./test
00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00002b10

$ du -B1 test; du -B1 --apparent-size test
4096        test
11024       test

# NO CHANGE IN SIZE.... HMM....


4 commentaires

D'après ce que j'ai lu dans les fichiers rats, le déterminant clé n'est pas que le bloc est rempli de 0 à 0, mais qu'il n'a jamais été écrit. Avez-vous des références au contraire?


Les portions d'un fichier rare ne sont jamais écrits pour ne pas avoir de blocs alloués. Mais ma question est une fois que j'alloque un ou plusieurs blocs, comment puis-je les libérer? Je n'ai plus besoin d'une partie du fichier clairsemé et de vouloir redonner des blocs précédemment attribués. Mais je ne peux pas. Huer.


cp --sparse = toujours ... Les fichiers clairsemés sont un piratage basé sur la manière dont les systèmes gèrent le stockage; Ce n'est jamais une bonne idée de compter sur un hack. Si vous avez besoin de structures de données rares susceptibles d'avoir des morceaux viennent et je vous recommanderais de chercher une telle structure ou de l'écrire vous-même.


Je suppose que vous pourriez aussi mordre avec les entrées d'inode eux-mêmes ... Je n'ai pas touché un système de fichiers à ce niveau depuis le début des années 90, alors n'avez rien de plus à offrir.


7 Réponses :


-1
votes

semble comme écrire des zéros (comme dans la question référencée) à la pièce que vous avez terminée est une chose logique à essayer. Ici, un lien vers une question MSDN pour les fichiers SPARSE NTFS qui ne fait que "libérer" la partie "inutilisée". Ymmv.

http://msdn.microsoft.com/en-us/library /ms810500.aspx


2 commentaires

J'ai fait cela comme indiqué dans la sortie "script".


Lire l'article. Windows a un appel spécial pour libérer les blocs. Linux fait probablement aussi.



1
votes

De cette façon est bon marché, mais cela fonctionne. :-P

  1. Lisez dans toutes les données du trou que vous souhaitez, dans la mémoire (ou un autre fichier, ou autre).
  2. tronquer le fichier au début du trou ( Ftruncate est votre ami).
  3. cherche à la fin du trou.
  4. Écrivez les données dans.

2 commentaires

Aie. Alors laissez-moi vous qualifier d'autre que je cherche quelque chose qui "échelle" bien. :) Je ne veux pas réécrire des fichiers, copier des fichiers, etc. S'il n'est pas possible d'en quelque sorte des blocs alloués auparavant gratuits in situ, alors soyez donc, mais je voudrais déterminer si cela est vrai ou faux.


Cela dépend de votre système de fichiers. Nous avons déjà vu que NTFS gère cela. J'imagine que l'un des autres systèmes de fichiers [Wikipedia listes] [1] comme la manipulation de la compression transparente ferait exactement la même chose - après tout, équivalent à la compression transparente du fichier. [1] en.wikipedia.org/wiki/...



2
votes

Ron YORSTON offre plusieurs solutions; Mais ils impliquent tous soit le montage de la FS en lecture seule (ou le démontant) pendant que la lapsification a lieu; Ou faire un nouveau fichier rare, puis copier ces morceaux de l'original qui ne sont pas seulement 0s, puis remplacez le fichier d'origine avec le fichier nouvellement autoparbé.

Cela dépend vraiment de votre système de fichiers cependant. Nous avons déjà vu que NTFS gère cela. J'imagine que l'un des autres systèmes de fichiers Wikipedia list comme traitement de la compression transparente ferait exactement le Idem - c'est, après tout, équivalent à la compression transparente du fichier.


0 commentaires

4
votes

À l'heure actuelle, il apparaît que seule NTFS prend en charge le poinçonnage des trous. Cela a été historiquement un problème dans la plupart des systèmes de fichiers. POSIX Autant que je sache, ne définit pas une interface système d'exploitation pour perforer des trous. Aucun des systèmes de fichiers Linux standard ne le prend en charge. NetApp prend en charge le poinçonnage des trous via Windows dans son wafl Système de fichiers. Il y a un bel article de blog sur ce ici .

Pour votre problème, comme d'autres ont indiqué, la seule solution consiste à déplacer le fichier laissant des blocs contenant des zéros. Oui, ça va être lent. Ou écrire une extension pour votre système de fichiers sur Linux qui fait cela et Soumettre A PATCH sur Good personnes dans l'équipe du noyau Linux. ;)

EDIT: On dirait que XFS prend en charge le poinçon sur le trou. Vérifiez Ce fil .

Une autre option vraiment tordue peut être d'utiliser un FileSystem Debugger pour aller frapper Les trous dans tous les blocs indirects qui pointent sur des blocs à zéro de votre fichier (peut-être que vous pouvez script). Ensuite, exécutez FSCK qui corrigera tous les chiffres de bloc associés, collectez tous les blocs orphelins (les zérodites) et mettrez-les dans le répertoire trouvé + trouvé (vous pouvez les supprimer pour récupérer l'espace) et corriger les autres propriétés du système de fichiers. Effrayant, hein?


Disclaimer: faites-le à vos risques et périls. Je ne suis pas responsable de toute perte de données que vous engagez. ;)


0 commentaires

0
votes

utout votre système de fichiers et éditer du système de fichiers directement de manière similaire debugfs ou FSCK. Habituellement, vous avez besoin de pilote pour chaque FS utilisé.


0 commentaires

2
votes

Après avoir "zéré", une région du fichier que vous devez dire au système de fichiers que cette nouvelle région est destinée à être une région rare. Donc, dans le cas de NTFS, vous devez appeler DeviceIocontrol () pour cette région à nouveau. Au moins, je fais de cette façon dans mon utilitaire: "Spears_CHecker"

Pour moi, le problème plus gros est de savoir comment non définir la région ratase :).

Cordialement


0 commentaires

10
votes

Il apparaît comme si Linux ajoutez un système SYSCALL appelé automate pour "trous de poinçonnage" dans les fichiers. Les implémentations dans des systèmes de fichiers individuels semblent se concentrer sur la possibilité d'utiliser cela pour pré-allouer un plus grand nombre continu de blocs.

Il y a aussi le POSIX_FALLOCOCAT Appel qui se concentre uniquement sur ce dernier et n'est pas utilisable pour le poinçonnage des trous.


2 commentaires

Jim Paris de Unix Stackexchange a écrit un script pour faciliter un fichier en place à l'aide de ce syscall. Ici, il est: Gist.github.com/jimparis/3901942


Mise à jour de l'UNIX.SE lié: "AS de Util-Linux 2.25, l'utilitaire de Fallocat de Linux a une option -D /-Dig-trou pour cela."