Debian Linux Software RAID 1 實作

最近硬碟掛了不少顆, 決定新電腦先做 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 設定步驟

  1. 安裝 mdadm、initramfs-tools
  2. 同步 sda、sdb 磁碟分割
  3. 建立 RAID Array(md0, md1...)
  4. 格式化 md0, md1 ...
  5. Mount 檔案系統(md0, md1...)
  6. 將 sda 資料 cp 到 sdb (md0, md1...)
  7. 使用 sdb 開機
  8. 將 sda 加入 md0, md1.. 並同步.
  9. 取消由 sdb 開機的選項
  10. 測試

硬體資訊

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

  1. $ apt-get install mdadm initramfs-tools
  2. $ reboot

同步 sda、sdb 磁碟分割

  1. $ cat /proc/mdstat # 看目前有哪些磁區是建置 RAID 環境的
  2. $ sfdisk -d /dev/sda | sfdisk /dev/sdb # 將 sda 的磁碟分割表 複製 給 sdb
  3. $ fdisk -l # sda, sdb 就都長一樣了

修改 sdb 的檔案系統格式

  1. $ fdisk /dev/sdb # 修改 fdisk file system type
    t
    1 # 1 ... n (這邊是 1 ~ 6, 分別跑 6次, 失敗的不要理它)(有幾個就分別輸入幾次)
    fd # file system type = Linux raid autodetect
    w
  2. $ 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

  1. $ mdadm --zero-superblock /dev/sdb1 # 有錯誤也不用管它
  2. $ mdadm --zero-superblock /dev/sdb2
  3. $ mdadm --zero-superblock /dev/sdb3
  4. $ mdadm --zero-superblock /dev/sdb4
  5. $ mdadm --zero-superblock /dev/sdb5
  6. $ mdadm --zero-superblock /dev/sdb6

建立 RAID Array(md0, md1...)

  1. $ mdadm --create /dev/md0 --level=1 --raid-disks=2 missing /dev/sdb1
  2. $ mdadm --create /dev/md1 --level=1 --raid-disks=2 missing /dev/sdb2
  3. $ mdadm --create /dev/md2 --level=1 --raid-disks=2 missing /dev/sdb3
  4. $ mdadm --create /dev/md3 --level=1 --raid-disks=2 missing /dev/sdb5
  5. $ mdadm --create /dev/md4 --level=1 --raid-disks=2 missing /dev/sdb6
  6. # 參數說明
  7. # missing: 忽略, /dev/sda 上面有系統, 若不使用 missing, 則原有的系統會被重建, 造成系統損毀.
  8. # --create: 建立 RAID 的選項
  9. # --raid-devices=N: 使用幾個磁碟 (partition) 作為磁碟陣列的裝置
  10. # --level=[015]: 設定這組磁碟陣列的等級, 支援很多, 不過建議只要用 0, 1, 5 即可
  11. # --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 ...

  1. $ mkfs.ext3 /dev/md0
  2. $ mkfs.ext3 /dev/md1
  3. $ mkfs.ext3 /dev/md2
  4. $ mkfs.ext3 /dev/md3
  5. $ mkswap /dev/md4

備份 mdadm.conf

  1. $ cp /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf_orig
  2. $ mdadm --examine --scan >> /etc/mdadm/mdadm.conf # 將目前 RAID 資料寫入 conf 檔

Mount 檔案系統(md0, md1...)

  1. $ mkdir /mnt/md0 /mnt/md1 /mnt/md2 /mnt/md3
  2. $ mount /dev/md0 /mnt/md0
  3. $ mount /dev/md1 /mnt/md1
  4. $ mount /dev/md2 /mnt/md2
  5. $ mount /dev/md3 /mnt/md3
  6. $ 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 開機

  1. $ vi /boot/grub/menu.lst # 於 default 0 後面加入一行 fallback 1, 如下述:
    default         0
    fallback        1
  2. $ 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
  3. $ update-initramfs -u # 重新建立 initrd.img
  4. $ grub # 設定 Grub 使用 sdb 開機
    1. root (hd0,0)
    2. setup (hd0)
    3. root (hd1,0)
    4. setup (hd1)
  5. $ quit

將 sda 資料 cp 到 sdb (md0, md1...)

  1. $ cp -dpRx / /mnt/md2
  2. $ cd /boot; cp -dpRx . /mnt/md3
  3. $ cd /home; cp -dpRx . /mnt/md1
  4. $ cd /var; cp -dpRx . /mnt/md2
  5. $ reboot

將 sda 加入 md0, md1.. 並同步.

  1. $ 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
  2. $ cat /proc/mdstat # 應該會看到跟 md0, md1 ... md4
  3. $ fdisk /dev/sda # 修改 sda 檔案系統格式
    t
    1 # 1 ... n (這邊是 1 ~ 6, 分別跑 6次, 失敗的不要理它)(有幾個就分別輸入幾次)
    fd # file system type = Linux raid autodetect
    w
  4. $ 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 ..

  1. $ mdadm --add /dev/md0 /dev/sda1
  2. $ mdadm --add /dev/md1 /dev/sda2
  3. $ mdadm --add /dev/md2 /dev/sda3
  4. $ mdadm --add /dev/md3 /dev/sda5
  5. $ mdadm --add /dev/md4 /dev/sda6

加入完成後, 會自動開始同步

  1. $ 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]
  2. $ watch cat /proc/mdstat # 使用 watch 監控是否 sync 完畢

設定 mdadm.conf

  1. 此要等上個步驟 sync 完畢後做.
  2. $ cp /etc/mdadm/mdadm.conf_orig /etc/mdadm/mdadm.conf
  3. $ mdadm --examine --scan >> /etc/mdadm/mdadm.conf

取消預設 sdb 開機的選項 並 增加 RAID 開機選項

  1. $ 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
  2. $ update-initramfs -u
  3. $ reboot

測試

移除 sdb
  1. $ mdadm --manage /dev/md0 --fail /dev/sdb1
  2. $ mdadm --manage /dev/md1 --fail /dev/sdb2
  3. $ mdadm --manage /dev/md2 --fail /dev/sdb3
  4. $ mdadm --manage /dev/md3 --fail /dev/sdb5
  5. $ mdadm --manage /dev/md4 --fail /dev/sdb6
  6. $ mdadm --manage /dev/md0 --remove /dev/sdb1
  7. $ mdadm --manage /dev/md1 --remove /dev/sdb2
  8. $ mdadm --manage /dev/md2 --remove /dev/sdb3
  9. $ mdadm --manage /dev/md3 --remove /dev/sdb5
  10. $ mdadm --manage /dev/md4 --remove /dev/sdb6
  11. $ shutdown -h now # 將硬碟拔除重開, 然後換上新硬碟
將新的 sdb 同步 RAID 1
  1. $ cat /proc/mdstat # 會看到只有一顆硬碟的狀況.
  2. $ sfdisk -d /dev/sda | sfdisk /dev/sdb # 或 sfdisk -d /dev/sda | sfdisk --force /dev/sdb
  3. $ mdadm --zero-superblock /dev/sdb1
  4. $ mdadm --zero-superblock /dev/sdb2
  5. $ mdadm --zero-superblock /dev/sdb3
  6. $ mdadm --zero-superblock /dev/sdb4
  7. $ mdadm --zero-superblock /dev/sdb5
  8. $ mdadm --zero-superblock /dev/sdb6
  9. # 增加並同步
  10. $ mdadm -a /dev/md0 /dev/sdb1
  11. $ mdadm -a /dev/md1 /dev/sdb2
  12. $ mdadm -a /dev/md2 /dev/sdb3
  13. $ mdadm -a /dev/md3 /dev/sdb5
  14. $ mdadm -a /dev/md4 /dev/sdb6
  15. $ cat /proc/mdstat # 就會看到開始同步了.
同步完成後更新 Grub 開機
  1. $ grub
    1. root (hd0,0)
    2. setup (hd0)
    3. root (hd1,0)
    4. setup (hd1)
  2. $ quit

完整移除 mdadm (RAID)

設定完成後, 新系統安裝也都會把之前的設定帶進去, 反而造成之後設定的麻煩, 所以要清空, 就拿片 Ubuntu 開機光碟, 然後 fdisk /dev/sda, fdisk /dev/sdb, 把所有的磁區全部砍掉, 這樣子之後安裝就不會有 RAID 的設定出現囉~ 🙂

升級 Kernel 後, 未更新 /boot/grub 的 開機光碟急救

升級完 kernel 若沒有修改 /boot/grub/menu.lst, 使用 Ubuntu 光碟急救修復.

  1. mount -t ext3 /dev/sda1 /media/ # ext3 這些就看自己用哪個格式, raid 的系統 ubuntu 開機光碟無法辨認.(cat /etc/fstab)
  2. 去找 /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

相關網頁

作者: Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.

在〈Debian Linux Software RAID 1 實作〉中有 34 則留言

  1. 路徑應該在 /boot/grub/menu.lst 這邊, 一定會有耶.
    您可以 cat /etc/fstab, 看一下 boot 有沒有 mount 到其它地方去, 可能是沒有掛載進來, 所以是空的.

  2. 我剛去查了別的版本,我知道那裡有問題了,我目前就是9.04居然沒有那一個檔,但是8.04卻有這一個文件檔......瞎了!!!!!!

  3. 如果我先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嗎?^^....感謝大大

  4. 我先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參數嗎??要怎加呢???

  5. 如果你有某一顆硬碟是系統碟...要加一顆硬碟做raid1
    您確定這是可行的嗎?鳥哥討論區有人跟我說只能空白碟才能....不能用系統碟做...我是ubuntu8.04 TLS.感謝大大您的指教....^^

  6. 我重灌ubuntu 用9.0 裝了raid1....用了兩棵哈滴.......他這個是如果一棵哈滴壞了...就會自動接上另一顆嗎??那如果拔了其中一顆就算不接另一顆應該也能跑吧??...感謝大大指教

  7. 如果一顆壞了, 你不會感到有任何差異, 只要接上新的一顆, 他會自動將資料再與另一顆 sync.
    RAID 1 就是要預防硬碟壞掉的 🙂

    1. 請教一下,新接硬碟上去,都不用做任何設定就會自動同步嗎?因為我目前遇到的問題是,1)新增的硬碟得先做fdisk把舊硬碟的patern複製到新硬碟,再用mdadm --manage /dev/md0 --add /dev/sdb2 才能把新硬碟加入,他才會自動同步。2)如果是原本的另一顆硬碟,上面已經有patern,一樣得執行mdadm --manage /dev/md0 --add /dev/sdb2才能再把這顆硬碟加入,然後才會開始同步。謝謝您~

  8. 看來似乎只能以分割區為單位。不知道如果以整顆硬碟為單位:mdadm --create --verbose --auto=yes /dev/md0 --level=1 --raid-devices=2 /dev/sdb /dev/sda
    指定好 source 碟是哪一顆,就結束,這該有多好~

  9. 是阿,不過像是正好多了一顆一致的硬碟,想把整顆硬碟 mirror 到新的硬碟,卻得乖乖的建好同步分割表到新硬碟,又為了改成 fd 格式,必須把母碟的資料按照每個分割一個一個先抄出來到新硬碟,這樣兩顆才能都是 fd 。是有點不直覺。

  10. 指的是把sdb加入開機選項但是用sda開機是嗎??
    default 0
    fallback 1
    $ grub # 設定 Grub 使用 sdb 開機
    root (hd0,0)
    setup (hd0)
    root (hd1,0)
    setup (hd1)
    看起來是sda開機??

  11. 設定 mdadm.conf
    此要等上個步驟 sync 完畢後做.
    $ cp /etc/mdadm/mdadm.conf_orig /etc/mdadm/mdadm.conf
    $ mdadm --examine --scan >> /etc/mdadm/mdadm.conf
    取消預設 sdb 開機的選項 並 增加 RAID 開機選項 ............
    請問取消預設 sdb 開機的選項有什用意呢?^^

  12. 我沒有壞掉過, 所以也沒做過. Orz..
    不過, 我想應該是從 "將 sda 資料 cp 到 sdb (md0, md1...)" 這個步驟開始, 在做一次吧~
    若有成功的經驗, 也記得分享一下. 🙂

  13. 摘除其中一顆硬碟, 以另一顆全新硬碟取代 (新硬碟當第二顆), 開機後執行:
    sfdisk -d /dev/sda | sfdisk /dev/sdb
    mdadm --add /dev/md1 /dev/sdb2
    mdadm --add /dev/md0 /dev/sdb1
    watch cat /proc/mdstat 靜候 recovery 作業完成

  14. hello..我是richardhuang..^^因為新版都已升級到grub2了...不知該怎設定 那個fallback 1都不知道要放那裡說??
    新裝的硬碟不能單獨開機..請問該怎辦呢?這篇文章可以小小修正一下嗎?^^

  15. 謝謝大大的分享:學習電腦以來,常常google到大大您的文章,許多文章受用許多,您的不吝分享,令小弟十分感動,特地浮出留言,感謝您!

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料