diff --git a/dracut/full-dmroot/qubes_cow_setup.sh b/dracut/full-dmroot/qubes_cow_setup.sh index c02391d..13ef76a 100644 --- a/dracut/full-dmroot/qubes_cow_setup.sh +++ b/dracut/full-dmroot/qubes_cow_setup.sh @@ -56,14 +56,21 @@ log_begin "Waiting for /dev/xvda* devices..." while ! [ -e /dev/xvda ]; do sleep 0.1; done log_end +# prefer first partition if exists +if [ -b /dev/xvda1 ]; then + ROOT_DEV=xvda1 +else + ROOT_DEV=xvda +fi + SWAP_SIZE=$(( 1024 * 1024 * 2 )) # sectors, 1GB -if [ `cat /sys/block/xvda/ro` = 1 ] ; then +if [ `cat /sys/class/block/$ROOT_DEV/ro` = 1 ] ; then log_begin "Qubes: Doing COW setup for AppVM..." while ! [ -e /dev/xvdc ]; do sleep 0.1; done - VOLATILE_SIZE=$(cat /sys/block/xvdc/size) # sectors - ROOT_SIZE=$(cat /sys/block/xvda/size) # sectors + VOLATILE_SIZE=$(cat /sys/class/block/xvdc/size) # sectors + ROOT_SIZE=$(cat /sys/class/block/$ROOT_DEV/size) # sectors if [ $VOLATILE_SIZE -lt $SWAP_SIZE ]; then die "volatile.img smaller than 1GB, cannot continue" fi @@ -78,7 +85,7 @@ EOF mkswap /dev/xvdc1 while ! [ -e /dev/xvdc2 ]; do sleep 0.1; done - echo "0 `cat /sys/block/xvda/size` snapshot /dev/xvda /dev/xvdc2 N 16" | \ + echo "0 `cat /sys/class/block/$ROOT_DEV/size` snapshot /dev/$ROOT_DEV /dev/xvdc2 N 16" | \ dmsetup --noudevsync create dmroot || die "Qubes: FATAL: cannot create dmroot!" log_end else @@ -92,8 +99,17 @@ EOF fi while ! [ -e /dev/xvdc1 ]; do sleep 0.1; done mkswap /dev/xvdc1 - echo "0 `cat /sys/block/xvda/size` linear /dev/xvda 0" | \ - dmsetup --noudevsync create dmroot || die "Qubes: FATAL: cannot create dmroot!" + if [ "$ROOT_DEV" = "xvda1" ]; then + # grub2-probe for some reason can't parse dm-linear pointing at + # partition device directly, but can when it points at it indirectly + # through base device and offset; lets make life easier for users of + # grub2-install + DM_ROOT="/dev/xvda $(cat /sys/class/block/$ROOT_DEV/start)" + else + DM_ROOT="/dev/$ROOT_DEV 0" + fi + echo "0 `cat /sys/class/block/$ROOT_DEV/size` linear $DM_ROOT" | \ + dmsetup create dmroot || { echo "Qubes: FATAL: cannot create dmroot!"; exit 1; } log_end fi dmsetup mknodes dmroot diff --git a/dracut/simple/init.sh b/dracut/simple/init.sh index e61467d..58e989f 100644 --- a/dracut/simple/init.sh +++ b/dracut/simple/init.sh @@ -20,14 +20,21 @@ die() { echo "Waiting for /dev/xvda* devices..." while ! [ -e /dev/xvda ]; do sleep 0.1; done +# prefer first partition if exists +if [ -b /dev/xvda1 ]; then + ROOT_DEV=xvda1 +else + ROOT_DEV=xvda +fi + SWAP_SIZE=$(( 1024 * 1024 * 2 )) # sectors, 1GB -if [ `cat /sys/block/xvda/ro` = 1 ] ; then +if [ `cat /sys/class/block/$ROOT_DEV/ro` = 1 ] ; then echo "Qubes: Doing COW setup for AppVM..." while ! [ -e /dev/xvdc ]; do sleep 0.1; done - VOLATILE_SIZE=$(cat /sys/block/xvdc/size) # sectors - ROOT_SIZE=$(cat /sys/block/xvda/size) # sectors + VOLATILE_SIZE=$(cat /sys/class/block/xvdc/size) # sectors + ROOT_SIZE=$(cat /sys/class/block/$ROOT_DEV/size) # sectors if [ $VOLATILE_SIZE -lt $SWAP_SIZE ]; then die "volatile.img smaller than 1GB, cannot continue" fi @@ -43,7 +50,7 @@ EOF mkswap /dev/xvdc1 while ! [ -e /dev/xvdc2 ]; do sleep 0.1; done - echo "0 `cat /sys/block/xvda/size` snapshot /dev/xvda /dev/xvdc2 N 16" | \ + echo "0 `cat /sys/class/block/$ROOT_DEV/size` snapshot /dev/$ROOT_DEV /dev/xvdc2 N 16" | \ dmsetup create dmroot || { echo "Qubes: FATAL: cannot create dmroot!"; exit 1; } echo Qubes: done. else @@ -57,7 +64,16 @@ EOF fi while ! [ -e /dev/xvdc1 ]; do sleep 0.1; done mkswap /dev/xvdc1 - echo "0 `cat /sys/block/xvda/size` linear /dev/xvda 0" | \ + if [ "$ROOT_DEV" = "xvda1" ]; then + # grub2-probe for some reason can't parse dm-linear pointing at + # partition device directly, but can when it points at it indirectly + # through base device and offset; lets make life easier for users of + # grub2-install + DM_ROOT="/dev/xvda $(cat /sys/class/block/$ROOT_DEV/start)" + else + DM_ROOT="/dev/$ROOT_DEV 0" + fi + echo "0 `cat /sys/class/block/$ROOT_DEV/size` linear $DM_ROOT" | \ dmsetup create dmroot || { echo "Qubes: FATAL: cannot create dmroot!"; exit 1; } echo Qubes: done. fi