I had this same issue: https://github.com/zfsonlinux/pkg-zfs/issues/182

I wrote a patch the requires the setting of the "zpool bootfs" parameter which 
I think should be a requirement anyway.  The other solutions did not seem to 
work in every situation and I was still having issues with some systems.

That patch also checks against multiple "zpool bootfs" parameters or a missing 
entry all together.


Patch START:

*** /tmp/10_linux.orig    2017-02-02 08:02:36.926542777 -0700
--- /etc/grub.d/10_linux    2017-02-02 15:26:02.138285042 -0700
***************
*** 77,85 ****
          GRUB_CMDLINE_LINUX="rootflags=subvol=${rootsubvol} 
${GRUB_CMDLINE_LINUX}"
      fi;;
      xzfs)
!     rpool=`${grub_probe} --device ${GRUB_DEVICE} --target=fs_label 
2>/dev/null || true`
!     bootfs="`make_system_path_relative_to_its_root / | sed -e "s,@$,,"`"
!     LINUX_ROOT_DEVICE="ZFS=${rpool}${bootfs}"
      ;;
  esac
 
--- 77,96 ----
          GRUB_CMDLINE_LINUX="rootflags=subvol=${rootsubvol} 
${GRUB_CMDLINE_LINUX}"
      fi;;
      xzfs)
!     zfsbootfs=`zpool get bootfs | sed '2,100!d' |  grep -v "-" | awk {'print 
$3'} 2>/dev/null || true`
!     if [ "${zfsbootfs}" = "" ]
!     then
!         echo "zpool bootfs parameter not set.  System will fail to boot!" 1>&2
!     elif [ "$(echo ${zfsbootfs} | wc -w)" -gt "1" ]
!     then
!         echo "Multiple zpool bootfs parameters detected:" 1>&2
!         echo ${zfsbootfs} 1>&2
!                 echo 1>&2
!         zfsbootfs=`echo ${zfsbootfs} | awk {'print $1'}`
!         echo "Using the first bootfs listed: ${zfsbootfs}" 1>&2
!         echo "Final LINUX_ROOT_DEVICE=ZFS=${zfsbootfs}" 1>&2
!     fi
!     LINUX_ROOT_DEVICE="ZFS=${zfsbootfs}"
      ;;
  esac

Patch END

Save the patch as /tmp/grub_10_linux.patch and apply it to the 
/etc/grub.d/10_linux file:
patch -p1 /etc/grub.d/10_linux /tmp/grub_10_linux.patch


*** /tmp/10_linux.orig	2017-02-02 08:02:36.926542777 -0700
--- /etc/grub.d/10_linux	2017-02-02 15:26:02.138285042 -0700
***************
*** 77,85 ****
  	    GRUB_CMDLINE_LINUX="rootflags=subvol=${rootsubvol} ${GRUB_CMDLINE_LINUX}"
  	fi;;
      xzfs)
! 	rpool=`${grub_probe} --device ${GRUB_DEVICE} --target=fs_label 2>/dev/null || true`
! 	bootfs="`make_system_path_relative_to_its_root / | sed -e "s,@$,,"`"
! 	LINUX_ROOT_DEVICE="ZFS=${rpool}${bootfs}"
  	;;
  esac
  
--- 77,96 ----
  	    GRUB_CMDLINE_LINUX="rootflags=subvol=${rootsubvol} ${GRUB_CMDLINE_LINUX}"
  	fi;;
      xzfs)
! 	zfsbootfs=`zpool get bootfs | sed '2,100!d' |  grep -v "-" | awk {'print $3'} 2>/dev/null || true`
! 	if [ "${zfsbootfs}" = "" ]
! 	then
! 		echo "zpool bootfs parameter not set.  System will fail to boot!" 1>&2 
! 	elif [ "$(echo ${zfsbootfs} | wc -w)" -gt "1" ]
! 	then
! 		echo "Multiple zpool bootfs parameters detected:" 1>&2
! 		echo ${zfsbootfs} 1>&2
!                 echo 1>&2
! 		zfsbootfs=`echo ${zfsbootfs} | awk {'print $1'}`
! 		echo "Using the first bootfs listed: ${zfsbootfs}" 1>&2
! 		echo "Final LINUX_ROOT_DEVICE=ZFS=${zfsbootfs}" 1>&2
! 	fi
! 	LINUX_ROOT_DEVICE="ZFS=${zfsbootfs}"
  	;;
  esac
  

Reply via email to