2010-08-07

tarアーカイブにファイルを追加する

あるいは保管目的のログファイルの整理ポリシーを変えましたの話。

結論

.tar.gz -> .gzs.tar

にします。

before
複数のログファイルを tar でまとめて gzip などで固める
after
それぞれのログファイルを gzip などで縮めて tar で固める

背景

保管するログファイルの扱いに困っていました。いや、実際には困っていたというよりはなんとなくあんまりうまくないなぁという程度の感覚でやっていたわけですが。

複数のファイルを保管目的でバックアップする場合、多くはディスク容量の節約をするため tar + gzip などの方法で圧縮していると思います。しかし

この方法はけっこう贅沢なディスクの使い方だ

ということに気がつきました。

問題

多くの、そして古い Un*x の教科書的なドキュメントにはバックアップに tar + gzip を利用する方法が書かれています。しかしこの方法では

tar + gzip を実行するタイミングまではログは生のサイズのまま

なのです。

例えば「月1回ログをまとめて圧縮する」というスケジュールにすると1ヶ月間はログは生のサイズのままです。けっこうな大きさになります。

しかしこの1ヶ月という期間の設定はよくあるパターンかなと思います。あとで DVD などに退避させる際にはこれくらいの期間で置いてあると何かと使い勝手がよいです。

個人では 1TB がヨユーで買えてしまうこのご時世ですが、お仕事的には経費が掛けられないものすごく厳しい状況が続いていますので、生ログのサイズのままハードディスクに置いておくのはできるだけやりたくありません。

試行

そこで

tar.gz のアーカイブにログファイルを append できたら便利じゃね?

と思いつきました。でも結論から言うとどうもこれはできないらしい。まぁ普通に考えてかなり無駄というか無茶な処理ですよね。tar はなぜ失敗したのか分からないけど失敗、cpio の場合は圧縮と append は同時にできねーよ、とはっきり怒ってくれます。

そこで、

rotate と同じ要領で先に gzip しといて tar にまとめりゃいいのか

と気づきました。

解決

何を言ってるか分からないかもしれないのでテストスクリプトを書きました。

  1. まずダミーのファイルを作って途中までをそれぞれgzipで圧縮してtarアーカイブを作る
  2. その段階でのアーカイブの中身を表示
  3. 残りのファイルをgzip圧縮してtarballにappend
  4. アーカイブの中身を表示

しています。ちゃんと追加されている様子が分かります。

これで、

  1. アーカイブファイルの名前を年月などから自動決定する
  2. そのファイルがすでにあればそこに append なければ新規作成

するスクリプトに仕立て上げれば全自動でディスクを節約するアーカイブのできあがりでしょうか。

これなら時期を見て DVD などに退避させる際にも対象のファイルはすでに圧縮してアーカイブ済みなので、えっちらおっちら圧縮する手間と時間も削減できます。

一石二鳥。

About

例によって個人のなんちゃらです