CentOSトラブルにハマった週末

先週、Linux系のCentOSで運用していたApache+PHP+MySQL環境で、centosplusという設定を利用して無理やりPHPを4.xから5.xに更新したところ、パッケージ間の整合性が失われた。
しかも、CentOSのDELLパソコンそのものが機器障害で起動しなくなるという、泣きっ面に蜂状態。やむなく常用のWindows XP機にApache2+PHP5+MySQL5環境を構築し、Windows Vistaの小型デスクトップを新たに購入して常用機にすることにした。
と、軽い気持ちで始めたところが、深夜2時まで作業という地獄の週末になった。
まず新しい常用機はエイサーの「ダイエットPC」でたった59,800、超小型の筐体はとても気に入ったが、Windows Vista初体験で実に使いにくいこと。
Vista Home Basic版なら面倒なセキュリティ機能もないだろうと油断したのが間違いで、Internet Explorer 7でWindows Media Player 11の著作権管理機能を更新しようと、マイクロソフトのWebサイトからActiveXを導入しようとしても、警告の情報バーから先に進まず。
ネットをいろいろ検索して初めて「ユーザー・アカウント制御(UAC)」を無効にすればよいと分かった。この機能は初期状態は有効になっているのだが、何かソフトの導入やOSの設定変更をしようとするたびに、画面が暗転して確認メッセージが表示され、非常にうざったい。
個人利用が前提のHome Basic版でここまで高度なセキュリティ機能は無駄だと思うが、これに気づくまで小一時間かかった。
さらに苦労したのは、旧常用機でXAMPPパッケージを使わず、Windows XP上にApache2+PHP5+MySQL5環境を構築する作業だ。
Apache2.2のインストールは問題なく完了。PHP5もインストーラーにしたがえばApache2.2対応の自動設定がされるはずが、MySQL5を導入後、WordPressのインストールが完了しない。
小一時間試行錯誤した末、Apacheのログから、PHPのマルチバイト文字関数が存在しないことが判明。
さらに小一時間の調査の結果、PHP5インストール時に拡張モジュールを全選択したところ、Apache2.2を起動すると、OCI(オラクル呼出し用のインターフェース)が見つからないなど、大量のエラーが表示されたため、PHP初期設定ファイルから拡張モジュール読込み設定を全削除したのが原因と分かった。
そこでPHP5の変更インストールで、WordPressに必要な拡張モジュールを導入しなおし、PHP初期設定ファイル(php.ini)で注釈になっている拡張モジュール設定行(extension=~)を有効化した。
すると今度はApache2.2を起動するたびに、PHPのmb_stringモジュールは既に読込まれているとの警告ダイアログが表示される。PHP初期設定ファイルを見直すと、なんのことはない、インストーラが初期設定ファイルの末尾に、拡張モジュールを有効化する記述を自動追加してくれていたので、注釈行を手で有効化する必要はなかったのだ。
これでApache2.2+PHP5+MySQLは無事立ち上がり、WordPressの初期設定も完了。そこでCentOSでとっておいたMySQL4.xのWordPress用テーブルのダンプを、秀丸エディタでEUCからSJISに文字コード変換し、Windows XPのMySQL5.xに一括読込みさせるが、何度やっても失敗。
原因はいまだに不明だが、ダンプファイル内のINSERT文が、全データを1行のINSERT文で書き込もうとしているため、MySQLの何らかの処理制限に引っかかったのではないかと思われる。
そこでINSERT文を細切れにし、MySQLに1行ずつODBC接続でINSERTするVBScriptを書いたが、今度は文字コードの問題で失敗。ダンプファイルはSJISだが、MySQLの内部コードはUTF-8になっているためだ。
この「愛と苦悩の日記」に以前書いたことを思い出し、個々のINSERT前に「SET CHARACTER SET SJIS」文を実行したところ、SJISファイルを内部コードUTF-8のMySQLデータベースに無事読込むことができた。
ところが災難は続く。
MySQLのrootユーザのセキュリティを高めようと、GUI操作のMySQL管理ツールでrootアカウントの接続元サーバを削除していたところ、rootでlocalhostのMySQLサーバに接続不能になってしまったのだ。
やむなくINNODBファイル群のコールドバックアップをとってから、MySQL5を再導入し、ファイル群を書き戻すが、rootのパスワードが無効になっているらしく、やはり接続できない。
ネットを検索したところ「–skip-grant-tables」オプションをつけてMySQLデーモンを起動すると、rootパスワードなしでMySQLが起動することがわかった。
ただここでも問題があり、MySQLのマニュアルも含め、ネット上のMySQL情報はほとんどLinux前提で、Windows用のMySQLサービスの実体が「mysqld」ではなく「mysqld-nt.exe」だと気づくまでにしばらくかかった。
また「–skip-grant-tables」オプションでMySQLデーモンを起動しても、Windowsの場合はrootがパスワード無しにならないこともわかった。Windowsの場合の正解はMySQLマニュアルの下記のページにあった。
http://dev.mysql.com/doc/refman/5.1/ja/resetting-permissions.html
また、Windowsのコマンドプロンプトから下手に「mysql-nt.exe」を実行すると、プロセスが残ってコントロールパネルからMySQLサービスの起動が不可能になる。mysqld-nt.exeを強制停止するには、タスクマネージャを開いて「プロセス」タブで「mysqld-nt.exe」を選択し、「プロセスの終了」ボタンをクリックすればよい。これに気づくのにもしばらくかかった。
最終的にはrootパスワードを変更してMySQLに接続可能になり、すべての問題は解決した。XAMPPに頼らず、Windows上にApache2.2+PHP5+MySQL5+WordPress環境を構築することにも成功した。
今回の地獄の週末、もとはと言えば、CentOSのPHP4.xでsimple_xml関数が使いたいばかりに、PHP5.xに更新しようとしてパッケージ間の整合性が破壊されたことが原因だった。
Windowsは利用者から見たとき、ブラックボックス部分と変更可能な部分の境界、つまり責任分解点が明確なので、自力解決できる障害と、そうでない障害の境界線も明確だ。
ところがLinuxは言ってみればすべてが公開されているので、最終的にカーネルまで手を入れる能力がなければ、トラブルの自力解決はできない。自力解決できる障害とそうでない障害の境界線が、利用者の能力に依存するが、そもそもLinuxに関する能力を客観的に把握する手段などないので、すべてが自己責任になる。
Linuxが世に出始めたころから言っていることだが、結局、大手業者のLinux支援サービスが商売として成立していることからも分かるように、責任分解点の不明確なLinuxに「素人」が手を出すのは、家庭においても企業においても、極めて危険ということだ。