ゼロを含むファイルをスパースファイルに解凍するには?

ゼロを含むファイルをスパースファイルに解凍するには?

非常に大きなハードドライブを使用して作成された圧縮された生の画像がありますcat /dev/sdx | xz > image.xz。ただし、これを行う前にドライブの空き容量が消去され、画像はほとんどゼロバイトで構成されています。ゼロブロックがスペースを占有しないように、このイメージをスパースファイルに抽出する最も簡単な方法は何ですか?

答え1

マンページ(この種の質問は必ず尋ねてください)を引用してxz素早く検索してみましたsparse

--no-sparse
スパースファイルの生成を無効にします。 デフォルトでは、通常のファイルに解凍したときに解凍したデータに長いバイナリゼロシーケンスが含まれている場合、xzはファイルをリーンにしようとします。。 stdoutが通常のファイルに接続されており、安全のために特定の追加条件が満たされている限り、stdoutに書き込むときにも機能します。スパースファイルを作成すると、ディスクI / Oの量が減り、ディスク容量が節約され、解凍速度が速くなります。

(強調は私のもの)

したがって、何もする必要はなく、xz基本的なツールを使用して解凍するだけです。

答え2

ddこのコマンドには、少なくとも1つのGNU、NetBSD、およびFreeBSD実装がありますconv=sparse。 GNUddマニュアルを引用するには:

sparse
NUL 出力ブロックを作成する代わりに探します。スパースファイルをサポートするファイルシステムでは、出力ファイルを拡張するとスパース出力が生成されます。またはでこの変換をconv=notrunc使用するときは注意してくださいoflag=append。を使用すると、conv=notrunc入力のNULブロックに対応する出力ファイルの既存のデータは変更されずに保持されます。実行された検索はoflag=append無効です。同様に、出力がファイル以外のデバイスの場合、NUL入力ブロックはコピーされないため、この変換は仮想またはプロビジョニングされたゼロデバイスに最も役立ちます。

だから私は努力します

xz -dc < image.xz | dd of=image conv=sparse

このように使用すると、ddすべての形式の入力で動作します(最初のコマンド自体がスパースファイルを生成できるかどうかに関係なく)。

答え3

私の経験によると、SSDやNVMEなどの最新のハードウェアを使用するときにdd -conv = sparseやgzip / pbzip / xzなどを使用すると、割り当てられていないブロックは任意のデータを返し、これらのデータと一緒に使用できないため良い結果が得られません。圧縮またはまれに変換されます。私は以下を使用することをお勧めします:

partclone.<fstype> -c -d -s /dev/<input> -o /path/to/<output>

これにより、常に最小のファイルが作成され、作成/復元が最も速くなります。必要に応じて、圧縮、CRCなどを追加することもできます。

関連情報