Arch 不会在启动时挂载 btrfs 阵列

Arch 不会在启动时挂载 btrfs 阵列

作为数据分区,我有一个多磁盘 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钩子,但我遇到了同样的问题,并通过这种方式修复。

相关内容