This week, I upgraded my media center/filer and after a reboot (new kernel), systemd was blocking on my btrfs mount. It’s a 3-partition RAID1 array (until upstream says RAID5 is safe). Systemd was somehow waiting on it, with the infamous red spinner. Adding noauto
to fstab did allow the machine to boot properly, but the mount itself silently failed: mount /my/mount/point
would return 0 but nothing would show up in /proc/mounts
nor in the mount point itself.
It turns out that the latest version of systemd reaches the local-fs target faster than earlier releases (at least that’s my theory) and the kernel has not yet fully figured out what partitions belong in which array. So what I needed was to tell systemd to run btrfs dev scan
before attempting to mount local filesystems.
While searching for clues, I came across this stack exchange question which has the correct answer (though I did make a few changes). I’ll reproduce here the correct version for Gentoo, in case anyone runs into this:
$ cat /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=/sbin/btrfs device scan
[Install]
WantedBy=local-fs-pre.target
I’m not exactly sure why “local-fs-pre.target” needs to be specified three times (twice inside the file, once in the path), but it does the trick: systemd waits for btrfs’s device scan to return before mounting file systems. Maybe btrfs-progs should ship such a file…
As a side note, while digging for information, I found out that systemd actually reads the fstab and translates it into unit files at boot time. The generated files are located in /run/systemd/generator/
.
One final piece of information: if I had taken the time to read journalctl -b
carefully, I would have saved hours. If you have any issues with systemd, read the damn journal.
I’ll take the opportunity to thank the kinds folks of #btrfs on FreeNode who promptly helped me.
That’s it for tonight, thanks for reading.