"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 权限和更多时间来提取嵌入式文件系统。
我遵循了 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
:
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 权限和更多时间来提取嵌入式文件系统。