#!/bin/sh # # This file should be placed in pre-trigger directory in dracut's initramfs, or # scripts/local-top in case of initramfs-tools # # 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:" if ! grep -q 'root=[^ ]*dmroot' /proc/cmdline; then warn "dmroot not requested, probably not a Qubes VM" exit 0 fi if [ -e /dev/mapper/dmroot ] ; then die "Qubes: FATAL error: /dev/mapper/dmroot already exists?!" fi modprobe xenblk || modprobe xen-blkfront || warn "Qubes: Cannot load Xen Block Frontend..." log_begin "Waiting for /dev/xvda* devices..." udevadm settle --exit-if-exists=/dev/xvda log_end # prefer partition if exists if [ -b /dev/xvda1 ]; then if [ -e "/dev/disk/by-partlabel/Root\\x20filesystem" ]; then ROOT_DEV=$(basename $(readlink "/dev/disk/by-partlabel/Root\\x20filesystem")) else ROOT_DEV=xvda3 fi else ROOT_DEV=xvda fi SWAP_SIZE=$(( 1024 * 1024 * 2 )) # sectors, 1GB 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/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 sfdisk -q --unit S /dev/xvdc >/dev/null </dev/null <> \ /etc/udev/rules.d/99-root.rules udevadm control -R udevadm trigger log_end fi