最後修
改日期:
2008/11/6
FreeBSD
Software RAID GEOM
當沒有錢購買硬體
RAID Card 時也可使用 FreeBSD 中的 Software RAID,在使用上還蠻容易操作的可以達到 Raid 0、Raid 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