« ProFTPD + mod_clamav + Quota 建置備忘 | 首頁 | 2007/12, Vol. 143 PChome Magazine »

2007年12月07日

Linux Software RAID 1 實作

環境

  • Fedora Core 6 (on VMware Server)
  • /etc/sysconfig/selinux → SELINUX=disabled
  • fdisk -l
Disk /dev/sda: 4294 MB, 4294967296 bytes
255 heads, 63 sectors/track, 522 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1         456     3662788+  83  Linux
/dev/sda2             457         521      522112+  82  Linux swap / Solaris

Disk /dev/sdb: 4294 MB, 4294967296 bytes
255 heads, 63 sectors/track, 522 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System

(第二顆硬碟是空的, 尚未分割磁區)

操作步驟

#安裝所需工具
yum -y install mkinitrd mdadm

#將第一顆硬碟的磁碟分割表複製給第二顆硬碟
sfdisk -d /dev/sda | sfdisk /dev/sdb

fdisk -l

Disk /dev/sda: 4294 MB, 4294967296 bytes
255 heads, 63 sectors/track, 522 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1         456     3662788+  83  Linux
/dev/sda2             457         521      522112+  82  Linux swap / Solaris

Disk /dev/sdb: 4294 MB, 4294967296 bytes
255 heads, 63 sectors/track, 522 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1   *           1         456     3662788+  83  Linux
/dev/sdb2             457         521      522112+  82  Linux swap / Solaris

fdisk /dev/sdb

Command (m for help): t
Partition number (1-4): 1
Hex code (type L to list codes): fd
Changed system type of partition 1 to fd (Linux raid autodetect)

Command (m for help): t
Partition number (1-4): 2
Hex code (type L to list codes): fd
Changed system type of partition 2 to fd (Linux raid autodetect)

Command (m for help): w

#清除 RAID superblock
mdadm --zero-superblock /dev/sdb1
mdadm --zero-superblock /dev/sdb2

#Fedora Core 6 預設只有 /dev/md0, 但我們有兩個 partition, 所以手動再建一個 md1
mknod /dev/md1 b 9 1

#建立 RAID 1
mdadm --create /dev/md0 --level=1 --raid-disks=2 missing /dev/sdb1
mdadm --create /dev/md1 --level=1 --raid-disks=2 missing /dev/sdb2

#查看 RAID 狀態: RAID 1 已經建立, 目前只有 /dev/sdb 掛入 ARRAY
cat /proc/mdstat

Personalities : [raid1] 
md1 : active raid1 sdb2[1]
      522048 blocks [2/1] [_U]
      
md0 : active raid1 sdb1[1]
      3662720 blocks [2/1] [_U]
      
unused devices: <none>

#產生 RAID 設定檔
cp /usr/share/doc/mdadm-2.5.4/mdadm.conf-example /etc/mdadm.conf
mdadm --examine --scan >> /etc/mdadm.conf

#格式化第二顆硬碟的磁區, 並將第二顆硬碟的 root ( / ) 掛載到 /mnt/md0
mkfs.ext3 /dev/md0
mkswap /dev/md1
mkdir /mnt/md0
mount /dev/md0 /mnt/md0

#修改相關設定, 準備以第二顆硬碟 (/dev/md0) 開機
vi /etc/fstab

/dev/md0 / ext3 defaults 1 1
/dev/md1 swap swap defaults 0 0

vi /boot/grub/menu.lst

default=0
timeout=5
title Fedora Core (2.6.18-1.2798.fc6)
	root (hd1,0)
	kernel /boot/vmlinuz-2.6.18-1.2798.fc6 ro root=/dev/md0
	initrd /boot/initrd-2.6.18-1.2798.fc6-raid.img

#將 Software RAID Module 載入 initrd.img
mkinitrd --preload raid1 /boot/initrd-`uname -r`-raid.img `uname -r`

#將第一顆硬碟裡的資料全數複製到第二顆硬碟
cp -ax / /mnt/md0

#將 GRUB 寫入第二顆硬碟
grub

grub>root (hd1,0)
grub>setup (hd1)
grub>quit

reboot

#將第一顆硬碟的 Partition Type 改為 Linux RAID
fdisk /dev/sda

Command (m for help): t
Partition number (1-4): 1
Hex code (type L to list codes): fd
Changed system type of partition 1 to fd (Linux raid autodetect)

Command (m for help): t
Partition number (1-4): 2
Hex code (type L to list codes): fd
Changed system type of partition 2 to fd (Linux raid autodetect)

Command (m for help): w

#把第一顆硬碟的磁區加入 RAID
mdadm --add /dev/md1 /dev/sda2
mdadm --add /dev/md0 /dev/sda1

#監看 RAID Recovery 的進度
watch cat /proc/mdstat

完成後↓

Personalities : [raid1]
md1 : active raid1 sda2[0] sdb2[1]
      522048 blocks [2/2] [UU]

md0 : active raid1 sda1[0] sdb1[1]
      3662720 blocks [2/2] [UU]

unused devices: <none>

#修改 GRUB root device
#其實完成 RAID 1 後, 不管是 root (hd0,0) 還是 root (hd1,0) 都能開機, 但改成 hd0 較好, 因為若其中有一顆掛點, 只剩一顆硬碟開機的時候, 那顆硬碟就是 hd0 啦!

vi /boot/grub/menu.lst

default=0
timeout=5
title Fedora Core (2.6.18-1.2798.fc6)
	root (hd0,0)
	kernel /boot/vmlinuz-2.6.18-1.2798.fc6 ro root=/dev/md0
	initrd /boot/initrd-2.6.18-1.2798.fc6-raid.img


狀況測試

  1. 指令熱插拔:
    mdadm --manage /dev/md0 --fail /dev/sdb1 --remove /dev/sdb1
    mdadm --add /dev/md0 /dev/sdb1
    watch cat /proc/mdstat 觀察 recovery 進度
     
  2. 摘除其中一顆硬碟, 開機後一樣可以正常運作
     
  3. 掛回剛剛摘除的硬碟, 開機後查看 /proc/mdstat, 把缺少的那顆再掛載進來:
    例如: mdadm --add /dev/md0 /dev/sda1
    掛載後, cat /proc/mdstat 可看到系統正在進行 recovery
     
  4. 摘除其中一顆硬碟, 以另一顆全新硬碟取代 (新硬碟當第二顆), 開機後執行:
    sfdisk -d /dev/sda | sfdisk /dev/sdb
    mdadm --add /dev/md1 /dev/sdb2
    mdadm --add /dev/md0 /dev/sdb1
    watch cat /proc/mdstat 靜候 recovery 作業完成


附錄: 取消 RAID 1, 回到最原始的單顆硬碟環境

#設定以第二顆硬碟開機
vi /boot/grub/menu.lst

default=0
timeout=5
title Fedora Core (2.6.18-1.2798.fc6)
	root (hd1,0)
	kernel /boot/vmlinuz-2.6.18-1.2798.fc6 ro root=/dev/sdb1
	initrd /boot/initrd-2.6.18-1.2798.fc6.img (不是 -raid 那個)

vi /etc/fstab

/dev/sdb1 / ext3 defaults 1 1
/dev/sdb2 swap swap defaults 0 0

#刪除 Software RAID 設定檔
rm /etc/mdadm.conf

#所有的 partition 都改回 83 (linux)、82 (swap)
fdisk /dev/sda && fdisk /dev/sdb

reboot

#清除 RAID superblock
mdadm --zero-superblock /dev/sda1
mdadm --zero-superblock /dev/sda2

mount /dev/sda1 /mnt

chroot /mnt

#改回以第一顆硬碟開機
vi /etc/fstab

/dev/sda1 / ext3 defaults 1 1
/dev/sda2 swap swap defaults 0 0

vi /boot/grub/menu.lst

default=0
timeout=5
title Fedora Core (2.6.18-1.2798.fc6)
	root (hd0,0)
	kernel /boot/vmlinuz-2.6.18-1.2798.fc6 ro root=/dev/sda1
	initrd /boot/initrd-2.6.18-1.2798.fc6.img

exit


參考資料

Posted by Jamyy at 2007年12月07日 11:27

Trackback Pings

TrackBack URL for this entry:
http://cha.homeip.net/cgi-bin/mt/mt-tb.cgi/321

Comments

Jamyy偶像大大:
Linux中再難的專題對您來講都能迎刃而解,實在是越來越佩服您了,再次給您加油打氣與鼓勵哦^^

Posted by: aok at 2007年12月08日 20:58

aok 您好,

謝謝您的鼓勵 ^^
這都得感謝 HowToForge 那篇文章的詳細指引, 我才能依樣畫葫蘆 :P

Posted by: Jamyy at 2007年12月08日 23:21

Jamyy大大:
想請問一下,LVM 是不是也能做到RAID的效果?
因為我其實攪不太清楚他們的分別.
謝謝

Posted by: 千鈞 at 2007年12月10日 09:14

千鈞您好,

老實說我對 LVM 和 RAID 也不太熟 ^^'
剛剛在 Google 找到了這篇不錯的文章, 希望能對您有幫助:
Red Hat Enterprise Linux Documentation - 高階儲存技術
http://tinyurl.com/35lq8e

此外, 若要兼容 LVM 和 RAID 的優點, 從網路上幾篇文章看來, 都是建構 "LVM on top of RAID" (先建立 RAID, 再在 RAID 上建立 LVM)

ps. google 關鍵字: lvm raid

Posted by: Jamyy at 2007年12月10日 11:23

Jamyy大大您好,
謝謝你的資料
我會慢慢研習一下
p.s.你的回覆真快,感覺很親切^^

Posted by: 千鈞 at 2007年12月10日 12:23