我在 Arch 盒子上的 USB 外壳中镜像了两个磁盘,创建了一个文件系统,挂载了它,复制了一堆数据。一切都很顺利。然后我等到 md 同步完成并重新启动...
#lsblk
sdd 8:48 0 7.3T 0 disk
`-sdd1 8:49 0 7.3T 0 part
`-md127 9:127 0 2.7T 0 raid1
sdf 8:80 0 2.7T 0 disk
`-sdf1 8:81 0 2.7T 0 part
`-md127 9:127 0 2.7T 0 raid1
sdg 8:96 0 2.7T 0 disk
`-sdg1 8:97 0 2.7T 0 part
(省略不相关的驱动器)
昨天,镜像设备是 sdd (2.7T) 和 sde (2.7T)。重启后,系统重新排序了设备,因此 USB 外壳中的驱动器现在是 sdd (2.7T) 和 sdg (2.7T),但 mdraid 决定使用 sdd (7.3T) 和 sdf (2.7T)。
一个搜索结果 (这里) 建议重建 initramfs,但使用的示例命令不适用于 arch。我尝试了我在 arch wiki 中找到的最佳猜测“mkinitcpio -p linux”。在此之后并重新启动,没有任何变化。不过,我对这个过程有点不确定,所以我可能执行不正确,或者它可能不是问题所在。
告诉 mdadm 每次重启后应该保留哪些驱动器的最佳方法是什么?我假设每次重启都会出于某种原因从这个 USB 外壳获得不同的设备顺序,所以我不能只对 /dev/sd* 设备进行硬编码。我以为 mdadm.conf 中列出的 UUID 和镜像驱动器上的超级块会神奇地处理这样的变化,但我显然错过了一个重要的步骤。
更多详情请见下文
$ uname -a
Linux zot 5.3.10-arch1-1 #1 SMP PREEMPT Sun, 10 Nov 2019 11:29:38 +0000 x86_64 GNU/Linux
$ lsb_release -a
LSB Version: 1.4
Distributor ID: Arch
Description: Arch Linux
Release: rolling
Codename: n/a
使用以下命令创建镜像卷:
# mdadm --misc --zero-superblock /dev/sdd1
# mdadm --misc --zero-superblock /dev/sde1
# mdadm --create --verbose --level=1 --metadata=1.2 --raid-devices=2 /dev/md/x /dev/sdd1 /dev/sde1
# mdadm --detail --scan >> /etc/mdadm.conf
# mdadm --assemble --scan
我绞尽脑汁试图计算创建文件系统的计算结果,可能应该忽略 arch wiki 的这一部分:
# mkfs.ext4 -v -L x -b 4096 -E stride=16,stripe-width=32 /dev/md/x
已安装驱动器 X:
# mount /dev/md/x /mnt/x
在同步时,将我的大量数据测试复制到 /mnt/x
一切正常,进入睡眠状态,花了几个小时完成同步,检查一切正常,然后重新启动。现在阵列存在并且看起来很健康,但不再有可安装的分区。
$ grep -v "^[#]" /etc/mdadm.conf
DEVICE partitions
ARRAY /dev/md/x metadata=1.2 name=zot:x UUID=94dfdaa8:c6a75958:5dedf8ff:6b1926bb
$ dmesg | grep md[0-9]
[ 19.975336] md/raid1:md127: active with 2 out of 2 mirrors
[ 20.017939] md127: detected capacity change from 0 to 3000456183808
# cat /proc/mdstat
Personalities : [raid1]
md127 : active raid1 sdf1[1] sdd1[0]
2930132992 blocks super 1.2 [2/2] [UU]
bitmap: 0/22 pages [0KB], 65536KB chunk
unused devices: <none>
# cat /proc/partitions
major minor #blocks name
<SNIPPED>
9 127 2930132992 md127
# mdadm --detail /dev/md/x
/dev/md/x:
Version : 1.2
Creation Time : Sun Nov 17 12:54:34 2019
Raid Level : raid1
Array Size : 2930132992 (2794.39 GiB 3000.46 GB)
Used Dev Size : 2930132992 (2794.39 GiB 3000.46 GB)
Raid Devices : 2
Total Devices : 2
Persistence : Superblock is persistent
Intent Bitmap : Internal
Update Time : Mon Nov 18 01:37:17 2019
State : clean
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0
Consistency Policy : bitmap
Name : zot:x (local to host zot)
UUID : 94dfdaa8:c6a75958:5dedf8ff:6b1926bb
Events : 15186
Number Major Minor RaidDevice State
0 8 49 0 active sync /dev/sdd1
1 8 81 1 active sync /dev/sdf1
# parted /dev/md/x print
Error: /dev/md/x: unrecognised disk label
Model: Linux Software RAID Array (md)
Disk /dev/md/x: 3000GB
Sector size (logical/physical): 512B/4096B
Partition Table: unknown
Disk Flags:
# mount /dev/md/x /mnt/x
mount: /mnt/x: wrong fs type, bad option, bad superblock on /dev/md127, missing codepage or helper program, or other error.
当前正在运行的适用进程是md和md127_raid1(/dev/md/x相当于/dev/md127)
(正是在此时我想到运行 lsblk,因此有了这篇文章开头的内容)