aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/dracut/90zfs/module-setup.sh.in
blob: edc9955bf4731af7618380c5f9efdaf3136ae7a5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#!/usr/bin/env bash
# shellcheck disable=SC2154

check() {
	# We depend on udev-rules being loaded
	[ "${1}" = "-d" ] && return 0

	# Verify the zfs tool chain
	for tool in "@sbindir@/zgenhostid" "@sbindir@/zpool" "@sbindir@/zfs" "@mounthelperdir@/mount.zfs" ; do
		test -x "$tool" || return 1
	done

	return 0
}

depends() {
	echo udev-rules
	return 0
}

installkernel() {
	instmods zfs
	instmods zcommon
	instmods znvpair
	instmods zavl
	instmods zunicode
	instmods zlua
	instmods icp
	instmods spl
	instmods zlib_deflate
	instmods zlib_inflate
}

install() {
	inst_rules @udevruledir@/90-zfs.rules
	inst_rules @udevruledir@/69-vdev.rules
	inst_rules @udevruledir@/60-zvol.rules
	dracut_install hostid
	dracut_install grep
	dracut_install @sbindir@/zgenhostid
	dracut_install @sbindir@/zfs
	dracut_install @sbindir@/zpool
	# Workaround for https://github.com/openzfs/zfs/issues/4749 by
	# ensuring libgcc_s.so(.1) is included
	if ldd @sbindir@/zpool | grep -qF 'libgcc_s.so'; then
		# Dracut will have already tracked and included it
		:;
	elif command -v gcc-config >/dev/null 2>&1; then
		# On systems with gcc-config (Gentoo, Funtoo, etc.):
		# Use the current profile to resolve the appropriate path
		s="$(gcc-config -c)"
		dracut_install "/usr/lib/gcc/${s%-*}/${s##*-}/libgcc_s.so"*
	elif [ "$(echo /usr/lib/libgcc_s.so*)" != "/usr/lib/libgcc_s.so*" ]; then
		# Try a simple path first
		dracut_install /usr/lib/libgcc_s.so*
	elif [ "$(echo /lib*/libgcc_s.so*)" != "/lib*/libgcc_s.so*" ]; then
		# SUSE
		dracut_install /lib*/libgcc_s.so*
	else
		# Fallback: Guess the path and include all matches
		dracut_install /usr/lib*/gcc/**/libgcc_s.so*
	fi
	# shellcheck disable=SC2050
	if [ @LIBFETCH_DYNAMIC@ != 0 ]; then
		for d in $libdirs; do
			[ -e "$d/"@LIBFETCH_SONAME@ ] && dracut_install "$d/"@LIBFETCH_SONAME@
		done
	fi
	dracut_install @mounthelperdir@/mount.zfs
	dracut_install @udevdir@/vdev_id
	dracut_install awk
	dracut_install cut
	dracut_install tr
	dracut_install head
	dracut_install @udevdir@/zvol_id
	inst_hook cmdline 95 "${moddir}/parse-zfs.sh"
	if [ -n "$systemdutildir" ] ; then
		inst_script "${moddir}/zfs-generator.sh" "$systemdutildir"/system-generators/dracut-zfs-generator
	fi
	inst_hook pre-mount 90 "${moddir}/zfs-load-key.sh"
	inst_hook mount 98 "${moddir}/mount-zfs.sh"
	inst_hook cleanup 99 "${moddir}/zfs-needshutdown.sh"
	inst_hook shutdown 20 "${moddir}/export-zfs.sh"

	inst_simple "${moddir}/zfs-lib.sh" "/lib/dracut-zfs-lib.sh"
	if [ -e @sysconfdir@/zfs/zpool.cache ]; then
		inst @sysconfdir@/zfs/zpool.cache
		type mark_hostonly >/dev/null 2>&1 && mark_hostonly @sysconfdir@/zfs/zpool.cache
	fi

	if [ -e @sysconfdir@/zfs/vdev_id.conf ]; then
		inst @sysconfdir@/zfs/vdev_id.conf
		type mark_hostonly >/dev/null 2>&1 && mark_hostonly @sysconfdir@/zfs/vdev_id.conf
	fi

	# Synchronize initramfs and system hostid
	if [ -f @sysconfdir@/hostid ]; then
		inst @sysconfdir@/hostid
		type mark_hostonly >/dev/null 2>&1 && mark_hostonly @sysconfdir@/hostid
	elif HOSTID="$(hostid 2>/dev/null)" && [ "${HOSTID}" != "00000000" ]; then
		zgenhostid -o "${initdir}@sysconfdir@/hostid" "${HOSTID}"
		type mark_hostonly >/dev/null 2>&1 && mark_hostonly @sysconfdir@/hostid
	fi

	if dracut_module_included "systemd"; then
		mkdir -p "${initdir}/$systemdsystemunitdir/zfs-import.target.wants"
		for _service in "zfs-import-scan.service" "zfs-import-cache.service" ; do
			dracut_install "@systemdunitdir@/$_service"
			if ! [ -L "${initdir}/$systemdsystemunitdir/zfs-import.target.wants/$_service" ]; then
				ln -sf "../$_service" "${initdir}/$systemdsystemunitdir/zfs-import.target.wants/$_service"
				type mark_hostonly >/dev/null 2>&1 && mark_hostonly "@systemdunitdir@/$_service"
			fi
		done

		inst "${moddir}"/zfs-env-bootfs.service "${systemdsystemunitdir}"/zfs-env-bootfs.service
		ln -s ../zfs-env-bootfs.service "${initdir}/${systemdsystemunitdir}/zfs-import.target.wants"/zfs-env-bootfs.service
		type mark_hostonly >/dev/null 2>&1 && mark_hostonly @systemdunitdir@/zfs-env-bootfs.service

		dracut_install systemd-ask-password
		dracut_install systemd-tty-ask-password-agent

		mkdir -p "${initdir}/$systemdsystemunitdir/initrd.target.wants"
		dracut_install @systemdunitdir@/zfs-import.target
		if ! [ -L "${initdir}/$systemdsystemunitdir/initrd.target.wants"/zfs-import.target ]; then
			ln -s ../zfs-import.target "${initdir}/$systemdsystemunitdir/initrd.target.wants"/zfs-import.target
			type mark_hostonly >/dev/null 2>&1 && mark_hostonly @systemdunitdir@/zfs-import.target
		fi

		for _service in zfs-snapshot-bootfs.service zfs-rollback-bootfs.service ; do
			inst "${moddir}/$_service" "${systemdsystemunitdir}/$_service"
			if ! [ -L "${initdir}/$systemdsystemunitdir/initrd.target.wants/$_service" ]; then
				ln -s "../$_service" "${initdir}/$systemdsystemunitdir/initrd.target.wants/$_service"
			fi
		done

		# There isn't a pkg-config variable for this,
		# and dracut doesn't automatically resolve anything this'd be next to
		local systemdsystemenvironmentgeneratordir
		systemdsystemenvironmentgeneratordir="$(pkg-config --variable=prefix systemd || echo "/usr")/lib/systemd/system-environment-generators"
		mkdir -p "${initdir}/${systemdsystemenvironmentgeneratordir}"
		inst "${moddir}"/import-opts-generator.sh "${systemdsystemenvironmentgeneratordir}"/zfs-import-opts.sh
	fi
}