The problem is journald
Or rather how it is still logging to /var while systemd is trying to unmount it.
Solutions
According to this thread, there are two ways to go about it:
- Make
journald log to a volatile location in /run so it doesn't lock /var, but the tradeoff is that you lose logs at shutdown.
Edit /etc/systemd/journald.conf to change the Storage= line to
Storage=volatile
This is what I did, and I it worked for me.
- (EDIT: this is ArchLinux-specific) Or set up a shutdown hook to unmount
/var later. This won't remove the failed message as systemd will still try to unmount /var but will indeed unmount /var properly at the end of the shutdown sequence. You just won't see it. (I haven't tested that solution though)
Add a shutdown hook to mkinitcpio's HOOKS= array, e.g. :
HOOKS="base udev autodetect block keymap encrypt lvm2 filesystems usbinput fsck var shutdown"