Можно ли монтировать сжатый gzip образ дд на лету?

66

Мне нравится создавать резервную копию образа при первом резервном копировании системы. После этого я впервые использую rsync для создания инкрементных резервных копий.

Моя обычная резервная копия образа выглядит следующим образом:

Смонтировать и обнулить пустое пространство:

dd if=/dev/zero of=temp.dd bs=1M

rm temp.dd

Размонтируйте и вставьте диск во время сжатия

dd if=/dev/hda conv=sync,noerror bs=64K | gzip -c > /mnt/sda1/hda.ddimg.gz

чтобы вернуть систему в нормальное состояние, я обычно делаю

gunzip -c /mnt/sda1/hda.img.gz | dd of=/dev/hda conv=sync,noerror bs=64K

Это действительно просто и позволяет мне сохранить «весь диск», но на самом деле просто сэкономить использованное пространство.

Здесь проблема. Допустим, я делаю вышеописанное, но не в чистой системе и не запускаю резервные копии rsync достаточно быстро, и есть файлы, к которым я хочу получить доступ, которые находятся на образе. Допустим, у меня нет места для хранения, чтобы распаковать и скопировать образ на диск, но я хочу смонтировать образ, чтобы извлечь из него отдельные файлы .... Возможно ли это?

Обычно никто не будет сжимать образ dd, что позволит вам просто смонтировать образ, используя -o loop... но это не мой случай ...

Любые предложения по установке сжатого IMG на лету?

Будет ли использование AVFS для «монтирования» gz-файла, а затем монтирование внутренней работы dd.img (я так не думаю ... но потребуется проверка ...)?

g19fanatic
источник
Вы должны использовать SquashFSдля таких вещей. Он также удаляет дубликаты файлов.
Авио
Похоже, этот парень делает то, о чем вы спрашиваете: blogs.gnome.org/muelli/2012/10/…
Джошуа,
Я второе предложение Avio. Squashfs не архивирует только acls. Он архивирует xattrs, атрибуты selinux и т. Д. Если вы не используете acls, то squashfs - это путь IMHO. Недавно мне пришлось «на всякий случай» заархивировать несколько старых дисков, которые уже были перенесены в новое хранилище, и squashfs идеально подходил для этой работы.
Куба Обер

Ответы:

66

Это зависит от того, является ли образ диска полным образом диска или просто разделом.

Мойка раздела (ов)

Если диск находится в хорошем рабочем состоянии, вы получите лучшее сжатие, если очистите пустое пространство на диске нулями. Если диск выходит из строя, пропустите этот шаг.

Если вы создаете образ всего диска, вам нужно помыть каждый раздел на диске.

ВНИМАНИЕ: Будьте осторожны, вы хотите установить ofв файл в смонтированном разделе, НЕ ограждающей САМ!

mkdir image_source
sudo mount /dev/sda1 image_source
dd if=/dev/zero of=image_source/wash.tmp bs=4M
rm image_source/wash.tmp
sudo umount image_source

Создание образа раздела

mkdir image
sudo dd if=/dev/sda1 of=image/sda1_backup.img bs=4M

Где sdaимя устройства и 1номер раздела. Отрегулируйте соответственно для вашей системы, если вы хотите создать образ другого устройства или раздела.

Создание образа всего диска

mkdir image
sudo dd if=/dev/sda of=image/sda_backup.img bs=4M

Где sdaэто название устройства. Отрегулируйте соответственно для вашей системы, если вы хотите, чтобы изображение другого устройства.

компрессия

Создайте изображение «squashfs», которое содержит полное несжатое изображение.

sudo apt-get install squashfs-tools
mksquashfs image squash.img

Потоковое сжатие

Чтобы избежать создания отдельного временного файла полного размера диска, вы можете выполнить потоковую передачу в образ squashfs.

mkdir empty-dir
mksquashfs empty-dir squash.img -p 'sda_backup.img f 444 root root dd if=/dev/sda bs=4M'

Монтирование сжатого образа раздела

Сначала смонтируйте образ squashfs, затем смонтируйте образ раздела, сохраненный в смонтированном образе squashfs.

mkdir squash_mount
sudo mount squash.img squash_mount

Теперь у вас есть смонтированный сжатый образ, смонтируйте сам образ (то есть внутри образа squashfs)

mkdir compressed_image
sudo mount squash_mount/sda1_backup.img compressed_image

Теперь ваше изображение смонтировано под compressed_image.

РЕДАКТИРОВАТЬ: Если вы хотите просто восстановить образ диска в раздел на этом этапе (вместо того, чтобы монтировать его для просмотра / чтения содержимого), просто ddсделайте образ squash_mount/sda1_backup.imgна месте назначения вместо того, чтобы делать mount.

Монтирование сжатого полного образа диска

Для этого вам необходимо использовать пакет с именем kpartx. kpartx позволяет вам монтировать отдельные разделы в полный образ диска.

sudo apt-get install kpartx

Сначала смонтируйте сжатый раздел, содержащий полный образ диска.

mkdir compressed_image
sudo mount squash.img compressed_image

Теперь вам нужно создать устройства для каждого раздела в полном образе диска:

sudo kpartx -a compressed_image/sda_backup.img

Это создаст устройства для разделов в полном образе диска, /dev/mapper/loopNpPгде N - номер, назначенный для устройства обратной связи, а P - номер раздела. Например: /dev/mapper/loop0p1.

Теперь у вас есть способ смонтировать отдельные разделы в полном образе диска:

mkdir fulldisk_part1
sudo mount /dev/mapper/loop0p1 fulldisk_part1
doug65536
источник
интересно взять эту проблему (squashfs вместо gzip). Я довольно незнаком с инструментами squashfs ... вы можете передать вывод dd, чтобы создать раздел сквоша на лету, как вы можете с разделом gzip? Каковы коэффициенты сжатия (gzip хорошо / хорошо, особенно учитывая тот факт, что я очищаю «пустое пространство с нулями»)?
g19fanatic
Как бы вы вернули изображение обратно на жесткий диск?
g19fanatic
2
@ g19fanatic Несжатый образ диска находится «внутри» образа squashfs. Вы монтируете образ squashfs, затем добавляете образ внутри него на целевой диск.
doug65536
@ g19fanatic Сжатие было превосходным (почти так же, как gzip в моем случае). mksquashfs тоже был быстрый, он распараллелен. На моем 990x (6 ядрах) он был фактически ограничен скоростью записи на целевой диск, около 100 МБ / с.
doug65536
3
@ g19fanatic Вы можете транслировать в squashfs, используя флаги -pили, -pfчтобы передать ему псевдо-файл. Псевдофайл может использоваться для таких вещей, как создание узлов устройства, которые иначе невозможно сделать без root (полезно для построения изображений как часть процесса сборки) или для потоковой передачи вывода какой-либо команды в изображение. Одним из примеров, приведенных в документации ( /usr/share/doc/squashfs-tools/examples/pseudo-file.exampleв Debian / Ubuntu), является input f 444 root root dd if=/dev/sda1 bs=1024 count=10копирование первых 10 КБ из образа диска в файл с именем «input» в образе squashfs.
Брайан Кэмпбелл
15

Если изображение доступно только для чтения, вы также можете использовать nbdkit ( man-страницу ) и его плагин xz (xz должен обеспечить лучшее время сжатия и произвольного доступа, чем gzip).

Создать сжатый образ раздела

dd if=/dev/sda1 bs=16M | xz -9 --block-size=16MiB - > sda1.img.xz

--block-sizeВариант 16 МиБа должен обеспечить хорошую случайную производительность доступа.

Примечание: вы можете использовать альтернативные программы сжатия xz, такие как pixz, который обеспечивает параллельное сжатие, просто убедитесь, что он разбивает выходные данные на несколько небольших блоков, в противном случае nbdkit должен распаковывать много данных. Например, по состоянию на сентябрь 2015 года pxz не поддерживает это.

Подайте это с nbdkit

nbdkit --no-fork --user nobody --group nobody -i 127.0.0.1 \
       xz file=sda1.img.xz

Подключиться к серверу NBD

nbd-client 127.0.0.1 10809 /dev/nbd0 -nofork

Монтировать его только для чтения

mount -o ro /dev/nbd0 sda1

Когда сделано

umount /dev/nbd0
nbd-client -d /dev/nbd0

Остановите nbdkit , нажав Ctrl+ C(или с помощью kill ).

Кристиан Чиупиту
источник
15

Пытаться archivemount

root@srv1:/backup# archivemount windows-2003-S.gz /target/
Unrecognized archive format
root@srv1:/backup# archivemount -o formatraw windows-2003-S.gz /target/
Calculating uncompressed file size. Please wait.
root@srv1:/backup# ls /target/
data
root@srv1:/backup# file /target/data
/target/data: DOS/MBR boot sector; partition 1 : ID=0x7, start-CHS (0x0,1,1), end-CHS (0x3ff,254,63), startsector 63, 58717512 sectors, extended partition table (last)

archivemount - файловая система на основе FUSE для вариантов Unix, включая Linux. Его целью является монтирование архивов (то есть tar, tar.gz и т. Д.) В точку монтирования, где они могут быть считаны или записаны, как и в любой другой файловой системе. Это делает доступ к содержимому архива, который может быть сжат, прозрачным для других программ, без распаковки их.

http://linuxaria.com/howto/how-to-mounts-an-archive-for-access-as-a-file-system

После монтирования архива вы можете использовать его содержимое как обычный файл. Возможно получить таблицу разделов или конвертировать, смонтировать образ с помощью инструментов qemu.

squashfs полезен для загрузки с образа, но очень сложен для резервного копирования.

эри
источник
Отлично! Это самое простое и элегантное решение на сегодняшний день. Интересно, почему здесь нет голосов?
TranslucentCloud
Я думаю, это потому, что если вы смонтируете архив наподобие disk.img.gz в папке с archivemount, скажем, / mnt /, вы получите единственный файл /mnt/disk.img, который затем вам нужно будет смонтировать в другом месте. Вместо этого вопрос требует, чтобы что-то могло разворачиваться как за один шаг (а архивное монтирование кажется способным сделать это на .tar.gz, но не на сырых сжатых изображениях).
p91paul
2
Этот ответ тоже очень интересный. Я верю, что squashfs получает больше любви, потому что у них больше осознанности. Я сразу узнал имя, но никогда не слышал об архиве. Я тоже должен дать ему шанс!
g19fanatic
2
archivemount не позволяет монтировать образ, созданный командойdd if=/dev/hda conv=sync,noerror bs=64K | gzip -c > /mnt/sda1/hda.ddimg.gz
Sergei
3
Согласовано - на момент написания, archivemount поддерживает tar-архивы, которые были сжаты, но не являются обычными сжатыми файлами.
mwfearnley
10

Этот ответ дополняет ответ Кристиана Чиупиту . Если вы используете сжатие xz с разумным размером блока, вы можете получить доступ к образу диска, используя guestfish или другие инструменты libguestfs , например:

nbdkit xz file=disk.img.xz --run 'guestfish --format=raw -a $nbd -i'
Богатый
источник
8

На самом деле, нет. Вы не можете действительно искать конкретный блок в сжатом файле, не распаковывая его целиком, что затрудняет использование сжатого изображения в качестве блочного устройства.

Вы можете использовать что-то вроде dumpи restore(или tar, действительно), все из которых используют потоковый формат ... так что вы можете получить доступ к индивидуальным файлам, эффективно сканируя несжатый поток. Это означает, что если файл, который вы хотите, находится в конце сжатого архива, у вас может быть долгое время ожидания, но это не требует, чтобы вы фактически распаковывали все на диск.

Использование tarрезервных копий может показаться немного старомодным, но вы получаете большую гибкость.

larsks
источник
1
Проблема заключается в том, что я даже не знаю, находится ли интересующий файл на самом деле в этой сжатой резервной копии ... Знаете ли вы о проводнике, который просматривает весь образ .gz, сохраните файл / dir структура в памяти, обеспечивает простое представление структуры и позволяет вам «выбрать» файлы (теперь, когда он знает, где они существуют) для извлечения? Это очень нишевая спецификация ... но я мог бы видеть множество применений для чего-то подобного ... если оно существует.
g19fanatic
1
Если это не так, не могли бы вы указать мне какую-нибудь инструкцию о том, как вытащить структуру из образа gz'd? Я был бы в состоянии создать такую ​​программу (программу для жизни ...), но я слеп по теме декомпрессии данных изображения и специфике различных файловых систем.
g19fanatic
Я подозреваю, что создание собственного инструмента будет более масштабным проектом, чем вы действительно хотите. Однако ... при условии, что у вас есть файловая система ext [234], я бы предложил пакет e2fsprogs или что-то вроде fuse-ext2 . Оба предоставляют инструменты пользовательского пространства для взаимодействия с файловыми системами ext [234].
Жаворонки
Также обратите внимание, что то, что у вас есть, - это не образ файловой системы, а целый образ диска, что означает, что вам сначала нужно разобрать таблицу разделов и найти соответствующий раздел.
Жаворонки
Я опечатался в вышеупомянутом вопросе и исправлю это. Я обычно делаю образ dd на основе разделов и сохраняю копию таблицы разделов. Раньше я делал целые копии дисков, но ненавидел необходимость монтировать с параметрами, чтобы добраться до нужного места.
g19fanatic
3

Еще одно дополнение к ответу Кристиана Чиупиту :

Если вы используете nbdkitдля монтирования полного образа диска (вместо образа раздела), вам может потребоваться указать размер блока (размер сектора диска) при подключении к NBD-серверу, поскольку по умолчанию используется 1024байты. Чтобы использовать 512байты вместо:

nbd-client 127.0.0.1 /dev/nbd0 -b 512 -n

После этого диск отобразится как /dev/nbd0, и вы сможете просматривать таблицу разделов, используя fdisk -l. Однако разделы еще не монтируются - используйте kpartx(из ответа doug65536 ) для создания устройств для разделов, например:

kpartx -arv /dev/nbd0

Наконец, разделы появятся в /dev/mapper/, и вы можете смонтировать их как обычно. Убедитесь, что вы используете режим readonly ( -o ro), поскольку плагин xz поддерживает только чтение:

mount -o ro /dev/mapper/nbd0p3 /mnt
friederbluemle
источник