2010/05/17(月)省電力マシンで Ubuntu 10.04 Server セットアップメモ

2010/04/05(月)Linuxなリモートサーバを自動バックアップ

LinuxやFreeBSDのリモートサーバを自動的にバックアップする仕組みを構築したときのメモ。

基本戦略

  1. リモートサーバ上の特定ディレクトリを1日1回程度自動バックアップする。
    • バックアップには tar を使う。
    • 定期実行には crontab を使う。
  2. 手元のサーバにも、バックアップのコピーを自動で送り込む。

最初sftpを使おうと思ったのですが(参考資料)、ftpのようにputのみの許可にできないのでやめました。ftpでも良いのですが、今更(この時代に)ftpのサービスなんて起動したくない。

色々考えた結果。

  • 手元サーバにWebDavを入れて、PUTメソッドでファイルを送り込む。
  • 転送ファイルの秘匿が必要なときは暗号化する。

使用ツールの選定

WebDav(HTTP PUT)を実行できるツールを探すのにひと苦労しました。cadaverというツールが有名なのですが、対話的プログラムなので自動化全く向かない。色々探していると、ndという小粒なツールを発見。ありがたいことです。*1

ファイルの暗号化には openssl コマンド。

リモートサーバ内にもバックアップを保存するので、古いバックアップを削除するためのツールとして tmpreaper(tmpwatchの代わり)を使用しました。

# apt-get install tmpreaper
# apt-get install nd

手元サーバ

Apache に mod_dav と mod_dav_fs を入れました。

*1 : スクリプトとかで書いても大した手間じゃないですが、パッケージ化されている方が何かと楽なので。

リモートサーバへの仕込み

まず次のスクリプトを仕込み ~/bin/backup.sh として保存しました。

#!/bin/sh
#-------------------------------------------------------------------
# Automation backup script
#-------------------------------------------------------------------
TMPREAPER=/usr/sbin/tmpreaper

DIR=~/backup
DATE=`date '+%Y%m%d'`
FILE=$DATE-public_html.tar.gz

# 30日経過したファイルを削除
$TMPREAPER -m 30d $DIR

cd ~/
tar zcf $DIR/$FILE.tmp public_html/

# OpenSSLを使用してファイル暗号化
openssl enc -e -AES256 -k 'PASSWORD' -in $DIR/$FILE.tmp -out $DIR/$FILE
rm $DIR/$FILE.tmp

# 手元サーバに送り込む
nd -p $DIR/$FILE http://(local-server)/davput/$FILE

~/backup は chmod 700 としておきます。

自動実行させるため、crontab -e として組み込みます。

# m h  dom mon dow   command
0 4 * * * ~/bin/backup.sh

手元サーバの設定

Debian系(Ubuntu)を前提として話しますが、他サーバの時は適当に読み替えてください。

  • 保存場所 /home/dav/davput

まずWebDavを有効にします。

# cd /etc/apache2/mod-enable/
# ln -s ../mods-available/dav.load
# ln -s ../mods-available/dav_fs.load
# ln -s ../mods-available/dav_fs.conf

続いて dav_fs.conf を編集します。

Alias /davput /home/dav/davput
<Directory "/home/dav/davput">
        DAV             on
        AllowOverride   None
        Options         None

        order deny,allow
        deny  from all
        <Limit PUT>
                order deny,allow
                deny  from all
                allow from 127.0.0.1
                allow from (リモートサーバのIP)
        </Limit>
</Directory>

リモートサーバのIPに対してPUTのみを許可します。GETなどを許可するといらぬデータ盗用を招きかねないので注意。より強固にするならパスワードもかけると良いでしょう。

保存場所である /home/dav/davput を www 権限で書き込みできるようにしておきます。

# chmod 700 /home/dav/davput
# chown www-data:www-data /home/dav/davput

テスト

リモートサーバに入り、backup.sh を手動で叩きます。エラーがでず、手元サーバおよびバックアップディレクトリにアーカイブがおかれていれば成功です。

まとめ

手元サーバにはバックアップファイルがたまり続けるので、定期的に削除するか、tmpreaperをcrontabに仕込むと良いでしょう。

tmpreaperのメモ

tmpwatchを使おうとしたらそんなパッケージは無いと怒られたので。

debian系だと /usr/sbin/tmpreaper にたぶん入る。

# 最終更新日時で10秒経過したものを削除
$ /usr/sbin/tmpreaper -m 10s ~/dir

# 最終更新日時で10分経過したものを削除
$ usr/sbin/tmpreaper -m 10m ~/dir

# 最終更新日時で10時間経過したものを削除
$ usr/sbin/tmpreaper -m 10h ~/dir

# 最終更新日時で10日経過したものを削除
$ usr/sbin/tmpreaper -m 10d ~/dir

VirtualHost対応のため curl を使う 2019/07/22

ndコマンドは VirtualHost に対応していない(Hostヘッダを送信しない)ので、curlに変更しました。

curl -s -X PUT -H "Host: example.com" -T $DIR/$FILE http://example.com/davput/$FILE >/dev/null

2009/04/15(水)OpenLDAP の Berkeley DB が壊れた……

長年運用してきた某所にある OpenLDAP の Berkeley DB が(リセットなどのトラブルで)ファイル破損しました。

# slapd.sh start

して一応数秒返ってくるんですが、OpenLDAPシステムが起動したまま接続を受付ない。どうも起動プロセスの途中で止まってしまう模様で、ログにもスタートしました以外、何も残ってない。

# slapd.sh stop

してもプロセスがみつからないと言われるし、実際にプロセスはあるんだけど kill -KILL しないと落ちてくれない。「telnet 127.0.0.1 387」しても何も応答がない。

結果的には、OpenLDAPのデータ管理している Berkeley DB の故障で、故障すると BDB 関係の関数がハングアップする模様。さてこれは困った。

復旧コマンドがあったらしい

BDBを開こうとするだけで停止するので、ダンプも何もできない。さて困った……と思ったら、db_recover という復旧コマンドがあるらしい。OpenLDAP 2.2.30 on FreeBSD だったので、DBDはVer4.2。ということで、

/var/db# db_recover-4.2 -c -v -h openldap-data
db_recover: Finding last valid log LSN: file: 1 offset 10445896
db_recover: Recovery starting from [1][28]
db_recover: Recovery complete at Wed Apr 15 00:11:18 2009
db_recover: Maximum transaction ID 800019e7 Recovery checkpoint [1][10445896]

とやって無事復旧しました。Berkeley DBは壊れたとき、必ずしも「エラー」になってくれないので原因究明が厄介ですね。

svnとかもそうだけど、Berkeley DBは時々壊れてくれるので、バックアップ取っておかないと痛い目みる。

参考

2009/02/25(水)Plone / Archetypes のプロダクトサンプル

ArchExampleをベースに製作したプロダクトサンプルを配布し、解説します。ArchetypesによるPlone3.x Product開発に資料はあるにはありますが、とても直感的には理解しにくいため、分かっている範囲で分かりやすく解説します。*1

続きを読む

2009/02/23(月)Ploneのメモ