mdadm 软件 RAID 在 initramfs 阶段未在启动时组装

Sun*_*ong 5 linux boot udev raid1 systemd

首先,我更愿意提到我已经找到并阅读了这个

我正在使用标准 3.16 内核运行 Debian Jessie。我已经手动定义了一个 RAID1 阵列。但它不会在启动时自动组装。因此,在尝试挂载 /etc/fstab 中描述的 FS 后,systemd 会回退到某个降级的 shell。如果注释了 fstab 中的那一行,则引导过程会结束,但 RAID 阵列不可用。手动组装它不会触发任何错误。然后安装 FS 很简单。

手动组装时,数组如下所示:

root@tinas:~# cat /proc/mdstat 
Personalities : [raid1] 
md0 : active (auto-read-only) raid1 sdc1[0] sdd1[1]
      1953382464 blocks super 1.2 [2/2] [UU]
      bitmap: 0/15 pages [0KB], 65536KB chunk

unused devices: <none>
Run Code Online (Sandbox Code Playgroud)

这是 blkid 命令的摘录:

/dev/sdd1: UUID="c8c2cb23-fbd2-4aae-3e78-d9262f9e425b" UUID_SUB="8647a005-6569-c76f-93ee-6d4fedd700c3" LABEL="tinas:0" TYPE="linux_raid_member" PARTUUID="81b1bbfe-fad7-4fd2-8b73-554f13fbb26b"
/dev/sdc1: UUID="c8c2cb23-fbd2-4aae-3e78-d9262f9e425b" UUID_SUB="ee9c2905-0ce7-2910-2fed-316ba20ec3a9" LABEL="tinas:0" TYPE="linux_raid_member" PARTUUID="11d681e5-9021-42c0-a858-f645c8c52708"
/dev/md0: UUID="b8a72591-040e-4ca1-a663-731a5dcbebc2" UUID_SUB="a2d4edfb-876a-49c5-ae76-da5eac5bb1bd" TYPE="btrfs"
Run Code Online (Sandbox Code Playgroud)

来自 fdisk 的信息:

root@tinas:~# fdisk -l /dev/sdc

Disque /dev/sdc : 1,8 TiB, 2000398934016 octets, 3907029168 secteurs
Unités : secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 4096 octets
taille d'E/S (minimale / optimale) : 4096 octets / 4096 octets
Type d'étiquette de disque : gpt
Identifiant de disque : C475BEB1-5452-4E87-9638-2E5AA29A3A73

Device     Start        End    Sectors  Size Type
/dev/sdc1   2048 3907029134 3907027087  1,8T Linux RAID
Run Code Online (Sandbox Code Playgroud)

在这里,我不确定类型值是否正确“Linux RAID”,因为我已经读到 0xFD 是预期的,但该值似乎无法通过带有 GPT 分区表的 fdisk 获得。

谢谢你的帮助

编辑 :

journalctl -xb我可以找到一条痕迹:

Apr 14 15:14:46 tinas mdadm-raid[211]: Generating udev events for MD arrays...done.
Apr 14 15:35:03 tinas kernel: [ 1242.505742] md: md0 stopped.
Apr 14 15:35:03 tinas kernel: [ 1242.513200] md: bind<sdd1>
Apr 14 15:35:03 tinas kernel: [ 1242.513545] md: bind<sdc1>
Apr 14 15:35:04 tinas kernel: [ 1242.572177] md: raid1 personality registered for level 1
Apr 14 15:35:04 tinas kernel: [ 1242.573369] md/raid1:md0: active with 2 out of 2 mirrors
Apr 14 15:35:04 tinas kernel: [ 1242.573708] created bitmap (15 pages) for device md0
Apr 14 15:35:04 tinas kernel: [ 1242.574869] md0: bitmap initialized from disk: read 1 pages, set 0 of 29807 bits
Apr 14 15:35:04 tinas kernel: [ 1242.603079] md0: detected capacity change from 0 to 2000263643136
Apr 14 15:35:04 tinas kernel: [ 1242.607065]  md0: unknown partition table
Apr 14 15:35:04 tinas kernel: [ 1242.665646] BTRFS: device fsid b8a72591-040e-4ca1-a663-731a5dcbebc2 devid 1 transid 8 /dev/md0
Run Code Online (Sandbox Code Playgroud)

/proc/mdstat 我刚刚意识到在启动后没有加载 raid1 模块!

root@tinas:~# cat /proc/mdstat 
Personalities : 
unused devices: <none>
root@tinas:~# 
Run Code Online (Sandbox Code Playgroud)

因此,我将该raid1模块添加到/etc/modules,并发布了一个update-initramfs -u.

这是相应的日志:

avril 15 12:23:21 tinas mdadm-raid[204]: Generating udev events for MD arrays...done.
avril 15 12:23:22 tinas systemd-modules-load[186]: Inserted module 'raid1'
avril 15 12:23:22 tinas kernel: md: raid1 personality registered for level 1
Run Code Online (Sandbox Code Playgroud)

但是数组仍然没有组装:

root@tinas:~# cat /proc/mdstat 
Personalities : [raid1] 
unused devices: <none>
Run Code Online (Sandbox Code Playgroud)

那是不是因为raid1 模块似乎是在生成udev 事件之后加载的?

有趣的链接,但过于笼统

我试过dpkg-reconfigure mdadm:没什么新东西...

如果有人知道如何从 udev 获取一些痕迹,那就太好了。我取消注释该udev_log = info行,/etc/udev/udev.conf但看不到任何新内容...

搜索 fr raid 加载的模块

root@tinas:~# grep -E 'md_mod|raid1' /proc/modules
raid1 34596 0 - Live 0xffffffffa01fa000
md_mod 107672 1 raid1, Live 0xffffffffa0097000
Run Code Online (Sandbox Code Playgroud)

raid1 已加载,因为我将其添加到/etc/modules,否则,之前已加载。

用户名 -r

root@tinas:~# uname -r 
3.16.0-4-amd64
Run Code Online (Sandbox Code Playgroud)

/etc/mdadm/mdadm.conf

root@tinas:~# cat /etc/mdadm/mdadm.conf
# mdadm.conf
#
# Please refer to mdadm.conf(5) for information about this file.
#

# by default (built-in), scan all partitions (/proc/partitions) and all
# containers for MD superblocks. alternatively, specify devices to scan, using
# wildcards if desired.
#DEVICE partitions containers

# auto-create devices with Debian standard permissions
CREATE owner=root group=disk mode=0660 auto=yes

# automatically tag new arrays as belonging to the local system
HOMEHOST <system>

# instruct the monitoring daemon where to send mail alerts
MAILADDR root

# definitions of existing MD arrays
ARRAY /dev/md/0  metadata=1.2 UUID=a930b085:1e1a615b:93e209e6:08314607 name=tinas:0

# This configuration was auto-generated on Fri, 15 Apr 2016 11:10:41 +0200 by mkconf
Run Code Online (Sandbox Code Playgroud)

我只注意到一些奇怪:/etc/mdadm/madm.conf的最后一行是由命令自动生成mdadm -Es并显示一个名为设备的/ dev / MD / 0,而当我手工组装阵列,我得到的/ dev / md0的这我在创建数组时使用mdadm --create...

另外,我从详细信息中获得了这些信息update-initramsfs

Adding module /lib/modules/3.16.0-4-amd64/kernel/drivers/md/raid10.ko
I: mdadm: using configuration file: /etc/mdadm/mdadm.conf
I: mdadm: will start all available MD arrays from the initial ramdisk.
I: mdadm: use `dpkg-reconfigure --priority=low mdadm` to change this.
Run Code Online (Sandbox Code Playgroud)

因此,我尝试了它,但它只是失败了:重新启动后没有阵列。
在 /etc/mdadm/madm.conf 中,我将 ARRAY 设备名称从 /dev/md/0 更改为 ARRAY /dev/md0
我还注意到,在 initramfs busybox 中,在发出 mdadm --assemble --scan 之后,ARRAY 是创建为 /dev/md0 并将其标记为活动(自动只读)

星期日 17

我刚刚意识到initramfs 的东西。我知道内核正在使用一些 ram-disk 但不知道更多。我现在的理解是,这个 initramfs 应该包含在用户空间启动时组装RAID 阵列所需的所有数据。因此,重要的更新此静态文件/boot/initrd.img-版本,以反映所有更改这一问题。

所以我怀疑我的 /boot/initrd.img-3.16.0-4-amd64 文件很乱,并试图创建一个新的,发出这个命令:
# update-initramfs -t -c -v -k 3.16.0-4 -amd64
请注意,我只有一个内核,因此只有一个相应的 initramfs。

但是在重新启动后,我再次遇到了 initramfs shell,因为内核无法挂载 /etc/fstab 中使用的 /dev/md0 FS。

星期三 20

我已经在busybox中检查了服务器的状态:

  • 加载了 raid1 模块
  • dmesg 没有什么有趣的
  • /run/mdadm/map 存在但为空
  • journalctl -xb 显示:
    • systemd 报告尝试在尚未组装的阵列上挂载 FS 时超时
    • systemd 然后在尝试 fsck 该 FS 时报告依赖项失败

这是我的手动干预:

mdadm --assemble --scan
Run Code Online (Sandbox Code Playgroud)

/proc/mdstat声称设备 /dev/md0 是activeauto-read-only。所以我发出:

mdadm --readwrite /dev/md0
Run Code Online (Sandbox Code Playgroud)

在退出busybox之前。

小智 3

您可以使用 btrfs 本身镜像驱动器,而不是在软件 raid 之上创建该 fs: mkfs.btrfs -d raid1 /dev/sdc /dev/sdd

否则尝试:

    umount /dev/md0 if mounted
    mdadm --stop /dev/md0
    mdadm --assemble --scan
    mv /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.bak
    /usr/share/mdadm/mkconf > /etc/mdadm/mdadm.conf
Run Code Online (Sandbox Code Playgroud)

如果cat /proc/mdstat现在显示正确的输出,则创建文件系统并挂载它,使用blkid获取 /dev/md0 的 UUID 并相应地编辑 /etc/fstab 。

如果您仍然遇到问题,可以在继续执行上述说明之前尝试此操作:

    mdadm --zero-superblock /dev/sdc /dev/sdd
    mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdc1 /dev/sdd1
Run Code Online (Sandbox Code Playgroud)

我在运行带有 3.16.0-4-amd64 内核的 D​​ebian Jessie 的系统上对此进行了测试,并将 gpt 分区表写入了我镜像在一起的两个块设备。该阵列在启动时正确组装并按指定安装。