2021-05-29 17:53:40 +00:00
|
|
|
#!/bin/sh
|
|
|
|
|
|
|
|
if [ $# -ne 2 ]; then
|
|
|
|
echo "$0 disk ssh-keyfile"
|
|
|
|
echo " disk: which disk to install to"
|
|
|
|
echo " ssh-keyfile: ssh keys to add into the image"
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
|
|
|
set -e
|
|
|
|
set -x
|
|
|
|
|
|
|
|
DISK=$1; shift
|
|
|
|
SSH_KEYS=$1; shift
|
|
|
|
|
2021-07-28 14:32:43 +00:00
|
|
|
MAJOR_VERSION=3.14
|
|
|
|
MINOR_VERSION=0
|
2021-05-29 17:53:40 +00:00
|
|
|
IMAGE=alpine-minirootfs-$MAJOR_VERSION.$MINOR_VERSION-x86_64.tar.gz
|
|
|
|
|
|
|
|
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"
|
|
|
|
|
2021-07-28 14:32:43 +00:00
|
|
|
case $DISK in
|
|
|
|
/dev/sd*)
|
|
|
|
partition=${DISK}1
|
|
|
|
;;
|
|
|
|
/dev/mmcblk*|/dev/nvme*)
|
|
|
|
partition=${DISK}p1
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
echo "Unsupported disk - edit this script" >&2
|
|
|
|
exit 1
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
2021-05-29 17:53:40 +00:00
|
|
|
run_root () {
|
2021-05-29 18:22:25 +00:00
|
|
|
sudo chroot $rootfs_tmpdir /usr/bin/env \
|
2021-05-29 18:10:46 +00:00
|
|
|
PATH=/sbin:/bin:/usr/sbin:/usr/bin \
|
2021-05-29 17:53:40 +00:00
|
|
|
/bin/sh -c "$*"
|
|
|
|
}
|
|
|
|
|
|
|
|
wget -c "$rootfs_url" -O "$IMAGE"
|
|
|
|
|
2021-05-29 18:05:42 +00:00
|
|
|
# Clean the first 2M - getting rid of old things
|
|
|
|
# in the gap and also the paritition table
|
|
|
|
dd if=/dev/zero of=${DISK} bs=1M count=2
|
|
|
|
|
2021-05-29 17:53:40 +00:00
|
|
|
# Partition disk with 1 Linux partition
|
|
|
|
sudo sfdisk "$DISK" <<EOF
|
|
|
|
label: dos
|
|
|
|
,,L
|
|
|
|
EOF
|
|
|
|
|
|
|
|
# For creation, if an existing filesystem is on the partitions
|
2021-07-28 14:32:43 +00:00
|
|
|
sudo mkfs.ext4 -F ${partition}
|
2021-05-29 17:53:40 +00:00
|
|
|
|
2021-07-28 14:32:43 +00:00
|
|
|
sudo mount ${partition} $rootfs_tmpdir
|
2021-05-29 17:53:40 +00:00
|
|
|
|
|
|
|
# keep right permissions, use sudo
|
|
|
|
sudo tar xf $IMAGE -C $rootfs_tmpdir
|
|
|
|
|
2021-05-29 20:24:10 +00:00
|
|
|
# These are required by grub-install
|
|
|
|
# And also for generating grub config that contains rootfstype
|
|
|
|
for dir in dev proc sys; do
|
|
|
|
sudo mount --bind /${dir} ${rootfs_tmpdir}/${dir}
|
|
|
|
done
|
|
|
|
|
2021-05-29 17:53:40 +00:00
|
|
|
# Add SSH keys
|
|
|
|
run_root mkdir -p root/.ssh
|
|
|
|
sudo cp $SSH_KEYS $rootfs_tmpdir/root/.ssh/authorized_keys
|
|
|
|
run_root chown root:root /root/.ssh/authorized_keys
|
|
|
|
run_root chmod 0600 /root/.ssh/authorized_keys
|
|
|
|
run_root chmod 0700 /root/.ssh
|
|
|
|
|
|
|
|
# Import local resolv.conf.
|
|
|
|
sudo cp "$RESOLVCONF" $rootfs_tmpdir/etc/resolv.conf
|
|
|
|
|
2021-05-29 19:07:58 +00:00
|
|
|
# Generate fstab which is later included in the initramfs
|
|
|
|
|
|
|
|
# Add filesystem to fstab, because busybox mount does not work
|
|
|
|
# without -t ext4 for mounting and returns "No such file or directory"
|
|
|
|
# nb2:~# blkid| grep ^${DISK}1 | awk '{ print $2 }'
|
|
|
|
# UUID="fecf4182-f6dd-4d2c-9af7-8f36444ee25c"
|
|
|
|
eval $(blkid | grep ^${DISK}1 | awk '{ print $2 }')
|
2021-05-29 19:23:05 +00:00
|
|
|
echo "UUID=$UUID / ext4 defaults 0 1" >> ${rootfs_tmpdir}/etc/fstab
|
2021-05-29 19:07:58 +00:00
|
|
|
|
2021-05-29 17:53:40 +00:00
|
|
|
run_root apk update
|
2021-05-29 20:44:43 +00:00
|
|
|
run_root apk add linux-lts openrc udev openssh e2fsprogs
|
2021-05-29 17:53:40 +00:00
|
|
|
|
|
|
|
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
|
2021-06-07 17:15:35 +00:00
|
|
|
run_root rc-update add sysctl
|
2021-07-11 12:05:50 +00:00
|
|
|
run_root rc-update add modules
|
2021-05-29 17:53:40 +00:00
|
|
|
run_root sed -i 's/root:!::0:::::/root:*::0:::::/' /etc/shadow
|
|
|
|
|
|
|
|
sudo tee "$rootfs_tmpdir/etc/network/interfaces" <<EOF
|
|
|
|
auto lo
|
|
|
|
iface lo inet loopback
|
|
|
|
|
|
|
|
auto eth0
|
|
|
|
iface eth0 inet6 manual
|
|
|
|
up /sbin/ip link set \$IFACE up
|
|
|
|
|
|
|
|
EOF
|
|
|
|
|
|
|
|
sudo tee "$rootfs_tmpdir/etc/hostname" <<EOF
|
|
|
|
alpine-unconfigured
|
|
|
|
EOF
|
|
|
|
|
|
|
|
# Setup bootloader
|
|
|
|
|
|
|
|
run_root apk add grub-bios
|
2021-05-29 20:24:10 +00:00
|
|
|
echo 'GRUB_CMDLINE_LINUX_DEFAULT="quiet rootfstype=ext4"' >> ${rootfs_tmpdir}/etc/default/grub
|
|
|
|
run_root grub-mkconfig -o /boot/grub/grub.cfg
|
2021-05-29 18:05:42 +00:00
|
|
|
run_root grub-install --target=i386-pc ${DISK}
|
2021-05-29 17:53:40 +00:00
|
|
|
|
|
|
|
# Cleanup
|
|
|
|
run_root rm -f /etc/resolv.conf
|
|
|
|
for dir in dev proc sys; do
|
2021-05-29 18:22:25 +00:00
|
|
|
sudo umount ${rootfs_tmpdir}/${dir}
|
2021-05-29 17:53:40 +00:00
|
|
|
done
|
|
|
|
sudo umount $rootfs_tmpdir
|
|
|
|
|
|
|
|
sync
|
2021-05-29 18:10:46 +00:00
|
|
|
rmdir ${rootfs_tmpdir}
|
2021-05-29 17:53:40 +00:00
|
|
|
|
|
|
|
echo "${DISK} has been setup with Alpine Linux"
|
|
|
|
|
|
|
|
exit 0
|