9

编辑:当我尝试使用带有任何挂载点的单独分区时会发生这种情况,而不仅仅是/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. 一旦启动失败,它将进入紧急模式,然后将成功安装。然后我可以退出系统维护,一切都按预期工作。是什么导致这个延迟安装?我错过了一步吗?

输出截图:

系统启动

4

2 回答 2

11

我在这里使用带有内核 3.13.1 和 3.14.4 的 systemd-208 在 Exherbo 下遇到了类似的问题(类似于 Gentoo):我的单独分区(/var、/home、/boot 甚至 /swap)安装在所需的根目录下地点。一切正常。然后,升级到 systemd 213 启动过程在该点停止,分区应该已安装并显示消息:'A start job is running for 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 不需要。

于 2014-06-09T14:20:28.197 回答
4

能够解决这个问题,尽管它是一种黑客行为。仍然很想知道为什么会发生这种情况,但似乎 udev 直到 systemd init 完成后才挂载 mmcblk 分区,如果/etc/fstab调用 mmcblk 分区,则会导致依赖错误。udev 检查fstab,等待安装 mmcblk 设备并超时,然后尝试安装该设备。

我的解决方案:

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)Wants在此服务中添加依赖项systemd-udev-trigger.service

#/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命令将查找/dev/mmcblk0p4in /etc/fstab,并按照指定的方式安装(在我的情况下,/var)。由于/dev/mmcblk0p4现在已安装,udev 识别出该设备存在并且在等待它时不再超时。系统继续正常启动。

我讨厌回答我自己的问题,但希望这些信息可以帮助某人。如果有人能告诉我为什么会发生这种情况,请这样做。

于 2014-05-01T18:44:31.917 回答