ttt

getttyent

(FreeBSD) Cannot load /usr/local/libexec/apache22/

2008-07-31 22:56:38 | デジタル・インターネット

タイトルは、FreeBSDでportsでインストールしたapache httpdにて、しばらく前から、たまに見かけていたエラーメッセージです。

apacheは、ずっと実行しっぱなしなんですが(当然か)、あるとき、httpd.confを書き換えたりして、apacheを再起動しようとすると・・・

# /usr/local/etc/rc.d/apache22 start
Performing sanity check on apache22 configuration:
httpd: Syntax error on line 63 of /usr/local/etc/apache22/httpd.conf: Cannot load /usr/local/libexec/apache22/mod_authnz_ldap.so into server: /usr/local/libexec/apache22/mod_authnz_ldap.so: Undefined symbol "apr_ldap_url_parse"
Starting apache22.
httpd: Syntax error on line 63 of /usr/local/etc/apache22/httpd.conf: Cannot load /usr/local/libexec/apache22/mod_authnz_ldap.so into server: /usr/local/libexec/apache22/mod_authnz_ldap.so: Undefined symbol "apr_ldap_url_parse"

というエラーになる、と。

たぶん、apacheを起動してから、再起動するまでの間に、portupgradeで何かをアップデートしていて、それが原因なんだろう、とは思っていました。

とりあえず、「portupgrade -f apache-2.2...」で再インストールすれば直ってしまうので、まあいいか、ってことにしてたんですが、やっと原因がわかりました。

ldap_url_parseというシンボルは、libaprutil-1.so.3で定義されてます。

# nm /usr/local/lib/libaprutil-1.so.3 | grep ldap_url_parse
0000fe90 T apr_ldap_url_parse
0000f880 T apr_ldap_url_parse_ext

この共有ライブラリは、どこからきたかというと・・・

# pkg_which /usr/local/lib/libaprutil-1.so.3
apr-gdbm-db42-1.3.2 apache-2.2.9

どうして、2つも、パッケージ名が表示されるんですか?!

・・・これから、わかった原因。

apacheが起動しなくなったのは、apr-gdbm-db42-1.3.2が、後からlibaprutil-1.so.3を上書きしてしまったから

ということらしいです。

/var/db/ports/apache22/options を見てみると

WITHOUT_APR_FROM_PORTS=true

となっているのですが、これはportsでインストールするapr(上記のapr-gdbm-db42なんとか)ではなく、apache-2.2自前でaprを使います、という意味らしいです。

というわけで、単体インストールされたaprを削除する、

# pkg_delete /var/db/pkg/apr-gdbm-db42-1.3.2

というのが正解みたいです。

ただし、pkg_deleteすると、重要なファイルが削除されてしまうらしいので、めんどくさいですが、もう一度、apache22をインストールしなおさないといけませんでした。

apache22を再インストールしなかったときは、たとえば、subversionがビルドできない、というトラブルを目にしました(たしか、aprのヘッダファイルが削除されてしまったみたい)。

apr-gdbm-db42-1.3.2は、何かにrequireされてインストールされているわけでもなく、どうしてインストールされていたのかわからないのですが、以前、何かがrequireしてたけど、その後portsが修正され、依存関係がなくなってしまった、ということかもしれません。

CONFLICTの指定がないので、devel/aprと、www/apache22の両方がインストールできてしまうらしく、それがいけないですね。

(optionによって、CONFLICTしたり、しなかったり、ってのは無理なんでしょうか)


(FreeBSD) portauditとperiodic securityとfetchの合わせ技で、file system full...やれやれ

2008-07-30 22:58:39 | デジタル・インターネット

FreeBSDの最大の長所であるports。/usr/ports/ports-mgmt/portaudit をインストールしておくと、portsでインストールしたソフトウェアにセキュリティホールなどの問題がある場合に、こんな具合に、報告してくれます。

# portaudit
Affected package: fetchmail-6.3.8_6
Type of problem: fetchmail -- potential crash in -v -v verbose mode (revised patch).
Reference: <http://www.FreeBSD.org/ports/portaudit/1e8e63c0-478a-11dd-a88d-000ea69a5213.html>

Affected package: php5-posix-5.2.6
Type of problem: php -- input validation error in posix_access function.
Reference: <http://www.FreeBSD.org/ports/portaudit/ee6fa2bd-406a-11dd-936a-0015af872849.html>

2 problem(s) in your installed packages found.

You are advised to update or deinstall the affected package(s) immediately.

この、portsでインストールしたソフトウェアに関するセキュリティホールのレポートは、毎日、自動的にメールで送られてきます。

これは、こういう仕掛けになっているからです。

  1. /etc/crontab に書いてあるperiodic dailyというコマンドが、毎日午前3時(デフォルトの設定)に実行される
  2. periodic dailyは、/etc/periodic/daily/ など、特定のディレクトリ以下にあるファイルを、順番に実行していく
  3. /etc/periodic/daily/450.status-security を実行したとき、そこから、periodic securityが実行される
  4. periodic securityも同様にして、/etc/periodic/securityとか/usr/local/etc/periodic/securityなど特定のディレクトリ以下のファイルを実行していく
  5. portauditをインストールしていると、/usr/local/etc/periodic/security/410.portaudit というファイルもインストールされている。この中で、portauditを実行している。
  6. 実行ログが、メールでrootあてに送られる

というわけで、portauditは、毎日、勝手に実行されています。

portauditは、セキュリティホール情報をどこから入手しているかというと、まあ当たり前ですが、ネットワーク経由でダウンロードしてきています。ダウンロードしたファイルは、デフォルトでは、/var/db/portaudit/auditfile.tbz という名前で保存されています。

/usr/local/etc/portaudit.conf.sample というファイルがありますが、これを参考に、/usr/local/etc/portaudit.confという名前の設定ファイルを作れば、portauditの挙動をいろいろとカスタマイズできます。

たとえばauditfile.tbzというファイルをどこからダウンロードするかも、指定できるようになっています。
たとえば私の場合、たくさんのFreeBSDマシンを動かしているので、

  • 1台だけ、http://www.FreeBSD.org/ports/ からダウンロードするようにして、
  • ダウンロードしたファイルを、ローカル環境のWebサーバにおいておき、
  • そのほかのFreeBSDマシンは、ローカル環境のWebサーバからダウンロードする

ようにしています(http proxyのキャッシュ機能がどうも腐ってて、何日たってもキャッシュのデータを返してくるとか、そういう理由もあったり・・・)。

ちなみに、portaudit.confにどんなことを書けるかは、実は、/usr/local/sbin/portauditを解読したほうが手っ取り早いかもしれません・・・portauditは、ただのシェルスクリプトなので。
さらに余談ですが、/usr/sbin/periodicもシェルスクリプトなんですねぇ。

なお、portauditを実行するたびに、毎回auditfile.tbzをダウンロードしているわけではなく、ある程度日付が経過したら、改めて、サーバから最新版をダウンロードするようになっています。man portauditして、「-X」オプションの説明に書いてあります。

あるとき、/tmpに巨大なファイルが作られて、file system full、ディスクの空き容量がなくなってしまいました。

その巨大なファイルの中身をのぞいたら、

Checking for a current audit database:

Downloading fresh database.
fetch: http://ローカル環境のWebサーバ/auditfile.tbz: Operation timed out
fetch: http://ローカル環境のWebサーバ/auditfile.tbz: Host is down
fetch: http://ローカル環境のWebサーバ/auditfile.tbz: Host is down
fetch: http://ローカル環境のWebサーバ/auditfile.tbz: Host is down
(以下、ディスクの空き容量を食いつぶすまで繰り返し)

ということになってました。

どうやら、

  1. periodic securityの実行がはじまって、
  2. その実行ログが/tmp以下に一時ファイルとして作られていて、
  3. ログが永遠に出力されけてしまった挙句の、file system full

ということだったようです。

たまたまそのとき、ローカル環境のWebサーバを停止させていたのですが、portauditは、auditfile.tbzをダウンロードしようとして、無限ループしていました。

ログメッセージには「fetch」と書いてあるように、portauditは、/usr/bin/fetchというコマンドを使って、ファイルauditfile.tbzをダウンロードしようとしています。

ダウンロードするときにどんなコマンドを使うかは、やはりportaudit.confで指定できます。

たまたまなんですが、portaudit.confでは

portaudit_fetch_cmd="fetch -1amp"

と記述していました。このため、ファイルをダウンロードするとき、

fetch -1amp fetch: http://ローカル環境のWebサーバ/auditfile.tbz

が実行されることになります。

ためしに、手で上記のコマンドを入力して、実行してみました。

すると、Webサーバが落ちている場合、こんな実行シーケンスが起きてしまうことがわかりました

  1. (Webサーバは同じサブネット上に存在しているため)、ARPでMACアドレス解決をしようとして
  2. しばらくたってタイムアウトしてエラー
  3. fetchに-aオプションを指定していると、一時的なエラーの場合は(ファイルが存在しない、といったエラーじゃない場合)、成功するまで繰り返すことになっている
  4. 今回出た「Host is down」の場合は、繰り返すことになっている
  5. というわけで、もう一回、サーバに接続を試みる
  6. 今度は、ARPのキャッシュが有効で、といってもARPが解決できない、という結果になるだけですが(arp -aしたときincompleteと表示される)
  7. というわけで、即座に、Host is downというエラーになる
  8. -aオプションのせいで、また繰り返し・・・
  9. ARPのキャッシュの有効期限内は、そりゃーもー、猛烈な勢いで、エラーが出続けます
  10. ARPのキャッシュの有効期限が過ぎても、しばらくたって、やっぱりARP解決できないエラーになり、また同じことの繰り返し

以上のようなシーケンスで、

fetch: http://ローカル環境のWebサーバ/auditfile.tbz: Host is down

というエラーが、永遠に吐き出され続けるのでした。うぐぅ・・・

さて、これは、何が悪いのでしょうか。

(1) fetchに-aオプションをつけるのが悪い

/usr/local/sbin/portauditを見るとわかるのですが、実は、デフォルトでは-aオプションは、ついてないのです。portaudit.conf.sampleに「-1amp」って書いてあるのは、まずいですねぇ。

(2) fetchが、全速力でリトライを繰り返すのはまずい

昔、ダイアルアップでインターネット接続していたころの話ですが、電話では、リダイアル規制ってのがあって、お話中でCONNECTできなかった場合、リダイアルをするんですが、あんまり立て続けにリダイアルしちゃダメ、というルールがありました。

そういうルールって、やっぱり必要ですよね。というわけで、fetchには、-wオプションで、待ち時間が指定できるようになっています。

でも、これって、filesystem fullになるまでの、時間稼ぎにしかならないですね。

(3) fetchが、永遠にリトライしつづけるのが悪い

まあ、これは無限ループしちゃうケースがあるってのは、一般的な話としても、プログラムとして非常に問題なわけです。

というわけで、思いつきで、-eオプションというのを追加して、リトライ回数の上限を指定できるようにしてみました。

# diff -u fetch.c.ORG fetch.c
--- fetch.c.ORG 2006-12-27 09:50:57.000000000 +0900
+++ fetch.c     2008-07-28 16:15:40.000000000 +0900
@@ -57,6 +57,7 @@
int     b_flag;        /*!   -b: workaround TCP bug */
char    *c_dirname;    /*    -c: remote directory */
int     d_flag;        /*    -d: direct connection */
+int     e_retry;       /*    -e: max retry */
int     F_flag;        /*    -F: restart without checking mtime  */
char   *f_filename;    /*    -f: file to fetch */
char   *h_hostname;    /*    -h: host to fetch from */
@@ -730,7 +731,7 @@
        int c, e, r;

        while ((c = getopt(argc, argv,
-           "146AaB:bc:dFf:Hh:lMmN:nPpo:qRrS:sT:tUvw:")) != -1)
+           "146AaB:bc:de:Ff:Hh:lMmN:nPpo:qRrS:sT:tUvw:")) != -1)
                switch (c) {
                case '1':
                        once_flag = 1;
@@ -762,6 +763,9 @@
                case 'd':
                        d_flag = 1;
                        break;
+               case 'e':
+                       e_retry = strtol(optarg, &end, 10);
+                       break;
                case 'F':
                        F_flag = 1;
                        break;
@@ -973,8 +977,12 @@
                                            "before retrying\n", w_secs);
                                if (w_secs)
                                        sleep(w_secs);
-                               if (a_flag)
+                               if (a_flag) {
+                                   static int retry = 0;
+                                   if ( ++retry < e_retry ) {
                                        continue;
+                                   }
+                               }
                        }
                }

fetchは、引数で、複数のURLを指定できるみたいなんですが、それだと、上のパッチ、正しくないですね。2つめのURLのときに、retryを初期化していないので。まあ、トータルでのリトライ回数、というこじつけにしておきます(笑)



(4) それにしても/usr/bin/fetchの出来は悪い

個人的に帰着した結論ですが、やはり、これなんです。
以前、ここのブログで、portsnapでトラブルが起きたことを書いたような気がしますが、そのときも、fetchって出来が悪いなぁ、と思ったのでした。

そういえば、fetchって、URLにユーザー名とパスワードを埋め込んだ、「ftp://ユーザー名:パスワード@サーバーアドレス/パス」という形式のURLが、使えないですよね。


雷ゴロゴロ

2008-07-29 22:05:59 | 日記・エッセイ・コラム

20080729

さきほどから雷雨。
BS放送が映らなくなってしまいました・・・
ルパン三世が・・・

降雨対策放送ってのがあるはずなんですが、映らないみたいなんですけど。

こんなときこそ、デジタルより、アナログのほうが強いんだ・・・と思ったら、アナログBSも全滅。

さっき、とあるお買い物に、新横浜まで自転車で行ってきたんですが、ビックカメラが移転しちゃってて、しかもおっきくなってて、知らなかったものでビックリしました。

欲しかったものはビックカメラでは売ってなくて、別のお店に行ったら売ってたんですが、どうも値段が高すぎるので(お店の人に気づかれたんでしょうね。何のことやら)、結局買いませんでした。

新横浜駅近辺を歩いてるとき、ネオンサインかな、ピカピカ派手に光ってて、エコロジーじゃないね、とか思ってたら、雷の稲光だったようです。
それはまずいということで、さっさと、自転車で帰宅。
うちについてしばらくしたら、どしゃぶりとなりました。

(2008/08/02)
あのとき買っておけばよかったのかもしれないと、少し後悔。


将門塚 / 将門首塚

2008-07-28 22:33:31 | 日記・エッセイ・コラム

昨日につづいて、いまさら東京観光シリーズ、その2(?)

昔前を通りかかったときに偶然見つけて、気になってたけど、わざわざ中に足を踏み入れることもなかった、将門塚。

200807281

高校のときは日本史をとってたし、共通一次試験でも(あ、年齢がばれる)・・・

で、えー、すっかり忘れてますね、平将門。どういう人でしたっけ。

200807282

なんと、ここは、都心のミステリースポットの1つらしいですね。

たしかに、回りのビルが林立する雰囲気とものすごくミスマッチしてて、ここだけ、ちょっと神秘的にさえ感じる一角です。

たて看板に書いてあったんですが、神田明神って、昔は、ここにあったんですか~。


セレブのお庭訪問

2008-07-27 22:18:38 | 日記・エッセイ・コラム

以前、東京23区内に10年ほど住んでいたのに、一度も足を踏み入れたことのなかった、あの有名人のお宅のお庭へ、今ごろになって、なんとなく思いつきで、入ってみました。

けっこう広いのですが、今日は、このあたりだけ。途中、雨が降ってきてしまい、自転車だっため、雨に濡れるとやばいものも持っていたので、短時間だけの散策でした。

200807271

それにしても、入場無料ってのはいいですね。入場口みたいのがあったので、あれ?っと思ったんですが、なんだ、入場無料。うぅ~ん、太っ腹だよ。

ぜんぜん知らなかったんですが、入り口は数箇所あるようでして、今日は、大手門というところから、入ってみました。

200807270

しゃちほこが居ました。

200807272

ピラミッドじゃないです。天守台というらしいです。お城・・・江戸城があったとこなんでしょうか。

200807273

広くてきれいな芝生と、その向こうには、近代的なビル群。新宿とかもそうですけど、東京って、コンクリートジャングルなんてよばれたりする一方で、中途半端な地方都市に比べると、むしろ、緑がたくさんあるんじゃない?!って思ってしまいます。

200807274

石室。「せきしつ」じゃなくて、「いしむろ」。伊豆半島の石でできてるそうで。

200807275

忠臣蔵で有名な、松の廊下の跡だそうです。

200807276

富士見櫓(ふじみやぐら)。ここから、将軍様が花火を見たそうです(と、看板に書いてった)。

200807277

雷ゴロゴロ、雨がポツポツ・・・と天気が怪しくなってきたので、あまり広範囲を探検することなく、今日は、短時間で帰ってきてしまいました。

修学旅行で東京に来て、たしか、皇居にも来たはずなんですが、あのときは、二重橋の近辺で記念写真を撮ったくらいで、すぐに別の場所へ移動してしまったような気がします。

うん十年ぶりに、この地へ再探訪。というか、アキバに行くときには、必ず前を通過してたんですが・・・

大勢の人であふれててうんざり、ってこともなく、というか、人っ子一人いない区域もあったりで、都心なのに、静か…セミが鳴いてましたか…でいい雰囲気でした。

また今度、今日行けなかった場所へも、行ってみたいと思います。


 


通信簿

2008-07-26 13:10:58 | 日記・エッセイ・コラム

オッス!
夏休みだな、毎日、楽しんでるか?
ラジオ体操やってるか。
オラは、昨日、ラジオ体操のとき、カブトムシを見つけちゃったぞ。

楽しい夏休みの前には、通信簿っていう嫌なものがあるが、みんな、どうだ?

オラは、こんなになっちまったぞ。

20080726

…と、いつもと全然違うことを書くと、判定結果が変化するかもしれないので、書いてみました。

(2008/07/27)
年齢が上がってしまった。

20080727

(2008/07/28)
私、そんなに、じじむさいですか?

20080728


アナログ上等!

2008-07-25 22:29:59 | テレビ番組

昨日から、はじまってますね、NHKの「アナログ」表示。

200807251

200807252

もっとも、BS放送では、もっと以前から、出てましたけど・・・

200807253

200807254

かなりうざったい表示になるんだろうなぁと思ってたんですが、文字は小さく、色も薄くて、けっこう控えめなので、あまり気になりません。

これなら、アナログ放送を見続けていてもかまわないか

と安心しました。

だいたい、デジタル放送の場合でも、同じ場所に、各局のロゴマークが表示されてたりするじゃないですか。

200807255

200807256

200807257

200807258

200807259

20080725a

200807261

20080725b

20080725c

20080725d

20080725e

20080725f

20080725g

20080725h

20080725i

200807262

20080725j

20080725k

TOKYO MXのアナログは大きいな。

20080726tokyomx


うなぎ 2008

2008-07-24 22:48:35 | 食・レシピ

今日は、1年に1度だけの、うなぎが食べられる日です。

しっかりと、半額になるだろう時間帯にスーパーに行ったら、ろくなもの、残ってませんでした。
ま、いいか。

200807241

物足りない気がしたので、似たようなものってことで、穴子も・・・

200807242

今年は、うなぎの産地偽装の問題があったねぇ、とか思ったら、去年の今ごろは、中国産のうなぎ問題ってのがあったんですね。有害な薬品が含まれているとか、そんなやつでしたっけ。

来年のうなぎ問題がどんなのか、楽しみ~

今日は、中国産のうなぎの蒲焼は、まだたくさん売ってました。どうせ今日は値段が高めに設定されているんだろうから、パスしましたけど。

■ 過去記事


(FreeBSD) Fatal trap 12: page fault while in kernel mode ... current process gam_server

2008-07-23 22:30:02 | デジタル・インターネット

ハードウェア構成とか、どんな仕事をさせるか、負荷…、などの条件や状況によるところは大きいですが、長年、FreeBSDをサーバーとして使ってきて思うに、FreeBSDはちょっとやそっとのことで落ちたりはしない、とっても安定したサーバーとして、信用して使っていられる、というイメージを、私はもっていました。

ところが、ここ1~2ヶ月の間に、2~3回のkernel panicを見てしまいました。

ちゃんとメモを残していなかったんですが、たしかコンソールには、

Fatal trap 12: page fault while in kernel mode
...
current process gam_server

みたいなメッセージがでていて、メモリイメージをディスクにダンプしようとしているのですが、なぜか、ダンプが全然進まず、そのまま固まっていて、再起動もしない、という感じ。

そして、数回見たいずれも、gam_serverが関係していました。

gam_serverというのは、ports/devel/gaminでインストールされる/usr/local/libexec/gam_serverのことらしいです。

私自身は、KDEとかGNOMEは使わないので、gaminについてこれまでほとんど知らなかったんですが、どうやら、KDEを使っていると、gam_serverも実行されるみたいです。

そのkernel panicを起こしたFreeBSDなサーバですが、こんなものです。

  • Core 2 Quad Q6600
  • 4GB
  • FreeBSD/i386 7-STABLE (5月末か6月始めころcsupした)    64bit版じゃない
  • Windows上でXサーバを実行して、FreeBSDのkdmを使って、KDEでログインしてるユーザーが、1~2人いる
  • apache httpd-2.2とかPostgreSQLとかが、そこそこ忙しく動いてる
  • kernel panicしたときは、portupgradeを実行してて、そこそこ負荷は高かった

はじめてkernel panicしたときは、気のせいだ、と思いたかったのですが、どうやらこうたびたび落ちると、どうもgam_server周りで、何かよろしくないところがあるのでは?という気がして仕方ありません。

詳しいことは全然理解していないのですが、FreeBSDのgaminは、kqueueという機能を使っているそうで、kqueueというのは、kernel event notification mechanismというもので、えーとチンプンカンプンなんですが、kernelに関係しているということで、kernel panicもありうるかな?と、臭い匂いがプンプンしてきます。

ports/devel/gaminでは、make configして、GAM_POLLERというオプションをつけると、kqueueを使わなくなるみたいなので、とりあえずはkqueueを使わないgaminで、様子見をしてみようかと思います。

本当は、kernel panic時のデバッグトレースをとれるようにしておくべきなんでしょうがねぇ。

(2008-08-23)

あれからちょうど1ヶ月経過。またしても同じFatal trap 12が出てしまいました。だめか…