diff --git a/config/functions b/config/functions index 956c8f790d..dea1198531 100644 --- a/config/functions +++ b/config/functions @@ -143,17 +143,24 @@ kernel_version() { # get kernel module dir get_module_dir() { - basename $(ls -d $(get_build_dir linux)/.install_pkg/usr/lib/modules/*) + basename $(ls -d $(get_build_dir linux)/.install_pkg/usr/lib/kernel-overlays/base/lib/modules/*) +} + +# get base path to kernel modules and firmware +get_kernel_overlay_dir() { + echo "/usr/lib/kernel-overlays/${1:-base}" } # get full path to kernel module dir +# optional parameter specifies overlay level (default is base) get_full_module_dir() { - echo "/usr/lib/modules/$(get_module_dir)" + echo "$(get_kernel_overlay_dir $1)/lib/modules/$(get_module_dir)" } # get full path to firmware dir +# optional parameter specifies overlay level (default is base) get_full_firmware_dir() { - echo "/usr/lib/firmware" + echo "$(get_kernel_overlay_dir $1)/lib/firmware" } # get package's build dir @@ -192,6 +199,11 @@ install_binary_addon() { cp -L $PKG_BUILD/.install_pkg/usr/lib/$MEDIACENTER/addons/$addon_id/$addon_so $ADDON_BUILD/$addon_id/ chmod +x $ADDON_BUILD/$addon_id/$addon_so fi + + if [ -d $PKG_BUILD/.install_pkg/usr/lib/kernel-overlays/$addon_id ] ; then + mkdir -p $ADDON_BUILD/$addon_id/kernel-overlay + cp -PR $PKG_BUILD/.install_pkg/usr/lib/kernel-overlays/$addon_id/* $ADDON_BUILD/$addon_id/kernel-overlay + fi } install_addon_source() { diff --git a/packages/linux-firmware/brcmfmac_sdio-firmware-rpi/package.mk b/packages/linux-firmware/brcmfmac_sdio-firmware-rpi/package.mk index c11f7b6fd5..c8511dee00 100644 --- a/packages/linux-firmware/brcmfmac_sdio-firmware-rpi/package.mk +++ b/packages/linux-firmware/brcmfmac_sdio-firmware-rpi/package.mk @@ -36,7 +36,7 @@ make_target() { } makeinstall_target() { - DESTDIR=$INSTALL/usr ./install + DESTDIR=$INSTALL/$(get_kernel_overlay_dir) ./install } post_makeinstall_target() { diff --git a/packages/linux-firmware/dvb-firmware/package.mk b/packages/linux-firmware/dvb-firmware/package.mk index 69f623f96e..5ace21de9a 100644 --- a/packages/linux-firmware/dvb-firmware/package.mk +++ b/packages/linux-firmware/dvb-firmware/package.mk @@ -35,5 +35,5 @@ make_target() { } makeinstall_target() { - DESTDIR=$INSTALL/usr ./install + DESTDIR=$INSTALL/$(get_kernel_overlay_dir) ./install } diff --git a/packages/linux-firmware/iwlwifi-firmware/package.mk b/packages/linux-firmware/iwlwifi-firmware/package.mk index da732181f4..26caafbefb 100644 --- a/packages/linux-firmware/iwlwifi-firmware/package.mk +++ b/packages/linux-firmware/iwlwifi-firmware/package.mk @@ -36,5 +36,5 @@ make_target() { } makeinstall_target() { - DESTDIR=$INSTALL/usr ./install + DESTDIR=$INSTALL/$(get_kernel_overlay_dir) ./install } diff --git a/packages/linux-firmware/misc-firmware/package.mk b/packages/linux-firmware/misc-firmware/package.mk index 5bb1b688a8..fc2519be76 100644 --- a/packages/linux-firmware/misc-firmware/package.mk +++ b/packages/linux-firmware/misc-firmware/package.mk @@ -36,5 +36,5 @@ make_target() { } makeinstall_target() { - DESTDIR=$INSTALL/usr ./install + DESTDIR=$INSTALL/$(get_kernel_overlay_dir) ./install } diff --git a/packages/linux-firmware/wlan-firmware/package.mk b/packages/linux-firmware/wlan-firmware/package.mk index 65e2b63f9b..87e8df52f4 100644 --- a/packages/linux-firmware/wlan-firmware/package.mk +++ b/packages/linux-firmware/wlan-firmware/package.mk @@ -36,5 +36,5 @@ make_target() { } makeinstall_target() { - DESTDIR=$INSTALL/usr ./install + DESTDIR=$INSTALL/$(get_kernel_overlay_dir) ./install } diff --git a/packages/linux/package.mk b/packages/linux/package.mk index abedea8388..9bc0e1d766 100644 --- a/packages/linux/package.mk +++ b/packages/linux/package.mk @@ -194,9 +194,9 @@ pre_make_target() { make_target() { LDFLAGS="" make modules - LDFLAGS="" make INSTALL_MOD_PATH=$INSTALL/usr DEPMOD="$TOOLCHAIN/bin/depmod" modules_install - rm -f $INSTALL/usr/lib/modules/*/build - rm -f $INSTALL/usr/lib/modules/*/source + LDFLAGS="" make INSTALL_MOD_PATH=$INSTALL/$(get_kernel_overlay_dir) DEPMOD="$TOOLCHAIN/bin/depmod" modules_install + rm -f $INSTALL/$(get_kernel_overlay_dir)/lib/modules/*/build + rm -f $INSTALL/$(get_kernel_overlay_dir)/lib/modules/*/source ( cd $ROOT rm -rf $BUILD/initramfs diff --git a/packages/sysutils/busybox/scripts/init b/packages/sysutils/busybox/scripts/init index 69170c6986..4f72249796 100755 --- a/packages/sysutils/busybox/scripts/init +++ b/packages/sysutils/busybox/scripts/init @@ -1011,7 +1011,7 @@ mount --move /flash /sysroot/flash mount --move /storage /sysroot/storage - if [ ! -d "/sysroot/usr/lib/modules/$(uname -r)/" -a -f "/sysroot/usr/lib/systemd/systemd" ]; then + if [ ! -d "/sysroot/usr/lib/kernel-overlays/base/lib/modules/$(uname -r)/" -a -f "/sysroot/usr/lib/systemd/systemd" ]; then echo "" echo "NEVER TOUCH boot= in extlinux.conf / cmdline.txt!" echo "If you don't know what you are doing," diff --git a/packages/sysutils/systemd/package.mk b/packages/sysutils/systemd/package.mk index b57864f6e6..c08ac6e746 100644 --- a/packages/sysutils/systemd/package.mk +++ b/packages/sysutils/systemd/package.mk @@ -205,8 +205,10 @@ post_makeinstall_target() { cp $PKG_DIR/scripts/systemd-machine-id-setup $INSTALL/usr/bin cp $PKG_DIR/scripts/userconfig-setup $INSTALL/usr/bin - # provide 'halt', 'shutdown', 'reboot' & co. mkdir -p $INSTALL/usr/sbin + cp $PKG_DIR/scripts/kernel-overlays-setup $INSTALL/usr/sbin + + # provide 'halt', 'shutdown', 'reboot' & co. ln -sf /usr/bin/systemctl $INSTALL/usr/sbin/halt ln -sf /usr/bin/systemctl $INSTALL/usr/sbin/poweroff ln -sf /usr/bin/systemctl $INSTALL/usr/sbin/reboot @@ -255,5 +257,6 @@ post_install() { enable_service machine-id.service enable_service debugconfig.service enable_service userconfig.service + enable_service kernel-overlays.service enable_service hwdb.service } diff --git a/packages/sysutils/systemd/scripts/kernel-overlays-setup b/packages/sysutils/systemd/scripts/kernel-overlays-setup new file mode 100755 index 0000000000..27326a46c7 --- /dev/null +++ b/packages/sysutils/systemd/scripts/kernel-overlays-setup @@ -0,0 +1,90 @@ +#!/bin/sh +################################################################################ +# This file is part of LibreELEC - https://libreelec.tv +# Copyright (C) 2017-present Team LibreELEC +# +# LibreELEC 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. +# +# LibreELEC 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 LibreELEC. If not, see . +################################################################################ + +SYSTEM_OVERLAYS_DIR=/usr/lib/kernel-overlays +OVERLAY_CONFIG_DIR=/storage/.cache/kernel-overlays +KVER=$(uname -r) +MODULES_DIR="/var/lib/modules/${KVER}" +FIRMWARE_DIR="/var/lib/firmware" + +mkdir -p "${MODULES_DIR}" +mkdir -p "${FIRMWARE_DIR}" +mkdir -p "${OVERLAY_CONFIG_DIR}" + +log() { + echo "kernel-overlays-setup: $@" > /dev/kmsg +} + +apply_overlay() { + case "$1" in + /*) + modules_overlay_dir="${1}/lib/modules/${KVER}" + firmware_overlay_dir="${1}/lib/firmware" + ;; + *) + modules_overlay_dir="${SYSTEM_OVERLAYS_DIR}/${1}/lib/modules/${KVER}" + firmware_overlay_dir="${SYSTEM_OVERLAYS_DIR}/${1}/lib/firmware" + ;; + esac + + if [ -d "${modules_overlay_dir}" ] ; then + GOT_MODULE_OVERLAY="yes" + + if cp -rfs "${modules_overlay_dir}"/* "${MODULES_DIR}" ; then + log "added modules from $modules_overlay_dir" + else + log "failed to add modules from $modules_overlay_dir" + fi + fi + + if [ -d "${firmware_overlay_dir}" ] ; then + if cp -rfs "${firmware_overlay_dir}"/* "${FIRMWARE_DIR}" ; then + log "added firmware from $firmware_overlay_dir" + else + log "failed to add firmware from $firmware_overlay_dir" + fi + fi +} + +# setup system base modules + +log "setup base modules" +apply_overlay base + +# apply user-configured module overlays + +if [ -d "${OVERLAY_CONFIG_DIR}" ] ; then + log "adding overlays from ${OVERLAY_CONFIG_DIR}" + GOT_MODULE_OVERLAY="no" + + for conf in "${OVERLAY_CONFIG_DIR}/"*.conf ; do + if [ -e "$conf" ] ; then + log "processing conf $conf" + overlay=$(cat "$conf") + [ -n "$overlay" ] && apply_overlay "$overlay" + fi + done + + if [ "yes" = "$GOT_MODULE_OVERLAY" ] ; then + log "running depmod" + /usr/sbin/depmod -a + fi +fi + +log "done" diff --git a/packages/sysutils/systemd/system.d/kernel-overlays.service b/packages/sysutils/systemd/system.d/kernel-overlays.service new file mode 100644 index 0000000000..5d771ac3a0 --- /dev/null +++ b/packages/sysutils/systemd/system.d/kernel-overlays.service @@ -0,0 +1,12 @@ +[Unit] +Description=Create kernel modules tree from overlays +DefaultDependencies=no +After=var.mount +Before=systemd-udevd.service systemd-udev-trigger.service systemd-modules-load.service systemd-remount-fs.service swap.service machine-id.service kmod-static-nodes.service + +[Service] +Type=oneshot +ExecStart=/usr/sbin/kernel-overlays-setup + +[Install] +WantedBy=local-fs.target diff --git a/scripts/image b/scripts/image index e1674fbbd1..491f38dc72 100755 --- a/scripts/image +++ b/scripts/image @@ -215,20 +215,27 @@ if [ -n "$DEVICE" -a -d "$PROJECT_DIR/$PROJECT/devices/$DEVICE/filesystem" ]; th done fi -# run depmod -MODVER=$(basename $(ls -d $INSTALL/usr/lib/modules/*)) -find $INSTALL/usr/lib/modules/$MODVER/ -name *.ko | \ - sed -e "s,$INSTALL/usr/lib/modules/$MODVER/,," > $INSTALL/usr/lib/modules/$MODVER/modules.order -$TOOLCHAIN/bin/depmod -b $INSTALL/usr -a -e -F "$BUILD/linux-$(kernel_version)/System.map" $MODVER +# run depmod for base overlay modules +MODVER=$(basename $(ls -d $INSTALL/usr/lib/kernel-overlays/base/lib/modules/*)) +find $INSTALL/usr/lib/kernel-overlays/base/lib/modules/$MODVER/ -name *.ko | \ + sed -e "s,$INSTALL/usr/lib/kernel-overlays/base/lib/modules/$MODVER/,," \ + > $INSTALL/usr/lib/kernel-overlays/base/lib/modules/$MODVER/modules.order +$TOOLCHAIN/bin/depmod -b $INSTALL/usr/lib/kernel-overlays/base -a -e -F "$BUILD/linux-$(kernel_version)/System.map" $MODVER # strip kernel modules if [ "$TARGET_KERNEL_ARCH" = "arm64" -a "$TARGET_ARCH" = "arm" ]; then STRIP=$TOOLCHAIN/lib/gcc-linaro-aarch64-elf/bin/aarch64-elf-strip fi -for MOD in `find $INSTALL/usr/lib/modules/ -type f -name *.ko`; do +for MOD in `find $INSTALL/usr/lib/kernel-overlays/ -type f -name *.ko`; do $STRIP --strip-debug $MOD done +# symlink overlayed modules to /usr/lib/modules +ln -sT /var/lib/modules $INSTALL/usr/lib/modules + +# symlink overlayed firmware to /usr/lib/firmware +ln -sT /var/lib/firmware $INSTALL/usr/lib/firmware + # make target dir mkdir -p $TARGET_IMG rm -rf $TARGET_IMG/$IMAGE_NAME.kernel