qubes-linux-utils/kernel-modules/qubes-prepare-vm-kernel
M. Vefa Bicakci 60016e230f
qubes-prepare-vm-kernel: More robust u2mfn version detection
Prior to this commit, if the u2mfn module had never been installed on
the system *via DKMS* before, then the "u2mfn_ver" variable would not be
populated properly, due to the reliance on "dkms status" which can only
detect currently installed DKMS modules.

Fix this issue by looking for u2mfn's DKMS configuration file in
/usr/src and and grep'ing for the module version.

Signed-off-by: M. Vefa Bicakci <m.v.b@runbox.com>
2017-03-14 19:01:45 +03:00

107 lines
3.2 KiB
Bash

#!/bin/sh
#
# The Qubes OS Project, http://www.qubes-os.org
#
# Copyright (C) 2015 Marek Marczykowski-Górecki
# <marmarekp@invisiblethingslab.com>
#
# 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
/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 <kernel-version> [<display-kernel-version>]" >&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."