當我卸下硬碟驅動器時,Debian 軟體 RAID1 不工作
我整個週末都在嘗試讓 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 支持,我也可以簡單地從分區掛載文件系統,就好像沒有突襲。但如果它現在對你有用,最好保持現狀。