Si je cours tar -cvf
sur un répertoire de taille 937 Mo pour créer une copie facilement téléchargeable d'une structure de dossiers profondément imbriquée, est-ce que je risque de remplir le disque étant donné la df -h
sortie suivante :
/dev/xvda1 7.9G 3.6G 4.3G 46% /
tmpfs 298M 0 298M 0% /dev/shm
Questions connexes:
- Si le disque peut se remplir, pourquoi donc qu'est-ce que Linux (Amazon AMI) et / ou
tar
feront sous le capot? - Comment puis-je déterminer précisément ces informations moi-même sans demander à nouveau?
tar
disk-usage
codecowboy
la source
la source
--totals
option. Quoi qu'il en soit, si vous remplissez le disque, vous pouvez simplement supprimer l'archive, à mon humble avis. Pour vérifier toutes les options disponibles, vous pouvez passer partar --help
.Réponses:
tar -c data_dir | wc -c
sans compressionou
tar -cz data_dir | wc -c
avec compression gzipou
tar -cj data_dir | wc -c
avec compression bzip2affichera la taille de l'archive qui serait créée en octets, sans écrire sur le disque. Vous pouvez ensuite comparer cela à la quantité d'espace libre sur votre appareil cible.
Vous pouvez vérifier la taille du répertoire de données lui-même, au cas où une supposition incorrecte aurait été faite concernant sa taille, avec la commande suivante:
du -h --max-depth=1 data_dir
Comme déjà répondu, tar ajoute un en-tête à chaque enregistrement de l'archive et arrondit également la taille de chaque enregistrement à un multiple de 512 octets (par défaut). La fin d'une archive est marquée par au moins deux enregistrements consécutifs remplis de zéro. Il est donc toujours vrai que vous aurez un fichier tar non compressé plus grand que les fichiers eux-mêmes, le nombre de fichiers et leur alignement sur les limites de 512 octets déterminent l'espace supplémentaire utilisé.
Bien sûr, les systèmes de fichiers eux-mêmes utilisent des tailles de bloc qui peuvent être plus grandes que le contenu d'un fichier individuel, alors faites attention où vous le décompressez, le système de fichiers peut ne pas être capable de contenir beaucoup de petits fichiers même s'il a un espace libre supérieur à la taille tar!
https://en.wikipedia.org/wiki/Tar_(computing)#Format_details
la source
-f -
pour tar est redondante, car vous pouvez simplement ignorer l'-f
argument pour écrire le résultat dans stdout (ietar -c data_dir
).La taille de votre fichier tar sera de 937 Mo plus la taille des métadonnées nécessaires pour chaque fichier ou répertoire (512 octets par objet), et un remplissage ajouté pour aligner les fichiers sur une limite de 512 octets.
Un calcul très approximatif nous indique qu'une autre copie de vos données vous laissera 3,4 Go de libre. Dans 3,4 Go, nous avons de la place pour environ 7 millions d'enregistrements de métadonnées, en supposant qu'il n'y ait pas de remplissage, ou moins si vous supposez une moyenne de 256 octets de remplissage par fichier. Donc, si vous avez des millions de fichiers et de répertoires à tarer, vous pourriez rencontrer des problèmes.
Vous pouvez atténuer le problème en
z
ouj
pourtar
tar
tant qu'utilisateur normal afin que l'espace réservé sur la/
partition ne soit pas touché si vous manquez d'espace.la source
tar
lui-même peut rendre compte de la taille de ses archives avec l'--test
option:La commande ci-dessus n'écrit rien sur le disque et présente l'avantage supplémentaire de répertorier les tailles de fichier individuelles de chaque fichier contenu dans l'archive tar. Ajouter les différents
z/j/xz
opérandes de chaque côté du|pipe
poignée gérera la compression comme vous le feriez.PRODUCTION:
Pas entièrement sûr de votre objectif, mais s'il s'agit de télécharger l'archive tar, cela pourrait être plus pertinent:
Ou simplement copier avec
tar
:la source
tar
copiera ensuite l'arborescence sur votre disque local dans un flux sans rien enregistrer sur le disque distant, après quoi vous pourrez le supprimer de l'hôte distant et le restaurer plus tard. Vous devriez probablement ajouter-z
pour la compression comme le souligne Goldilocks, pour économiser sur la bande passante à mi-transfert.-i
à droite, désolé!J'ai fait beaucoup de recherches à ce sujet. Vous pouvez faire un test sur le fichier avec un nombre de mots, mais il ne vous donnera pas le même numéro qu'un
du -sb adir
.du
compte chaque répertoire comme 4096 octets ettar
compte les répertoires comme 0 octet. Vous devez ajouter 4096 à chaque répertoire:alors vous devez ajouter tous les personnages. Pour quelque chose qui ressemble à ceci:
Je ne sais pas si c'est parfait car je n'ai pas essayé les fichiers qui ont été touchés (fichiers de 0 octet) ou les fichiers qui ont 1 caractère. Cela devrait vous rapprocher.
la source
-cvf
n'inclut aucune compression, ce qui fait que sur un dossier de ~ 1 Go se traduira par un fichier tar de ~ 1 Go (la réponse de Flub contient plus de détails sur la taille supplémentaire dans le fichier tar, mais notez que même s'il y a 10000 fichiers, ce n'est que 5 Mo). Étant donné que vous disposez de 4 Go ou plus, non, vous ne remplirez pas la partition.La plupart des gens considéreraient "plus facile" comme "plus petit" en termes de téléchargement, vous devriez donc utiliser une compression ici.
bzip2
devrait maintenant être disponible sur n'importe quel système avec tar, je pense, donc l'inclusionj
dans vos commutateurs est probablement le meilleur choix.z
(gzip
) est peut-être encore plus courant, et il existe d'autres possibilités (moins omniprésentes) avec plus de squash.Si vous voulez dire,
tar
utilise temporairement de l'espace disque supplémentaire pour effectuer la tâche, je suis sûr que ce n'est pas le cas pour plusieurs raisons, l'une étant à une époque où les lecteurs de bande étaient une forme de stockage principal, et deux étant a eu des décennies à évoluer (et je suis certain qu'il n'est pas nécessaire d'utiliser un espace intermédiaire temporaire, même si la compression est impliquée).la source
Si la vitesse est importante et que la compression n'est pas nécessaire, vous pouvez accrocher les wrappers syscall utilisés à l'
tar
aide deLD_PRELOAD
, pour les modifiertar
et les calculer pour nous. En réimplémentant quelques - unes de ces fonctions pour répondre à nos besoins (calcul de la taille des données de goudron de la production potentielle), nous sommes en mesure d' éliminer beaucoup deread
etwrite
qui est effectué en fonctionnement normaltar
. Cela rendtar
beaucoup plus rapide car il n'a pas besoin de basculer le contexte d'avant en arrière dans le noyau à peu près autant et seul lestat
fichier / dossier d'entrée requis doit être lu à partir du disque au lieu des données de fichier réelles.Le code ci - dessous comprend les mises en œuvre des
close
,read
et deswrite
fonctions POSIX. La macroOUT_FD
contrôle le descripteur de fichier que nous prévoyonstar
d'utiliser comme fichier de sortie. Actuellement, il est défini sur stdout.read
a été modifié pour renvoyer simplement la valeur de succès descount
octets au lieu de remplir buf avec les données, étant donné que les données réelles n'ont pas été lues buf ne contiendrait pas de données valides pour passer à la compression, et donc si la compression était utilisée, nous calculerions une erreur Taille.write
a été modifié pour additionner lescount
octets d' entrée dans la variable globaletotal
et renvoyer la valeur de succès descount
octets uniquement si le descripteur de fichier correspondOUT_FD
, sinon il appelle l'encapsuleur d'origine acquis viadlsym
pour effectuer l'appel système du même nom.close
préforme toujours toutes ses fonctionnalités d'origine, mais si le descripteur de fichier correspond à OUT_FD, il sait que celatar
est fait en essayant d'écrire un fichier tar, donc letotal
nombre est final et il l'imprime sur stdout.Benchmark comparant une solution où l'accès au disque de lecture et tous les appels système de l'opération tar normale sont effectués par rapport à la
LD_PRELOAD
solution.Le code ci-dessus, un script de construction de base pour construire ce qui précède en tant que bibliothèque partagée et un script avec la "
LD_PRELOAD
technique" l'utilisant sont fournis dans le référentiel: https://github.com/G4Vi/tarsizeQuelques informations sur l'utilisation de LD_PRELOAD: https://rafalcieslak.wordpress.com/2013/04/02/dynamic-linker-tricks-using-ld_preload-to-cheat-inject-features-and-investigate-programs/
la source