星期二, 七月 07, 2009

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

相關網頁

相關標籤

this is comment icon 請問boot/grub/menu.ls [回覆]

請問我在ubuntu的系統裡面找不到boot/grub/menu.ls 這一個設定檔,grub是空的資料夾的說

Comment by 走路會撞山 (08/06/2009 12:03)

this is comment icon 回 走路會撞山 [回覆]

jon

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

Comment by Tsung (08/06/2009 12:17)

this is comment icon menu.lst這一個檔案是否一開始就不存在?! [回覆]

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

Comment by 走路撞到山 (08/06/2009 17:20)

this is comment icon 回 走路撞到山 [回覆]

這個檔案不在, 應該開不了機耶. XD

Comment by Tsung (08/06/2009 17:29)

this is comment icon 請問如果我有一顆ubuntu的系統碟...想再加一顆空白碟做raid1行嗎?? [回覆]

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

Comment by richardhuang (12/02/2009 11:10)

this is comment icon 回 richardhuang [回覆]

你可以從第二步驟開始做, 就是 sda 不用動, 只要將 sdb 切的跟 sda 一樣, 然後繼續跑之後的步驟就可以囉~ :)

Comment by Tsung (12/02/2009 11:22)

this is comment icon ^^ [回覆]

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

Comment by richardhuang (12/03/2009 08:11)

this is comment icon 回 richardhuang [回覆]

Mmm... 你可以直接看此篇文章講的做, 我現在也沒這種環境測試, 沒辦法跟你說. :(

Comment by Tsung (12/03/2009 10:07)

this is comment icon 是喔...那可不可以問一下 [回覆]

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

Comment by richardhuang (12/03/2009 11:04)

this is comment icon 回 richardhuang [回覆]

第二顆硬碟必須是空的硬碟(因為要切的跟主硬碟一致).
系統碟如果是空的, 那你這 RAID 是要從哪邊開始 build 起來?

Comment by Tsung (12/03/2009 11:12)

this is comment icon 我重灌ubuntu 用9.0 裝了raid1 [回覆]

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

Comment by richardhuang (12/05/2009 00:27)

this is comment icon 回 richardhuang [回覆]

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

Comment by Tsung (12/05/2009 11:33)
Add this page to del.icio.us

發表迴響

標題

內容 (限制 1000 字)

暱稱

電子郵件

個人網頁


 authimage


PS: 若無法留言, 請先確認是否有打開 JavaScript, 造成您的困擾, 實在萬分對不起 Orz...(如果無法留言, 勞煩可以發信給我好嗎? 謝謝.)
PS2: 若您的留言被誤判, 我都會再自行看過, 不需要一直重覆張貼~