aboutsummarylogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonathan Kotta2020-03-14 20:32:25 -0500
committerJonathan Kotta2020-03-14 20:32:25 -0500
commitf5dff153c22dfb3f59cd3d714781bf9c57949e05 (patch)
tree74f14f66e5d9c8e31e86190265d65f3d35f74fd5
downloadaur-f5dff153c22dfb3f59cd3d714781bf9c57949e05.tar.gz
initial commit
-rw-r--r--.SRCINFO28
-rw-r--r--.gitignore2
-rw-r--r--50-save-kernel-modules-pre.hook10
-rw-r--r--90-save-kernel-modules-post.hook10
-rw-r--r--PKGBUILD45
-rw-r--r--README31
-rwxr-xr-xcleanup20
-rwxr-xr-xpost-hook14
-rwxr-xr-xpre-hook17
-rw-r--r--saved-kernel-modules.install7
-rw-r--r--saved-kernel-modules.service8
-rw-r--r--saved-kernel-modules.timer9
12 files changed, 201 insertions, 0 deletions
diff --git a/.SRCINFO b/.SRCINFO
new file mode 100644
index 000000000000..0cd2f5a77b84
--- /dev/null
+++ b/.SRCINFO
@@ -0,0 +1,28 @@
+pkgbase = saved-kernel-modules
+ pkgdesc = Save kernel modules of the running kernel
+ pkgver = 0.0
+ pkgrel = 1
+ install = saved-kernel-modules.install
+ arch = i686
+ arch = x86_64
+ license = GPL
+ depends = systemd
+ source = pre-hook
+ source = post-hook
+ source = cleanup
+ source = README
+ source = saved-kernel-modules.service
+ source = saved-kernel-modules.timer
+ source = 50-save-kernel-modules-pre.hook
+ source = 90-save-kernel-modules-post.hook
+ md5sums = 07048e088cebc1b8c272dadcab80923f
+ md5sums = 947db382e3e874d19a5c05be18193552
+ md5sums = f71b096bfc811eb7a043e47e39a9a103
+ md5sums = f5741018c8b49127af92c78ab89a3412
+ md5sums = c1768f4613b5f21ac3d5b5966816b062
+ md5sums = 5a06ebe9af9326003590773e2faaf9a4
+ md5sums = 52bbea580c38948575d14d4391268f5d
+ md5sums = 8560fb44654040c5bc7691fd60db6e54
+
+pkgname = saved-kernel-modules
+
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 000000000000..f34a96c51ab9
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+pkg
+src
diff --git a/50-save-kernel-modules-pre.hook b/50-save-kernel-modules-pre.hook
new file mode 100644
index 000000000000..6c03af451f05
--- /dev/null
+++ b/50-save-kernel-modules-pre.hook
@@ -0,0 +1,10 @@
+[Trigger]
+Operation = Upgrade
+Operation = Remove
+Type = Path
+Target = usr/lib/modules/*/vmlinuz
+
+[Action]
+Description = Saving modules of the running kernel...
+When = PreTransaction
+Exec = /usr/lib/modules/saved-kernel-modules/pre-hook
diff --git a/90-save-kernel-modules-post.hook b/90-save-kernel-modules-post.hook
new file mode 100644
index 000000000000..11ad34439401
--- /dev/null
+++ b/90-save-kernel-modules-post.hook
@@ -0,0 +1,10 @@
+[Trigger]
+Operation = Upgrade
+Operation = Remove
+Type = Path
+Target = usr/lib/modules/*/vmlinuz
+
+[Action]
+Description = Linking saved modules ...
+When = PostTransaction
+Exec = /usr/lib/modules/saved-kernel-modules/post-hook
diff --git a/PKGBUILD b/PKGBUILD
new file mode 100644
index 000000000000..a392d8b0095d
--- /dev/null
+++ b/PKGBUILD
@@ -0,0 +1,45 @@
+# Maintainer: Jonathan Kotta <jpkotta@gmail.com>
+pkgname=saved-kernel-modules
+pkgver=0.0
+pkgrel=1
+pkgdesc="Save kernel modules of the running kernel"
+arch=('i686' 'x86_64')
+url=""
+license=('GPL')
+depends=("systemd")
+install=saved-kernel-modules.install
+changelog=
+source=(pre-hook post-hook cleanup README
+ saved-kernel-modules.service saved-kernel-modules.timer
+ 50-save-kernel-modules-pre.hook 90-save-kernel-modules-post.hook)
+md5sums=('07048e088cebc1b8c272dadcab80923f'
+ '947db382e3e874d19a5c05be18193552'
+ 'f71b096bfc811eb7a043e47e39a9a103'
+ 'f5741018c8b49127af92c78ab89a3412'
+ 'c1768f4613b5f21ac3d5b5966816b062'
+ '5a06ebe9af9326003590773e2faaf9a4'
+ '52bbea580c38948575d14d4391268f5d'
+ '8560fb44654040c5bc7691fd60db6e54')
+
+package() {
+ cd "$srcdir"
+
+ local main_dir="$pkgdir"/usr/lib/modules/saved-kernel-modules
+ install -d -m 755 "$main_dir"
+ install -m 644 pre-hook "$main_dir"/pre-hook
+ install -m 644 post-hook "$main_dir"/post-hook
+ install -m 644 cleanup "$main_dir"/cleanup
+ install -m 644 README "$main_dir"/README
+
+ local systemd_dir="$pkgdir"/usr/lib/systemd/system
+ install -d -m 755 "$systemd_dir"
+ install -m 644 saved-kernel-modules.service "$systemd_dir"/saved-kernel-modules.service
+ install -m 644 saved-kernel-modules.timer "$systemd_dir"/saved-kernel-modules.timer
+
+ local hook_dir="$pkgdir"/usr/share/libalpm/hooks
+ install -d -m 755 "$hook_dir"
+ install -m 644 50-save-kernel-modules-pre.hook "$hook_dir"/50-save-kernel-modules-pre.hook
+ install -m 644 90-save-kernel-modules-post.hook "$hook_dir"/90-save-kernel-modules-post.hook
+}
+
+# vim:set ts=2 sw=2 et:
diff --git a/README b/README
new file mode 100644
index 000000000000..ef40b5ae1a59
--- /dev/null
+++ b/README
@@ -0,0 +1,31 @@
+This is a set of pacman hooks and systemd units to preserve the running
+kernel's modules during upgrades. If one upgrades the kernel but
+doesn't reboot right away, any modules that were not loaded yet are
+lost. Modules are often loaded dynamically due to hardware being
+hotplugged at runtime (e.g. a USB device). While it's recommended to
+reboot immediately after an upgrade, sometimes it's inconvenient. On
+the next boot, any saved kernels are purged.
+
+* /usr/share/libalpm/hooks/50-save-kernel-modules-pre.hook
+ PreTransaction hook. Should be before 60 because of mkinitcpio-remove and dkms-remove.
+
+* /usr/share/libalpm/hooks/90-save-kernel-modules-post.hook
+ PostTransaction hook. Should be after 70 because of dkms-install.
+
+* /usr/lib/modules/saved-kernel-modules/modules/
+ Where the modules are preserved
+
+* /usr/lib/modules/saved-kernel-modules/pre-hook
+ Pacman hook to save the running kernel
+
+* /usr/lib/modules/saved-kernel-modules/pre-hook
+ Pacman hook to link the running kernel back in to /usr/lib/modules/
+
+* /usr/lib/modules/saved-kernel-modules/cleanup
+ Script to clean any saved kernels on the next boot
+
+* /usr/lib/systemd/system/saved-kernel-modules.service
+ Runs cleanup on the next boot
+
+* /usr/lib/systemd/system/saved-kernel-modules.timer
+ Schedules the clean up
diff --git a/cleanup b/cleanup
new file mode 100755
index 000000000000..0c5a81ac4137
--- /dev/null
+++ b/cleanup
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+
+#set -o xtrace
+set -o errexit -o nounset -o pipefail -o errtrace
+IFS=$'\n\t'
+
+# clean up the saved modules
+
+cd /usr/lib/modules/saved-kernel-modules
+
+(
+ cd modules
+ for i in * ; do
+ if [ -L /usr/lib/modules/"$i" ] ; then
+ rm -f /usr/lib/modules/"$i"
+ fi
+ done
+)
+
+rm -rf modules/*
diff --git a/post-hook b/post-hook
new file mode 100755
index 000000000000..91fb9cac846b
--- /dev/null
+++ b/post-hook
@@ -0,0 +1,14 @@
+#!/usr/bin/env bash
+
+# set -o xtrace
+set -o errexit -o nounset -o pipefail -o errtrace
+IFS=$'\n\t'
+
+cd /usr/lib/modules/saved-kernel-modules
+
+running_kernel=$(uname -r)
+
+if [ -e modules/"$running_kernel" ] \
+ && [ ! -e /usr/lib/modules/"$running_kernel" ] ; then
+ ln -s $PWD/modules/"$running_kernel" /usr/lib/modules/"$running_kernel"
+fi
diff --git a/pre-hook b/pre-hook
new file mode 100755
index 000000000000..7dfe05c9f1c6
--- /dev/null
+++ b/pre-hook
@@ -0,0 +1,17 @@
+#!/usr/bin/env bash
+
+#set -o xtrace
+set -o errexit -o nounset -o pipefail -o errtrace
+IFS=$'\n\t'
+
+cd /usr/lib/modules/saved-kernel-modules
+
+running_kernel=$(uname -r)
+
+# is it already saved?
+if [ -e modules/$running_kernel ] ; then
+ exit 0
+fi
+
+# copy with hardlinks, much faster
+cp --archive --link /usr/lib/modules/$running_kernel modules/
diff --git a/saved-kernel-modules.install b/saved-kernel-modules.install
new file mode 100644
index 000000000000..8820d08d16af
--- /dev/null
+++ b/saved-kernel-modules.install
@@ -0,0 +1,7 @@
+post_install() {
+ systemctl enable saved-kernel-modules.timer
+}
+
+pre_remove() {
+ systemctl disable saved-kernel-modules.timer
+}
diff --git a/saved-kernel-modules.service b/saved-kernel-modules.service
new file mode 100644
index 000000000000..d03cabde8c8b
--- /dev/null
+++ b/saved-kernel-modules.service
@@ -0,0 +1,8 @@
+[Unit]
+Description=Remove saved kernel modules on boot
+ConditionPathExists=/usr/lib/modules/saved-kernel-modules
+
+[Service]
+Type=oneshot
+ExecStart=/usr/lib/modules/saved-kernel-modules/cleanup
+IOSchedulingClass=idle
diff --git a/saved-kernel-modules.timer b/saved-kernel-modules.timer
new file mode 100644
index 000000000000..4c61f3f069aa
--- /dev/null
+++ b/saved-kernel-modules.timer
@@ -0,0 +1,9 @@
+[Unit]
+Description=Clean up saved kernel modules
+
+[Timer]
+OnBootSec=5min
+Unit=saved-kernel-modules.service
+
+[Install]
+WantedBy=timers.target