xref: /freebsd/sys/contrib/openzfs/etc/init.d/zfs-mount.in (revision e92ffd9b626833ebdbf2742c8ffddc6cd94b963e)
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