The problem

Small problem, a lot of hassle. My rootfs became corrupted in a way that fsck refused to fix it in non-interactive mode. This means that I have to run fsck manually but since rootfs is already mounted, it’s not really safe. There are couple ways one can handle this problem, here’s the one I prefer.

The solution

You have to reboot the system and modify kernel cmdline, using grub edit command. Add rd.break=pre-mount in the line starting with linux. The boot process will break just before mounting any filesystem. This means that you can now manually run fsck on rootfs since it’s not mounted yet. Reboot the system or just quit your shell after it’s done.

Some more info

This solution is similar to running shell as init process (init=/bin/sh or in case of using initramfs - rdinit=/bin/sh, or in case of dracut - rdinit=/bin/bash). It is, however, a little bit more handy since at the time you are dropped to shell, all basic stuff (like procfs/sysfs) are already set up. One another small advantage of this approach is that you can easily continue the boot process just by leaving the shell (CTRL-D).

Dracut has couple other breakpoints you can use. To check full list, run:

grep -E 'rd.?break' /usr/lib/dracut/modules.d/99base/init.sh

You can some more useful information on this wiki page.