Je me rends compte que cette question est très ancienne, mais voici une mise à jour qui pourrait être utile à d'autres qui trouvent leur chemin ici de la même manière que moi.
Heureusement, l'excellente réponse de mvp est désormais obsolète. Selon les notes de publication de GNU tar, SEEK_HOLE/SEEK_DATA a été ajouté dans la version 1.29, publiée le 16/05/2016. (Et avec GNU tar v. 1.30 étant maintenant standard dans Debian stable, il est prudent de supposer que la version tar ≥ 1.29 est disponible presque partout.)
Donc, la façon de gérer les fichiers épars maintenant est de les archiver avec n'importe quel tar (GNU ou BSD) installé sur votre système, et de même pour l'extraction.
De plus, pour les fichiers épars qui contiennent réellement des données, s'il vaut la peine d'utiliser la compression (c'est-à-dire que les données sont suffisamment compressibles pour économiser un espace disque substantiel, et les économies d'espace disque valent le temps et les ressources CPU nécessaires pour le compresser) :
tar -cSjf <archive>.tar.bz2 /path/to/sparse/file
tireront à la fois parti de la fonctionnalité SEEK_HOLE de tar pour archiver rapidement et efficacement le fichier fragmenté et utiliseront bzip2 pour compresser les données réelles.tar --use-compress-program=pbzip2 -cSf <archive>.tar.bz2 /path/to/sparse/file
, comme mentionné dans le commentaire de marcin, fera de même tandis que également en utilisant plusieurs cœurs pour la tâche de compression.
Sur mon petit serveur domestique avec un processeur Atom quadricœur, en utilisant pbzip2
contre bzip2
réduit le temps d'environ 25 ou 30 %.
Avec ou sans compression, cela vous donnera une archive qui n'a besoin d'aucune gestion spéciale des fichiers fragmentés, occupe approximativement la taille "réelle" du fichier fragmenté d'origine (ou moins s'il est compressé) et peut être déplacée sans souci à propos de l'incohérence entre les capacités de fichiers fragmentés des différents utilitaires. Par exemple :cp
détectera automatiquement les fichiers épars et fera ce qu'il faut, rsync
gérera correctement les fichiers fragmentés si vous utilisez le -S
drapeau, et scp
n'a pas d'option pour les fichiers clairsemés (cela consommera de la bande passante en copiant des zéros pour tous les trous et la copie résultante sera un fichier non clairsemé dont la taille est la taille «apparente» de l'original); mais tous géreront bien sûr très bien une archive tar, qu'elle contienne des fichiers épars ou non, sans aucun indicateur spécial.
Remarques supplémentaires
- Lors de l'extraction,
tar
détectera automatiquement une archive créée avec-S
il n'est donc pas nécessaire de le spécifier. - Une archive créée avec
pbzip2
est stocké en morceaux. Il en résulte que l'archive est légèrement plus grande que sibzip2
est utilisé, mais signifie également que l'extraction peut être multithread, contrairement à une archive créée avecbzip2
. pbzip2
etbzip2
extrairont de manière fiable les archives de l'autre sans erreur ni corruption.
Réponse courte : Utilisez bsdtar
ou GNU tar
(version 1.29 ou ultérieure) pour créer des archives, et GNU tar
(version 1.26 ou supérieure) pour les extraire sur une autre box.
Réponse longue : Il y a certaines conditions pour que cela fonctionne.
Tout d'abord, Linux doit être au moins le noyau 3.1 (Ubuntu 12.04 ou une version ultérieure ferait l'affaire), il prend donc en charge SEEK_HOLE
fonctionnalité.
Ensuite, vous avez besoin de l'utilitaire tar qui peut prendre en charge cet appel système. GNU tar
le supporte depuis la version 1.29 (sortie le 16/05/2016, il devrait être présent par défaut depuis Ubuntu 18.04), ou bsdtar
depuis la version 3.0.4 (disponible depuis Ubuntu 12.04) - installez-le en utilisant sudo apt-get install bsdtar
.
Alors que bsdtar
(qui utilise libarchive
) est génial, malheureusement, il n'est pas très intelligent lorsqu'il s'agit de décompresser - il nécessite bêtement d'avoir au moins autant d'espace libre sur le lecteur cible que la taille du fichier non compressé, sans tenir compte des trous. GNU tar
décompressera efficacement ces archives éparses et ne vérifiera pas cette condition.
Ceci est le journal d'Ubuntu 12.10 (noyau Linux 3.5) :
$ dd if=/dev/zero of=1tb seek=1T bs=1 count=1
1+0 records in
1+0 records out
1 byte (1 B) copied, 0.000143113 s, 7.0 kB/s
$ time bsdtar cvfz sparse.tar.gz 1tb
a 1tb
real 0m0.362s
user 0m0.336s
sys 0m0.020s
# Or, use gnu tar if version is later than 1.29:
$ time tar cSvfz sparse-gnutar.tar.gz 1tb
1tb
real 0m0.005s
user 0m0.006s
sys 0m0.000s
$ ls -l
-rw-rw-r-- 1 autouser autouser 1099511627777 Nov 7 01:43 1tb
-rw-rw-r-- 1 autouser autouser 257 Nov 7 01:43 sparse.tar.gz
-rw-rw-r-- 1 autouser autouser 134 Nov 7 01:43 sparse-gnutar.tar.gz
$
Comme je l'ai dit plus haut, malheureusement, untarring avec bsdtar
ne fonctionnera que si vous disposez de 1 To d'espace libre. Cependant, toute version de GNU tar
fonctionne très bien pour décompresser un tel sparse.tar
:
$ rm 1tb
$ time tar -xvSf sparse.tar.gz
1tb
real 0m0.031s
user 0m0.016s
sys 0m0.016s
$ ls -l
total 8
-rw-rw-r-- 1 autouser autouser 1099511627777 Nov 7 01:43 1tb
-rw-rw-r-- 1 autouser autouser 257 Nov 7 01:43 sparse.tar.gz