您可以更改现有阵列上的元数据版本吗?

您可以更改现有阵列上的元数据版本吗?

因此 grub 需要元数据版本 0.90。我想知道我是否可以更改现有阵列以使用该版本,而不是默认版本 1.2。这样我就不必重新安装。如果可以,我该怎么做?

答案1

GRUB 维基确认:

另外,(从 1.96+20080724 开始)GRUB 只能从使用版本 0.90 元数据超级块(即使用 mdadm 的 --metadata=0.90 选项创建的超级块)的 RAID 启动。

奇怪的是,mdadm 的手册页

-e,--元数据=

声明要使用的超级块(RAID 元数据)的样式。 --create 的默认值为 0.90,其他操作的默认值为 guess。

我会再检查一遍以mdadm -Q -D <device>确保无误。

之后,您运行的是哪种 RAID 级别?我能想到的镜像 (RAID 1) 的最佳方案是

  1. 进行备份
  2. 卸载阵列 0
  3. n从设备阵列 0 中删除设备 A
  4. 设备 A 上的零超级块
  5. 使用设备 A 和n-1备用设备创建阵列 1,明确使用旧的超级块格式
  6. 对剩余的 B 类n-1设备重复上述操作
  7. (可选)重新编号数组

... 但一定要检查您是否绝对需要完成此操作!

答案2

这些信息可能对于 OP 来说太晚了,但也许可以帮助其他人。

第一个命令会清除超级块,第二个命令会创建一个新阵列,但假设设备是干净的。我刚刚执行了此操作,一切似乎都正常。我绝对建议在执行此操作之前进行备份。我没有数据丢失,因此无需检查完整性。我只是想避免再进行 4 小时的重新同步。

$ mdadm --zero-superblock /dev/sd[a-z]1
$ mdadm --create /dev/md0 --assume-clean \
    --level=10 --raid-devices=10 /dev/sd[a-z]1 --metadata=0.90

答案3

按照上述建议创建一个具有假定干净和不一致元数据的阵列肯定有可能损坏现有数据,因为 0.90 和 1.2 元数据块不仅大小不同,而且位置也不同。

它可能适用于 0.90 <-> 1.0,这是一个例外。

https://raid.wiki.kernel.org/index.php/RAID_superblock_formats

答案4

我需要制作一个元数据=1.2 类型的 RAID 阵列 /dev/md3,由设备 /dev/sdb1 和 /dev/sdc1 组成,是一个元数据=0.90 的阵列,这是我所做的和建议:

首先,我创建了适合我的设置的挂载点(在开始适应你的情况之前,最好先阅读整个故事):

mkdir -p /mnt/md/3
mkdir -p /mnt/md/100

从 md3 中删除 sdc1 并将其安装为新的临时阵列:

umount /dev/md3
mdadm /dev/md3 --fail /dev/sdc1 --remove /dev/sdc1
mdadm --create --level=1 --raid-devices=2 --run /dev/md100 /dev/sdc1 missing
mount /dev/md100 /mnt/md/100

停止旧的 md3 阵列并使用 metadata==0.90 和新的文件系统创建新的 md3 阵列:

mdadm --stop /dev/md3
mdadm --create /dev/md3 --metadata=0.90 --level=1 --raid-devices=2 /dev/sdb1 missing
mkfs.ext4 /dev/md3

挂载它并将所有数据从临时阵列 md100 复制到 md3 (rsync 是一个很好的工具,因为它可以按原样复制符号链接,这样您就可以获得真正的副本;如果您想看看会发生什么,您可以将选项添加--progress到 rsync):

mount /dev/md3 /mnt/md/3
rsync -a /mnt/md/100/ /mount/md/3/

rsync 完成后,删除临时数组 md100 并将 sdc1 添加到新创建的 md3:

umount /dev/md100
mdadm --stop /dev/md100
mdadm /dev/md3 --add /dev/sdc1

就是这样。

cat /proc/mdstats

如果你愿意的话,你可以观看同步。

最后:备份始终是一件好事,您可以使用 md5sum 检查文件是否在所有操作之后保持不变 - 并注意将我的示例转化为您的情况。

相关内容