On Mon, Dec 19, 2005 at 08:45:45PM -0800, Russ Allbery wrote:
> > (TBH, I'd be much happier just making the technical changes necessary to
> > ensure /var is mounted early -- keeps the filesystem sane, and it's just
> > a simple matter of programming, rather than arguing over what's ugly.
> Yeah, I agree with this too.

So why don't we go with this? Thomas?

Here are the cases:

    (a) /var on /, mounted rw during normal operation
    (b) /var a local fs, separate to /
    (c) / and /var separate NFS mounts
    (d) / local, /var an NFS mount
    (e) /var local, can't be mounted 'til a writable fs is available

For (a) you just need to wait until S10checkroot.sh has finished.
For (b) you need to wait until S35mountall.sh has finished.

For (d) and (e) you need special handling; using /run as a tmpfs and
setting up /var/run -> /run symlinks on both / and /var. That's pretty
special handling, and probably needs something like shared subtrees to
be done automatically at upgrade time (http://lwn.net/Articles/159077/).

For (c) you could either do the same handling as (d) and (e), or just expect
the admin to mount it rw as part of bootup.

As far as the "but programmers/admins might be confused" concern goes;
adding a brief /run/README at bootup seems feasible.

That'd mean:

        /var is available after:
                S10checkroot.sh (/var on rootfs)
                S35mountall.sh (/var local)
                S40hotplug (/var local, but requires hotplug drivers)
                S45mountnfs.sh (/var on NFS not mounted before init)

        /var/run is thus available after one of:
                S10checkroot.sh
                S35mountall.sh
                S36mountvirtfs

And /var/run is used before /var is necessarily available by (on my system):

        S39dns-clean
        S40networking
        S41hotplug-net
        S43portmap

Hrm. Special casing in mountvirtfs and mountnfs.sh could be:

        mountvirtfs:
                if touch /var/run/.rw_var_run >/dev/null 2>&1; then
                        rm -f /var/run/.rw_var_run
                elif [ "$EARLY_RUN_FS" ] && [ -d "$EARLY_RUN_FS" ]; then
                        echo "Mounting /var/run tmpfs on $EARLY_RUN_FS..."
                        mount -t tmpfs tmpfs "$EARLY_RUN_FS"
                        ln -s . "$EARLY_RUN_FS/run"
                        mount --bind "$EARLY_RUN_FS" /var
                        touch /var/.bind_var
                else
                        echo "Error: no early writable filesystem available"
                        # ...
                fi

        mountnfs.sh:
                if [ -e /var/.bind_var ]; then
                        rm -f /var/.bind_var /var/run
                        umount /var
                fi
                # ... mount -a

at which point you only need to mkdir $EARLY_FUN_FS and ensure /var/run is
a symlink to it when setting up that behaviour on upgrade. Alternatively
you could just make the directory and "mount --bind $EARLY_RUN_FS
/var/run" after mounting /var. (If $EARLY_RUN_FS is /run, you'd have to
work out in advance when it's needed so as not to add useless stuff to / when
it's not needed; adding a pointless dir to /etc or /lib would likely be okay
though)

Note that in that scenario programs are FHS compliant in that they only
access files throug the /var/run namespace, and if an admin prefers
/etc/run or /lib/run, it's just a matter of local configuration rather
than recompiling apps.

Cheers,
aj

Attachment: signature.asc
Description: Digital signature

Reply via email to