
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>
107 lines
3.2 KiB
Bash
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."
|