update-kernel.in 2.66 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14
#!/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


SCRIPT=update-kernel
VIRTUAL=.tmp-$SCRIPT

15
FLAVOR=
16
MNTDIR=
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
PACKAGES=
SIGNALS="HUP INT TERM"
TMPDIR=
features=

OPTS=$(getopt -l flavor:,feature:,package: -n $SCRIPT -o f:F:p: -- "$@")
eval set -- "$OPTS"
while :; do
    case "$1" in
	-f|--flavor)
	    FLAVOR=$2
	    ;;
	-F|--feature)
	    features="$features $2"
	    ;;
	-p|--package)
	    PACKAGES="$PACKAGES $2"
	    ;;
	--)
	    break
	    ;;
    esac
    shift 2
done

DESTDIR=$2


error() {
    echo "$1" >&2
    exit 1
}
49 50

if [ -z "$DESTDIR" ]; then
51 52
    [ "$FLAVOR" ] && error "Cannot specify flavor when updating the current kernel"

53 54 55 56
    while read MOUNT; do
	set -- $MOUNT
	[ $2 = /.modloop ] || continue
	DESTDIR=$(dirname $(losetup $1 | cut -d " " -f 3))
57
	MNTDIR=$(dirname "$DESTDIR")
58 59 60
	break
    done < /proc/mounts

61
    [ "$MNTDIR" ] || error "Module loopback device not mounted"
62 63 64
fi

remount() {
65
    mount $1 -o remount "$MNTDIR"
66 67 68 69 70 71 72 73 74 75 76
}


ignore_sigs() {
    trap "" $SIGNALS
}

clean_up() {
    set +e
    ignore_sigs

77
    apk del -q $VIRTUAL
78
    rm -fr "$TMPDIR"
79 80 81 82 83
}

trap clean_up EXIT $SIGNALS


84
apk add -qU -t $VIRTUAL mkinitfs squashfs-tools
85

86 87 88
if [ -z "$features" ]; then
    . /etc/mkinitfs/mkinitfs.conf
fi
89

90
if [ -z "$FLAVOR" ]; then
91 92
    FLAVOR=$(uname -r | cut -d - -f 3-)
    [ "$FLAVOR" ] || FLAVOR=vanilla
93 94
fi

95 96 97
TMPDIR=$(mktemp -dt $SCRIPT.XXXXXX)
ROOT=$TMPDIR/root

98
_apk() {
99 100 101
    local cmd=$1
    shift
    apk $cmd -p "$ROOT" --keys-dir /etc/apk/keys \
102 103 104
	--repositories-file /etc/apk/repositories $*
}

105 106 107 108 109 110 111 112 113 114 115
add_pkgs() {
    _apk add -q --no-scripts $*
}

extra_pkgs() {
    local res=$(_apk search -x $1)
    if [ "$res" ]; then
	add_pkgs $*
    fi
}

116 117 118 119 120
add_pkgs -U --initdb alpine-base "linux-$FLAVOR" linux-firmware $PACKAGES
if [ -z "$PACKAGES" ]; then
    extra_pkgs "dahdi-linux-$FLAVOR" dahdi-linux
    extra_pkgs "xtables-addons-$FLAVOR"
fi
121

122

123 124 125 126
KVER_FLAVOR=
[ "$FLAVOR" = vanilla ] || KVER_FLAVOR=-$FLAVOR
KVER=$(basename $(ls -d "$ROOT"/lib/modules/*"$KVER_FLAVOR"))
depmod -b "$ROOT" "$KVER"
127 128 129 130 131 132


STAGING=$TMPDIR/boot
MODLOOP=$TMPDIR/modloop
MODIMG=$FLAVOR.modloop.squashfs

133 134 135 136
mkdir "$MODLOOP" "$STAGING"
cp -a "$ROOT/lib/modules" "$MODLOOP"
cp -a "$ROOT/lib/firmware" "$MODLOOP/modules"
mksquashfs "$MODLOOP" "$STAGING/$MODIMG" -comp xz
137

138 139
mkinitfs -q -b "$ROOT" -F "$features base squashfs" -o "$STAGING/$FLAVOR.gz" \
    "$KVER"
140
cp "$ROOT/boot/vmlinuz$KVER_FLAVOR" "$STAGING/$FLAVOR"
141 142


143 144 145 146 147
if [ "$MNTDIR" ]; then
    ignore_sigs
    remount -w
    rm -f "$DESTDIR/$MODIMG"
fi
148

149
mv "$STAGING"/* "$DESTDIR"
150

151 152 153 154 155
if [ "$MNTDIR" ]; then
    set +e
    sync
    remount -r
fi
156 157

exit 0