:: Re: [DNG] runit: unclean shutdown?
Top Page
Delete this message
Reply to this message
Author: Steve Litt
To: dng
Subject: Re: [DNG] runit: unclean shutdown?
Henry Jensen via Dng said on Sun, 12 Mar 2023 15:18:52 +0100

>I switched form sysvinit to runit with runit-init on Devuan chimaera.
>Since then at every boot I see the message "recovering journal" for
>the root partition. This indicates, that at the last shutdown the
>partition wasn't unmounted.

The preceding is a bad sign. Let's fix it...

>I don't see this message when using sysvinit. The root partition
>reports "clean" at boot then, which is the normal condition.
>I added "sleep 10" at the end of runit stage 3 script to see, if there
>is a problem at shutdown, but couldn't see any.
>How can I examine this problem further?

Hi Henry,

To start, I'll post my 3 shellscript, and perhaps you'll see something
mine has that yours doesn't. Unfortunately, mine has all sorts of if
statements in case it's shutting down a qemu VM...

# vim: set ts=4 sw=4 et:


. /etc/runit/functions
[ -r /etc/rc.conf ] && . /etc/rc.conf

msg "Waiting for services to stop..."
sv force-stop /var/service/*
sv exit /var/service/*

[ -x /etc/rc.shutdown ] && /etc/rc.shutdown

if [ -z "$VIRTUALIZATION" ]; then
    msg "Saving random number generator seed..."

if [ -z "$VIRTUALIZATION" -a -n "$HARDWARECLOCK" ]; then
    hwclock --systohc ${HARDWARECLOCK:+--$(echo $HARDWARECLOCK |tr A-Z
a-z)} fi

halt -w # for wtmp

if [ -z "$VIRTUALIZATION" ]; then
    msg "Stopping udev..."
    udevadm control --exit

msg "Sending TERM signal to processes..."
pkill --inverse -s0,1 -TERM
sleep 1
msg "Sending KILL signal to processes..."
pkill --inverse -s0,1 -KILL

if [ -z "$VIRTUALIZATION" ]; then
    msg "Unmounting filesystems, disabling swap..."
    swapoff -a
    umount -r -a -t nosysfs,noproc,nodevtmpfs,notmpfs
    msg "Remounting rootfs read-only..."
    mount -o remount,ro /


if [ -z "$VIRTUALIZATION" ]; then
    if [ -e /run/runit/reboot ] && command -v kexec >/dev/null; then
        msg "Triggering kexec..."
        kexec -e 2>/dev/null
        # not reached when kexec was successful.

In the preceding, note that [ -z "$VIRTUALIZATION" ] means the
$VIRTUALIZATION environment variable has zero length, indicating *no*
virtualization. I think the lines pertinent to your issue are the ones
that happen right after all processes have been terminated and the ones
that don't terminate are killed. This includes the following:

swapoff -a

The preceding prevents swapping from changing any disk content...

umount -r -a -t nosysfs,noproc,nodevtmpfs,notmpfs

The preceding recursively unmounts all disk filesystems (as opposed to
/sys, /proc, etc.)

mount -o remount,ro /

The preceding remounts the root partition as read-only, so further
changes cannot be made to it, but its executables can still be used to
perform the final shutdown tasks. Note that if /usr is a separate
partition and there's no /sbin, those executables won't be available.
You'll need to do some fancy copying before the mass unmount. Oh,


The preceding confuses me a little because my first instinct would be
that sync wouldn't work on a read-only filesystem, because what sync
does is write cached disk writes to disk. A quick web search yielded
nothing on this subject. But perhaps sync *does* work on readonly
filesystems. If that's the case, leaving out the sync would leave
cached writes and perhaps would trigger a journal recovery on the next
reboot. So if you haven't yet, but a sync command after you've
unmounted all disk partitions and set the root partition read-only.


Steve Litt
Autumn 2022 featured book: Thriving in Tough Times