いますぐ実践! Linuxシステム管理

[バックナンバーのトップへ] [Linux システム管理のトップへ]


いますぐ実践! Linux システム管理 / Vol.198 / 読者数:1778名

こんばんは、うすだです。

おひさしぶりでーす。
4月第1週の分のお休みをいただきましたので、1ヶ月ぶりとなります。

1ヶ月あれば落ち着いているかなと思ったのですが、己れの段取りの悪さが炸裂し、 いままさにせっぱ詰まっている状況です。

だいたいいつも、発行した次の日である月曜日に WWW を更新し、 水曜日に宿題を終わらせ、残り1.5週間くらいで、ネタ探し〜文章作成を行っております。

今回は、前々日の金曜日に、このつかみ(?)の文章と宿題に着手し始めたところです。 もちろん、お題のネタはまだ決まっていません。
(同時進行で、せっぱ詰まっているヤツも仕上げているところです。)

ところでいま、マクドでコーヒーを飲みながら書いていますが、 となりのおじいさんが、さっきからタイプライターで、 紙に印刷された文章(英語)をパチパチと打っています。 どういう経緯でそうされているのか、素人のわたくしには想像できず、 気になって仕方がありません。

絶体絶命かつ史上最低の状況下にもかかわらず、雑念ありまくりですが、 今回もはりきって…はりきってまいります!

今回のお題 - ウォッチドッグタイマで自動的に再起動する

サーバを管理していて困るのは、 突然サービスを提供できなくなる事態になってしまうことです。

管理者がその場にいたり、監視プログラムが異常を検知してメールなどで知らせてくれ、 遠隔操作で対処できる場合はよいです。
(監視プログラムが勝手になんとかしてくれると、もっとよいです。)

ですが、トラブルがいつでもそんな準備万端のときに起こってくれるとは限りません。 わたしの経験では、対処できる人がいないときにトラブルが発生したり、 ひっそりと気づかないようにシステムが止まっていたり、 といったケースが多かったように思います。

そこで今回は、ウォッチドッグタイマなるものを使って、 そういった状況でもなんとかする方法を探ってみたいと思います。

ウォッチドッグタイマとは?

ウォッチドッグタイマとは、一定期間アクセスがされないと、 システムがハングアップしていると判断し、 リセットや電源OFF等を実行するハードウェアタイマです。

たとえば、以下のようなケースで役に立ちます。

監視プログラムは、システムが正常かどうかチェックし、 問題がなければウォッチドッグタイマにアクセスするよう定期的に動作する、とします。

正常であれば、ウォッチドッグタイマに対して定期的にアクセスしますので、 システムは正常に動作し続けます。

で、監視プログラムですらまっとうに動かないような状況に陥った場合、 だれもウォッチドッグタイマにアクセスしなくなります。 するとウォッチドッグタイマは、システムがとち狂ったと判断し、 リセットなどの処理を実行してくれます。リセットにより、 とりあえずシステムが正常な状態に戻る(だろう)…という寸法です。
(もし監視プログラムが正常に動作して、システムの異常を検知した場合は、 監視プログラムに対処してもらえばよいですよね。)

もちろん、ハード的におかしくなっていた場合は、 リセットしても状況が改善されないかもしれません。ですが、 ハングアップして止まったままにしておくよりは、改善される可能性が高いと思います。

ウォッチドッグタイマを使ってみる(やや危険)

まあ、なにはともあれ、試してみましょう。

…とはいえ、いきなり試して、実サーバをリセットさせるなどということになりますと、 非常に気まずいです。ですので、個人で使用している PC や、 仮想環境で動作するものをご用意ください。

さて、本来であれば、実際のウォッチドッグタイマを扱いたいところですが、 お使いの環境によってハードが異なりますし、 そもそも仮想環境ではウォッチドッグタイマがなかったりもします。

ですが、ありがたいことに、Linux カーネルには、 ウォッチドッグタイマをソフトで実現したドライバが存在します。
その名も「softdog」とおっしゃるのですが、この softdog さまを、 今回は使用したいと思います。

 

まずは、softdog ドライバをロードします。 modprobe コマンドを以下のように実行すると、 おそらく何も文句を言われずに組み込まれます。
ほんとに問題ないか、/proc/miscの中や、 /dev/watchdog というデバイスファイルの有無を、下記では調べています。

  # modprobe softdog
  # grep watchdog /proc/misc
  130 watchdog
  # ls -l /dev/watchdog
  crw------- 1 root root 10, 130 2011-04-17 02:23 /dev/watchdog

この状態では、まだウォッチドッグタイマは動作していません。
以下のように、なにかを書き込むことで動作し始めます。

  # echo > /dev/watchdog

そして、60秒放置すると、以下のメッセージが出力されて、 あっという間にシステムがリセットされます。

  Initiating system reboot.

それは困るという貴兄は、上記のアクセスを60秒以内で延々と行い続けるか、 以下のように「V」を書き込みます。V を書き込みますと、タイマが停止して、 リセットがかかることがなくなります。

  # echo V > /dev/watchdog

 

リセットするまでの期間は、デフォルトでは「60秒」です。
それでは困るという貴兄は、パラメータ「soft_margin」の値を指定することで、 期間を指定できます。
たとえば以下では、300秒を設定しています。

  # modprobe softdog soft_margin=300

もちろん、一旦ロードした状態で再度 modprobe を実行しても、 再度読み込まれるわけではありません。以下の方法でアンロードしてから、 上記をお試しください。

  # echo V > /dev/watchdog
  # rmmod softdog

ちなみに、他にも以下のパラメータがあります。
「soft_noboot」に 1 を設定すると、 タイマの期間が過ぎてもリセットが実行されません。
また、「nowayout」に 1 を設定すると、V を書き込んでもタイマが停止しません。

これらの値がどう設定されているかは、ロード時に出力されるメッセージで確認できます。

  # dmesg
  ...
  Software Watchdog Timer: 0.07 initialized. soft_noboot=0 \
  soft_margin=120 sec (nowayout= 0)
  ...

監視プログラムっぽいものを動かす(やや危険)

それでは実際に、ウォッチドッグタイマを使って監視っぽいことをさせてみましょう。 以下のようなスクリプトをご用意いたしました。

#!/bin/sh
WDT_TIMEOUT=120
SLEEP_TIME=30
[ -z "`grep watchdog /proc/misc`" ] && modprobe softdog soft_margin=$WDT_TIMEOUT
[ -c /dev/watchdog ] || exit 1
echo > /dev/watchdog
sleep $SLEEP_TIME

単に、/dev/watchdog へ echo でアクセスするだけのスクリプトです。

WDT_TIMEOUT は、softdog をロードする際に soft_margin に指定する値です。 つまり、softdog がロードされていない状態で上記を試します。
また、SLEEP_TIME は、/dev/watchdog にアクセスした後、スリープする秒数です。

このスクリプトを「/usr/local/sbin/wdt_keep.sh」というファイル名で保存したら、 実行権をつけておきます。

  # chmod +x /usr/local/sbin/wdt_keep.sh 

そして、/etc/crontab に以下の1行を追加します。

  * * * * * root /usr/local/sbin/wdt_keep.sh

すると、毎分、wdt_keep.sh が実行されます。
何か問題があって、wdt_keep.sh が120秒以上実行されない状態に陥った場合は、 softdog さんがリセットしてくれるはずです。

 

さて、cron では分単位でしか動かせませんが、 init に繰り返し実行してもらうようにすれば、もう少し頻繁に動かせそうです。

というわけで、「/etc/inittab」に以下を追加してみてください。

  # WDT test
  wd:2345:respawn:/usr/local/sbin/wdt_keep.sh

そして、init に SIGHUP シグナルを送ると、 wdt_keep.sh が延々と繰り返し実行されます。SLEEP_TIME を 30 にしていますので、 だいたい30秒強の間隔で実行されると思います。

  # kill -HUP 1

 

ちなみに、wdt_keep.sh が実行される度に、下記のメッセージが出力されます。 うっとおしいかもしれませんが、 正常に動作している証だとも考えられるのではないかと思います。

  SoftDog: Unexpected close, not stopping watchdog!

それから、試した後止めたくなった場合、 /etc/crontab や /etc/inittab の追加した行をコメントアウトして、 即座に以下を実行してください。

  # echo V > /dev/watchdog

おわりに

以上、ウォッチドッグタイマの概要と、 ウォッチドッグタイマを使用したお試し監視もどきについて、ご紹介しました。

具体的な監視にまで踏み込んでいけませんでしたが、 その辺はケースバイケースだと思いますので、いろいろ試行錯誤してくださいませ。
(…ではあまりにもなので、宿題へと続きます。)

宿題の答え

前回の宿題は、

  ディスクフルのとき、-i オプションで sed を実行すると、どうなるか
  試してみましょう。

でした。

ホンモノのハードディスクでやるといろいろ面倒だと思います。ですのでここは、 メモリ上に小さいファイルシステムを作ってみましょう。

まず、root の権限で、ファイルシステムを作ってマウントします。
以下では、サイズが4MBの「test.img」というファイルを作り、 mkfs.ext4コマンドで ext4 にフォーマットして、「/mnt」にマウントしています。
(test.img や /mnt が気に入らない貴兄は、適時読み替えてください。)

  # dd if=/dev/zero of=test.img bs=1M count=4
  # mkfs.ext4 ./test.img
  # mount -o loop ./test.img /mnt
  # df /mnt
  Filesystem        1K-blocks      Used Available Use% Mounted on
  /dev/loop0             3963      1053      2706  29% /mnt

すでに 2.6MB くらいしか使えないという点には目をつぶりまして、お次は、 一般ユーザ「usu」が書くことのできるディレクトリ「/mnt/usu」を作成します。 (「usu」が気に入らない貴兄は…(以下略))

  # mkdir /mnt/usu
  # chown usu /mnt/usu

ここからは、「usu」ユーザで作業を続けます。
そして、空き容量がある状態で、sed コマンドを実行してみます。
以下では、中身が「test」なだけのファイル「test.txt」を作成し、 sed コマンドで中身を「TEST」に書き換えています。

  $ echo test > /mnt/usu/test.txt
  $ sed -i 's/test/TEST/' /mnt/usu/test.txt
  $ cat /mnt/usu/test.txt
  TEST

ふたたび root 権限で、ファイルシステムの空きをなくします。
具体的には、 dd コマンドで3MBの「/mnt/zero」というファイルを無駄に作成しようとしています。 df コマンドで確認すると、空きが 0 になっていることがわかります。

  # dd if=/dev/zero of=/mnt/zero bs=1M count=3
  # df /mnt
  Filesystem           1K-blocks      Used Available Use% Mounted on
  /dev/loop0                3963      3961         0 100% /mnt

ここで一般ユーザに舞い戻り、再度 sed コマンドを実行します。
すると、以下のように、空きがなくて「/mnt/usu/sed8ZikuT」 を作成することができなかった的なメッセージが出力されました。

  $ sed -i 's/TEST/Test/' /mnt/usu/test.txt
  sed: couldn't flush /mnt/usu/sed8ZikuT: No space left on device

あとはだいだい想像がつきますけれども、念のため、strace コマンドの出力結果から、 sed がなにをやっているか眺めてみました。

  $ strace sed -i 's/test/TEST/' /mnt/usu/test.txt

大雑把に書くと、以下のような処理をしています。

  1. /mnt/usu/test.txt を読み込み専用で open ※1
  2. /mnt/usu/sedXXXXXX を作成 ※2
  3. ※1 から読み込んで処理し、※2 に書き込む
  4. /mnt/usu/sedXXXXXX を /mnt/usu/test.txt に移動

ファイルシステムに空きがなくても、ディレクトリエントリが空いている場合は、 ファイルを作成することはできます。ですが、 データを格納するための領域が当然必要になりますので、 実際に書き込みが行われた時点でエラーになる、ということだと思います。

特に、新たな発見もサプライズもありませんでしたが、個人的には、 曖昧だったところがはっきりしたので、すっきりしてよかったです。

今回の宿題

今回の宿題は、

  とち狂ったときウォッチドッグタイマでリセットする WWWサービス監視
  プログラムを作ってみましょう。

です。

本題では安直な枠組みだけで終わってしまいましたので、宿題で、 実際に監視をさせてみようかと思います。

あとがき

Linuxに関する資格はいくつかあるようですが、その中でもメジャー級と言えるのが、 LPIC(Linux技術者認定試験)ではないかと思います。

LPICについて知ろう! - LPI-Japan
http://www.lpi.or.jp/lpic/

お国の資格ではないため、受験費用がお安くはないのですが、 曲がりなりにも Linux でご飯を食べさせていただいていますので、 いつか取得する必要があるのかなあと思いつつ、現在に至ります。
(回りくどい言い方をしていますが、ようするにLPICは持っていません。)

ところで、LPICの運営や普及活動を行っているLPI-Japanのサイトには、 試験用の教科書と称して、様々な技術文書が無償で公開されています。

Linux標準教科書 - LPI-Japan
http://www.lpi.or.jp/linuxtext/text.shtml

アンケートに答える必要はありますが、そもそもLPI-Japanは非営利団体ですので、 強引に勧誘されるなどの心配はおそらくないと思います。

別に試験を受けなくても、上記をダウンロードして個人的に勉強することは、 Linuxの普及活動に貢献しているとも言えます。
ですので、気になる貴兄は、 まずダウンロードから始めてみるとよろしいのではないでしょうか。

 

ところで、本メルマガは、基本的には第1,3日曜日に発行しています。
ですが、5月の第1日曜日は、1日です。黄金週間まっ最中、ですよね。
…というわけで、5月は、8日と22日に発行したいと思います。
(…け、けっして、黄金週間は休みたい、ということではありませんよ!)

 

今回も、ここまで読んでいただき、たいへんありがとうございました。
次回は、5月8日(日) の未明にお会いしましょう!

 

「いますぐ実践! Linux システム管理」の解除は、以下からできます。
http://www.usupi.org/sysad/ (まぐまぐ ID:149633)

バックナンバーは、こちらにほぼ全部そろっています。
http://www.usupi.org/sysad/backno.html

「栗日記」- いまのノルマ(?)が終わったら、栗活動にはげみます。
http://www.usupi.org/kuri/ (まぐまぐ ID:126454)
http://usupi.seesaa.net/ (栗日記ブログ)
http://usupi.org/k/ (モバイル栗日記)


[バックナンバーのトップへ] [Linux システム管理のトップへ]

トップ

バックナンバー
    [日付順] [目的別]

プロフィール

▼ リンク

独学Linux
Linuxデスクトップ環境に関する情報が満載です。 メルマガもありますよ。
Server World
CentOS 6をサーバとしたときの設定例が、これでもかというくらいたくさん載っています。 CentOS以外のディストリビューション(Fedora, Ubuntu)も充実しています。
LINUXで自宅サーバーを構築・導入(Fedora9)
Fedora9のインストールの仕方から管理方法まで、詳しく載っています。 SearchManには情報がもりだくさんです。
マロンくん.NET
〜サーバ管理者への道〜
Linuxをサーバとして使用するための、いろいろな設定方法が載っています。 マロンくんもかわいいです。 なんといっても、マロンくんという名前がいいですね!!
日経Linux
今や数少なくなってしまったLinuxの雑誌。ニュースやガイドもあります。
Linux Square − @IT
@ITが提供する、Linux の情報が満載。 載っていない設定方法はないんじゃないでしょうか。
gihyo.jp…技術評論社
Linuxに限らず様々な技術情報が満載のサイト。 SoftwareDesign誌も、 ソフトウェア技術者は必見です。
SourceForge.JP Magazine
Linux に限らず、オープンソース関連の記事が網羅されています。
ITmediaエンタープライズ:Linux Tips 一覧
Tips というより FAQ 集でしょうか。わからないことがあれば覗きましょう。
IBM developerWorks : Linux
開発者向けですが、勉強になりますよ。
Yahoo!ニュース - Linux
Yahoo!のLinuxに関するニュース一覧です。
栗日記
システム管理とかと全然関係ありませんが、毎日栗の絵を描いています。
システム管理につかれちゃったとき、癒されたいときに、ご覧ください。:-)
WEB RANKING - PC関連
ランキングに参加してみました。押してやってください。

▼ 作ってみました

Add to Google

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本