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

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

Recent Posts

Categories

Tool 日々 Web Biz Net Apple MS ことば News Unix howto Food PHP Movie Edu Community Book Security Text TV Perl Ruby Music Pdoc 生き方 RDoc ViewCVS CVS Rsync Disk Mail FreeBSD Cygwin PDF Photo Zebedee Debian OSX Comic Cron Sysadmin Font Analog iCal Sunbird DNS Linux Wiki Emacs Thunderbird Sitecopy Terminal Drawing tDiary AppleScript Life Money Omni PukiWiki Xen XREA Zsh Screen CASL Firefox Fink zsh haXe Ecmascript PATH_INFO SQLite PEAR Lighttpd FastCGI Subversion au prototype.js jsUnit Apache Trac Template Java Rhino Mochikit Feed Bloglines CSS del.icio.us SBS qwikWeb gettext Ajax JSDoc Rails HTML CHM EPWING NDTP EB IE CLI ck ThinkPad Toy WSH RFC readline rlwrap ImageMagick epeg Frenzy sysprep Ubuntu MeCab DTP ERD DBMS eclipse Eclipse Awk RD Diigo XAMPP RubyGems PHPDoc iCab DOM YAML Camino Geekmonkey w3m Scheme Gauche Lisp JSAN Google VMware DSL SLAX Safari Markdown Textile IRC Jabber Fastladder MacPorts LLSpirit CPAN Mozilla Twitter OpenFL Rswatch ITS NTP GUI Pragger Yapra XML Mobile Git Study JSON VirtualBox Samba Pear Growl Mercurial Rack Capistrano Rake Win RSS Mechanize Sitemaps Android JavaScript Python RTM OOo iPod Yahoo Unicode Github iTunes God SBM friendfeed Friendfeed HokuUn Sinatra TDD Test Project Evernote iPad Geohash Location Map Search Simplenote Image WebKit RSpec Phone CSV WiMAX USB Chrome RubyKaigi RubyKaigi2011 Space CoffeeScript Nokogiri Hpricot Rubygems jQuery Node GTD CI UX Design VCS Kanazawa.rb Kindle Amazon Agile Vagrant Chef Windows Composer Dotenv PaaS Itamae SaaS Docker Swagger Grape WebAPI Microservices OmniAuth HTTP 分析基盤 CDN Terraform IaaS HCL Webpack Vue.js BigQuery Middleman CMS AWS PNG Laravel Selenium OAuth OpenAPI GitHub UML GCP TypeScript SQL Hanami Document SVG AsciiDoc Pandoc DocBook Develop Jekyll macOS Node.js Vite Heroku Transformer AI Data Cloud Wasm