![Ubuntu 22.04 LTS 在对多个 RAID 进行 RAID 重新检查时冻结](https://linux22.com/image/1189254/Ubuntu%2022.04%20LTS%20%E5%9C%A8%E5%AF%B9%E5%A4%9A%E4%B8%AA%20RAID%20%E8%BF%9B%E8%A1%8C%20RAID%20%E9%87%8D%E6%96%B0%E6%A3%80%E6%9F%A5%E6%97%B6%E5%86%BB%E7%BB%93.png)
我在一台机器上运行 Ubuntu 22.04,该机器有三个不同大小和几何形状的软件 RAID,其中两个(称为md5
和md6
)非常大。由于某些原因,这些阵列之间共享磁盘。
每个月cron
都会自动重新检查软件 RAID 阵列。由于共享磁盘,每次只能运行三个 RAID 检查中的一个,其他检查将自动暂停。此外,重新检查每天只运行六个小时,但我不知道如何确定这六个小时时间窗口的开始时间。
md6
第二天重新检查时,挂载的文件系统冻结md6
了。所有读写文件系统的进程和线程都陷入了“不可中断的睡眠”状态。强制卸载或强制拆卸阵列也是不可能的,所以我必须重新启动才能再次访问我的数据。除了有效的 DOS 之外,似乎没有数据丢失。
从日志中,我看到了以下情况:第一天,所有三个数组的检查同时启动。最小的数组,,md1
赢得了最先被检查的竞争,而md5
和md6
必须等待。md1
在不到十分钟的时间内完成,然后md6
继续直到第一天结束。
第二天,md5
(不是已经开始的!)赢得了接受检查的比赛。六个小时后,当天的md6
检查被中断。显然,几毫秒后收到了“运行”命令,开始运行,却在开始的同一秒内收到了 6 小时的停止。md5
md6
在对 进行超快速的启动和停止检查后md6
,md6
系统冻结。日志中的第一个迹象是警告,表明写入文件系统日志的尝试已被阻止超过两分钟:
以下是日志的相关部分(“M”是机器的名称):
Sep 4 08:23:59 M root: mdcheck start checking /dev/md1
Sep 4 08:23:59 M kernel: [1682166.084604] md: data-check of RAID array md1
Sep 4 08:24:00 M root: mdcheck start checking /dev/md5
Sep 4 08:24:00 M kernel: [1682167.725977] md: delaying data-check of md5 until md1 has finished (they share one or more physical units)
Sep 4 08:24:00 M root: mdcheck start checking /dev/md6
Sep 4 08:24:00 M kernel: [1682167.758063] md: delaying data-check of md6 until md5 has finished (they share one or more physical units)
Sep 4 08:33:23 M kernel: [1682730.686726] md: md1: data-check done.
Sep 4 08:33:23 M kernel: [1682730.697864] md: data-check of RAID array md6
Sep 4 08:33:23 M kernel: [1682730.697864] md: delaying data-check of md5 until md6 has finished (they share one or more physical units)
Sep 4 08:34:01 M root: mdcheck finished checking /dev/md1
Sep 4 14:24:02 M root: pause checking /dev/md5 at 0
Sep 4 14:24:03 M kernel: [1703770.476375] md: md6: data-check interrupted.
Sep 4 14:24:03 M root: pause checking /dev/md6 at 5702160936
Sep 4 14:24:03 M systemd[1]: mdcheck_start.service: Deactivated successfully.
Sep 4 14:24:03 M systemd[1]: mdcheck_start.service: Consumed 1.957s CPU time.
Sep 4 20:03:05 M systemd[1]: mdmonitor-oneshot.service: Deactivated successfully.
Sep 5 07:02:14 M root: mdcheck continue checking /dev/md5 from 0
Sep 5 07:02:14 M kernel: [1763663.944043] md: data-check of RAID array md5
Sep 5 07:02:14 M root: mdcheck continue checking /dev/md6 from 5702160936
Sep 5 07:02:14 M kernel: [1763663.980271] md: delaying data-check of md6 until md5 has finished (they share one or more physical units)
Sep 5 13:02:26 M kernel: [1785276.510597] md: md5: data-check interrupted.
Sep 5 13:02:27 M kernel: [1785276.786479] md: data-check of RAID array md6
Sep 5 13:02:27 M root: pause checking /dev/md5 at 5824508144
Sep 5 13:02:27 M kernel: [1785276.795438] md: md6: data-check interrupted.
Sep 5 13:05:31 M kernel: [1785461.181277] INFO: task jbd2/md6-8:2495 blocked for more than 120 seconds.
Sep 5 13:05:31 M kernel: [1785461.181441] task:jbd2/md6-8 state:D stack: 0 pid: 2495 ppid: 2 flags:0x00004000
Sep 5 13:05:31 M kernel: [1785461.181742] md_write_start.part.0+0x174/0x220
Sep 5 13:05:31 M kernel: [1785461.181753] md_write_start+0x14/0x30
Sep 5 13:05:31 M kernel: [1785461.181781] md_handle_request+0x12d/0x1b0
Sep 5 13:05:31 M kernel: [1785461.181792] md_submit_bio+0x71/0xc0
Sep 5 14:44:14 M systemd[1]: mdmonitor-oneshot.service: Deactivated successfully.
由于/
和/home
文件系统位于未受影响的 RAID 上,因此在 冻结之后我仍然可以登录md6
。cat /proc/mdstat
给出了以下信息:
Personalities : [raid1] [raid6] [raid5] [raid4] [linear] [multipath] [raid0] [raid10]
md5 : active raid5 sdd4[1] sdk4[2] sdh4[0] sdl4[4]
11415389184 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU]
bitmap: 0/29 pages [0KB], 65536KB chunk
md1 : active raid1 sdd3[0] sdk3[1] sdh3[3] sdl3[2]
100596736 blocks super 1.2 [4/4] [UUUU]
md6 : active raid6 sdd2[10] sdk2[9] sdh2[11] sdl2[8] sdg[5] sdf[4] sdb[1] sdc[2] sdi[6] sde[3] sdj[7] sda[0]
117186867200 blocks super 1.2 level 6, 512k chunk, algorithm 2 [12/12] [UUUUUUUUUUUU]
[====>................] check = 24.3% (2851080676/11718686720) finish=95845361544.0min speed=0K/sec
bitmap: 0/88 pages [0KB], 65536KB chunk
请注意,这/proc/mdstat
似乎以 1 kB 块的形式返回重新检查的位置,其中 2851080676 等于 5702161352 个扇区,距离syslog
前一天记录的 5702160936 个扇区仅差 416 个扇区(不到一个块!)。因此,我假设在启动并立即停止重新检查时出现死锁。
到目前为止,我的缓解措施是禁用自动 MD RAID 重新检查
答案1
你可能会遇到这个错误:https://bugs.launchpad.net/ubuntu/+source/linux-signed-hwe-5.11/+bug/1942935。这是一个上游内核错误,在 Linux v5.19 中会发布补丁来修复它。
从评论 10,您可以尝试这种解决方法(首先切换md1
到md5
/ md6
/等):
echo active | sudo tee /sys/block/md1/md/array_state