diff options
author | Jonathan Kotta | 2020-03-14 20:32:25 -0500 |
---|---|---|
committer | Jonathan Kotta | 2020-03-14 20:32:25 -0500 |
commit | f5dff153c22dfb3f59cd3d714781bf9c57949e05 (patch) | |
tree | 74f14f66e5d9c8e31e86190265d65f3d35f74fd5 | |
download | aur-f5dff153c22dfb3f59cd3d714781bf9c57949e05.tar.gz |
initial commit
-rw-r--r-- | .SRCINFO | 28 | ||||
-rw-r--r-- | .gitignore | 2 | ||||
-rw-r--r-- | 50-save-kernel-modules-pre.hook | 10 | ||||
-rw-r--r-- | 90-save-kernel-modules-post.hook | 10 | ||||
-rw-r--r-- | PKGBUILD | 45 | ||||
-rw-r--r-- | README | 31 | ||||
-rwxr-xr-x | cleanup | 20 | ||||
-rwxr-xr-x | post-hook | 14 | ||||
-rwxr-xr-x | pre-hook | 17 | ||||
-rw-r--r-- | saved-kernel-modules.install | 7 | ||||
-rw-r--r-- | saved-kernel-modules.service | 8 | ||||
-rw-r--r-- | saved-kernel-modules.timer | 9 |
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 |