Software RAID 障害復旧

Software RAID のハードディスクが壊れたっぽいのでディスクを交換して RAID の復旧を行いました。

ハードディスクが壊れたっぽい、もしくはそろそろ壊れそうと思ったのはこんなメールが送られて来たからです。

Jun 30 10:55:21 ns1 smartd[3428]: Device: /dev/hdc, FAILED SMART self-check. BACK UP DATA NOW!

RAID の状態は以下のとおり正常だったのですが、早めの対処という事でディスク交換しました。

[root@ns1 ~]# cat /proc/mdstat
Personalities : [raid1]
md1 : active raid1 hdc2[1] hda2[0]
      2096384 blocks [2/2] [UU]
 
md2 : active raid1 hdc3[1] hda3[0]
      75762432 blocks [2/2] [UU]
 
md0 : active raid1 hdc1[1] hda1[0]
      264960 blocks [2/2] [UU]
 
unused devices: <none>
  1. 準備
  2. ディスク交換をする前に現在の設定を控えておきました。

    [root@ns1 ~]# fdisk -l /dev/hda
     
    Disk /dev/hda: 80.0 GB, 80000000000 bytes
    255 heads, 63 sectors/track, 9726 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
     
       Device Boot      Start         End      Blocks   Id  System
    /dev/hda1   *           1          33      265041   fd  Linux raid autodetect
    /dev/hda2              34         294     2096482+  fd  Linux raid autodetect
    /dev/hda3             295        9726    75762540   fd  Linux raid autodetect
     
    [root@ns1 ~]# smartctl -a /dev/hdc
    結果が長いので省略しました。

    それと、IDE のディスクだったのでセカンダリコントローラのマスターに接続されている事や、ディスクのジャンパーをどうすればよいのか調べておきました。

  3. RAID デバイスから /dev/hdc を削除
  4. [root@ns1 ~]# mdadm --manage /dev/md0 --fail /dev/hdc1
    mdadm: set /dev/hdc1 faulty in /dev/md0
    [root@ns1 ~]# mdadm --manage /dev/md1 --fail /dev/hdc2
    mdadm: set /dev/hdc2 faulty in /dev/md1
    [root@ns1 ~]# mdadm --manage /dev/md2 --fail /dev/hdc3
    mdadm: set /dev/hdc3 faulty in /dev/md2
     
    すると mdstat はこんな風になります。
    [root@ns1 ~]# cat /proc/mdstat
    Personalities : [raid1]
    md1 : active raid1 hdc2[2](F) hda2[0]
          2096384 blocks [2/1] [U_]
     
    md2 : active raid1 hdc3[2](F) hda3[0]
          75762432 blocks [2/1] [U_]
     
    md0 : active raid1 hdc1[2](F) hda1[0]
          264960 blocks [2/1] [U_]
     
    unused devices: <none>
     
    さらに続けて以下を実施。
    [root@ns1 ~]# mdadm --manage /dev/md0 --remove /dev/hdc1
    mdadm: hot removed /dev/hdc1
    [root@ns1 ~]# mdadm --manage /dev/md1 --remove /dev/hdc2
    mdadm: hot removed /dev/hdc2
    [root@ns1 ~]# mdadm --manage /dev/md2 --remove /dev/hdc3
    mdadm: hot removed /dev/hdc3
     
    /dev/hdc が RAID デバイスから削除されました。
    [root@ns1 ~]# cat /proc/mdstat
    Personalities : [raid1]
    md1 : active raid1 hda2[0]
          2096384 blocks [2/1] [U_]
     
    md2 : active raid1 hda3[0]
          75762432 blocks [2/1] [U_]
     
    md0 : active raid1 hda1[0]
          264960 blocks [2/1] [U_]
     
    unused devices: <none>
  5. ディスク交換
  6. [root@ns1 ~]# sync;sync;sync;shutdown -h now
    電源停止後ディスク交換。
  7. パーティショニング
  8. デフォルトの状態はこんな風になっていました。
    [root@ns1 ~]# fdisk /dev/ -l /dev/hdc
    last_lba(): I don't know how to handle files with mode 41ed
     
    Disk /dev/hdc: 80.0 GB, 80026361856 bytes
    255 heads, 63 sectors/track, 9729 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
     
    Disk /dev/hdc doesn't contain a valid partition table
     
    で、/dev/hda と同じようにパーティションを切りました。
     
    [root@ns1 ~]# fdisk /dev/hdc
    Command (m for help): n
    Command action
       e   extended
       p   primary partition (1-4)
    p
    Partition number (1-4): 1
    First cylinder (1-9729, default 1):
    Using default value 1
    Last cylinder or +size or +sizeM or +sizeK (1-9729, default 9729): 33
    Command (m for help): n
    Command action
       e   extended
       p   primary partition (1-4)
    p
    Partition number (1-4): 2
    First cylinder (34-9729, default 34):
    Using default value 34
    Last cylinder or +size or +sizeM or +sizeK (34-9729, default 9729): 294
     
    Command (m for help): n
    Command action
       e   extended
       p   primary partition (1-4)
    p
    Partition number (1-4): 3
    First cylinder (295-9729, default 295):
    Using default value 295
    Last cylinder or +size or +sizeM or +sizeK (295-9729, default 9729): 9726
     
    Command (m for help): t
    Partition number (1-4): 1
    Hex code (type L to list codes): fd
    Changed system type of partition 1 to fd (Linux raid autodetect
    Command (m for help): t
    Partition number (1-4): 2
    Hex code (type L to list codes): fd
    Changed system type of partition 2 to fd (Linux raid autodetect)
    Command (m for help): t
    Partition number (1-4): 3
    Hex code (type L to list codes): fd
    Changed system type of partition 3 to fd (Linux raid autodetect)
     
    Command (m for help): p
     
    Disk /dev/hdc: 80.0 GB, 80026361856 bytes
    255 heads, 63 sectors/track, 9729 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
     
       Device Boot      Start         End      Blocks   Id  System
    /dev/hdc1               1          33      265041   fd  Linux raid autodetect
    /dev/hdc2              34         294     2096482+  fd  Linux raid autodetect
    /dev/hdc3             295        9726    75762540   fd  Linux raid autodetect
     
    Command (m for help): a
    Partition number (1-4): 1
    Command (m for help): p
     
    Disk /dev/hdc: 80.0 GB, 80026361856 bytes
    255 heads, 63 sectors/track, 9729 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
     
       Device Boot      Start         End      Blocks   Id  System
    /dev/hdc1   *           1          33      265041   fd  Linux raid autodetect
    /dev/hdc2              34         294     2096482+  fd  Linux raid autodetect
    /dev/hdc3             295        9726    75762540   fd  Linux raid autodetect
     
    Command (m for help): w
    The partition table has been altered!
     
    Calling ioctl() to re-read partition table.
    Syncing disks.
     
    そして、以下で確認しました。
    [root@ns1 ~]# fdisk -l /dev/hdc
     
    Disk /dev/hdc: 80.0 GB, 80026361856 bytes
    255 heads, 63 sectors/track, 9729 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
     
       Device Boot      Start         End      Blocks   Id  System
    /dev/hdc1   *           1          33      265041   fd  Linux raid autodetect
    /dev/hdc2              34         294     2096482+  fd  Linux raid autodetect
    /dev/hdc3             295        9726    75762540   fd  Linux raid autodetect
  9. リシンク
  10. RAID デバイスに各パーティションを追加するとリシンクします。

    [root@ns1 ~]# mdadm --manage /dev/md0 --add /dev/hdc1
    mdadm: hot added /dev/hdc1
    [root@ns1 ~]# mdadm --manage /dev/md1 --add /dev/hdc2
    mdadm: hot added /dev/hdc2
    [root@ns1 ~]# mdadm --manage /dev/md2 --add /dev/hdc3
    mdadm: hot added /dev/hdc3
     
    mdstat を見るとリシンクしている状況を確認できます。
    [root@ns1 ~]# cat /proc/mdstat
    Personalities : [raid1]
    md1 : active raid1 hdc2[2] hda2[0]
          2096384 blocks [2/1] [U_]
          [=====>...............]  recovery = 25.7% (540800/2096384) finish=0.9min speed=27040K/sec
    md2 : active raid1 hdc3[2] hda3[0]
          75762432 blocks [2/1] [U_]
            resync=DELAYED
    md0 : active raid1 hdc1[1] hda1[0]
          264960 blocks [2/2] [UU]
     
    unused devices: <none>
     
    立て続けに複数のパーティションを --add しても同時に複数のリシンクが走らないみたいです。
     
    最終的に完了すると以下のようになります。
     
    [tatsu@ns1 ~]$  cat /proc/mdstat
    Personalities : [raid1]
    md1 : active raid1 hdc2[1] hda2[0]
          2096384 blocks [2/2] [UU]
     
    md2 : active raid1 hdc3[1] hda3[0]
          75762432 blocks [2/2] [UU]
     
    md0 : active raid1 hdc1[1] hda1[0]
          264960 blocks [2/2] [UU]
     
    unused devices: <none>

    これで RAID デバイスの復旧は完了ですが、交換したディスクからも起動できるようにする為にブートローダをインストールする必要があります。

  11. ブートローダのインストール
  12.  
    [root@ns1 ~]# grub
        GNU GRUB  version 0.95  (640K lower / 3072K upper memory)
     
     [ Minimal BASH-like line editing is supported.  For the first word, TAB
       lists possible command completions.  Anywhere else TAB lists the possible
       completions of a device/filename.]
     
    grub> device (hd0) /dev/hdc
     
    grub> root (hd0,0)
     Filesystem type is ext2fs, partition type 0xfd
     
    grub> install /grub/stage1 (hd0) /grub/stage2 p /grub/grub.conf
    grub> quit
     
    確認はこうするようです。
    [root@ns1 ~]# dd if=/dev/hdc bs=512k count=1 | strings
    ZRrI
    D|f1
    GRUB
    Geom
    Hard Disk
    Read
     Error
    ZRrI
    D|f1
    GRUB
    Geom
    Hard Disk
    Read
     Error
    qH*L
    sH*L
    1+0 records in
    1+0 records out

    これで復旧作業は完了です 🙂

    Software RAID はリシンク中に OS を起動してサービスをすぐに再開させる事ができて
    ダウンタイムが短くて良いですね。

    以下を参考にさせていただきました。
    大変助かりました。ありがとうございました。

    http://centossrv.com/ RAID構成ハードディスク交換

WordPress MU と /server-status

WPMU を利用しているサイトに munin をセットアップしたところ /server-status へのアクセスができなくてはまりました。

http://example.com/server-status へアクセスすると WPMU トップページへmod_rewrite によってリダイレクトされてしまいます 😥

色々なサイトに記載されている設定を試してみましたが思うように行かず mod_rewrite 以外の方法で何とかしようか…と悩んでいたところHF164.comさんの記事を読んで解決できました 🙂

# for server-status
RewriteCond %{REQUEST_URI} =/server-status
RewriteRule ^.*$ server-status [L]

hf164さんありがとうございます、助かりました 🙂

PostgreSQL schema_path

久しぶりに Slony-I を色々といじる。

schema を一々入力するのが面倒なのでパスを設定して楽をしたいけど思い出せない 😥

結局思い出すまでに30 分くらいかかってしまった。

次回忘れてしまった時の為にメモ。

SET search_path TO スキーマ,public;

WordPress に GoogleAnalytics コードを挿入するプラグイン

前回に続き
また勉強と実務を兼ねて WordPress に GoogleAnalytics 用のコードを
挿入するプラグインを作ってみました 🙂

CMS として WordPress を使ってサイトを作成しているので、開発中はテスト用の
コード、リリース後は本番用のコードと切り替える必要があります。

また、リリース後も開発環境はテスト用コードを使い続けるので切り替えを
簡単にできるようにしたかったのです 🙂

管理画面で PC 用のウェブプロパティID、ktai_style 用のウェブプロパティID を
セットして、ktai_style のテンプレートで ks_wp_head(), ks_wp_footer() を
有効化すればOK

すでに同じようなプラグインはありますが自分で作ってみました 😎
このサイトでテスト中です… :mrgreen:

年末年始の目標を達成できました!

年末に目標を立てました。(しょぼい目標ですが)

  1. 荷物を片付ける
  2. 仕事ができる環境を作る
  3. WordPressのプラグインを作る
  • 荷物を片付ける
  • 年末に引越しをしたので全てのダンボールから荷物を出して、快適に(?)暮らせるようになる事を目標としました。
    全てのダンボールを開けて片付けなくても生活をスタートする事もできたのですが、最初にやらないとずーっとやらないと思ったのでガンバリました 😛

  • 仕事ができる環境を作る
  • これは当たり前の事で目標にするまでもないのですが、色々と大変でした 🙁
    事情があって引越しをしてすぐに仕事部屋が使えなかったので別の部屋にPCを置いて使う時だけPCをルータに接続して、それ以外はノートPCで乗り切りました :mrgreen:
    今は仕事部屋で仕事ができる状態になって快適です 😛

  • WordPressのプラグインを作る
  • 以前から作ってみたかったのですがなかなか着手できなかったので、年末年始時間があるので作ってみました。

    作成したプラグインはコメントスパムを検知して自動的に「承認待ち」か「spam」にするモノです。
    「承認待ち」にするか「spam」にするかはプラグインインストール後管理メニューから選択できるようにしました。
    spam判定は単純に英数字記号のみのコメントはspam扱いにします 😎

    少しだけ自分でテストは行ったのですが、本物のspamコメントをちゃんと検知できるかこのブログでテストをしてみます。
    akismetを停止して作成したプラグインをインストールしました :mrgreen:

    とこんな記事を投稿したら英数字記号以外のspamコメントが増えるかもしれませんね… 😥

とりあえず小さいながらも目標を達成できて2010年は良いスタートとなりました。
今年もがんばります 🙂

おめでとうございます

あけましておめでとうございます。

一昨年、去年に続き今年も厳しい一年になりそうです。
気を引き締めて何事にも取り組んで行きたいと思います。

500

今年もよろしくお願いいたします!

WordPress 予約投稿

WordPress の予約投稿が上手くいきませんでしたが、解決できました 🙂

ただし cron と wget が使える事が前提条件となります。

例えば blog の URL が http://example.com/myblog/ だった場合、
example.com 上で、cron から wget で以下のように wp-cron.php に
アクセスすると上手くいくようです。

* * * * * wget http://localhost/myblog/wp-cron.php 
--header="Host: example.com"

私は WordPress MU で全てのブログで予約投稿ができるように
以下のようなスクリプトを作成して cron から実行しています。
(WordPress MU 2.8.4a で実際に使っています)

#!/bin/sh
MYSQL=/usr/bin/mysql
OUT=/tmp/wp-cron.out
paths=`$MYSQL --user=DBユーザ名 --password=DBパスワード -D DB名 
-e "SELECT path FROM wp_blogs" -N -s`
 
for path in ${paths[0]}
do
wget http://localhost${path}wp-cron.php 
--header="Host: example.com" 
-O $OUT
rm -f $OUT
done

上記スクリプトに実行権(chmod +x)をつけて cron から実行しています。

* * * * * /usr/local/path/to/wpcron.sh

今のところ問題なさそうです 🙂

※ ❗ スクリプトに MySQL のパスワードなどが記述されているので注意してください
※ ❗ スクリプトは自分だけ、または管理者だけが読めるようにしましょう :mrgreen:

rock-solid

RSSリーダに登録してあったあるサイトでこんな記事を見つけました。

自分も仕事で良く CentOS のお世話になっておりまして rock-solid な OS だなと。

CentOSを使う3つの理由

いろいろな理由がありますが、多いのは以下の 3 つです。

  • Stable
  • Free
  • long-term support

頷ける結果ですね :mrgreen:

他にも RHEL をベースにしている事、互換性が高い事などがありました。

その中にいくつか ”rock-solid” というのがありまして、なんだろ?と気になりました。
辞書を見ると “石のように固い~” とか “悠然とした~” なんて書いてありました。

石のように固い OS、つまり強固で安定して信頼できるという事でしょうか?
確かにその通りですね、自分もそう思います。

CentOS いつもありがとう 🙂

etags

毎回忘れてしまい調べるのに時間がかかるのでメモしておきます。 :mrgreen:

etags のキーバインド

  • M-.
  • 関数を定義しているところへジャンプ

  • M-*
  • 前に戻る

  • C-u M-.
  • 他に定義しているところへジャンプ

  • C-u M-*
  • 前に定義してあったところにもどる

sary

sary について。

sary はテキストボックスなどの入力支援を行ってくれる便利なモノです。
他にも用途は沢山あると思いますが。

例えばテキストボックスで住所を入力する際に文字を入力すると入力された文字
から始まる入力候補を表示してくれます :mrgreen:

「富山県」と入力したい場合に、

「と」と入力すると入力候補として「東京都、富山県、栃木県、鳥取県、徳島県」
の「と」から始まる都道府県名を表示してくれます。

さらに「とや」と入力すると「富山県」が入力されます。

これは前方一致で、自分もこのような検索を行いたかったのですが、「と」と
入力すると先頭以外に「と」を含む「京都府」が候補として表示されてしまいました 🙁

前回設定した時のメモを見ても特に何も書いてなかったので文字コードの問題か?
とか、サーバが違うから関連するライブラリが違うから?
等と色々と悩みましたが Google で検索したところ

mksary コマンドに -l オプションを付ければ良い事が分かりました 😛

$ mksary --help
Usage: mksary [OPTION]... FILE
  -a, --array=NAME       set the array file name to NAME
  -b, --block=[SIZE]     sort block by block with SIZE [4096] KB block
  -i, --index            assign index points and write them to an array file
  -s, --sort             sort an array file
  -l, --line             index every line
  -w, --word             index every word delimited by white spaces
  -c, --encoding=NAME    handle NAME encoding for indexing
                         [bytestream], ASCII, ISO-8859,
                         EUC-JP, Shift_JIS, UTF-8
  -L, --locale           enable locale support (use mblen for indexing)
  -t, --threads=NUM      set number of threads for block sorting to NUM
  -q, --quiet            suppress all normal output
  -v, --version          print version information and exit
  -h, --help             display this help and exit

最初に help を見れば良かった ❗