Как смонтировать сжатый образ диска?

12

Если я создаю образ диска и сжимаю его с помощью gzip / xz / etc, есть ли способ смонтировать его напрямую, не распаковывая сначала?

Скажи, что я использовал

sudo dd if=/dev/sdc1 | gzip -9 > image1.dd.gz

Как я могу смонтировать исходное изображение, не создавая сначала несжатую копию?

Или я использовал

sudo dd if=/dev/sdc | gzip -9 > wholedisk.dd.gz

и диск имеет несколько разделов, не затруднит ли это?

При несжатом образе целого диска использование kpartxили более новые версии losetupс его -Pфлагом должны создать цикл для каждого раздела.

Но есть ли способ смонтировать / losttup / прочитать сжатый образ?

Если это не сработает для gzip / xz, есть ли какой-нибудь метод сжатия, который бы сработал?


Обратите внимание на дубликат Q

В настоящее время предлагается дубликат

НЕ ИСПОЛЬЗУЕТ СЖАТИЕ и НЕ ДУБЛИРУЕТ .

mount не будет монтировать сжатый образ сам по себе.

Xen2050
источник
Я могу сказать вам, что это определенно возможно. Но я не могу сказать вам, как atm, потому что инструкции на 2 внешних HDD и сейчас у меня нет доступа ни к одному, но я хочу, чтобы вы знали, что это работает. Я вернусь с ответом, когда он у меня будет (и никто другой не опубликовал его до тех пор).
UTF-8
1
@ UTF-8 Обнадеживает, спасибо. К сведению, первоначальная цель состоит в том, чтобы сделать меньшую резервную копию диска / раздела, который почти пуст или содержит множество легко сжимаемых данных, и иметь возможность читать его, не записывая МНОГО дополнительных данных или не требуя тонны свободного места для его извлечения
Xen2050
Смотрите также major.io/2010/12/14/…
Пантера
2
@ bodhi.zazen Простите? Может быть, я должен уточнить, что mount не распаковывает изображения автоматически, поэтому этот вопрос не является дубликатом askubuntu.com/questions/69363 (может быть, я пропустил шутку, надеюсь, распаковка - не единственный ответ :)
Xen2050

Ответы:

10

Вы можете использовать squashfsдля сжатия образов дисков, а затем смонтировать их.

Создать образ диска

Если у вас еще нет образа диска, используйте его ddдля создания:

dd if=/dev/sda1 of=/tmp/sda1.img bs=4M

Сожмите изображение с помощью squashfs

Установить squashfs:

apt-get install squashfs-tools

Сожмите изображение:

mksquashfs /tmp/sda1.img /tmp/sda1.squash.img

Или потоковое сжатие (не нужен временный файл dd)

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

Дополнения к terminator14 на UbuntuForums.org . Определения / Пояснение:

  • empty-dir- «источник» реж. В основном, в нашем случае, просто пустой каталог, чтобы удовлетворить формат входного аргумента mksquashfs
  • squash.img - назначение и имя файла выходного файла squashfs
  • sda_backup.img - имя резервной копии dd ВНУТРИ файла squashfs
  • f - указывает, что sda_backup.img является обычным файлом (в отличие от каталога, блочного устройства или устройства char)
  • 444 - права доступа к файлу sda_backup.img внутри образа squashfs
  • root root- UID и GID для файла sda_backup.img внутри образа squashfs. Может быть указан десятичными числами или по имени
  • dd if=/dev/sda bs=4M - команда dd, используемая для чтения устройства, для которого мы хотим создать резервную копию

Смонтировать изображение

Сначала смонтируйте squashfsобраз:

mkdir /mnt/squash
mount /tmp/sda1.squash.img /mnt/squash

Это предоставит несжатый образ диска для монтирования:

mkdir /mnt/sda1
mount /mnt/squash/sda1.img /mnt/sda1

Или, если это полный образ диска (разделен), вы можете использовать его losetupдля присоединения образа dd к устройству цикла (возможно, дополнительно), а затем kpartx -aили partprobeдля поиска и разделения разделов на отдельные устройства, или даже vgscan/ vgchange -ayесли есть LVM.

Eborbob
источник
2
Я добавил некоторую информацию о squashfs на лету, чтобы не нуждаться во временном обычном dd-файле. Отличный ответ с squashfs, просто не работает с более дружественными форматами xz / gz
Xen2050
Будет ли это работать с полным образом диска, содержащим несколько разделов?
Friederbluemle
Смотрите здесь полный диск: unix.stackexchange.com/questions/31669/…
HackerBoss
В зависимости от типа файловой системы, установка может потребовать ro,noloadварианты, например:mount -o ro,noload /mnt/squash/sda1.img /mnt/sda1
HackerBoss
7

Мне удалось заставить NBD-сервер «обслуживать» несжатую версию файла .gz или .xz. Я не уверен, должен ли он читать весь сжатый файл очень часто (проверено только с небольшими файлами в оперативной памяти), но, по крайней мере, он работает без необходимости извлечения всей несжатой копии.

Просмотр сжатого изображения в формате gz / xz "на лету"

  1. Установите nbdkit & client

    apt install nbdkit nbd-client
    
  2. Создайте демонстрационный файл в стиле "dd" - пустой 50M файл с файловой системой ext и заархивируйте его (необязательно только для тестирования)

    fallocate -l 50M 50m
    mkfs.ext3 -v 50m
    

    Затем сожмите с помощью gzip или xz

    gzip -vk9 50m
    xz -v9k 50m
    

    Примечание. xzОпция --block-size=16MiBдолжна обеспечивать лучшую производительность произвольного доступа, но за счет меньшего сжатия (возможно, 1%?). Смотрите описание плагина nz для nbdkit .

  3. Запустить сервер на Сжатом образе

    nbdkit -v --no-fork -i 127.0.0.1 /usr/lib/i386-linux-gnu/nbdkit/plugins/nbdkit-gzip-plugin.so file=~/Downloads/50m.gz
    

    или для хз

    nbdkit -v --no-fork -i 127.0.0.1 /usr/lib/i386-linux-gnu/nbdkit/plugins/nbdkit-xz-plugin.so file=~/Downloads/50m.xz
    

    Сервер --no-forkсообщает серверу «Не переходить в фоновый режим», поэтому просматривать возможные сообщения об ошибках и убивать их с помощью CTRL-C немного проще.

    -v может / покажет слишком много сообщений о состоянии, особенно при чтении.

  4. Запустить клиент (в другом терминале / окне)

    sudo nbd-client -nofork 127.0.0.1 10809 /dev/nbd0
    

    Это -noforkпохоже на -no-forkвыше, но я не мог убить клиента с помощью CTRL-C kill <pid>, или sudo kill <pid>. Завершение работы сервера с помощью CTRL-C остановило и сервер, и клиент.

  5. Заметьте, что /dev/nbd0теперь идентично несжатому изображению

    $ sudo diff -s /dev/nbd0 ~/Downloads/50m
    Files /dev/nbd0 and /home/user/Downloads/50m are identical
    

    /dev/nbd0теперь может использоваться как несжатый образ; установлен, чтение / копирование с dd, или использование kpartx, partprobe, vgscan/ vgchangeи т.д.!

Спасибо Cristian Ciupitu на Unix & Linux , хотя, чтобы найти плагин и собрать все вместе, потребовалось немного больше усилий .

Xen2050
источник
На Fedora 31 nbdkit -v --no-fork -i 127.0.0.1 --filter=xz file ~/Downloads/50m.xzотлично работал с той же клиентской командой
EkriirkE
В Ubuntu xenial 16.04 LTS nbdkit 1.1.11 использует старый протокол NBD, который отличается от нового протокола NBD, используемого в nbd-client 3.13, но вы можете использовать версию nbd-client до 3.10, например, nbd-client 3.8 from Ubuntu precise 12.04 old LTS[использовать старые версии только локально для безопасности!]
user1742529
0

Вот мой способ сделать это, не знаю консольный эквивалент этого, хотя,

  • Сожмите папку в ISO. введите описание изображения здесь
  • Смонтируйте .isoфайл с помощью Disk Image Mounter. введите описание изображения здесь
  • Тада я открываю сжатый iso не распаковывая его. введите описание изображения здесь
hellozee
источник
4
Этот метод действительно сжимает данные? Похоже, что он использует обычное изображение iso9660 (через файл-ролик?), Которое не использует сжатие. Я попробовал это на 100-мегабайтном файле всех нулей ( dd if=/dev/zeroи файлового ролика), и он на самом деле добавляет 362 КБ данных (я полагаю, что это накладные расходы ISO). Спасибо, хотя, идея находится на правильном пути
Xen2050
Извините, но я не имею никакого представления о технологиях сжатия, но если вы попробуете любой другой формат сжатия, могу поспорить, вы также можете перечислить это с помощью файлового ролика, но если вы хотите прочитать этот файл, вам нужно извлечь только этот конкретный файл.
Привет