J'ai six volumes logiques Linux qui soutiennent ensemble une machine virtuelle. La machine virtuelle est actuellement arrêtée, il est donc facile d'en prendre des images cohérentes.
Je voudrais regrouper les six images dans une archive. Trivialement, je pourrais faire quelque chose comme ça:
cp /dev/Zia/vm_lvraid_* /tmp/somedir
tar c /tmp/somedir | whatever
Mais cela crée bien sûr une copie supplémentaire. Je voudrais éviter la copie supplémentaire.
L'approche évidente:
tar c /dev/Zia/vm_lvraid_* | whatever
ne fonctionne pas, car tar reconnaît les fichiers comme spéciaux (liens symboliques dans ce cas) et les stocke essentiellement ln -s
dans l'archive. Ou, avec --dereference
ou directement pointé /dev/dm-X
, il les reconnaît comme spéciaux (fichiers de périphérique) et les stocke essentiellement mknod
dans l'archive.
J'ai recherché des options de ligne de commande à tar pour remplacer ce comportement et je n'en ai trouvé aucune. J'ai également essayé cpio
, même problème, et je n'ai trouvé aucune option pour le remplacer non plus. J'ai aussi essayé 7z
(idem). Même chose avec pax
. J'ai même essayé zip
, ce qui est devenu confus.
edit: En regardant le code source de GNU tar et GNU cpio, il semble qu'aucun d'eux ne puisse le faire. Du moins, pas sans ruse sérieuse (la gestion spéciale des fichiers de périphérique ne peut pas être désactivée). Ainsi, des suggestions de ruse sérieuse seraient appréciées ou des utilitaires alternatifs.
TLDR: Existe - t-il un archiveur qui regroupera plusieurs images de disque (prises à partir de périphériques bruts) et diffusera cette sortie sans faire de copies supplémentaires sur le disque? Ma préférence serait la sortie dans un format commun, comme POSIX ou GNU tar.
la source
Réponses:
J'ai récemment voulu faire ça avec
tar
. Une enquête m'a indiqué que c'était plus qu'un peu absurde que je ne pouvais pas. J'ai trouvé cettesplit --filter="cat >file; tar -r ..."
chose bizarre , mais bon, c'était terriblement lent. Et plus je lisais surtar
le plus insensé, il semblait.Vous voyez,
tar
c'est juste une liste concaténée d'enregistrements. Les fichiers constituants ne sont en aucun cas modifiés - ils sont entiers dans l'archive. Mais ils sont bloqués sur des limites de bloc de 512 octets , et avant chaque fichier, il y a un en- tête . C'est ça. Le format d'en-tête est également très, très simple.J'ai donc écrit le mien
tar
. Je l' appelle ...shitar
.C'est vraiment la viande et les pommes de terre. Il écrit les en-têtes et calcule le chksum - qui, relativement parlant, est la seule partie difficile. Il fait le
ustar
format d'en-tête ... peut-être . Au moins, il émule ce que GNUtar
semble penser être leustar
format d'en-tête au point qu'il ne se plaint pas. Et il y a plus, c'est juste que je ne l'ai pas encore vraiment coagulé . Ici, je vais vous montrer:Voilà
tar
. Tout est rembourré avec des valeurs\0
nulles, donc je me transformeem
en\n
lignes électroniques pour plus de lisibilité. Etshitar
:PRODUCTION
Je dis un peu là-haut parce que ce n'est pas
shitar
le but - le faittar
déjà magnifiquement. Je voulais juste montrer comment cela fonctionne - ce qui signifie que je dois toucher lechksum
. Si ce n'était pas pour ça, je serais juste en train dedd
perdre la tête d'untar
dossier et j'en aurais fini. Cela peut même parfois fonctionner, mais cela devient compliqué lorsqu'il y a plusieurs membres dans l'archive. Pourtant, le chksum est vraiment facile.Tout d'abord, faites-en 7 espaces - (ce qui est une chose gnu bizarre, je pense, comme le spécifie 8, mais peu importe - un hack est un hack) . Additionnez ensuite les valeurs octales de chaque octet dans l'en-tête. Voilà votre chksum. Vous avez donc besoin des métadonnées du fichier avant de faire l'en-tête, ou vous n'avez pas de chksum. Et c'est
ustar
surtout une archive.D'accord. Maintenant, ce qu'il est censé faire:
Cela crée trois images disque de 500 millions de pixels, les formate et les monte chacune, et écrit un fichier sur chacune.
Remarque - apparemment, les périphériques bloqués seront toujours bloqués correctement. Assez pratique.
C'est
tar
le contenu des fichiers de périphérique de disque en flux et dirige la sortie versxz
.Maintenant, le moment de vérité ...
Hourra! Extraction...
Comparaison...
Et la monture ...
Et donc, dans ce cas,
shitar
fonctionne bien, je suppose. Je préfère ne pas entrer dans toutes les choses que cela ne fera pas bien. Mais, je dirai - ne faites pas au moins de nouvelles lignes dans les noms de fichiers.Vous pouvez également le faire - et peut-être devriez-vous, compte tenu des alternatives que j'ai proposées - avec cela
squashfs
. Non seulement vous obtenez l'archive unique construite à partir du flux - mais elle estmount
capable et intégrée au noyauvfs
:Du pseudo-fichier.exemple :
Vous pouvez également utiliser
btrfs (send|receive)
pour diffuser un sous-stdin
volume dans le compresseur capable de votre choix. Ce sous-volume n'a pas besoin d'exister avant que vous décidiez de l'utiliser comme conteneur de compression, bien sûr.Pourtant, à propos de
squashfs
...Je ne crois pas que je fais cette justice. Voici un exemple très simple:
Ce n'est que l'
-p
argument en ligne pourmksquash
. Vous pouvez créer un fichier-pf
contenant autant de fichiers que vous le souhaitez. Le format est simple - vous définissez le nom / chemin d'un fichier cible dans le système de fichiers de la nouvelle archive, vous lui donnez un mode et un propriétaire, puis vous lui dites à partir de quel processus exécuter et lire stdout. Vous pouvez en créer autant que vous le souhaitez - et vous pouvez utiliser LZMA, GZIP, LZ4, XZ ... hmm il y a plus ... de formats de compression que vous le souhaitez. Et le résultat final est une archive dans laquelle vouscd
.Plus d'informations sur le format cependant:
Bien sûr, il ne s'agit pas seulement d' une archive - c'est une image compressée et montable du système de fichiers Linux. Son format est celui du noyau Linux - c'est un système de fichiers pris en charge par le noyau vanilla. De cette façon, il est aussi commun que le noyau Linux vanilla. Donc, si vous me disiez que vous utilisiez un système Linux vanilla sur lequel le
tar
programme n'était pas installé, je serais douteux - mais je vous croirais probablement. Mais si vous me disiez que vous utilisiez un système Linux vanilla sur lequel lesquashfs
système de fichiers n'était pas pris en charge, je ne vous croirais pas.la source
input f 444 root root dd if=/dev/sda1 bs=1024 count=10
f est l'entrée du fichier? Peut-être serait-il préférable de créer un appareil jouet, de le remplir de données et d'écrire à partir de lui? Et tout cela nécessite-t-il un root?input
fichier est un fichier dans l'squashfs
archive - l'image du système de fichiers qui résulte de l'exécution de la commande. Lorsque vous le faites,mksquash
vous pouvez spécifier ces commandes de pseudofichier pour les commandes qui sont exécutées et à partir desquelles lestdout
est capturé au moment de la compression.Votre problème m'a intrigué pendant un certain temps, et je pense avoir trouvé une solution qui fonctionnerait.
Je pense que vous pouvez réaliser ce que vous voulez avec 7z en utilisant le
-si{NAME}
drapeau.Vous pourrez vous adapter à votre besoin.
EDIT : supprimer l'utilisation inutile de chat
la source
7z
page de manuel ne mentionne pas -si peut prendre un nom de fichier, mais cela fonctionne. Ce n'est pas parfait (la sortie ne peut pas être canalisée quelque part), mais c'est certainement le meilleur jusqu'à présent qui sort dans un format commun.