歡迎您光臨本站 註冊首頁

Linux 下的軟 Raid(0~5): MD Device

←手機掃碼閱讀     火星人 @ 2014-03-24 , reply:0

什麽是 MD ?
_________________________________________________________________

MD 就是指 Multiple Devices,意思是把一些不 在同一顆 HD 上的 partitions
集合在一起,變成一個大的合體,原理很像我 們常聽說的 RAID,但這個 (md)
是由 kernel 去做 (一般常見而言,RAID 是由 Controller 自行處理,如 DPT
SmartRAID 系列,或 IFT-3000 等高階 Controller),所以在效能上自然輸了不
少。但它的好處是,用 linear 或 RAID 0 時,可以混用 IDE 及 SCSI HD 上的
partitions。
_________________________________________________________________

如何使用 MD ?

Step 1: 準備工作
* 把你的 kernel 改為大於 1.3.69 的版本, compile 支援 MD 吧.
* 去抓 md035.tar.gz, 這是做 md volumn group 的程式.
* 把上面講的東西 compile 好並 install 完成; 在 make install 時會同時
幫你把 /dev/md0 ~ /dev/md3 做好, 這點不必麻煩自己手動跑 mknod 了.
* 在 /etc/rc.d/rc.S 的開頭中加入一行:
/sbin/mdadd -ar
它要比 swapon 等和 filesystem 有關者更早執行的, 因為也許你的 swap
或 /usr 就是建在某個 md device 上. 但它必需在 kerneld 之後執行 ( 如
果你有用到 kerneld + modules 的話)

Step 2: 開始了
* 考慮一下你要把哪些 partitions 兜在一起,而且要了解一件事: 把同一顆
HD 上的 partitions 搞在一起,反而會變慢而且又操硬碟!
* 好, 例如我打算把 /dev/sda1, /dev/sdb1, /dev/sdc1 做成一個
/dev/md0, 參數我們選 RAID0,chuck size 是 8Kbytes, 那就執行:
mdcreate -c8k raid0 /dev/md0 /dev/sda1 /dev/sdb1 /dev/sdc1
如此就完成了 /etc/mdtab 中的設定 (並計算出一個 crc32 的檢查碼).
注意! 那個 /dev/sda1 /dev/sdb1..... 的順序很重要,將來可以照此順序
重建 (如果你的 HD 順序變了,例如中間多加了一顆 HD......)
/etc/mdtab 而不必 重建其內容。至於那個 -c8k 的參數 (chuck
size=8kbytes) 請參考 md 內附的說明文件。這個參數是 pagesize (在
x86 上應都是 4k) 乘 上 2 的 N 次方 (例如 0,1,2,4,8),所以應為
4k、8k、16k、32k...... 等值中選一個來用,我不多講了,請自己用功一
點......
* 再來我們 cat 一下 /proc/mdstat 看看,如果還沒跑 mdadd -ar 的話,應
該 看到這樣:

Personalities : [1 linear] [2 raid0]
read_ahead not set
md0 : inactive
md1 : inactive
md2 : inactive
md3 : inactive

因為你尚未 reboot 過,所以 mdcreate 完後, 也尚未跑 /etc/rc.d/rc.S
去 執行那個 mdadd -ar。 OK,那就手動執行一下 mdadd -ar 吧,然後再
cat 一次 /proc/mdstat 看看,應該是像這樣的:

Personalities : [1 linear] [2 raid0]
read_ahead xxx sectors
md0 : active raid0 sda1 sdb1 sdc1 xxxxxx blocks 8k chunks
md1 : inactive
md2 : inactive
md3 : inactive

其中那些 xxxxx 是我這兒的數字,也許您的就不同了 (那個 read_ahead 不
一定 有值,也許還是 not set 而已)
* 至此,您已經可以使用 /dev/md0 來玩了。例如要準備當 swap,那就執行
mkswap /dev/md0。或許您要當 ext2 fs,那就執行 mke2fs /dev/md0。 再
來就看您的用途羅......
* 尚有 mdstop、mdrun 那些程式,請自行研究好嗎?

Step 3: 測試報告
* 我已經在兩顆很爛又很舊的 IBM 330MB 老 HD 上 (它的速度只有 3600rpm,
internal transfer rate 約 1.x MB/s,而且 SCSI bus 的速度會變成
5MB/s) ,做了一個 100MB 的 swap 在 /dev/md0 上,及一個 512MB 的
ext2 fs 在 /dev/md1 上,準備要 mount 在 /usr 上使用 (很冒險吧?)。
於是, 我先 mount -t ext2 /dev/md1 /mnt 後, 把所有的 /usr/* 拷貝到
/mnt 下,再清空 /usr/* (或是 先 mv /usr /usr1 再 mkdir 一個空的
/usr 子目錄)。然後改一下 /etc/fstab 加入:

/dev/md0 swap swap default 1 1
/dev/md1 /usr ext2 default 1 1

然後 reboot 我的機器 (因為很多 daemon 都用了舊的 /usr/sbin/ 中的東
西)
* 嗯,在 reboot 中,我看到它真的在 e2fsck /dev/md1 唷,而且成功地
mount 在 /usr 下,而且 swap 也加入了。這時我看了看 /proc/mdstat:

Personalities : [1 linear] [2 raid0]
read_ahead 120 sectors
md0 : active raid0 sdb1 sdc1 100320 blocks 4k chunks
md1 : active raid0 sdb2 sdc2 524288 blocks 8k chunks
md2 : inactive
md3 : inactive

看起來不錯的樣子,也沒問題。
* 再來就是玩 compile kernel 看看羅。在 /usr/src/linux 我花了一些 時間
make xxxxx, 覺得這個速度不輸給比它快了兩倍多的 Quantum Lightning 系
列耶。
* 開 X-window 也跑得很順。
* swap 我也在觀察, 也很順。
* 再來,我搞了一招狠招:

# cd /usr
# find -type f -name "*" -exec cat {} > /dev/null \;

意思是把所有的 /usr 下的檔案都 cat 到 /dev/null 去,狠狠地 操這個
/dev/md1。 結果很不錯, 220MB 的資料在 14 分鐘內就解決了。
不過,我碰到了個問題。因為其中有一顆 HD 不太穩,在爾後我一直跑這個
操死硬碟的指令時,就一直卡在某個有問題的 (讀不出來) 的檔案上。於是
在砍掉那些檔案後,就十分順利了。我會再驗證這個問題的。
* 好,最後我發現一件事;就是如果是把東西拷入 md 的 volumn 的話,是沒
有問題,而且也讀得很正常。一但在其上開始工作 (例如 compile
something) 的話,之後就無法把一些新增的檔案拷至其他 filesystem,cp
指令 (或是 cat,或是其他讀它的指令都會) 將『死得很難看』變成 dead
process。 這是我後來使用『完全正常』的兩顆 540MB 的硬碟測試之後的結
論。 而且,如果使用 (例) mke2fs -c /dev/md1 的話,在 test 完後會出
現一個 'Unknown md_iotcl 11' 的訊息。顯然這個 md-0.34 版有待改進。

無論如何,這個 md 的美意,大家都很欣賞吧?所以我花了功夫寫下使用過程、
心得及建議。當然,我現在不鼓勵大家使用它,原因 (或說現象吧) 你也看得 很
清楚了 (如果我寫得不算亂的話),總之就是大家再觀察一陣子,相信好的東 西
及概念將會早日帶給大家更便利的功能的。

[火星人 ] Linux 下的軟 Raid(0~5): MD Device已經有410次圍觀

http://coctec.com/docs/linux/show-post-132347.html