« 前のページ | Home | 次のページ »    [FreeBSD ]

2011.03.02

スライス単位でのgmirror

以前に250GBのHDD2台を用いてgmirrorの構成をとろうとした時、最初にFreeBSDをインストールしたHDDより、ミラーの構成を組もうとする2台目のHDDの方が、数セクター小さく、ミラーに組み込もうとしたときに拒絶された。そこで、再度容量の小さい方のHDDにインストールし直す羽目に陥ってしまった。
しかし、今日FreeBSDのMLで、詳しい人からスライス単位でもgmirrorが構成できることを教えてもらい、VMwareを用いて実験したので、以下にその方法を記述しておくことにした。

要点は、HDD2台でミラーを組むとき、最初にFreeBSDをインストールするHDDのfdiskによるパーティションを2台目のHDDのボリューム全体容量より、少し小さく設定しておくことが肝要である。
なお、HDDの容量を正確につかむには、diskinfoコマンドを使用する。

# diskinfo -v ad4 ・・・・ad4を調べる場合

1. 準備とFreeBSDインストール

VMwareでad0(20GB)とad2(15GB)の2つの仮想HDDを確保し(ad0 > ad2に注意)、fdiskでad0に12GBの領域(パーティション)を確保してFreeBSD 8.1のCDを 用いてad0にインストールを行った。

2. Livefs CDを用いてgmirrorを設定

(#Fixitのブロンプトを出すまでは、FreeBSDでRAID1(mirror)の設定を参照)
以下のように設定する。gm0s1、ad0s1とスライスで指定するのが、ボリューム全体のミラーと異なる。 
なお、Livefs CDを用いない方法でも試みたがうまくgmirrorを構成できなかった。

Fixit# chroot /dist
Fixit# kldload geom_mirror           ← gmirrorのload
Fixit# exit
Fixit# gmirror label -b round-robin gm0s1 ad0s1 ← round-robinでスライスレベルでmirrorを構成

Statusを表示してみると、下記のように表示され、スライスレベルでmirror機能が出来ている。

Fixit# gmirror status
 Name         Status   Components
  mirror/gm0s1  COMPLETE    ad0s1

3. /etc/rc.conf、/etc/fstab、/boot/loader.confの修正

(1) /etc/rc.confにswapoff=”YES”の1行を追加
(2) /etc/fstabをviで開き、ad0 → mirror/gm0に変更
  例)/dev/ad0s1a → /dev/mirror/gm0s1a
    /dev/ad0s1d → /dev/mirror/gmos1d
 vi でfstabを開いて
 :%s/ad0/mirror\/gmo/ として一括して変更して保存するのが便利である。
(3) /boot/loaderconfにgeom_mirror_load=”YES” の1行を追加する。

そして、shutdownして、HDDから普通に起動。

4. 起動

起動したらsysinstallで configure → fdiskでad2を選び、ボリューム全体(少なくともad0s1で確保したより大きく)をfreebsdパーティションとして確保する。今回の実験ではad2にはボリューム全体の15GBを割り付けた。確保したら、”w”キーを押してスライス情報を書き込む。

5. ad2s1の追加

# gmirror insert gm0s1 ad2s1

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

# gmirror status
   Name     Status  Components
  mirror/gm0s1  DEGRADED    ad0s1
                  ad2s1(2%)

しばらくして、gmirrorの同期が完了する。
swapinfoコマンドでswap領域を見ると、これも無事確保されている。

# swapinfo
Device                          1K-blocks               Used            Avail Capacity
/dev/mirror/gm0s1b       490304                    0              490304     0%

完了の後、ad0を取り除いてad2だけでも無事起動することを確認した。

2010.12.07

FreeBSDでRAID1(mirror)をLivefs CDなしで設置

既にLivefs CDを使って、gmirrorの設定を行う方法を書いた。このLivefs CDを使う方法が正当な方法と思える。
しかし、Livefs CDを使うことなく設定する方法をNetで見つけ、試したところ無事設定出来たので、ここに書いておくことにした。
前提条件として、FreeBSDがインストールされているHDDは/dev/ad4で、設定終了後にHDDを追加してミラー化するものとする。また、gmirrorで設定するのはgm0の設定名とし、サーバーは通常に起動して動作中であるものとする。

注:

ATAインターフェイスのチャネル(ATA0, ATA1, ATA2・・・)単位でFreeBSDでは、attach/detachできるので、ミラー化するドライブ(ここでは、ad4とad6)は、HDD故障時の交換を考え、ATAインターフェイスのチャネルが異なるドライブの組み合わせにするのが望ましい。(例:ATA2 ← ad4, ATA3 ← ad6) (atacontrolで故障HDDの交換 を参照)

(1) /boot/loader.confに gmirrorの読み込みを設定する。

# vi /boot/loader.conf
geom_mirror_load="YES"   ← この行を追加

(2) /etc/fstabを編集する

# vi /etc/fstab
# Device                Mountpoint      FStype  Options        Dump    Pass#
/dev/ad4s1b              none             swap    sw                  0       0
/dev/ad4s1a              /                     ufs       rw                 1       1
/dev/ad4s1d              /backup          ufs     rw                   2       2
/dev/ad4s1e              /tmp               ufs     rw                   2       2
/dev/ad4s1f               /usr                 ufs     rw                   2       2
/dev/ad4s1g              /var                 ufs     rw                   2       2
/dev/ad4s1h              /web               ufs     rw                   2       2
/dev/acd0                 /cdrom            cd9660  ro,noauto    0       0

viで開いた画面で、
:%s/ad4/mirror/gm0/
と、入力する。画面が次のように変わる。

# Device                          Mountpoint      FStype  Options       Dump    Pass#
/dev/mirror/gm0s1b              none            swap    sw                 0       0
/dev/mirror/gm0s1a              /                   ufs     rw                   1       1
/dev/mirror/gm0s1d              /backup        ufs     rw                   2       2
/dev/mirror/gm0s1e              /tmp             ufs     rw                   2       2
/dev/mirror/gm0s1f              /usr                ufs     rw                   2       2
/dev/mirror/gm0s1g              /var               ufs     rw                   2       2
/dev/mirror/gm0s1h              /web             ufs     rw                   2       2
/dev/acd0                             /cdrom          cd9660  ro,noauto    0       0

この内容を保存する。

(3) /etc/rc.confにswapoff=”YES”を追加する。

# echo 'swapoff="YES"' >> /etc/rc.conf

(4) kern.geom.debugflagsに16を書きこむ

# sysctl kern.geom.debugflags=16

この操作で、ブートしたHDDにメタデータが書き込めるようになる。

(5) gmirrorモジュールをload

# kldload geom_mirror

(6) /dev/ad4をmirror登録し、rebootする。

# gmirror label -b round-robin gm0 ad4
# reboot  ← そして、reboot

(7) 無事起動したらloginしてgmirrorのstatusを確認する。下記のようになれば成功である。

# gmirror status
Name    Status  Components
mirror/gm0  COMPLETE  ad4

(8) /dev/ad6が実装されているものとすると、これを追加してミラーを構成する。

# gmirror insert gm0 ad6

これで、同期化が始まる、statusを見ると、進行状態が%で示される。

# gmirror status
   Name     Status  Components
  mirror/gm0  DEGRADED    ad4
                  ad6(2%)

HDDの容量にもよるが、1時間程度でCOMPLETEDになり構成は完了する。

(9) ミラーの状態を毎日メールで知らせてもらうように設定

/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

注意) もしmirrorの構成に失敗したら、このときはLivefs CDを使って元の状態に戻し、
   やり直す必要があるので、やはりLivefs CDは用意しておくべきであろう。

2010.12.04

Samba 3.x版について

FreeBSD-81.1ではja-samba-3.0.35_1をpackageから入れた。

# cd /usr/local/etc/rc.d
# ./samba start

として、起動しようとすると、/etc/rc.confに下記を入れろとメッセージがでる。

samba_enable="YES"
winbindd_enable="YES"

samba_enable=”YES”は予想通りだが、winbindd_enable=”YES”は初めて出た。
Samba 2.x以降であろうか、ハッキリしないが、Sambaをインストールすると
/usr/local/etcにsmb.confが出来、sambaというディレクトリーが出来ている。この中には、
smbpasswdファイルがあるので、ここでSambaのPasswordを設定する。

# cd /usr/local/etc/samaba
# smbpasswd -a nnnnnnn  (nnnnnnは登録するuser名)
# New Password:  xxxxxxx
# Retype New Password:xxxxxxx

2010.12.03

FreeBSD-8.1のkernel再構築

サーバーのHDDのミラー化も済み、各種設定も行い動作も良さそうなので、kernelの再構築(reconfiguration)を行うことにした。

1. 設定ファイルの編集

# cd /usr/src/sys/i386/conf      ← 設定ファイルのディレクトリーに移動
# cp GENERIC MYSERVER
# vi MYSERVER
ここで、下記の赤字部を追加 (4096 x nで100倍にした)
options         AUDIT                   # Security event auditing
options         MSGBUF_SIZE=409600
後は、RAID関連、Wireless LAN関係、PCMCIAカード関係をコメントアウト。
SCSI関連は、USBメモリーを使うので、SCSI peripheralのscbus, device  da, device pass, dev sesを除き、
後は全てコメントアウト。
また、NICで現在使用してしているもの、ならびに他に予備機がある場合はその予備機のNICも残し、他は
コメントアウト。(下記の注参照)
(ハッキリ理解出来ない行は残すのが、鉄則。)

注意:

サーバー内には、HDD2台でミラー構成を取っているが、もしHDD以外の要因(電源等)でサーバーが動作不能になった場合は、HDDを予備機に移し、起動すればデバイス名は、/dev/mirror/gm0で予備機のATAの構成が異なっても(起動ドライブ名がad2からad4に変わっても)起動でき、直ちに運用が継続できる。このためには、kernelに予備機のNICのドライバーも含めておく必要がある。

2. コンパイル作業

# config MYSERVER
以下のメッセージが表示された。
Kernel build directory is ../compile/MYSERVER
Don't forget to do ``make cleandepend; make depend''
作業を続行する
# cd ../compile/MYSERVER
# make clendepend  ← 10秒ぐらいか
# make depend   ← 3分ぐらいかかる
# make       ← 25分ぐらいかかる
# make install    ← 1分ぐらいかかる
# reboot      ← 新kernelを使って再起動

 kernelサイズが、11,783KB → 6,681KB となった。
 測定していないが、起動時間も早くなった感じである。

3. 新カーネルになったことを確認

$ uname -a
FreeBSD uls.fam.cx 8.1-RELEASE FreeBSD 8.1-RELEASE #0:
Fri Dec  3 19:54:02 JST 2010     xxxxxxxx@uls.fam.cx:
/usr/src/sys/i386/compile/MYSERVER  i386

 MYSERVERで作られたkernelとなっている。

4. コンパイルしたkernelに誤りがあり、立ち上がらなかった場合の処理

 下の画面が現れて、カウントダウンしている間にスペースキーを押す。
   なお、/boot/loader.conf でカウントダウン数を、例えば
   autoboot_delay=”3″ (3秒の場合)のように指定できる。← 気の短い人向き (私)
freebsd001.gif

スペースキーで止まったら、6を押して、OKのLoader Promptを出す。
これで、旧kernelで起動するように指定できる。

OK unload     ← 既に読み込まれているモジュールをunload
OK boot kernel.old    ← kernel.oldを使ってbootを指示

再度kernelコンパイルを最初からやり直すことになる。
再度のkernelも起動出来なかった場合、1つ前の起動出来ないkernelがkernel.oldとして保存され、さらにその前の起動出来たオリジナルのkernelは失くなってしまう。
 (1) kernel.old → 喪失   (オリジナルの起動出来たkernel)
 (2) kernel → kernel.old  (構築して起動出来なかったkernel)
 (3) 再コンパイルkernel → kernel(再度のkernelも起動出来ない場合が問題)
これでは、もう起動する手段が無くなってしまうので、再度のコンパイルに先立ち、起動できたkernelをkernel.orgとして保存しておくと良い。

# cd /boot
# mv kernel.old kernel.org

これで、最悪の事態でも、前の図のカウントダウン画面でスペースキーを押し、6を押してOKのPromptを出して、

OK unload
OK boot kernel.org

で、起動できる。

BIND 9.6.2-P2 (DNSサーバ)

FreeBSD 8.1を入れたところ、BINDのバージョンが9.6.2-P2になっており、設定方法が変わったので、書いておく。

1. rndc.keyの作成

 BINDをローカル、リモートからコマンドで制御するためのkeyで、これを作成する。
 (使用法は、Netで参照のこと)
以下のコマンドで、rndc.keyが作成される。

# rndc-confgen -a

2. 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";
listen-on {127.0.0.1; 192.168.1.0/24;};
forwarders {210.188.224.10;};
};
include "/etc/namedb/rndc.key";
controls {
inet 127.0.0.1 allow { 127.0.0.1; } keys { "rndc-key"; };
};
view "internal" {
match-clients {192.168.1.0/24; 127.0.0.0/8; };
recursion yes;
zone "." {type hint; file "/etc/namedb/named.root";};
zone "localhost" {
type master;
file "/etc/namedb/master/localhost-forward.db";
};
zone "127.in-addr.arpa"  {
type master;
file "/etc/namedb/master/localhost-reverse.db";
    };
zone "1.168.192.in-addr.arpa" {
type master;
file "/etc/namedb/slave/canal.rev";
allow-update { none; };
};
zone "fam.cx" {
type master;
file "/etc/namedb/slave/canal.zone";
allow-update { none; };
};
//zone "idema-jp.org" {
//        type master;
//        file "slave/idema.zone";
//        };
};
  • masterディレクトリー内
  •  namedbのディレクトリーの中には、masterの名のディレクトリーがあり、
     その中には、
     ・empty.db
     ・localhost-forward.db
     ・localhost-reverse.db
     が入っている。

  • slaveディレクトリー内
  •  slaveディレクトリーは、最初からあるmasterディレクトリー内のファイルと区別するた、新たに作り、その中にゾーンファイルと逆引きのファイルを入れた。

/etc/namedb → named.conf, named.root, rndc.key
    |
    +ー master → empty.db, localhost-forward.db, localhost-reverse.db
    +ー slave → canal.zone, canal.rev

 (1) 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
uls2          IN       A       192.168.1.6

 (2) canal.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.
6                      IN   PTR  uls2.fam.cx.

3. /etc/resolv.conf

nameserver   127.0.0.1

4. /etc/rc.confに次を追加

named_enable="YES"
named_program="/usr/sbin/named"

5. 動作確認例

 googleのIPアドレスを求めてみる。

$ nslookup www.google.com
Server:         127.0.0.1
Address:        127.0.0.1#53
Non-authoritative answer:
www.google.com  canonical name = www.l.google.com.
Name:   www.l.google.com
Address: 66.249.89.104
Name:   www.l.google.com
Address: 66.249.89.99

« Previous | Next »