У меня есть шесть логических томов Linux, которые вместе поддерживают виртуальную машину. В настоящее время виртуальная машина отключена, поэтому ее легко получать последовательные изображения.
Я хотел бы упаковать все шесть изображений в архив. Я мог бы сделать что-то вроде этого:
cp /dev/Zia/vm_lvraid_* /tmp/somedir
tar c /tmp/somedir | whatever
Но это, конечно, создает дополнительную копию. Я хотел бы избежать дополнительной копии.
Очевидный подход:
tar c /dev/Zia/vm_lvraid_* | whatever
не работает, так как tar распознает файлы специальным образом (в данном случае символические ссылки) и в основном сохраняет их ln -s
в архиве. Или, с --dereference
указанием или прямым указанием /dev/dm-X
, он распознает их как специальные (файлы устройств) и в основном сохраняет их mknod
в архиве.
Я искал параметры командной строки для tar, чтобы переопределить это поведение, и не смог найти ни одного. Я также пытался cpio
, та же проблема, и не мог найти какие-либо варианты переопределить там, либо. Я тоже пытался 7z
(так же). То же самое с pax
. Я даже попробовал zip
, который просто запутался.
edit: Глядя на исходный код GNU tar и GNU cpio, кажется, что ни один из них не может этого сделать. По крайней мере, не без серьезных хитростей (специальная обработка файлов устройств не может быть отключена). Таким образом, предложения серьезного обмана будут оценены или альтернативные утилиты.
TLDR: существует ли какой-нибудь архиватор, который будет упаковывать несколько образов дисков (взятых с необработанных устройств) и передавать их на поток без создания дополнительных копий на диске? Мои предпочтения будут выводиться в общем формате, таком как POSIX или GNU tar.
источник
Ответы:
Так недавно я хотел сделать это с
tar
. Некоторое расследование показало мне, что это было немного глупо, что я не мог. Я придумал эту страннуюsplit --filter="cat >file; tar -r ..."
вещь, но, ну, это было ужасно медленно. И чем больше я читаю оtar
бессмысленности, тем больше это казалось.Видите ли,
tar
это просто составной список записей. Составляющие файлы никак не изменяются - они целые в архиве. Но они блокируются на границах блоков по 512 байт , и перед каждым файлом есть заголовок . Вот и все. Формат заголовка действительно очень прост.Итак, я написал свой
tar
. Я называю это ...shitar
.Это мясо и картошка, правда. Он записывает заголовки и вычисляет chksum - что, собственно говоря, является единственной сложной частью. Это делает
ustar
формат заголовка ... возможно . По крайней мере, он подражает тому, что GNU,tar
кажется, считаетustar
формат заголовка до такой степени, что он не жалуется. И это еще не все, просто я еще не коагулировал это. Здесь я покажу вам:Это
tar
. Все заполнено\0
нулями, поэтому я просто превращаюсьem
в электронные\n
строки для удобства чтения. Иshitar
:ВЫХОД
Я говорю вроде там , потому что это не
shitar
цель «s -tar
уже делает это красиво. Я просто хотел показать, как это работает - а это значит, что мне нужно коснутьсяchksum
. Если бы не это, я бы простоdd
снял с головыtar
файл и покончил с этим. Это может даже иногда работать, но это становится грязным, когда в архиве несколько участников. Тем не менее, chksum действительно легко.Во-первых, сделайте это 7 пробелами - (что странно для гну, я думаю, как сказано в спецификации 8, но что угодно - взлом - это взлом) . Затем сложите восьмеричные значения каждого байта в заголовке. Это твой чксум. Таким образом, вам нужны метаданные файла, прежде чем вы сделаете заголовок, или у вас нет chksum. И это в
ustar
основном архив.Ok. Теперь, что это должно сделать:
Это создает три 500M-образа диска, форматирует и монтирует каждый и записывает файл в каждый.
Примечание - очевидно, блокирующие устройства просто всегда будут правильно блокироваться. Довольно удобно.
Это
tar
содержимое файлов дискового устройства, находящихся в потоке и передающее выводxz
.Теперь момент истины ...
Ура! Добыча ...
Сравнение ...
И гора ...
И так, в этом случае,
shitar
работает нормально, я думаю. Я бы предпочел не вдаваться во все вещи, которые не принесут успеха. Но я скажу - не делайте переводы строк в именах файлов по крайней мере.Вы также можете сделать - и, возможно, следует, учитывая альтернативы, которые я предложил, - с этим
squashfs
. Вы не только получаете единый архив, созданный из потока, но иmount
можете встроить его в ядроvfs
:Из псевдо-файла. Пример :
Вы также можете использовать
btrfs (send|receive)
поток тома в любомstdin
-компилируемом компрессоре, который вам нравится. Конечно, этот объем не обязательно должен существовать, прежде чем вы решите использовать его в качестве контейнера сжатия.Тем не менее, о
squashfs
...Я не верю, что делаю это справедливо. Вот очень простой пример:
Это только встроенный
-p
аргумент дляmksquash
. Вы можете найти файл,-pf
содержащий столько, сколько вам нужно. Формат прост - вы определяете имя / путь целевого файла в файловой системе нового архива, вы задаете ему режим и владельца, а затем указываете, из какого процесса выполнять и считывать стандартный вывод. Вы можете создавать столько, сколько хотите - и вы можете использовать LZMA, GZIP, LZ4, XZ ... хм, есть еще ... форматы сжатия, как вам нравится. И конечным результатом является архив, в который выcd
.Больше о формате, хотя:
Это, конечно, не просто архив - это сжатый, монтируемый образ файловой системы Linux. Его формат - ядро Linux - это файловая система, поддерживаемая ядром ванили. Таким образом, это так же часто, как ванильное ядро Linux. Так что, если бы вы сказали мне, что у вас запущенная система Linux, на которой
tar
программа не была установлена, я был бы сомнителен, но я бы, вероятно, поверил вам. Но если бы вы сказали мне, что у вас запущенная система Linux, в которойsquashfs
файловая система не поддерживается, я бы вам не поверил.источник
input f 444 root root dd if=/dev/sda1 bs=1024 count=10
какой файл ввода? Возможно, было бы лучше создать игрушечное устройство, заполнить его данными и написать с него? И требует ли все это рута?input
файл - это файл вsquashfs
архиве - образ файловой системы, полученный в результате выполнения команды. Когда вы это сделаете,mksquash
вы можете указать эти команды псевдофайла для команд, которые запускаются и из которыхstdout
захватывается во время сжатия.Ваша проблема на некоторое время озадачила меня, и я думаю, что нашел решение, которое сработало бы.
Я думаю, что вы можете достичь того, что вы хотите с 7z, используя
-si{NAME}
флаг.Вы сможете адаптироваться к вашим потребностям.
РЕДАКТИРОВАТЬ : удалить бесполезное использование кошки
источник
7z
справочная страница не упоминает -si может взять имя файла, но это работает. Он не идеален (вывод не может быть куда-то передан), но определенно является лучшим, если вывод в общем формате.