HAYAGUI

FreeBSD 4.10 + pdumpfs

はじめに

ファイルバックアップ手段のひとつとして pdumpfs を実験してみました。 pdumpfs は、最初のバックアップの時だけ対象ディレクトリ全体をコピーして、2日目以降は差分をバックアップします。 その時に、前日から更新されなかったファイルは前日のファイルへのハードリンクとすることで、 ディスクの消費量を節約する仕組みになっています。 また、Rubyスクリプトで作られています。

ハードリンクの理解も含め、実験してみましょう。

インストール

pdumpfs と Ruby をインストールする必要があります。各々最新のソースをコンパイルしてインストールするのが一番ですが、 手を抜いて /stand/sysinstall でインストールしちゃいます。加えて保存されたディレクトリツリーを確認しやすいように tree もインストールしておきます。
jhon# /stand/sysinstall

jhon# rehash 
jhon# pkg_info
pdumpfs-0.8         A daily backup system similar to Plan9's dumpfs
ruby-1.8.1_2        An object-oriented interpreted scripting language
tree-1.3_1          Display a tree-view of directories with optional color or H
jhon# 
jhon# pdumpfs -h
Usage: pdumpfs   [destination basename]
  -e, --exclude=PATTERN          exclude files/directories matching PATTERN
  -s, --exclude-by-size=SIZE     exclude files larger than SIZE
  -w, --exclude-by-glob=GLOB     exclude files matching GLOB
  -v, --version                  print version information and exit
  -h, --help                     show this help message
jhon# 

バックアップ環境

バックアップ対象は /root ディレクトリ内、バックアップ先は /tmp にします。 バックアップ対象のファイルサイズが少ないので、/etc を tar.gz したファイルを置きました。 etc.tgz は、md5 を取っておきます。
jhon# pwd
/root
jhon# tar zcvf etc.tgz /etc
jhon# ls -la
total 252
drwxr-xr-x   2 root  wheel     512 Oct  4 22:39 .
drwxr-xr-x  17 root  wheel     512 Oct  4 22:35 ..
-rw-r--r--   2 root  wheel     802 May 26 06:28 .cshrc
-rw-r--r--   1 root  wheel     142 May 26 06:28 .klogin
-rw-r--r--   1 root  wheel     297 May 26 06:28 .login
-rw-r--r--   2 root  wheel     251 May 26 06:28 .profile
-rw-r--r--   1 root  wheel  223520 Oct  4 22:39 etc.tgz
jhon#  
jhon# md5 etc.tgz 
MD5 (etc.tgz) = ed1dffa47c68a65825177f69a98436e1
jhon# 
バックアップ先の /tmp ディレクトリになにも保存されていないことを確認します。
jhon# pwd
/tmp
jhon# ls -la
total 4
drwxrwxrwt   2 root  wheel  512 Oct  4 22:51 .
drwxr-xr-x  17 root  wheel  512 Oct  4 22:35 ..
jhon# du -s /tmp
2       /tmp
jhon# 

バックアップ 1 回目

とりあえず実行。
jhon# pdumpfs /root /tmp
jhon# 
tree コマンドでバックアップ先のディレクトリ構成を確認。
jhon# tree /tmp
/tmp
`-- 2004
    `-- 10
        `-- 04
            `-- root
                `-- etc.tgz

4 directories, 1 file
jhon# ls -la /tmp/2004/10/04/root/
total 252
drwxr-xr-x  2 root  wheel     512 Oct  4 22:39 .
drwx------  3 root  wheel     512 Oct  4 22:51 ..
-rw-r--r--  1 root  wheel     802 May 26 06:28 .cshrc
-rw-r--r--  1 root  wheel     142 May 26 06:28 .klogin
-rw-r--r--  1 root  wheel     297 May 26 06:28 .login
-rw-r--r--  1 root  wheel     251 May 26 06:28 .profile
-rw-r--r--  1 root  wheel  223520 Oct  4 22:39 etc.tgz
jhon# 
jhon# du -s /tmp
258     /tmp
jhon# 
jhon# 
jhon# md5 /tmp/2004/10/04/root/etc.tgz 
MD5 (/tmp/2004/10/04/root/etc.tgz) = ed1dffa47c68a65825177f69a98436e1
jhon# 
etc.tgz ファイルも正しいことを確認。

バックアップ 2 回目

一日一回しかバックアップできないので、日付を一日進めます。
jhon# date
Mon Oct  4 23:00:30 JST 2004
jhon# date 0410052300
Tue Oct  5 23:00:00 JST 2004
pdumpfs を実行すると、前回とのファイルチェックが行われます。ファイルを操作していないので、unchanged です。
jhon# pdumpfs /root /tmp
directory  /root
unchanged  /root/etc.tgz
unchanged  /root/.profile
unchanged  /root/.login
unchanged  /root/.klogin
unchanged  /root/.cshrc
jhon# 
バックアップ先のディレクトリツリーはこのようになります。
jhon# tree /tmp
/tmp
`-- 2004
    `-- 10
        |-- 04
        |   `-- root
        |       `-- etc.tgz
        `-- 05
            `-- root
                `-- etc.tgz

6 directories, 2 files
jhon# 
ファイルサイズは etc.tgz が二つ分にはなりません。
jhon# du -s /tmp
262     /tmp
jhon# 
jhon# md5 /tmp/2004/10/05/root/etc.tgz
MD5 (/tmp/2004/10/05/root/etc.tgz) = ed1dffa47c68a65825177f69a98436e1
jhon# 

ファイルを追加

etc.tgz をコピーして hoge.tgz を作成します。
jhon# cp /root/etc.tgz /root/hoge.tgz
jhon# pwd
/root
jhon# ls -la
total 492
drwxr-xr-x   2 root  wheel     512 Oct  5 23:04 .
drwxr-xr-x  17 root  wheel     512 Oct  4 22:35 ..
-rw-r--r--   2 root  wheel     802 May 26 06:28 .cshrc
-rw-r--r--   1 root  wheel     142 May 26 06:28 .klogin
-rw-r--r--   1 root  wheel     297 May 26 06:28 .login
-rw-r--r--   2 root  wheel     251 May 26 06:28 .profile
-rw-r--r--   1 root  wheel  223520 Oct  4 22:39 etc.tgz
-rw-r--r--   1 root  wheel  223520 Oct  5 23:04 hoge.tgz
jhon# 

日を進めて pdumpfs を行います。
jhon# date 0410062300
Wed Oct  6 23:00:00 JST 2004
jhon# 

jhon# pdumpfs /root /tmp
directory  /root
new file   /root/hoge.tgz
unchanged  /root/etc.tgz
unchanged  /root/.profile
unchanged  /root/.login
unchanged  /root/.klogin
unchanged  /root/.cshrc
jhon# 
hoge.tgz が new file と識別されます。
tree でバックアップ先を確認。
jhon# tree /tmp
/tmp
`-- 2004
    `-- 10
        |-- 04
        |   `-- root
        |       `-- etc.tgz
        |-- 05
        |   `-- root
        |       `-- etc.tgz
        `-- 06
            `-- root
                |-- etc.tgz
                `-- hoge.tgz

8 directories, 4 files
jhon# 
jhon# du -s /tmp
506     /tmp
jhon# 

バックアップ先のファイルを削除

最初にバックアップしたディレクトリ(04)を削除してみます。
jhon# rm -R /tmp/2004/10/04
jhon# tree /tmp
/tmp
`-- 2004
    `-- 10
        |-- 05
        |   `-- root
        |       `-- etc.tgz
        `-- 06
            `-- root
                |-- etc.tgz
                `-- hoge.tgz

6 directories, 3 files
jhon# 

jhon# du -s /tmp
502     /tmp
jhon# 

jhon# md5 /tmp/2004/10/05/root/etc.tgz
MD5 (/tmp/2004/10/05/root/etc.tgz) = ed1dffa47c68a65825177f69a98436e1
jhon# md5 /tmp/2004/10/06/root/etc.tgz
MD5 (/tmp/2004/10/06/root/etc.tgz) = ed1dffa47c68a65825177f69a98436e1
jhon# 
05 , 06 ディレクトリ内の etc.tgz が 04 ディレクトリからのスタティックリンクの場合はリンク切れを起こしますが、 これらはハードリンクなので、実体は残ります。

バックアップ元のファイルを削除

jhon# rm /root/hoge.tgz 
jhon# 
jhon# date 0410072300
Thu Oct  7 23:00:00 JST 2004
jhon# 
jhon# pdumpfs /root /tmp
directory  /root
unchanged  /root/etc.tgz
unchanged  /root/.profile
unchanged  /root/.login
unchanged  /root/.klogin
unchanged  /root/.cshrc
jhon# 
jhon# du -s /tmp
506     /tmp
jhon# 
jhon# tree /tmp
/tmp
`-- 2004
    `-- 10
        |-- 05
        |   `-- root
        |       `-- etc.tgz
        |-- 06
        |   `-- root
        |       |-- etc.tgz
        |       `-- hoge.tgz
        `-- 07
            `-- root
                `-- etc.tgz

8 directories, 4 files
jhon# 

バックアップ元のファイル更新

バックアップ元のファイルが編集された時にバックアップされると、こんな感じ。
jhon# echo "hoge" > /root/hoge.txt
jhon# 
jhon# md5 /root/hoge.txt 
MD5 (/root/hoge.txt) = c59548c3c576228486a1f0037eb16a1b
jhon# 
日付を変更し、pdumpfs を実行。

jhon# date 0410082300
Fri Oct  8 23:00:00 JST 2004
jhon# 
jhon# pdumpfs /root /tmp
directory  /root
new file   /root/hoge.txt
unchanged  /root/etc.tgz
unchanged  /root/.profile
unchanged  /root/.login
unchanged  /root/.klogin
unchanged  /root/.cshrc
jhon# 
jhon# tree /tmp
/tmp
`-- 2004
    `-- 10
        |-- 05
        |   `-- root
        |       `-- etc.tgz
        |-- 06
        |   `-- root
        |       |-- etc.tgz
        |       `-- hoge.tgz
        |-- 07
        |   `-- root
        |       `-- etc.tgz
        `-- 08
            `-- root
                |-- etc.tgz
                `-- hoge.txt

10 directories, 6 files
jhon# 
ファイルを編集する。pdumpfs を実行すると、updated と表示される。
jhon# echo "hogehoge" >> /root/hoge.txt
jhon# cat hoge.txt 
hoge
hogehoge
jhon# md5 /root/hoge.txt
MD5 (/root/hoge.txt) = 36e055f9e8922e9163f9293ea0920b10
jhon# 

jhon# date 0410092300
Sat Oct  9 23:00:00 JST 2004
jhon# 

jhon# pdumpfs /root /tmp
directory  /root
updated    /root/hoge.txt
unchanged  /root/etc.tgz
unchanged  /root/.profile
unchanged  /root/.login
unchanged  /root/.klogin
unchanged  /root/.cshrc
jhon# 
jhon# tree /tmp
/tmp
`-- 2004
    `-- 10
        |-- 05
        |   `-- root
        |       `-- etc.tgz
        |-- 06
        |   `-- root
        |       |-- etc.tgz
        |       `-- hoge.tgz
        |-- 07
        |   `-- root
        |       `-- etc.tgz
        |-- 08
        |   `-- root
        |       |-- etc.tgz
        |       `-- hoge.txt
        `-- 09
            `-- root
                |-- etc.tgz
                `-- hoge.txt

12 directories, 8 files
jhon# 

pdumpfs は便利だなー。

そのた

バックアップ元ディレクトリとバックアップ先ディレクトリの指定を、 /root/ のように終わりを / にした時でも、 / が無い時と同じ動作をします。


戻る



(C)1999 - 2004 Kenji Ito All rights reserved.