最後修 改日期: 2008/11/6

FreeBSD Software RAID GEOM

        
當沒有錢購買硬體 RAID Card 時也可使用 FreeBSD 中的 Software RAID,在使用上還蠻容易操作的可以達到 Raid 0Raid 1、Raid 3 等功能需求,目前市場上比較新的主機版都會內建的 SATA RAID chip 但這些內建的 RAID chip 在 FreeBSD 中大部份沒有 Supprt Dirver 因此無法運作,倘若真的想要使用 RAID 功能可以考慮使用 Software RAID 來運作 

Environment :

硬體:i386 PC Intel P3 733
記憶體網卡:256M RAM + RL 網卡
作業系統:FreeBSD 6.2 Release


( 一 ) FreeBSD Software RAID 1

Setp 1.

先在灌好 FreeBSD 機器中的第一棵 HD 設定開啟 GEOM。

# gmirror label -v -b round-robin gm0 /dev/ad0   # 在 ad0 中進行 GEOM 開啟,彈出錯誤訊息不允許儲存 metadata 到 ad0
Can't store metadata on /dev/ad0: Operation not permitted

# sysctl kern.geom.debugflags=16      # 開啟後就不會有錯誤訊息
kern.geom.debugflags: 0 -> 16
 
# gmirror label -v -b round-robin gm0 /dev/ad0     # 再次啟用 GEOM
Metadata value stored on /dev/ad0

# echo geom_mirror_load="YES" > /boot/loader.conf   # 設定開機自動啟動 GEOM

# cp /etc/fstab /etc/fstab.orig    # 備份 fstab 檔
# vi /etc/fstab     #  修改 fstab
# Device                Mountpoint      FStype  Options         Dump    Pass#
#/dev/ad0s1b             none            swap    sw              0       0
#/dev/ad0s1a                 /               ufs        rw              1       1
/dev/mirror/gm0s1b    none          swap    sw              0       0
/dev/mirror/gm0s1a      /                 ufs     rw               1       1
#/dev/acd0              /cdrom          cd9660  ro,noauto       0       0

# reboot    # 重開機後開機畫面會出現下面訊息

GEOM_MIRROR: Device gm0 created (id=2125638583).
GEOM_MIRROR: Device gm0: provider ad0 detected.
GEOM_MIRROR: Device gm0: provider ad0 activated.
GEOM_MIRROR: Device gm0: provider mirror/gm0 launched.
GEOM_MIRROR: Device gm0 already configured.
Mounting root from ufs:/dev/mirror/gm0s1a

# df      # 查看磁碟
Filesystem         1K-blocks   Used    Avail Capacity  Mounted on
/dev/mirror/gm0s1a  12057022 828486 10263976     7%    /
devfs                      1      1        0   100%    /dev

# swapinfo    # 查看 swap
Device          1K-blocks     Used    Avail Capacity
/dev/mirror/gm0s1b    262144        0   262144     0%

# gmirror list    # 查看所掛載的 gm0 硬碟
Geom name: gm0
State: COMPLETE
Components: 1
Balance: round-robin
Slice: 4096
Flags: NONE
GenID: 0
SyncID: 1
ID: 3657195055
Providers:
1. Name: mirror/gm0
   Mediasize: 13021242368 (12G)
   Sectorsize: 512
   Mode: r2w2e3
Consumers:
1. Name: ad0
   Mediasize: 13021242880 (12G)
   Sectorsize: 512
   Mode: r1w1e1
   State: ACTIVE
   Priority: 0
   Flags: NONE
   GenID: 0
   SyncID: 1
   ID: 3022142026

# gmirror status    # 查看 ad0 狀態
      Name    Status  Components
mirror/gm0  COMPLETE  ad0

Setp 2.

加入第二棵 HD 才算完成 RAID1 Mirror 特性資料同時寫入兩棵 HD ( ※ 注意:所新加入的 HD容量 一定要與原先的 HD 相同或比原先的大 )。

# gmirror insert gm0 /dev/ad1    # 插入 HD 的同時也會先進行同步,同時螢幕中所顯示下面開始同步運作的訊息

GEOM_MIRROR: Device gm0: provider ad1 detected.
GEOM_MIRROR: Device gm0: rebuilding provider ad1.

# gmirror list    # 看 Synchronized: 已經 6% 到 100% 就行,約等 10~30 幾分鐘即可同步完成
Geom name: gm0
State: DEGRADED
Components: 2
Balance: round-robin
Slice: 4096
Flags: NONE
GenID: 0
SyncID: 1
ID: 3657195055
Providers:
1. Name: mirror/gm0
   Mediasize: 13021242368 (12G)
   Sectorsize: 512
   Mode: r3w2e3
Consumers:
1. Name: ad0
   Mediasize: 13021242880 (12G)
   Sectorsize: 512
   Mode: r1w1e1
   State: ACTIVE
   Priority: 0
   Flags: DIRTY
   GenID: 0
   SyncID: 1
   ID: 3022142026
2. Name: ad1
   Mediasize: 15377080320 (14G)
   Sectorsize: 512
   Mode: r1w1e1
   State: SYNCHRONIZING
   Priority: 0
   Flags: DIRTY, SYNCHRONIZING
   GenID: 0
   SyncID: 1
   Synchronized: 6%
   ID: 3424160510

# gmirror status     # 看 status 也可以
      Name    Status  Components
mirror/gm0  DEGRADED  ad0
                      ad1 (19%)

完成同步後電腦螢幕丟出的訊息
GEOM_MIRROR: Device gm0: rebuilding provider ad2 finished.
GEOM_MIRROR: Device gm0: provider ad2 activated.

# reboot     # 重開機 dmesg 中會出現的訊息

GEOM_MIRROR: Device gm0 created (id=3657195055).
GEOM_MIRROR: Device gm0: provider ad0 detected.
GEOM_MIRROR: Device gm0: provider ad1 detected.
GEOM_MIRROR: Device gm0: provider ad1 activated.
GEOM_MIRROR: Device gm0: provider ad0 activated.
GEOM_MIRROR: Device gm0: provider mirror/gm0 launched.
Trying to mount root from ufs:/dev/mirror/gm0s1a

Setp 3.

進行 RAID1 的相關測試操作。

(1) 如何移除 mirror 中的某一個運作中的硬碟?

# gmirror remove gm0 ad0    # 移除 mirror 中某個實體裝置(eg. ad0)

# gmirror status   # 查看 gm0  只剩下 ad1 而且 Flags 會是設為 DIRTY
      Name    Status  Components
mirror/gm0  COMPLETE  ad1

# gmirror list    # 查看 gm0
Geom name: gm0
State: COMPLETE
Components: 1
Balance: round-robin
Slice: 4096
Flags: NONE
GenID: 0
SyncID: 1
ID: 3657195055
Providers:
1. Name: mirror/gm0
   Mediasize: 13021242368 (12G)
   Sectorsize: 512
   Mode: r2w2e3
Consumers:
1. Name: ad1
   Mediasize: 15377080320 (14G)
   Sectorsize: 512
   Mode: r1w1e1
   State: ACTIVE
   Priority: 0
   Flags: DIRTY
   GenID: 0
   SyncID: 1
   ID: 3424160510

# gmirror forget gm0    # 可用 forget 永久移除 mirror 中的這個實體裝置 ( 果不叫 gmirror forget gm0 的話,那 gm0 會覺得本來的 mirror 中少了一個東西,Flags 會變 DIRTY )

(2) 如果 mirror 中某一個硬碟壞掉了,怎麼辦?

# gmirror remove gm0 ad0    # 移除 mirror 壞掉的 ad0

# gmirror forget gm0   # 忽略 mirror 中之前存在,而現在不存在的裝置

# shutdown -h now      # 關機拔掉壞掉那棵 HD 假設壞掉的是 ad0 更換新的 HD 接著重開 gm0 就會使用 ad1 進入 OS 可看看是否正常運作

# shutdown -h now    # 再次關機接上新的硬碟

# gmirror insert gm0 /dev/ad0     # 重開後再 insert 新的硬碟

(3) 如何停止 gmirror 運作?

# vi /etc/fstab    # 
 fstab  改回原設定
# Device                Mountpoint      FStype  Options         Dump    Pass#
/dev/ad0s1b             none            swap    sw              0       0
/dev/ad0s1a             /               ufs     rw              1       1
#/dev/mirror/gm0s1b      none            swap    sw              0       0
#/dev/mirror/gm0s1a      /               ufs     rw              1       1
#/dev/acd0              /cdrom          cd9660  ro,noauto       0       0

# vi /boot/loader.conf  # 將 loader.conf  Mark 改回原設定
#geom_mirror_load=YES

# reboot   # 重開機就可恢復


( 二 ). FreeBSD Software RAID 0

操作 RAID 0 需要三顆 HD 原本的一顆為主 OS 其他兩顆來實做 RAID 0

# kldload geom_stripe.ko     # 載入 geom_stripe Kernel Module

# echo 'geom_stripe_load="YES"' >> /boot/loader.conf    # 開機自動載入 geom_stripe Kernel Module

# mkdir /smb    # 建立 smb 目錄給 st0 掛載

# gstripe label -v st0 /dev/ad1 /dev/ad2    # 有 warning 錯誤訊息因為我兩顆 HD 大小不一樣
warning: /dev/ad1: only 6400235008 bytes from 15377079808 bytes used.
Metadata value stored on /dev/ad1.
Metadata value stored on /dev/ad2.

# bsdlabel -wB /dev/stripe/st0

# cd /dev/stripe/    # 切換目錄

# ls    # 查看多了 st0a 及 st0c
st0     st0a    st0c

# newfs -U /dev/stripe/st0a
/dev/stripe/st0a: 12207.5MB (25000896 sectors) block size 16384, fragment size 2048
        using 67 cylinder groups of 183.77MB, 11761 blks, 23552 inodes.
        with soft updates
super-block backups (for fsck -b #) at:
 160, 376512, 752864, 1129216, 1505568, 1881920, 2258272, 2634624, 3010976, 3387328, 3763680,
 4140032, 4516384, 4892736, 5269088, 5645440, 6021792, 6398144, 6774496, 7150848, 7527200,
 7903552, 8279904, 8656256, 9032608, 9408960, 9785312, 10161664, 10538016, 10914368, 11290720,
 11667072, 12043424, 12419776, 12796128, 13172480, 13548832, 13925184, 14301536, 14677888,
 15054240, 15430592, 15806944, 16183296, 16559648, 16936000, 17312352, 17688704, 18065056,
 18441408, 18817760, 19194112, 19570464, 19946816, 20323168, 20699520, 21075872, 21452224,
 21828576, 22204928, 22581280, 22957632, 23333984, 23710336, 24086688, 24463040, 24839392

# mount /dev/stripe/st0a /smb   # 手動掛載

# echo "/dev/stripe/st0a   smb   ufs   rw   2    2" >> /etc/fstab   # 設定開機自動掛載

# df     # 查看所做的 RAID 0 檔案目錄
Filesystem       1K-blocks   Used    Avail Capacity  Mounted on
/dev/ad0s1a       12057022 828578 10263884     7%    /
devfs                    1      1        0   100%    /dev
/dev/stripe/st0a  12103726      4 11135424     0%    /smb

# time dd if=/dev/zero of=/smb/test.img bs=1M count=1024   # 測試寫入原本沒有做 RAID 0 時寫入 1G 的時間約 100 秒完成
1024+0 records in
1024+0 records out
1073741824 bytes transferred in 100.780976 secs (10654211 bytes/sec)
0.007u 14.575s 1:40.81 14.4%    20+2808k 34+8192io 1pf+0w

# time dd if=/dev/zero of=/smb/test.img bs=1M count=1024    # 有做 RAID 0 寫入 1G 的資料約花 82 秒完成,顯然 RAID 0 有加速到
1024+0 records in
1024+0 records out
1073741824 bytes transferred in 82.236301 secs (13056786 bytes/sec)
0.021u 14.280s 1:22.28 17.3%    22+3106k 26+8193io 1pf+0w

Reference:

http://www.onlamp.com/pub/a/bsd/2005/11/10/FreeBSD_Basics.html

http://origin2.pixnet.net/blog/post/1388953
http://www.freebsd.org/doc/zh_TW/books/handbook/geom-striping.html