Bir gzip sıkıştırılmış dd görüntüsünü anında monte etmek mümkün mü?


66

Bir sistemi yedeklediğim için ilk defa bir görüntü yedekleme oluşturmayı seviyorum. Bu ilk seferden sonra artımlı yedekleme yapmak için rsync kullanıyorum.

Her zamanki imaj yedeklemem şöyle:

Boş alanı yerleştirin ve sıfırlayın:

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

rm temp.dd

sıkıştırırken sürücüyü umount ve dd

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

sistemi normale döndürmek için genellikle

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

Bu gerçekten basittir ve 'tüm sürücüyü' kaydetmeme izin verir, ancak gerçekten sadece kullanılmış alanı kurtarır.

İşte problem. Diyelim ki yukarıdakileri temizleyemem ama temiz bir sistemde değil ve rsync yedeklemelerini çok yakında göremiyorum ve erişmek istediğim dosyalar görüntüde. Diyelim ki görüntüyü sürücüye açıp dd ayıracak bir depolama alanına sahip değilim, ancak tek tek dosyaları çıkarmak için görüntüyü bağlamak istiyorum. Bu mümkün mü?

Normalde, kişi dd görüntüsünü sıkıştırmaz, bu da kullanarak görüntüyü bağlamanıza izin verir -o loop... ama bu benim durumum değil ...

Sıkıştırılmış imgeyi anında monte etmek için herhangi bir öneriniz var mı?

Gz dosyasını 'monte etmek' için AVFS kullanmak ve ardından dd.img dahili çalışmasını monte etmek mi istiyorsunuz (sanmıyorum ... ama doğrulamaya ihtiyacım var ...)?


SquashFSBu tür şeyler için kullanmalısın . Aynı zamanda kopyalanan dosyaları da çıkarır.
Avio

Bu adam ne istediğinizi yapıyor gibi görünüyor: blogs.gnome.org/muelli/2012/10/…
Joshua

Avio'nun önerisini ikinci olarak öğrendim. Squashfs'ın arşivlemediği tek şey acls. Xattr'leri, yani selinux özniteliklerini vb. Arşivler. Eğer acls kullanmazsanız, squashfs IMHO'ya gitmenin yoludur. Kısa süre önce, yeni depolamaya geçirilmiş bazı eski diskleri arşivlemek zorunda kaldım ve squashfs bu iş için mükemmeldi.
Kuba Ober

Yanıtlar:


66

Bu, disk görüntüsünün bir tam disk görüntüsü mü yoksa sadece bir bölüm mü olduğuna bağlıdır.

Bölmelerin yıkanması

Disk iyi durumda ise, diskteki boş alanı sıfırlarla yıkarsanız daha iyi sıkıştırma elde edersiniz. Disk arızalıysa, bu adımı atlayın.

Diskin tamamını görüntülüyorsanız, diskteki bölümlerin her birini yıkamak isteyeceksiniz.

DİKKAT: Dikkat edin, takılan bölümdeki ofbir dosyaya ayarlamak istiyorsunuz , KISIM DEĞİL!

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

Bölüm Görüntüsü Oluşturma

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

Nerede sdacihazın adıdır ve 1bölüm numarasıdır. Farklı bir cihaz veya bölüm görüntülemek istiyorsanız sisteminize göre ayarlayın.

Tam Disk Görüntüsü Oluşturma

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

sdaCihazın adı nerede . Farklı bir cihaz görüntülemek istiyorsanız, sisteminize göre ayarlayın.

Sıkıştırma

Tam sıkıştırılmamış görüntüyü içeren bir "squashfs" görüntüsü yapın.

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

Akış Sıkıştırma

Diskin tam boyutunu ayrı bir geçici dosya yapmaktan kaçınmak için bir squashfs görüntüsüne aktarabilirsiniz.

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

Sıkıştırılmış bölüm görüntüsünün monte edilmesi

Önce squashfs görüntüsünü, ardından da monte squashfs görüntüsünde depolanan bölüm görüntüsünü bağlayın.

mkdir squash_mount
sudo mount squash.img squash_mount

Artık sıkıştırılmış görüntünün monte edilmesini sağlayın, görüntünün kendisini yerleştirin (squashfs görüntüsünün içindedir).

mkdir compressed_image
sudo mount squash_mount/sda1_backup.img compressed_image

Şimdi resminiz altına yerleştirildi compressed_image.

EDIT: Eğer disk görüntüsünü bu noktada bir bölüme geri yüklemek istiyorsanız (içeriğe göz atmak / okumak yerine monte etmek yerine), sadece yapmak yerine sadece hedefteki ddgörüntüyü squash_mount/sda1_backup.imgseçin mount.

Sıkıştırılmış bir tam disk görüntüsünün takılması

Bu kpartx adlı bir paket kullanmanızı gerektirir. kpartx, tek tek bölümleri tam disk görüntüsünde monte etmenizi sağlar.

sudo apt-get install kpartx

İlk önce, tam disk görüntüsünü içeren ezilmiş bölümünüzü takın

mkdir compressed_image
sudo mount squash.img compressed_image

Şimdi, tam disk görüntüsündeki bölümlerin her biri için aygıtlar oluşturmanız gerekir:

sudo kpartx -a compressed_image/sda_backup.img

Bu, tam geri dönme diskindeki bölümler için cihazlar oluşturacaktır, /dev/mapper/loopNpPburada N geridöngü cihazı için atanan sayıdır ve P , bölüm numarasıdır. Örneğin: /dev/mapper/loop0p1.

Artık tek tek bölümleri tam disk görüntüsüne takmanın bir yolu var:

mkdir fulldisk_part1
sudo mount /dev/mapper/loop0p1 fulldisk_part1

Bu sorunu ilginç ele almak (gzip yerine squashfs). Squashfs araçlarını çok iyi bilmiyorum ... gdip bölümü ile mümkün olduğu kadar anında squash bölümü oluşturmak için dd çıktısını alabilir misiniz? Sıkıştırma oranları nedir (gzip tamam / iyi, esp 'sıfır alanlı boş alanı temizlememe rağmen)?
g19fanatic

görüntüyü sabit diske nasıl geri koyarsınız?
g19fanatic

2
@ g19fanatic Sıkıştırılmamış bir disk görüntüsü squashfs görüntüsünün "içinde" dır. Squashfs görüntüsünü monte edersiniz, içindeki görüntüyü hedef diske dd.
doug65536

@ g19fanatic Sıkıştırma mükemmeldi (benim durumumdaki gzip ile neredeyse aynıydı). mksquashfs de hızlıydı, paralelleştirildi. 990x'imde (6 çekirdekli), hedef disk yazma hızı 100MB / sn civarındaydı.
doug65536

3
@ g19fanatic Sahte bir dosya iletmek için -pya da -pfbayraklarını kullanarak squashfslere akış yapabilirsiniz . Kök olmadan yapamayacağınız cihaz düğümleri yapmak (bir derleme işleminin bir parçası olarak görüntüler oluşturmak için kullanışlıdır) veya bazı komutların çıktısını görüntüye aktarmak için sözde bir dosya kullanılabilir. Belgelerde ( /usr/share/doc/squashfs-tools/examples/pseudo-file.exampleDebian / Ubuntu'da) verilen örneklerden biri input f 444 root root dd if=/dev/sda1 bs=1024 count=10, ilk 10K'yı bir disk görüntüsünden squashfs görüntüsünde "input" adlı bir dosyaya kopyalamaktır.
Brian Campbell,

15

Eğer görüntü salt okunur ise, nbdkit ( man page ) ve xz eklentisini de kullanabilirsiniz (xz, gzip'ten daha iyi sıkıştırma ve rasgele erişim süreleri sağlamalıdır).

Sıkıştırılmış bölüm görüntüsünü oluşturun

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

--block-size16 MiB bir seçenek iyi rastgele erişim performansı sağlamalıdır.

Not: paralel sıkıştırma sağlayan pixz gibi alternatif xz sıkıştırma programlarını kullanabilirsiniz , çıktıyı çok sayıda küçük bloğa böldüğünden emin olun, aksi takdirde nbdkit çok fazla veriyi sıkıştırmak zorunda kalır . Örneğin Eylül 2015 itibariyle, pxz bunu desteklemiyor.

Nbdkit ile servis yapın

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

NBD sunucusuna bağlan

nbd-client 127.0.0.1 10809 /dev/nbd0 -nofork

Salt okunur monte

mount -o ro /dev/nbd0 sda1

Ne zaman yapılır

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

+ (Veya kill ile ) düğmesine basarak nbdkit'i durdurun .CtrlC


15

Deneyin 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, Linux dahil Unix değişkenleri için FUSE tabanlı bir dosya sistemidir. Amacı, arşivleri (yani tar, tar.gz, vb.) Başka herhangi bir dosya sistemindeki gibi okunabileceği veya yazılabileceği bir bağlama noktasına monte etmektir. Bu, sıkıştırılmış olan ve diğer programlara saydam olmayan, arşivine dekompresyon yapmadan içeriğe erişmeyi sağlar.

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

Arşivi kurduktan sonra normal dosya gibi içeriğini kullanabilirsiniz. Belki qemu araçlarıyla bölümleme tablosu elde edebilir veya görüntüyü takabilirim.

görüntüden önyükleme yapmak için yararlı olan, ancak yedekleme için çok karmaşık olan squashfs'ler.


Mükemmel! Bu, şu ana kadarki en kolay ve zarif çözüm. Burada neden oy kullanılmadığını merak ediyorum.
TranslucentCloud

Bunun nedeni, disk.img.gz gibi bir arşivi archivemount olan bir klasöre takarsanız, / mnt / diyelim, /mnt/disk.img adlı tek bir dosya elde edersiniz, o zaman başka bir yere monte etmek zorunda kalırsınız. Bunun yerine soru, her ikisini de tek bir adımda açabilecek bir şey istiyor (ve archivemount .tar.gz'de bunu yapabiliyor gibi görünüyor, ama ham görüntüler üzerinde değil).
p91paul

2
Bu cevap da çok ilginç. Squashfs'ın daha fazla sevildiğine inanıyorum çünkü daha fazla farkındalığı var. Adı hemen tanıdım ancak archivemount'u hiç duymadım. Ben de bir şans vermem gerekecek!
g19fanatic 16:15

2
archivemount, komut tarafından oluşturulan bir görüntünün kurulmasına izin vermezdd if=/dev/hda conv=sync,noerror bs=64K | gzip -c > /mnt/sda1/hda.ddimg.gz
Sergei

3
Kabul edildi - yazarken, archivemount gziplenmiş, ancak gzipli dosyaları olmayan tar arşivlerini destekler.
mwfearnley

10

Bu cevap Cristian Ciupitu'nun cevabını tamamlıyor . Eğer makul bir blok boyutu ile xz sıkıştırma kullanmak, kullandığınız disk görüntüsünü erişebilir guestfish veya diğer libguestfs bu gibi araçları:

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

8

Pek sayılmaz. Öncelikle her şeyi açmadan sıkıştırılmış dosyadaki belirli bir bloğu arayamazsınız, bu da sıkıştırılmış görüntünün bir blok aygıtı olarak kullanılmasını zorlaştırır.

Hepsi bir akış formatı kullanan dumpve restore(veya tar, gerçekten) gibi bir şey kullanabilirsiniz ... böylece sıkıştırılmamış akışta etkin bir şekilde tarayarak kişisel dosyalara erişebilirsiniz. İstediğiniz dosya sıkıştırılmış arşivin sonundaysa, beklemek için uzun zamanınız olabilir, ancak gerçekte her şeyi diske sıkıştırmanız gerekmez.

tarYedeklemeler için kullanmak biraz eski görünebilir, ancak çok fazla esneklik elde edersiniz.


1
Sorun, ilgilenilen dosyanın gerçekte bu sıkıştırılmış yedeklemede olup olmadığını bile bilmememden kaynaklanıyor ... Tüm .gz'd görüntüsünü kullanacak bir dosya gezgini biliyor musunuz, dosyayı / dizini saklayın bellekteki yapı, yapının basit bir görüntüsünü sağlar ve dosyaları ('nerede olduklarını bildiğini biliyor) çıkarmanızı sağlar. Bu çok özel bir özellik ... ama eğer böyle bir şey için tonlarca kullanım görebilirdim ... eğer varsa.
g19fanatic

1
Olmazsa, yapının gz'd görüntüsünden nasıl çekileceği konusunda bana bazı talimatlar gösterebilir misiniz? Böyle bir program (yaşam için bir program ...) oluşturabilirim ama görüntü verilerini açma ve farklı dosya sistemlerinin özelliklerini göz ardı ediyorum.
g19fanatic

Kendi aracınızı oluşturmanın gerçekten üstlendiğinizden daha büyük bir proje olacağından şüpheleniyorum. Ancak, bir ext [234] dosya sistemine sahip olduğunuzu varsayarak, e2fsprogs paketini veya belki de sigorta-ext2 gibi bir şey öneririm . Her ikisi de ext [234] dosya sistemiyle etkileşimde bulunmak için kullanıcı alanı araçları sağlar.
larsks

Ayrıca, sahip olduklarınızın bir dosya sistemi görüntüsü olarak görünmediğini, bunun bir disk görüntüsünün tamamı olduğunu unutmayın; bu, önce bölüm tablosunu ayrıştırmanız ve uygun bölümü bulmanız gerektiği anlamına gelir.
larsks

Yukarıdaki soruyu yanlış yazdım ve düzelteceğim. Genellikle bir bölüm tabanlı gd görüntüsü yaparım ve bölüm tablosunun bir kopyasını kaydederim. Tüm disk kopyalarını kullanırdım, ancak uygun konuma ulaşmak için seçeneklerle montaj yapmaktan nefret ederim.
g19fanatic

3

Cristian Ciupitu'nun cevabına başka bir zeyilname :

Eğer kullanırsanız nbdkitbir monte etmek tam disk imajını (bir bölümü resimde vs) kullanarak, NBD sunucusuna bağlanırken, blok boyutu (diskin sektör boyutu) belirtmeniz gerekir için bunun yanı varsayılan olabilir 1024bayt. Bunun 512yerine bayt kullanmak için:

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

Bundan sonra, disk olarak görünecek /dev/nbd0ve kullanarak bölüm tablosunu görüntüleyebilmelisiniz fdisk -l. Ancak, bölümler henüz monte edilemez - Bölümler için aygıtlar oluşturmak için kullanın kpartx( doug65536'nın yanıtından ), örneğin:

kpartx -arv /dev/nbd0

Son olarak, bölümler görünecektir /dev/mapper/ve bunları her zamanki gibi bağlayabilirsiniz. -o roXz eklentisi yalnızca okumaları desteklediğinden, salt okunur modu ( ) kullandığınızdan emin olun.

mount -o ro /dev/mapper/nbd0p3 /mnt
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.