もし間違ってDROP DATABASEしてしまったら

って状況から脱出するというお仕事をしたのでメモ。 DROP TABLE でも、単純に rm してしまったら、でも同じ。今回の状況は次の通り。

  • バックアップなし、レプリケーションもしてないので binlog もない
  • MyISAM が数十テーブル、合計 20GB 弱
  • datadir のパーティションは /dev/sda2, ファイルシステムは ext3

 

 

1. 今すぐパーティションをアンマウント

# umount -f /dev/sda2

次のマウント時にジャーナルやinodeがクリーンアップされてしまうので、再起動とか remount は厳禁。 (ro は大丈夫かも)

一方で今まで動いてた mysql は身動きできなくなってしまうのでこっちも stop する。同じパーティション上に存在する他のテーブルに対する flush されてない変更は失われてしまうけど、それが実行されて上書きされると元も子もないので思い切って止める。

2. 現状を丸々ディスクイメージとして保存

# dd bs=4M if=/dev/sda2 of=/somewhere/image

現状のパーティションをディスクイメージとして、十分容量のあるどこかにまるまるダンプ。

容量が足りない!って時は裏技として dd bs=4M if=/dev/sda2 | gzip -c /somewhere/image.gz とかやって gzip 掛けながらダンプ。今回のだと重複テキストの多いデータベースだったので 500MB ぐらいに縮んだ。

これが完了した時点で、元のパーティションはもう変更されても問題ない。必要であれば remount して、削除してしまった以外のデータベースについて mysql を復活させることができる。ただ、必要がないのであれば umount したまま(止めたまま)にしておいた方が無難。複数 DB をまたいで参照するようなサービスを運用していた場合は、そもそも不整合が発生してしまうので復活させてはいけない。ケースバイケース。

3. extundelete をダウンロード & ビルド

extundelete は、 ext3/4 向けの削除ファイル復元ツール。

Fedora 16 など extundelete をバイナリで取得できるディストリビューションであれば yum なり apt-get なりで導入できる。ただそうでないケースの方が現状多いので、自前でビルドする。基本的に  tar を展開して ./configure && make すればひとまず src の下に extundelete コマンドができるはず。ビルドには e2fslibs などが必要なので、適宜 apt-get するなりなんなりで足す。パッケージが足りてるのにビルドできない!って時はもはや gcc とかが古いので、別の新しい環境に上で作ったイメージをコピーして作業。(今回はそうするために前節のgzipで圧縮、をやった)

一般的に、ファイルを削除してしまった同じ環境上で、新しいツールのインストールやビルドといった write の発生する処理をやるのは怖いイメージがある(自分だけかもしれない)けど、今回はすでにイメージを取っているので何やっても大丈夫。

4. いざ復元

# extundelete --restore-all /somewhere/image

これだけ。その他のオプションは特に要らない。実行すると、カレントディレクトリに RECOVERED_FILES というディレクトリができ、その中にどんどん救出されたファイルが出てくる。すんばらしい。必要であれば削除した日時でフィルタリングしたり、ファイル名を直に指定して復元したりできるので、その辺はドキュメントを参照。

一通り終わってディレクトリを見てみて、 myisamchk *.MYI とか掛けてみる。あれ、 table.MYD not found ? どうもファイルが足りない?

extundelete はどうも 0 バイトのファイルは復元してくれない模様。空のテーブルの MYD ファイルは 0 バイトなので、元々空だったな、と思ったら touch table.MYD とかで作ってしまうのも手。でもどうも違う気がする、場合は次に続く。

5. 漏れたファイルは名前を指定して復元

# extundelete --restore-file path/to/table.MYD /somewhere/image

extundelete でファイル名を直に指定して救出を試みる。どうも restore-all だと見つけきらないこともあり、その場合もこのように直にパスを指定すると救出できた。

今回はこれでひとまず全部問題なく救出できた。あとは myisamchk ( -r なり -o なり ) を掛けて、ユーザー、グループ、パーミッションを確認して元の位置に移動して、 mysql を起動すれば、ジャーン!元通り。お疲れ様でした。

ファイルが足りなかった辺りで、 ext3grep (名前通り ext3 の superblock や inode を探索しつつファイルを救出するツール) も試して手動で辿るってのもやってみたりしたけど、結果的に extundelete の restore-file でも問題なく救出できて、使わなくてもよかったので特に記載せず。 HOWTO の “Manual recovery example” の手順通りにやると色々探索してる感があって面白いので、時間があれば試してみるのもいいかもしれない。ちなみにどちらのツールも、既存のファイルシステムに write する処理はないので live なパーティションで試しても安全です。

燃えないゴミの日

# 明日燃えないゴミの日なのでPCパーツとか要らないものを捨てる

# 12cmケースファン、初代ソニー純正メモリースティックリーダ、使えるかわからないFMトランスミッター、Che-ez CRAKKER、100base-TX PCカード(CardBus)、USBアナログテレビチューナ(S/コンポジ入力あり)…

# 壊れた2.5inchHDD、J-SH52の充電台、U-ATA100 RAIDカード、5インチベイ用ファンコン、スーパーファンコン(2ch)… あThinkPad X22のバッテリはリサイクル出さなきゃ駄目か

# ASRock K7S8XE+ & Mobile Athlon XP-M 2600+ & S-PAL8045 & DDR400 1GB とか誰か要るかしら

# Slot1 の Pentium III 750MHz x 2 とか、 NEC Aterm WD701CV とかいう ADSL モデム兼IP電話ルーターとか、微妙に捨てるに困る

# K26P も左が割れたかなんかで変なので捨ててしまう

# CLIE PEG-T600C と CF 通信アダプタ PEGA-CF60 も捨てるか

# 固定電話とか、昔がんばって改造したFirewireのリムーバブルHDDキット+替え玉x4とかも捨てちゃう

# そしてその日記を見て思い出したけど VAIO PCG-505V も要らない子だ・・・けどこれは燃えないゴミじゃ捨てられそうにないな…

# PS2キーボードは燃えないゴミで捨てられるだろうか。。。

とかとかグダりながら、さくっとゴミ袋が2つできました。
マザーとかCPUとかルーターとかそのあたりは捨てなかったので、
もし欲しい方がいればあげます。

まだまだケーブル類の処分とか整理とかで頭が痛い。
画面の傷が気になる EIZO T561 とかも処分しないとなぁ。

とにかく物を減らす。

全然関係ないけど、最近久々にサーバにバックドアが仕掛けられたりしてました。
うおーめんどくせーーーっとか思いながら、ひとまずいろんなものをごっそり抽出して撤去して、別にとってあるログと照合しつつ怪しいところは潰したり。あと kernel とか openssh-server とかもアップデート。

大体はパスワードの辞書アタックで、 ftp 経由でシェルとなる PHP を設置して、あとはちょっと前にあった mmap exploit とかで root 取って sshd 置き換えて (ついでに immutable にしてあったり)、ローカルのわかりにくい所 ( /dev の下とか) にこっそりパスワードを蓄えといてあとで取りに来るって感じかなぁ。自動送信とかは、送信先 IP アドレスが残ってしまうからやってない模様。ログからもちゃんと消してたしね。(そういうツールも残ってて) あと普通はパスワード設定されてない適当なアカウントいくつかパスワードを設定しといて裏口を残しておくとか、バックドアとなるシェルを変なポートで自動起動するようにしとくとか。わざわざ iptables で穴あけるように仕組まれてたけど、残念ながら NAPT の中なので外からはアクセスできません。

でも nothing.sh は古いからまだしも、自宅の Ubuntu 9.04 もやられたので、何が原因かいまいち不明で気持ちわるい。 nothing はさすがにそろそろリプレースしたいなぁ・・・。

Poundをアップグレード

reverse-proxy をアップグレードしたときのメモ箇条書き。

Pound-2.4.4 の rpmbuild に google-perftools が要る。なんで?

  • TCMalloc を使ってるかららしい。なんだっけ?
  • あれ、でも実際のところは使ってなくね?? → ldd /usr/sbin/pound しても出ない
  • 使わせてみるか → /etc/init.d/pound に LD_PRELOAD を追記
  • libstdc++34(-devel) が足りなくて起動しない。入れる。 → 動作を確認
  • あー、 configure チェックで捨てられたのかも
  • rpmbuild し直してみよ
    • あ、 -ltcmalloc 付いた
    • あ、 failed dependency でインストールできなくなった (libtcmalloc.so.0)
      • 事前に google-perftools(-devel) はインストール済み
      • ファイルもある
    • めんどくさいので rpm -Uvh –nodeps とかする (ひどい
  • ちゃんと動いてる
  • とりあえず様子見

というわけで、 Pound on nothing.sh has been upgraded from 1.9 to 2.4.4.

  • とりあえず今回は単純にバージョンアップで終了
    • 設定ファイル書式変更あるので修正は必要だけど
    • nginx とか Varnish も考えたい

前に、 HTTP_HOST が “nothing.sh:80” になってしまって WordPress の canonical.php がうまく動かない、という現象があったのは、おそらくこれで直ったはず。

一部不通

ちょっと前から nothing.sh 内の一部のサーバが止まってます。 ping が返ってきません。オワタ\(^o^)/

どうしよう、 4 月までに大きく手を入れる時間が確保できないぞ。ただ電源落ちてるだけ、とかならいいんだけど。今後を含めて色々考える必要があるなあ…うーん…。

WordPress導入から1ヶ月

Akismet

一般的な CMS に対する SPAM BOT の活動率には目を見張るものがある。以前より明らかに多いのは、やっぱり generator を見ていたり、 input/textarea 要素の name が固定だからなんだろうなぁ。一方、でもそんなの関係ねぇ!と言わんばかりに Akismet の捕獲率がすごい。以前は手動でコメントフィルタ書いてたけど、 わざわざそんなことやる気がしなくなる。

あと、そういえば、クロールしにくるUser Agentの種類がガラっと変わった。

XML-RPC

今日も研究室。いろいろと雑務を済ませたり、進ませたり。あと後輩の履歴書に突っ込みまくってみたり。ああ、突っ込むポイントが分かるようになったってのは、就職活動というやつで少しは成長したってことなのかな。

話は変わって、以前から、 wiki@nothingはてなブックマークのエントリ数を表示したいなぁと思っていたのだけど、 wiki@nothing は各ページに URL が 2 種類存在していて ( ページ名ベースのアドレスと数字ベースのアドレス ) 、そのどちらにもブックマークがあったりするので、単純に画像で表示するのはちょっとおいしくない。 (URL が unique じゃないのは SEO 的観点で見てもよくないのだけど、それはまあいいや)

そんなわけで放置していたのだけど、はてなブックマーク件数取得APIなんてページを見つけたので、これを基にサクッと実装してみた。例のごとく、 PHP で XML-RPC なんてやったことなかったので、適当にググりながら PEAR の XML_RPCを突っ込んで、サンプルを見つつ書く。あと、毎回見に行くのはよろしくないので、 PEAR の Cache_Lite で適当にキャッシュするように。時間にして 20 分ほどで完成。 PHP は楽ちんすぎる。

はてなブックマークのエントリ数表示 on wiki@nothing ←こんな感じ。

追記: そういえば、と見てみたら、 livedoor クリップもまったく同様に実装可能だった。というか、はてなのまんま。これも追加してみた。

livedoorクリップも追加

ちと煩雑に。うーん。

Google Apps

http://start.a.nothing.sh

とりあえず、サブドメインでもちゃんと作れるようです。

きっかけは、弟が「就職活動用にメールアドレスが欲しい」という話を振ってきたこと。大学のメールは?と訊いたら、「学内からしか見れない(!)し、企業からのメールが届かなかったことがある」のだとか・・・。これまで弟のPCのメールは Yahoo! メールだけでした。しかし就職活動だと、送信メールの末尾に広告が入る Yahoo! メールとか Hotmail はさすがにね… Gmail で良いじゃん、とか思うんですが、エントリーフォームにわざわざ「フリーメールは勘弁してくれ」と書かれていることも少なくなく。

普段なら、 nothing.sh 上にさらっとアカウント作ってしまうところなんですが、いまさら新しく MUA のインストールと設定をさせるのも色々と面倒。それに今どき、自宅以外で見れないって所もイマイチ。一応、サーバ上に SquirrelMail 突っ込んであるので Web メールも使えるっちゃ使えるけれど、細かい設定ができないし、 Gmail に比べると扱いにくいしなぁ。とか考えながら、あ、独自ドメインで Gmail 使えばいいじゃんと思い当たる。ということで、実は前々から興味はあった Google Apps を試してみた次第。

サブドメインでも使えるのかなーとか思いながら、とりあえず普通に登録して、指示通り DNS の CNAME や MX (7個もある!) を設定すればさくっと使えるようになりました。ついでに SPF レコードも設定しておきました。あとはアカウントを追加してやるだけ。 Gmail の機能なんかも全部使えるので、転送設定なんかも簡単にできます。 Gmail の強力な SPAM フィルタが使えるのがなにより嬉しい。携帯からも使えるしね。連絡先やカレンダー、ドキュメントの共有が簡単にできるようになってるあたり、本当はグループウェアとして使うと便利なんだと思うけど、今の所そういう用途はないかなぁ。

ということで一件落着。

でも、エントリーシートに書かれているメールアドレス、 @gmail.com と @a.nothing.sh のどっちの方が信頼できるかって訊かれたら、個人的には圧倒的に @gmail.com の方が信頼できるなぁ。(元も子もない)

マイIPその後

マイIPを利用してから約4日。結局 PPTP 接続は一度も切れていない模様。よきかなよきかな。・・・と思ってたら、 SORBS の Dynamic IP にリストされてた。うげー。

自前で解決しようにも、 PTR の TTL が 43200 以上じゃないと駄目だって。( マイIP の逆引き設定サービスは TTL 600 … これはこれで短すぎる気がするけど )

まあ日本じゃもう SORBS 使ってるところはないよね、と信じたい。

SMTP弱者からの脱却

今日の出来事。 

  • 携帯からメールで投稿できるようにしようと思った
  • いちいちPOP3見に行くの面倒なのでdot-qmailから直接叩くことにする
  • ちまちま作業中に友人からメールが来る
  • 「nothing.sh宛にメール送るとdaemonさんからお返事来るよ
  • !?

これはいかん、とメールを何とかすることにする。

普段は、自分宛に届いたメールをGmailに転送するようにしていて、今回はGmailへの転送部分で蹴られていた。もともと nothing.sh は B フレッツのプロバイダ (FreeBit系) 上で稼動している。SPAMラッシュなこのご時世、小さなプロバイダにぶら下がった逆引きもロクにできない弱小サーバからじゃ、動的IPでなくても直接メールを送り出すのが非常に困難だったりする。携帯キャリアに対するOP25Bも既に導入されているし、さらに来春からは全体的にブロックするようになるらしい。さすがにメールが送れなくなると困るので、以前からプロバイダと相談していて、代替手段としてプロバイダ側のSMTP(-AUTH)サーバに転送していたのだけど、これがどうも結構な割合で転送に失敗していた模様。これはマズい。

で、代替案を考えてはいたのだけど、基本的にうまい方法がなかった。

  1. それなりに安定したレンタルサーバを借りて、SMTPリレー専用にする(無駄が多い) 
  2. 固定IPをくれて、逆引きが正しくできて、OP25Bもないプロバイダに乗り換える(コストと手間が…)
  3. 諦める

それでも、あーでもないこーでもない、とググっていたら、ふと INTERLINK の マイIP なるサービスを発見。VPN(PPTP)を使ってINTERLINKのバックボーンに接続してくれるサービス。固定IPを1個くれて、逆引き設定もできる。初期設定費用もなくて、月額1,000円。ktkr!

そもそもSMTPだけ使えればいいので、VPNでも速度的な問題はない。固定IP側ではOP25Bも適用されていないようだし、申し込み月は無料で試用できるようなので、何はともあれ試してみることに。さくっとクレジットカードで申し込み。速攻IDとパスワードが発行されて利用可能に。

で、どうやってPPTP張るかなぁと多少悩む。VPNなんてほぼ使ったことがなかったので、またもやググりながら設定を探る。最初は、メールサーバ側から直接PPTP接続しようとして繋がらなくて悩む。ちょっと調べて、どうやらゲートウェイを越えられないということに気づく。ゲートウェイ側の iptables に ip_nat_pptp とかモジュールを突っ込めばいいみたいなんだけど、さすがに外側から kernel のリビルド & リブートはリスクが大きすぎるので諦める。とりあえずゲートウェイ側でPPTP接続したらあっさり繋がったので、ゲートウェイ上でパケットをルーティングして、外向き 25 番だけPPTPに流すことに。iptablesのパケットフィルタリングルールも共用できるしね。

まず、 mailgw.nothing.sh という新たな A レコードを作成して、貰った固定 IP への正引きを設定。それから、 INTERLINK の設定ページ上で逆引きを設定。良好良好。それから、色々調べたり試行錯誤しつつ、 iproute2 + iptables を設定。最終的に、 /etc/ppp/ip-up.local に次のような定義を書いた。

# PPTP側 (ppp1) でIPマスカレード
/sbin/iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o ppp1 -j MASQUERADE
# iptablesで "外向きのSMTPパケット" にマーク(2)をつける
/sbin/iptables -t mangle -A PREROUTING -i eth1 -p tcp -s 192.168.0.0/24 \
--dport 25 -j MARK --set-mark 2
# table 20 に PPTP (ppp1) 側の経路を定義
/sbin/ip route add 61.206.126.1 dev ppp1 proto kernel scope link \
src 61.206.126.146 table 20
/sbin/ip route add default via 61.206.126.1 dev ppp1 table 20
# マーク(2)のついたパケットは table 20 を参照してルーティングを行う
/sbin/ip rule add fwmark 2 lookup 20

これでこれまでの通信はそのままで、 tcp/25 のパケットだけ ppp1 に流れるようになった。(あとその他のパケットフィルタリングも忘れずに!)

とりあえずこれでメールは普通に出せるようになったので、しばらく様子を見てみることに。ネット上の話によると、このPPTPはなんかのタイミングで時々切断されてしまうことがあるらしい。切断されたままでも困るので、とりあえず切断されたら再接続するようにスクリプトを書いておいた。 (/usr/sbin/pppd pty "/usr/sbin/pptp 203.141.128.100 --nolaunchpppd" persist file /etc/ppp/options.pptp って感じで起動しているのだけど、 persist は効いてくれないみたいだ。)

しかし INTERLINK, 通常の B フレッツ接続の固定 8 IP とかでも安いので、時間ができたらそのうち移行したいなぁと思ったり。