如果你想實現一個Linux的軟件磁盤陣列(以下簡稱RAID或raid),那麼在開始前,下面的這個最重要的網點是你應該首先去涉獵的: LinasVepsta的raid主頁: http://linas.org/linux/raid.html 本文發表的時間是1998年10月29日,目前已有的文檔還不全,比較混亂.這篇文章
如果你想實現一個 Linux 的軟件磁盤陣列(以下簡稱 RAID 或 raid), 那麼在開始前, 下面的這個最重要的網點是你應該首先去涉獵的:
Linas Vepsta 的 raid 主頁: http://linas.org/linux/raid.html
本文發表的時間是 1998年10月29日, 目前已有的文檔還不全, 比較混亂. 這篇文章就是 澄清一些當你在實現 raid0 和 raid1 時會遇到的問題. (譯者注: raid0 -- 是指將數據散布在不同的硬盤上操作, 無冗余數據, 讀寫都可以並行操作, 速度快, 英文簡稱為 striping, 以下譯作"分散讀寫"; raid1 -- 是指磁盤鏡像, 英文為 mirroring.)
我想實現基於分散讀寫模式(striping)的鏡像模式(mirroring). 分散讀寫模式具備優異 的讀寫
性能, 而鏡像模式帶來備份和讀的性能增強.
我使用一個 2.0.30 的內核, 實現了 raid0(striping). 然後我將內核升級到 2.0.35, 這下笑話開始了. 在同 raid0 做了一番爭斗後(譯者注: 可能未成功), 我開始處理 raid1. 然後, 你猜怎樣, 扔掉你所知道所有的 raid
知識, 從打草稿開始! (因此)一個簡化工作 的好主意是, 首先使 raid0 能用, 之後增加 raid1. 故事是這樣的:
工作於內核 2.0.30 下的 Raid0 (striping)
從 2.x 版本開始, 內核已經實現了線性和 raid0(striping) 模式. 你必須重新編譯內核 以帶有多設備界面支持(multiple devices). 我強烈建議將它編譯到內核中. 如果你是 使用模塊方式, 你將會吃盡苦頭.
檢查是否多設備界面(multiple devices)已經安裝. dmesg |more 然後檢查是否 存在 md 驅動器(md driver)和 raid0 已經注冊(raid0 registered)的信息(想不起精確的 詞語 - "夜太深" ;-( )
或敲入 cat /proc/mdstat 查看你的 md 驅動器的狀態. 你應該看到 /dev/md0 到 /dev/md3 處於非激活狀態.
奇怪的是, 內核工具 mdtools-0.35 通常並不隨銷售包提供. 那裡面有建立, 運行和使 raid 停止的工具.
你在 Slackware 的銷售包中可以找到它( 大小為 23k )
http://sunsite.unc.edu/pub/Linux/distributions/slackware/slakware/ap1/md.tgz
下載到 /usr/local/src 然後:
cd /
tar -zxvf /usr/local/src/md.tgz
它將把文件放在正確的位置.
sbin/mdadd
sbin/mdcreate
usr/etc/mdtab
install/doinst.sh
usr/man/man5/mdtab.5.gz
usr/man/man8/mdadd.8.gz
usr/man/man8/mdcreate.8.gz
usr/doc/md/COPYING
usr/doc/md/ChangeLog
usr/doc/md/README
usr/doc/md/md_FAQ
通讀 README 文件(毫無疑問, 忽略警告們). 這份文檔極適合於內核版本 2.0.30 和 線性(linear)/raid0 模式. Linux 日報(Linux Journal)(1998年六月或七月刊)中有一篇精采的介紹怎樣實現 raid0(striping) 的文章. 它增強了我的興趣.
Linux 公報(LG) 中有另一篇文章, 也有所幫助:
http://www.ssc.com/lg/issue17/raid.html
你應該在 fsck -a 之前開始啟動 raid 陣列, 在 Slackware 中它(fsck)通常 位於 /etc/rc.d/rc.s 文件中, 而在 /etc/rc.d/rc.0 和 rc.6 中停止 raid 陣列. (BTW: 既然在 slackware 中這兩個文件相同, 我們能不能做一個軟聯結, 然後只需 修改一個?)
為了檢查它是否工作, 敲入 cat /proc/mdstat, 它(輸出的信息)將指示 md 設備的情況. (/dev/md0 raid0 using /dev/sda1 and /dev/sdb1).
測試, 測試, 再測試你的 raid. 關機, 上電, 看看它是否如你所願地工作.
我曾做過有趣的拷貝, 使用 cp -rap 開關將全部目錄結構拷入 raid 陣列中. (測試完成)然後修改 /etc/fstab 以包括新的驅動器(指 raid).
交換分區不需要分塊操作. 當一個優先級啟用時, 他們將自動這樣做. 閱讀 Software-RAID-mini-HOWTO 和傻瓜問題一段可知詳情. 這出乎意料地簡單.
現在使用 UPS!
如果(運行中)掉電了, 你將失去你的 raid 和上面的所有數據! 你應該使用一個 UPS 後備電源. UPS 的作用是讓你的系統在燈火管制或電源失敗時能夠保持運行一小段時間. UPS 能夠在電源失敗時通過一個串口通知你的系統. 在後台, 有一個精靈程序在運行監控這個串口. 當它被通知電源失敗時, 它將在發出關機命令前等待一段預定時間 (通常是 5 分鐘). 如此的工作原理是如果 5 分鐘內還是無電, 那麼將持續很長時間.
大多數 Linux 銷售包帶有基本的 UPS 電源精靈程序. 使用 "man powerd" 可以得到 更多信息. 這是一個簡單的精靈程序, 它在 /etc/inittab 中. 從根本上來說, 一個 啞 UPS, 只是在串口保持一個接力聯結. powerd 檢測這個聯結是否已經斷掉. 一旦 聯結斷掉, 它將在預定時間後將 PC 關閉. 警告用戶, 並且向 root 發一封郵件.
我使用一台 APC 智能 UPS, 它通過串口通訊. 有一個稱作 apcupsd 的卓越精靈如有 神助般地工作. 它在這兒. 請閱讀布告, 贊同作者, 他完成了一項優異工作 (作者的光榮!). 安裝工作如同魔法, 文檔也十分優秀.
http://www.dyer.vanderbilt.edu/server/apcupsd/
RAID0 基於 2.0.31 to 2.0.34
沒有嘗試過. 因為我直接從 2.0.30 升級到 2.0.35, 一個最新的穩定版本.
RAID0 基於核心版本 2.0.35
mdtools 在我家中的機器上編譯地很順利(運行 2.0.30), 但在我的工作機上不能編譯 (已經升級到 2.0.35). 我不斷地得到一個關於 MD_Version (記不住確切的名稱)沒有定義的錯誤. 經過大量撓頭的搜索, 我發現在 /usr/src/include/md.h 中有 md 驅動器 的版本號. 在版本 2.0.30 中, 它是 0.35; 而在 2.0.35 中它是 0.36. 如果你使用 "mdadd -V" 它將指示 mdadd 可以工作的 md 的版本號. 所以我取得了錯誤的 mdtools 版本. 這裡是正確版本的位置:
ftp://ftp.kernel.org/pub/linux/daemons/raid/raidtools-0.41.tar.gz
下載到 /usr/local/src 然後
tar -zxvf raidtools-0.41.tar.gz
將生成一個新目錄 /usr/local/src/raidtools-0.41
進入新目錄, 閱讀 INSTALL 文件, 然後
../configure
我記不清之後是否必須做 make 和 make install. 我不能復現 這一過程, 因為我已經為 raid 打了一個新補丁.
你應該有一個新的 mkraid 和 mdadd 的運行文件(binary). 敲入 mdadd -V 以 檢查是否你的運行碼已經更新了. 它應該顯示一些像 mdadd 0.3d compiled for raidtools-0.41的信息. 然後閱讀 QuickStart.RAID 獲得最新信息. 對於 raid0, 比以前版本沒有多少改變.
RAID1 基於內核 2.0.35
若想使用 raid1, 4 或 5, 你必須為內核打一個補丁, 它位於
ftp://ftp.kernel.org/pub/linux/daemons/raid/alpha/raid0145-19981005-c-2.0.35.tz
拷貝到 /usr/src directory, 將補丁解壓縮:
tar -zxvf raid0145-19981005-c-2.0.35.tz
注意補丁將搜索 /usr/src/linux-2.0.35 目錄. 如果你將 2.0.35 的源碼安裝在目錄 /usr/src/linux 下, 你需要mv /usr/src/linux /usr/src/linux-2.0.35, 然後做一個符號聯結 ln -s /usr/src/linux-2.0.35 /usr/src/linux
為了使用這個補丁, 進入目錄 /usr/src:
patch -p0 (在我的系統中有些地方小寫的 c 會變成大寫的 C 嗎? 也許在解壓後?)
你現在可以去重新編譯內核. 當你選擇多設備(選項)時, 你將看到有選擇 raid1,4和5. 依次步驟是
make menuconfig (or config or xconfig)
make clean
make dep
make zImage
make modules (如果你使用了模塊)
make modules_install
將新內核拷到你系統中適當的地方(/ 或 /boot). 我建議你同時擁有一個無 raid 的內核 和一個有 raid 的內核. 你能夠通過修改 lilo.conf 來確定使用那一個內核啟動. 這根本 不困難, 盡管初看起來有些恐怖. 查看 /usr/lib/lilo 的例子和文檔. (譯者注: 可能為 Slackware 中的目錄, Redhat5.1 中無)
查看 dmesg | more 的輸出內容確定 md 驅動器已經裝載, raid0 & 1 已經注冊. 敲入 cat /proc/mdstat 看看你是否有了新的 md 驅動器. 你應該看到 16個 md 驅動器而不是 4 個.
你將必須升級你的 raidtools. mdadd, /etc/mdtab 和 mdcreate 是舊的, 新工具應該是 raidstart, /etc/raidtab 和 mkraid. 從這一點上來說, (當前的)文檔的確是過時了.
ftp://ftp.kernel.org/pub/linux/daemons/raid/alpha/raidtools-19981005-B-0.90.tar.gz
下載到/usr/local/src 然後
tar -zxvf raidtools-19981005-B-0.90.tar.gz
這將產生一個新目錄 /usr/local/src/raidtools-0.90. 進入這個目錄作
../configure
又一次, 我記不起是否該接著做 make 和 make install.
一個較簡單的方式完成內核 2.0.35 下的 RAID0
使用兩個 scsi 設備 /dev/sda1 和 /dev/sdb1 完成一個 raid0 陣列的步驟:
將 /dev/sda1 和 /dev/sdb1 分區, 讓他們有相同的塊大小.
將分區的類型設為 0xfd. 這是用來讓新內核在啟動時自動識別 raid.
按下面例子修改 /etc/raidtab 文件(隨 raidtools 提供的例子缺少一些重要的信息):
# Striping example
# /dev/md0 using /dev/sda1 and /dev/sdb1
raiddev /dev/md0
raid-level 0
nr-raid-disks 2
persistent-superblocks 1
nr-spare-disks 0
chunk-size 32
device /dev/sda1
raid-disk 0
device /dev/sdb1
raid-disk 1
敲入 mkraid -f /dev/md0 一定注意 - 閱讀錯誤信息, 明確方向!
cat /proc/mdstat 檢查輸出信息, 確定 md 設備是否正確地做好.
使用 mke2fs -c /dev/md0 格式化新 raid 設備.
產生一個安裝目錄(例如 /raidtest)以測試它是否工作.
mount /dev/md0 /raidtest
看你是否能將一個文件拷貝到 /raidtest. 如果你的硬盤設備有各自獨立的 LED 燈 , 你能夠看到兩個設備都在工作.
重啟動, 檢查內核是否自動將 raid 設備 md0 關閉. 會有一些信息滾過屏幕. (有誰知道如何使用 "dmesg" 讀取關機信息?)
檢查重啟動過程中計算機是否自動識別 raid 設備和 /dev/md0 是否作為一個 raid0 陣列. 如果不是, 檢查前幾個步驟, 特別是步驟2和步驟4.
基於內核 2.0.35 RAID1 的新方式
使用兩個 raid0(striping)設備構造一個 raid1 陣列 /dev/md2 的步驟如下, 兩個 raid0 設備為 /dev/md0 (/dev/sda1 + /dev/sdb1) 和 /dev/md1 (/dev/sdc1 + /dev/sdd1):
按照上面(建立 raid0 的)步驟建立 /dev/md0 和 /dv/md1. 重要信息: 你不能安裝或者在 /dev/md0 和 /dev/md1 上建立文件系統. 這只是測試 raid0 是否工作!
按照下面例子修改 /etc/raidtab 文件(隨 raidtools 提供的例子缺少一些重要信息):
# Striping example
# /dev/md0 using /dev/sda1 and /dev/sdb1
raiddev /dev/md0
raid-level 0
nr-raid-disks 2
persistent-superblocks 1
nr-spare-disks 0
chunk-size 32
device /dev/sda1
raid-disk 0
device /dev/sdb1
raid-disk 1
# /dev/md1 using /dev/sdc1 and /dev/sdd1
raiddev /dev/md1
raid-level 0
nr-raid-disks 2
persistent-superblocks 1
nr-spare-disks 0
chunk-size 32
device /dev/sdc1
raid-disk 0
device /dev/sdd1
raid-disk 1
# Mirror example
# /dev/md2 using /dev/md0 and /dev/md1
raiddev /dev/md2
raid-level 1
nr-raid-disks 2
persistent-superblocks 1
nr-spare-disks 0
chunk-size 32
device /dev/md0
raid-disk 0
device /dev/md1
raid-disk 1
敲入 "mkraid -f /dev/md2" 重要信息 - 閱讀錯誤信息, 明確方向! 這一步 要化一段時間, 因為磁盤要進行同步(超過 39 分鐘).
cat /proc/mdstat 查看是否 md 設備正確地完成.
使用 mke2fs -c /dev/md2 格式化新 raid 設備
產生安裝目錄(例如 /raidtest_mirror)
mount /dev/md0 /raidtest
看你是否能夠將文件拷到 /raidtest 中. 如果你的硬盤有各自獨立的 LED 燈, 你可以發現它們在同時工作.
加 raidstart /dev/md2 到你的 /etc/rc.d/rc.s 文件中, 注意在 fsck -a 之前. 一個好位置是正在 swapon -a 之後. 目前, 內核不能自動識別 raid1. 下一個補丁將完成它(自動識別).
修改 /etc/fstab 將 /dev/md2 安裝到 /raidtest.
/dev/md2 /raidtest ext2 defaults 1 1
重啟動, 看內核是否自動關閉設備 md0, md1 和 md2. 會有一些信息滾過屏幕. (有誰知道如何使用 "dmesg" 查看關機信息?)
檢查在重啟動過程中內核是否自動識別出 raid 設備 /dev/md0 和 /dev/md1 全部啟動作為 raid0 陣列. 檢查 /dev/md2 設備是否為一個 raid1 陣列.
cat /proc/mdstat 查看是否 md 設備正確建立.
你應該有 基於 raid0 的 raid1 陣列在運行.
如果你遇到問題, 這裡有一些其他資源可以參考:
linux raid 檔案: http://www.linuxhq.com/lnxlists/linux-raid/
發一條
新聞到 comp.os.linux.setup
搜索 www.dejanews.com - 過去 5 年來新聞組消息的歸檔站點.
如果你完全不知如何是好了, 向 Linux RAID 郵件列表發 e-mail. 詢問問題, e-mail
[email protected] 參加內核 RAID 列表, e-mail
[email protected] 在信體中寫 subscribe linux-raid
不要 e-mail 給我, 所有我所知道的都已經寫在這兒了!