#!/bin/sh # # The Qubes OS Project, http://www.qubes-os.org # # Copyright (C) 2015 Marek Marczykowski-Górecki # # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # set -e basedir=/var/lib/qubes/vm-kernels function recompile_u2mfn() { kver="${1}" if modinfo -k "$kver" -n u2mfn >/dev/null 2>&1; then echo "---> The u2mfn kernel module is already installed for ${kver}." return fi echo "---> Compiling the u2mfn kernel module" # ls's -v option sorts the u2mfn directories according to # their version numbers, which lets "tail -n1" capture the # latest version. u2mfn_ver="$(ls -1v /usr/src/u2mfn-*/dkms.conf 2>/dev/null | tail -n1 | \ xargs --no-run-if-empty grep -F PACKAGE_VERSION | \ cut -d= -f2 | tr -d "\"'")" if test -z "${u2mfn_ver}"; then echo "ERROR: Could not detect the location of the DKMS tree of the u2mfn module." exit 1 fi dkms install --no-initrd "u2mfn/${u2mfn_ver}" -k "${kver}" } function build_modules_img() { kver=$1 output_file=$2 mkdir /tmp/qubes-modules-$kver truncate -s 400M /tmp/qubes-modules-$kver.img mkfs -t ext3 -F /tmp/qubes-modules-$kver.img > /dev/null mount /tmp/qubes-modules-$kver.img /tmp/qubes-modules-$kver -o loop cp -a -t /tmp/qubes-modules-$kver /lib/modules/$kver umount /tmp/qubes-modules-$kver rmdir /tmp/qubes-modules-$kver mv /tmp/qubes-modules-$kver.img $output_file } function build_initramfs() { kver=$1 output_file=$2 dracut --nomdadmconf --nolvmconf --force \ --modules "kernel-modules qubes-vm-simple" \ --conf /dev/null --confdir /var/empty \ -d "xenblk xen-blkfront cdrom ext4 jbd2 crc16 dm_snapshot" \ $output_file $kver chmod 644 "$output_file" } if [ -z "$1" ]; then echo "Usage: $0 []" >&2 exit 1 fi if [ ! -r /boot/vmlinuz-$1 -o ! -d /lib/modules/$1 ]; then echo "ERROR: Kernel version $1 not installed" >&2 exit 1 fi kernel_version=$1 if [ -n "$2" ]; then output_dir="$basedir/$2" else output_dir="$basedir/$kernel_version" fi echo "--> Building files for $kernel_version in $output_dir" recompile_u2mfn "$kernel_version" mkdir -p "$output_dir" cp "/boot/vmlinuz-$kernel_version" "$output_dir/vmlinuz" echo "---> Generating modules.img" build_modules_img "$kernel_version" "$output_dir/modules.img" echo "---> Generating initramfs" build_initramfs "$kernel_version" "$output_dir/initramfs" echo "--> Done."