一時ファイルを生成せずに大容量圧縮ファイルを更新する

一時ファイルを生成せずに大容量圧縮ファイルを更新する

圧縮するファイル用の一時ファイルを作成せずに、Linuxサーバー(現在のzipを使用していますがtar / gz / bz派生ファイルでも開いています)で圧縮ファイルを更新する方法を見つけようとしています。

ドメイン全体のディレクトリ(与えられた時間に約36 Gb以上)を圧縮しており、Webサーバーのドライブスペースが制限されています。問題は、zipが新しいzipファイルをビルドするときに完了すると、既存のzipファイルを上書きできる一時ファイルを生成しますが、その過程でソースディレクトリの36Gb +既存のzipファイルの32Gbが失われることです。 30Gbの一時ファイルは私のドライブスペースを最大限に活用するのに非常に近いので、今後のある時点ではドライブの空き容量を超えています。

現在のディレクトリは、以下のようにcronjobコマンドを使用してバックアップされています。
0 0 * * * zip -r -u -q /home/user/SiteBackups/support.zip /home/user/public_html/support/

毎回zipファイルを削除したくありません。まず、ディレクトリが4時間ごとに圧縮され、ディレクトリが大きすぎるため、単に更新するのではなく、ディレクトリ全体を再圧縮することはかなりのリソース集約的です。私はそれが本当だと信じています。たぶん私が間違っていますか?

また、ほとんどのデータ(合計36Gbのうち30Gb)が1つのディレクトリにあり、ファイル名がGUIDであるため、予測可能な方法でファイルを見つける方法がないため、他のディレクトリに対して複数のコマンドに分割することは機能しません。 。

システム管理者のいくつかのターミナルウィジェットに感謝します!

ベストアンサー1

これはほとんど確実には機能しません(修正する:あなたも見ることができますこれ回答)

Zipアーカイブ(他のアーカイブとは大きく異なります)はファイルシステムのように構築されています。

ジッパー構造

File#2を移動せずにFile#1を更新し、File#1を使用することもできるとします。大きい一度圧縮。これには次のものが必要です。

  • 中央タイトルの削除
  • File#2の後にFile#1データを追加する(2番目のコピー)
  • 中央のヘッダーを再度追加し、File#1 のオフセットを更新します。

Zipファイルの先頭に「デッドゾーン」を作成します。これは〜になります可能この領域を使用して他のファイルを追加保存します。デフォルトでは、受信ファイルを一時ファイルに圧縮して最終サイズを取得する必要があります。 zipファイルをスキャンして「リーク」を見つけることができます。適切な「穴」が存在する場合は、zipファイル内の一時ファイルをコピーし、それ以外の場合は中央ヘッダーを置き換えて追加します。

しかし、可能、Zipアーカイブ内の空き領域を管理し、隣接する「穴」をマージするには注意が必要です。これは、新しい圧縮ストリームを作成し、古いファイル名を認識可能なシーケンスに置き換えて空き領域としてマークするデフォルトのzipユーティリティです。怖い遅い)。

必要なものに最も近いのは、まったく異なる形式を使用することです。たとえば、btrfsループデバイスにファイルシステムを作成し、それを利用可能な最大圧縮に設定できます(LZOと思います)。次に、ループデバイスをインストールし、それを使用してrsync更新します。ループデバイスを削除するためのホストファイルは、一種の圧縮アーカイブです。ファイルの性質に応じてbtrfs重複排除機能を利用することもできます。

圧縮ファイルシステムはZipより圧縮率が低くなります。しかし、複数のファイル(明らかにPDF、ZIP、JPEG、PNG、GIFなどのほとんどの画像形式、最新の(Libre)Office形式...)圧縮できませんしたがって、これは問題ではありません。圧縮されていないファイルが36Gbで、Zipが32Gbであると言われているので、このような状況に直面し、次のような利点があります。圧縮されていない滞在)。

おすすめ記事