summaryrefslogtreecommitdiff
blob: 17791b67cfb11f12d29baa19add9e7014c866bde (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
#!/sbin/runscript

description="Export ZFS Root Filesystem"

copy_binaries() {
	local destdir=$1
	shift
	lddtree "$@" \
		| tr ')(' '\n' \
		| awk  '/=>/{ if($3 ~ /^\//){print $3}}' \
		| sort \
		| uniq \
		| cpio -p --make-directories --dereference --quiet $destdir

}

depend()
{
	need mount-ro
	keyword -prefix -openvz -vserver -lxc
}

start()
{

	ROOTFSTYPE=$(df -TP / | awk 'NR>1{print $2}')
	TMPDIR='/dev/pivot_root'
	MOVEFS=$(df -TP -x zfs | awk 'NR>2{print $7}')

	# Make sure that we are dealing with zfs
	test "${ROOTFSTYPE}" = "zfs" || eerror "rootfs is not zfs" && exit

	# Construct new rootfs
	mkdir -p "${TMPDIR}"
	mount -t tmpfs none ${TMPDIR}
	mkdir "${TMPDIR}/oldroot" "${TMPDIR}/dev"
	mknod -m 660 "${TMPDIR}/dev/null" c 1 3
	mknod -m 660 "${TMPDIR}/dev/zfs" c 10 59

	# Make tmpfs root filesystem
	copy_binaries ${TMPDIR} $(which chroot sh cat mount mkdir zfs zpool)

	# Make directories for temporary mounts
	for i in $(seq $(echo "$MOVEFS" | wc -w)); do mkdir "${TMPDIR}/${i}"; done;

	# Pass temporary mount information to chroot
	echo "$MOVEFS" > "${TMPDIR}/movefs"

	# Copy shutdown script
	cp /usr/share/zfs/linuxrc "${TMPDIR}/linuxrc"

	# Pivot into new root
	cd "${TMPDIR}"
	pivot_root . oldroot
	exec chroot . /linuxrc

}