A few years ago we looked into this sort of thing for Sun Cluster, with
the additional requirement that we must handle the mount-point-not-found
error condition.  The way mountall works is quite simple: count the number
of directories in the mount point and sort.  IIRC, we took a similar 
approach.
However, we did look at a method similar to this and think that it is the
better approach in the long term. In particular, you can get specific error
detection and corrective action from  a service perspective.  I'm glad 
to see
you are looking into this in more detail.

NB. we needed a way to make policy decisions about the case where the
mount point is nonexistent. Do we create a mount point as needed?  Consider
adding this policy, as a property, to your agent, because you'd be 
surprised how
often this bites people (according to our Sun Cluster root cause analysis)
 -- richard

Nils Goroll wrote:
> Hi All,
>
> a couple of days ago, I once again ran into the issues regarding
> layered mounts of diffrent filesystems and lofs mounts depending upon
> other mounts. Two more or less recent pointers:
>
>         http://bugs.opensolaris.org/view_bug.do?bug_id=6464201
>         http://www.opensolaris.org/jive/thread.jspa?messageID=122908
>
> >From my experience, the most important issues are that currently there
> is no generic way to
>
> - mount filesystems on a metaset (can fail if metaset auto-take does
>   not work or not supported as in Sun Cluster)
>
>   -> we need a metaset take import method and a filesystem mount
>      method which depends upon the metaset
>
> - mount filesystems which depend upon each other but are of different
>   FSTypes like NFS, ZFS, UFS or lofs. The classic is that a lofs mount
>   of an NFS mount or even an UFS mount fails (in some cases), if
>   simply being added to the vfstab.
>
>   There are two different kinds of dependencies, but both boil down to
>   a dependency from one mount to another where one cannot be mounted
>   until this other is (I was tempted to use the notion of the dependee
>   and depender/dependend here, but this is always confusing, I think):
>
>   - layered mounts where one FS is mounted into the namespace of
>     another
>   - loopback (lofs) mounts which need another FS as their "device"
>
> As a first effort to solve these issues "once and for all", I have
> written
>
> - A simple metaset take/release method (trivial)
> - and a proptotype of a generec mount method
>
> I would like to introduce the latter.  Here's the general idea:
>
> - Every mountpoint should be a service. If it depends upon other
>   mountpoints, SMF dependencies should be used
>
> - What is now in /etc/vfstab should be in SMF, but to make things
>   easy, I would like a sync tool which generates an SMF config from
>   vfstab, similar to inetconv.
>
> - This could replace or at least amend
>
>   svc:/system/filesystem/local:default and
>   svc:/network/nfs/client:default .
>
> The prototype which I have finished so far converts entries from
> /etc/vfstab to SMF and automatically creates dependencies. To mark
> entries which should be handled by SMF, I used the keyword "smf" in
> the mount at boot column of /etc/vfstab.
>
> Here's the prototype in action:
>
> * Create a vfstab with dependencies:
>
>   new-eclipse:~# grep smf /etc/vfstab
>   /dev/md/dsk/d20 /dev/md/rdsk/d20        /home           ufs     2       smf 
>     logging,noatime
>   swap            -                       /mnt/test       tmpfs   2       smf 
>     -
>   /home/a/lib     -                       /home/test      lofs    2       smf 
>     ro
>   /usr            -                       /home/a         lofs    2       smf 
>     ro
>   swap            -                       /home/a/lib     tmpfs   2       smf 
>     -
>
>   - /home/a depends upon /home
>   - /home/a/lib depends upon /home/a
>   - /home/test depends upon /home/a/lib and /home
>
>   /home/a also depends upon /usr, so for the prototype all mount
>   services also depend upon svc:/system/filesystem/minimal. For the
>   prototype, mount dependencies are only created for "mount at boot =
>   smf" vfstab entries.
>
> * of these, only /home is already mounted:
>
>   new-eclipse:~# df -h
>   Filesystem             size   used  avail capacity  Mounted on
>   /dev/md/dsk/d10         20G    18G   1.7G    92%    /
>   /devices                 0K     0K     0K     0%    /devices
>   ctfs                     0K     0K     0K     0%    /system/contract
>   proc                     0K     0K     0K     0%    /proc
>   mnttab                   0K     0K     0K     0%    /etc/mnttab
>   swap                   4.9G   1.2M   4.9G     1%    /etc/svc/volatile
>   objfs                    0K     0K     0K     0%    /system/object
>   fd                       0K     0K     0K     0%    /dev/fd
>   swap                   512M   1.1M   511M     1%    /tmp
>   swap                   4.9G    72K   4.9G     1%    /var/run
>   /dev/md/dsk/d20         50G    39G    10G    79%    /home
>
> * Run a create-smf-services-from-vfstab script:
>
>   new-eclipse:~# bash /home/slink/smf-mount/mount-simple-admin.sh
>
> * ... and there you are:
>
>   new-eclipse:~# svcs -a | grep filesystem/mountpoint
>   online         11:40:31 svc:/system/filesystem/mountpoint/home:mount
>   online         11:40:31 svc:/system/filesystem/mountpoint/home:fsck
>   online         11:40:33 svc:/system/filesystem/mountpoint/home/X_a:mount
>   online         11:40:35 svc:/system/filesystem/mountpoint/home/X_a/lib:mount
>   online         11:40:37 svc:/system/filesystem/mountpoint/home/test:mount
>   online         11:40:38 svc:/system/filesystem/mountpoint/mnt/test:mount
>
>   an fsck instance ist created for moutpoints of an fstype which
>   supports fsck'ing.
>   (side note: SMF does not accept FMRI components with just one
>    character, so I am working around this by renaming the FMRI, e.g.
>    /home/X_a for /home/a -- I have already opened a bug for this, no
>    bug id yet)
>
>   new-eclipse:~# df -h
>   Filesystem             size   used  avail capacity  Mounted on
>   /dev/md/dsk/d10         20G    18G   1.7G    92%    /
>   /devices                 0K     0K     0K     0%    /devices
>   ctfs                     0K     0K     0K     0%    /system/contract
>   proc                     0K     0K     0K     0%    /proc
>   mnttab                   0K     0K     0K     0%    /etc/mnttab
>   swap                   4.9G   1.2M   4.9G     1%    /etc/svc/volatile
>   objfs                    0K     0K     0K     0%    /system/object
>   fd                       0K     0K     0K     0%    /dev/fd
>   swap                   512M   1.1M   511M     1%    /tmp
>   swap                   4.9G    72K   4.9G     1%    /var/run
>   /dev/md/dsk/d20         50G    39G    10G    79%    /home
>   /usr                    20G    18G   1.7G    92%    /home/a
>   swap                   4.9G     0K   4.9G     0%    /home/a/lib
>   /home/a/lib            4.9G     0K   4.9G     0%    /home/test
>   swap                   4.9G     0K   4.9G     0%    /mnt/test
>
> * Check dependencies:
>
>   new-eclipse:~# svcs -l $(svcs -a | grep filesystem/mountpoint| awk '{ print 
> $3 }')|egrep '^$|^fmri|dep\end'
>   fmri         svc:/system/filesystem/mountpoint/home:mount
>   dependency   optional_all/none svc:system/filesystem/mountpoint/home:fsck 
> (online)
>   dependency   require_all/none svc:/milestone/single-user (online)
>   dependency   require_all/none svc:/system/filesystem/minimal (online)
>
>   fmri         svc:/system/filesystem/mountpoint/home:fsck
>   dependency   require_all/none svc:/milestone/single-user (online)
>   dependency   require_all/none svc:/system/filesystem/minimal (online)
>
>   fmri         svc:/system/filesystem/mountpoint/home/X_a:mount
>   dependency   require_all/none svc:/system/filesystem/mountpoint/home:mount 
> (online)
>   dependency   require_all/none svc:/milestone/single-user (online)
>   dependency   require_all/none svc:/system/filesystem/minimal (online)
>
>   fmri         svc:/system/filesystem/mountpoint/home/X_a/lib:mount
>   dependency   require_all/none 
> svc:/system/filesystem/mountpoint/home/X_a:mount (online)
>   dependency   require_all/none svc:/milestone/single-user (online)
>   dependency   require_all/none svc:/system/filesystem/minimal (online)
>
>   fmri         svc:/system/filesystem/mountpoint/home/test:mount
>   dependency   require_all/none 
> svc:/system/filesystem/mountpoint/home/X_a/lib:mount (online) 
> svc:/syste\m/filesystem/mountpoint/home:mount (online)
>   dependency   require_all/none svc:/milestone/single-user (online)
>   dependency   require_all/none svc:/system/filesystem/minimal (online)
>
>   fmri         svc:/system/filesystem/mountpoint/mnt/test:mount
>   dependency   require_all/none svc:/milestone/single-user (online)
>   dependency   require_all/none svc:/system/filesystem/minimal (online)
>
>   Please note that the home:mount instance depends on home:fsck
>
> I also added properties to make not only the mount options
> configurable, but also fsck. This is something I was missing in the
> past in certain corner cases when the defaults used by /sbin/mountall
> and friends were not suitable:
>
> new-eclipse:~# svcprop svc:/system/filesystem/mountpoint/home |egrep 
> '^(fs/|mount/|umount/|fsck/)'
> fs/type astring ufs
> mount/device astring /dev/md/dsk/d20
> mount/generic_options astring -
> mount/point astring /home
> mount/retry_overlay boolean false
> mount/specific_options astring logging noatime
> umount/generic_options astring -
> umount/retry_with_force boolean false
> umount/specific_options astring -
> fsck/device astring /dev/md/rdsk/d20
> fsck/generic_options astring -
> fsck/specific_options astring -
>
> Status of the prototype:
>
> * DONEs:
>
>   - sh code for SMF methods:
>     fsck  : Based upon /lib/svc/share/fs_include.sh, but modfied to
>             support setting fsck options
>     mount : Using mountfs from /lib/svc/share/fs_include.sh,
>             additional support to try remount with -O if
>             svcprop mount/retry_overlay = true
>     umount: Simple umount with support for umount options
>             forced umount if umount/retry_with_force = true
>
>   - perl code to parse vfstab and extract dependencies
>
>   - admin script: bash code to do the basic vfstab to smf conversion
>
> * TODOs (those which came to my mind)
>
>   - admin script: sync-with-vfstab -- modify properties if something
>     has been changed in vfstab, delete mpoints which have been
>     removed...
>
>   - automate dependencies to metasets and vxvm diskgroups
>
>   - test with zfs
>
>   - move ufs qouta-support from filesystem/local to mount methods
>     (:quota instance ?)
>
>   - finish all the details , ? rewrite admin script in perl ?
>
> This mini project is really not in a state where is should be
> published, but if people are interested, I will definitely publish
> it. But first of all I would like to hear some opinions...
>
> My questions:
>
> - What do you think about this? Is this the right way to go? I believe
>   that it is, but maybe someone has a better idea?
>
> - If this is something that the world needs, I would like to make this
>   an official opensolaris (mini-) project. Who would help to set this
>   up? Who would participate? Would Sun support this concept?
>
> Nils
>  
>  
> This message posted from opensolaris.org
> _______________________________________________
> smf-discuss mailing list
> smf-discuss at opensolaris.org
>   


Reply via email to