编辑:当我尝试使用具有任何安装点的单独分区时,会发生这种情况,而不仅仅是
/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
,也会发生同样的情况。 一旦启动失败,就会进入紧急模式,然后挂载就会成功。 然后我可以退出系统维护,一切都按预期进行。 是什么导致了这种延迟安装? 我是不是漏掉了一步?
输出截图:
我在 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 不需要。
能够解决这个问题,尽管这是一种黑客攻击。 仍然很想知道为什么会出现这种情况,但似乎 udev 直到 systemd init 完成后才挂载 mmcblk 分区,如果
/etc/fstab
调用 mmcblk 分区,则会导致依赖错误。 udev 检查 fstab
,等待挂载 mmcblk 设备并超时,THEN 尝试挂载该设备。
我的解决方案:
#/etc/systemd/system/mount-data-partition.service
[Unit]
Description=Mount Data Partition
DefaultDependencies=no
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/mount /dev/mmcblk0p4
#/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
我不想回答我自己的问题,但希望这些信息可以帮助别人。 如果有人能告诉我为什么会出现这种情况,请告诉我。