Debian

當我卸下硬碟驅動器時,Debian 軟體 RAID1 不工作

  • December 16, 2015

我整個週末都在嘗試讓 RAID 在一台舊的伺服器電腦上執行,該電腦使用 Intel ICH7 / ICH7-R SATA-II 控制器執行帶有 RAID 1 的雙硬碟驅動器。

在放棄硬體襲擊之後,我轉向了軟體。

目前,系統可以從兩個驅動器正常啟動,並且可以從 sdb 正常啟動,但是當我嘗試啟動 sda 時,我會在黑屏上看到一個閃爍的游標。

我的意思是物理移除驅動器。我刪除了一個驅動器,啟動並且它可以工作。更換那個驅動器,然後刪除另一個,啟動它不起作用。

我的猜測是我沒有在 sda 上正確安裝 GRUB。

我移除了 sdb 硬碟,並將安裝盤引導至恢復模式。然後我掛載 RAID 卷,並進入 shell。

首先,我將嘗試我遵循的軟體 RAID教程告訴我要做的事情:

# grub
grub> device (hd0) /dev/sda

grub> root (hd0,0)
Filesytem type is ext2fs, partition type 0xfd

grub> setup (hd0)
Checking if "/boot/grub/stage1" exists ... no
Checking if "/grub/stage1" exists ... no

Error 2: Bad file or directory type

所以我嘗試了一些不同的東西:

打字時:

grub-install /dev/sda

我明白了

Searching for the GRUB installation directory ... found: /boot/grub
The file /boot/grub/stage1 not read correctly.

我正在使用 ext4 分區。

接下來我應該嘗試什麼?

編輯:

這是輸出fdisk -l

root@debian:~# fdisk -l

   Disk /dev/sda: 153.4 GiB, 164696555520 bytes, 321672960 sectors
   Units: sectors of 1 * 512 = 512 bytes
   Sector size (logical/physical): 512 bytes / 512 bytes
   I/O size (minimum/optimal): 512 bytes / 512 bytes
   Disklabel type: dos
   Disk identifier: 0x8225e6c2

   Device     Boot   Start       End   Sectors   Size Id Type
   /dev/sda1  *       2048    194559    192512    94M fd Linux raid autodetect
   /dev/sda2        194560   4194303   3999744   1.9G fd Linux raid autodetect
   /dev/sda3       4194304 321671167 317476864 151.4G fd Linux raid autodetect

   Disk /dev/sdb: 153.4 GiB, 164696555520 bytes, 321672960 sectors
   Units: sectors of 1 * 512 = 512 bytes
   Sector size (logical/physical): 512 bytes / 512 bytes
   I/O size (minimum/optimal): 512 bytes / 512 bytes
   Disklabel type: dos
   Disk identifier: 0x3cfa42ad

   Device     Boot   Start       End   Sectors   Size Id Type
   /dev/sdb1  *       2048    194559    192512    94M fd Linux raid autodetect
   /dev/sdb2        194560   4194303   3999744   1.9G fd Linux raid autodetect
   /dev/sdb3       4194304 321671167 317476864 151.4G fd Linux raid autodetect

   Disk /dev/md2: 151.3 GiB, 162413936640 bytes, 317214720 sectors
   Units: sectors of 1 * 512 = 512 bytes
   Sector size (logical/physical): 512 bytes / 512 bytes
   I/O size (minimum/optimal): 512 bytes / 512 bytes
   Disk /dev/md0: 93.9 MiB, 98435072 bytes, 192256 sectors
   Units: sectors of 1 * 512 = 512 bytes
   Sector size (logical/physical): 512 bytes / 512 bytes
   I/O size (minimum/optimal): 512 bytes / 512 bytes
   Disk /dev/md1: 1.9 GiB, 2046820352 bytes, 3997696 sectors
   Units: sectors of 1 * 512 = 512 bytes
   Sector size (logical/physical): 512 bytes / 512 bytes
   I/O size (minimum/optimal): 512 bytes / 512 bytes

這是輸出 mdadm --detail --scan

ARRAY /dev/md/2 metadata=1.2 name=repeater:2 UUID=cd8443a8:ca0b3a29:05496e49:b063704f
ARRAY /dev/md/0 metadata=1.2 name=repeater:0 UUID=c8a204e2:3e5a5e2c:50a136c7:d43777a7
ARRAY /dev/md/1 metadata=1.2 name=repeater:1 UUID=25bebb1e:c7f3245d:128bee5d:d58d9100

這是輸出lsblk

NAME    MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
fd0       2:0    1     4K  0 disk  
sda       8:0    0 153.4G  0 disk  
├─sda1    8:1    0    94M  0 part  
├─sda2    8:2    0   1.9G  0 part  
└─sda3    8:3    0 151.4G  0 part  
 └─md2   9:2    0 151.3G  0 raid1 /
sdb       8:16   0 153.4G  0 disk  
├─sdb1    8:17   0    94M  0 part  
│ └─md0   9:0    0  93.9M  0 raid1 /boot
├─sdb2    8:18   0   1.9G  0 part  
│ └─md1   9:1    0   1.9G  0 raid1 [SWAP]
└─sdb3    8:19   0 151.4G  0 part  
sr0      11:0    1  1024M  0 rom 

編輯2:這是輸出 cat /proc/mdstat

root@debian:~# cat /proc/mdstat
Personalities : [raid1] 
md1 : active (auto-read-only) raid1 sdb2[1]
     1998848 blocks super 1.2 [2/1] [_U]

md0 : active raid1 sdb1[1]
     96128 blocks super 1.2 [2/1] [_U]

md2 : active raid1 sda3[0]
     158607360 blocks super 1.2 [2/1] [U_]
     bitmap: 2/2 pages [8KB], 65536KB chunk

unused devices: <none>

從您的 lsblk 輸出和 /proc/mdstat 中,我看到您的所有 RAID 都已降級。見[_U][U_]?在每個 RAID 中,僅填充一行(標有U),另一行未填充(標有_)。

所以,看起來我的猜測是正確的:你只有一個驅動器上有正常的 /boot 文件系統,現在稱為 sdb。您的 sda 有一個用於同一事物的分區,但該分區似乎不包含有效且正確填充的引導文件系統。

如果你確定你的兩個驅動器都很好,你可以將它們重新添加到突襲中。您需要從未使用的分區中擦除 md raid 超級塊。如果您嘗試擦除活動驅動器上的標籤,mdadm 工具會報錯,但仍然值得仔細檢查您的命令。根據您的 /proc/mdstat 和 fdisk 輸出,我們推斷:

  • md0 (boot) 應該在 sda1 和 sdb1 上,但只有 sdb1 工作。
  • md1 (swap) 應該在 sda2 和 sdb2 上,但只有 sdb2 工作。
  • md2 (root) 應該在 sda3 和 sdb3 上,但只有 sda3 在工作——這很奇怪,這是在另一個磁碟上。

要從 sda1、sda2、sdb3(目前全部未使用)中擦除標籤,請使用:

mdadm --zero-superblock /dev/sda1
mdadm --zero-superblock /dev/sda2
mdadm --zero-superblock /dev/sdb3

它可能會抱怨一些事情,您可能需要在命令中添加 –force ,但我認為這沒有必要。我再說一遍,仔細檢查一切,只在未使用的設備上擦除突襲標記!

然後,將這些未使用的設備添加到它們的陣列中:

mdadm --add /dev/md0 /dev/sda1
mdadm --add /dev/md1 /dev/sda2
mdadm --add /dev/md2 /dev/sdb3

它將在後台開始重新同步。另請注意,它將檢測所有陣列使用相同的設備,因此它會延遲 md2 重新同步,直到 md1 完成。您將在 /proc/mdstat 中看到重新同步進度。

當重新同步完成時,/proc/mdstat 中的所有設備都會[UU]在它們之後,表明這些陣列處於最佳狀態。

您的 /boot 有效,因此 sdb1 包含正確填充的文件系統。當您的 /boot md0 處於最佳狀態時,我們可以說, sda1 現在具有相同的數據(只有超級塊略有不同,因為同一陣列中的不同支持設備具有不同的行號)。您可以手動重新安裝 grub:

device (hd0) /dev/sda
root (hd0,0)
setup (hd0)

我強烈建議您將 mdadm 設置為定期進行陣列檢查(例如,每週一次或每月一次),以便及早發現驅動器讀取錯誤。我曾經解決過一個問題,當兩個raid驅動器上都有壞塊(在不同的地方)時,定期檢查可以通過儘早彈出故障驅動器來避免這個問題,即使壞塊位於文件系統中很少使用的部分。那很棘手。要開始檢查,請執行

echo "check" >> /sys/block/md127/md/sync_action

並在 dmesg 和 mdmon 日誌中查找錯誤。

不要簡單地將引導文件系統 dd 到其他設備。具有相同標籤和相同 UUID 的兩個文件系統不是正常狀態。這在恢復或其他取證過程中是允許的,但對於正常執行的 /boot 則不允許。Ubuntu 通過 UUID 掛載分區(檢查 /etc/fstab),你會猜到,下次會掛載哪一個?沒辦法說,這是隨機的,但這東西不應該是隨機的。

核心中的 md 程式碼在某種程度上阻止了對 raid 支持設備的訪問,因此當它們在 raid 中時,系統只能看到 md0,這是一個單獨的設備,您不會有問題。

為了在兩個磁碟上保持非 RAID /boot,您基本上需要在每次更新引導時複製文件系統,然後總是更改 UUID 和標籤。這是容易出錯且不方便的。將 /boot 設置為 RAID1 是正常的。

我更喜歡為 /boot 使用元數據 1.0,因為在這種情況下,元數據放置在設備的末尾,所以即使我沒有 raid 支持,我也可以簡單地從分區掛載文件系統,就好像沒有突襲。但如果它現在對你有用,最好保持現狀。

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