web-dev-qa-db-ja.com

その場でgzip圧縮されたddイメージをマウントすることは可能ですか?

システムを初めてバックアップするときに、イメージバックアップを作成するのが好きです。この後、rsyncを使用して増分バックアップを実行します。

私の通常のイメージバックアップは次のとおりです。

空のスペースをマウントしてゼロにします。

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

rm temp.dd

ドライブを圧縮しながらアンマウントして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するためのストレージスペースがないが、イメージをマウントして個々のファイルをそこから取り出したいとします。これは可能ですか?

通常は、ddイメージを圧縮しないため、-o loop...を使用してイメージをマウントできますが、これは私のケースではありません...

その場で圧縮されたimgをマウントするための提案はありますか?

[〜#〜] avfs [〜#〜] を使用してgzファイルを「マウント」し、内部のdd.img作業をマウントします(そうは思いませんが...確認が必要です)。 ..)?

72
g19fanatic

これは、ディスクイメージが完全なディスクイメージであるか、単にパーティションであるかによって異なります。

パーティションの洗浄

ディスクの状態が良好な場合、ディスクの空のスペースをゼロで洗浄すると、圧縮率が向上します。ディスクに障害が発生している場合は、この手順をスキップしてください。

ディスク全体をイメージングする場合は、ディスク上の各パーティションをウォッシュする必要があります。

注意:マウントされたパーティションの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_の下にマウントされました。

編集:この時点でディスクイメージをパーティションに単に復元したい場合は(マウントして内容を参照/読み取るのではなく)、__($ var] _のイメージを_squash_mount/sda1_backup.img_のイメージではなく、宛先に単にddmountを実行しています。

圧縮されたフルディスクイメージのマウント

これには、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
_
71
doug65536

試す 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を含むUnixバリアント用のFuseベースのファイルシステムです。その目的は、アーカイブ(つまり、tar、tar.gzなど)を他のファイルシステムと同様に読み書きできるマウントポイントにマウントすることです。これにより、圧縮されている可能性のあるアーカイブの内容に、解凍することなく他のプログラムから透過的にアクセスできます。

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

アーカイブをマウントした後、通常のファイルのようにコンテンツを使用できます。おそらく、qemuツールを使用して、パーティションテーブルを取得するか、マウントイメージを変換します。

squashfsはイメージからの起動には便利ですが、バックアップには非常に複雑です。

18
eri

画像がread-onlyの場合、 nbdkitman page )およびその xz plugin (xzは、より優れた圧縮とランダムアクセス時間を提供する必要がありますgzip)。

圧縮パーティションイメージを作成する

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

--block-sizeオプションの16 MiBは、優れたランダムアクセスパフォーマンスを提供します。

注:並列圧縮を提供する pixz などの代替xz圧縮プログラムを使用できます。出力が複数の小さなブロック、それ以外の場合nbdkitは、大量のデータを解凍する必要があります。たとえば、2015年9月現在、 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を使用)。

16

この答えは Cristian Ciupituの答え を補完します。 If妥当なブロックサイズでxz圧縮を使用する場合、 guestfish または他の を使用してディスクイメージにアクセスできますlibguestfs このようなツール:

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

[〜#〜] update [〜#〜]:xzはプラグインではなくなったため、フィルターになっているため、コマンドは次のようになります。

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

あんまり。最初に全体を解凍しないと、圧縮ファイル内の特定のブロックをシークできないため、圧縮イメージをブロックデバイスとして使用することが困難になります。

dumprestore(または実際にはtar)のようなものを使用できます。これらはすべてストリーミング形式を使用しています...非圧縮ストリーム。つまり、必要なファイルが圧縮アーカイブの最後にある場合、待機するのに長い時間がかかる可能性がありますが、実際にすべてをディスクに解凍する必要はありません。

バックアップにtarを使用するのは少し時代遅れに思えるかもしれませんが、柔軟性が大幅に向上します。

8
larsks

Cristian Ciupituの回答への別の補遺

nbdkitを使用してフルディスクイメージ(vs.パーティションイメージ)をマウントする場合、ブロックサイズ( NBDサーバーに接続するとき、デフォルトでは1024バイトになるため、ディスクのセクターサイズ)。代わりに512バイトを使用するには:

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

その後、ディスクは/dev/nbd0として表示され、fdisk -lを使用してパーティションテーブルを表示できるはずです。ただし、パーティションはまだマウントできません-kpartxdoug65536の回答 から)を使用して、パーティション用のデバイスを作成します。例:

kpartx -arv /dev/nbd0

最後に、パーティションが/dev/mapper/に表示され、通常どおりにマウントできます。 xzプラグインは読み取りのみをサポートするため、必ず読み取り専用モード(-o ro)を使用してください。

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