1eda14cbcSMatt Macy#!@DEFAULT_INIT_SHELL@ 2*e92ffd9bSMartin Matuska# shellcheck disable=SC2154 3eda14cbcSMatt Macy# 4eda14cbcSMatt Macy# zfs-mount This script will mount/umount the zfs filesystems. 5eda14cbcSMatt Macy# 6eda14cbcSMatt Macy# chkconfig: 2345 06 99 7eda14cbcSMatt Macy# description: This script will mount/umount the zfs filesystems during 8eda14cbcSMatt Macy# system boot/shutdown. Configuration of which filesystems 9eda14cbcSMatt Macy# should be mounted is handled by the zfs 'mountpoint' and 10eda14cbcSMatt Macy# 'canmount' properties. See the zfs(8) man page for details. 11eda14cbcSMatt Macy# It is also responsible for all userspace zfs services. 12eda14cbcSMatt Macy# probe: true 13eda14cbcSMatt Macy# 14eda14cbcSMatt Macy### BEGIN INIT INFO 15eda14cbcSMatt Macy# Provides: zfs-mount 16eda14cbcSMatt Macy# Required-Start: $local_fs zfs-import 17eda14cbcSMatt Macy# Required-Stop: $local_fs zfs-import 18eda14cbcSMatt Macy# Default-Start: 2 3 4 5 19eda14cbcSMatt Macy# Default-Stop: 0 1 6 20eda14cbcSMatt Macy# X-Stop-After: zfs-zed 21eda14cbcSMatt Macy# Short-Description: Mount ZFS filesystems and volumes 22eda14cbcSMatt Macy# Description: Run the `zfs mount -a` or `zfs umount -a` commands. 23eda14cbcSMatt Macy### END INIT INFO 24eda14cbcSMatt Macy# 25eda14cbcSMatt Macy# Released under the 2-clause BSD license. 26eda14cbcSMatt Macy# 2716038816SMartin Matuska# This script is based on debian/zfsutils.zfs.init from the 2816038816SMartin Matuska# Debian GNU/kFreeBSD zfsutils 8.1-3 package, written by Aurelien Jarno. 29eda14cbcSMatt Macy 30eda14cbcSMatt Macy# Source the common init script 31eda14cbcSMatt Macy. @sysconfdir@/zfs/zfs-functions 32eda14cbcSMatt Macy 33eda14cbcSMatt Macy# ---------------------------------------------------- 34eda14cbcSMatt Macy 35eda14cbcSMatt Macychkroot() { 3616038816SMartin Matuska while read -r _ mp _; do 3716038816SMartin Matuska if [ "$mp" = "/" ]; then 38eda14cbcSMatt Macy return 0 39eda14cbcSMatt Macy fi 40eda14cbcSMatt Macy done < /proc/self/mounts 41eda14cbcSMatt Macy 42eda14cbcSMatt Macy return 1 43eda14cbcSMatt Macy} 44eda14cbcSMatt Macy 45eda14cbcSMatt Macydo_depend() 46eda14cbcSMatt Macy{ 47eda14cbcSMatt Macy # Try to allow people to mix and match fstab with ZFS in a way that makes sense. 48eda14cbcSMatt Macy if [ "$(mountinfo -s /)" = 'zfs' ] 49eda14cbcSMatt Macy then 50eda14cbcSMatt Macy before localmount 51eda14cbcSMatt Macy else 52eda14cbcSMatt Macy after localmount 53eda14cbcSMatt Macy fi 54eda14cbcSMatt Macy 55eda14cbcSMatt Macy # bootmisc will log to /var which may be a different zfs than root. 56eda14cbcSMatt Macy before bootmisc logger 57eda14cbcSMatt Macy 58eda14cbcSMatt Macy after zfs-import sysfs 59eda14cbcSMatt Macy use mtab 60eda14cbcSMatt Macy keyword -lxc -openvz -prefix -vserver 61eda14cbcSMatt Macy} 62eda14cbcSMatt Macy 63eda14cbcSMatt Macy# Mount all datasets/filesystems 64eda14cbcSMatt Macydo_mount() 65eda14cbcSMatt Macy{ 6616038816SMartin Matuska local verbose overlay i mntpt 67eda14cbcSMatt Macy 68eda14cbcSMatt Macy check_boolean "$VERBOSE_MOUNT" && verbose=v 69eda14cbcSMatt Macy check_boolean "$DO_OVERLAY_MOUNTS" && overlay=O 70eda14cbcSMatt Macy 71eda14cbcSMatt Macy zfs_action "Mounting ZFS filesystem(s)" \ 72*e92ffd9bSMartin Matuska "$ZFS" mount "-a$verbose$overlay" "$MOUNT_EXTRA_OPTIONS" 73eda14cbcSMatt Macy 74eda14cbcSMatt Macy # Require each volume/filesystem to have 'noauto' and no fsck 75eda14cbcSMatt Macy # option. This shouldn't really be necessary, as long as one 76eda14cbcSMatt Macy # can get zfs-import to run sufficiently early on in the boot 77eda14cbcSMatt Macy # process - before local mounts. This is just here in case/if 78eda14cbcSMatt Macy # this isn't possible. 79eda14cbcSMatt Macy check_boolean "$VERBOSE_MOUNT" && \ 80eda14cbcSMatt Macy zfs_log_begin_msg "Mounting volumes and filesystems registered in fstab" 81eda14cbcSMatt Macy 82eda14cbcSMatt Macy read_mtab "^/dev/(zd|zvol)" 83eda14cbcSMatt Macy read_fstab "^/dev/(zd|zvol)" 8416038816SMartin Matuska i=0; var="FSTAB_0" 8516038816SMartin Matuska while [ -n "$(eval echo "\$$var")" ] 86eda14cbcSMatt Macy do 8716038816SMartin Matuska mntpt=$(eval echo "\$$var") 8816038816SMartin Matuska dev=$(eval echo "\$FSTAB_dev_$i") 89eda14cbcSMatt Macy if ! in_mtab "$mntpt" && ! is_mounted "$mntpt" && [ -e "$dev" ] 90eda14cbcSMatt Macy then 91eda14cbcSMatt Macy check_boolean "$VERBOSE_MOUNT" && \ 92eda14cbcSMatt Macy zfs_log_progress_msg "$mntpt " 93eda14cbcSMatt Macy fsck "$dev" && mount "$mntpt" 94eda14cbcSMatt Macy fi 95eda14cbcSMatt Macy 96eda14cbcSMatt Macy i=$((i + 1)) 9716038816SMartin Matuska var=$(eval echo "FSTAB_$i") 98eda14cbcSMatt Macy done 99eda14cbcSMatt Macy 100eda14cbcSMatt Macy read_mtab "[[:space:]]zfs[[:space:]]" 101eda14cbcSMatt Macy read_fstab "[[:space:]]zfs[[:space:]]" 10216038816SMartin Matuska i=0; var=$(eval echo "FSTAB_$i") 10316038816SMartin Matuska while [ -n "$(eval echo "\$$var")" ] 104eda14cbcSMatt Macy do 10516038816SMartin Matuska mntpt=$(eval echo "\$$var") 106eda14cbcSMatt Macy if ! in_mtab "$mntpt" && ! is_mounted "$mntpt" 107eda14cbcSMatt Macy then 108eda14cbcSMatt Macy check_boolean "$VERBOSE_MOUNT" && \ 109eda14cbcSMatt Macy zfs_log_progress_msg "$mntpt " 110eda14cbcSMatt Macy mount "$mntpt" 111eda14cbcSMatt Macy fi 112eda14cbcSMatt Macy 113eda14cbcSMatt Macy i=$((i + 1)) 11416038816SMartin Matuska var=$(eval echo "FSTAB_$i") 115eda14cbcSMatt Macy done 116eda14cbcSMatt Macy check_boolean "$VERBOSE_MOUNT" && zfs_log_end_msg 0 117eda14cbcSMatt Macy 118eda14cbcSMatt Macy return 0 119eda14cbcSMatt Macy} 120eda14cbcSMatt Macy 121eda14cbcSMatt Macy# Unmount all filesystems 122eda14cbcSMatt Macydo_unmount() 123eda14cbcSMatt Macy{ 124eda14cbcSMatt Macy local i var mntpt 125eda14cbcSMatt Macy 126eda14cbcSMatt Macy # This shouldn't really be necessary, as long as one can get 127eda14cbcSMatt Macy # zfs-import to run sufficiently late in the shutdown/reboot process 128eda14cbcSMatt Macy # - after unmounting local filesystems. This is just here in case/if 129eda14cbcSMatt Macy # this isn't possible. 130eda14cbcSMatt Macy zfs_action "Unmounting ZFS filesystems" "$ZFS" unmount -a 131eda14cbcSMatt Macy 132eda14cbcSMatt Macy check_boolean "$VERBOSE_MOUNT" && \ 133eda14cbcSMatt Macy zfs_log_begin_msg "Unmounting volumes and filesystems registered in fstab" 134eda14cbcSMatt Macy 135eda14cbcSMatt Macy read_mtab "^/dev/(zd|zvol)" 136eda14cbcSMatt Macy read_fstab "^/dev/(zd|zvol)" 13716038816SMartin Matuska i=0; var="FSTAB_0" 13816038816SMartin Matuska while [ -n "$(eval echo "\$$var")" ] 139eda14cbcSMatt Macy do 14016038816SMartin Matuska mntpt=$(eval echo "\$$var") 14116038816SMartin Matuska dev=$(eval echo "\$FSTAB_dev_$i") 142eda14cbcSMatt Macy if in_mtab "$mntpt" 143eda14cbcSMatt Macy then 144eda14cbcSMatt Macy check_boolean "$VERBOSE_MOUNT" && \ 145eda14cbcSMatt Macy zfs_log_progress_msg "$mntpt " 146eda14cbcSMatt Macy umount "$mntpt" 147eda14cbcSMatt Macy fi 148eda14cbcSMatt Macy 149eda14cbcSMatt Macy i=$((i + 1)) 15016038816SMartin Matuska var=$(eval echo "FSTAB_$i") 151eda14cbcSMatt Macy done 152eda14cbcSMatt Macy 153eda14cbcSMatt Macy read_mtab "[[:space:]]zfs[[:space:]]" 154eda14cbcSMatt Macy read_fstab "[[:space:]]zfs[[:space:]]" 15516038816SMartin Matuska i=0; var="FSTAB_0" 15616038816SMartin Matuska while [ -n "$(eval echo "\$$var")" ] 157eda14cbcSMatt Macy do 15816038816SMartin Matuska mntpt=$(eval echo "\$$var") 159eda14cbcSMatt Macy if in_mtab "$mntpt"; then 160eda14cbcSMatt Macy check_boolean "$VERBOSE_MOUNT" && \ 161eda14cbcSMatt Macy zfs_log_progress_msg "$mntpt " 162eda14cbcSMatt Macy umount "$mntpt" 163eda14cbcSMatt Macy fi 164eda14cbcSMatt Macy 165eda14cbcSMatt Macy i=$((i + 1)) 16616038816SMartin Matuska var=$(eval echo "FSTAB_$i") 167eda14cbcSMatt Macy done 168eda14cbcSMatt Macy check_boolean "$VERBOSE_MOUNT" && zfs_log_end_msg 0 169eda14cbcSMatt Macy 170eda14cbcSMatt Macy return 0 171eda14cbcSMatt Macy} 172eda14cbcSMatt Macy 173eda14cbcSMatt Macydo_start() 174eda14cbcSMatt Macy{ 175eda14cbcSMatt Macy check_boolean "$ZFS_MOUNT" || exit 0 176eda14cbcSMatt Macy 177eda14cbcSMatt Macy check_module_loaded "zfs" || exit 0 178eda14cbcSMatt Macy 179eda14cbcSMatt Macy # Ensure / exists in /proc/self/mounts. 180eda14cbcSMatt Macy # This should be handled by rc.sysinit but lets be paranoid. 181eda14cbcSMatt Macy if ! chkroot 182eda14cbcSMatt Macy then 183eda14cbcSMatt Macy mount -f / 184eda14cbcSMatt Macy fi 185eda14cbcSMatt Macy 186eda14cbcSMatt Macy do_mount 187eda14cbcSMatt Macy} 188eda14cbcSMatt Macy 189eda14cbcSMatt Macydo_stop() 190eda14cbcSMatt Macy{ 191eda14cbcSMatt Macy check_boolean "$ZFS_UNMOUNT" || exit 0 192eda14cbcSMatt Macy 193eda14cbcSMatt Macy check_module_loaded "zfs" || exit 0 194eda14cbcSMatt Macy 195eda14cbcSMatt Macy do_unmount 196eda14cbcSMatt Macy} 197eda14cbcSMatt Macy 198eda14cbcSMatt Macy# ---------------------------------------------------- 199eda14cbcSMatt Macy 200eda14cbcSMatt Macyif [ ! -e /sbin/openrc-run ] 201eda14cbcSMatt Macythen 202eda14cbcSMatt Macy case "$1" in 203eda14cbcSMatt Macy start) 204eda14cbcSMatt Macy do_start 205eda14cbcSMatt Macy ;; 206eda14cbcSMatt Macy stop) 207eda14cbcSMatt Macy do_stop 208eda14cbcSMatt Macy ;; 209eda14cbcSMatt Macy force-reload|condrestart|reload|restart|status) 210eda14cbcSMatt Macy # no-op 211eda14cbcSMatt Macy ;; 212eda14cbcSMatt Macy *) 213eda14cbcSMatt Macy [ -n "$1" ] && echo "Error: Unknown command $1." 214eda14cbcSMatt Macy echo "Usage: $0 {start|stop}" 215eda14cbcSMatt Macy exit 3 216eda14cbcSMatt Macy ;; 217eda14cbcSMatt Macy esac 218eda14cbcSMatt Macy 219eda14cbcSMatt Macy exit $? 220eda14cbcSMatt Macyelse 221eda14cbcSMatt Macy # Create wrapper functions since Gentoo don't use the case part. 222eda14cbcSMatt Macy depend() { do_depend; } 223eda14cbcSMatt Macy start() { do_start; } 224eda14cbcSMatt Macy stop() { do_stop; } 225eda14cbcSMatt Macyfi 226