X

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: 對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.
Related Post