2391933_zh-CN

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

2391933_zh-CN

2391933_zh-CN

LSDK 25.12 udev 自动加载与 /boot/modules 布局的竞争


NXP团队您好,

我们使用的环境如下:

* 平台:i.MX8MP
* 发行版:Debian 13 / trixie
* LSDK 版本:LSDK-25.12_DEBIAN-13_LF-6.12.20
* 内核版本:6.12.20
* systemd / udev: 257.x
* kmod / libkmod:34.x

我们遇到了一个间歇性的冷启动问题,其中某些内核模块无法通过 udev 自动加载。就我们而言,受影响的设备主要是音频编解码器/音频链和 WLAN 模块。

症状包括:

* `snd_soc_wm8962` 未加载
音频编解码器和音频平台设备仍然不受限制
`aplay -l` 报告没有声卡
* 无线局域网接口缺失
* 启动后手动运行 `modprobe` 或 `udevadm trigger --action=add` 可以恢复设备。

经过调试,我们发现该问题似乎与此 flexbuild 版本使用的内核模块布局有关。

在 `LSDK-25.12_DEBIAN-13_LF-6.12.20` flexbuild 标签中,`configs/debian/debian_post_config.sh`创建以下符号链接:

```sh
ln -sf /boot/modules /lib/modules
```

此外,`tools/create_bootpartition` 会将内核模块复制到启动分区:

```sh
cp -rf $KERNEL_OUTPUT_PATH/$KERNEL_BRANCH/tmp/lib/modules $bootpartdir
```

因此,在运行时,`/lib/modules` 依赖于 `/boot/modules`,而 `/boot` 稍后由 `boot.mount` 挂载。

我们还注意到 `src/system/启动.mount`包含:

```ini
[Unit]
Description=启动分区
Before=systemd-modules-load.service

[山]
What=UUID=PARTUUID
地点=/启动
类型=ext4
选项=默认值

[安装]
WantedBy=local-fs.target
```

这似乎是为了确保在由 `systemd-modules-load.service` 处理的静态模块加载路径之前挂载 `/boot`。

然而,我们的问题并非出在 `systemd-modules-load.service` 上。受影响的音频/WLAN模块由udev通过设备`MODALIAS`事件动态加载。

在启动失败的情况下,我们观察到受影响的设备事件是在 `boot.mount` 之前由 udev 处理的。已完成。此时,`/lib/modules` 指向 `/boot/modules`,但 `/boot` 尚未挂载。因此,libkmod 无法访问模块别名/索引文件或相应的 `.ko` 文件,所以 udev 模块自动加载路径失败。由于 udev 事件已被处理,除非我们手动重新触发 udev 或运行 `modprobe`,否则驱动程序不会再加载。

我们对失败路径的理解是:

```文本
内核设备添加事件
→ udev 接收到 MODALIAS 事件
→ udev/libkmod 尝试访问 /lib/modules
→ /lib/modules 指向 /boot/modules。
→ /boot 尚未挂载
→ 模块别名/索引文件或 .ko 文件文件不可用
→ 模块自动加载失败
```

我们想确认以下事项:

1. 对于 LSDK 25.12 Debian 13 版本,`/lib/modules -> /boot/modules` 的布局是否符合预期?

2. 早期 udev 的 `MODALIAS` 处理和后期的 `boot.mount` 处理之间存在竞争关系吗?这是该布局的已知问题或已知局限性吗?

3. 我们注意到,当前的上游 flexbuild 主分支似乎已经改变了这种架构:内核模块不再通过 `create_bootpartition` 复制到启动分区,并且 `debian_post_config.sh` 中不再创建 `/lib/modules -> /boot/modules` 符号链接。

这种架构变更是否与避免这种早期启动模块自动加载竞争有关?

4. 对于 LSDK 25.12 Debian 13,NXP 针对此问题推荐的修复方案或变通方法是什么?

请与我们联系,告知我们我们的理解是否正确,以及该版本是否有官方补丁或推荐的更新途径。

谢谢。

i.MX 8M | i.MX 8M Mini | i.MX 8M NanoRe: LSDK 25.12 udev autoload race with /boot/modules layout

您好,

Q1:这样做的初衷是将内核映像和模块放在启动分区上,这样在升级内核时,只需要替换启动分区,而无需修改根文件系统。这种布局是故意设计的,并非错误。

Q2:你的推理是正确的;这是这种布局固有的局限性。

Q3:构建镜像时,您可以进行一次性调整,将根文件系统中的 `/boot/modules` 内容移动到 `/lib/modules`,并删除符号链接:

rm -f /lib/modules
mkdir -p /lib/modules
cp -a /boot/modules/* /lib/modules/

同时,

1. 修改构建脚本中的 `tools/create_bootpartition`,并删除 `cp -rf .../lib/modules $bootpartdir` 这行;

2. 修改 `debian_post_config.sh` 文件,并删除 `ln -sf /boot/modules /lib/modules` 这行;

3. 配置 `bld linux / modules_install` 目标,将模块安装到根文件系统中(参见 `main` 分支中 ` linux-modules`目标的实现)。

此致,
志明

Tags (1)
No ratings
Version history
Last update:
Thursday
Updated by: