在 GPT 磁碟上建構並遷移到軟體 raid (mdadm),現在無法組裝陣列
mdadm、gpt 問題、無法辨識的分區。
簡化問題:如何讓 mdadm 辨識 GPT 分區?
我一直在嘗試將我的 Ubuntu 11.10 作業系統從單個驅動器轉換/複製到軟體 raid 1。我過去做過類似的事情,但在這種情況下,我添加了一個為 GPT 配置的驅動器,我試圖在沒有充分研究其影響的情況下使用它。
目前,我有一個 /dev/md127 的非引導 mdadm RAID 1 陣列(作業系統分配它並且它一直在拾取)。我正在啟動 live USB 密鑰,目前是來自 sysresccd 的 System Rescue CD。雖然 gdisk 和 parted 可以看到所有分區,但大多數作業系統實用程序不能,包括 mdadm。我的主要目標只是讓 raid 陣列可以訪問,這樣我就可以獲取數據並重新開始(不使用 GPT)。
/dev/md127 /dev/sda /dev/sda1 <- GPT type partition /dev/sda1 <- exists within the GPT part, member of md127 /dev/sda2 <- exists within the GPT part, empty /dev/sdb /dev/sdb1 <- GPT type partition /dev/sdb1 <- exists within the GPT part, member of md127
歷史:
POINT A:原始作業系統安裝在 sda 上(實際上是 /dev/sda6)。我使用了一個 Ubuntu live usb 來添加 sdb。我從 fdisk 收到有關 GPT 的警告,因此我使用 gdisk 創建了一個 raid 分區 (sdb1) 並使用 mdadm 創建了一個缺少驅動器的 raid1 鏡像。我在讓它工作時遇到了很多問題(包括無法安裝 grub),但我最終使用 sda 上的 grub 和 sdb 上的 /dev/md127 來啟動它。所以在 A 點,我已經將我的作業系統從 sda6 複製到了 sdb 上的 md127。然後我啟動到救援模式並嘗試將引導載入程序放到 sdb 上,但失敗了。然後我發現了我的錯誤:我將 raid 安裝到 sdb 而不是 sdb1,實際上覆蓋了 sdb1 分區。
要點 B:我現在有兩份數據副本——一份在 md127/sdb 上,一份在 sda 上。我銷毀了 sda 上的數據並在 sda 上創建了一個新的 GPT 表。然後我為 RAID 陣列創建了 sda1,為臨時分區創建了 sda2。我將 sda1 添加到 raid 陣列中並讓它重建。md127 現在將 /dev/sdb 和 /dev/sda1 覆蓋為完全活動和同步。
POINT C:我再次重新啟動到 linux rescue 並且仍然能夠訪問 raid 陣列。然後我從陣列中刪除 /dev/sdb 並為 raid 創建 /dev/sdb1。我將 sdb1 添加到數組中並讓它同步。我能夠毫無問題地安裝和訪問 /dev/md127。完成後,/dev/sda1 和 /dev/sdb1 都是 GPT 分區並正在主動同步。
POINT D(目前):我再次重新啟動以測試陣列是否會啟動並且 grub 無法載入。我啟動了我的 live 拇指驅動器,發現我無法再組裝 raid 陣列。mdadm 沒有看到所需的分區。
-- root@freshdesk /root % uname -a Linux freshdesk 3.0.24-std251-amd64 #2 SMP Sat Mar 17 12:08:55 UTC 2012 x86_64 AMD Athlon(tm) II X4 645 Processor AuthenticAMD GNU/Linux === /proc/partitions and parted look good: root@freshdesk /root % cat /proc/partitions major minor #blocks name 7 0 301788 loop0 8 0 976762584 sda 8 1 732579840 sda1 8 2 244181703 sda2 8 16 732574584 sdb 8 17 732573543 sdb1 8 32 7876607 sdc 8 33 7873349 sdc1 (parted) print all Model: ATA ST31000528AS (scsi) Disk /dev/sda: 1000GB Sector size (logical/physical): 512B/512B Partition Table: gpt Number Start End Size File system Name Flags 1 1049kB 750GB 750GB ext4 2 750GB 1000GB 250GB Linux/Windows data Model: ATA SAMSUNG HD753LJ (scsi) Disk /dev/sdb: 750GB Sector size (logical/physical): 512B/512B Partition Table: gpt Number Start End Size File system Name Flags 1 1049kB 750GB 750GB ext4 Linux RAID raid Model: SanDisk SanDisk Cruzer (scsi) Disk /dev/sdc: 8066MB Sector size (logical/physical): 512B/512B Partition Table: msdos Number Start End Size Type File system Flags 1 31.7kB 8062MB 8062MB primary fat32 boot, lba === # no sda2, and I double the sdb1 is the one shown in parted root@freshdesk /root % blkid /dev/loop0: TYPE="squashfs" /dev/sda1: UUID="75dd6c2d-f0a8-4302-9da4-792cc7d72355" TYPE="ext4" /dev/sdc1: LABEL="PENDRIVE" UUID="1102-3720" TYPE="vfat" /dev/sdb1: UUID="2dd89f15-65bb-ff88-e368-bf24bd0fce41" TYPE="linux_raid_member" root@freshdesk /root % mdadm -E /dev/sda1 mdadm: No md superblock detected on /dev/sda1. # this is probably a result of me attempting to force the array up, putting superblocks on the GPT partition root@freshdesk /root % mdadm -E /dev/sdb1 /dev/sdb1: Magic : a92b4efc Version : 0.90.00 UUID : 2dd89f15:65bbff88:e368bf24:bd0fce41 Creation Time : Fri Mar 30 19:25:30 2012 Raid Level : raid1 Used Dev Size : 732568320 (698.63 GiB 750.15 GB) Array Size : 732568320 (698.63 GiB 750.15 GB) Raid Devices : 2 Total Devices : 2 Preferred Minor : 127 Update Time : Sat Mar 31 12:39:38 2012 State : clean Active Devices : 1 Working Devices : 2 Failed Devices : 1 Spare Devices : 1 Checksum : a7d038b3 - correct Events : 20195 Number Major Minor RaidDevice State this 2 8 17 2 spare /dev/sdb1 0 0 8 1 0 active sync /dev/sda1 1 1 0 0 1 faulty removed 2 2 8 17 2 spare /dev/sdb1 === root@freshdesk /root % mdadm -A /dev/md127 /dev/sda1 /dev/sdb1 mdadm: no recogniseable superblock on /dev/sda1 mdadm: /dev/sda1 has no superblock - assembly aborted root@freshdesk /root % mdadm -A /dev/md127 /dev/sdb1 mdadm: cannot open device /dev/sdb1: Device or resource busy mdadm: /dev/sdb1 has no superblock - assembly aborted
mdadm 不辨識分區,Linux 核心可以。軟體 RAID 陣列不需要知道或關心磁碟使用什麼類型的分區,因為它只使用核心為分區提供的塊設備。我在幾台電腦上的 GPT 磁碟上使用 mdadm 陣列,它們工作正常。
您描述的分區佈局沒有意義:
/dev/sda /dev/sda1 <- GPT type partition /dev/sda1 <- exists within the GPT part, member of md127 /dev/sda2 <- exists within the GPT part, empty /dev/sdb /dev/sdb1 <- GPT type partition /dev/sdb1 <- exists within the GPT part, member of md127
特別是,看起來您說的
sda2
是位於sda1
. 其他分區中不存在分區,GPT是整盤設備的特性,不是分區。我認為您的實際意思是:/dev/sda <- GPT disk /dev/sda1 <- member of md127 /dev/sda2 <- empty /dev/sdb <- GPT disk /dev/sdb1 <- member of md127
但是,您的
blkid
輸出顯示/dev/sda1
目前包含 Ext4 文件系統,而不是 RAID 超級塊——它不是.md127
目前尚不清楚該文件系統是如何到達那裡的,因為您說您將它用作 RAID 組件,但是由於您的故事很長而且充滿曲折,我懷疑可能有些地方發生了您沒有意識到的事情發生了。在這一點上我的建議是:
- 僅使用 . 以降級模式組裝陣列
/dev/sdb1
。檢查它是否包含您的數據;如果沒有,請檢查/dev/sda1
您的數據是否以某種方式包含完整的文件系統,否則我希望您有備份。- 如果您還沒有數據,請備份所有數據。
- 徹底擦拭
/dev/sda
:dd if=/dev/zero of=/dev/sda bs=1M
。然後用於gdisk
重新創建分區。- 僅使用
sda
. 在其中創建一個文件系統,並將您的數據複製到其中。- 拆卸正在使用的陣列
sdb1
,並徹底擦除/dev/sdb
:dd if=/dev/zero of=/dev/sdb bs=1M
。然後用於gdisk
重新創建分區。- 添加
/dev/sdb1
到新數組並讓它同步。至於安裝 GRUB,這取決於您的機器是否支持 EFI(以及您是否使用它進行引導)。如果你使用 EFI,你需要在某處做一個 EFI 系統分區;它應該是大約 100MB,格式化為 FAT32。然後您將安裝 EFI 版本的 GRUB。我不會對此進行太多詳細介紹;EFI 引導是一個單獨問題的主題。
如果您不使用 EFI 引導,則需要在要安裝 GRUB 的磁碟上的某個位置創建一個“BIOS 引導”分區。(這是 中的分區類型程式碼
ef02
。gdisk
)分區可以很小;1MB 足夠了。GRUB 將使用它來儲存它會寫入 MBR 磁碟上扇區 1 到 62 的引導程式碼。(在 MBR 磁碟上,這些扇區通常是未分配的,因為第一個分區通常從扇區 63 開始,但在 GPT 磁碟上,分區表位於該區域。)GRUB 應該會自動注意到您正在將其安裝到的磁碟包含一個 BIOS 引導分區,並將其引導程式碼放在那里而不是扇區 1-62。