8 Star 0 Fork 14

src-openEuler / mdadm

 / 详情

【20.03-SP1】x86/arm 将系统安装在raid盘,message日志报错Process '/usr/sbin/mdadm -I /dev/vda1 失败

已验收
缺陷
创建于  
2020-12-09 20:49

【环境信息】
系统:x86_64/arm 虚拟机,物理机
转测20.03-LTS-SP1版本
【问题复现步骤】
使用命令mdadm -Cv /dev/md1 --metadata=1.0 -l1 -n2 -x0 /dev/sda /dev/sdb --size-50G --bitmap=none 构造raid盘
安装2.03-LTS-SP1版本到raid盘上
安装成功后重启系统
【预期结果】
/var/log/messages 日志打印正常
【实际结果】
打印有报错,必现
输入图片说明

评论 (8)

baizhilaoda 创建了缺陷
baizhilaoda 负责人设置为liuzhiqiang
baizhilaoda 关联分支设置为openEuler-20.03-LTS-SP1
baizhilaoda 计划开始日期设置为2020-12-09
baizhilaoda 计划截止日期设置为2020-12-15
baizhilaoda 置顶等级设置为
baizhilaoda 优先级设置为严重
baizhilaoda 关联仓库设置为src-openEuler/mdadm
Charlie_Li 优先级严重 修改为次要
展开全部操作日志

说明:raid的元数据信息在磁盘尾部生成元数据,所以在没有组装raid时,单盘也可以实现系统引导及启动。
启动流程梳理:
1)BIOS引导寻找磁盘的分区表头
2)BIOS发现该磁盘有EFI分区,则加载EFI
3)加载内核、挂载initramfs
4)加载initramfs中的软RAID驱动和配置文件,完成RAID组装 --》 需要确定当前配置方式时该步骤是否有相应配置?
5)挂载md设备及分区,并切换到md的文件系统
6)启动完成。
以上过程中,第1-4步,是在单硬盘(RAID成员盘)上完成的,具体是哪块磁盘,取决于BIOS的寻盘策略。
第4步中,如果RAID成员盘出现异常,导致组装RAID失败,此时RAID会处于降级模式,单盘生成md设备完成5~6步的过程。

猜测:
1.当前组装raid作为系统盘的方式并没有在initramfs中正确配置raid的信息,导致第4步时组装raid失败而触发remove的uevent事件。

@baizhilaoda 请提供更加详细的安装虚机和配置raid的流程,以方便后续分析

1)挂载iso镜像,从光驱启动进入安装欢迎界面按ctrl+Atl+F2 切换到命令行
2)执行下面命令
madam -Cv /dev/md1 --metadata=1.0 -l1 -n2 -x0 /dev/vda /dev/vdb --size=50G --bitmap=none
查看cat /proc/mdstat,等待raid创建完成
3)重启,从光驱启动,将系统安装到raid盘上

driver初始化:

sd_probe

->async_schedule_domain(sd_probe_async, sdkp, &scsi_sd_probe_domain);

​ ->sd_probe_async

​ -> sd_revalidate_disk

​ ->sd_read_write_protect_flag -> set_disk_ro_uevent//change udev事件

​ ->device_add_disk //添加disk信息到kernel list

​ ->__device_add_disk

​ ->register_disk // 注册disk信息

​ ->dev_set_uevent_suppress(ddev, 1); /* delay uevents, until we scanned partition table */

​ ->bdev = bdget_disk(disk, 0);// 获取分区0信息,Find partition @partno from @disk, do bdget() on it.

​ ->blkdev_get(bdev, FMODE_READ, NULL); //打开该block设备

​ ->while ((part = disk_part_iter_next(&piter))) {kobject_uevent(&part_to_dev(part)->kobj, KOBJ_ADD);} //遍历分区触发KOBJ_ADD udev事件

说明:
系统启动后scsi扫描发现硬盘信息,然后调用sd_probe该设备并上报,在执行sd_probe过程中会注册register_disk,测试md层还没有感知,所以在register_disk时会把它当做普通块设备处理,此时从设备的分区表中读取的分区号就会配合着该设备名构造出/dev/sdq1和/dev/sdq2分区,并触发KOBJ_ADD add事件,而由于/dev/sdq是先组raid然后再划分分区,所以此时触发/sbin/mdadm -I /dev/sdq1并不能组装/dev/md1,所以会报错误信息,但是这个错误并不影响功能。
正常识别会在/dev/sdq正常识别后会触发udev中的raid规则进行组装,相同的等识别到/dev/sdy后成功组装为/dev/md1

RAID1格式化后成员盘数据结构
图:RAID1格式化后成员盘数据结构

结论:非问题

简要小结:

  1. 在initramfs中加载scsi驱动识别到盘后会从scsi->scsi_device->scsi_generic->block,当添加盘到block时会遍历该block设备的所有分区(此时感知不到raid,所以就是sdq1和sdq2,而实际上分区是在组装raid后再划分的),并触发udev add规则。
  2. systemd-udevd守护进程感知到add规则,且当前设备类型是linux_raid_member,会触发raid组装的操作,此时使用/dev/sdq1和/dev/sdq2触发组装raid都无法成功的,所以出现了失败的告警。然后触发了remove的udev事件,事件同样无法正常执行mdadm -If的remove动作,所以出现了失败的告警。
    3.由于sdq是组成raid1的磁盘,在识别到sdq设备后会正常触发add udev规则,并正常执行mdadm -I组装md1,并可以在sdy正常识别到后成功完成md1的组装。
liuzhiqiang 任务状态待办的 修改为已完成
liuzhiqiang 置顶等级 修改为不置顶
baizhilaoda 任务状态已完成 修改为已验收

登录 后才可以发表评论

状态
负责人
项目
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
预计工期 (小时)
参与者(2)
5592035 liuzhiqiang26 1594357385
1
https://gitee.com/src-openeuler/mdadm.git
git@gitee.com:src-openeuler/mdadm.git
src-openeuler
mdadm
mdadm

搜索帮助