--- /dev/null
+#!/bin/sh
+
+burl="https://launchpad.net/ubuntu/+archive/primary/+files/linux-image"
+outdir="./download"
+def_arches="i386 x86_64 arm powerpc ppc64 ppc64le aarch64"
+
+error() { echo "$@" 1>&2; }
+fail() { [ $# -eq 0 ] || error "$@"; exit 1; }
+dl() {
+ local url="$1" target="$2" tfile="" t=""
+ [ -f "$target" ] && return
+ t=$(dirname "$target")
+ tfile=$(mktemp "$t/.${0##*/}.XXXXXX") || return
+ wget "$url" -O "$tfile" &&
+ mv "$tfile" "$target" ||
+ { t=$?; rm -f "$tfile"; return $t; }
+}
+
+[ "$1" = "--outdir" ] && { outdir="$1" && shift; }
+kver="$1"
+shift
+
+if [ $# -eq 0 ]; then
+ set -- ${def_arches}
+fi
+
+[ -d "$outdir" ] || mkdir -p "$outdir" ||
+ fail "failed mkdir $outdir"
+
+
+[ -n "$kver" ] || fail "must give kernel version"
+
+# version like 3.13.0-52.86
+# 3.19.0-20.20~14.04.1
+
+kpart=${kver%-*}
+upart=${kver#*-}
+abi=${upart%%.*}
+kmajor=${kpart%%.*}
+kminor=${kpart#*.}; kminor=${kminor%.*}
+kmicro=${kpart#*.*.}
+
+for arch in "$@"; do
+ xarch=$arch;
+ [ "$arch" = "x86_64" ] && xarch="amd64";
+ if [ "$kmajor.$kminor" = "3.2" ]; then
+ case "$arch" in
+ x86_64|i386) flav="virtual";;
+ arm) flav="omap"; xarch="armel";;
+ powerpc) flav="powerpc64-smp";;
+ *) fail "unknown kernel:arch for $kver:$arch"
+ esac
+ elif [ "$kmajor.$kminor" = "3.13" -o "$kmajor.$kminor" = "3.19" ]; then
+ case "$arch" in
+ arm) xarch="armhf"; flav="generic";;
+ aarch64) xarch=arm64; flav="generic";;
+ powerpc|ppc64) xarch=powerpc; flav="powerpc64-smp";;
+ ppc64le) xarch="ppc64el"; flav="generic";;
+ x86_64|i386|arm64) flav="generic";;
+ *) fail "unknown kernel:arch for $kver:$arch"
+ esac
+ else
+ fail "unknown kernel $kver ($kmajor.$kminor)"
+ fi
+ url="$burl-${kmajor}.${kminor}.${kmicro}-${abi}-${flav}_${kver}_${xarch}.deb"
+ dl "$url" "$outdir/${url##*/}" || fail "failed dl $url"
+ ln -sf ${url##*/} "$outdir/kernel-${arch}.deb" ||
+ fail "failed symlink for $outdir/kernel-$arch.deb"
+done
+