编辑:当我尝试使用具有任何挂载点的单独分区时,会发生这种情况,而不仅仅是/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
系统启动后,我收到一条消息“期待设备dev-mmcblk0p4.device ... ”,最后接着是:
“超时等待设备dev-mmcblk0p4.device。”
“ / var。的依赖关系失败”
“本地文件系统的依赖关系失败。”
如果我使用/var2
或其他任何东西作为挂载点而不是/var
,则会发生同样的事情。一旦启动失败,它就进入紧急模式,然后安装将成功发生。然后,我可以退出系统维护,一切都按预期工作。是什么造成这种延迟安装?我错过了一步吗?
输出屏幕截图:
答案 0 :(得分:11)
我在这里使用systemd-208与内核3.13.1和3.14.4在Exherbo(类似于Gentoo)下有一个类似的问题:我的单独分区(/ var,/ home,/ boot和even / 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 System and Service Manager'REQUIREMENTS:
CONFIG_FHANDLE (libudev, mount and bind mount handling)
来源:http://cgit.freedesktop.org/systemd/systemd/tree/README
之后问题解决了,所有分区再次安装。
我不知道,为什么没有发生这种情况/或者系统208不需要这样做。
答案 1 :(得分:4)
能够解决这个问题,虽然这是一种黑客行为。仍然很想知道为什么会发生这种情况,但看起来好像udev没有挂载mmcblk分区直到systemd init完成后,如果/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)在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/mmcblk0p4
中查找/etc/fstab
,并按指定的方式挂载(在我的情况下,/var
)。由于现在已安装/dev/mmcblk0p4
,因此udev会识别设备是否存在,并且在等待时不再超时。系统继续正常启动。
我讨厌回答我自己的问题,但希望这些信息可以帮助别人。如果有人能够首先告诉我为什么会发生这种情况,请做。