FreeBSD9: システムは gmirror/データは zfs で

ASUS E35 M1-M PRO 導入。仮想環境を使わせる講義用のサーバが シングルコアだったので、このボードに引っ越し作業開始。 おー、FreeBSD 8 うごかねー! てことで、FreeBSD 9.0BETA-1で挑戦。 久々にFreeBSDのインストーラ使う。今回から変わってるし。 オールzfsが選べるのかなと思ったが、ようわからん、できないよね? ていうか全部zfsにしなければ行けない理由があるわけでもないので、 これまで同様 /, /var, /usr はgmirrorにして、残りのデータ用 パーティションを zfs でどかん、というシステム構築のメモ。

システム領域のgmirror化

で、今回はインストーラでHDDの領域確保にGUIDを選んだので その場合の手順。GUID管理のHDD操作は御初。2つのHDDを同じパーティション状態に 持ち込みたいのだが、以前のように bsdlabel -e でまるまる コピーってのができなくて面倒じゃのう。

大まかな手順はこう。

  1. 1台目のHDDにFreeBSD9をインストール。GUIDを選択し、 パーティション構成は以下のとおり。
  2. /1GB
    swap4GB
    /var4GB
    /usr22GB
    /z残り全部
  3. 2台目のHDDに初期ラベルを作る。こんな感じかな?
  4. dd if=/dev/zero of=/dev/ada1 count=64
    gpart create -s GPT ada1
    gpart bootcode -b /boot/pmbr ada1
    bootcode written to ada1
    gpart add -b 34 -s 128 -t freebsd-boot ada1
    gpart bootcode -p /boot/gptboot -i 1 ada1
    

これで2台目HDDはこんな感じになるはず。

gpart list ada1
Geom name: ada1
modified: false
state: OK
fwheads: 16
fwsectors: 63
last: 3907029134
first: 34
entries: 128
scheme: GPT
Providers:
1. Name: ada1p1
   Mediasize: 65536 (64k)
   Sectorsize: 512
   Stripesize: 0
   Stripeoffset: 17408
   Mode: r0w0e0
   rawuuid: 9c467d8f-cfe4-11e0-b841-f46d04d83082
   rawtype: 83bd6b9d-7f41-11dc-be0b-001560b84f0f
   label: (null)
   length: 65536
   offset: 17408
   type: freebsd-boot
   index: 1
   end: 161
   start: 34
Consumers:
1. Name: ada1
   Mediasize: 2000398934016 (1.8T)
   Sectorsize: 512
   Mode: r0w0e0

ada1を上記の状態から始めて、

ada0p1	64KB freebsd-boot	
ada0p2	 1GB freebsd-ufs	label=root
ada0p3	 4GB freebsd-swap	label=swap
ada0p4	 4GB freebsd-ufs	label=var
ada0p5	22GB freebsd-ufs	label=usr
ada0p6	残り freebsd-ufs	label=zv0

のそっくりさん状態に持っていく。

gpart add -t freebsd-ufs -l root -s 1073672192B ada1
ada1p2 added
gpart add -t freebsd-swap -l swap -s 4g ada1
ada1p3 added
gpart add -t freebsd-ufs -l var -s 4g ada1
ada1p4 added
gpart add -t freebsd-ufs -l usr -s 22g ada1
ada1p5 added
gpart add -t freebsd-ufs -l zv0 -s 1967095021568B ada1
ada1p6 added

ada1のほうのrootパーティションを未フォーマット状態のままgmirror化。

gmirror load
gmirror label -b split root ada1p2
gmirror status
       Name    Status  Components
mirror/root  COMPLETE  ada1p2 (ACTIVE)
newfs -j mirror/root
mirror/root: 1023.9MB (2097008 sectors) block size 32768, fragment size 4096
        using 4 cylinder groups of 256.00MB, 8192 blks, 16384 inodes.
        with soft updates
super-block backups (for fsck -b #) at:
 192, 524480, 1048768, 1573056
newfs: Can't stat mirror/root: No such file or directory
Using inode 4 in cg 0 for 8388608 byte journal
newfs: soft updates journaling set
mount /dev/mirror/root /mnt

ada1の次期rootパーティションに、 現rootパーティションをまるまるコピーして、 fstabを gmirror のrootをマウントするように書き換える。

tar cfC - / --one-file-system . | tar xpfC - /mnt
vi /mnt/etc/fstab

	/dev/ada0p2	        /               ufs     rw      1	1
	   
	/dev/mirror/root        /               ufs     rw      1	1

 ZZで保存終了
umount /mnt

祈りながらリブート。F8などを押してブートデバイスをada1にしてみる。 どう? 行けた!

では、残る既存パーティション /var(ada0p4), /usr(ada0p5) を gmirror 化。 これは、現物を gmirror に入れた方が楽だからシングルユーザモードで。

shutdown now
umount -a
gmiror label -b split var ada0p4
gmiror label -b split usr ada0p5

fstabを書き換えておこう。

/dev/ada0p4             /var            ufs     rw      2       2
/dev/ada0p5             /usr            ufs     rw      2       2

	↓

/dev/mirror/var         /var            ufs     rw      2       2
/dev/mirror/usr         /usr            ufs     rw      2       2

おっと、ここでは /usr パーティションがないから ed を使おう。

ed /etc/fstab
/ada0p4
s,,mirror/var,
p
/ada0p5
s,,mirror/usr,
p
wq

準備いいかな? ではマルチユーザモードに戻そう。

[C-d]

ちゃんと上がったら、全ての gmirror パーティションの二重化。

df -hl
Filesystem       1K-blocks     Used      Avail Capacity  Mounted on
/dev/mirror/root    1031764  328808     620416    35%    /
devfs                     1       1          0   100%    /dev
/dev/mirror/var     4122780   33320    3759640     1%    /var
/dev/mirror/usr    22699548 2504500   18379088    12%    /usr
/dev/ada0p6      1890802552   32836 1739505512     0%    /z
gmirror status
       Name    Status  Components
mirror/root  COMPLETE  ada1p2 (ACTIVE)
 mirror/var  COMPLETE  ada0p4 (ACTIVE)
 mirror/usr  COMPLETE  ada0p5 (ACTIVE)

# ここから二重化作業. rootにはada0を足し、varとusrにはada1を足している

gmirror insert root ada0p2
gmirror insert var ada1p4
gmirror insert usr ada1p5

しばし待たれよ。同期を取り終わると以下のようになる。

gmirror status
       Name    Status  Components
mirror/root  COMPLETE  ada0p2 (ACTIVE)
                       ada1p2 (ACTIVE)
 mirror/var  COMPLETE  ada0p4 (ACTIVE)
                       ada1p4 (ACTIVE)
 mirror/usr  COMPLETE  ada0p5 (ACTIVE)
                       ada1p5 (ACTIVE)

これでシステム用パーティションの二重化完了。あとは、

をやってみて、最後までうまく行けば完了。 HDD外した状態でマルチユーザモードまで行っちゃうと後が面倒なので注意。

データ領域のzfs化

さあ、どんどん行こう。次はzfs。FreeBSD9インストーラで /z として確保して「残り全部」のサイズを確保しておいた ada0p6, ada1p6 を zfsのpoolにする。仮にマウントしてあるものを外し、fstabからも除去。

umount /z
ed /etc/fstab
$
/dev/ada0p6             /z              ufs     rw      2       2
d
wq
177

zpoolに突っ込む。mirrorとして。

zpool create zp0 mirror ada0p6 ada1p6
zpool status zp0
  pool: zp0
 state: ONLINE
 scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        zp0         ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            ada0p6  ONLINE       0     0     0
            ada1p6  ONLINE       0     0     0

errors: No known data errors

あとは、好きなパーティションを zfs create hogehoge していっておしまい。