作为数据分区,我有一个多磁盘 btrfs 文件系统。我的根磁盘是ext4
稳定表:
UUID=290624c6-6b95-41fd-94a1-923ebca64b83 / ext4 rw,relatime,data=ordered 0 1
/dev/sdc /mnt/btrfs btrfs rw,relatime,compress-force=zlib,autodefrag 0 0
当我启动机器时,它将等待 1 分 30 秒并显示消息
A start job is running for dev-sdc.device
在那之后
Dependency failed for /mnt/btrfs
当我登录时我可以做
mount /mnt/btrfs
systemctl default
它会起作用的。系统将正常启动。
我首先虽然我可能需要使用 mkinitcpio 钩子做一些事情,但是这一页说:
Arch 的默认 mkinitcpio 包包含一个标准的 btrfs 挂钩,这足以获得多设备(RAID)支持。除此之外,内核能够在没有任何钩子的情况下启动单设备 btrfs 根
所以一切都应该开箱即用。
为什么它不起作用,我应该做什么来解决它?
答案1
两条评论。首先,尝试通过标签或 UUID 而不是设备进行挂载。设备名称有时可能会发生变化。
否则,btrfs
需要brtfs device scan
先调用才能了解btrfs
计算机上的文件系统。我希望arch
能够处理这个问题,但不知怎的,直到我为此创建了一个服务文件并将其放入/etc/systemd/system/local-fs-pre.target.wants/btrfs-dev-scan.service
:
[Unit]
Description=Btrfs scan devices
Before=local-fs-pre.target
DefaultDependencies=false
[Service]
Type=oneshot
ExecStart=/usr/bin/btrfs device scan
[Install]
WantedBy=local-fs-pre.target
DefaultDependencies=false
是必须的,不然的话靴子就乱了。 (非 Arch 用户可能btrfs
位于/sbin
而不是/usr/bin
)
这是应该由btrfs
钩子处理的(我稍后才想到),但仍然可能存在问题。
但是您可能还有其他问题。这Dependency failed
表明一些早期所需的服务没有启动。我不知道那可能是什么,你应该检查你的journalctl -b
并搜索依赖性投诉,它通常说明到底缺少什么。或者至少,您会得到一系列失败的依赖项 - 依赖项失败可能会传播......
您还可以生成systemd-analyze plot > boot.svg
并检查到底以什么顺序启动的序列。你可以从中猜出到底出了什么问题——谁在等谁?还有,systemctl --failed
说什么?
答案2
您可以添加一个钩子以mkinitcpio
确保
btrfs device scan
将在挂载根文件系统之前在引导期间运行。
您可以通过修改/etc/mkinitcpio.conf
、搜索该行HOOKS
并将其放在btrfs
前面来包含此挂钩udev
。
修改后请务必重新生成 initramfsmkinitcpio -p linux
Arch Wiki 实际上建议使用udev
钩子,但我遇到了同样的问题,并通过这种方式修复。