Mdadm

在 GPT 磁碟上建構並遷移到軟體 raid (mdadm),現在無法組裝陣列

  • March 31, 2012

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/sdadd if=/dev/zero of=/dev/sda bs=1M。然後用於gdisk重新創建分區。
  • 僅使用sda. 在其中創建一個文件系統,並將您的數據複製到其中。
  • 拆卸正在使用的陣列sdb1,並徹底擦除/dev/sdbdd if=/dev/zero of=/dev/sdb bs=1M。然後用於gdisk重新創建分區。
  • 添加/dev/sdb1到新數組並讓它同步。

至於安裝 GRUB,這取決於您的機器是否支持 EFI(以及您是否使用它進行引導)。如果你使用 EFI,你需要在某處做一個 EFI 系統分區;它應該是大約 100MB,格式化為 FAT32。然後您將安裝 EFI 版本的 GRUB。我不會對此進行太多詳細介紹;EFI 引導是一個單獨問題的主題。

如果您使用 EFI 引導,則需要在要安裝 GRUB 的磁碟上的某個位置創建一個“BIOS 引導”分區。(這是 中的分區類型程式碼ef02gdisk)分區可以很小;1MB 足夠了。GRUB 將使用它來儲存它寫入 MBR 磁碟上扇區 1 到 62 的引導程式碼。(在 MBR 磁碟上,這些扇區通常是未分配的,因為第一個分區通常從扇區 63 開始,但在 GPT 磁碟上,分區表位於該區域。)GRUB 應該會自動注意到您正在將其安裝到的磁碟包含一個 BIOS 引導分區,並將其引導程式碼放在那里而不是扇區 1-62。

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