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

Pet*_*mit 9 arch-linux systemd 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
Run Code Online (Sandbox Code Playgroud)

当我启动机器时,它将等待 1 分 30 秒并显示消息

A start job is running for dev-sdc.device
Run Code Online (Sandbox Code Playgroud)

在那之后

Dependency failed for /mnt/btrfs
Run Code Online (Sandbox Code Playgroud)

当我登录时,我可以做

mount /mnt/btrfs
systemctl default
Run Code Online (Sandbox Code Playgroud)

它会起作用。系统将正常启动。

我首先虽然我可能需要用 mkinitcpio 钩子做一些事情,但这个页面说:

Arch 的默认 mkinitcpio 包包含一个标准的 btrfs 钩子,足以获得多设备 (RAID) 支持。除此之外,内核能够在没有任何钩子的情况下启动单设备 btrfs 根

所以一切都应该开箱即用。

为什么它不起作用,我应该怎么做才能解决它?

ori*_*ion 8

两条评论。首先,尝试通过标签或 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
Run Code Online (Sandbox Code Playgroud)

DefaultDependencies=false是必要的,否则它会搞砸引导。(非 Arch 用户可能已经btrfs位于/sbin而不是/usr/bin

这是btrfshook应该处理的事情(我稍后想到了这一点),但仍然可能存在问题。

但是,您可能还有其他问题。这Dependency failed表明某些早期所需的服务没有启动。我不知道那可能是什么,您应该检查journalctl -b并搜索依赖项投诉,它通常会说明到底缺少什么。或者至少,您会得到一连串失败的依赖项 - 依赖项失败可能会传播......

您还可以生成systemd-analyze plot > boot.svg并检查以何种顺序确切启动的序列。你可以从中猜出到底出了什么问题——谁在等谁?而且,systemctl --failed说什么?