とあるシステムのバックアップを取得しようと思い、当初は「tar+gz」で取ろうと思っていましたが、「afio」なんて便利なコマンドがあったんですね。

Backup-mini-HOWTO
http://linuxjf.sourceforge.jp/JFdocs/Backup-mini-HOWTO/

上記URLでは、「tar+gz」で取得するより「afio」コマンドで取得した方が良いというメリットが書かれています。

簡単に書くと、「tar+gz」でバックアップ取得中に何かしら障害が発生して一部のファイルが破損した場合、途中までしか解凍できません。
「afio」では、バックアップ中に一部のファイルが破損した場合でも問題なく解凍できます。
※壊れたファイルは壊れたままで元には戻りません。

CentOSには、「afio」のパッケージがありません。

ここでは、「afio」をソースから入れた備忘録を書きます。

afioバージョン
afi0-2.5

使用OS
CentOS 5.5 64bit
OSインストール時に開発ツールがチェックされインストールされていること

(1)「afio」をダウンロード

[root@example ~]# wget http://www.ibiblio.org/pub/linux/system/backup/afio-2.5.tgz

(2)ダウンロードした「afio」を解凍
[root@example ~]# tar zxvf afio-2.5.tgz

(3)「afio」のインストール
[root@example ~]# cd afio-2.5
[root@example afio-2.5]# make
[root@example afio-2.5]# make install

(4)「afio」を使ってみる
ここでは、「/opt/backup」にあるテキストファイルを「afio」でアーカイブ化します。
[root@example ~]# ls /opt/backup/
1.txt   11.txt  13.txt  15.txt  17.txt  19.txt  20.txt  4.txt  6.txt  8.txt
10.txt  12.txt  14.txt  16.txt  18.txt  2.txt   3.txt   5.txt  7.txt  9.txt
[root@example ~]# find /opt/backup -depth -print | afio -ovZ backup.afz
opt/backup/15.txt -- okay
opt/backup/4.txt -- okay
opt/backup/10.txt -- okay
opt/backup/14.txt -- okay
opt/backup/19.txt -- okay
opt/backup/20.txt -- okay
opt/backup/2.txt -- okay
opt/backup/6.txt -- okay
opt/backup/8.txt -- okay
opt/backup/18.txt -- okay
opt/backup/12.txt -- okay
opt/backup/16.txt -- okay
opt/backup/3.txt -- okay
opt/backup/5.txt -- okay
opt/backup/7.txt -- okay
opt/backup/13.txt -- okay
opt/backup/11.txt -- okay
opt/backup/17.txt -- okay
opt/backup/1.txt -- okay
opt/backup/9.txt -- okay
opt/backup -- okay

(5)解凍してみる
ここでは、解凍先「uncompress」ディレクトリを作成して、その中に解凍します。
[root@example ~]# mkdir uncompress
[root@example ~]# mv backup.afz uncompress/
[root@example ~]# cd uncompress/
[root@example uncompress]# afio -ivZ backup.afz
opt/backup/15.txt -- okay
opt/backup/4.txt -- okay
opt/backup/10.txt -- okay
opt/backup/14.txt -- okay
opt/backup/19.txt -- okay
opt/backup/20.txt -- okay
opt/backup/2.txt -- okay
opt/backup/6.txt -- okay
opt/backup/8.txt -- okay
opt/backup/18.txt -- okay
opt/backup/12.txt -- okay
opt/backup/16.txt -- okay
opt/backup/3.txt -- okay
opt/backup/5.txt -- okay
opt/backup/7.txt -- okay
opt/backup/13.txt -- okay
opt/backup/11.txt -- okay
opt/backup/17.txt -- okay
opt/backup/1.txt -- okay
opt/backup/9.txt -- okay
opt/backup -- okay
[root@example uncompress]# ls opt/backup/
1.txt   11.txt  13.txt  15.txt  17.txt  19.txt  20.txt  4.txt  6.txt  8.txt
10.txt  12.txt  14.txt  16.txt  18.txt  2.txt   3.txt   5.txt  7.txt  9.txt

これで、解凍できました。

次に、実験してみます。

本当に、「tar+gz」で一部壊れたら途中までしか解凍できないのか。「afio」だと、とりあえず問題ないファイルは解凍できるのか。

実験には、バイナリエディタである「bvi」を使用して、アーカイブの中身を書き換えます。
※バイナリエディタには「Emacs」などがありますが、俺は「vi」の方が慣れているのでこちらを選択しました。

bviバージョン
bvi-1.3.2
http://bvi.sourceforge.net/overview.html

必要なパッケージ
ncurses-devel

「bvi」もパッケージが無いので、ソースからインストールしました。

(1)「bvi」をダウンロード
[root@example ~]# wget http://prdownloads.sourceforge.net/bvi/bvi-1.3.2.src.tar.gz

(2)ダウンロードした「bvi」を解凍
[root@example ~]# tar zxvf bvi-1.3.2.src.tar.gz

(3)「bvi」のインストール
[root@example ~]# cd bvi-1.3.2
[root@example bvi-1.3.2]# yum -y install ncurses-devel
[root@example bvi-1.3.2]# ./configure
[root@example bvi-1.3.2]# make && make install

(4)「tar+gz」で「afio」で取得した同じデータのアーカイブを作成
[root@example ~]# cd uncompress/
[root@example uncompress]# tar cf - /opt/backup/ | gzip -c > backup.tar.gz

(5)「backup.tar.gz」を「bvi」で開き100バイト目を削除
[root@example uncompress]# bvi backup.tar.gz
ここまで※デフォルトでは、編集できないため編集できるように以下の設定を行う。
1. キーボードの「:」をタイプするとコマンド入力になる。
2. 「: set memmove」と入力し、エンターキーを押す。
上記作業によって、viと同じような操作で「追加」「削除」が出来る。

また、ターミナルの大きさに合わせて見やすいように設定するには以下のコマンドを入力します。
1. 「: set cm=8 or 16 or 32」

表示例


(6)「backup.tar.gz」を解凍
[root@example uncompress]# tar zxvf backup.tar.gz

gzip: stdin: invalid compressed data--crc error

gzip: stdin: invalid compressed data--length error
opt/backup/
opt/backup/15.txt
opt/backup/4.txt
opt/backup/10.txt
opt/backup/14.txt
opt/backup/19.txt
opt/backup/20.txt
opt/backup/2.txt
opt/backup/6.txt
opt/backup/8.txt
tar: 次のヘッダをスキップします
tar: Child returned status 1
tar: 処理中にエラーが起きましたが、最後まで処理してからエラー終了させました
[root@example uncompress]# ls opt/backup/
10.txt  14.txt  15.txt  19.txt  2.txt  20.txt  4.txt  6.txt  8.txt

途中までしか解凍されませんでした。

次に、「afio」で取得したアーカイブで試してみます。

(7)「backup.afz」を「bvi」で開き100バイト目を削除
[root@example uncompress]# bvi backup.afz

(8)「backup.afz」を解凍
[root@example uncompress]# afio -ivZ backup.afz
[root@example uncompress]# afio -ivZ backup.afz
opt/backup/15.txt -- okay
opt/backup/4.txt -- okay
afio: "backup.afz" [offset 207]: Bad ASCII header
afio: "backup.afz" [offset 271]: Bad magic number
afio: "opt/backup/4.txt": May be corrupt
afio: "backup.afz" [offset 374]: Apparently resynchronized
afio: "opt/backup/14.txt": Continuing
opt/backup/14.txt -- okay
opt/backup/19.txt -- okay
opt/backup/20.txt -- okay
opt/backup/2.txt -- okay
opt/backup/6.txt -- okay
opt/backup/8.txt -- okay
opt/backup/18.txt -- okay
opt/backup/12.txt -- okay
opt/backup/16.txt -- okay
opt/backup/3.txt -- okay
opt/backup/5.txt -- okay
opt/backup/7.txt -- okay
opt/backup/13.txt -- okay
opt/backup/11.txt -- okay
opt/backup/17.txt -- okay
opt/backup/1.txt -- okay
opt/backup/9.txt -- okay
opt/backup -- okay
[root@example uncompress]# ls opt/backup/
1.txt   12.txt  14.txt  16.txt  18.txt  2.txt   3.txt  5.txt  7.txt  9.txt
11.txt  13.txt  15.txt  17.txt  19.txt  20.txt  4.txt  6.txt  8.txt

「afio」では、「10.txt」以外は全て解凍されました。

取りあえず、「afio」でバックアップは取っていこうと思います。

「afio」のrpmパッケージを作成してみた。
afio-2.5-1.x86_64.rpm
afio-2.5-1.src.rpm
注)上記パッケージを使用した際に発生したトラブルなどの責任は一切負いません。自己責任で使用してください。

参考文献
1. http://linuxjf.sourceforge.jp/JFdocs/Backup-mini-HOWTO/
2. http://linux.kororo.jp/cont/intro/comp_ext.php
3. http://u-tamax.jp/2010/10/bvi%E3%81%AE%E4%BD%BF%E3%81%84%E6%96
%B9/


4月 1, 2011 at 11:22 pm by 黒ぶちメガネ
Category: Linux