Чи можна монтувати gzip-стиснене зображення DD на льоту?


66

Мені подобається створювати резервну копію зображень вперше, коли я створюю резервну копію системи. Після цього першого разу я використовую rsync, щоб робити додаткові резервні копії.

Моє звичайне резервне копіювання зображень таке:

Встановіть порожній пробіл та нульове значення:

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

rm temp.dd

umount та 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... але це не мій випадок ...

Будь-які пропозиції щодо монтажу стисненого імг на льоту?

Чи використовує AVFS для 'монтування' файлу gz, а потім монтажу внутрішньої роботи dd.img (я не думаю, що так ... але потрібна перевірка ...)?


Ви повинні використовувати SquashFSдля подібних речей. Він також видаляє копіювані файли.
Авіо

Схоже, цей хлопець робить те, про що ви питаєте: blogs.gnome.org/muelli/2012/10/…
Джошуа

Я другий пропозицією Авіо. Єдине, що squashfs не архівує - це acls. Він архівує xattrs, тому атрибути selinux тощо. Якщо ви не використовуєте acls, то squashfs - це спосіб дістати IMHO. Нещодавно мені довелося архівувати «про всяк випадок» деякі старі диски, які вже перенесені на нове сховище, і squashfs було ідеально підходить для роботи.
Kuba Ober

Відповіді:


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назва пристрою. Відповідно налаштуйте для вашої системи, якщо ви хочете зображення іншого пристрою.

Стиснення

Зробіть зображення «сквош», яке містить повне нестиснене зображення.

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

Потокове стиснення

Щоб уникнути створення окремого тимчасового файлу на повний розмір диска, ви можете передавати зображення в сквош.

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

Тепер у вас встановлене стиснене зображення, змонтуйте саме зображення (тобто всередині зображення тиску)

mkdir compressed_image
sudo mount squash_mount/sda1_backup.img compressed_image

Тепер ваше зображення встановлено під compressed_image.

EDIT: Якщо ви хочете , щоб просто відновити образ диска на розділ в цій точці (замість установки його для перегляду / читання вмісту), тільки 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

цікаво взяти на себе цю проблему (squashfs замість gzip). Я досить незнайомий з інструментами squashfs ... чи можете ви передати висновок dd, щоб створити сквош-розділ на льоту, як можна, з розділом gzip? які коефіцієнти стиснення (gzip нормально / добре, якщо враховувати той факт, що я очищаю "порожній простір з нулями")?
g19fanatic

як би ви видалили зображення на жорсткий диск?
g19fanatic

2
@ g19fanatic Нестиснене зображення диска "всередині" зображення сквошфу. Ви змонтуєте зображення squashfs, після чого додасте зображення всередині нього на цільовий диск.
doug65536

@ g19fanatic Стиснення було чудовим (майже таким же, як gzip в моєму випадку). mksquashfs також був швидким, він паралельний. У моєму 990x (6 ядрах) це було фактично обмежено швидкістю запису на диск, приблизно 100 Мб / сек.
doug65536

3
@ g19fanatic Ви можете передавати в сквошфи, використовуючи -pабо -pfпрапори, щоб передати йому псевдофайл. Псевдофайл можна використовувати для таких речей, як створення вузлів пристроїв, які в іншому випадку не можна обійтися без кореня (корисно для побудови зображень у рамках процесу збирання) або для передачі потоку виводу якоїсь команди в зображення. Одним із прикладів, наведених у документах ( /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К із образу диска у файл з назвою "введення" у зображенні squashfs.
Брайан Кемпбелл

15

Якщо зображення доступне лише для читання, ви також можете використовувати nbdkit ( man page ) та його 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, але не на gzipped необроблених зображеннях).
p91paul

2
Ця відповідь теж дуже цікава. Я вважаю, що сквош отримує більше кохання, тому що він більше усвідомлює. Я враз визнав ім'я, але ніколи не чув про архівну кількість. Мені доведеться теж постріляти!
g19fanatic

2
archivemount не дозволяє монтувати зображення, створене командоюdd if=/dev/hda conv=sync,noerror bs=64K | gzip -c > /mnt/sda1/hda.ddimg.gz
Сергій

3
Погоджено - під час написання, archivemount підтримує tar-архіви, які gzipped, але не звичайні gzipped файли.
mwfearnley

10

Ця відповідь доповнює відповідь Крістіана Цюпіту . Якщо ви використовуєте компресію xz з розумним розміром блоку, ви можете отримати доступ до зображення диска, використовуючи гостьову рибу або інші інструменти libguestfs, як це:

nbdkit xz file=disk.img.xz --run 'guestfish --format=raw -a $nbd -i'

8

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

Ви можете використовувати щось на кшталт dumpі restore(або tar, дійсно), всі вони використовують формат потокового потоку ... так що ви можете отримати доступ до окремих файлів, ефективно скануючи через нестиснений потік. Це означає, що якщо потрібний файл знаходиться в кінці стислого архіву, можливо, вам доведеться довго чекати, але це не вимагає, щоб ви фактично розпаковували все на диск.

Використання tarдля резервного копіювання може здатися трохи старомодним, але ви отримуєте велику гнучкість.


1
Проблема полягає в тому, що я навіть не знаю, чи цікавий файл насправді на цій стислий резервній копії ... Чи знаєте ви про провідник файлів, який пройде весь образ .gz'd, збережіть файл / dir структуру в пам'яті, надайте простий перегляд структури та дозволяйте «вибирати» файли (тепер, коли він знає, де вони існують) для вилучення? Це дуже ніша специфікація ... але я міг бачити безліч застосувань для чогось подібного ... якщо воно існує.
g19fanatic

1
Якщо це не так, чи зможете ви вказати мені якусь інструкцію про те, як витягти структуру із зображення gz'd? Я міг би створити таку програму (програму на життя ...), але я сліпий щодо теми декомпресії даних про зображення та специфіки різних файлових систем.
g19fanatic

Я підозрюю, що створення власного інструменту буде більшим проектом, ніж ви насправді хочете взяти на себе. Однак ... припускаючи, що у вас є файлова система ext [234], я б запропонував пакет e2fsprogs або, можливо, щось на зразок fuse-ext2 . Обидва надають користувальницький простір для взаємодії з файловими системами ext [234].
larsks

Також зауважте, що те, що у вас не є зображенням файлової системи, це зображення цілого диска, а це означає, що спочатку вам доведеться розібрати таблицю розділів і знайти відповідний розділ.
larsks

Я помилково вписав у вищезазначеному питанні і виправлю це. Зазвичай я роблю зображення на основі розділів і зберігаю копію таблиці розділів. Раніше я робив цілі дискові копії, але ненавиджу потребувати монтажу з параметрами, щоб дістатися до потрібного місця.
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/, і ви можете змонтувати їх, як зазвичай. Обов’язково використовуйте режим читання тільки ( -o ro), оскільки плагін xz підтримує лише зчитування:

mount -o ro /dev/mapper/nbd0p3 /mnt
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.