summaryrefslogtreecommitdiffstats
path: root/dracut/90zfs/mount-zfs.sh
blob: 52c55a68df5aa60819c5a00eb7c84754c2543dbb (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
#!/bin/sh

. /lib/dracut-lib.sh

ZPOOL_FORCE=""

if getargbool 0 zfs_force -y zfs.force -y zfsforce ; then
	warn "ZFS: Will force-import pools if necessary."
	ZPOOL_FORCE="-f"
fi

case "$root" in
	zfs:*)
		# We have ZFS modules loaded, so we're able to import pools now.
		if [ "$root" = "zfs:AUTO" ] ; then
			# Need to parse bootfs attribute
			info "ZFS: Attempting to detect root from imported ZFS pools."

			# Might be imported by the kernel module, so try searching before
			# we import anything.
			zfsbootfs=`zpool list -H -o bootfs | sed 'q'`
			if [ "$?" != "0" ] || [ "$zfsbootfs" = "" ] || [ "$zfsbootfs" = "no pools available" ] ; then
				# Not there, so we need to import everything.
				info "ZFS: Attempting to import additional pools."
				zpool import -N -a ${ZPOOL_FORCE}
				zfsbootfs=`zpool list -H -o bootfs | sed 'q'`
				if [ "$?" != "0" ] || [ "$zfsbootfs" = "" ] || [ "$zfsbootfs" = "no pools available" ] ; then
					rootok=0
					pool=""

					warn "ZFS: No bootfs attribute found in importable pools."

					# Re-export everything since we're not prepared to take
					# responsibility for them.
					zpool list -H | while read fs rest ; do
						zpool export "$fs"
					done

					return 1
				fi
			fi
			info "ZFS: Using ${zfsbootfs} as root."
		else
			# Should have an explicit pool set, so just import it and we're done.
			zfsbootfs="${root#zfs:}"
			pool="${zfsbootfs%%/*}"
			if ! zpool list -H $pool > /dev/null ; then
				# pool wasn't imported automatically by the kernel module, so
				# try it manually.
				info "ZFS: Importing pool ${pool}..."
				if ! zpool import -N ${ZPOOL_FORCE} $pool ; then
					warn "ZFS: Unable to import pool ${pool}."
					rootok=0

					return 1
				fi
			fi
		fi

		# Above should have left our rpool imported and pool/dataset in $root.
		# We need zfsutil for non-legacy mounts and not for legacy mounts.
		mountpoint=`zfs get -H -o value mountpoint $zfsbootfs`
		if [ "$mountpoint" = "legacy" ] ; then
			mount -t zfs "$zfsbootfs" "$NEWROOT" && ROOTFS_MOUNTED=yes
		else
			mount -o zfsutil -t zfs "$zfsbootfs" "$NEWROOT" && ROOTFS_MOUNTED=yes
		fi
		;;
esac