builds.sr.ht/images/alpine/genimg

164 lines
3.9 KiB
Bash
Executable File

#!/bin/sh -eux
echo "$release" >/dev/null # fail on -u if release unset
arch="${1:-x86_64}"
linux="${linux:-linux-lts}"
cleanup() {
# The order here is important if you don't want to hose your mounts
sync
umount -f /mnt/dev/pts 2>/dev/null || true
umount -f /mnt/dev/shm 2>/dev/null || true
umount -f /mnt/dev 2>/dev/null || true
umount -f /mnt/proc 2>/dev/null || true
umount -f /mnt/run 2>/dev/null || true
umount -f /mnt/sys 2>/dev/null || true
umount -f /mnt/boot 2>/dev/null || true
umount -f /mnt 2>/dev/null || true
swapoff /dev/nbd0p2 || true
qemu-nbd --disconnect /dev/nbd0 || true
}
mkdir -p "$arch"
qemu-img create -f qcow2 "$arch"/root.img.qcow2 16G
modprobe nbd max_part=16
qemu-nbd --connect=/dev/nbd0 "$arch"/root.img.qcow2
trap cleanup EXIT
if [ "$arch" == "x86_64" ] || [ "$arch" == "i686" ]
then
dd if=/usr/share/syslinux/mbr.bin of=/dev/nbd0 bs=1 count=440
fi
sfdisk --no-reread /dev/nbd0 <<EOF
1M,100M,L,*
,2048M,S
,,L
EOF
mdev -s
mkfs.ext4 /dev/nbd0p1
mkswap /dev/nbd0p2
mkfs.ext4 /dev/nbd0p3
mount /dev/nbd0p3 /mnt
mkdir /mnt/boot
mount /dev/nbd0p1 /mnt/boot
swapon /dev/nbd0p2
# TODO: Remove bash
apk add -U \
-X http://dl-cdn.alpinelinux.org/alpine/$release/main/ \
-X http://dl-cdn.alpinelinux.org/alpine/$release/community/ \
--allow-untrusted \
--arch="$arch" \
--root=/mnt \
--initdb \
acct alpine-base alpine-conf alpine-sdk linux-firmware-none $linux \
git mercurial openssh sudo syslinux tzdata gnupg haveged bash
mount --bind /dev /mnt/dev
mount --bind /dev/pts /mnt/dev/pts
mount --bind /dev/shm /mnt/dev/shm
mount --bind /proc /mnt/proc
mount --bind /run /mnt/run
mount --bind /sys /mnt/sys
run_root() {
chroot /mnt /usr/bin/env \
PATH=/sbin:/usr/sbin:/bin:/usr/bin \
/bin/sh -c "$*"
}
run_root setup-hostname -n build
run_root setup-interfaces -i <<EOF
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
hostname build
address 10.0.2.15
netmask 255.255.255.0
gateway 10.0.2.2
EOF
run_root setup-dns -d example.org 8.8.8.8 8.8.4.4
if [ "$release" = "edge" ]
then
run_root setup-timezone UTC
cat >/mnt/etc/apk/repositories <<EOF
http://dl-cdn.alpinelinux.org/alpine/$release/main
http://dl-cdn.alpinelinux.org/alpine/$release/community
http://dl-cdn.alpinelinux.org/alpine/$release/testing
EOF
else
run_root setup-timezone -z UTC
cat >/mnt/etc/apk/repositories <<EOF
http://dl-cdn.alpinelinux.org/alpine/$release/main
http://dl-cdn.alpinelinux.org/alpine/$release/community
EOF
fi
extlinux -i /mnt/boot
run_root rc-update add ntpd default
run_root rc-update add sshd default
run_root rc-update add crond default
run_root rc-update add haveged default
for i in hwclock modules sysctl hostname bootmisc networking syslog swap
do
run_root rc-update add $i boot
done
for i in mount-ro killprocs savecache
do
run_root rc-update add $i shutdown
done
sed -e 's/#PermitEmptyPasswords no/PermitEmptyPasswords yes/' \
-i /mnt/etc/ssh/sshd_config
run_root adduser -u 1000 -D -h /home/build -s /bin/sh build
run_root adduser build wheel
run_root adduser build kvm
run_root adduser build abuild
run_root passwd -u build
printf '%s\n' "%wheel ALL=(ALL) NOPASSWD: ALL" >> /mnt/etc/sudoers
rm -f /mnt/etc/motd
cat >/mnt/boot/extlinux.conf <<EOF
DEFAULT linux
LABEL linux
LINUX vmlinuz-$(echo "$linux" | cut -d- -f2-)
INITRD initramfs-$(echo "$linux" | cut -d- -f2-)
APPEND root=/dev/vda3 rw modules=sd-mod,usb-storage,ext4 quiet rootfstype=ext4
EOF
cat >>/mnt/etc/fstab <<EOF
/dev/vda1 /boot ext4 rw,relatime,data=ordered 0 0
/dev/vda2 swap swap defaults 0 0
/dev/vda3 / ext4 rw,relatime,data=ordered 0 0
EOF
mkdir -p /mnt/etc/docker
cat >/mnt/etc/docker/daemon.json <<EOF
{
"bip": "172.18.0.1/16"
}
EOF
pkg_version() {
name=$(run_root apk list $1 | grep installed | cut -d' ' -f1)
echo ${name##$1-}
}
run_root apk add $linux=$(pkg_version $linux)
cat >/mnt/home/build/.gitconfig <<EOF
[user]
name = builds.sr.ht
email = builds@sr.ht
EOF
chown build:build /mnt/home/build/.gitconfig
sync