2015-11-07 23:29:55 +00:00
|
|
|
#!/bin/sh
|
2014-07-17 00:27:33 +00:00
|
|
|
#
|
2017-01-14 15:09:40 +00:00
|
|
|
# This file should be placed in pre-trigger directory in dracut's initramfs, or
|
2015-11-09 21:28:15 +00:00
|
|
|
# scripts/local-top in case of initramfs-tools
|
2014-07-17 00:27:33 +00:00
|
|
|
#
|
|
|
|
|
2015-11-09 21:28:15 +00:00
|
|
|
# initramfs-tools (Debian) API
|
|
|
|
PREREQS=""
|
|
|
|
case "$1" in
|
|
|
|
prereqs)
|
|
|
|
# This runs during initramfs creation
|
|
|
|
echo "$PREREQS"
|
|
|
|
exit 0
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
|
|
|
# This runs inside real initramfs
|
|
|
|
if [ -r /scripts/functions ]; then
|
|
|
|
# We're running in Debian's initramfs
|
|
|
|
. /scripts/functions
|
|
|
|
alias die=panic
|
|
|
|
alias info=true
|
|
|
|
alias warn=log_warning_msg
|
|
|
|
alias log_begin=log_begin_msg
|
|
|
|
alias log_end=log_end_msg
|
|
|
|
elif [ -r /lib/dracut-lib.sh ]; then
|
|
|
|
. /lib/dracut-lib.sh
|
|
|
|
alias log_begin=info
|
|
|
|
alias log_end=true
|
|
|
|
else
|
|
|
|
die() {
|
|
|
|
echo "$@"
|
|
|
|
exit 1
|
|
|
|
}
|
|
|
|
alias info=echo
|
|
|
|
alias warn=echo
|
|
|
|
alias log_begin=echo
|
|
|
|
alias log_end=true
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
info "Qubes initramfs script here:"
|
2014-07-17 00:27:33 +00:00
|
|
|
|
2015-11-09 22:03:34 +00:00
|
|
|
if ! grep -q 'root=[^ ]*dmroot' /proc/cmdline; then
|
|
|
|
warn "dmroot not requested, probably not a Qubes VM"
|
|
|
|
exit 0
|
|
|
|
fi
|
|
|
|
|
2014-07-17 00:27:33 +00:00
|
|
|
if [ -e /dev/mapper/dmroot ] ; then
|
|
|
|
die "Qubes: FATAL error: /dev/mapper/dmroot already exists?!"
|
|
|
|
fi
|
|
|
|
|
2015-11-09 21:28:15 +00:00
|
|
|
modprobe xenblk || modprobe xen-blkfront || warn "Qubes: Cannot load Xen Block Frontend..."
|
2014-07-17 00:27:33 +00:00
|
|
|
|
2015-11-09 21:28:15 +00:00
|
|
|
log_begin "Waiting for /dev/xvda* devices..."
|
2014-07-17 00:27:33 +00:00
|
|
|
while ! [ -e /dev/xvda ]; do sleep 0.1; done
|
2015-11-09 21:28:15 +00:00
|
|
|
log_end
|
2014-07-17 00:27:33 +00:00
|
|
|
|
2017-01-23 22:52:15 +00:00
|
|
|
# prefer first partition if exists
|
|
|
|
if [ -b /dev/xvda1 ]; then
|
|
|
|
ROOT_DEV=xvda1
|
|
|
|
else
|
|
|
|
ROOT_DEV=xvda
|
|
|
|
fi
|
|
|
|
|
2015-11-25 02:38:51 +00:00
|
|
|
SWAP_SIZE=$(( 1024 * 1024 * 2 )) # sectors, 1GB
|
|
|
|
|
2017-01-23 22:52:15 +00:00
|
|
|
if [ `cat /sys/class/block/$ROOT_DEV/ro` = 1 ] ; then
|
2015-11-09 21:28:15 +00:00
|
|
|
log_begin "Qubes: Doing COW setup for AppVM..."
|
2014-07-17 00:27:33 +00:00
|
|
|
|
2015-10-15 00:36:23 +00:00
|
|
|
while ! [ -e /dev/xvdc ]; do sleep 0.1; done
|
2017-01-23 22:52:15 +00:00
|
|
|
VOLATILE_SIZE=$(cat /sys/class/block/xvdc/size) # sectors
|
|
|
|
ROOT_SIZE=$(cat /sys/class/block/$ROOT_DEV/size) # sectors
|
2015-11-25 02:38:51 +00:00
|
|
|
if [ $VOLATILE_SIZE -lt $SWAP_SIZE ]; then
|
|
|
|
die "volatile.img smaller than 1GB, cannot continue"
|
2015-10-15 00:38:04 +00:00
|
|
|
fi
|
2015-11-25 02:38:51 +00:00
|
|
|
sfdisk -q --unit S /dev/xvdc >/dev/null <<EOF
|
|
|
|
1,$SWAP_SIZE,S
|
|
|
|
,,L
|
2015-10-15 00:38:04 +00:00
|
|
|
EOF
|
|
|
|
if [ $? -ne 0 ]; then
|
2015-11-09 21:28:15 +00:00
|
|
|
die "Qubes: failed to setup partitions on volatile device"
|
2015-10-15 00:38:04 +00:00
|
|
|
fi
|
|
|
|
while ! [ -e /dev/xvdc1 ]; do sleep 0.1; done
|
|
|
|
mkswap /dev/xvdc1
|
2015-10-15 00:36:23 +00:00
|
|
|
while ! [ -e /dev/xvdc2 ]; do sleep 0.1; done
|
2014-07-17 00:27:33 +00:00
|
|
|
|
2017-01-23 22:52:15 +00:00
|
|
|
echo "0 `cat /sys/class/block/$ROOT_DEV/size` snapshot /dev/$ROOT_DEV /dev/xvdc2 N 16" | \
|
2015-11-09 21:28:15 +00:00
|
|
|
dmsetup --noudevsync create dmroot || die "Qubes: FATAL: cannot create dmroot!"
|
|
|
|
log_end
|
2014-07-17 00:27:33 +00:00
|
|
|
else
|
2015-11-09 21:28:15 +00:00
|
|
|
log_begin "Qubes: Doing R/W setup for TemplateVM..."
|
2015-11-25 02:41:04 +00:00
|
|
|
while ! [ -e /dev/xvdc ]; do sleep 0.1; done
|
|
|
|
sfdisk -q --unit S /dev/xvdc >/dev/null <<EOF
|
|
|
|
1,$SWAP_SIZE,S
|
|
|
|
EOF
|
|
|
|
if [ $? -ne 0 ]; then
|
|
|
|
die "Qubes: failed to setup partitions on volatile device"
|
|
|
|
fi
|
|
|
|
while ! [ -e /dev/xvdc1 ]; do sleep 0.1; done
|
|
|
|
mkswap /dev/xvdc1
|
2017-01-23 22:52:15 +00:00
|
|
|
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; }
|
2015-11-09 21:28:15 +00:00
|
|
|
log_end
|
2014-07-17 00:27:33 +00:00
|
|
|
fi
|
2015-03-20 09:33:23 +00:00
|
|
|
dmsetup mknodes dmroot
|