summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonathan Bauer2019-09-04 10:55:36 +0200
committerJonathan Bauer2019-09-04 10:55:36 +0200
commitdae040172f5ffdc8daf602c2482c4dac598fd1bb (patch)
tree7663e9474e491ff735b34dd685a75cffa1724b03
parent[dnbd3-rootfs] remove old qemu-xmount configure option (diff)
downloadsystemd-init-dae040172f5ffdc8daf602c2482c4dac598fd1bb.tar.gz
systemd-init-dae040172f5ffdc8daf602c2482c4dac598fd1bb.tar.xz
systemd-init-dae040172f5ffdc8daf602c2482c4dac598fd1bb.zip
[dnbd3-rootfs] add kernel qcow2 loop module build
-rw-r--r--builder/modules.d/dnbd3-rootfs/helper/build.inc51
1 files changed, 49 insertions, 2 deletions
diff --git a/builder/modules.d/dnbd3-rootfs/helper/build.inc b/builder/modules.d/dnbd3-rootfs/helper/build.inc
index 03c6b222..0a7d7a8c 100644
--- a/builder/modules.d/dnbd3-rootfs/helper/build.inc
+++ b/builder/modules.d/dnbd3-rootfs/helper/build.inc
@@ -45,7 +45,15 @@ initialize_components() {
fi
fi
if [ -z "$qcow_handler" ] || [ "$qcow_handler" = "kernel" ]; then
- # TODO check if the given kernel supports it, bail otherwise
+ if [ ! -f "${kernel_headers}/drivers/block/loop/loop.ko " ] \
+ || [ ! -f "${kernel_headers}/drivers/block/loop/loop_file_fmt_qcow.ko " ] \
+ || [ ! -f "${kernel_headers}/drivers/block/loop/loop_file_fmt_raw.ko " ]; then
+ logging.info "Could not find loop kernel modules, building them..."
+ if ! build_compile_kernel_qcow "$kernel_headers"; then
+ logging.error "Failed to build qcow loop kernel modules."
+ return 1
+ fi
+ fi
if [ ! -f "${_deps_base_dir}/kernel-qcow2-util-linux/losetup" ]; then
logging.info "Could not find losetup with qcow2 support, building it..."
if ! build_compile_losetup_qcow "${_deps_base_dir}/kernel-qcow2-util-linux"; then
@@ -188,7 +196,46 @@ build_clean_dnbd3() {
rm --recursive --force "$1/build"
return $?
}
-# needs autopoint bison automake libtool
+build_compile_kernel_qcow() {
+ pushd "$1"
+ # https://lab.ks.uni-freiburg.de/projects/kernel-qcow2/wiki
+ if [ -z "$kernel_headers" ]; then
+ logging.error "Kernel header directory not set, ignoring."
+ return 1
+ fi
+ mkdir -p "${kernel_headers}/drivers/block/loop"
+ for _file in \
+ include/uapi/linux/loop.h \
+ drivers/block/Kconfig \
+ drivers/block/loop/loop_main.h \
+ drivers/block/loop/loop_file_fmt.h \
+ drivers/block/loop/Kconfig; do
+ cp -f "${_file}" "${kernel_headers}/${_file}"
+ done
+ (
+ set -o errexit
+ make -C "$kernel_headers" CONFIG_BLK_DEV_LOOP=m \
+ M=$(pwd)/drivers/block/loop loop.ko
+ make -C "$kernel_headers" CONFIG_BLK_DEV_LOOP_FILE_FMT_RAW=m \
+ M=$(pwd)/drivers/block/loop loop_file_fmt_raw.ko
+ make -C "$kernel_headers" CONFIG_BLK_DEV_LOOP_FILE_FMT_QCOW=m \
+ M=$(pwd)/drivers/block/loop loop_file_fmt_qcow.ko
+ )
+ local ret=$?
+ popd
+ return $ret
+}
+build_clean_kernel_qcow() {
+ if [ -z "$kernel_headers" ]; then
+ logging.error "Kernel header directory not set, ignoring."
+ return 1
+ fi
+ pushd "$kernel_headers"
+ make -C "$kernel_headers" M=$(pwd)/drivers/block/loop clean
+ local ret=$?
+ popd
+ return $ret
+}
build_compile_losetup_qcow() {
pushd "$1"
(