8-6. フリ−のバックアップコマンド (1) ftpmirror コマンド '99/05 * 概要 フリ−ソフトをダウンロ−ドしてくるのに、anonymous FTP というのを使ったことがある と思う。これは誰でもパスワ−ドなしで、anonymous という特殊アカウントでアクセスで きる ftp サ−バのことである。そしてできれば近くの ftp ミラ−サイトにアクセスする ことが、インタ−ネットでのマナ−にもなっている。 このミラ−サイトが ftpmirror や mirror というコマンドで作られているのである。どこか大元の ftp サ−バがあって、そ こから丸ごとコピ−して、別な ftp サ−バを立ち上げるわけである。 大学なんかに ftp のミラ−サイトはよくある。このコマンドはインタ−ネットだけでなく、内部ネットでの デ−タのバックアップとしても使うことができる。本書ではむしろその方が面白い。 しかし使い方がどうも分からなかった。 当初リモ−トもロ−カルも ftpmirror をインス ト−ルしないといけないと思っていた。自分の方、 つまりロ−カルだけ ftpmirror がい る。リモ−ト側はあくまでもただの ftp サ−バでいいのである。 ここの所がポイントで ある。この仕組みさえ分かってしまえば使うのは簡単である。ファイルはディレクトリ単 位でリモ−トからロ−カルへコピ−する。コピ−は ftpmirror 内部の ftp プロトコルで ファイル get するわけだ。ミラ−を制御するファイルは default という名前で、コピ− しないファイルを指定するなど、多くのパラメ−タを設定できる。 ミラ−する単位はパッケ−ジといういい方をする。default ファイルの中でパッケ−ジの 名前を書き、そこにミラ−したい内容を記載するのである。通常、このパッケ−ジは1つ のディレクトリと考えてよい。ミラ−のコピ−は、指定ディレクトリを再帰的に行われる。 つまり指定ディレクトリ以下全部をコピ−するのである。コピ−してきた時のオ−ナやパ −ミッションは、パッケ−ジ毎に記述ができる。これはできないと困る。ftpmirror は通 常ユ−ティリティの mirror.sh コマンドで、ル−ト権限で cron運転されるだろう。ル− トで稼働させると、コピ−したファイルのオ−ナは root になってしまうのである。 ftpmirror のインスト−ルは簡単である。展開するだけ。 ftpmirror 自体、Perl で記述 されているのだ。参考文献は ftpmirror のドキュメントがある。 日本語で丁寧に書かれ ているのでこれで十分である。他には「UNIX MAGAZINE」'97/10, P.70〜74, "UNIX知恵袋 32、ftpmirror" があるのみである。同様なコマンドに mirror というのもある。 機能的 には同じとみてよい。また似たようなコマンドで rdist というのがあるが、 これは逆に ファイルを配布する方である。/etc 以下のマシンの設定ファイルを、 ほかのマシンでも 共通にするような場合に使うわけである。 [ 特徴 ] ・passive モ−ドにすることもできる。つまりファイアウォ−ルも通過できる。 ・ftpmirror コマンドの実行には Perl がいる。mirror の場合も必要である。 ・日本人が作成している。ドキュメントは日本語で10ペ−ジある。有難い。 ・ファイル比較はデフォルトで時刻を使う。双方のマシンの時計を合わせておく。 ・ファイルを比較して、余分なファイルはコピ−しない。厳密な比較には md5 も使える。 * ftpmirror のインスト−ル % ftp ftp.intec.co.jp '99/05 ftp> cd pub/utils/ -rw-r--r-- 1 root wheel 14470 Apr 26 1996 Kconv-1.1.tar.gz -rw-r--r-- 1 root wheel 128761 Sep 21 1995 bomb-2.0.shar -rw-r--r-- 1 root wheel 31699 Sep 21 1995 bomb-2.0.tar.gz -rw-r--r-- 1 root wheel 18657 Feb 2 1996 detect-1.3.tar.gz drwxr-xr-x 3 root wheel 512 Feb 8 1998 ftpmirror -rw-r--r-- 1 root wheel 7908 Jul 16 1995 fwtk-v1.3-pasv-patch -rw-r--r-- 1 root wheel 4941 Jan 15 1996 relay-1.0.tar.gz -rw-r--r-- 1 root wheel 3506 Mar 10 1996 rotate-1.1.tar.gz -rw-r--r-- 1 root wheel 6301 Jul 27 1995 xtypo-1.02.tar.gz ftp> cd ftpmirror -rw-r--r-- 1 root wheel 392 Feb 8 1998 .dirinfo << ディレクトリ情報。 drwxr-xr-x 2 root wheel 512 Sep 19 1998 alpha -rw-r--r-- 1 root wheel 44209 Jun 9 1997 ftpmirror-1.2k.tar.gz -rw-r--r-- 1 root wheel 44188 Feb 8 1998 ftpmirror-1.2l.tar.gz << 1.2える。 ftp> get ftpmirror-1.2l.tar.gz .dirinfo は ftpd 側で、ftpmirror が効率的、 厳密にファイル比較するためのディ レクトリ情報である。ftpmirror に入っている mkdirinfo コマンドを、ftpd 側でデ ィレクトリ毎に叩いて作成する。 インタ−ネット用の anonymous FTP サイトを作る のでなければ必要ないことである。 % pwd /usr/local/source % zcat ftpmirror-1.2l.tar.gz | tar xvf - << 展開するだけ。make はなし。 % ls -F ftpmirror COPYRIGHT dirinfo.pl* log.pl param.pl README.html ftpmirror* lsparse.pl shlock.pl README.jis ftputil.pl mirror.sh* config/ list.daily-sample mkdirinfo* ↑ GNU-sample, default-sample あり。 * とりあえず試してみる '99/05 REMOTE 側のファイルを LOCAL 側に ftpmirror コマンドでコピ−する。 LOCAL 側のコピ −先は /nix/katou/PPP ディレクトリである。PPP ディレクトリは作っておく必要はない。 ftpmirror が作ってくれる。このテストではマシンを別々にしたが、同一マシンでもいい。 要は ftpd デ−モンが自マシンで動いていれば % ftp localhost とやればいい訳だから。 ftpmirror ftpd % ls /usr/people/katou/PPP --------------- ---------------- a1 a2 a3 |Perl がいる | ファイル | | | /nix/katou/ | <------- | /usr/people/ | | katou/PPP | | katou/PPP | --------------- LOCAL ---------------- REMOTE INDY | | ---------*--------------------------*---------- << テスト環境 >> 192.9.200.1 192.9.200.2 [ ftpmirror ファイルの修正 ] ftpmirror コマンドには、ftpmirror をインスト−ルしたディレクトリを内部で記述して いる。デフォルトでは /usr/local/lib/ftpmirror になっている。それ以外のディレクト リにインスト−ルした場合は、修正しておいた方がいい。 定義は ftpmirror コマンドの スクリプトの $prefix である。 $prefix は制御ファイル config のありかを探す手だて にもなっている。 % pwd /usr/local/source/ftpmirror % grep prefix ftpmirror ;# $prefix : a directory which contains ftpmirror utilities. ;#$prefix = '/usr/local/lib/ftpmirror'; << もともとのパス。 $prefix = '/usr/local/source/ftpmirror'; << こっちに修正した。 unshift(@INC, $prefix); [ 制御ファイルの修正 ] /usr/local/source/ftpmirror/config/default -------------------------------------------------------------------------------- |ftp-user = root << ここ3つ追加した。ftp サ−バへのロッグインと |ftp-pass = henomohe パスワ−ドを記述する。 |log-priority = 6 | |ftp-debug = 0 # all ftp session will be listed if ftp-debug is 1. |debug = 0 # all remote files will be listed if debug is 1. |unlink = rename # we don't unlink file. only rename. | |# regexp to GET from remote server. |transfer-file-regexp += !/~$/ これらにマッチするファイルはミラ−の |transfer-file-regexp += !/\/#/ 対象にしない。ともかく全部のファイル |transfer-file-regexp += !/\/\.#/ をコピ−するなら、これらの指定はいら |transfer-file-regexp += !/\/\.cache/ ない。 |transfer-file-regexp += !/\/\.message/ |transfer-file-regexp += !/\/\.mirror/ |transfer-file-regexp += !/\/\.nfs/ |transfer-file-regexp += !/\/\.notready/ |transfer-file-regexp += !/\/\.in/ |transfer-file-regexp += !/\/\.desc\.txt$/ |transfer-file-regexp += !/\/core$/ |transfer-file-regexp += !/\.core$/ | |# regexp to GET from remote server. |transfer-directory-regexp += !/~\/$/ |transfer-directory-regexp += !/\/lost\+found\/$/ | |package = KATOU << ここから下追加した。 | ftp-server = 192.9.200.2 | remote-directory = /usr/people/katou/PPP | local-directory = /nix/katou/PPP [ コマンド実行 ] % cd /usr/local/source/ftpmirror % ftpmirror KATOU << 初めて実行したところ。root で実行。 package KATOU started at 1999-08-20 16:19:37 success to login 192.9.200.2/root. remote directory is /usr/people/katou/PPP. local directory is /nix/katou/PPP. * ./ ... generating local dirinfo ok + ./a1 ... getting done + ./a2 ... getting done + ./a3 ... getting done * ./ ... total 3 files updated FTP session was terminated normally. package KATOU done at 1999-08-20 16:19:38 % ftpmirror KATOU << 2回目実行したところ。ファイルは変更してない。 package KATOU started at 1999-08-20 16:19:23 success to login 192.9.200.2/root. remote directory is /usr/people/katou/PPP. local directory is /nix/katou/PPP. * ./ ... generating local dirinfo ok + ./a1 ... yes [STAT/LIST] + ./a2 ... yes [STAT/LIST] + ./a3 ... yes [STAT/LIST] * ./ ... no change FTP session was terminated normally. package KATOU done at 1999-08-20 16:19:23 [ ミラ−された LOCAL 側のファイル ] REMOTE 側のファイルのオ−ナとグル−プは katou,user である。しかし LOCAL に、ミラ −によりコピ−されたのは root, sys になっている。これは ftpmirror を root 権限で 実行した、そのままの結果である。パ−ミッションは ftpmirror のデフォルトで 644 に なっている。REMOTE 側のファイルを何もいじらず、再び ftpmirror をやってみた。ファ イルの比較をし変化がないということで、コピ−はされなかった。 デフォルトではファイルの最終更新時刻で比較しコピ−するようになっている。ファイル のサイズはデフォルトでは見ない。REMOTE 側で例えば a1 をエディットしたとする。 そ こで ftpmirror をやると a1 だけコピ−するのである。下記 ls の日付は、REMOTE 側で 最後に編集されたファイルの日時である。コピ−してきた日時ではない。 % cd /nix/katou REMOTE 側で編集された日時 % ls -l PPP ↓ -rw-r--r-- 1 root sys 4 8月 20日 11時00分 a1 -rw-r--r-- 1 root sys 0 8月 20日 11時00分 a2 -rw-r--r-- 1 root sys 0 8月 20日 12時00分 a3 (2) ftpmirror いろいろ '99/05 * オプション機能 default ------------------------ |ftp-passive = 0 1 にすると ftp を passive mode にする。 |debug = 0 これは使わないこと。log-priority を使う。 |log-priority = 5 7 がログを一番多く出す。 |test-mode=0 1 だと実際の転送はせず、転送候補のファイル名を示す。 default ------------------------ これで一番多くのログが画面に出て来る。 ftp-debug = 1 |ftp-debug = 1 で ftp セッションを表示する。ftp-debug は通常 0 にす |log-priority = 7 ること。 default ------------------------ デフォルトは 1。ファイルの最終更新時刻で比較しコピ− |check-mtime = 1 する。0 だとサイズで比較するが、現実的とはいえない。 | |load-local-dirinfo = 1 ファイルの比較をより細かくし、むだなコピ−をしないよ |store-local-dirinfo = 1 うにする。ロ−カルのディレクトリに .dirinfo というフ ァイルができる。相手側にも .dirinfo は必要である。 * default ファイルを見る順番 1. カレントディレクトリの default を先ず見る。 % pwd % /nix/katou katou のホ−ムディレクトリに default ファイルがあり、 % ls default ここから ftpmirror を実行する。 % /usr/local/source/ftpmirror/ftpmirror KATOU 2. なければ /usr/local/source/ftpmirror/config/default を見る。 /usr/local/source/ftpmirror/ftpmirror ----------------------------------------- |$prefix = '/usr/local/source/ftpmirror'; * 設定例−個人的なバックアップ /nix/katou/default ------------------------------------------ |ftp-debug = 0 |ftp-user = katou 普段使っている自分のマシン以外のマシンに、ファイルを |ftp-pass = henomohe バックアップしておく場合。バックアップ先のマシンがロ |unlink = rename −カル側になる。 | |package = katou | ftp-server = 192.9.200.2 | remote-directory = /usr/people/katou/PPP | local-directory = /nix/katou/PPP % ftpmirror katou << LOCAL の katou ロッグインで実行する。 * 設定例−管理者のバックアップ % cd /usr/local/lib/ftpmirror << ftpmirror はここに置いた。デフォルトの場所。 default ------------------------------------------ |ftp-debug = 0 |ftp-user = root |ftp-pass = henomohe |unlink = yes << リモ−ト側にないロ−カルのファイルは消す。 | |transfer-file-regexp += !/\/core$/ << core と .core というファイルはミラ− |transfer-file-regexp += !/\.core$/ しない。 | |package = katou << パッケ−ジは幾つでも記述できる。 | ftp-server = 192.9.200.2 | remote-directory = /usr/people/katou/PPP | local-directory = /nix/katou/PPP | override-file-uid = katou << LOCALにファイルを持ってきた時のオ−ナ、グル− | override-file-gid = user プ、パ−ミッションを設定する。ftp-user が root | override-file-mode = 776 だと root,sys というようになる。パ−ミッション | は指定しなければ 644 がつく。 |package = haruo | | | override-file-uid = haruo << オ−ナは haruo です。gid, mode も必要なら設定。 | | % ftpmirror katou << katou の分を実行する。 % ftpmirror haruo << haruo の分を実行する。 (3) ftpmirror その他 '99/05 * 自動運転 ftpmirror には mirror.sh という自動運転のためのスクリプトが入っている。 これを実 際使うには $prefix/list.xxx というファイルを用意して、それにミラ−したいパッケ− ジの名前を羅列することになっている。また、mirror.sh でのログを取るには rotate と いうコマンドが必要である。 これらのことは ftpmirror のマニュアルに書かれているの で必要になった時に参照されたい。しかしログを取らないのであれば "ftpmirror katou" と直接 cron の制御ファイルに指定する方が簡単かも知れない。 mirror.sh ------------------------------------------------------------- |#!/bin/sh |libdir=/usr/local/lib/ftpmirror |name=${1-daily} | |if [ ! -f "$libdir/list.$name" ]; then | echo "$libdir/list.$name not found" 1>&2 | exit 1 |fi |set - `sed '/^#/d' "$libdir/list.$name"` | |log=/var/log/mirror.$name |/usr/local/bin/rotate -o root -g wheel -m 0640 $log 3 2 1 0 |exec >$log 2>&1 | |for i |do | $libdir/ftpmirror $i |done * 気付いたこと ・パ−ミッションを維持してコピ−することはできないみたいだ。 ・Apollo の ftpd には ftpmirror は効かなかった。 ・rsync や rdist というのもミラ−ができるソフトである。 * ftp アクセスの制限について ftpmirror でも安全のためアクセス先のディレクトリ以下のファイルしかアクセスできな いようにしたい。アクセス先の ftpd や passwd ファイルで何ができるか調べてみた。先 ず ftpd に関係するアクセス先の /etc/ftpusers ファイル。 これに ftpd を許したくな いユ−ザ名を列挙することができる。 root や bin などは念のため 記入しておいた方が いいかも知れない。ftpusers ファイルはどのEWSの ftpd にもある。 フリ−ソフトの wu-ftpd は ftpaccess、ftphosts という制御ファイルがあり、 より細かなアクセス制限 を掛けることができる。 次に chroot も掛けてみたい。しかしこれは普通の ftpd では、anonymous FTP にしか効 かない。wu-ftpd はどんなユ−ザ名でも chroot が効くみたいである。anonymous FTP で は /etc/passwd で ftp というユ−ザが、anonymous FTP 用のユ−ザ名に予約されている。 アカウントは anonymous か ftp でパスワ−ドは無視される。 ftpmirror でも相手 ftpd に anonymous でアクセスすれば chroot は効くということである。 しかし社内でのミラ −サ−バの運用であれば、できれば特定のユ−ザ名でアクセスしたいものだが。 /etc/passwd --------------------------------------------------- |ftp:*:997:998:account ftp:/usr/local/ftp:/dev/null << INDY での例。 |tomo:xnS1Ia23XzYa0:108:12:tomo:/usr/people/tomo:* INDY では passwd ファイルのシェルフィ−ルドに * を入れると、 chroot を掛けれると あった。% man login の説明でいろいろやってみたが、できなかった。Solaris 2.x では /bin/sync と入れるようだ。上記の tomo さんに * を設定したが、 login も telnet も できなくなった。login コマンドを入れると画面は一瞬出て、すぐに閉じる。 telnet は コネクションを切られてしまう。ftp はできるが、chroot はかからない。 どこのディレ クトリにでも行けてしまう。どうもいろいろあるようだ。 ※anonymous FTP については "6-4. ネットワ−クコマンドの仕組み、(3)ftp コマンドの 性質" を見られたい。どうやって anonymous FTP サイトを作るか記しておいた。 * rdist についても少し追加 EWSの Silicon Graphics 社のマニュアルを見ていたら、rdist はできるだけファイル のオ−ナ、グル−プ、モ−ドを維持してコピ−しようとするとあった。ftpmirror ではど うもできそうになかったことなので、注目したい。 IRIX 5.3 のOSでは新しいバ−ジョ ンの rdist はただの rdist、旧バ−ジョンは ordist で入っている。 rdist コマンドは いわゆる R 系コマンドなので、パスワ−ド設定した場合には相手先ホストに .rhosts か hosts.equive が必要となる。以下は INDY でただコマンドをたたいた場合と INDYのマニ ュアルに載っていた cron 運転のやり方である。 rdist の制御ファイルは通常 distfile だが、その記載はないみたいである。どうもディレクトリ単位でのコピ−のようで、この 場合は制御ファイルは必要ないのかも知れない。 % rdist LOCAL ERROR: No distfile found. crontab -------------------------------------------------------------------- |0 23 * * 1-5 rdist -F -oremove -c /nix/katou katou@indy2:/nix/katou (4) rsync コマンドも試す `22/02 * rsync の概要 他のホストにネットワ−ク経由でファイルをコピ−するソフトには、ftpmirror の他にも rsync, rdist, sitecopy といったソフトがあることが分かった。 その中でも、どうやら rsync というソフトが一番いいようである。一度使ってちょんまげ。差分バックアップで 高速。ファイルのオ−ナ−、パ−ミッション、タイムスタンプもコピ−してくれる。特定 のファイルをコピ−に含める、含めないの指定ができる。アクセスできるホスト制限もで きる。オプションは他にも豊富にあり、-au 指定することにより、双方のホストで rsync をかけあってファイルの同期をとることもできる。それに rsync は内部では rsh を用い るが、rsh の暗号化版ともいえる ssh をオプションで指定することもできる。 これによ りコピ−中の通信を暗号化する。ssh がインスト−ル、設定されている必要があるが。 [ 参考 ] 「UNIX MAGAZINE」'02/07 P.75〜83、"UNIXの知恵袋 rsync"、 シャ−プのしま・けい > いち氏の最後の掲載記事。一番詳しい、できればコピ−して手許においておくこと。 「UNIX MAGAZINE」'02/09 P.107〜115、"UNIX便利帖 WWWコンテンツを同期させる"。 > rsync の説明。sitecopy の説明、sitecopy は FTP か WebDAV プロトコルを使う。 http://rsync.samba.org/ rsync の公式サイト、rsync は GNU General Public License > 国内はここ、http://www.infoscience.co.jp/technical/rsync/。 rsync は rcp とよく似ている。rsync より機能は上である。 それに rsync は rdist よ りも便利に使える。特に ssh と併用する場合は便利である。 また、単なる cp の強化版 としても使える。使い方は通常の rcp とほぼ同じである。 anonymous rsync というのが ある。この記事と下記のオプションの説明は、どこかのサイトを見てあった抜粋である。 rsync -auvvzb --exclude '*~' ~/public_html www: -a archive (ファイルについての情報を保つ) -u update (より新しければ更新しない) -v verbose (-vv more verbose) -z compress with zlib (電話線経由ならずいぶん速くなる) -b backup (古いファイルは ~ の付いた名前になる) * ロ−カルで rsync を使う # ls -F ここでの2つのテストの最初の状態。ディレクトリ A があるのみ。 A/ # ls -l A -rw-r--r-- 1 root users 77 Feb 5 14:23 Makefile -rwxr-xr-x 1 katou users 32998 Feb 5 14:23 configure [ パタ−ン1 ] この例では、ディレクトリ B を作り、その中にディレクトリ A を作ってファイルをコピ −していることに注意されたい。 それに rsync コマンドの -a オプションにより、ファ イルのオ−ナ−、パ−ミッション、タイムスタンプを維持していることにも注意されたい。 -a または --archive で -rlptgoD を指示したのと同じになる。 -r または --recursive で再帰的にディレクトリをコピ−する。 # rsync -a A B # ls -l B/A -rw-r--r-- 1 root users 77 Feb 5 14:23 Makefile -rwxr-xr-x 1 katou users 32998 Feb 5 14:23 configure [ パタ−ン2 ] # rsync -a A/ B << ディレクトリ B を作って、ファイルをコピ−する。 # ls -l B -rw-r--r-- 1 root users 77 Feb 5 14:23 Makefile -rwxr-xr-x 1 katou users 32998 Feb 5 14:23 configure ディレクトリ A でファイル file1 を作って、# rsync -a A/ B をやると、file1 だけデ ィレクトリ B にコピ−される。 # rsync -av A/ B << -v は verbose モ−ドで実行するオプション。 building file list ... done file1 ./ wrote 251 bytes read 36 bytes 574.00 bytes/sec total size is 50975 speedup is 177.61 ディレクトリ A でファイル file1 を編集する。# touch A/file1 として、新しいタイム スタンプのファイルにしてみる。 # rsync -ab A/ B << -b は バックアップを残すオプション。 # ls -l B -rw-r--r-- 1 root users 77 Feb 5 14:23 Makefile -rwxr-xr-x 1 katou users 32998 Feb 5 14:23 configure -rw-rw-r-- 1 root users 0 Feb 5 14:41 file1 -rw-rw-r-- 1 root users 0 Feb 5 14:37 file1~ << 前のファイル。 [ パタ−ン3 ] # cd /home/users/katou/C # rsync -av /home/users/katou/A/ . << カレントのディレクトリにコピ−する。 building file list ... done ./ Makefile configure ./ wrote 51590 bytes read 180 bytes 103540.00 bytes/sec total size is 50975 speedup is 0.98 * リモ−トで rsync を使う [ INDY --> Cobat Qube3 ] 相手先ホストで rsync サ−バが稼働していなければならない。rsyncサ−バはデフォルト で /etc/rsyncd.conf というファイルを見る。/etc/inetd.conf でその都度稼働させるこ ともできる。ここでは # rsync --daemon とやってデ−モンモ−ドで起動させておく。そ れに相手ホストに rsh アクセスが、 ロッグイン表示なしでできるようにしておかなけば ならない。そのため、相手ホストの /etc/inetd.conf の "shell", "login"を有効にする こと。相手ホストに /.rhosts ファイルを作って "+" 指定するなどしておくこと。 [ Qube3 側 ] # rsync --daemon << /etc/rsyncd.conf ファイルがないと起動しない。 /etc/rsyncd.conf # ls -l /home/users/katou/SSS ---------------------------- -rw-r--r-- 1 katou users 94 Feb 5 17:11 Makefile |[dir1] -rw-rw-r-- 1 katou users 0 Feb 5 17:11 file1 |path=/home/users/katou/SSS |comment=Katou Backup おかしい。/.rhosts ファイルも作らず、/etc/inetd.conf の shell,login のとこもコメ ントが付いたままでやってみたら、本来ならできないはずが、以下のようにコピ−できて しまった。rsh は INDY へ は効かなかった。どうなっているの?。 /.rhosts /etc/inetd.conf -------- --------------------------------------------------------- |+ |shell stream tcp nowait root /usr/sbin/tcpd in.rshd |login stream tcp nowait root /usr/sbin/tcpd in.rlogind [ INDY 側 ] % rsync -a rsync://192.168.1.20/dir1 BBB % ls -l BBB -rw-r--r-- 1 502 users 94 2月 5日 17時11分 Makefile -rw-rw-r-- 1 502 users 0 2月 5日 17時11分 file1 INDY 側のファイルの katou のオ−ナIDと、Cobalt 側の katou のオ−ナIDが異なっ ている。グル−プIDの users については、双方 100 で同じにしてみた。Cobaltのファ イルが INDY にコピ−されたが、オ−ナIDは元の Cobalt の 502 がついている。 % rsync -a rsync://192.168.1.20/dir1 << ファイルをリストするだけ。 drwxrwxr-x 1024 2002/02/05 17:11:53 . -rw-r--r-- 94 2002/02/05 17:11:38 Makefile -rw-rw-r-- 0 2002/02/05 17:11:53 file1 % rsync -a rsync://192.168.1.20/dir1 << Qube3 に rsync デ−モンが稼働して failed to connect to 192.168.1.20 - Connection refused ない場合。 * リモ−トで rsync を使う [ INDY <-- Cobalt Qube3 ] マシン | オ−ナ | グル−プ | /etc/passwd -------|-----------|-----------|---------------- indy | katou:101 | users:100 | katou::101:12 Qube3 | katou:502 | users:100 | katou::502:100 □ indy □ Qube3 |.10 |.20 ------------------------------------------- 192.168.1.0 /.rhosts # rsync rsync://192.168.1.10 -------- dir1 Katou Backup |+ dir2 /etc/rsyncd.conf # rsync -a rsync://192.168.1.10/dir2 . --------------------- @ERROR: invalid gid |[dir1] |path=/nix/katou/AAA できない。リストができる。ファイルのオ |comment=Katou Backup −ナ、グル−プが何かおかしい?。 |[dir2] |path=/nix/katou/BBB # rsh 192.168.1.10 << これは効いた。 indy # exit % rsync --daemon indy # rlogin: connection closed. * ダウンロ−ド&コンパイル % ftp ftp.infoscience.co.jp ftp> cd /pub/rsync ftp> ls -rw-r--r-- 1 root root 1270 Jan 26 00:03 NEWS -rw-rw-r-- 1 root root 7211 Jan 3 07:19 README drwxrwsr-x 13 root root 1024 Oct 15 14:59 binaries drwxrwsr-x 2 root root 3072 Jan 25 23:41 old-versions drwxrwsr-x 2 root root 3072 Jan 25 23:39 patches drwxrwsr-x 2 root root 1024 Jan 25 02:48 preview -rw-r--r-- 1 root root 1270 Jan 25 23:19 rsync-2.5.2-NEWS -rw-r--r-- 1 root root 368916 Jan 25 23:18 rsync-2.5.2.tar.gz -rw-r--r-- 1 root root 1021226 Dec 6 08:02 rsync.cvsroot.tgz -rw-r--r-- 1 root root 45644 Jan 3 07:19 rsync.html -rw-r--r-- 1 root root 21345 Jan 3 07:19 rsyncd.conf.html -rw-rw-r-- 1 root root 349819 Jun 19 1996 tech_report.ps -rw-rw-r-- 1 root root 3848 Apr 6 1999 win95.txt /binaries/Solaris/ には rsync-2.5.2.Solaris251.sparc.tar.gz があった。redhat/ に は rsync-2.4.6-1.src.rpm、linuxppc/ には rsync-2.4.1-1.ppc.rpm、IRIX/ のところに は rsync-2.5.2.IRIX62.tar.gz があった。old-versions/ にはバ−ジョン 0.1 からずっ とあり、2.4.8, 2.5.0, 2.5.1 となり最新バ−ジョンは 2.5.2 となっている。 ここでは IRIX 5.3 と Cobalt Qube3 に入れてみた。どちらも 2.5.2 はコンパイルがうまくできな かった。それで古いバ−ジョンの 2.4.8 でやってみたら、ちゃんとコンパイルできた。 % zcat rsync-2.4.8.tar.gz | tar xvf - % cd rsync-2.4.8 % ./configure % make % make -n install mkdir -p /usr/local/bin ./install-sh -c -m 755 rsync /usr/local/bin mkdir -p /usr/local/man/man1 mkdir -p /usr/local/man/man5 ./install-sh -c -m 644 ./rsync.1 /usr/local/man/man1 ./install-sh -c -m 644 ./rsyncd.conf.5 /usr/local/man/man5 (5) pdumpfs をやってみる * pdumpfs の概要 自分のマシンの他のディレクトリに、日常作業しているディレトリのファイルを毎日バッ クアップする。普通こうしたバックアップソフトは、何世代かバックアップを残すだけな のだが、pdumpfs はその日その日のバックアップをとることができる。前日から変化のあ ったファイルはそのままコピ−し、変化がなかったのは、前日のファイルのハ−ドリンク とする。ハ−ドリンクは見た目、まるでリンクになっていることは分からない。リンク元 のファイルを消去しても、リンク先のファイルは消えない。 このようにして pdumpfs は ハ−ドリンクの性質をうまく利用し、差分バックアップを実現している。仕組みにハ−ド リンクを用いているので、稼働するのはUNIX系のOSである。ひょっとして Windows NT の NTFS ファイルシステムなら動くのかな。それに pdumpfs はオブジェクト指向のス クリプト言語の Ruby で記述されているので、Ruby を別途インスト−ルしておくこと。 使い方としては、バックアップ先を同じマシンの外付けディスクにすればより安全である し、NFS で他のマシンのディレクトリにコピ−すれば、尚バックアップの安全性が高まる。 自分のマシンをファイルサ−バとし、 更に rsync でリモ−トのディスクのファイルをコ ピ−してきて、毎日その差分ファイルを pdumpfs で取るようにする。 ついでにWWWで 操作画面をちょっと作ってやる。ここまですればへたな有償のバックアップソフトは要ら ないかも知れない。pdumpfs は開発者のできるだけシンプルにという考えにより、オプシ ョンはない。cron で毎日バックアップをとるようにすると、 ずっとバックアップを取り 続ける。いつかディスクが一杯になってしまう。それで、何日以上経ったのは消すという、 どなたかが作った pdumpfs-clean と言うユ−ティリティ・ソフトがある。 しかし、この 高林哲という人、すごいです。何でもあっという間に開発してしまう。 「UNIX MAGAZINE」2002/09, P.124〜130, "横着プログラミング8 pdumpfs" > 毎日のスナップショットを保存する。高林哲氏作成、Namazu の開発者。 * Ruby をインスト−ルする 最初、INDY IRIX 5.3 に入れてみようとしたが、このマシンではうまくコンパイルできな かった。次に Mail-Store で使っている Solaris 2.6 でコンパイルしてみた。 すんなり 入りました。ここで一つ気になることが。コンパイルにえらく時間がかかったのだ。10 分はかかった。多分ものの数分で終わりそうな気がするのだが。ひょっとして、ウィルス チェックの InterScan VirusWall がフル稼働していたとか、sendmail のメ−ル処理がメ −ルの数に追い付いて行ってないとか。少々、気に掛かる現象ではあった。要チェック!。 # ftp ftp.ruby-lang.org 220 ProFTPD 1.2.5rc1 Server (Debian) [helium.ruby-lang.org] Using binary mode to transfer files. ftp> cd pub/ruby ftp> ls drwxr-xr-x 2 1001 users 4096 Jul 17 1998 1.0 | drwxrwxr-x 2 1001 users 4096 Dec 24 2002 1.6 drwxr-xr-x 2 1001 users 4096 Jun 23 09:08 1.8 drwxr-xr-x 2 1001 users 53248 Jul 17 16:06 ML drwxrwxr-t 6 0 ftpbinaries 4096 Mar 19 14:42 binaries drwxrwxrwt 2 1001 users 12288 Jul 4 10:07 contrib drwxr-xr-x 4 1001 users 4096 Dec 27 2001 doc drwxrwx-wx 2 1001 staff 4096 Jul 4 10:07 in.coming -rw-r--r-- 1 1001 users 1023403 Dec 24 2002 ruby-1.6.8.tar.gz drwxrwxr-x 2 1001 staff 4096 Apr 19 13:06 shim -rw-r--r-- 1 1001 users 1602080 Jul 17 19:00 snapshot.tar.gz drwxrwxr-x 2 1001 staff 4096 Jun 26 03:19 snapshots lrwxrwxrwx 1 1001 users 3 Apr 5 2001 stable -> 1.6 -rw-r--r-- 1 1001 users 995188 Jul 17 19:00 stable-snapshot.tar.gz ftp> get ruby-1.6.8.tar.gz # /bin/csh # setenv PATH /usr/local/bin:/usr/ccs/bin:$PATH # zcat ruby-1.6.8.tar.gz | tar xvf - # cd ruby-1.6.8 # ./configure creating cache ./config.cache checking host system type... sparc-sun-solaris2.6 | # make << /usr/local/bin/make です。gcc のバ−ジョンは 2.95.2 だった。 gcc -g -O2 -I. -I. -c array.c | Mail ホストでコンパイルした。ウィルスチェックの IScanHttpd プロセスが10個走っ ていた。このせいかまるでコンパイルが進まなかった。 # make -n install ./miniruby ./instruby.rb # make install ./miniruby ./instruby.rb ruby -> /usr/local/bin/ruby chmod 0755 /usr/local/bin/ruby mkdir /usr/local/lib/ruby/1.6 mkdir /usr/local/lib/ruby/1.6/sparc-solaris2.6 mkdir /usr/local/lib/ruby/site_ruby/1.6 mkdir /usr/local/lib/ruby/site_ruby/1.6/sparc-solaris2.6 installing Win32API installing curses | chmod 0755 /usr/local/bin/irb | ruby.1 -> /usr/local/man/man1/ruby.1 chmod 0644 /usr/local/man/man1/ruby.1 rbconfig.rb -> /usr/local/lib/ruby/1.6/sparc-solaris2.6/rbconfig.rb chmod 0644 /usr/local/lib/ruby/1.6/sparc-solaris2.6/rbconfig.rb # make clean << インスト−ルしたら、これやっておけばディスクが節約できる。 * pdumpfs を取ってきて展開する http://www.namazu.org/~satoru/pdumpfs/ # zcat pdumpfs-0.6.tar.gz | tar xvf - x pdumpfs-0.6, 0 bytes, 0 tape blocks x pdumpfs-0.6/pdumpfs, 5239 bytes, 11 tape blocks x pdumpfs-0.6/ChangeLog, 2340 bytes, 5 tape blocks x pdumpfs-0.6/pdumpfs-en.html, 4136 bytes, 9 tape blocks x pdumpfs-0.6/pdumpfs-ja.html, 4229 bytes, 9 tape blocks x pdumpfs-0.6/tests, 0 bytes, 0 tape blocks | x pdumpfs-0.6/tests/pdumpfs-test, 752 bytes, 2 tape blocks x pdumpfs-0.6/man, 0 bytes, 0 tape blocks x pdumpfs-0.6/man/ja, 0 bytes, 0 tape blocks x pdumpfs-0.6/man/ja/man8, 0 bytes, 0 tape blocks x pdumpfs-0.6/man/ja/man8/pdumpfs.8, 3535 bytes, 7 tape blocks x pdumpfs-0.6/man/man8, 0 bytes, 0 tape blocks x pdumpfs-0.6/man/man8/pdumpfs.8, 3219 bytes, 7 tape blocks # cd pdumpfs-0.6 # ls -F ChangeLog pdumpfs* pdumpfs-ja.html man/ pdumpfs-en.html tests/ << このテストみたいのは何かな。 pdumpfs ------------------------------------------------------------------- |#! /usr/local/bin/ruby << Ruby をインスト−ルして、コマンド ruby があること。 |# |# pdumpfs 0.6 - a daily backup system similar to Plan9's dumpfs. |# |# DESCRIPTION: |# |# pdumpfs is a simple daily backup system similar to |# Plan9's dumpfs which preserves every daily snapshot. |# You can access the past snapshots at any time for |# retrieving a certain day's file. Let's backup your home |# directory with pdumpfs! |# |# pdumpfs constructs the snapshot YYYY/MM/DD in the |# destination directory. All source files are copied to |# the snapshot directory for the first time. On and after |# the second time, pdumpfs copies only updated or newly |# created files and stores unchanged files as hard links |# to the files of the previous day's snapshot for saving a |# disk space. |# |# USAGE: |# |# % pdumpfs |# [] |# |# SAMPLE CRONTAB ENTRY: |# |# 00 05 * * * pdumpfs /home/USER /backup >/dev/null 2>&1 | | | | 以下続く、200行程度。 * pdumpfs を簡単にテストしてみる # ./pdumpfs << ディレクトリ指定以外のオプションは何もない。 Usage: pdumpfs [destination basename] # mkdir PPP; cd PPP # touch aa bb # cd .. # mkdir QQQ << あらかじめコピ−先のディレクトリを作っておくこと。 # ./pdumpfs PPP QQQ << 同じディレクトリに PPP と QQQ ディレクトリがある。 # ls -l QQQ/2003/07/22/PPP -rw-r--r-- 1 root other 0 7月 22日 14:03 aa -rw-r--r-- 1 root other 0 7月 22日 14:03 bb # echo "xxx" >> PPP/aa << ファイル aa を同じ日に更新した。 以下のように変わった。 中味を変更することなく pdumpfs やっても変化はなかった。 # ls -l QQQ/2003/07/22/PPP -rw-r--r-- 1 root other 4 7月 22日 14:08 aa -rw-r--r-- 1 root other 0 7月 22日 14:03 bb << 続きのテストはまた明日 >> # echo "yyy" >> PPP/aa << 7月22日14時17分に変更した。 # ./pdumpfs PPP QQQ << 7月23日になってやった。 directory PPP unchanged PPP/bb ファイル bb は変更はないので、先日のファイルのハ−ドリン updated PPP/aa クになる。aaは変更があったので独自ファイルとして作られる。 # ls -l QQQ/2003/07/23/PPP -rw-r--r-- 1 root other 8 7月 22日 14:17 aa -rw-r--r-- 2 root other 0 7月 22日 14:03 bb [ pdumpfs のバックアップファイルの仕組み ] | 1 2 3 4日目 ----|------------------------ f1 | ab <--- <--- abc 変化がなければハ−ドリンクになる。 f2 | xy xyz <--- <--- 変化があれば独自のファイルになる。 f3 | op opq <--- ※ハ−ドリンクになっていることは、# ls -l で見ても分からない。ハ−ドリンクはとて もやらしい。上記で例えばファイル f1 の2日目、1日目のハ−ドリンクになっている が、ファイルの実体は1つであり、どちらのファイルでも変更したら全部が変わること になる。しかし、リンク元のファイルを消してもリンク先は影響を受けない。