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


66

システムを初めてバックアップするときに、イメージバックアップを作成するのが好きです。この最初の時間の後、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をマウントすることはできますか(そうは思いませんが...検証が必要です)。


SquashFSこの種のものに使用する必要があります。また、重複したファイルを重複排除します。
Avio

この仲間はあなたが尋ねていることをしているように見えます:blogs.gnome.org/muelli/2012/10/…–
ジョシュア

私はAvioの提案を2回目にします。squashfsがアーカイブしない唯一のものはaclsです。xattrsをアーカイブするため、selinuxの属性などがあります。ACLを使用しない場合は、squashfsが私見になります。私は最近、「万が一に備えて」すでに新しいドライブに移行済みの古いドライブをアーカイブする必要がありましたが、squashfsはその仕事に最適でした。
キューバ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デバイスの名前はどこにあります。別のデバイスのイメージを作成する場合は、システムに応じて調整してください。

圧縮

完全な非圧縮画像を含む「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

編集:この時点で(コンテンツを参照/読み取りするためにマウントするのではなく)単にディスクイメージをパーティションに復元する場合は、を実行するのではなく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

この問題に対する興味深い見解(gzipではなくsquashfs)。私はsquashfsツールにあまり馴染みがありません... gzipパーティションでできるように、ddの出力をパイプしてsquashパーティションをその場で作成できますか?圧縮率は何ですか(gzipは大丈夫です、特に「ゼロのある空のスペース」をクリアしているという事実を考えると)?
g19fanatic

どのように画像をハードディスクに戻すのですか?
g19fanatic

2
@ g19fanatic非圧縮ディスクイメージは、squashfsイメージの「内部」にあります。squashfsイメージをマウントし、その中のイメージを宛先ディスクにddします。
doug65536

@ g19fanatic圧縮は優れていました(私の場合はgzipとほぼ同じです)。mksquashfsも高速で、並列化されています。私の990x(6コア)では、実際には宛先ディスクの書き込み速度(約100MB /秒)によって制限されていました。
doug65536

3
@ g19fanatic -pまたは-pfflagsを使用して、squashfsにストリームして、擬似ファイルを渡すことができます。擬似ファイルは、ルートなしでは実行できないデバイスノードの作成(ビルドプロセスの一部としてイメージをビルドするのに便利)や、コマンドへの出力をイメージにストリーミングするために使用できます。ドキュメント(/usr/share/doc/squashfs-tools/examples/pseudo-file.exampleDebian / Ubuntu上)で与えられている例の1つは、input f 444 root root dd if=/dev/sda1 bs=1024 count=10最初の10Kをディスクイメージからsquashfsイメージの「input」という名前のファイルにコピーすることです。
ブライアンキャンベル14

15

イメージが読み取り専用の場合、nbdkitman page)とそのxzプラグイン(xzはgzipよりも優れた圧縮とランダムアクセス時間を提供する必要があります)も使用できます。

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

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

--block-size16、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

+ を押して(またはkillでnbdkitを停止します。CtrlC


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は、Linuxを含むUnixバリアント用のFUSEベースのファイルシステムです。その目的は、アーカイブ(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が得られるため、他の場所にマウントする必要があると思います。代わりに、質問は両方を1つのステップでアンラップできるものを求めています(そして、archivemountは.tar.gzでそれを行うことができますが、gzip圧縮された生画像ではできません)。
p91paul

2
この答えも非常に興味深いものです。スカッシュはより多くの意識を持っているため、より多くの愛を得ると思います。私はすぐに名前を認識しましたが、archivemountについて聞いたことがありません。私も試してみる必要があります!
-g19fanatic

2
archivemountでは、コマンドによって作成されたイメージをマウントできませんdd if=/dev/hda conv=sync,noerror bs=64K | gzip -c > /mnt/sda1/hda.ddimg.gz
セルゲイ

3
合意-執筆時点では、archivemountはgzip圧縮されたtarアーカイブをサポートしていますが、プレーンなgzip圧縮されたファイルはサポートしていません。
mwfearnley

10

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

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

8

あんまり。圧縮ファイル内の特定のブロックを実際に解凍するには、まずすべてを解凍する必要があります。これにより、圧縮デバイスをブロックデバイスとして使用することが難しくなります。

dumpand restore(またはtar、実際)のようなものを使用することができます。これらはすべてストリーミング形式を使用します。そのため、非圧縮ストリームを効果的にスキャンして個々のファイルにアクセスできます。必要なファイルが圧縮アーカイブの最後にある場合、長い時間がかかるかもしれませんが、実際にすべてをディスクに解凍する必要はありません。

tarバックアップに使用するのは少し時代遅れのように思えるかもしれませんが、多くの柔軟性が得られます。


1
問題は、目的のファイルが実際にこの圧縮されたバックアップにあるかどうかさえわからないという事実にあります... .gz'dイメージ全体を通過するファイルエクスプローラを知っていますか、ファイル/ディレクトリを保持しますメモリ内の構造、構造の簡単なビューを提供し、抽出するファイルを「選択」できるようになりました(ファイルが存在する場所がわかったので)。その非常にニッチな仕様...しかし、もしそれが存在するなら、私はこのような何かのためのトンの使用を見ることができました。
g19fanatic

1
そうでない場合は、gzされた画像から構造を引き出す方法についてのいくつかの指示に向けて私を指すことができますか?私はそのようなプログラム(生計を立てるプログラム...)を作成することができますが、画像データの圧縮解除のトピックと異なるファイルシステムの詳細については盲目です。
-g19fanatic

独自のツールを構築することは、あなたが本当にやりたいと思っているよりも大きなプロジェクトになると思います。しかし... ext [234]ファイルシステムがあると仮定して、e2fsprogsパッケージ、またはfuse-ext2のようなものをお勧めします。どちらも、ext [234]ファイルシステムと対話するためのユーザースペースツールを提供します。
ラースク

また、持っているものはファイルシステムイメージではないように見えます。ディスクイメージ全体であるため、最初にパーティションテーブルを解析して適切なパーティションを見つける必要があります。
ラースク

上記の質問の入力ミスを修正します。私は通常、パーティションベースのddイメージを作成し、パーティションテーブルのコピーを保存します。以前はディスク全体をコピーしていましたが、適切な場所に到達するためにオプションを使用してマウントする必要が嫌でした。
-g19fanatic

3

Cristian Ciupituの答えへの別の補遺:

完全なディスクイメージ(パーティションイメージ)nbdkitをマウントするために使用する場合、NBDサーバーに接続するときにブロックサイズ(ディスクのセクターサイズ)を指定する必要がある場合があります。デフォルトはバイトです。代わりにバイトを使用するには:1024512

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

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

kpartx -arv /dev/nbd0

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

mount -o ro /dev/mapper/nbd0p3 /mnt
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.