mirror of
				https://git.proxmox.com/git/mirror_zfs.git
				synced 2025-10-26 18:05:04 +03:00 
			
		
		
		
	Add systemd unit files for ZFS startup
This adds systemd unit files replacing the functionality offered by
the SysV init script found in etc/init.d.
It has been developed and tested on Fedora 19, Fedora 20
and openSuSE 13.1.
Four unit files and one target are offered.
zfs-import-cache.service:
    Import pools from /etc/zfs/zpool.cache. This unit will wait for
    udev to settle.
zfs-import-scan.service:
    Import pools by scanning /dev/disk/by-id for zvols. This unit will
    only run if /etc/zfs/zpool.cache is not present. This unit will wait
    for udev to settle
zfs-mount.service:
    Mount ZFS native filesystems. It contains a dependency to be loaded
    before local-fs.target.
zfs-share.service:
    Share NFS/SMB filesystems. This unit contains a dependency that
    will cause it to be restarted whenever the smb or nfs-server unit
    is restarted, restoring the shares added.
zfs.target:
    This target pulls in the other units in order to start ZFS. It's
    the only unit that can be enabled/disabled, all other services
    are static and pulled in by dependencies. It will honour zfs=off
    and zfs=no options on the kernel command line.
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #2108
			
			
This commit is contained in:
		
							parent
							
								
									c5cb66addc
								
							
						
					
					
						commit
						881f45c6a8
					
				
							
								
								
									
										29
									
								
								config/user-systemd.m4
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								config/user-systemd.m4
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,29 @@ | |||||||
|  | AC_DEFUN([ZFS_AC_CONFIG_USER_SYSTEMD], [ | ||||||
|  | 	AC_ARG_ENABLE(systemd, | ||||||
|  | 		AC_HELP_STRING([--enable-systemd], | ||||||
|  | 		[install systemd unit/preset files [[default: yes]]]), | ||||||
|  | 		[],enable_systemd=yes) | ||||||
|  | 
 | ||||||
|  | 	AC_ARG_WITH(systemdunitdir, | ||||||
|  | 		AC_HELP_STRING([--with-systemdunitdir=DIR], | ||||||
|  | 		[install systemd unit files in dir [[/usr/lib/systemd/system]]]), | ||||||
|  | 		systemdunitdir=$withval,systemdunitdir=/usr/lib/systemd/system) | ||||||
|  | 
 | ||||||
|  | 	AC_ARG_WITH(systemdpresetdir, | ||||||
|  | 		AC_HELP_STRING([--with-systemdpresetdir=DIR], | ||||||
|  | 		[install systemd preset files in dir [[/usr/lib/systemd/system-preset]]]), | ||||||
|  | 		systemdpresetdir=$withval,systemdpresetdir=/usr/lib/systemd/system-preset) | ||||||
|  | 
 | ||||||
|  | 	AS_IF([test "x$enable_systemd" = xyes], | ||||||
|  | 		[ | ||||||
|  | 		ZFS_INIT_SYSTEMD=systemd | ||||||
|  | 		ZFS_MODULE_LOAD=modules-load.d | ||||||
|  | 		modulesloaddir=/usr/lib/modules-load.d | ||||||
|  | 		]) | ||||||
|  | 
 | ||||||
|  | 	AC_SUBST(ZFS_INIT_SYSTEMD) | ||||||
|  | 	AC_SUBST(ZFS_MODULE_LOAD) | ||||||
|  | 	AC_SUBST(systemdunitdir) | ||||||
|  | 	AC_SUBST(systemdpresetdir) | ||||||
|  | 	AC_SUBST(modulesloaddir) | ||||||
|  | ]) | ||||||
							
								
								
									
										11
									
								
								config/user-sysvinit.m4
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								config/user-sysvinit.m4
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,11 @@ | |||||||
|  | AC_DEFUN([ZFS_AC_CONFIG_USER_SYSVINIT], [ | ||||||
|  | 	AC_ARG_ENABLE(sysvinit, | ||||||
|  | 		AC_HELP_STRING([--enable-sysvinit], | ||||||
|  | 		[install SysV init scripts [default: yes]]), | ||||||
|  | 		[],enable_sysvinit=yes) | ||||||
|  | 
 | ||||||
|  | 	AS_IF([test "x$enable_sysvinit" = xyes], | ||||||
|  | 		[ZFS_INIT_SYSV=init.d]) | ||||||
|  | 
 | ||||||
|  | 	AC_SUBST(ZFS_INIT_SYSV) | ||||||
|  | ]) | ||||||
| @ -3,6 +3,8 @@ dnl # Default ZFS user configuration | |||||||
| dnl # | dnl # | ||||||
| AC_DEFUN([ZFS_AC_CONFIG_USER], [ | AC_DEFUN([ZFS_AC_CONFIG_USER], [ | ||||||
| 	ZFS_AC_CONFIG_USER_UDEV | 	ZFS_AC_CONFIG_USER_UDEV | ||||||
|  | 	ZFS_AC_CONFIG_USER_SYSTEMD | ||||||
|  | 	ZFS_AC_CONFIG_USER_SYSVINIT | ||||||
| 	ZFS_AC_CONFIG_USER_DRACUT | 	ZFS_AC_CONFIG_USER_DRACUT | ||||||
| 	ZFS_AC_CONFIG_USER_ARCH | 	ZFS_AC_CONFIG_USER_ARCH | ||||||
| 	ZFS_AC_CONFIG_USER_IOCTL | 	ZFS_AC_CONFIG_USER_IOCTL | ||||||
|  | |||||||
| @ -64,6 +64,9 @@ AC_CONFIG_FILES([ | |||||||
| 	etc/Makefile | 	etc/Makefile | ||||||
| 	etc/init.d/Makefile | 	etc/init.d/Makefile | ||||||
| 	etc/zfs/Makefile | 	etc/zfs/Makefile | ||||||
|  | 	etc/systemd/Makefile | ||||||
|  | 	etc/systemd/system/Makefile | ||||||
|  | 	etc/modules-load.d/Makefile | ||||||
| 	man/Makefile | 	man/Makefile | ||||||
| 	man/man1/Makefile | 	man/man1/Makefile | ||||||
| 	man/man5/Makefile | 	man/man5/Makefile | ||||||
|  | |||||||
| @ -1 +1,2 @@ | |||||||
| SUBDIRS = init.d zfs | SUBDIRS = zfs $(ZFS_INIT_SYSTEMD) $(ZFS_INIT_SYSV) $(ZFS_MODULE_LOAD) | ||||||
|  | DIST_SUBDIRS = init.d zfs systemd modules-load.d | ||||||
|  | |||||||
							
								
								
									
										1
									
								
								etc/modules-load.d/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								etc/modules-load.d/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | |||||||
|  | *.conf | ||||||
							
								
								
									
										13
									
								
								etc/modules-load.d/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								etc/modules-load.d/Makefile.am
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,13 @@ | |||||||
|  | modulesload_DATA = \
 | ||||||
|  | 	$(top_srcdir)/etc/modules-load.d/zfs.conf | ||||||
|  | 
 | ||||||
|  | EXTRA_DIST = \
 | ||||||
|  | 	$(top_srcdir)/etc/modules-load.d/zfs.conf.in | ||||||
|  | 
 | ||||||
|  | $(modulesload_DATA): | ||||||
|  | 	-$(SED) \
 | ||||||
|  | 		-e '' \
 | ||||||
|  | 		'$@.in' >'$@' | ||||||
|  | 
 | ||||||
|  | distclean-local:: | ||||||
|  | 	-$(RM) $(modulesload_DATA) | ||||||
							
								
								
									
										1
									
								
								etc/modules-load.d/zfs.conf.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								etc/modules-load.d/zfs.conf.in
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | |||||||
|  | zfs | ||||||
							
								
								
									
										1
									
								
								etc/systemd/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								etc/systemd/Makefile.am
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | |||||||
|  | SUBDIRS = system | ||||||
							
								
								
									
										3
									
								
								etc/systemd/system/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								etc/systemd/system/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,3 @@ | |||||||
|  | *.service | ||||||
|  | *.target | ||||||
|  | *.preset | ||||||
							
								
								
									
										2
									
								
								etc/systemd/system/50-zfs.preset.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								etc/systemd/system/50-zfs.preset.in
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,2 @@ | |||||||
|  | # ZFS is enabled by default | ||||||
|  | enable zfs.* | ||||||
							
								
								
									
										31
									
								
								etc/systemd/system/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								etc/systemd/system/Makefile.am
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,31 @@ | |||||||
|  | systemdpreset_DATA = \
 | ||||||
|  | 	$(top_srcdir)/etc/systemd/system/50-zfs.preset | ||||||
|  | systemdunit_DATA = \
 | ||||||
|  | 	$(top_srcdir)/etc/systemd/system/zfs-import-scan.service \
 | ||||||
|  | 	$(top_srcdir)/etc/systemd/system/zfs-import-cache.service \
 | ||||||
|  | 	$(top_srcdir)/etc/systemd/system/zfs-mount.service \
 | ||||||
|  | 	$(top_srcdir)/etc/systemd/system/zfs-share.service \
 | ||||||
|  | 	$(top_srcdir)/etc/systemd/system/zfs.target | ||||||
|  | 
 | ||||||
|  | EXTRA_DIST = \
 | ||||||
|  | 	$(top_srcdir)/etc/systemd/system/zfs-import-scan.service.in \
 | ||||||
|  | 	$(top_srcdir)/etc/systemd/system/zfs-import-cache.service.in \
 | ||||||
|  | 	$(top_srcdir)/etc/systemd/system/zfs-mount.service.in \
 | ||||||
|  | 	$(top_srcdir)/etc/systemd/system/zfs-share.service.in \
 | ||||||
|  | 	$(top_srcdir)/etc/systemd/system/zfs.target.in \
 | ||||||
|  | 	$(top_srcdir)/etc/systemd/system/50-zfs.preset.in | ||||||
|  | 
 | ||||||
|  | $(systemdunit_DATA): | ||||||
|  | 	-$(SED) -e 's,@bindir\@,$(bindir),g' \
 | ||||||
|  | 		-e 's,@sbindir\@,$(sbindir),g' \
 | ||||||
|  | 		-e 's,@sysconfdir\@,$(sysconfdir),g' \
 | ||||||
|  | 		'$@.in' >'$@' | ||||||
|  | 
 | ||||||
|  | $(systemdpreset_DATA): | ||||||
|  | 	-$(SED) -e 's,@bindir\@,$(bindir),g' \
 | ||||||
|  | 		-e 's,@sbindir\@,$(sbindir),g' \
 | ||||||
|  | 		-e 's,@sysconfdir\@,$(sysconfdir),g' \
 | ||||||
|  | 		'$@.in' >'$@' | ||||||
|  | 
 | ||||||
|  | distclean-local:: | ||||||
|  | 	-$(RM) $(systemdunit_DATA) $(systemdpreset_DATA) | ||||||
							
								
								
									
										11
									
								
								etc/systemd/system/zfs-import-cache.service.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								etc/systemd/system/zfs-import-cache.service.in
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,11 @@ | |||||||
|  | [Unit] | ||||||
|  | Description=Import ZFS pools by cache file | ||||||
|  | DefaultDependencies=no | ||||||
|  | Requires=systemd-udev-settle.service | ||||||
|  | After=systemd-udev-settle.service | ||||||
|  | ConditionPathExists=@sysconfdir@/zfs/zpool.cache | ||||||
|  | 
 | ||||||
|  | [Service] | ||||||
|  | Type=oneshot | ||||||
|  | RemainAfterExit=yes | ||||||
|  | ExecStart=@sbindir@/zpool import -c @sysconfdir@/zfs/zpool.cache -aN | ||||||
							
								
								
									
										11
									
								
								etc/systemd/system/zfs-import-scan.service.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								etc/systemd/system/zfs-import-scan.service.in
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,11 @@ | |||||||
|  | [Unit] | ||||||
|  | Description=Import ZFS pools by device scanning | ||||||
|  | DefaultDependencies=no | ||||||
|  | Requires=systemd-udev-settle.service | ||||||
|  | After=systemd-udev-settle.service | ||||||
|  | ConditionPathExists=!@sysconfdir@/zfs/zpool.cache | ||||||
|  | 
 | ||||||
|  | [Service] | ||||||
|  | Type=oneshot | ||||||
|  | RemainAfterExit=yes | ||||||
|  | ExecStart=@sbindir@/zpool import -d /dev/disk/by-id -aN | ||||||
							
								
								
									
										15
									
								
								etc/systemd/system/zfs-mount.service.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								etc/systemd/system/zfs-mount.service.in
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,15 @@ | |||||||
|  | [Unit] | ||||||
|  | Description=Mount ZFS filesystems | ||||||
|  | DefaultDependencies=no | ||||||
|  | Wants=zfs-import-cache.service | ||||||
|  | Wants=zfs-import-scan.service | ||||||
|  | Requires=systemd-udev-settle.service | ||||||
|  | After=systemd-udev-settle.service | ||||||
|  | After=zfs-import-cache.service | ||||||
|  | After=zfs-import-scan.service | ||||||
|  | Before=local-fs.target | ||||||
|  | 
 | ||||||
|  | [Service] | ||||||
|  | Type=oneshot | ||||||
|  | RemainAfterExit=yes | ||||||
|  | ExecStart=@sbindir@/zfs mount -a | ||||||
							
								
								
									
										11
									
								
								etc/systemd/system/zfs-share.service.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								etc/systemd/system/zfs-share.service.in
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,11 @@ | |||||||
|  | [Unit] | ||||||
|  | Description=ZFS file system shares | ||||||
|  | After=nfs-server.service | ||||||
|  | After=smb.service | ||||||
|  | PartOf=nfs-server.service | ||||||
|  | PartOf=smb.service | ||||||
|  | 
 | ||||||
|  | [Service] | ||||||
|  | Type=oneshot | ||||||
|  | RemainAfterExit=yes | ||||||
|  | ExecStart=@sbindir@/zfs share -a | ||||||
							
								
								
									
										7
									
								
								etc/systemd/system/zfs.target.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								etc/systemd/system/zfs.target.in
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | |||||||
|  | [Unit] | ||||||
|  | Description=ZFS startup target | ||||||
|  | Requires=zfs-mount.service | ||||||
|  | Requires=zfs-share.service | ||||||
|  | 
 | ||||||
|  | [Install] | ||||||
|  | WantedBy=multi-user.target | ||||||
| @ -10,7 +10,24 @@ | |||||||
| 
 | 
 | ||||||
| %bcond_with    debug | %bcond_with    debug | ||||||
| %bcond_with    blkid | %bcond_with    blkid | ||||||
|  | %bcond_with    systemd | ||||||
| 
 | 
 | ||||||
|  | # Generic enable switch for systemd | ||||||
|  | %if %{with systemd} | ||||||
|  | %define _systemd 1 | ||||||
|  | %endif | ||||||
|  | 
 | ||||||
|  | # Fedora >= 15 comes with systemd, but only >= 18 has | ||||||
|  | # the proper macros | ||||||
|  | %if 0%{?fedora} >= 18 | ||||||
|  | %define _systemd 1 | ||||||
|  | %endif | ||||||
|  | 
 | ||||||
|  | # opensuse >= 12.1 comes with systemd, but only >= 13.1 | ||||||
|  | # has the proper macros | ||||||
|  | %if 0%{?suse_version} >= 1310 | ||||||
|  | %define _systemd 1 | ||||||
|  | %endif | ||||||
| 
 | 
 | ||||||
| Name:           @PACKAGE@ | Name:           @PACKAGE@ | ||||||
| Version:        @VERSION@ | Version:        @VERSION@ | ||||||
| @ -38,6 +55,12 @@ BuildRequires:  libuuid-devel | |||||||
| BuildRequires:  libblkid-devel | BuildRequires:  libblkid-devel | ||||||
| %endif | %endif | ||||||
| %endif | %endif | ||||||
|  | %if 0%{?_systemd} | ||||||
|  | Requires(post): systemd | ||||||
|  | Requires(preun): systemd | ||||||
|  | Requires(postun): systemd | ||||||
|  | BuildRequires: systemd | ||||||
|  | %endif | ||||||
| 
 | 
 | ||||||
| %description | %description | ||||||
| This package contains the ZFS command line utilities and libraries. | This package contains the ZFS command line utilities and libraries. | ||||||
| @ -85,6 +108,11 @@ image which is ZFS aware. | |||||||
| %else | %else | ||||||
|     %define blkid --without-blkid |     %define blkid --without-blkid | ||||||
| %endif | %endif | ||||||
|  | %if 0%{?_systemd} | ||||||
|  |     %define systemd --enable-systemd --with-systemdunitdir=%{_unitdir} --with-systemdpresetdir=%{_presetdir} --disable-sysvinit | ||||||
|  | %else | ||||||
|  |     %define systemd --enable-sysvinit --disable-systemd | ||||||
|  | %endif | ||||||
| 
 | 
 | ||||||
| %setup -q | %setup -q | ||||||
| 
 | 
 | ||||||
| @ -95,7 +123,8 @@ image which is ZFS aware. | |||||||
|     --with-dracutdir=%{_dracutdir} \ |     --with-dracutdir=%{_dracutdir} \ | ||||||
|     --disable-static \ |     --disable-static \ | ||||||
|     %{debug} \ |     %{debug} \ | ||||||
|     %{blkid} |     %{blkid} \ | ||||||
|  |     %{systemd} | ||||||
| make %{?_smp_mflags} | make %{?_smp_mflags} | ||||||
| 
 | 
 | ||||||
| %install | %install | ||||||
| @ -105,16 +134,28 @@ find %{?buildroot}%{_libdir} -name '*.la' -exec rm -f {} \; | |||||||
| 
 | 
 | ||||||
| %post | %post | ||||||
| /sbin/ldconfig | /sbin/ldconfig | ||||||
|  | %if 0%{?_systemd} | ||||||
|  | %systemd_post zfs.target | ||||||
|  | %else | ||||||
| [ -x /sbin/chkconfig ] && /sbin/chkconfig --add zfs | [ -x /sbin/chkconfig ] && /sbin/chkconfig --add zfs | ||||||
|  | %endif | ||||||
| exit 0 | exit 0 | ||||||
| 
 | 
 | ||||||
| %preun | %preun | ||||||
|  | %if 0%{?_systemd} | ||||||
|  | %systemd_preun zfs.target | ||||||
|  | %else | ||||||
| if [ $1 -eq 0 ] ; then | if [ $1 -eq 0 ] ; then | ||||||
|     [ -x /sbin/chkconfig ] && /sbin/chkconfig --del zfs |     [ -x /sbin/chkconfig ] && /sbin/chkconfig --del zfs | ||||||
| fi | fi | ||||||
|  | %endif | ||||||
| exit 0 | exit 0 | ||||||
| 
 | 
 | ||||||
| %postun -p /sbin/ldconfig | %postun | ||||||
|  | /sbin/ldconfig | ||||||
|  | %if 0%{?_systemd} | ||||||
|  | %systemd_postun zfs.target | ||||||
|  | %endif | ||||||
| 
 | 
 | ||||||
| %files | %files | ||||||
| %doc AUTHORS COPYRIGHT DISCLAIMER | %doc AUTHORS COPYRIGHT DISCLAIMER | ||||||
| @ -129,7 +170,13 @@ exit 0 | |||||||
| %{_udevdir}/zvol_id | %{_udevdir}/zvol_id | ||||||
| %{_udevdir}/rules.d/* | %{_udevdir}/rules.d/* | ||||||
| %config(noreplace) %{_sysconfdir}/%{name} | %config(noreplace) %{_sysconfdir}/%{name} | ||||||
|  | %if 0%{?_systemd} | ||||||
|  | /usr/lib/modules-load.d/* | ||||||
|  | %{_unitdir}/* | ||||||
|  | %{_presetdir}/* | ||||||
|  | %else | ||||||
| %{_sysconfdir}/init.d/* | %{_sysconfdir}/init.d/* | ||||||
|  | %endif | ||||||
| 
 | 
 | ||||||
| %files devel | %files devel | ||||||
| %{_libdir}/*.so | %{_libdir}/*.so | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Ralf Ertzinger
						Ralf Ertzinger