diff options
Diffstat (limited to 'update-kernel.in')
-rw-r--r-- | update-kernel.in | 90 |
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 |