今天想要把新裝好的 FreeBSD 6.1-RELEASE 上面的 ftp 硬碟弄個 software RAID1 ,
根據慣例,本來是想用 vinum 做的,
不過沒想到在 FreeBSD 5 之後因為磁碟存取改成用 GEOM(4) 的方法,
所以 vinum 也相應改寫成 gvinum ,除了名字前面多了一個 g 之外基本上沒有其他的改變。

ok ,既然沒有其他的改變那就照著舊方法做吧...

然後,問題就發生了...

首先是要切 partition 的時候 sysinstall 的 fdisk 一直跟我靠盃說 disk geometry 有問題,
谷歌了一下發現大概是要把 BIOS 裡面的存取模式設定成 LBA 才行。
不過這好像怪怪的?
因為如果我沒記錯現在的 BIOS 都會自動使用 LBA mode 存取大容量 IDE 硬碟...
總之,進了 BIOS ,看了一下 BIOS 抓到的硬碟資訊...
怪怪,還真不是 LBA mode 的 255 Head/63 Sectors ?!
把存取模式由 Auto 改為 LBA 之後顯示的就是正確的 255 Head/63 Sectors 了,
於是又回到 sysinstall 的 fdisk ,
結果它還是跟我靠盃說 disk geometry 有問題 =_____________="

想想可能是 BIOS 有問題,但是這張板子是奇妙的 Acer 桌上型電腦拆下來的,
Acer-TW 網站上已經完全沒有資料了,自然也找不到新版 BIOS ...
所以就直接放棄,不管 fdisk 的靠盃,
硬是把原本的 ntfs partition 改成 freebsd 之後存入,
然後用 disklabel 修改一下 partition table 看起來四夫也沒問題...
(...這是說之前靠盃都是靠盃假的嗎? orz)

總之,解決了這個問題之後,
就是寫 vinum config file 然後丟給 gvinum 吃啦,
因為不是 root partiiton 所以設定很簡單,
只要兩個一樣的 plex 然後有一樣大的 sd 就好了,
問題在 sd 的參數 length 的地方,這個地方據說可以用 G, M, K 當單位,
但是因為換算誤差的關係,如果用 G, M, K 指定大小的話就會有一些剩餘的空間沒用到,
如果能用 blocks 當單位的話就不會有這個問題,
不過找了半天沒找到 length 這個參數的語法...
所以就死馬當活馬醫,硬上了 length 39716802 ...

#gvinum create /etc/gvinum.conf

嗯,看起來是沒問題,
但是仔細一瞧 gvinum 建立起來的 volume ...

ㄟ,大小怎麼只有 391MB ?!

看起來如果不給單位的話是當成 bytes 的樣子...
那就只好重新來過了,於是就進了 gvinum 想要把設定砍掉,
結果這一版本的 gvinum 不支援毀滅大絕招 resetconfig ,
只能手動用 rm -r volume 砍 volume ,然後手動把 drive 給砍掉。
結果就在我砍了 ad1 ,剛下完幹掉 ad0 的指令的時候,
kernel panic 了......................

然後重開機看看, ad0 是砍掉了,
但是再試一次還是一樣會 kernel panic ,
上谷歌找找,沒發現確切的原因跟解法,
不過卻看到有人在 mailing list 裡面推薦一個叫 gmirror 的東西,
四夫也可以拿來做 software RAID...

原來這是在 FreeBSD 改用 GEOM(4) 之後跑出來的新玩意兒,
利用 GEOM(4) 的特性進行的新 software RAID 方案,
Handbook 裡面的說明頁在這裡
然後 Ralf S. Engelschall 也寫了一篇 tutorial: FreeBSD System Disk Mirroring -How to establish a RAID-1 for the system partitions
O'Reilly 的 ONLamp.com 也有一篇詳細的「如何把 FreeBSD 安裝到 GEOM 的 software RAID 1 partition 上」的指南。

不過我因為不是要在 root 上面做 mirroring ,
所以作法比上面簡單很多...

步驟如下:

1. 將 /dev/ad1 加入名為 gm0 的 GEOM_MIRROR device ,並建立此新的 gm0 device
#gmirror label -vnb round-robin gm0 /dev/ad1

2. 載入 geom_mirror kld
#gmirror load

3. 將整個 gm0 都切成 freebsd slice
#fdisk -vI /dev/mirror/gm0

4. 在 gm0s1 上安裝標準的 disklabel
#disklable -w /dev/mirror/gm0s1

5. 在剛建立的 partition gm0s1a 上面建立新的 file system
#newfs -U /dev/mirror/gm0s1a

到這邊為止基本上 gm0 就已經就緒可以使用了,
接下來就是把第二顆硬碟加入 mirror 的行列:

6. 開啟 gm0 自動同步功能,就是指 auto rebuild 。新建的 partition 就是指 auto initialize 囉。
#gmirror configure -a gm0

7. 把第二顆硬碟 /dev/ad0 加入 gm0
#gmirror insert gm0 /dev/ad0

這樣就大功告成了!
用 #gmirror list 可以看到目前的 configuration ,
然後可以看到現在 ad0 的狀態是 synchronizing ,
等同步完成就可以正常使用 software RAID 1 了!

如果要把資料倒到別的地方,
或從別的地方倒過來的話,
就這樣下 dump(8) & restore(8)
#dump -L -0 -f- /source | (cd /destination && restore -r -v -f-)



UPDATE: 2006/12/17

如果 mirror 中某一個硬碟壞掉了,
然後要更換的話步驟如下:

1. 把壞掉的硬碟拆掉,換上好的硬碟。新硬碟的大小不可以小於 mirror 的大小。

2. 命令 gmirror 忽略 gm0 中沒有連線的實體裝置
#gmirror forget gm0

3. 將新的硬碟(eg. ad0)重新加入 gm0
#gmirror insert gm0 /dev/ad0

註:如果沒有先下 gmirror forget 指令的話,
gmirror 會因為「 gm0 中已經有一個叫 ad0 的裝置」所以拒絕 insert ad0 的指令,
顯示 "Not all disks connected." 的錯誤訊息。



UPDATE: 2007/1/17

如果要移除 mirror 中的某一個運作中的硬碟,
步驟如下:

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

如果要永久移除 mirror 中的這個實體裝置,則需要再下下列指令:

2. 命令 gmirror 忽略 mirror 中之前存在,但是現在不存在的裝置
#gmirror forget gm0

註:如果不叫 gmirror forget gm0 的話,
那 gm0 會覺得本來的 mirror 中少了一個東西,
便會把這個 mirror mark 成 DEGRADED 。



UPDATE: 2007.1.18.

如果要永遠取消某個 mirror 的話,步驟如下:

1. 停止 mirror 運作
#gmirror stop -v gm0

2. 清實體硬碟上的 gmirror meta data (meta data 存在硬碟的最後一個 sector)
#gmirror clear -v ad0 ad1

這樣就會消除該 mirror 的設定,但是原本在 mirror 上的資料並不會被消除,還是會存在於 ad0s1a 跟 ad1s1a 上面。
創作者介紹

囈語二三,,

origin2 發表在 痞客邦 PIXNET 留言(4) 人氣()


留言列表 (4)

發表留言
  • alancloud
  • 學長搬家搬的好啊!!
  • origin2
  • 你在這一篇回這一句害的我都不知道該說什麼才好了...
  • alancloud
  • 真是不好意思...orz
  • origin2
  • alancloud:

    你又特地來回說不好意思讓我更不知道該說什麼才好了...XD

    ver:

    為了證明你不是亂發廣告留言,能不能請你說一下我的 blog 到底哪裡有特色呢?有什麼特色呢?
找更多相關文章與討論