CentOS 6.7 完全刪除 RAID。關閉磁碟並從 /dev/sda 啟動

CentOS 6.7 完全刪除 RAID。關閉磁碟並從 /dev/sda 啟動

我對 Linux 完全陌生。我繼承了位於德國某處的專用伺服器。作業系統是 CentOS 版本 6.7(最終版)64 位元。該伺服器有兩個 3TB 磁碟,採用軟體 RAID-1 配置。我正在處理的情況是,根據 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>

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

謝謝。

答案1

首先,需要明白,這並不是要更換 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.conffile 是 GRUB 將讀取的文件,以了解它將如何繼續。就我而言,我必須更換每個“根(hd0,0)”實例與“根(hd0,1)”和每一個“/dev/md2”實例與「/dev/sda3」。

grub設定檔可能會非常令人困惑,尤其是對於以前沒有使用過它的人來說。最令人困惑的部分是 root 參數,在 grub 中 root 這個字有兩種不同的意思。當它顯示為「root (hd0,1)」時,它告訴 grub 其根目錄在哪裡,以便找到所需的 Linux 核心以及如何引導它們的說明。許多人將其與系統完全啟動時的根「/」目錄混淆,但 grub 這裡需要的是 /boot 目錄所在的位置。在這種情況下,我有一個單獨的分割區(/dev/sda2),它保存/boot目錄,因為/dev/sda2是第一個磁碟的第二個部分,我需要準確地告訴grub這一點,但從零開始(第一個分割區是0,第二個是1等等),所以指令「root(hd0,1)」告訴grub它將在第一個磁碟的第二個分割區上找到它所需要的文件。

當 root 顯示為「/dev/」時,它告訴核心檔案系統的根目錄在哪裡,也就是係統完全啟動時的「/」。因此,在本例中,我們輸入分區名稱(如 linux 所見),其中「/」所在的位置,在我的例子中為 /dev/sda3。

最後我們需要編輯/etc/fstab文件以告訴系統要安裝什麼以及何時啟動。

就我而言,我必須將所有“/dev/md*”條目替換為對應的“/dev/sda*”分割區,其中:

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

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

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

# file -s /dev/sda

看看 sda 上是否安裝了 grub。如果您得到以下輸出:

/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

這將寫入磁碟的 0 到前 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方法來自這裡

答案2

最好不要嘗試這樣做,而是重新開始或其他什麼。當我剛接觸 Linux 時,我不會嘗試這樣做。

話雖這麼說,您所需要做的就是分割區並將 /dev/sda 新增回 raid 陣列,重建後,替換 /dev/sdb。確保 grub 位於兩個磁碟上,並且 BIOS 在開機時會嘗試兩個磁碟。

相關內容