[FrontPage] [TitleIndex] [WordIndex

This is a read-only archived version of wiki.centos.org

如何利用修復光碟將一個 CentOS 5 系統轉換成 RAID1

1. 引言

1.1. 內容

這個文檔要描述的是將一個預設的 CentOS 5 系統轉換為 RAID 1 的程序。我盼望你能夠將這個技巧延伸到一個更複雜的系統,因為本作者缺乏足夠耐性來列舉所有可能的系統設置,及如何轉換成所有可能的硬盤陣列類型。

透過修復模式,現存的檔案系統可以在非運行中、唯讀的狀況下被複製,這樣對系統比較有保障。

1.2. 警告

為了規範程序,下面是數個限制……

1.3. 先決條件

要有效地應用這份文檔,我們建議你擁有……

1.4. 免責聲明

這裡並不提供任何類型的保證。系統間的差異實在太大,令這份文檔無法涵蓋所有可能性。系統管理員請留意:如果你的系統損毀了,你要了承擔一切後果(這句有版權嗎?)。

2. 啟動修復模式

修復模式是維修損壞了的系統最迫不得已時才用的方法。一個系統總會有某種修復用的開機方法。

2.1. 利用安裝媒體開機

這可以是 CD、DVD、USB 儲存器或 PXE 映像。建立安裝媒體的方法超越了這份文檔的範圍,但你可以假設這個媒體存在,因為你擁有一台安裝成功的機器。如果這個媒體並不存在,請檢視 http://www.centos.org

2.2. 選擇修復模式

在開機的提示符,輸入

linux rescue

然後按 Enter。

2.3. 選擇語言

利用箭嘴鍵選擇所需語言並按 Enter。

2.4. 選擇鍵盤類型

利用箭嘴鍵選擇所需鍵盤配置並按 Enter。

2.5. 網絡介面

網絡介面並非必要的。請用箭嘴鍵選擇 No 並按 Enter。

2.6. 省略掛載現有系統

在修復畫面,利用箭嘴鍵選擇 Skip 並按 Enter。我們稍後將會進行掛載。

2.7. 修復模式

恭喜你!你已經進入修復模式!

修復模式在這些情況下很有用……

3. 設置新裝置

此刻,新裝置的實物應該已經安裝在系統中,並且正確地接了線。普遍來說,這是在切了電源的情形下進行。

3.1. 判斷新裝置的名稱

假設新的儲存裝置已經安裝在系統內,並且接駁了合適的資料及電源線,那麼你多數可以用這個方法來判斷現有及新裝置的名稱……

fdisk -l

範例的系統傳回……

Disk /dev/sda: 250.0 GB, 250000000000 bytes
255 heads, 63 sectors/track, 30394 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          13      104391   83  Linux
/dev/sda2              14       30394   244035382+  8e  Linux LVM

Disk /dev/sdb: 250.0 GB, 250000000000 bytes
255 heads, 63 sectors/track, 30394 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Disk /dev/sdb doesn't contain a valid partition table

在這個例子裡,現有系統正在使用 /dev/sda,而新的裝置名叫 dev/sdb。如果是 ATA 的話,它們大可以是 /dev/hda 及 /dev/hdc。可能的話,這兩個裝置應該在不同的介面上。就 SATA 及 SCSI 而言,裝置的名稱不能透露它們位於哪個介面上,但就 ATA 而言,/dev/hda 及 /dev/hdb 表示它們在同一個介面上。這或許是無可避免,但卻不可取。

3.2. 建立新的分割區

根據可追溯到 SunOS 年代的傳統智慧,把 /boot 放在 RAID 1 裝置上帶來潛在的安全性及容錯問題。以人手方式複製 /boot 至另一個轉軸(隨著傳統延伸,包括 Solaris 上的 / 分割區映像)提供一個安全性備份,因為擁有兩個可存取的 /boot 分割區增加某個 /boot 仍舊可用的機會。

你可以說這個做法能建立一個更可靠的系統,因為它在主分割區被更新或惡意破壞時,提供了另一個開機修復的途徑,而代價只是(透過掛載、一個 rsync 指命、及卸下)保持次要及主要分割區同步。若然真的要修復開機裝置,你只須編輯 grub 的指命行並指定後備的 /root 裝置問題便能「迎刃而解」。另外值得留意的,就是運用「雙重 /root」這個方案時必須預備一台本地的終端機。

一旦主要的 /boot 分割區被修改及成功地測試後,你便可以用手動的方式定時將它同步。針對修復時備用及失效時提供保障,利用 raid 把內容「分佈」到兩個轉軸的「好處」並不勝於在兩個轉軸保留基本的 /boot 分割區。這是由於 raid 層級加入額外的複雜性及故障點。話雖如此,有些人基於其他人不同意的理由希望在每一處應用磁碟陣列,而這篇文章會繼續討論這個做法。

這篇文章的目標是要擁有一台透過 raid 能抵受裝置出現故障的系統,而不是其它做法。我我們將忽視其它考慮因素。我們會將 /boot 放在磁碟陣列,藉以簡化程序。

/!\ 註:上述句子所謂「簡化程序」的複雜情度其實過於在兩個實體硬盤上載入傳統分割區,然後定時定候透過 rsync 把次裝置與主裝置同步。

預設的安裝為 / 建立一個頗複雜的設置,而我們加入 RAID 1 時將會令它更複雜。使用 LVM 的好處就是你可以移動分割區來迎合不同的空間需求。

請利用 fdisk 這個分割區工具程式……

fdisk /dev/sdb

n 及 Enter 來建立一個新的分割區。按 p 及 Enter 來選擇主分割區。按 1 及 Enter 來選擇首個分割區。按 Enter 來選擇新分割區在裝置的頭開始。輸入 +100M 及按 Enter 來限制新分割區的大小為 100M。按 t 及 Enter,接著輸入 fd 及按 Enter 來更改分割區類型為 RAID。

n 及 Enter 來建立第二個新的分割區。按 p 及 Enter 來選擇主分割區。按 2 及 Enter 來選擇第二個分割區。按 Enter 來選擇新分割區由下一個磁柱開始。按 Enter 來使用裝置上餘下的空間。按 t 及 Enter 來更改分割區類型。由於我們將會有多個分割區,我們須要選擇 2 並按 Enter。輸入 fd 及按 Enter 來選擇 RAID。

p 及 Enter 來確定分割區的設定。

w 及 Enter 將修改寫入。

系統的回覆應該是……

The number of cylinders for this disk is set to 30394.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
   (e.g., DOS FDISK, OS/2 FDISK)

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-30394, default 1): 
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-30394, default 30394): +100M

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

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (14-30394, default 14): 
Using default value 14
Last cylinder or +size or +sizeM or +sizeK (14-30394, default 30394): 
Using default value 30394

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): p

Disk /dev/sdb: 250.0 GB, 250000000000 bytes
255 heads, 63 sectors/track, 30394 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1          13      104391   fd  Linux raid autodetect
/dev/sdb2              14       30394   244035382+  fd  Linux raid autodetect

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

至於那些想剪貼指令的人……

echo -e "n\np\n1\n\n+100M\nt\nfd\nn\np\n2\n\n\nt\n2\nfd\np\nw" | fdisk /dev/sdb

3.3. 建立 RAID 裝置

為 /boot 建立一個 RAID 1 裝置。由於第二個裝置暫時仍未存在,因此它需要預留一個地方。我們稍後便會加入第二個裝置。

mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 missing

所得的輸出應該是……

mdadm: array /dev/md0 started.

為 / 建立第二個 RAID 1 裝置。

mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sdb2 missing

所得的輸出應該是……

mdadm: array /dev/md1 started.

3.4. 將新的 /boot 裝置格式化

預設的安裝會將一個 ext3 分割區放置在 /boot。標籤可以幫助系統判斷分割區應該掛載在哪裡。要依從這個標準……

mkfs.ext3 -L '/boot' /dev/md0

所得的輸出應該是……

mke2fs 1.39 (29-May-2006)
Filesystem label=/boot
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
26104 inodes, 104320 blocks
5216 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=67371008
13 block groups
8192 blocks per group, 8192 fragments per group
2008 inodes per group
Superblock backups stored on blocks:
        8193, 24577, 40961, 57345, 73729

Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 30 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

3.5. 建立新的 / 分割區

這樣將 /dev/md1 設定為一個實體磁區……

lvm pvcreate /dev/md1

建立一個新的磁區群組……

lvm vgcreate RaidSys /dev/md1

建立一個新的邏輯調換磁區……

lvm lvcreate --size 4G --name swap RaidSys

建立一個新的邏輯 root 磁區……

lvm lvcreate --size 200G --name Root RaidSys

將新的調換裝置格式化……

mkswap /dev/RaidSys/swap

將新的 / 裝置格式化……

mkfs.ext3 -L '/' /dev/RaidSys/Root

3.6. 掛載分割區

將所有裝置掛載在我們找得著的地方……

mkdir /mnt/boot.old
mount -o ro /dev/sda1 /mnt/boot.old

mkdir /mnt/boot.new
mount /dev/md0 /mnt/boot.new

lvm vgchange --available y VolGroup00
mkdir /mnt/root.old
mount -o ro /dev/VolGroup00/LogVol00 /mnt/root.old

mkdir /mnt/root.new
mount /dev/RaidSys/Root /mnt/root.new

4. 移動資料至新裝置

4.1. 對 /boot 進行同步

rsync 這個工具應該能夠保留擁有權及更改日期,加上 X 旗標更能保留延伸屬性。加入 H 旗可以保留硬連結(多謝 Phil)。很不幸地,它似乎無法保留 SELinux 的屬性。請將資料同步……

rsync -avXH /mnt/boot.old/* /mnt/boot.new/

對於較喜歡用 tar 的人們,這樣做會從舊的 /boot 建立一個沒有加壓的壓縮檔,然後將它解壓到新的裝置上……

tar -C /mnt/boot.old -cf - . | tar -C /mnt/boot.new -xf -

4.2. 對 / 進行同步

再一次利用 rsync 工具……

rsync -avXH /mnt/root.old/* /mnt/root.new/

或者 tar……

tar -C /mnt/root.old -cf - . | tar -C /mnt/root.new -xf -

4.3. 重新標籤 SELinux

為要請求 SELinux 的屬性在開機時重新被標籤,建立一個旗標檔案……

touch /mnt/root.new/.autorelabel

4.4. 令新的裝置可作開機之用

你必須完成某些修改新系統的維護項目才能令它可以開機。

4.4.1. 安裝 grub

令新的 RAID 裝置可以用來開機……

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

4.4.2. 編輯 grub 設定檔

root 裝置是與別不同的,grub 需要知道關於它來告訴內核。編輯 /mnt/boot.new/grub/menu.lst。安裝媒體內包括 joe,它可以用來模擬 nano 及 vi。請用你覺得舒服的指令。將所有 /dev/VolGroup00/LogVol00 的地方改為 /dev/RaidSys/Root。儲存你的修改。

4.4.3. 編輯檔案系統列表

一旦系統能夠再次開機,你需要知道新的 root 裝置是甚麼。編輯 /mnt/root.new/etc/fstab,將所有 /dev/VolGroup00/LogVol00 改為 /dev/RaidSys/Root。一般來說,/boot 是靠標籤來掛載,但我們現在於每個硬盤上都有 /boot。讓我們將 LABEL=/boot 改為 /dev/md0。將 /dev/VolGroup00/LogVol01 改為 /dev/RaidSys/swap。儲存你的修改。

4.4.4. 建立新的 initrd

舊的系統在開機並不需要 RAID 驅動程式。現在它需要了。我們必須在 initrd 設置 RAID 驅動程式。以一個運作中的系統來完成這步驟會最容易。我們可以將 proc、dev、sys 及 selinux 這些虛擬目錄聯繫到修復系統的版本,讓它看似一個運作中的系統。

umount /mnt/boot.new
mount /dev/md0 /mnt/root.new/boot
mount -o bind /proc /mnt/root.new/proc
mount -o bind /dev /mnt/root.new/dev
mount -o bind /sys /mnt/root.new/sys
mount -o bind /selinux /mnt/root.new/selinux

現在進入新的系統……

chroot /mnt/root.new

檢視現有的映像來判斷你現有的系統是甚麼……

ls /boot/*.img

在測試的系統上,這樣做傳回……

/boot/initrd-2.6.18-128.1.6.el5.img  /boot/initrd-2.6.18-128.el5.img

這表示 2.6.18-128.1.6.el5 是最新版的內核。建立一個新的 initrd……

mkinitrd -f /boot/initrd-2.6.18-128.1.6.el5.img 2.6.18-128.1.6.el5

返回修復模式……

exit

4.5. 清理

在重新開機前,先將系統還原到未掛載的狀況。這樣會告訴系統是時候寫入任何留在快取內的改動。

umount /mnt/root.new/selinux
umount /mnt/root.new/sys
umount /mnt/root.new/dev
umount /mnt/root.new/proc
umount /mnt/root.new/boot
umount /mnt/root.new
umount /mnt/boot.old
umount /mnt/root.old

5. 利用新裝置開機

我們現在已經準備好測試我們的單硬盤 RAID 1 系統。我們並沒有對現有的裝置作出任何改動,因此我們可以忽略我們所做的一切事情,並以現有的裝置重新開機。

5.1. 移動裝置

我們已經乾淨俐落地卸除了我們的儲存裝置,因此我們可以簡單切斷系統電源,又或者使用這個指令……

exit

它會令系統重新啟動。由於我們在下一步需要系統是關閉的,當它完成關機準備重新啟動時,請關閉它並切斷電源。

將第二個儲存裝置連接到首個介面上。在我們的測試中,請勿連接原有裝置。請在 BIOS 中為硬件改動更新設定。

5.2. 測試系統

移除修復媒體並開啟系統。它應該能如同未作出改動般啟動。

登入、進到指令行、並輸入以下指令來檢查我們有否應用 RAID 裝罝……

mount

我們應該穫得類似這樣的輸出……

/dev/mapper/RaidSys-Root on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/md0 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)

重要的部份是 /dev/mapper/RaidSys-Root on / type ext3 (rw)/dev/md0 on /boot type ext3 (rw)。我們的系統現已應用 RAID/LVM。

6. 擴展 RAID 分割區至第二個裝置

我們已經有一台運作中的單碟 RAID 1 系統。這個系統已被檢查過能正常運作,而並證實藏有資料。這個系統已經準備好擴展為一個多碟 RAID 1 系統。

由這點開始,原有的儲存裝置將會被修改。這小心確定新的 RAID 系統的確能正常運作。

你可以選擇於系統運作的同時擴展到第二個裝置。除了較複雜之外,沒有其它理由阻止你這樣做。

6.1. 重新安裝原先/第二個裝置

關閉系統並安裝原先的裝置,將它連接在第二個介面上,作為附屬裝置。

6.2. 用修復媒體開機

執行早前啟動修復模式部份內的指令。

6.3. 啟用 RAID 裝置

安裝媒體並不包含預設的 mdadm.conf 檔,因此你需要建立它。一個簡單的方法是……

mdadm --examine --scan > /etc/mdadm.conf

接著,啟用所有被偵測到的 RAID 裝置……

mdadm --assemble --scan

6.4. 轉換第二個裝置上的分割區

我們需要設置第二個裝置儲存裝置,好讓它能與配合其它 RAID 裝置。透過 fdisk,先刪除舊的分割區,然後建立新的……

fdisk /dev/sdb

d 及 Enter,然後 2 及 Enter 來刪除第二個分割區,。

d 及 Enter 來刪除首個分割區。

n 及 Enter 來建立新的 /boot 分割區。按 p 及 Enter 來選擇主分割區。接 1 及 Enter 來選擇首個分割區。按 Enter 來選擇新分割區在裝置的頭開始。輸入 +100M 及按 Enter 來限制新分割區的大小為 100M。按 t 及 Enter,接著輸入 fd 及按 Enter 來更改 /boot 分割區的類型。

n 及 Enter 來建立別一個分割區。按 p 及 Enter 來選擇主分割區。按 2 及 Enter 來選擇第二個分割區。按 Enter 來選擇新分割區由可用的空間的起首開始。按 Enter 來使用裝置上餘下的空間。按 t、Enter、2 及 Enter 來選擇更改第二個分割區的類型,接著輸入 fd 及按 Enter 來選擇。

p 及 Enter 來顯示分割區的設定,以便檢查。

w 及 Enter 將新的分區表寫進裝置內。

The number of cylinders for this disk is set to 30394.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
   (e.g., DOS FDISK, OS/2 FDISK)

Command (m for help): d
Partition number (1-4): 2
Command (m for help): d
Selected partition 1

Command (m for help): n

Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-30394, default 1): 
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-30394, default 30394): +100M

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

Command (m for help): n

Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (14-30394, default 14): 
Using default value 14
Last cylinder or +size or +sizeM or +sizeK (14-30394, default 30394): 
Using default value 30394

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): p

Disk /dev/sdb: 250.0 GB, 250000000000 bytes
255 heads, 63 sectors/track, 30394 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1          13      104391   fd  Linux raid autodetect
/dev/sdb2              14       30394   244035382+  fd  Linux raid autodetect

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

6.5. 擴展 RAID 的 /boot 分割區至第二個裝置

要檢視 RAID 現時的狀態……

cat /proc/mdstat

系統傳回的應該類似……

Personalities : [raid0] [raid1] [raid6] [raid5] [raid4] 
md1 : active raid1 sda2[0]
      244035264 blocks [2/1] [U_]
      
md0 : active raid1 sda1[0]
      104320 blocks [2/1] [U_]
      
unused devices: <none>

6.5.1. 加入第二個 /boot 分割區至 RAID 裝置

利用 mdadm 將第二個裝置上的首個分割區加進頭一個 RAID 裝置內

mdadm /dev/md0 -a /dev/sdb1

6.5.2. 檢查 RAID 的 /boot 裝置

我們想檢查第二個裝置是否已被加入……

cat /proc/mdstat

它應該傳回……

Personalities : [raid0] [raid1] [raid6] [raid5] [raid4] 
md1 : active raid1 sda2[0]
      244035264 blocks [2/1] [U_]
      
md0 : active raid1 sdb1[1] sda1[0]
      104320 blocks [2/2] [UU]
      
unused devices: <none>

留意 md0 現在有兩個使用中的裝置 [UU]

6.6. 擴展 RAID 的 / 分割區至第二個裝置

6.6.1. 加入第二個 / 分割區至 RAID 裝置

同樣地針對 /boot……

mdadm /dev/md1 -a /dev/sdb2

6.6.2. 檢查 RAID 的 / 裝置

加入第二個裝置到 md1 後,立即執行……

cat /proc/mdstat

它應該傳回……

Personalities : [raid0] [raid1] [raid6] [raid5] [raid4] 
md1 : active raid1 sdb2[2] sda2[0]
      244035264 blocks [2/1] [U_]
      [>....................]  recovery =  0.1% (254976/244035264) finish=63.7min speed=63744K/sec
      
md0 : active raid1 sdb1[1] sda1[0]
      104320 blocks [2/2] [UU]
      
unused devices: <none>

這是一個較大的分割區,因此需較長時間來同步。估計的完成時間是 63.7 分鐘。

一旦 md1 完成同步,cat /proc/mdstat 應該傳回……

Personalities : [raid0] [raid1] [raid6] [raid5] [raid4] 
md1 : active raid1 sdb2[1] sda2[0]
      244035264 blocks [2/2] [UU]
      
md0 : active raid1 sdb1[1] sda1[0]
      104320 blocks [2/2] [UU]
      
unused devices: <none>

我們建議完成同步後才重新開機。

6.7. 在第二個裝置上安裝 grub

令第二個裝置可以用來開機……

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

6.8. 重新啟動完整的 RAID 1 系統

要離開修復模式,請輸入……

exit

如果需要的話,請亦移除所有安裝媒體。

7. 總結

整個程序現在已經完成,而且系統應該能夠運作。

8. 更多閱讀

CentOS 5 文檔部署指南Chapter 4. Redundant Array of Independent Disks (RAID)

CentOS 5 文檔LVM 管理指引Chapter 2. LVM Components

mdadm、lvm 的指令說明


本頁的英文版本由 Ed Heron 建立。

Translation of revision 37


2023-09-11 07:23