]> granicus.if.org Git - zfs/blob - etc/init.d/zfs-mount.in
Fix for ARC sysctls ignored at runtime
[zfs] / etc / init.d / zfs-mount.in
1 #!@SHELL@
2 #
3 # zfs-mount     This script will mount/umount the zfs filesystems.
4 #
5 # chkconfig:    2345 06 99
6 # description:  This script will mount/umount the zfs filesystems during
7 #               system boot/shutdown. Configuration of which filesystems
8 #               should be mounted is handled by the zfs 'mountpoint' and
9 #               'canmount' properties. See the zfs(8) man page for details.
10 #               It is also responsible for all userspace zfs services.
11 # probe: true
12 #
13 ### BEGIN INIT INFO
14 # Provides:          zfs-mount
15 # Required-Start:    $local_fs zfs-import
16 # Required-Stop:     $local_fs zfs-import
17 # Default-Start:     2 3 4 5
18 # Default-Stop:      0 1 6
19 # X-Stop-After:      zfs-zed
20 # Short-Description: Mount ZFS filesystems and volumes
21 # Description: Run the `zfs mount -a` or `zfs umount -a` commands.
22 ### END INIT INFO
23 #
24 # Released under the 2-clause BSD license.
25 #
26 # The original script that acted as a template for this script came from
27 # the Debian GNU/Linux kFreeBSD ZFS packages (which did not include a
28 # licensing stansa) in the commit dated Mar 24, 2011:
29 #   https://github.com/zfsonlinux/pkg-zfs/commit/80a3ae582b59c0250d7912ba794dca9e669e605a
30
31 # Source the common init script
32 . @sysconfdir@/zfs/zfs-functions
33
34 # ----------------------------------------------------
35
36 chkroot() {
37         while read line; do
38                 set -- $line
39                 if [ "$2" = "/" ]; then
40                         return 0
41                 fi
42         done < /proc/self/mounts
43
44         return 1
45 }
46
47 do_depend()
48 {
49         # Try to allow people to mix and match fstab with ZFS in a way that makes sense.
50         if [ "$(mountinfo -s /)" = 'zfs' ]
51         then
52                 before localmount
53         else
54                 after localmount
55         fi
56
57         # bootmisc will log to /var which may be a different zfs than root.
58         before bootmisc logger
59
60         after zfs-import sysfs
61         use mtab
62         keyword -lxc -openvz -prefix -vserver
63 }
64
65 # Mount all datasets/filesystems
66 do_mount()
67 {
68         local verbose overlay i mntpt val
69
70         check_boolean "$VERBOSE_MOUNT" && verbose=v
71         check_boolean "$DO_OVERLAY_MOUNTS" && overlay=O
72
73         zfs_action "Mounting ZFS filesystem(s)" \
74             "$ZFS" mount -a$verbose$overlay "$MOUNT_EXTRA_OPTIONS"
75
76         # Require each volume/filesystem to have 'noauto' and no fsck
77         # option. This shouldn't really be necessary, as long as one
78         # can get zfs-import to run sufficiently early on in the boot
79         # process - before local mounts. This is just here in case/if
80         # this isn't possible.
81         check_boolean "$VERBOSE_MOUNT" && \
82             zfs_log_begin_msg "Mounting volumes and filesystems registered in fstab"
83
84         read_mtab  "^/dev/(zd|zvol)"
85         read_fstab "^/dev/(zd|zvol)"
86         i=0; var=$(eval echo FSTAB_$i)
87         while [ -n "$(eval echo "$""$var")" ]
88         do
89                 mntpt=$(eval echo "$""$var")
90                 dev=$(eval echo "$"FSTAB_dev_$i)
91                 if ! in_mtab "$mntpt" && ! is_mounted "$mntpt" && [ -e "$dev" ]
92                 then
93                         check_boolean "$VERBOSE_MOUNT" && \
94                                 zfs_log_progress_msg "$mntpt "
95                         fsck "$dev" && mount "$mntpt"
96                 fi
97
98                 i=$((i + 1))
99                 var=$(eval echo FSTAB_$i)
100         done
101
102         read_mtab  "[[:space:]]zfs[[:space:]]"
103         read_fstab "[[:space:]]zfs[[:space:]]"
104         i=0; var=$(eval echo FSTAB_$i)
105         while [ -n "$(eval echo "$""$var")" ]
106         do
107                 mntpt=$(eval echo "$""$var")
108                 if ! in_mtab "$mntpt" && ! is_mounted "$mntpt"
109                 then
110                         check_boolean "$VERBOSE_MOUNT" && \
111                                 zfs_log_progress_msg "$mntpt "
112                         mount "$mntpt"
113                 fi
114
115                 i=$((i + 1))
116                 var=$(eval echo FSTAB_$i)
117         done
118         check_boolean "$VERBOSE_MOUNT" && zfs_log_end_msg 0
119
120         return 0
121 }
122
123 # Unmount all filesystems
124 do_unmount()
125 {
126         local i var mntpt
127
128         # This shouldn't really be necessary, as long as one can get
129         # zfs-import to run sufficiently late in the shutdown/reboot process
130         # - after unmounting local filesystems. This is just here in case/if
131         # this isn't possible.
132         zfs_action "Unmounting ZFS filesystems" "$ZFS" unmount -a
133
134         check_boolean "$VERBOSE_MOUNT" && \
135             zfs_log_begin_msg "Unmounting volumes and filesystems registered in fstab"
136
137         read_mtab  "^/dev/(zd|zvol)"
138         read_fstab "^/dev/(zd|zvol)"
139         i=0; var=$(eval echo FSTAB_$i)
140         while [ -n "$(eval echo "$""$var")" ]
141         do
142                 mntpt=$(eval echo "$""$var")
143                 dev=$(eval echo "$"FSTAB_dev_$i)
144                 if in_mtab "$mntpt"
145                 then
146                         check_boolean "$VERBOSE_MOUNT" && \
147                                 zfs_log_progress_msg "$mntpt "
148                         umount "$mntpt"
149                 fi
150
151                 i=$((i + 1))
152                 var=$(eval echo FSTAB_$i)
153         done
154
155         read_mtab  "[[:space:]]zfs[[:space:]]"
156         read_fstab "[[:space:]]zfs[[:space:]]"
157         i=0; var=$(eval echo FSTAB_$i)
158         while [ -n "$(eval echo "$""$var")" ]
159         do
160                 mntpt=$(eval echo "$""$var")
161                 if in_mtab "$mntpt"; then
162                         check_boolean "$VERBOSE_MOUNT" && \
163                             zfs_log_progress_msg "$mntpt "
164                         umount "$mntpt"
165                 fi
166
167                 i=$((i + 1))
168                 var=$(eval echo FSTAB_$i)
169         done
170         check_boolean "$VERBOSE_MOUNT" && zfs_log_end_msg 0
171
172         return 0
173 }
174
175 do_start()
176 {
177         check_boolean "$ZFS_MOUNT" || exit 0
178
179         check_module_loaded "zfs" || exit 0
180
181         # Ensure / exists in /proc/self/mounts.
182         # This should be handled by rc.sysinit but lets be paranoid.
183         if ! chkroot
184         then
185                 mount -f /
186         fi
187
188         do_mount
189 }
190
191 do_stop()
192 {
193         check_boolean "$ZFS_UNMOUNT" || exit 0
194
195         check_module_loaded "zfs" || exit 0
196
197         do_unmount
198 }
199
200 # ----------------------------------------------------
201
202 if [ ! -e /sbin/openrc-run ]
203 then
204         case "$1" in
205                 start)
206                         do_start
207                         ;;
208                 stop)
209                         do_stop
210                         ;;
211                 force-reload|condrestart|reload|restart|status)
212                         # no-op
213                         ;;
214                 *)
215                         [ -n "$1" ] && echo "Error: Unknown command $1."
216                         echo "Usage: $0 {start|stop}"
217                         exit 3
218                         ;;
219         esac
220
221         exit $?
222 else
223         # Create wrapper functions since Gentoo don't use the case part.
224         depend() { do_depend; }
225         start() { do_start; }
226         stop() { do_stop; }
227 fi