启动时自动挂载单独分区时systemd/udev依赖失败

问题描述 投票:0回答:2

编辑:当我尝试使用具有任何安装点的单独分区时,会发生这种情况,而不仅仅是

/var

我正在使用Buildroot构建一个嵌入式Linux系统。 我尝试为 /var 使用单独的分区,但任何安装点都会发生这种情况。 我的init系统是systemd,udev用于设备管理。 我已将 fstab 编辑为:

# <file system> <mount pt>     <type>   <options>                <dump> <pass>
/dev/root       /              ext2     rw,noauto                0      1
/dev/mmcblk0p4  /var           ext2     defaults                 0      2
proc            /proc          proc     defaults                 0      0
devpts          /dev/pts       devpts   defaults,gid=5,mode=620  0      0
tmpfs           /dev/shm       tmpfs    mode=0777                0      0
tmpfs           /tmp           tmpfs    defaults                 0      0
sysfs           /sys           sysfs    defaults                 0      0
tmpfs           /run           tmpfs    defaults                 0      0

系统启动后,我会收到一条消息“Expecting device dev-mmcblk0p4.device...”,最终跟随:

等待设备 dev-mmcblk0p4.device 超时。

/var 的依赖失败。

本地文件系统的依赖失败。


如果我使用

/var2
或其他任何东西作为安装点而不是
/var
,也会发生同样的情况。 一旦启动失败,就会进入紧急模式,然后挂载就会成功。 然后我可以退出系统维护,一切都按预期进行。 是什么导致了这种延迟安装? 我是不是漏掉了一步?

输出截图:

systemd startup

linux udev buildroot systemd
2个回答
11
投票

我在 Exherbo 下使用带有内核 3.13.1 和 3.14.4 的 systemd-208(类似于 Gentoo)时遇到了类似的问题:我的单独分区(/var、/home、/boot 甚至 /swap)安装在所需的分区下根位置。一切都很好。然后,升级到 systemd 213 时,引导过程会在此时停止,此时应该已挂载分区,并显示以下消息:“正在为 dev-sdxx.device 运行启动作业”,直到超时 1 分 30 秒。之后我就进入了紧急模式。 摘录

$ journalctl -xb

Jun 09 13:50:29 exathlon systemd[1]: Job dev-disk-by\x2dlabel-BAK_A4.device/start timed out.
Jun 09 13:50:29 exathlon systemd[1]: Timed out waiting for device dev-disk-by\x2dlabel-BAK_A4.device.
Jun 09 13:50:29 exathlon systemd[1]: Dependency failed for /mnt/BAK_A4.
Jun 09 13:50:29 exathlon systemd[1]: Dependency failed for Local File Systems.
Jun 09 13:50:29 exathlon systemd[1]: Triggering OnFailure= dependencies of local-fs.target.
Jun 09 13:50:29 exathlon systemd[1]: Dependency failed for /export/LinuxMint13_KDE_64.
Jun 09 13:50:29 exathlon systemd[1]: Dependency failed for /export/SystemRescueCD-x86.
Jun 09 13:50:29 exathlon systemd[1]: Dependency failed for File System Check on /dev/disk/by-label/BAK_A4.
Jun 09 13:50:29 exathlon systemd[1]: Job dev-sdb11.device/start timed out.
Jun 09 13:50:29 exathlon systemd[1]: Timed out waiting for device dev-sdb11.device.
Jun 09 13:50:29 exathlon systemd[1]: Dependency failed for /var.
Jun 09 13:50:29 exathlon systemd[1]: Dependency failed for Update UTMP about System Boot/Shutdown.
Jun 09 13:50:29 exathlon systemd[1]: Dependency failed for Load/Save Random Seed.
Jun 09 13:50:29 exathlon systemd[1]: Dependency failed for File System Check on /dev/sdb11.
Jun 09 13:50:29 exathlon systemd[1]: Job dev-sdb8.device/start timed out.
Jun 09 13:50:29 exathlon systemd-journal[1044]: Forwarding to syslog missed 15 messages.
Jun 09 13:50:29 exathlon systemd[1]: Timed out waiting for device dev-sdb8.device.
Jun 09 13:50:29 exathlon systemd[1]: Dependency failed for /home.
Jun 09 13:50:29 exathlon systemd[1]: Dependency failed for File System Check on /dev/sdb8.
Jun 09 13:50:29 exathlon systemd[1]: Job dev-sda6.device/start timed out.
Jun 09 13:50:29 exathlon systemd[1]: Timed out waiting for device dev-sda6.device.
Jun 09 13:50:29 exathlon systemd[1]: Dependency failed for /boot.
Jun 09 13:50:29 exathlon systemd[1]: Dependency failed for File System Check on /dev/sda6.
Jun 09 13:50:29 exathlon systemd[1]: Job dev-sdb5.device/start timed out.
Jun 09 13:50:29 exathlon systemd[1]: Timed out waiting for device dev-sdb5.device.
Jun 09 13:50:29 exathlon systemd[1]: Dependency failed for /dev/sdb5.

显示 systemd 挂载失败的尝试。

在查找互联网后,我找到了配置内核的补救措施

CONFIG_FHANDLE=y (before: n)

请参阅

下的“systemd 系统和服务管理器”
REQUIREMENTS:
 CONFIG_FHANDLE (libudev, mount and bind mount handling)

来源:http://cgit.freedesktop.org/systemd/systemd/tree/README

后来问题解决了,所有分区都重新挂载了。

我不知道为什么这没有发生/或者 systemd 208 不需要。


4
投票

能够解决这个问题,尽管这是一种黑客攻击。 仍然很想知道为什么会出现这种情况,但似乎 udev 直到 systemd init 完成后才挂载 mmcblk 分区,如果

/etc/fstab
调用 mmcblk 分区,则会导致依赖错误。 udev 检查
fstab
,等待挂载 mmcblk 设备并超时,THEN 尝试挂载该设备。

我的解决方案:

  1. 创建 systemd 服务来处理分区挂载:
#/etc/systemd/system/mount-data-partition.service
[Unit]
Description=Mount Data Partition
DefaultDependencies=no

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/mount /dev/mmcblk0p4

2) 在“systemd-udev-trigger.service”中添加对此服务的“Wants”依赖项:
#/usr/lib/systemd/system/systemd-udev-trigger.service
[Unit]
Description=udev Coldplug all Devices
Documentation=man:udev(7) man:systemd-udevd.service(8)
DefaultDependencies=no
Wants=systemd-udevd.service mount-data-partition.service
After=systemd-udevd-kernel.socket systemd-udevd-control.socket
Before=sysinit.target
ConditionCapability=CAP_MKNOD

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/udevadm trigger --type=subsystems --action=add ; /usr/bin/udevadm trigger

这会导致“mount-data-partition.service”在“systemd-udev-trigger.service”之前调用并执行。 然后,“mount”命令将在“/etc/fstab”中查找“/dev/mmcblk0p4”,并按指定安装(在我的情况下为“/var”)。 由于现在挂载了“/dev/mmcblk0p4”,udev 识别出该设备存在并且在等待时不再超时。 系统继续正常启动。

我不想回答我自己的问题,但希望这些信息可以帮助别人。 如果有人能告诉我为什么会出现这种情况,请告诉我。

© www.soinside.com 2019 - 2024. All rights reserved.