« Previous | Next » (Home)     [カテゴリー:FreeBSD ]

2009.02.26

FreeBSDのgmirrorでのHDD故障対応・・・(FreeBSD)

gmirrorでミラー構成が出来たので、故障状態を起こさせて、回復を試みる。
(1) FreeBSDを普通に起動した後に、最初にFreeBSDをインストールしたHDD(ad0)の供給電源ケーブルをHDDより引き抜いた。そのままでは、何も起こらなかったがviを起動しようとしたら、良く覚えてないがad0に書き込めないと言うようなメッセージが表示された。
下記のようにステータスを表示させると、DEGRADEDになっていた。

# gmirror status
    Name         Status   Components
gmirror/gm0   DEGRADED      ad2

もちろん、この状態でもサーバは問題なく動作を続けている。
(2) Shutdownして起動すると正常に立ち上がった。
(3) もう一度Shutdownしてad0に電源ケーブルをつなぎ、起動する。
ログインしてstatusを見ると、既に同期化が始まっていた。
ad0に全く新しいディスクを取り付けて起動すると、(5)の状態になるはずである。

# gmirror status
    Name         Status   Components
gmirror/gm0   DEGRADED      ad2
               ad0(1%)   ← 進行が%で表示される

(4) gmirror作成で使用したLivefs CDで起動して、ad0に書き込まれたメタデータをクリアした。

Fixit# chroot /dist
Fixit# kldload geom_mirror
Fixit# exit
Fixit# gmirror stop gm0    ← gmirrorの停止
Fixit# gmirror clear ad0    ← ad0のメタデータのクリア

(5) Livefs CDを抜いて普通に起動してステータスを確認し、今度は同期化は始まらず、ミラーはDEGRADED状態であることを確認する。

# gmirror status
    Name         Status   Components
gmirror/gm0   DEGRADED      ad2

(6)gm0の構成情報をリセットする。そしてステータスを確認する。DEGRADEDがCOMPLETEに変わる。

# gmirror forget gm0         ← 構成情報のリセット
# gmirror status
    Name         Status   Components
gmirror/gm0   COMPLETE      ad2

(7) ここで、ad0を組み込む。

# gmirror insert gm0 ad0        ← ad0の組み込み
GEOM_MIRROR:Device gm0:rebuilding provider ad0.

(8)上記メッセージの後、同期が始まり30分ほどで完了した。

# gmirror status
    Name         Status   Components
gmirror/gm0   DEGRADED      ad2
               ad0(2%)   ← 進行が%で表示される
# gmirror status
    Name         Status   Components
gmirror/gm0   COMPLETE      ad2
               ad0

2009.02.25

FreeBSDでRAID1(mirror)の設定・・・(FreeBSD)

災害は忘れた頃にやってくる。24H運転のサーバを運営していると、何時か突然にHDDの故障に見舞われる。そのために、2台のサーバで真夜中にお互いのデーター領域をBackupするようにしているが、最悪故障前24時間のデータは失われるし、なによりもHDDを交換して、再度サーバを立ち上げ直すのは簡単な仕事ではない。優に1日ぐらいは必要である。
そこで、HDDをミラー構成にして突然の事故に備えることにした。
FreeBSDではgmirrorというソフトウェアミラーが備わっているので、これを用いる。
まず、空いているPCを用いてトライアルすることにし、以下はその記録である。

1. 準備

FreeBSD releaseの最新版である7.1版の7.1-RELEASE-i386-disc1.isoと7.1-RELEASE-i386-livefs.isoをダウンロードし、どちらもCDRを作成しておく。
実験用に用意したPCには2台のHDDを入れ、ad0(40GB)とad2(160GB)となっていて、ad0にはFreeBSD-7.1を普通にインストールしておいた。なお、DVDがacd1に割り付けられている。

2. gmirrorの設定

普通はLivefs CDで起動するが、テストに用いたPCでは何故か起動できなかったので、インストールCDで起動して、以下に示すように進めた。
なお、Livefs CDで起動出来ても、同じように進んで行き、途中でCDの入れ替えが不要なだけである。

(1) FreeBSDのインストールディスクで起動し、国の選択でJapanを選び、キーボードのコードはJapanese 106を選ぶ。ここで英文でも良いと思ってUSAのまま進めると、キーボードが日本語キーボードのとき、記号の配置が違い苦労する。

mirror_01.jpg
mirror_02.jpg

(2) キーボードを選んで現れる画面で、
Fixit: Repair mode with CDROM/DVD/Floppy or start shellを選択する。

mirror_03.jpg

(3) 現れた画面で、
CDROM/DVD:Use the “live” filesystem CDROM/DVD を選ぶ。
Livefs CDを使ってBootしても、ここまでは同じで、これ以降はCDの入れ替え無しで、次の3. 設定に進む。

mirror_04.jpg

(4) Please insert a FreeBSD live filesystem CD/DVD and press return のメッセージがでたら、CDをFreBSD Live CD に交換してReturnを押す。

mirror_05.jpg

3. 設定

# Fixitのプロンプトが表示されるので、下記のように設定する。
IDEではad0, ad2のようにprimaryとsecoondaryのMaster接続がよく、sataではad4, ad6がよい。dmesgでドライブ名を調べておくとよい。
なお、ミラーの形式のround-robinは負荷分散の方式の1つである。他にも幾つかの種類があるが、round-robinが最もポピュラーらしい。

Fixit# chroot /dist
Fixit# kldload geom_mirror           ← gmirrorのload
Fixit# exit
Fixit# gmirror label -b round-robin gm0 ad0 ← round-robinでmirrorを構成

下記のメッセージが表示される。

Metadata value stored ad0.
Done.

Statusを表示してみると、下記のように表示されmirror機能が出来ている。

Fixit# gmirror status
 Name         Status   Components
mirror/gm0  COMPLETE    ad0

出来たミラーディスクを/mntにマウントしてfstabを書き換える。
sedの替わりに、eeで/mnt/etc/fstabを編集して/dev/ad4s1a → /dev/mirror/gm0s1aのように全ての ad4をmirror/gm0に変更しても良い。なお、viはtemporary file領域がいるので使用不可。

Fixit# mount /dev/mirror/gm0s1a /mnt
Fixit# sed -i bak s/ad0/mirror\/gm0/ /mnt/etc/fstab/

geom_mirrorの読み込みを/boot/loader.confに設定し、/etc/rc.confも修正。
これは、eeを使った方が楽かもしれない。

echo 'geom_mirror_load="YES"' >> /mnt/boot/loader.conf
echo 'swapoff="YES"' >> /mnt/etc/rc.conf

CDRを抜いて、再起動する。立ち上がったらroot権限でad2を組み込む。

# gmirror insert gmo ad2   ← ad2の組み込み

これで、同期化が始まる、statusを見ると、

# gmirror status
   Name     Status  Components
  mirror/gm0  DEGRADED    ad0
                  ad2(2%)

30分ほどでad2(100%)になりミラー構成は完了した。

# gmirror status
Name          Status   Components
mirror/gm0     COMPLETE      ad0
               ad2

4. 状態の監視

ミラーで動作させていると、1台のHDDが故障してもサーバの動作は続行するが、1台が故障した時点で対処しないと、ミラーにしている意味がない。
このために、/etc/defaults/periodic.confを編集してミラーの状態を毎日メールで知らせてもらうようにする。
/etc/defaults/periodic.confをみると、下記のようにDaily check項目の406番が”NO”になっている。

# 406.status-gmirror
daily_status_gmirror_enable="NO"                # Check gmirror(8)

“NO”を”YES”に直しても良いのだが、/etc/defaults/rc.confの内容は書き換えず、/etc/rc.confを作成して指定するのと同様に/etc/periodic.confを作って記述する。この記述が優先される。

# cd /etc
# vi periodic.conf
daily_status_gmirror_enable="YES"
: wq

これで、毎日のdaily checkメールにgmirror statusの情報が載る。

2008.07.05

VMwareでFreeBSD 7.0を動かす・・・(FreeBSD)

サーバを7.0-RELEASEにしたので、Desk Topで使っているWindows XPマシンで動かしているVMware内のFreeBSDも7.0-RELEASEに変えた。
インストールは問題なく終わったが、以前に期間限定版のVMware Serverから抽出したVMware-Toolsをインストールしたら最後の方でエラーになった。
しかたがないので、vmware-tools-distribのbinディレクトリー内にあるvmware-uninstall-tools.plを使ってuninstallした。
幸い、portsにvmmouse driverがあるのでこれをインストール。

# cd /usr/ports/x11-drivers/xf86-input-vmmouse
# make install clean

そして、xorg.confでmouse driverをvmmouseに変更。

Section "InputDevice"
Identifier  "Mouse0"
Driver      "vmmouse"
Option      "Protocol" "auto"
Option      "Device" "/dev/sysmouse"
Option      "ZAxisMapping" "4 5 6 7"
EndSection

次に、日本語入力の設定を行う。
長い間、cannaを入れてkinput2で入力変換を使っていたが、最近ではscimの方が高性能としてこれを使うのが一般化しているらしい。そこでpackageから
ja-anthy-9100C、ja-scim-anthy-1.2.4を入れる。
そしてhome directoryの.xinitrcの最後に次を付ける。

LANG=ja_JP.eucJP; export LANG
LC_CTYPE=ja_JP.eucJP; export LC_CTYPE
XMODIFIERS=@im=SCIM;  export XMODIFIERS
GTK_IM_MODULE=scim;  export GTK_IM_MODULE
QT_IM_MODULE=scim;  export QT_IM_MODULE
scim -d &
exec startkde

Xwindowを立ち上げて、scimを起動するには、CTL-Spaceで行う。画面の左下に下図のようなMS IMEに似た表示が出る。
scim.png
日本語とアルファベット入力の切り替えは[半角/全角・漢字]ボタンで行う。これもWindowsと同じで使いやすい。
なるほど、変換効率も良く、これなら文章を書いても良い。このブログもこれで書いている。
なお、[CTL-Shift]で言語圏を切り替えられるが、使う必要はないだろう。

2008.05.24

BIND 9.3.4 (DNSサーバ)・・・(FreeBSD)

FreeBSDの6.3で添付のbindが9.3.4になった。もちろん、7.0-RELEASEもbindは9.3.4だ。
大きな特徴は、named.confで外向きと内向きの記述を書き分けられるようになったことだ。外向きは必要ないので、内向きのみ作ったnamed.confと合わせて正逆zoneファイルの例を下記に示しておく。

1.named.conf

options {
directory       "/etc/namedb";
pid-file        "/var/run/named/pid";
dump-file       "/var/dump/named_dump.db";
statistics-file "/var/stats/named.stats";
forwarders {
210.188.224.10;
};
};
view "internal" {
match-clients { 192.168.1.0/24; 127.0.0.0/8; };
recursion yes;
zone "." {
type hint;
file "named.root";
};
zone "localhost" {
type master;
file "master/localhost.zone";
};
zone "0.0.127.IN-ADDR.ARPA" {
type master;
file "master/localhost.rev";
};
zone "fam.cx" {
type master;
file "slave/canal.zone";
allow-update { none; };
};
zone "1.168.192.in-addr.arpa" {
type master;
file "slave/canal.rev";
allow-update { none; };
};
};

2. localhost.zone

$TTL    86400
@             IN      SOA   uls.fam.cx.  root.uls.fam.cx.(
2005071701      ; Serial
3600            ; Refresh
900             ; Retry
3600000         ; Expire
3600 )          ; Minimum
IN      NS    uls.fam.cx.
localhost.    IN      A     127.0.0.1

3. localhost.rev

$TTL    86400
@             IN      SOA   uls.fam.cx.  root.uls.fam.cx.(
2005071701      ; Serial
3600            ; Refresh
900             ; Retry
3600000         ; Expire
3600 )          ; Minimum
IN      NS    uls.fam.cx.
1             IN      PTR   localhost.

4. 正引きzone file(canal.zone)

$TTL 3600       ; 1 hour
@             IN      SOA   uls.fam.cx.  root.uls.fam.cx.(
2006121601 ; serial
10800      ; refresh (3 hours)
3600       ; retry (1 hour)
3600000    ; expire (5 weeks 6 days 16 hours)
3600       ; minimum (1 hour)
)
IN       NS      uls.fam.cx.
IN       MX      10 uls.fam.cx.
uls            IN       A       192.168.1.5
www            IN       CNAME   uls
ftp            IN       CNAME   uls

5. 逆引きzone file(icanal.rev)

$TTL 3600       ; 1 hour
@             IN      SOA   uls.fam.cx.  root.uls.fm.cx.(
2006121602 ; serial
10800      ; refresh (3 hours)
900        ; retry (15 minutes)
3600000    ; expire (5 weeks 6 days 16 hours)
3600       ; minimum (1 hour)
)
IN NS   uls.fam.cx.
5                       IN PTR  uls.fam.cx.

2006.12.18

Swapスペース不足・・・(FreeBSD)

10日ほど前から、下記のログが大量に出て、Apacheが落ちる問題に悩まされていた。

swap_pager_getswapspace: failed
swap_pager_getswapspace: failed
swap_pager_getswapspace: failed
          ・
          ・

最初、ハードディスクが壊れかかっているのだろうと思い込んで、新しいHDDを買ってきたが、新しく立ち上げる間の代替機でも同じ現象が発生した。
どうも、mysqlを5.0.27に上げてからのようで、これは本当にスワップ領域が足りないのではと思い、スワップ領域を増やしたらビンゴー!!。 ぴったり安定した。
実は、古いPCで380MBほどのメモリで、色々なサービスを起動していてスワップ領域も512MBなので、mysqlを新しくして、ついに足りなくなったのだろう。
しかし、スワップ領域は最初にインストールするときに確保するが、後から増やすことなどできるのか。
どうすればよいのか? 色々と調べたら簡単に増やせることがわかった。
まず、/usrに

# dd if=/dev/zero of=/usr/SWAPFILE bs=1m count=2000

として、2GBの領域を/usrに確保。 少し時間がかかる。 そして、/etc/rc.confに次の1行を追加した。

swapfile="/usr/SWAPFILE"

これだけである。 マシーンを再起動どうなったか調べるために次のコマンドを打つ

# pstat -s
Device          1K-blocks     Used     Avail Capacity
/dev/ad0s1b        524288      120   524288      0%
/dev/md0           2048000      136  2048000     0%
Total                   2572288      256  2572032     0%

となって、最初に確保してあった512MBも加わり2.5GBのスワップ領域となった。
1週間悩み続けたのが、簡単に氷解した。

« Previous | Next »