![Linux 上の圧縮ディスクイメージ](https://rvso.com/image/1267762/Linux%20%E4%B8%8A%E3%81%AE%E5%9C%A7%E7%B8%AE%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8.png)
ハードディスクの容量がかなり大きい新しいコンピュータを入手しました。重要なファイルはすべてコピーしたと思いますが、念のため、古いディスクのディスク イメージを保存しておきたいと思います。スペースを節約するために、ディスクを圧縮したいのですが、圧縮イメージをマウントするオプションが見つかりません。
私の目標:
- 結果に簡単にアクセスできる必要があります
- 何かにアクセスする前に全体を解凍する必要はありません
- ファイルはすぐに見つけられる必要があります - TAR/CPIO アーカイブは不要です
- 必要なスペースは、ファイルをコピーするだけの場合よりも少なくなります。
したがって、理想的には、ファイル内に作成でき、自動的に拡張できる、読み取り専用の圧縮ファイル システムを探しています。
答え1
次のような法医学分析ソフトウェアを使用するガイマガー(オープンソース、sourceforge.net) ハードディスク全体の圧縮ディスクイメージを素早く作成できる優れた UI を備えています。
「高度なフォレンジック イメージ (.aff)」を使用します。これにより、単一の圧縮ファイルが作成されます (.info ファイルも作成されます)。
デフォルトの圧縮率 1 (最も高速だが圧縮率は最も低い) を変更するには、多数のコアを持つ高速なコンピューターを使用している場合は、以下を作成してこれを変更できます/etc/guymager/local.cfg
。
AffCompression = 3
9
最も優れていますが、最も遅い圧縮方法です。3
優れた圧縮と優れたパフォーマンスを実現します。
アップデート
取り付けは見た目ほど簡単ではありません。まず、アフリブ(Ubuntu:aptitude install afflib-tools
)。これで、rawディスクイメージを取得できます。[affuse][3] <image> <mount-point>
しかし、何らかの理由で、生のイメージのマウントに失敗します。parted
最初のパーティションは1048576B
次のように始まりますが、
mount -t ext4 -o loop,ro,offset=1048576 /mnt/backup.raw /mnt/backup
いつもの役に立たないマウントエラーで失敗します:
mount: wrong fs type, bad option, bad superblock on /dev/loop0,
missing codepage or helper program, or other error
In some cases useful info is found in syslog - try
dmesg | tail or so
そしてdmesg
こう言う。
EXT4-fs (loop0): VFS: Can't find ext4 filesystem
答え2
Matthias Krull が上記のコメントで示唆しているように、qcow2 はディスク イメージを保存するための圧縮をサポートする優れた形式です。これは QEMU 仮想マシン ディスク イメージの形式であるため、かなり長い間サポートされます。以下は、/dev/sda
圧縮イメージ ファイルに圧縮するコマンドの例ですsda.qcow2
。デフォルトでは zlib 圧縮が使用されますが、zstd の方が圧縮率が高いと思います。スループットを向上させるために 8 つのスレッドが使用されますが、使用しているプロセッサ コアの数に変更する必要があります。
qemu-img convert -c -p -S 512 -o compression_type=zstd" -f raw -O qcow2 -m 8 \
/dev/sda sda.qcow2
読み取り専用ブロック デバイスとしてイメージにアクセスするには、次のように NBD (ネットワーク ブロック デバイス) を使用できます。
modprobe nbd
qemu-nbd -r -c /dev/nbd0 sda.qcow2
kpartx -av /dev/nbd0
mount
その後、 と適切なデバイスを使用して、ファイル システムを通常どおりマウントできます/dev/mapper
。
答え3
ブロック圧縮をサポートするファイル システムの場合、ディスク イメージをファイルとして直接保存するという方法があります。BTRFS がこれをサポートすることはわかっていますが、他にもサポートしている可能性があります。BTRFS の場合は、マウント オプションを有効にしてcompress-force
、圧縮不可能なヒューリスティックを無効にする必要がある可能性があります。また、スパース ファイルを作成する必要があります。これは、次の例のように で実行できますdd
。
dd if=/dev/sda of=/mount/btrfs/sda.img conv=sparse,fsync iflag=nocache oflag=nocache
これによりスパース ファイルが作成されるため、ゼロ セクタはスペースを占有せず、BTRFS は圧縮可能なブロックを圧縮します (これをオンにした場合)。このcompsize
ツールを使用すると、ファイルがどの程度圧縮されているかを確認できます。を使用すると、圧縮されdu
ていないファイルのサイズからホールを除いたサイズのみが表示されるため、正確ではありません。
イメージ内の任意のファイル システムをマウントするには、以下を使用できます。
LOOPDEV=$(losetup --show -f /mount/btrfs/sda.img)
kpartx -av "$LOOPDEV"
mount /dev/mapper/"$LOOPDEV"p3 # To mount the 3rd partition
たとえば、ネイティブ圧縮機能を持つファイル システムを使用しない場合でもext4
、ディスク イメージを BTRFS ファイル システム イメージにラップすることで、この方法を使用できます。次のようになります。
truncate -s 100G backup-sda.btrfs.img
mkfs.btrfs backup-sda.btrfs.img
mount -o compress-force=zstd:9 backup-sda.btrfs.img /media/tmp
cd /media/tmp
# Now do commands to create disk image as above
この方法では、 を使用する方法よりも圧縮アルゴリズムと圧縮レベルをより細かく制御できます。 を使用する方法でqemu-img convert
は、圧縮レベルではなく圧縮方法のみを選択でき、使用できる圧縮方法が少なくなります。