I've pursued the idea of a separate SMF service which would take
care of local ZFS-based split-root systems instead of hacking into
existing scripts (network or filesystem). All the logic that I've
earlier added into fs-root and fs-minimal has now moved into the
new script and service fs-root-zfs. This service declares as its
dependants the networking services as well as filesystem/root, to
ensure that it runs before consumers of /usr and other filesystems
that make up a root hierarchy. In fact, it mounts all of the ZFS
filesystems which are children of the current bootfs or of the
$rpool/SHARED dataset, and /var/run in particular, fulfilling
much of filesystem/minimal in one early blow. This should be
appreciated by NWAM in particular :)

It does check for filesystems listed in /etc/vfstab and provided
by non-ZFS technologies - this script should skip mounting those
mountpoints and any under them. Also, it only runs for a ZFS root.

The large changes I proposed before to the older scripts are no
longer needed for the local-ZFS split-root setups; though smaller
changes (provided in new patches) are still added - to skip
zfs-mounting in case that the filesystem in question has already
been mounted.

My local tests were quite successful, so I posted the update at
the Wiki:

http://wiki.openindiana.org/oi/Advanced+-+Split-root+installation

http://wiki.openindiana.org/download/attachments/27230229/fs-root-zfs
http://wiki.openindiana.org/download/attachments/27230229/fs-root-zfs.xml

Slight but important fixes to the older fs-root and fs-minimal
scripts (as well as the whole of the new fs-root-zfs script) can
be reviewed in this patch:

http://wiki.openindiana.org/download/attachments/27230229/fs-root-zfs.patch

An example of console output for booting a BE with bad mountpoint
due to untimely reset while this BE was mounted for administrative
tasks from another running BE (with console debugging enabled by
"touch /$BEMOUNT/.debug_mnt"):

OpenIndiana Build oi_151a8 64-bit (illumos 7256a34efe)
SunOS Release 5.11 - Copyright 1983-2010 Oracle and/or its affiliates.
All rights reserved. Use is subject to license terms.
Rootfs mountpoint not '/' but '/tmp/tmp.a5aGOb', trying to fix.
Fixing 'rpool/ROOT/test/opt' to use '/opt' mountpoint instead of '/tmp/tmp.a5aGOb/opt': shifted in same root hierarchy Fixing 'rpool/ROOT/test/usr' to use '/usr' mountpoint instead of '/tmp/tmp.a5aGOb/usr': shifted in same root hierarchy Fixing 'rpool/ROOT/test/usr/local' to use '/usr/local' mountpoint instead of '/tmp/tmp.a5aGOb/usr/local': shifted in same root hierarchy Fixing 'rpool/ROOT/test/var' to use '/var' mountpoint instead of '/tmp/tmp.a5aGOb/var': shifted in same root hierarchy
Mounting '/usr': use 'rpool/ROOT/test/usr': in same root hierarchy
Mounting '/var': use 'rpool/ROOT/test/var': in same root hierarchy
Mounting '/var/adm': use 'rpool/SHARED/var/adm': the only option
Not ZFS-mounting '/tmp': equal or under a non-ZFS mountpoint '/tmp'
Mounting '/opt': use 'rpool/ROOT/test/opt': in same root hierarchy
Not mounting: '/usr' from 'rpool/ROOT/test/usr': something already mounted
Mounting '/usr/local': use 'rpool/ROOT/test/usr/local': in same root hierarchy
Not mounting: '/var' from 'rpool/ROOT/test/var': something already mounted
Not mounting: '/var' from 'rpool/SHARED/var': canmount!=on
Not mounting: '/var/adm' from 'rpool/SHARED/var/adm': something already mounted Mounting '/var/cores': use 'rpool/SHARED/var/cores': in shared root hierarchy Mounting '/var/crash': use 'rpool/SHARED/var/crash': in shared root hierarchy
Mounting '/var/log': use 'rpool/SHARED/var/log': in shared root hierarchy
Mounting '/var/mail': use 'rpool/SHARED/var/mail': in shared root hierarchy
Not mounting: '/var/spool' from 'rpool/SHARED/var/spool': canmount!=on
Mounting '/var/spool/clientmqueue': use 'rpool/SHARED/var/spool/clientmqueue': in shared root hierarchy Mounting '/var/spool/mqueue': use 'rpool/SHARED/var/spool/mqueue': in shared root hierarchy
Mounting '/var/tmp': use 'rpool/SHARED/var/tmp': in shared root hierarchy
fs-root-zfs: completed without fatal errors
Hostname: openindiana
...



The filesystem tree on this box is:

# df -k
Filesystem           1K-blocks      Used Available Use% Mounted on
rpool/ROOT/test        2065321    314150   1751171  16% /
swap                   1347972      1112   1346860   1% /etc/svc/volatile
rpool/ROOT/test/usr    2576515    825344   1751171  33% /usr
rpool/ROOT/test/var    1809675     58504   1751171   4% /var
rpool/SHARED/var/adm   1751283       112   1751171   1% /var/adm
swap                   1346912        52   1346860   1% /var/run
rpool/ROOT/test/opt    1752589      1418   1751171   1% /opt
rpool/ROOT/test/usr/local
                       1751202        31   1751171   1% /usr/local
rpool/SHARED/var/cores
                       1762117     10946   1751171   1% /var/cores
rpool/SHARED/var/crash
                       1751202        31   1751171   1% /var/crash
rpool/SHARED/var/log   1751229        58   1751171   1% /var/log
rpool/SHARED/var/mail
                       1751203        32   1751171   1% /var/mail
rpool/SHARED/var/spool/clientmqueue
1751203 32 1751171 1% /var/spool/clientmqueue
rpool/SHARED/var/spool/mqueue
                       1751202        31   1751171   1% /var/spool/mqueue
rpool/SHARED/var/tmp   1751223        52   1751171   1% /var/tmp
/usr/lib/libc/libc_hwcap2.so.1
                       2576515    825344   1751171  33% /lib/libc.so.1
swap                   1346868         8   1346860   1% /tmp
rpool/export           1751203        32   1751171   1% /export
rpool/export/home      1751203        32   1751171   1% /export/home
rpool/export/home/admin
                       1751846       675   1751171   1% /export/home/admin
rpool                  1751217        46   1751171   1% /rpool
/export/home/admin     1751846       675   1751171   1% /home/admin


Hope for comments,
//Jim Klimov

On 2013-11-30 10:25, Jim Klimov wrote:
2) I think one more valid approach to unroll these dependencies
via SMF in a packageable manner has emerged, and a rather apparent
one: to move (or duplicate, or invoke) the code from fs-root which
mounts a zfs-based /usr filesystem into a service of its own, on
which consumers of the /usr namespace would depend (optional_all).

At start this service would check if current root is zfs, and
if a child dataset or legacy-mounted ZFS /usr are known and
available - it would mount the dataset if yes. Otherwise it
would exit without an error. As a result, the networking
scripts in my split-zfs-based-root cause would be guaranteed
to have a /usr before they run.

It would (should) have no impact on systems that use monoroots
on ZFS, or that use other roots (networked, metadevice, etc.) -
these would work or fail the same as they do today.

3) Similarly, such a service can mount ZFS-based datasets of
the rest of the root hierarchy if available (/var, children
of bootfs, SHARED/*) and as a result of this, even the NWAM
method on systems with local storage would have a complete
environment to work in (for its LDAP/NIS interaction), all
without major rehaul of SMF dependencies and method code.

But in this extended case there is a possible though improbable
loophole: if some parts of the operating environment including
the rootfs are mounted from ZFS, but some major components
like /var work from nfs/cachefs/ufs/... and then some datasets
like /var/adm would be mounted on top of that. A script that
only mounts a ZFS hierarchy in order to avoid dependencies
on networking and metadevices would apparently ignore these
other options; at most it can detect them in /etc/vfstab and
stop mounting stuff under the involved mountpoint (this would
come in later via filesystem service chains that exist today).

And the current filesystem service methods should need to check
that they don't mount the same (zfs) filesystem twice, so as
to not bail out on "zfs mount" errors due to this.

_______________________________________________
OpenIndiana-discuss mailing list
OpenIndiana-discuss@openindiana.org
http://openindiana.org/mailman/listinfo/openindiana-discuss

Reply via email to