summaryrefslogtreecommitdiff
path: root/update-kernel.in
diff options
context:
space:
mode:
Diffstat (limited to 'update-kernel.in')
-rw-r--r--update-kernel.in90
1 files changed, 90 insertions, 0 deletions
diff --git a/update-kernel.in b/update-kernel.in
new file mode 100644
index 0000000..a88e3c2
--- /dev/null
+++ b/update-kernel.in
@@ -0,0 +1,90 @@
+#!/bin/sh -e
+
+# update-kernel
+#
+# Kernel and firmware update script for Alpine installations set up
+# with setup-bootable
+#
+# Copyright (c) 2014 Timo Teräs
+# Copyright (c) 2014 Kaarle Ritvanen
+
+
+TMPDIR=
+SIGNALS="HUP INT TERM"
+SCRIPT=update-kernel
+VIRTUAL=.tmp-$SCRIPT
+
+while read MOUNT; do
+ set -- $MOUNT
+ [ $2 = /.modloop ] || continue
+ DESTDIR=$(dirname $(losetup $1 | cut -d " " -f 3))
+ MNTDIR=$(dirname $DESTDIR)
+ break
+done < /proc/mounts
+
+if [ -z "$MNTDIR" ]; then
+ echo "Module loopback device not mounted" >&2
+ exit 1
+fi
+
+remount() {
+ mount $1 -o remount $MNTDIR
+}
+
+
+ignore_sigs() {
+ trap "" $SIGNALS
+}
+
+clean_up() {
+ set +e
+ ignore_sigs
+
+ apk del $VIRTUAL
+ rm -fr $TMPDIR
+}
+
+trap clean_up EXIT $SIGNALS
+
+
+apk add -U --virtual $VIRTUAL mkinitfs squashfs-tools
+
+. /etc/mkinitfs/mkinitfs.conf
+
+ARCH=$(apk --print-arch)
+FLAVOR=$(uname -r | cut -d - -f 3-)
+TMPDIR=$(mktemp -dt $SCRIPT.XXXXXX)
+ROOT=$TMPDIR/root
+
+apk add --arch $ARCH --root $ROOT --keys-dir /etc/apk/keys \
+ --repositories /etc/apk/repositories \
+ --initdb -U alpine-base dahdi-linux linux-$FLAVOR linux-firmware
+
+KVER=$(ls $ROOT/lib/modules)
+depmod -b $ROOT $KVER
+
+
+STAGING=$TMPDIR/boot
+MODLOOP=$TMPDIR/modloop
+MODIMG=$FLAVOR.modloop.squashfs
+
+mkdir $MODLOOP $STAGING
+cp -a $ROOT/lib/modules $MODLOOP
+cp -a $ROOT/lib/firmware $MODLOOP/modules
+mksquashfs $MODLOOP $STAGING/$MODIMG -comp xz
+
+mkinitfs -F "$features squashfs" -b $ROOT -o $STAGING/$FLAVOR.gz $KVER
+cp $ROOT/boot/vmlinuz-$FLAVOR $STAGING/$FLAVOR
+
+
+ignore_sigs
+remount -w
+
+rm -f $DESTDIR/$MODIMG
+mv $STAGING/* $DESTDIR
+
+set +e
+sync
+remount -r
+
+exit 0