#!/bin/sh set -e set -x MAJOR_VERSION=3.11 MINOR_VERSION=2 IMAGE=alpine-minirootfs-$MAJOR_VERSION.$MINOR_VERSION-x86_64.tar.gz SSH_KEYS=$(cat ~/.ssh/id_rsa.pub) RESOLVCONF=/etc/resolv.conf working_directory=$(pwd -P) rootfs_tmpdir=$(mktemp -d) rootfs_url="http://dl-cdn.alpinelinux.org/alpine/v$MAJOR_VERSION/releases/x86_64/$IMAGE" run_root () { chroot $rootfs_tmpdir /usr/bin/env \ PATH=/bin:/sbin \ /bin/sh -c "$*" } if [ "$(whoami)" != 'root' ]; then echo "This script must be run as root." >&2 exit 1 fi # Download, extract inital rootfs. curl "$rootfs_url" -o "$working_directory/$IMAGE" tar xf $IMAGE -C $rootfs_tmpdir # Add SSH keys run_root mkdir -p root/.ssh echo $SSH_KEYS > $rootfs_tmpdir/root/.ssh/authorized_keys run_root chmod 0600 root/.ssh/authorized_keys run_root chmod 0700 root/.ssh # Import local resolv.conf. cat "$RESOLVCONF" > $rootfs_tmpdir/etc/resolv.conf # Make sure init is found by the kernel. run_root ln -s /sbin/init /init # Servers have static addresses, disable the standard # alpine setting of using tempaddr = 2 cat > "$rootfs_tmpdir/etc/sysctl.d/99-ipv6.conf" < "$rootfs_tmpdir/etc/network/interfaces" <> /etc/issue post-up echo post post up >> /etc/issue EOF cat > "$rootfs_tmpdir/etc/hostname" <> "$rootfs_tmpdir/etc/modules" # Layer atop base rootfs. run_root apk update run_root apk upgrade run_root apk add openssh linux-vanilla openrc udev run_root rc-update add udev run_root rc-update add udev-trigger run_root rc-update add sshd run_root rc-update add networking run_root rc-update add hostname # FIXME: add / install rdnssd / ndisc6 / start it on boot # ndisc6 is only @testing # Generate iniramfs image (cd $rootfs_tmpdir; find . | cpio -H newc -o | gzip -9 > "$working_directory/alpine-initramfs.gz") cp "$rootfs_tmpdir/boot/vmlinuz-vanilla" "$working_directory/alpine-kernel" # Cleanup. #rm -r "$rootfs_tmpdir" # Upload to netboot server. - needs to be done outside sudo echo "Use alpine-initramfs.gz alpine-kernel from $working_directory"!