2009年3月アーカイブ

2chを読むのに、rep2を愛用している。
iPhone用の修正が取り込まれたので、PCとiPhoneで両方同じように読めるのが良かったので。(と言うか、最近はiPhoneでしか見ないけど)
で、ここのところまちBBSがエラーが出て読めなくなってしまっていた。
板の移転でもあったのかと思って、板更新をしても変わらず。
画面には、
Error: 302 Found
p2 info - http://kanto.machi.to/bbs/read.pl?BBS=kana&KEY=???&START=??? に接続できませんでした。

p2 info - 板サーバから最新のスレッド情報を取得できませんでした。
とか出ているので、rep2が302に対応していないのかなと思ってソースを読む。
lib/threadread.class.php内の、function downloadDat()あたりが怪しい。
そこから、 read_machibbs.inc.phpのfunction machiDownload()、さらにp2util.class.phpのfunction fileDownload()と言った感じか。
でも、真面目に302対応を考える前に、302で何が変わっているのかを調べてみることに。
エラー表示されているURLにブラウザでアクセスしてみると、http://kanto.machi.to/bbs/read.pl?BBS=kana&KEY=???&START=???からhttp://kanto.machi.to/bbs/read.cgi?BBS=kana&KEY=???&START=???に変わっているだけのようだ。
rep2が読み込む板一覧のページ(http://menu.2ch.net/bbsmenu.html)を見ると、http://kanto.machi.to/kana/としか書いていない。
と、言うことは、read.plはソースにハードコードされているはずなので、そのつもりでread_machibbs.inc.phpを読み直すと、46行目にそのままあったので、read.plをread.cgiに修正したら、無事に読めるようになった。
バグ報告いるかな、と思ってrep2の現行スレを見たら、まちBBSの変更をsvn commitしておきました。って書いてあった。
リポジトリを見てみたら、ビンゴだったらしい。っつーか、ソース読む前にリポジトリのコミットログくらいチェックすれば良かったな。
夜中に突然マシンが応答しなくなる。
見に行ってみると、HDDアクセスランプがつきっぱなしでがりがり言ってる。おさまる気配がないので強制リセット。
再起動してからログを見てみたら、以下のようなエラーが出ていた。

再起動前
Mar 28 02:01:26 sv kernel: ad0: FAILURE - READ_DMA status=43
error=43 LBA=39311327
Mar 28 02:01:32 sv kernel: ad0: TIMEOUT - READ_DMA retrying (1 retry left) LBA=3
9311455
Mar 28 02:01:32 sv kernel: g_vfs_done():ad0s1d[READ(offset=17845665792, length=8
1920)]error = 5
再起動後
Mar 28 02:19:41 sv kernel: ad0: FAILURE - READ_DMA48 status=7f error=7f LBA=286219095
Mar 28 02:19:41 sv kernel: g_vfs_done():ad0s2e[READ(offset=6962479104, length=131072)]error = 5
Mar 28 02:19:46 sv kernel: ad0: TIMEOUT - READ_DMA48 retrying (1 retry left) LBA=286218967
Mar 28 02:19:46 sv kernel: ad0: FAILURE - READ_DMA48 status=51 error=4 LBA=286218967
Mar 28 02:19:46 sv kernel: g_vfs_done():ad0s2e[READ(offset=6962479104, length=131072)]error = 5
と、この記事を書いている間にもハング。
シングルユーザで立ち上げて手動fsckしたけど、カタン、カタンと異音がするし、読めないブロックがあるみたいだし、どうもHDDの寿命のようだ。
どうやって移行しよう?
サーバのHDDがエラー頻発して、OS毎落ちてしまうようになった。
一応起動はするが、そのうちエラーが出て落ちてしまう。
新しいマシンへの乗り換えも考えたが、せっかく用意したPentiumMのデスクトップなので、もう少し使いたい。
HDDの異常だと思われるので、ケースを開けて中を見てみる。
IDEにHDDとCD-ROMが繋がっていて、マザーを見るとSATAの端子がある。
秋葉まで行くのも面倒だったので、近所のPCデポへ。
完成品のマシンだと気に入ったのがなくて、やっぱりHDDだけ買うことにする。STATの500Gで5千円ちょっと。
帰ってきたら早速繋ぐ。
FreeBSD 7.1 の bootonly の CD を作成してboot。
biosからは認識されず、FastTrak上で認識したので、RAIDの設定をするが、1台しかないのでRAID0も1もない。
古いHDDはad0(今までどおり)、新しいHDDはad4として認識した。
ad4 に FreeBSD をftpでインストール。
/ 512M
swap 2G
/usr 128G
/var 残り

はっきり言って /usr に 128Gは激しく不要だったな。前回と違って/jailを取らなかったのも問題か。
インストールが終わったら、古いHDDから /etc /usr /var をtarでバックアップ。
/var は古いHDDの内容をそのまま新しいHDDの/varにコピー。/var/runとか問題あるかも知れないけど、大問題にはならないだろう。
途中、ad0のハードウェアエラーっぽいメッセージがしばしば出たが、コピーは継続された。

続いて、/etc/supfileを古い/etcからコピーして、csup する。
/etc/make.conf を古い/etc/からコピーして、/sys/i386/conf/のファイルもコピーして、カーネルとユーザランドを作り直す。(これは別に急がなくても他の復旧を先にやるべきか)

/etcのファイルをコピー
  • group, passwd, master.passwd, pwd.db spwd.db
  • hosts.allow
  • ipf.rules, ipnat.rules
  • inetd.conf
  • newsyslog.conf
  • ntp.conf
  • aliases, aliases.db(aliasesをコピーしてnewaliasesした方が良いかも)
  • cram-md5.pwd
  • periodic.conf
  • printcap
  • sysctl.conf
  • syslog.conf
  • sshディレクトリ
  • crontab(コピーしたら有効になるので、他のパッケージのインストールが済んでからの方が良い)
  • resolv.conf(同上)
  • rc.conf
/usr/local/etc/pkgtools.confもコピーする。

後は、portsからひたすらパッケージをインストールする。
  • ports-mgmt/portupgrade
    この過程で、rubyがインストールされてますよ、と言うエラーが出た。
    /var/db/pkg を古いもので上書きしてしまったのが原因なので、一度このディレクトリを削除した。
    # 面倒だから、/usr/local/毎全部コピーした方が早かったかも。
  • databases/portgresql81-server(最初8.3を入れたら、データベースのバージョンが違うと怒られたので、以降なるべく昔のバージョンと同じものを入れるようにした)
  • databases/mysql50-server
  • sysutils/screen
  • net/isc-dhcp30-server
  • mail/postfix
  • security/f-prot→This version no longer receives updates.
  • security/amavisd-new →f-protが入らないなら意味がないけど、postfixの設定を変えるのが面倒なので入れてみた
  • mail/dkfilter
  • mail/drac
  • mail/mailman
  • mail/qpopper
  • mail/courier-imap
  • www/apache22
  • www/mod_perl2
  • www/mod_python3
  • lang/php5
  • lang/php5-extension
  • devel/subversion
  • www/p5-CGI.pm
  • graphics/p5-Image-Size
  • databases/p5-DBI
  • databases/p5-DBD-Pg
  • security/p5-Crypt-DSA
  • graphics/p5-GD
  • graphics/p5-Image-Magick-Iterator(?)
  • textproc/p5-XML-Atom
  • mail/p5-Mail-Sendmail
  • devel/p5-File-Find-Rule
  • devel/p5-Moose
  • devel/p5-POE
  • devel/p5-UNIVERSAL-require
  • devel/p5-Class-Accessor
  • devel/p5-DateTime-Format-Strptime
  • devel/p5-DateTime-Format-Mail
  • devel/p5-DateTime-Format-MySQL
  • mail/p5-MIME-Types
  • www/p5-Template-Toolkit
  • www/p5-Template-Provider-Encoding
  • www/p5-Feed-Find
  • net-mgmt/net-snmp
  • net-mgmt/cacti
  • japanese/p5-Jcode
  • devel/ruby-gems
  • www/rubygem-rails
  • converters/ruby-iconv
  • graphics/freeimage
  • ports-mgmt/portaudit
  • www/squid
  • editors/emacs
  • sysutils/apcupsd
  • japanese/samba3
  • security/tripwire
  • net/asterisk
  • security/openvpn
  • net/poptop
  • mail/ilohamail

インストールが終わったら、/usr/local/etcの設定ファイルをコピー。
/usr/local/share/courier-imap/imapd.pem 等もコピー
/usr/local/pgsql/data をコピー
/usr/local/apacheをコピー(昔の名残でここにある)
/usr/local/share/cactiをコピー
/usr/local/tiarra, mail2entry, mobircをコピー
/use/local/etc/periodic/weekly/900.cvsupをコピー
/usr/local/share/snmp/snmpd.confをコピー
/usr/local/www/ilohamail.conf/conf.incをコピー

mobircとPlaggerでperlの依存関係で結構はまる。
後は、メール関係がf-protが既にパターンファイルが更新されないとかでインストールできなかったのと、amavisがまともに動かなかった。
そして、imapsとsmtpsが何故か動かず。キーファイルとかは持って来たはずなんだけど。
qpopperのpop3sは問題なく動いた。
まあ、なんとかapacheとfastladder、mobircは動くようになったので、とりあえずは生活できそうだけど、メール周りが不完全っぽいのが気持ち悪いなあ。

あと、今回はいかれたHDDがまだ読めたからなんとかなったけど、本当に読めなくなってしまったら非常に困ったことになるところだった。
今回の移植の手間を参考に、ちゃんとしたバックアッププランを立てないといけないな。(と、いつも思うけどなかなか実現できない。MovableTypeのDBだけバックアップしても、アップロードした写真とかはバックアップできないし、全部取ろうと思うと一回の時間と容量が・・・。)
今回サーバのHDDが死にかけて移行してみて、やっぱりバックアップが必要だと思い立つ。
こう言うときにまず読むのはFreeBSDハンドブック
ここを読むと、伝統的なdumpを使えと書いてある。
うちで実現可能(そう)なバックアップの手段と、評価を書いてみる。
  • FastTrakを使ったRAID
    RAID1とかRAID5を組めば、ハード的な障害には対応できる。
    OS側は何も気にしなくて良いと言うのがメリット。
    ただし、ケース内に複数のHDDを入れる余裕が必要だが、うちのマシンはスペース不足。さらに、同時期に買った同じHDDは壊れる時期も似たようなもんだろうと言う問題がある。
    また、誤ってファイルを消した等の場合には役に立たない。
  • dump/restore
    死んだ時に前と同じ状態に復元するには一番簡単そうな方法。
    復元するのに前と同じサイズ以上の領域が必要だったり、一部だけ取り出すとかの用途には向かない。
    一応差分バックアップも取れる。
  • tar
    一部だけのファイルを復元したいときには便利だが、HDDが死んでしまったときの復元には使いづらい。
  • rsync
    差分バックアップが取りやすい(?)。全部死んだ時に使えないのはtarと同じ。
バックアップは、用途に合わせて複数取るのが理想なので、dumpでフルバックアップと差分バックアップ、tar/rsyncでライブバックアップなんて言うのが良さそうだけど、それだけのバックアップ先を用意するのは大変だ。
うちの場合、余っているのはNASの250G程度。今回買ったHDDは500Gなので、使い切ったらフルバックアップすら取れない計算だ。

まあ、うだうだ言ってやらないよりは、どれか一つでもやっておいた方が良いに決まっているので、世代管理なしのdumpフルバックアップを月1で取ることにする。
  1. サーバ上で、rootのsshの鍵を作る。
    # ssh-keygen -t dsa
    
    cronで実行したいので、パスフレーズはつけない。
  2. でき上がった .ssh/id_dsa.pub を NASの ~root/.ssh/authorized_keys にコピー。サーバからNASに対してパスワードなしでsshログインできることを確認しておく。
  3. 以下のバックアップスクリプトを、サーバの /usr/local/etc/periodic/monthly に置く。
    #!/bin/sh
    
    /sbin/dump -L0uan -f - / | /usr/bin/gzip -2 | /usr/bin/ssh ts-tgld4c dd of=/mnt/array1/backup/root.dump.gz
    /sbin/dump -L0uan -f - /usr | /usr/bin/gzip -2 | /usr/bin/ssh ts-tgld4c dd of=/mnt/array1/backup/usr.dump.gz
    /sbin/dump -L0uan -f - /var | /usr/bin/gzip -2 | /usr/bin/ssh ts-tgld4c dd of=/mnt/array1/backup/var.dump.gz
    
    ts-tgld4c は NASのホスト名。
これで、月に1回NASに /, /usr, /var の内容がフルバックアップされる。一度手動で動作させて確認しておくこと。
世代管理がしたければ、固定のファイル名にしないで日付か何かをつけて、rotateさせるようにすれば良い。
Filesystem     Size    Used   Avail Capacity  Mounted on
/dev/ad4s1a    496M    295M    161M    65%    /
devfs          1.0K    1.0K      0B   100%    /dev
/dev/ad4s1d    124G    4.7G    109G     4%    /usr
/dev/ad4s1e    325G     85G    214G    28%    /var
devfs          1.0K    1.0K      0B   100%    /var/named/dev
をバックアップするのに、約19時間かかり、コピー先の使用量は46GBだった。
periodic monthly が動くのは毎月1日の朝の5時半なので、このままだとバックアップが利用時間にかかってしまうな。crontabをいじった方が良いだろうか。(って、19時間じゃあいつにしても駄目か)

そうそう、リモートとのやりとりに上記の方法でsshを使う場合、サーバの~root/.ssh/id_dsa を別にバックアップしておかないと、fixitで起動したOSからNASにファイルが取りにいけないことを忘れてはいけない。(っつーか忘れてた)
と思ったけど、新しくssh-keygenして、またNASの.ssh/authorized_keysに入れれば問題ないか。
2009年3月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        

このアーカイブについて

このページには、2009年3月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2009年1月です。

次のアーカイブは2009年5月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 6.1.1