#!/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 }