最近硬碟掛了不少顆, 決定新電腦先做 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 系統轉移