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

 

將 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

使用 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
$ 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