| #!@SHELL@ |
| # |
| # zfs-mount This script will mount/umount the zfs filesystems. |
| # |
| # chkconfig: 2345 06 99 |
| # description: This script will mount/umount the zfs filesystems during |
| # system boot/shutdown. Configuration of which filesystems |
| # should be mounted is handled by the zfs 'mountpoint' and |
| # 'canmount' properties. See the zfs(8) man page for details. |
| # It is also responsible for all userspace zfs services. |
| # probe: true |
| # |
| ### BEGIN INIT INFO |
| # Provides: zfs-mount |
| # Required-Start: $local_fs zfs-import |
| # Required-Stop: $local_fs zfs-import |
| # Default-Start: 2 3 4 5 |
| # Default-Stop: 0 1 6 |
| # X-Stop-After: zfs-zed |
| # Short-Description: Mount ZFS filesystems and volumes |
| # Description: Run the `zfs mount -a` or `zfs umount -a` commands. |
| ### END INIT INFO |
| # |
| # Released under the 2-clause BSD license. |
| # |
| # The original script that acted as a template for this script came from |
| # the Debian GNU/Linux kFreeBSD ZFS packages (which did not include a |
| # licensing stansa) in the commit dated Mar 24, 2011: |
| # https://github.com/zfsonlinux/pkg-zfs/commit/80a3ae582b59c0250d7912ba794dca9e669e605a |
| |
| # Source the common init script |
| . @sysconfdir@/zfs/zfs-functions |
| |
| # ---------------------------------------------------- |
| |
| chkroot() { |
| while read line; do |
| set -- $line |
| if [ "$2" = "/" ]; then |
| return 0 |
| fi |
| done < /proc/self/mounts |
| |
| return 1 |
| } |
| |
| do_depend() |
| { |
| # Try to allow people to mix and match fstab with ZFS in a way that makes sense. |
| if [ "$(mountinfo -s /)" = 'zfs' ] |
| then |
| before localmount |
| else |
| after localmount |
| fi |
| |
| # bootmisc will log to /var which may be a different zfs than root. |
| before bootmisc logger |
| |
| after zfs-import sysfs |
| use mtab |
| keyword -lxc -openvz -prefix -vserver |
| } |
| |
| # Mount all datasets/filesystems |
| do_mount() |
| { |
| local verbose overlay i mntpt val |
| |
| check_boolean "$VERBOSE_MOUNT" && verbose=v |
| check_boolean "$DO_OVERLAY_MOUNTS" && overlay=O |
| |
| zfs_action "Mounting ZFS filesystem(s)" \ |
| "$ZFS" mount -a$verbose$overlay "$MOUNT_EXTRA_OPTIONS" |
| |
| # Require each volume/filesystem to have 'noauto' and no fsck |
| # option. This shouldn't really be necessary, as long as one |
| # can get zfs-import to run sufficiently early on in the boot |
| # process - before local mounts. This is just here in case/if |
| # this isn't possible. |
| check_boolean "$VERBOSE_MOUNT" && \ |
| zfs_log_begin_msg "Mounting volumes and filesystems registered in fstab" |
| |
| read_mtab "^/dev/(zd|zvol)" |
| read_fstab "^/dev/(zd|zvol)" |
| i=0; var=$(eval echo FSTAB_$i) |
| while [ -n "$(eval echo "$""$var")" ] |
| do |
| mntpt=$(eval echo "$""$var") |
| dev=$(eval echo "$"FSTAB_dev_$i) |
| if ! in_mtab "$mntpt" && ! is_mounted "$mntpt" && [ -e "$dev" ] |
| then |
| check_boolean "$VERBOSE_MOUNT" && \ |
| zfs_log_progress_msg "$mntpt " |
| fsck "$dev" && mount "$mntpt" |
| fi |
| |
| i=$((i + 1)) |
| var=$(eval echo FSTAB_$i) |
| done |
| |
| read_mtab "[[:space:]]zfs[[:space:]]" |
| read_fstab "[[:space:]]zfs[[:space:]]" |
| i=0; var=$(eval echo FSTAB_$i) |
| while [ -n "$(eval echo "$""$var")" ] |
| do |
| mntpt=$(eval echo "$""$var") |
| if ! in_mtab "$mntpt" && ! is_mounted "$mntpt" |
| then |
| check_boolean "$VERBOSE_MOUNT" && \ |
| zfs_log_progress_msg "$mntpt " |
| mount "$mntpt" |
| fi |
| |
| i=$((i + 1)) |
| var=$(eval echo FSTAB_$i) |
| done |
| check_boolean "$VERBOSE_MOUNT" && zfs_log_end_msg 0 |
| |
| return 0 |
| } |
| |
| # Unmount all filesystems |
| do_unmount() |
| { |
| local i var mntpt |
| |
| # This shouldn't really be necessary, as long as one can get |
| # zfs-import to run sufficiently late in the shutdown/reboot process |
| # - after unmounting local filesystems. This is just here in case/if |
| # this isn't possible. |
| zfs_action "Unmounting ZFS filesystems" "$ZFS" unmount -a |
| |
| check_boolean "$VERBOSE_MOUNT" && \ |
| zfs_log_begin_msg "Unmounting volumes and filesystems registered in fstab" |
| |
| read_mtab "^/dev/(zd|zvol)" |
| read_fstab "^/dev/(zd|zvol)" |
| i=0; var=$(eval echo FSTAB_$i) |
| while [ -n "$(eval echo "$""$var")" ] |
| do |
| mntpt=$(eval echo "$""$var") |
| dev=$(eval echo "$"FSTAB_dev_$i) |
| if in_mtab "$mntpt" |
| then |
| check_boolean "$VERBOSE_MOUNT" && \ |
| zfs_log_progress_msg "$mntpt " |
| umount "$mntpt" |
| fi |
| |
| i=$((i + 1)) |
| var=$(eval echo FSTAB_$i) |
| done |
| |
| read_mtab "[[:space:]]zfs[[:space:]]" |
| read_fstab "[[:space:]]zfs[[:space:]]" |
| i=0; var=$(eval echo FSTAB_$i) |
| while [ -n "$(eval echo "$""$var")" ] |
| do |
| mntpt=$(eval echo "$""$var") |
| if in_mtab "$mntpt"; then |
| check_boolean "$VERBOSE_MOUNT" && \ |
| zfs_log_progress_msg "$mntpt " |
| umount "$mntpt" |
| fi |
| |
| i=$((i + 1)) |
| var=$(eval echo FSTAB_$i) |
| done |
| check_boolean "$VERBOSE_MOUNT" && zfs_log_end_msg 0 |
| |
| return 0 |
| } |
| |
| do_start() |
| { |
| check_boolean "$ZFS_MOUNT" || exit 0 |
| |
| check_module_loaded "zfs" || exit 0 |
| |
| # Ensure / exists in /proc/self/mounts. |
| # This should be handled by rc.sysinit but lets be paranoid. |
| if ! chkroot |
| then |
| mount -f / |
| fi |
| |
| do_mount |
| } |
| |
| do_stop() |
| { |
| check_boolean "$ZFS_UNMOUNT" || exit 0 |
| |
| check_module_loaded "zfs" || exit 0 |
| |
| do_unmount |
| } |
| |
| # ---------------------------------------------------- |
| |
| if [ ! -e /sbin/openrc-run ] |
| then |
| case "$1" in |
| start) |
| do_start |
| ;; |
| stop) |
| do_stop |
| ;; |
| force-reload|condrestart|reload|restart|status) |
| # no-op |
| ;; |
| *) |
| [ -n "$1" ] && echo "Error: Unknown command $1." |
| echo "Usage: $0 {start|stop}" |
| exit 3 |
| ;; |
| esac |
| |
| exit $? |
| else |
| # Create wrapper functions since Gentoo don't use the case part. |
| depend() { do_depend; } |
| start() { do_start; } |
| stop() { do_stop; } |
| fi |