2014-07-17 00:27:33 +00:00
|
|
|
#!/bin/sh
|
|
|
|
echo "Qubes initramfs script here:"
|
|
|
|
|
2015-03-21 03:14:01 +00:00
|
|
|
mkdir -p /proc /sys /dev
|
|
|
|
mount -t proc proc /proc
|
|
|
|
mount -t sysfs sysfs /sys
|
|
|
|
mount -t devtmpfs devtmpfs /dev
|
|
|
|
|
2014-07-17 00:27:33 +00:00
|
|
|
if [ -e /dev/mapper/dmroot ] ; then
|
2015-03-22 02:25:01 +00:00
|
|
|
echo "Qubes: FATAL error: /dev/mapper/dmroot already exists?!"
|
2014-07-17 00:27:33 +00:00
|
|
|
fi
|
|
|
|
|
2018-02-21 18:52:56 +00:00
|
|
|
/sbin/modprobe xenblk || /sbin/modprobe xen-blkfront || echo "Qubes: Cannot load Xen Block Frontend..."
|
2014-07-17 00:27:33 +00:00
|
|
|
|
2016-09-04 13:13:44 +00:00
|
|
|
die() {
|
|
|
|
echo "$@" >&2
|
|
|
|
exit 1
|
|
|
|
}
|
2015-11-25 02:38:51 +00:00
|
|
|
|
2014-07-17 00:27:33 +00:00
|
|
|
echo "Waiting for /dev/xvda* devices..."
|
|
|
|
while ! [ -e /dev/xvda ]; do sleep 0.1; done
|
|
|
|
|
2017-10-17 20:45:07 +00:00
|
|
|
# prefer partition if exists
|
2017-01-23 22:52:15 +00:00
|
|
|
if [ -b /dev/xvda1 ]; then
|
2017-10-17 20:45:07 +00:00
|
|
|
if [ -d /dev/disk/by-partlabel ]; then
|
|
|
|
ROOT_DEV=$(basename $(readlink "/dev/disk/by-partlabel/Root\\x20filesystem"))
|
|
|
|
else
|
|
|
|
ROOT_DEV=$(grep -l "PARTNAME=Root filesystem" /sys/block/xvda/xvda*/uevent |\
|
|
|
|
grep -o "xvda[0-9]")
|
|
|
|
fi
|
|
|
|
if [ -z "$ROOT_DEV" ]; then
|
|
|
|
# fallback to third partition
|
|
|
|
ROOT_DEV=xvda3
|
|
|
|
fi
|
2017-01-23 22:52:15 +00:00
|
|
|
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-10-15 00:36:23 +00:00
|
|
|
echo "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
|
2018-02-21 18:52:56 +00:00
|
|
|
/sbin/sfdisk -q --unit S /dev/xvdc >/dev/null <<EOF
|
2015-11-25 02:38:51 +00:00
|
|
|
1,$SWAP_SIZE,S
|
|
|
|
,,L
|
2015-10-15 00:38:04 +00:00
|
|
|
EOF
|
|
|
|
if [ $? -ne 0 ]; then
|
|
|
|
echo "Qubes: failed to setup partitions on volatile device"
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
while ! [ -e /dev/xvdc1 ]; do sleep 0.1; done
|
2018-02-21 18:52:56 +00:00
|
|
|
/sbin/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" | \
|
2018-02-21 18:52:56 +00:00
|
|
|
/sbin/dmsetup create dmroot || { echo "Qubes: FATAL: cannot create dmroot!"; exit 1; }
|
|
|
|
/sbin/dmsetup mknodes dmroot
|
2015-10-15 00:36:23 +00:00
|
|
|
echo Qubes: done.
|
2014-07-17 00:27:33 +00:00
|
|
|
else
|
2015-10-15 00:36:23 +00:00
|
|
|
echo "Qubes: Doing R/W setup for TemplateVM..."
|
2015-11-25 02:41:04 +00:00
|
|
|
while ! [ -e /dev/xvdc ]; do sleep 0.1; done
|
2018-02-21 18:52:56 +00:00
|
|
|
/sbin/sfdisk -q --unit S /dev/xvdc >/dev/null <<EOF
|
2015-11-25 02:41:04 +00:00
|
|
|
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
|
2018-02-21 18:52:56 +00:00
|
|
|
/sbin/mkswap /dev/xvdc1
|
2017-06-12 11:02:31 +00:00
|
|
|
ln -s ../$ROOT_DEV /dev/mapper/dmroot
|
2015-10-15 00:36:23 +00:00
|
|
|
echo Qubes: done.
|
2014-07-17 00:27:33 +00:00
|
|
|
fi
|
2015-03-21 03:14:01 +00:00
|
|
|
|
2018-02-21 18:52:56 +00:00
|
|
|
/sbin/modprobe ext4
|
2015-03-22 02:25:01 +00:00
|
|
|
|
2015-03-21 03:14:01 +00:00
|
|
|
mkdir -p /sysroot
|
|
|
|
mount /dev/mapper/dmroot /sysroot -o ro
|
2015-03-22 02:25:01 +00:00
|
|
|
NEWROOT=/sysroot
|
2015-03-21 03:14:01 +00:00
|
|
|
|
2015-11-08 02:46:25 +00:00
|
|
|
kver="`uname -r`"
|
|
|
|
if ! [ -d "$NEWROOT/lib/modules/$kver/kernel" ]; then
|
2015-03-21 03:14:01 +00:00
|
|
|
echo "Waiting for /dev/xvdd device..."
|
|
|
|
while ! [ -e /dev/xvdd ]; do sleep 0.1; done
|
|
|
|
|
2015-11-08 02:46:25 +00:00
|
|
|
# Mount only `uname -r` subdirectory, to leave the rest of /lib/modules writable
|
|
|
|
mkdir -p /tmp/modules
|
|
|
|
mount -n -t ext3 /dev/xvdd /tmp/modules
|
|
|
|
if ! [ -d "$NEWROOT/lib/modules/$kver" ]; then
|
|
|
|
mount "$NEWROOT" -o remount,rw
|
|
|
|
mkdir -p "$NEWROOT/lib/modules/$kver"
|
|
|
|
mount "$NEWROOT" -o remount,ro
|
|
|
|
fi
|
|
|
|
mount --bind "/tmp/modules/$kver" "$NEWROOT/lib/modules/$kver"
|
|
|
|
umount /tmp/modules
|
|
|
|
rmdir /tmp/modules
|
2015-03-21 03:14:01 +00:00
|
|
|
fi
|
|
|
|
|
|
|
|
umount /dev /sys /proc
|
|
|
|
|
2018-02-21 18:52:56 +00:00
|
|
|
exec /sbin/switch_root $NEWROOT /sbin/init
|