#!/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 u2mfn_ver=`dkms status u2mfn|tail -n 1|cut -f 2 -d ' '|tr -d ':,'` if ! modinfo -k "$kver" -n u2mfn >/dev/null; then dkms install u2mfn/$u2mfn_ver -k $kver --no-initrd fi } 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 /sbin/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" echo "---> Recompiling kernel module (u2mfn)" 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."