"mount: /dev/mqueue: must be superuser to use mount" 当通过 NFS 和 TFTP 启动 Yocto Linux 系统时

"mount: /dev/mqueue: must be superuser to use mount" when starting a Yocto Linux system via NFS and TFTP

我遵循了 i.MX 知识库中的指南“Yocto NFS & TFTP boot”,使我的嵌入式 Linux 设备 运行 成为我开发机器上的内核和文件系统。

内核似乎已通过 TFTP 正确加载,但系统无法正常启动,systemd 进入维护模式。

这是日志中的第一个错误:

[   10.637534] systemd[1]: dev-mqueue.mount: Mount process exited, code=exited, status=32/n/a
[   10.657077] systemd[1]: dev-mqueue.mount: Failed with result 'exit-code'.
[   10.666907] systemd[1]: Failed to mount POSIX Message Queue File System.
[FAILED] Failed to mount POSIX Message Queue File System.
See 'systemctl status dev-mqueue.mount' for details.

它似乎与同一指南中 an unanswered comment 中包含的日志相似。

查看 systemctl status dev-mqueue.mount 我明白了:

* dev-mqueue.mount - POSIX Message Queue File System
     Loaded: loaded (/lib/systemd/system/dev-mqueue.mount; static)
     Active: failed (Result: exit-code) since Sun 2022-03-06 11:52:40 UTC; 5h 29min ago
      Where: /dev/mqueue
       What: mqueue
       Docs: man:mq_overview(7)
             https://www.freedesktop.org/wiki/Software/systemd/APIFileSystems

Mar 06 11:52:40 pico-imx7 mount[180]: mount: /dev/mqueue: must be superuser to use mount.
Notice: journal has been rotated since unit was started, output may be incomplete.

不确定出了什么问题,或者为什么系统会像这样失败。

消息 must be superuser to use mount 提示权限问题。

Linux 系统期望大多数系统文件由 UID 0(root)拥有,但在读取指南中设置的 NFS 文件系统时,它实际上读取的是 UID 1000,或者构建者的 UID开发机器中的系统。如果我列出 ${YOCTO_BUILD_DIR}/tmp/work/${TARGET}-poky-linux-gnueabi/${IMAGE}/1.0-r0/rootfs 的内容,我得到:

drwxr-xr-x 20 1000 1000 4096 Mar  9  2018 ./
drwxr-xr-x 14 1000 1000 4096 Mar  5 19:19 ../
drwxr-xr-x  2 1000 1000 4096 Mar  9  2018 bin/
drwxr-xr-x  2 1000 1000 4096 Mar  9  2018 boot/
drwxr-xr-x  2 1000 1000 4096 Mar  9  2018 dev/
drwxr-xr-x 59 1000 1000 4096 Mar  9  2018 etc/
drwxr-xr-x  4 1000 1000 4096 Mar  9  2018 home/
drwxr-xr-x 10 1000 1000 4096 Mar  9  2018 lib/
drwxr-xr-x  2 1000 1000 4096 Mar  9  2018 media/
drwxr-xr-x  2 1000 1000 4096 Mar  9  2018 mnt/
drwxr-xr-x  4 1000 1000 4096 Mar  9  2018 opt/
drwxr-xr-x  2 1000 1000 4096 Mar  9  2018 proc/
drwxr-xr-x  2 1000 1000 4096 Mar  9  2018 run/
drwxr-xr-x  3 1000 1000 4096 Mar  9  2018 sbin/
drwxr-xr-x  2 1000 1000 4096 Mar  9  2018 srv/
drwxr-xr-x  2 1000 1000 4096 Mar  9  2018 sys/
drwxr-xr-t  2 1000 1000 4096 Mar  9  2018 tmp/
drwxr-xr-x 38 1000 1000 4096 Mar  9  2018 unit_tests/
drwxr-xr-x 11 1000 1000 4096 Mar  9  2018 usr/
drwxr-xr-x  9 1000 1000 4096 Mar  9  2018 var/

注意 1000 作为 UID 和 GID。

将其与使用 tar --exclude=\*/\*/\* --no-wildcards-match-slash -tjvf ${YOCTO_BUILD_DIR}/tmp/deploy/images/${TARGET}/${IMAGE}-${TARGET}.tar.bz2:

制作的文件系统映像 tarball 列表进行比较
drwxr-xr-x 0/0               0 2018-03-09 13:34 ./
drwxr-xr-x 0/0               0 2018-03-09 13:34 ./bin/
drwxr-xr-x 0/0               0 2018-03-09 13:34 ./boot/
drwxr-xr-x 0/0               0 2018-03-09 13:34 ./dev/
drwxr-xr-x 0/0               0 2018-03-09 13:34 ./etc/
drwxr-xr-x 0/0               0 2018-03-09 13:34 ./home/
drwxr-xr-x 0/0               0 2018-03-09 13:34 ./lib/
drwxr-xr-x 0/0               0 2018-03-09 13:34 ./media/
drwxr-xr-x 0/0               0 2018-03-09 13:34 ./mnt/
drwxr-xr-x 0/0               0 2018-03-09 13:34 ./opt/
dr-xr-xr-x 0/0               0 2018-03-09 13:34 ./proc/
drwxr-xr-x 0/0               0 2018-03-09 13:34 ./run/
drwxr-xr-x 0/0               0 2018-03-09 13:34 ./sbin/
drwxr-xr-x 0/0               0 2018-03-09 13:34 ./srv/
dr-xr-xr-x 0/0               0 2018-03-09 13:34 ./sys/
drwxrwxrwt 0/0               0 2018-03-09 13:34 ./tmp/
drwxr-xr-x 0/0               0 2018-03-09 13:34 ./unit_tests/
drwxr-xr-x 0/0               0 2018-03-09 13:34 ./usr/
drwxr-xr-x 0/0               0 2018-03-09 13:34 ./var/

这里的根目录正确地属于 root

相同的权限在 .ext4 图像文件中,即 SD/MMC 图像文件的一部分。

两种可能的解决方案:

  • 在目录中循环挂载 ${YOCTO_BUILD_DIR}/tmp/deploy/images/${TARGET}/${IMAGE}-${TARGET}.ext4 文件,然后通过 NFS 导出该目录(可能需要 root 权限);
  • 在目录中提取${YOCTO_BUILD_DIR}/tmp/deploy/images/${TARGET}/${IMAGE}-${TARGET}.tar.bz2,然后通过NFS 导出该目录;将需要 root 权限和更多时间来提取嵌入式文件系统。