Apakah mungkin untuk memasang gambar gzip terkompresi gzip dengan cepat?

66

Saya suka membuat cadangan gambar untuk pertama kalinya saya mencadangkan sistem. Setelah ini pertama kali saya menggunakan rsync untuk melakukan backup tambahan.

Cadangan gambar saya yang biasa adalah sebagai berikut:

Pasang dan kosongkan ruang kosong:

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

rm temp.dd

umount dan dd drive saat mengompresnya

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

untuk mengembalikan sistem ke normal, saya biasanya akan melakukan

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

Ini sangat mudah dan memungkinkan saya untuk menyimpan 'seluruh drive' tetapi benar-benar hanya menghemat ruang yang digunakan.

Inilah masalahnya. Katakanlah saya melakukan hal di atas tetapi tidak pada sistem yang bersih dan tidak mendapatkan backup rsync segera dan ada file yang ingin saya akses yang ada di gambar. Katakanlah saya tidak memiliki ruang penyimpanan untuk benar-benar unzip dan dd gambar ke drive tetapi ingin me-mount gambar untuk mendapatkan file individual darinya .... Apakah ini mungkin?

Biasanya, seseorang tidak akan memampatkan gambar dd, yang akan memungkinkan Anda untuk hanya memasang gambar menggunakan -o loop... tapi ini bukan kasus saya ...

Ada saran untuk memasang img yang dikompresi dengan cepat?

Apakah menggunakan AVFS untuk 'me-mount' file gz kemudian memasang dd.img internal berfungsi (saya tidak berpikir begitu ... tetapi akan memerlukan verifikasi ...)?

g19fanatic
sumber
Anda harus menggunakannya SquashFSuntuk hal-hal semacam ini. Ini juga menghapus duplikasi file.
Avio
Sepertinya orang ini melakukan apa yang Anda tanyakan: blogs.gnome.org/muelli/2012/10/…
Joshua
Saya kedua saran Avio. Satu-satunya hal yang tidak diarsipkan oleh squashf adalah ACL. Ini arsip xattrs, atribut selinux, dll. Jika Anda tidak menggunakan acl, maka squashfs adalah cara untuk pergi IMHO. Saya baru-baru ini harus mengarsipkan "untuk berjaga-jaga" beberapa drive lama yang telah dimigrasi ke penyimpanan baru, dan squashfs sempurna untuk pekerjaan itu.
Kuba Ober

Jawaban:

66

Itu tergantung pada apakah gambar disk adalah gambar disk penuh, atau hanya sebuah partisi.

Mencuci partisi

Jika disk dalam kondisi kerja yang baik, Anda akan mendapatkan kompresi yang lebih baik jika Anda mencuci ruang kosong pada disk dengan nol. Jika disk gagal, lewati langkah ini.

Jika Anda menggambar seluruh disk maka Anda ingin mencuci setiap partisi pada disk.

PERHATIAN: Hati-hati, Anda ingin mengatur ofke file yang di partisi mount, TIDAK PARTISI ITU SENDIRI!

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

Membuat Gambar Partisi

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

Di mana sdanama perangkat, dan 1nomor partisi. Sesuaikan sesuai dengan sistem Anda jika Anda ingin gambar perangkat atau partisi yang berbeda.

Membuat Gambar Disk Utuh

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

Di mana sdanama perangkat. Sesuaikan sesuai dengan sistem Anda jika Anda ingin gambar perangkat yang berbeda.

Kompresi

Buat gambar "squashfs" yang berisi gambar penuh yang tidak dikompresi.

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

Kompresi Streaming

Untuk menghindari membuat file sementara yang terpisah menjadi ukuran penuh disk, Anda dapat melakukan streaming ke gambar squashfs.

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

Memasang gambar partisi terkompresi

Pertama-tama pasang gambar squashfs, kemudian pasang gambar partisi yang disimpan dalam gambar squashfs yang dipasang.

mkdir squash_mount
sudo mount squash.img squash_mount

Sekarang Anda memiliki gambar terkompresi terpasang, pasang gambar itu sendiri (yang ada di dalam gambar squashfs)

mkdir compressed_image
sudo mount squash_mount/sda1_backup.img compressed_image

Sekarang gambar Anda sudah terpasang di bawah compressed_image.

EDIT: Jika Anda hanya ingin mengembalikan gambar disk ke partisi pada saat ini (bukannya memasangnya untuk menelusuri / membaca konten), hanya ddgambar di squash_mount/sda1_backup.imgke tujuan daripada melakukan mount.

Memasang gambar disk penuh yang dikompresi

Ini mengharuskan Anda untuk menggunakan paket yang disebut kpartx. kpartx memungkinkan Anda untuk memasang partisi individual dalam gambar disk penuh.

sudo apt-get install kpartx

Pertama, pasang partisi tergencet Anda yang berisi gambar disk penuh

mkdir compressed_image
sudo mount squash.img compressed_image

Sekarang Anda perlu membuat perangkat untuk setiap partisi di gambar disk lengkap:

sudo kpartx -a compressed_image/sda_backup.img

Ini akan membuat perangkat untuk partisi di gambar disk penuh di /dev/mapper/loopNpPmana N adalah nomor yang ditetapkan untuk perangkat loopback, dan P adalah nomor partisi. Sebagai contoh: /dev/mapper/loop0p1.

Sekarang Anda memiliki cara untuk memasang partisi individual di gambar disk lengkap:

mkdir fulldisk_part1
sudo mount /dev/mapper/loop0p1 fulldisk_part1
doug65536
sumber
menarik mengambil masalah ini (squashfs bukannya gzip). Saya cukup asing dengan alat squashfs ... bisakah Anda menyalurkan output dari dd untuk membuat partisi squash dengan cepat sebanyak yang Anda bisa dengan partisi gzip? apa rasio kompresi (gzip tidak apa-apa / bagus, terutama mengingat fakta bahwa saya sedang membersihkan 'ruang kosong dengan nol')?
g19fanatic
bagaimana Anda akan mengembalikan gambar ke hard disk?
g19fanatic
2
@ g19fanatic Gambar disk yang tidak dikompresi adalah "di dalam" gambar squashfs. Anda memasang gambar squashfs, lalu dd gambar di dalamnya ke disk tujuan.
doug65536
@ g19fanatic Kompresi sangat bagus (hampir sama dengan gzip dalam kasus saya). mksquashfs juga cepat, itu diparalelkan. Pada 990x (6 core) saya sebenarnya dibatasi oleh kecepatan penulisan disk tujuan, sekitar 100MB / detik.
doug65536
3
@ g19fanatic Anda dapat streaming ke squashfs menggunakan tanda -patau -pfflag untuk memberikannya file pseudo. File pseudo dapat digunakan untuk hal-hal seperti membuat node perangkat yang tidak dapat Anda lakukan tanpa root (berguna untuk membangun gambar sebagai bagian dari proses build) atau untuk mengalirkan output dari beberapa perintah ke dalam gambar. Salah satu contoh yang diberikan dalam dokumen ( /usr/share/doc/squashfs-tools/examples/pseudo-file.examplepada Debian / Ubuntu) adalah input f 444 root root dd if=/dev/sda1 bs=1024 count=10menyalin 10K pertama dari gambar disk ke file bernama "input" di gambar squashfs.
Brian Campbell
15

Jika gambar hanya-baca, Anda juga dapat menggunakan nbdkit ( halaman manual ) dan plugin xz -nya (xz akan memberikan kompresi yang lebih baik dan waktu akses acak daripada gzip).

Buat gambar partisi terkompresi

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

Sebuah --block-sizepilihan dari 16 MiB harus memberikan kinerja akses yang baik random.

Catatan: Anda dapat menggunakan program kompresi xz alternatif seperti pixz yang menyediakan kompresi paralel, hanya pastikan itu membagi output dalam beberapa blok kecil, jika tidak nbdkit harus mendekompresi banyak data. Misalnya per September 2015, pxz tidak mendukung ini.

Sajikan dengan nbdkit

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

Terhubung ke server NBD

nbd-client 127.0.0.1 10809 /dev/nbd0 -nofork

Pasang hanya-baca

mount -o ro /dev/nbd0 sda1

Ketika selesai

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

Hentikan nbdkit dengan menekan Ctrl+ C(atau dengan kill ).

Cristian Ciupitu
sumber
15

Mencoba 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 adalah sistem file berbasis FUSE untuk varian Unix, termasuk Linux. Tujuannya adalah untuk me-mount arsip (yaitu tar, tar.gz, dll.) Ke titik mount di mana ia dapat dibaca atau ditulis seperti halnya dengan sistem file lainnya. Ini membuat mengakses konten arsip, yang dapat dikompresi, transparan ke program lain, tanpa mendekompresnya.

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

Setelah memasang arsip, Anda dapat menggunakannya konten seperti file biasa. Mungkin mendapatkan tabel partisi, atau mengonversi, me-mount gambar dengan alat qemu.

squashfs berguna untuk mem-boot dari gambar, tetapi jauh lebih rumit untuk pencadangan.

eri
sumber
Sempurna! Ini adalah solusi paling mudah dan elegan sejauh ini. Saya heran mengapa tidak ada suara di sini.
TranslucentCloud
Saya pikir itu karena jika Anda me-mount arsip seperti disk.img.gz pada folder dengan archivemount, katakan / mnt /, Anda akan mendapatkan satu file /mnt/disk.img, maka Anda harus memasang di tempat lain. Pertanyaannya bukannya menginginkan sesuatu yang dapat membuka keduanya dalam satu langkah (dan archivemount tampaknya mampu melakukannya di .tar.gz, tetapi tidak pada gambar mentah yang di-gzip).
p91paul
2
Jawaban ini juga sangat menarik. Saya percaya squashfs mendapatkan lebih banyak cinta karena memiliki lebih banyak kesadaran. Saya langsung mengenali namanya tetapi belum pernah mendengar tentang archivemount. Saya harus mencobanya juga!
g19fanatic
2
archivemount tidak mengizinkan untuk memasang gambar yang dibuat dengan perintahdd if=/dev/hda conv=sync,noerror bs=64K | gzip -c > /mnt/sda1/hda.ddimg.gz
Sergei
3
Setuju - pada saat penulisan, archivemount mendukung arsip tar yang di-gzip, tetapi bukan file gzip yang biasa.
mwfearnley
10

Jawaban ini melengkapi jawaban Cristian Ciupitu . Jika Anda menggunakan kompresi xz dengan ukuran blok yang masuk akal, Anda dapat mengakses disk image menggunakan guestfish atau alat libguestfs lainnya seperti ini:

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

Tidak juga. Anda tidak dapat benar-benar mencari blok tertentu dalam file terkompresi tanpa mendekompres semuanya terlebih dahulu, yang membuatnya sulit untuk menggunakan gambar terkompresi sebagai perangkat blok.

Anda dapat menggunakan sesuatu seperti dumpdan restore(atau tar, sungguh), yang semuanya menggunakan format streaming ... sehingga Anda dapat mengakses file invidividual dengan secara efektif memindai melalui aliran yang tidak terkompresi. Ini berarti jika file yang Anda inginkan ada di akhir arsip terkompresi, Anda mungkin memiliki waktu lama untuk menunggu, tetapi itu tidak mengharuskan Anda untuk benar-benar mendekompresi semua ke disk.

Menggunakan taruntuk cadangan mungkin tampak agak kuno, tetapi Anda mendapatkan banyak fleksibilitas.

larsks
sumber
1
Masalahnya terletak pada kenyataan bahwa saya bahkan tidak tahu apakah file yang menarik sebenarnya ada di cadangan terkompresi ini ... Apakah Anda tahu file explorer yang akan melalui keseluruhan gambar .gz, simpan file / dir struktur dalam memori, memberikan tampilan sederhana dari struktur dan memungkinkan Anda untuk 'mengambil' file (sekarang tahu di mana mereka ada) untuk mengekstrak? Ini spesifikasi yang sangat khusus ... tapi saya bisa melihat banyak kegunaan untuk sesuatu seperti ini ... jika ada.
g19fanatic
1
Jika tidak, apakah Anda bisa mengarahkan saya ke beberapa instruksi tentang cara menarik struktur dari gambar gz? Saya akan dapat membuat program seperti itu (program untuk mencari nafkah ...) tetapi saya buta pada topik dekompresi data gambar dan spesifikasi sistem file yang berbeda.
g19fanatic
Saya menduga bahwa membangun alat Anda sendiri akan menjadi proyek yang lebih besar daripada yang benar-benar ingin Anda lakukan. Namun ... dengan asumsi Anda memiliki sistem file ext [234], saya akan menyarankan paket e2fsprogs , atau mungkin sesuatu seperti fuse-ext2 . Keduanya menyediakan alat ruang pengguna untuk berinteraksi dengan sistem file ext [234].
larsks
Perhatikan juga bahwa apa yang Anda miliki tampaknya bukan gambar sistem file, ini adalah keseluruhan gambar disk, yang berarti Anda pertama-tama harus menguraikan tabel partisi dan mencari partisi yang sesuai.
larsks
Saya salah ketik dalam pertanyaan di atas dan akan memperbaikinya. Saya biasanya melakukan gambar berbasis partisi dan menyimpan salinan tabel partisi. Saya biasa melakukan copy seluruh disk tetapi benci perlu me-mount dengan opsi untuk sampai ke lokasi yang tepat.
g19fanatic
3

Addendum lain untuk jawaban Cristian Ciupitu ini :

Jika Anda menggunakan nbdkituntuk me-mount gambar disk penuh (vs gambar partisi), Anda mungkin perlu menentukan ukuran blok (ukuran sektor disk) saat menghubungkan ke server NBD, karena default ke 1024byte. Untuk menggunakan 512byte sebagai gantinya:

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

Setelah itu, disk akan muncul sebagai /dev/nbd0, dan Anda harus dapat melihat tabel partisi menggunakan fdisk -l. Namun, partisi belum dapat di- mount - Gunakan kpartx(dari jawaban doug65536 ) untuk membuat perangkat untuk partisi, mis::

kpartx -arv /dev/nbd0

Akhirnya, partisi akan muncul /dev/mapper/, dan Anda dapat memasang mereka seperti biasa. Pastikan untuk menggunakan mode readonly ( -o ro), karena plugin xz hanya mendukung reads:

mount -o ro /dev/mapper/nbd0p3 /mnt
friederbluemle
sumber