Centos

CentOS 6.7 完全移除 RAID。Clod 磁碟並從 /dev/sda 啟動

  • October 7, 2015

我對 Linux 完全陌生。我繼承了託管在德國某處的專用伺服器。作業系統是 CentOS release 6.7 (Final) 64bit。伺服器在軟體 RAID-1 配置中有兩個 3TB 磁碟。我正在處理的情況是,根據 SMART 的說法,第二個磁碟即將出現故障,但是之前的管理員在 RAID 上遇到了一些問題,他從其中完全刪除了 /dev/sda 組件,所以現在系統從一個磁碟(降級)RAID-1 陣列,所有文件都在 /dev/sdb(即將發生故障的磁碟)上。此外,他完全刪除了/dev/sda。為了解決這個問題,我需要執行以下任務:

  1. 重新分區 /dev/sda 與 /dev/sdb 相同。
  2. 將 /dev/sdb 中的所有數據複製(複製)到 /dev/sda。
  3. 完全刪除 RAID-1 配置。
  4. 將系統配置為從 /dev/sda 作為本機磁碟(而不是 /dev/md*)引導。
  5. 確保一切正常。
  6. 安全擦除 /dev/sdb。
  7. 請求支持將故障磁碟 (/dev/sdb) 更換為新磁碟。
  8. 重新創建並同步 RAID-1 陣列。

問題是我不知道如何在 Linux 中執行這些任務。請注意,我正在遠端訪問系統,因此我無法承受任何導致系統無法啟動的錯誤。但是我確實可以訪問救援系統(一個可以從 DHCP 啟動的小型 linux,可以訪問底層系統)。

以下是一些(可能有用的)命令輸出和配置文件:

fdisk -l

Disk /dev/sdb: 3000.6 GB, 3000592982016 bytes
255 heads, 63 sectors/track, 364801 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x000e76a6

Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1        1567    12582912+  83  Linux
/dev/sdb2            1567        1633      524288+  fd  Linux raid autodetect
/dev/sdb3            1633      135307  1073741824+  fd  Linux raid autodetect
/dev/sdb4          135307      364802  1843413464    f  W95 Ext'd (LBA)
/dev/sdb5          135308      364802  1843412440   fd  Linux raid autodetect

Disk /dev/sda: 3000.6 GB, 3000592982016 bytes
255 heads, 63 sectors/track, 364801 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x00074207

Device Boot      Start         End      Blocks   Id  System

Disk /dev/md3: 1887.7 GB, 1887654199296 bytes
2 heads, 4 sectors/track, 460853076 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x00000000

Disk /dev/md1: 536 MB, 536858624 bytes
2 heads, 4 sectors/track, 131069 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x00000000

Disk /dev/md2: 1099.5 GB, 1099511488512 bytes
2 heads, 4 sectors/track, 268435422 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x00000000

文件 -s /dev/sdb

/dev/sdb: x86 boot sector; GRand Unified Bootloader, stage1 version 0x3,     stage2 address 0x2000, stage2 segment 0x200, GRUB version 0.94; partition 1: ID=0x83, starthead 32, startsector 2048, 25165825 sectors; partition 2: ID=0xfd, starthead 254, startsector 25169920, 1048577 sectors; partition 3: ID=0xfd, starthead 254, startsector 26220544, 2147483649 sectors; partition 4: ID=0xf, starthead 254, startsector 2173706240, 3686826928 sectors, code offset 0x48

文件-s/dev/sda

/dev/sda: x86 boot sector, code offset 0xb8

貓 /etc/fstab

proc /proc proc defaults 0 0
none /dev/pts devpts gid=5,mode=620 0 0
/dev/md0 none swap sw 0 0
/dev/md1 /boot ext3 defaults 0 0
/dev/md2 / ext4 defaults 0 0
/dev/md3 /home ext4 defaults 0 0

貓 /boot/grub/grub.conf

timeout 5
default 0

title CentOS (2.6.32-573.7.1.el6.x86_64)
root (hd0,1)
kernel /vmlinuz-2.6.32-573.7.1.el6.x86_64 ro root=/dev/md2 rd_NO_LUKS rd_NO_DM nomodeset crashkernel=auto SYSFONT=latarcyrheb-sun16 LANG=en_US.UTF-8 KEYTABLE=de
initrd /initramfs-2.6.32-573.7.1.el6.x86_64.img

title CentOS (2.6.32-504.1.3.el6.x86_64)
root (hd0,1)
kernel /vmlinuz-2.6.32-504.1.3.el6.x86_64 ro root=/dev/md2 rd_NO_LUKS rd_NO_DM nomodeset crashkernel=auto SYSFONT=latarcyrheb-sun16 LANG=en_US.UTF-8 KEYTABLE=de
initrd /initramfs-2.6.32-504.1.3.el6.x86_64.img

貓 /proc/mdstat

Personalities : [raid1]
md2 : active raid1 sdb3[1]
     1073741688 blocks super 1.0 [2/1] [_U]

md1 : active raid1 sdb2[1]
     524276 blocks super 1.0 [2/1] [_U]

md3 : active raid1 sdb5[1]
     1843412304 blocks super 1.0 [2/1] [_U]

unused devices: <none>

對此的任何幫助將不勝感激。

謝謝你。

首先,需要了解的是,這不是要更改 RAID-1 陣列中的故障磁碟,而是關於如何完全移除 RAID 陣列,複製即將發生故障的磁碟,然後從好的引導系統沒有任何 RAID 配置的磁碟。這種方法的原因是因為第一個磁碟(sda),也就是好磁碟,完全是空的,沒有分區和文件系統,當我將它添加到陣列時,它無法同步(重建)可能是因為有讀取錯誤在第二個磁碟 (sdb) 上。此外,第二張磁碟(壞的)是系統啟動的地方。如果您了解 linux 及其命令,則完成此任務所需的步驟相當簡單,但是,該過程涉及分區、複製和 MBR 安裝任務,如果您不夠小心,這些任務將破壞您的數據。最後,

這是程序:

1. 以救援模式啟動系統。

由於我們要從系統的引導磁碟複製數據,我們不需要擔心任何鎖定的文件或類似的事情。最好的方法是啟動到救援模式。幸運的是,我的伺服器託管公司以非常簡單的方式支持這一點。在您可以直接訪問(無遠端)的伺服器中,這類似於從 Live CD 啟動或從啟動菜單中選擇“救援模式”。

2. 準備第一個磁碟 (/dev/sda) 用於複製數據。

為了準備 sda,我們需要從 sdb 獲取分區資訊。實際上,這一步不是強制性的,因為我們的目標是在沒有任何 RAID 配置或與 sdb 沒有任何關係的情況下啟動系統,如果您願意的話,所以如果目前分區方案不是我們想要的,這是改變它的機會。我們唯一需要記住的是新分區需要有足夠的空間來保存來自 sdb 的數據。但是,Linux 中的分區需要對對齊和類似的東西有一些深入的了解,並且由於 sdb 已經正確分區,我發現在 sda 中做同樣的事情更容易。為此,我們首先需要查看 sdb 中的分區,為此我使用了 parted。

*注意:*當您研究如何使用 linux 做事時,最困難的任務是找到(在眾多命令中)最適合使用的命令。例如,有相當多的分區命令和實用程序,決定使用哪一個需要大量時間來閱讀和比較資訊。我在這裡選擇使用 parted 是因為它顯示了文件系統以及分區,並且它對大磁碟有更好的支持?(我不確定)。

# parted /dev/sdb
(parted) unit s
(parted) print

輸出:

Model: ATA ST3000DM001-1CH1 (scsi)
Disk /dev/sdb: 5860533168s
Sector size (logical/physical): 512B/4096B
Partition Table: msdos

Number  Start        End          Size         Type      File system  Flags
1      2048s        25167872s    25165825s    primary
2      25169920s    26218496s    1048577s     primary   ext3         raid
3      26220544s    2173704192s  2147483649s  primary   ext4         raid
4      2173706240s  5860533167s  3686826928s  extended               lba
5      2173708288s  5860533167s  3686824880s  logical   ext4         raid

(parted) quit

正如我們在這裡看到的,sdb 有一個 msdos 類型的分區表,這意味著我們最多可以在磁碟上創建 4 個主分區。在這種情況下,它有 3 個主分區 (1,2,3) 和一個擴展 (4),其中包含一個邏輯分區 (5)。

下一步是在 sda 上創建相同的分區:

# parted /dev/sda
(parted) unit s
(parted) mkpart primary 2048 25167872
(parted) mkpart primary 25169920 26218496
(parted) mkpart primary 26220544 2173704192
(parted) mkpart extended 2173706240 5860533167
(parted) mkpart logical 2173708288 5860533167
(parted) quit

如您所見,我使用了來自 sdb 的相同開始和結束扇區,當然磁碟是相同的,否則您需要相應地安排扇區。

現在我們需要告訴系統 sda 中的分區變化:

# partprobe /dev/sda

最後,我們需要在 sda 上創建文件系統。可能根本不需要這一步,因為我們要從 sdb 複製分區,所以複製過程也會復製文件系統資訊,但它不會受到傷害。

# mkfs -t ext3 /dev/sda2
# mkfs -t ext4 /dev/sda3
# mkfs -t ext4 /dev/sda5

請注意,我們沒有在分區 4 (sda4) 中創建文件系統。這是因為它是一個擴展分區,其中包含一個邏輯分區(sda5),我們只需在邏輯分區上創建文件系統。

現在我們已經對 sda 進行了分區並準備好保存我們的數據。

3. 從 sdb 複製數據。

這一步需要最多的研究,主要是因為有很多方法可以複製數據。可能 cp -a 就足夠了,但是,我沒有找到任何關於如何處理任何隱藏文件、連結等以正確引導系統的可靠資訊。所以我決定使用字節到字節的複制實用程序(複製)而不是文件複製命令。我使用的實用程序是 dd:

# dd if=/dev/md1 of=/dev/sda2 bs=512 conv=noerror,sync,notrunc
# dd if=/dev/md2 of=/dev/sda3 bs=512 conv=noerror,sync,notrunc
# dd if=/dev/md3 of=/dev/sda5 bs=512 conv=noerror,sync,notrunc

注意:首先請注意,我們是從 /dev/md* 複製而不是從 /dev/sdb* 複製。這是因為我們的 sdb 磁碟實際上是 RAID-1 陣列的一部分。那是我沒有找到任何可靠資訊的另一部分。例如,系統“看到”/dev/sdb2、/dev/sdb3 和 /dev/sdb5 是保存我們數據的分區,但根據 /etc/fstab 文件,它會掛載 /dev/md1、/dev/md2 和/dev/md3 所以我認為最好從 /dev/md* 複製。您需要注意的另一件事是您將在 sda 上複製數據的位置。換句話說,需要複製 sda /dev/md1,2,3 的位置。好吧,在這種情況下,根據分區大小和文件系統很容易找到它,但是在不同的系統中df -k可以顯示,但不能從救援模式內部顯示;您需要正常啟動才能正常工作。

最後,通過上述命令,我們指示 dd 逐字節單獨複製每個分區,而不會停止任何讀取錯誤(noerror 參數)。如果 sdb 上存在任何讀取數據錯誤(在這種情況下),這當然可能導致系統無法啟動,但是,在我最終使用 dd 之前,我確實使用了一些技術來查找受影響的文件以及它是否安全繼續複製。此任務超出了此答案的範圍,但這裡是一個很好的起點。

另一個重要的關注點是塊大小參數(bs)。根據 dd 的文件,您應該將 bs 設置為 512 字節,因為如果出現讀取錯誤,它只會“銷毀”目標磁碟中的 512 字節而不是更大的區域,但過程會更慢。同樣,我沒有找到任何關於此的可靠資訊,並且可能 4096 字節的塊大小會產生相同的結果。

最後, dd 在其操作期間不會產生任何輸出,並且由於分區的大小,它需要相當長的時間才能完成。如果你想看看它在哪裡,你應該打開一個新的控制台會話(在我的例子中是一個新的 ssh 遠端會話,因為我正在遠端執行此操作)並發出命令:

# kill -USR1 $(pidof dd)

這將強制 dd 在第一個控制台會話中列印其目前進度。

4. 使 sda 可啟動。

這很簡單。首先,您需要在 sda 上掛載必要的掛載點:

# mount -t ext4 /dev/sda3 /mnt
# mount -t proc proc /mnt/proc
# mount -t sysfs sys /mnt/sys
# mount -o bind /dev /mnt/dev
# mount -t ext3 /dev/sda2 /mnt/boot

注意:如果您的系統中沒有單獨的 /boot 分區,則不需要最後一個命令。

接下來你需要成為 /dev/sda 磁碟上的 root,現在你是救援系統的 root。

# chroot /mnt /bin/bash

接下來我們需要更新我們的 etc/mtab 文件。我真的不知道我們為什麼要這樣做,我在另一個救援教程中找到了它,沒有解釋。

# grep -v rootfs /proc/mounts > /etc/mtab

接下來我們需要在 sda 中安裝 GRUB。

# grub-install --recheck /dev/sda

輸出:

Probing devices to guess BIOS drives. This may take a long time.
Installation finished. No error reported.

現在我們已經準備好啟動 sda,但是還有幾個步驟可以讓系統知道從 sda 啟動後在哪裡可以找到必要的文件。

首先是編輯**/boot/grub/grub.conf文件,這是 GRUB 將讀取的文件,以了解它將如何進行。在我的情況下,我必須用“root (hd0,1)”替換每個****“root (hd0,0)”實例,用“/dev/sda3”替換每個“/dev/md2”**實例。

grub.conf特別是對於以前沒有使用過它的人來說,可能會非常混亂。最令人困惑的部分是 root 參數,在 grub 中,root 這個詞有兩種不同的含義。當它顯示為“root (hd0,1)”時,它會告訴 grub 它的根目錄在哪裡,以便找到所需的 linux 核心以及如何引導它們的說明。許多人在完全啟動時將它與系統上的根目錄“/”混淆,但這裡 grub 需要的是 /boot 目錄在哪裡。在這種情況下,我有一個單獨的分區 (/dev/sda2) 保存 /boot 目錄,因為 /dev/sda2 是第一個磁碟的第二個分區,我需要準確地告訴 grub,但從零開始(第一個分區為 0,第二個為 1 以此類推),所以命令“root (hd0,1)”

當 root 顯示為“/dev/”時,它告訴核心文件系統的根將在哪裡,即係統完全啟動時的“/”。所以在這種情況下,我們輸入“/”所在的分區名稱(如 linux 所見),在我的例子中是 /dev/sda3。

最後,我們需要編輯**/etc/fstab**文件,以便告訴系統要掛載什麼以及何時啟動。

在我的情況下,我必須用對應的“/dev/sda*”分區替換所有“/dev/md*”條目,這些分區是:

/dev/md1 --> /dev/sda2 /dev/md2 --> /dev/sda3 /dev/md3 --> /dev/sda5

5. 驗證並禁用從 sdb 引導。

如果你像我一樣有強迫症,那麼你可能想跑步

# file -s /dev/sda

查看 grub 是否安裝在 sda 上。如果你得到如下輸出:

/dev/sda: sticky x86 boot sector; GRand Unified Bootloader, stage1 version 0x3, stage2 address 0x2000, stage2 segment 0x200, GRUB version 0.94;

然後 grub (GRand Unified Bootloader) 安裝在 sda 上。

儘管沒有必要,您可能希望從 sdd 中刪除 grub。我這樣做是因為如果上述配置有問題,那麼系統將從 sdb 啟動,這可能會造成混淆。為了從 sdb 中刪除 grub,我使用了 dd:

# dd if=/dev/zero of=/dev/sdb bs=446 count=1

這會將零寫入磁碟的前 446 個字節,這是 grub 駐留在具有 msdos 分區表的磁碟中的位置。

$ file -s /dev/sdb

這將檢查 grub 是否已被刪除。

6. 退出 chroot 並解除安裝所有內容。

# exit
# umount /mnt/boot
# umount /mnt/dev
# umount /mnt/sys
# umount /mnt/proc
# umount /mnt

如果在執行上述命令的過程中出現任何錯誤,這意味著我們的 chroot 會話沒有完成或出錯,我們可能需要重新開始。

7. 重啟。

現在交叉手指並重新啟動

# reboot

如果您設法使用您的原始 root 憑據登錄到伺服器並且一切正常(數據庫、網站等),那麼您已成功從 sda 啟動。

8. 準備 sdb 進行替換。

在我的情況下,我想在請求支持替換它之前從 sdb 中刪除所有數據。此外,我需要從系統中完全刪除 RAID 配置,以便在新磁碟就位時從頭開始建構一個新配置。我首先執行 parted 來刪除分區:

# parted /dev/sdb
# (parted) rm 5
# (parted) rm 4
# (parted) rm 2
# (parted) rm 2
# (parted) rm 1
# (parted) quit

然後我注意到每個 RAID 配置也被刪除了,所以我假設 RAID 定義在分區內,所以我沒有對此進行任何進一步的操作。然後我保護了已擦除的 sdb。有很多方法可以做到這一點。我從這裡選擇了/dev/urandom方法

引用自:https://serverfault.com/questions/726563