简化的问题:我如何让mdadm识别GPT分区?
我一直在试图转换/复制我的Ubuntu 11.10操作系统从一个单一的驱动器到软件RAID 1.我以前做过类似的事情,但在这种情况下,我添加了一个已经configuration为GPT的驱动器,我试图在没有充分研究这些影响的情况下如何工作。
目前,我有一个非启动mdadm RAID 1arrays的/ dev / md127(分配的操作系统,它不断拾起)。 我正在从现场USB钥匙启动,目前系统救援CD从sysresccd。 虽然gdisk和parted可以看到所有的分区,但大多数的OS实用程序不包括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
历史:
要点A:原来的操作系统安装在sda上(实际上是/ dev / sda6)。 我用Ubuntu的生活USB添加SDB。 我得到了有关GPT的fdisk的警告,所以我使用gdisk创build了一个raid分区(sdb1)和mdadm来创build一个缺less驱动器的raid1镜像。 我有很多问题得到这个工作(包括无法得到grub安装),但我最终得到它启动使用sda和/ dev / md127closuressdb的grub。 所以在A点,我把sda6的操作系统拷贝到了sdb的md127上。 然后我启动进入救援模式,并试图获得一个引导程序到SDB,失败。 然后我发现我的错误:我已经安装了RAID而不是SDB1,基本上覆盖了SDB1分区。
要点B:我现在有两份数据 – 一份在md127 / sdb上,一份在sda上。 我销毁了sda上的数据,并在sda上创build了一个新的GPT表。 然后,我为RAIDarrays创build了sda1,为暂存分区创build了sda2。 我将sda1添加到raidarrays中并让它重build。 md127现在覆盖了/ dev / sdb和/ dev / sda1作为完全活动和同步。
要点C:我重新启动到Linux救援再次,仍然能够访问RAIDarrays。 然后,我从数组中删除了/ dev / sdb,并为raid创build了/ dev / sdb1。 我将sdb1添加到数组,并让它同步。 我能够装载和访问/ dev / md127没有问题。 完成后,/ dev / sda1和/ dev / sdb1都是GPT分区并正在同步。
POINT D(当前):我再次重新启动testing数组是否会启动,grub加载失败。 我从我的实时拇指驱动器启动,发现我不能再组装RAIDarrays。 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内核就是这样。 软件RAIDarrays不需要知道或关心磁盘使用什么types的分区,因为它只是使用内核为分区提供的块设备。 我在几台计算机上的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组件,但是由于你的故事漫长而充满曲折,我怀疑可能有点事情发生了,你没有意识到发生了。 我现在的build议是:
/dev/sdb1以降级模式组装arrays。 检查它是否包含你的数据; 如果没有,检查/dev/sda1是否包含一个完整的文件系统与您的数据,否则我希望你有一个备份。 /dev/sda : dd if=/dev/zero of=/dev/sda bs=1M 。 然后使用gdisk重新创build分区。 sda上的分区创build一个新的降级arrays。 在其中创build文件系统,然后将数据复制到其中。 sdb1的数组,并完全擦除/dev/sdb : dd if=/dev/zero of=/dev/sdb bs=1M 。 然后使用gdisk重新创build分区。 /dev/sdb1添加到新arrays并让它同步。 至于安装GRUB,取决于您的机器是否支持EFI(以及是否使用它进行引导)。 如果您正在使用EFI,则需要在某处创buildEFI系统分区; 它应该是大约100MB,格式化的FAT32。 然后你会安装GRUB的EFI版本。 我不会在这方面进行太多的细节。 EFI启动是一个单独的问题的主题。
如果您不使用EFI引导,则需要在要安装GRUB的磁盘上的某个位置创build一个“BIOS引导”分区。 (这是gdisk分区types代码ef02 )分区可能很小, 1MB是很多。 GRUB将使用它来存储它将写入MBR磁盘上扇区1到62的引导代码。 (在MBR磁盘上,这些扇区通常是未分配的,因为第一个分区通常从扇区63开始,但在GPT磁盘上,分区表位于该区域。)GRUB应该会自动注意到您要安装的磁盘包含一个BIOS引导分区,并将其引导代码放在那里,而不是在扇区1-62。