最近硬碟掛了不少顆, 決定新電腦先做 Raid 1 後再上, 至少可以降低一些資料的損失風險.
主要參考此篇文章: How To Set Up Software RAID1 On A Running System (Incl. GRUB Configuration) (Debian Etch) - 此篇非常完整, 直接參考此篇即可安裝完成
只要照這篇文章做, 就可以完成, 所以在這邊只簡單紀錄步驟, 詳細的可回原文去看.
- 註1: Raid 1 需準備兩顆硬碟. (sda, sdb)
- 註2: 此篇文章的操作, 建議都直接轉換成 root 來執行.
RAID 1 設定步驟
- 安裝 mdadm、initramfs-tools
- 同步 sda、sdb 磁碟分割
- 建立 RAID Array(md0, md1...)
- 格式化 md0, md1 ...
- Mount 檔案系統(md0, md1...)
- 將 sda 資料 cp 到 sdb (md0, md1...)
- 使用 sdb 開機
- 將 sda 加入 md0, md1.. 並同步.
- 取消由 sdb 開機的選項
- 測試
硬體資訊
1T 的硬碟(sda), 做下述的切割: (1T 的 sdb 完全不動)
$ fdisk -l /dev/sda
/dev/sda1 * 1 24 192748+ 83 Linux /dev/sda2 25 7319 58597087+ 83 Linux /dev/sda3 7320 12182 39062047+ 83 Linux /dev/sda4 12183 121601 878908117+ 5 Extended /dev/sda5 12183 121479 877928121 83 Linux /dev/sda6 121480 121601 979933+ 82 Linux swap / Solaris
$ df -h
/dev/sda5 825G 730M 782G 1% / /dev/sda1 183M 23M 151M 13% /boot /dev/sda2 56G 180M 53G 1% /home /dev/sda3 37G 508M 35G 2% /var
安裝 mdadm、initramfs-tools
- $ apt-get install mdadm initramfs-tools
- $ reboot
同步 sda、sdb 磁碟分割
- $ cat /proc/mdstat # 看目前有哪些磁區是建置 RAID 環境的
- $ sfdisk -d /dev/sda | sfdisk /dev/sdb # 將 sda 的磁碟分割表 複製 給 sdb
- $ fdisk -l # sda, sdb 就都長一樣了
修改 sdb 的檔案系統格式
- $ fdisk /dev/sdb # 修改 fdisk file system type
t 1 # 1 ... n (這邊是 1 ~ 6, 分別跑 6次, 失敗的不要理它)(有幾個就分別輸入幾次) fd # file system type = Linux raid autodetect w
- $ fdisk -l /dev/sdb
/dev/sdb1 * 1 24 192748+ fd Linux raid autodetect /dev/sdb2 25 7319 58597087+ fd Linux raid autodetect /dev/sdb3 7320 12182 39062047+ fd Linux raid autodetect /dev/sdb4 12183 121601 878908117+ 5 Extended /dev/sdb5 12183 121479 877928121 fd Linux raid autodetect /dev/sdb6 121480 121601 979933+ fd Linux raid autodetect
清除 RAID 的 superblock
- $ mdadm --zero-superblock /dev/sdb1 # 有錯誤也不用管它
- $ mdadm --zero-superblock /dev/sdb2
- $ mdadm --zero-superblock /dev/sdb3
- $ mdadm --zero-superblock /dev/sdb4
- $ mdadm --zero-superblock /dev/sdb5
- $ mdadm --zero-superblock /dev/sdb6
建立 RAID Array(md0, md1...)
- $ mdadm --create /dev/md0 --level=1 --raid-disks=2 missing /dev/sdb1
- $ mdadm --create /dev/md1 --level=1 --raid-disks=2 missing /dev/sdb2
- $ mdadm --create /dev/md2 --level=1 --raid-disks=2 missing /dev/sdb3
- $ mdadm --create /dev/md3 --level=1 --raid-disks=2 missing /dev/sdb5
- $ mdadm --create /dev/md4 --level=1 --raid-disks=2 missing /dev/sdb6
- # 參數說明
- # missing: 忽略, /dev/sda 上面有系統, 若不使用 missing, 則原有的系統會被重建, 造成系統損毀.
- # --create: 建立 RAID 的選項
- # --raid-devices=N: 使用幾個磁碟 (partition) 作為磁碟陣列的裝置
- # --level=[015]: 設定這組磁碟陣列的等級, 支援很多, 不過建議只要用 0, 1, 5 即可
- # --detail: 後面接的磁碟陣列裝置的詳細資訊
- $ cat /proc/mdstat
md4 : active raid1 sda6[0] sdb6[1] 979840 blocks [2/1] [_U] md3 : active raid1 sda5[2] sdb5[1] 877928000 blocks [2/1] [_U] md2 : active raid1 sda3[0] sdb3[1] 39061952 blocks [2/1] [_U] md1 : active raid1 sda2[0] sdb2[1] 58596992 blocks [2/1] [_U] md0 : active raid1 sda1[0] sdb1[1] 192640 blocks [2/1] [_U]
格式化 md0, md1 ...
- $ mkfs.ext3 /dev/md0
- $ mkfs.ext3 /dev/md1
- $ mkfs.ext3 /dev/md2
- $ mkfs.ext3 /dev/md3
- $ mkswap /dev/md4
備份 mdadm.conf
- $ cp /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf_orig
- $ mdadm --examine --scan >> /etc/mdadm/mdadm.conf # 將目前 RAID 資料寫入 conf 檔
Mount 檔案系統(md0, md1...)
- $ mkdir /mnt/md0 /mnt/md1 /mnt/md2 /mnt/md3
- $ mount /dev/md0 /mnt/md0
- $ mount /dev/md1 /mnt/md1
- $ mount /dev/md2 /mnt/md2
- $ mount /dev/md3 /mnt/md3
- $ vi /etc/fstab # 將 /dev/sdb1 修改成 /dev/md0, 如下述:
/dev/md3 / ext3 errors=remount-ro 0 1 /dev/md0 /boot ext3 defaults 0 2 /dev/md1 /home ext3 defaults 0 2 /dev/md2 /var ext3 defaults 0 2 /dev/md4 none swap sw 0 0
使用 sdb 開機
- $ vi /boot/grub/menu.lst # 於 default 0 後面加入一行 fallback 1, 如下述:
default 0 fallback 1
- $ vi /boot/grub/menu.lst # 增加 RAID 開機選項, 將原本 /dev/sda5(根目錄), 改成對應的 /dev/md3
title Debian GNU/Linux, kernel 2.6.26-2-amd64 RAID root (hd0,0) kernel /vmlinuz-2.6.26-2-amd64 root=/dev/md3 ro quiet initrd /initrd.img-2.6.26-2-amd64
- $ update-initramfs -u # 重新建立 initrd.img
- $ grub # 設定 Grub 使用 sdb 開機
- root (hd0,0)
- setup (hd0)
- root (hd1,0)
- setup (hd1)
- $ quit
將 sda 資料 cp 到 sdb (md0, md1...)
- $ cp -dpRx / /mnt/md2
- $ cd /boot; cp -dpRx . /mnt/md3
- $ cd /home; cp -dpRx . /mnt/md1
- $ cd /var; cp -dpRx . /mnt/md2
- $ reboot
將 sda 加入 md0, md1.. 並同步.
- $ df -h # 確定重開機後, 由 md0, md1... 開機.
/dev/md3 825G 730M 782G 1% / /dev/md0 183M 24M 150M 14% /boot /dev/md1 56G 180M 53G 1% /home /dev/md2 37G 508M 35G 2% /var
- $ cat /proc/mdstat # 應該會看到跟 md0, md1 ... md4
- $ fdisk /dev/sda # 修改 sda 檔案系統格式
t 1 # 1 ... n (這邊是 1 ~ 6, 分別跑 6次, 失敗的不要理它)(有幾個就分別輸入幾次) fd # file system type = Linux raid autodetect w
- $ fdisk -l /dev/sdb
/dev/sda1 * 1 24 192748+ fd Linux raid autodetect /dev/sda2 25 7319 58597087+ fd Linux raid autodetect /dev/sda3 7320 12182 39062047+ fd Linux raid autodetect /dev/sda4 12183 121601 878908117+ 5 Extended /dev/sda5 12183 121479 877928121 fd Linux raid autodetect /dev/sda6 121480 121601 979933+ fd Linux raid autodetect
將 sda 加入 md0, md1 ..
- $ mdadm --add /dev/md0 /dev/sda1
- $ mdadm --add /dev/md1 /dev/sda2
- $ mdadm --add /dev/md2 /dev/sda3
- $ mdadm --add /dev/md3 /dev/sda5
- $ mdadm --add /dev/md4 /dev/sda6
加入完成後, 會自動開始同步
- $ cat /proc/mdstat
md4 : active raid1 sda6[0] sdb6[1] 979840 blocks [2/2] [UU] md3 : active raid1 sda5[2] sdb5[1] 877928000 blocks [2/1] [_U] [======>..............] recovery = 33.9% (298143360/877928000) finish=150.9min speed=64022K/sec md2 : active raid1 sda3[0] sdb3[1] 39061952 blocks [2/2] [UU] md1 : active raid1 sda2[0] sdb2[1] 58596992 blocks [2/2] [UU] md0 : active raid1 sda1[0] sdb1[1] 192640 blocks [2/2] [UU]
- $ watch cat /proc/mdstat # 使用 watch 監控是否 sync 完畢
設定 mdadm.conf
- 此要等上個步驟 sync 完畢後做.
- $ cp /etc/mdadm/mdadm.conf_orig /etc/mdadm/mdadm.conf
- $ mdadm --examine --scan >> /etc/mdadm/mdadm.conf
取消預設 sdb 開機的選項 並 增加 RAID 開機選項
- $ vi /boot/grub/menu.lst # 增加下述, 並將 /dev/sda5 的開機選項 都註解掉.
title Debian GNU/Linux, kernel 2.6.26-2-amd64 RAID (sda) root (hd0,0) kernel /vmlinuz-2.6.26-2-amd64 root=/dev/md3 ro quiet initrd /initrd.img-2.6.26-2-amd64 title Debian GNU/Linux, kernel 2.6.26-2-amd64 RAID (sdb) root (hd1,0) kernel /vmlinuz-2.6.26-2-amd64 root=/dev/md3 ro quiet initrd /initrd.img-2.6.26-2-amd64
- $ update-initramfs -u
- $ reboot
測試
移除 sdb
- $ mdadm --manage /dev/md0 --fail /dev/sdb1
- $ mdadm --manage /dev/md1 --fail /dev/sdb2
- $ mdadm --manage /dev/md2 --fail /dev/sdb3
- $ mdadm --manage /dev/md3 --fail /dev/sdb5
- $ mdadm --manage /dev/md4 --fail /dev/sdb6
- $ mdadm --manage /dev/md0 --remove /dev/sdb1
- $ mdadm --manage /dev/md1 --remove /dev/sdb2
- $ mdadm --manage /dev/md2 --remove /dev/sdb3
- $ mdadm --manage /dev/md3 --remove /dev/sdb5
- $ mdadm --manage /dev/md4 --remove /dev/sdb6
- $ shutdown -h now # 將硬碟拔除重開, 然後換上新硬碟
將新的 sdb 同步 RAID 1
- $ cat /proc/mdstat # 會看到只有一顆硬碟的狀況.
- $ sfdisk -d /dev/sda | sfdisk /dev/sdb # 或 sfdisk -d /dev/sda | sfdisk --force /dev/sdb
- $ mdadm --zero-superblock /dev/sdb1
- $ mdadm --zero-superblock /dev/sdb2
- $ mdadm --zero-superblock /dev/sdb3
- $ mdadm --zero-superblock /dev/sdb4
- $ mdadm --zero-superblock /dev/sdb5
- $ mdadm --zero-superblock /dev/sdb6
- # 增加並同步
- $ mdadm -a /dev/md0 /dev/sdb1
- $ mdadm -a /dev/md1 /dev/sdb2
- $ mdadm -a /dev/md2 /dev/sdb3
- $ mdadm -a /dev/md3 /dev/sdb5
- $ mdadm -a /dev/md4 /dev/sdb6
- $ cat /proc/mdstat # 就會看到開始同步了.
同步完成後更新 Grub 開機
- $ grub
- root (hd0,0)
- setup (hd0)
- root (hd1,0)
- setup (hd1)
- $ quit
完整移除 mdadm (RAID)
設定完成後, 新系統安裝也都會把之前的設定帶進去, 反而造成之後設定的麻煩, 所以要清空, 就拿片 Ubuntu 開機光碟, 然後 fdisk /dev/sda, fdisk /dev/sdb, 把所有的磁區全部砍掉, 這樣子之後安裝就不會有 RAID 的設定出現囉~ 🙂
升級 Kernel 後, 未更新 /boot/grub 的 開機光碟急救
升級完 kernel 若沒有修改 /boot/grub/menu.lst, 使用 Ubuntu 光碟急救修復.
- mount -t ext3 /dev/sda1 /media/ # ext3 這些就看自己用哪個格式, raid 的系統 ubuntu 開機光碟無法辨認.(cat /etc/fstab)
- 去找 /media/grub/menu.lst~ 或 之前的備份, 主要是把 uuid 改成 root(hd0,0), 再看看有沒有什麼是要修改的.
升級 Kernel 後, 未更新 /boot/grub 的 開機修改急救
若不使用 開機光碟急救, 於開機選單按 e, 之後將 uuid 那行改成 root(hd0,0) 即可, 其它再自行參照下面的修改.
title Debian GNU/Linux, kernel 2.6.26-2-amd64 RAID (sda) root (hd0,0) kernel /vmlinuz-2.6.26-2-amd64 root=/dev/md3 ro quiet initrd /initrd.img-2.6.26-2-amd64
相關網頁
- Linux Software RAID 1 實作 - 推薦此篇要看
- RAID 1~6 的說明 - 若不了解 RAID, 推薦看此篇
- 高階儲存技術 - RAID 說明, RAID 0, 1, 5 各有哪些優缺點等等.
- 鳥哥的 Linux 私房菜 -- Quota, Software RAID, LVM, iSCSI
- williewu / SoftRaid
- Migrating To RAID1 Mirror on Sarge
- Debian 設定檔範例: /usr/share/doc/mdadm/examples/mdadm.conf-example
- dmraid 介紹:Linux 上應用 ATA / SATA RAID 技術
- The Software-RAID HOWTO
- mdadm delete linux raid - 移除 mdadm 的一個磁區
- mdadm --manage /dev/mdfoo --fail /dev/sdfoo
- mdadm --manage /dev/mdfoo --remove /dev/sdfoo
- mdadm --manage --stop /dev/mdfoo
- Installing Debian - Juerd's site
- Raid - Transwiki
- RAID and LVM on Amazon EC2 (part I)
- Linux Software Raid 系統轉移
請問我在ubuntu的系統裡面找不到boot/grub/menu.ls 這一個設定檔,grub是空的資料夾的說
路徑應該在 /boot/grub/menu.lst 這邊, 一定會有耶.
您可以 cat /etc/fstab, 看一下 boot 有沒有 mount 到其它地方去, 可能是沒有掛載進來, 所以是空的.
我剛去查了別的版本,我知道那裡有問題了,我目前就是9.04居然沒有那一個檔,但是8.04卻有這一個文件檔......瞎了!!!!!!
這個檔案不在, 應該開不了機耶. XD
如果我先fdisk -l 先出現 /dev/sda(1,2,3) /dev/sdb(1,2,3) 1,2,3是分割區
再mdadm --create --verbose --auto=yes /dev/md0 --level=1 --raid-devices=2 /dev/sdb /dev/sda
這樣ok嗎?^^....感謝大大
你可以從第二步驟開始做, 就是 sda 不用動, 只要將 sdb 切的跟 sda 一樣, 然後繼續跑之後的步驟就可以囉~ 🙂
我先fdisk -l 出先/dev/sdb是主碟 /dev/sda是新加入碟
我用sudo mdadm --create --verbose /dev/md0 --level=1 --raid-devices=2 /dev/sdb /dev/sda
結果出現Device or resource busy
請問該怎辦呢?..是要加missing參數嗎??要怎加呢???
Mmm... 你可以直接看此篇文章講的做, 我現在也沒這種環境測試, 沒辦法跟你說. 🙁
如果你有某一顆硬碟是系統碟...要加一顆硬碟做raid1
您確定這是可行的嗎?鳥哥討論區有人跟我說只能空白碟才能....不能用系統碟做...我是ubuntu8.04 TLS.感謝大大您的指教....^^
第二顆硬碟必須是空的硬碟(因為要切的跟主硬碟一致).
系統碟如果是空的, 那你這 RAID 是要從哪邊開始 build 起來?
我重灌ubuntu 用9.0 裝了raid1....用了兩棵哈滴.......他這個是如果一棵哈滴壞了...就會自動接上另一顆嗎??那如果拔了其中一顆就算不接另一顆應該也能跑吧??...感謝大大指教
如果一顆壞了, 你不會感到有任何差異, 只要接上新的一顆, 他會自動將資料再與另一顆 sync.
RAID 1 就是要預防硬碟壞掉的 🙂
請教一下,新接硬碟上去,都不用做任何設定就會自動同步嗎?因為我目前遇到的問題是,1)新增的硬碟得先做fdisk把舊硬碟的patern複製到新硬碟,再用mdadm --manage /dev/md0 --add /dev/sdb2 才能把新硬碟加入,他才會自動同步。2)如果是原本的另一顆硬碟,上面已經有patern,一樣得執行mdadm --manage /dev/md0 --add /dev/sdb2才能再把這顆硬碟加入,然後才會開始同步。謝謝您~
需要做設定才會同步.
您得作法沒錯, 如果不小心接錯硬碟, 馬上被同步掉, 不是很尷尬嗎? XD
看來似乎只能以分割區為單位。不知道如果以整顆硬碟為單位:mdadm --create --verbose --auto=yes /dev/md0 --level=1 --raid-devices=2 /dev/sdb /dev/sda
指定好 source 碟是哪一顆,就結束,這該有多好~
不過這樣子就得要找兩顆大小一致的硬碟, 也是缺點囉~
是阿,不過像是正好多了一顆一致的硬碟,想把整顆硬碟 mirror 到新的硬碟,卻得乖乖的建好同步分割表到新硬碟,又為了改成 fd 格式,必須把母碟的資料按照每個分割一個一個先抄出來到新硬碟,這樣兩顆才能都是 fd 。是有點不直覺。
呵呵, 如果有一致的硬碟的話, 會建議用硬體 RAID, 比較不會爆炸. XD
指的是把sdb加入開機選項但是用sda開機是嗎??
default 0
fallback 1
$ grub # 設定 Grub 使用 sdb 開機
root (hd0,0)
setup (hd0)
root (hd1,0)
setup (hd1)
看起來是sda開機??
設定 mdadm.conf
此要等上個步驟 sync 完畢後做.
$ cp /etc/mdadm/mdadm.conf_orig /etc/mdadm/mdadm.conf
$ mdadm --examine --scan >> /etc/mdadm/mdadm.conf
取消預設 sdb 開機的選項 並 增加 RAID 開機選項 ............
請問取消預設 sdb 開機的選項有什用意呢?^^
看起來是sda開機?? => 對
取消預設 sdb 開機的選項有什用意呢? => 因為應該要走 md, 而不是 sdb.
該不會全自動同步吧?,,,,應該要下一些指令吧...比方說 mdadm --add
我沒有壞掉過, 所以也沒做過. Orz..
不過, 我想應該是從 "將 sda 資料 cp 到 sdb (md0, md1...)" 這個步驟開始, 在做一次吧~
若有成功的經驗, 也記得分享一下. 🙂
摘除其中一顆硬碟, 以另一顆全新硬碟取代 (新硬碟當第二顆), 開機後執行:
sfdisk -d /dev/sda | sfdisk /dev/sdb
mdadm --add /dev/md1 /dev/sdb2
mdadm --add /dev/md0 /dev/sdb1
watch cat /proc/mdstat 靜候 recovery 作業完成
感謝分享. 🙂
hello..我是richardhuang..^^因為新版都已升級到grub2了...不知該怎設定 那個fallback 1都不知道要放那裡說??
新裝的硬碟不能單獨開機..請問該怎辦呢?這篇文章可以小小修正一下嗎?^^
我一直沒有需要重灌耶, 也不希望有機會重灌. XD
您可以參考此篇文章看看: http://www.howtoforge.com/how-to-set-up-software-raid1-on-a-running-system-incl-grub2-configuration-ubuntu-10.04
不然新的硬碟都不開機耶?
grub-install /dev/sda
grub-install /dev/sdb
應該是分別安裝?
grub-install /dev/sda.........??好像不需要喔??這顆是舊的好的硬碟...為何要重新grub-install呢?
如果舊得硬碟可以開機, 就不需要.
如果不能開機的話, 在考慮試試 grub-install /dev/sda 看看囉~ 🙂
謝謝大大的分享:學習電腦以來,常常google到大大您的文章,許多文章受用許多,您的不吝分享,令小弟十分感動,特地浮出留言,感謝您!
謝謝您的支持~ 😀