1 - boot a VM with the last alpine linux iso and a hard disk 2 - setup network interface (setup-interfaces, then ifup eth0) 3 - setup dns (add gateway / any DNS to /etc/resolv.conf) 4 - apk add e2fsprogs 5 - mkfs.ext4 /dev/vda 6 - mount -t ext4 /dev/vda /mnt 7 - /sbin/apk --arch x86_64 -X http://dl-cdn.alpinelinux.org/alpine/latest-stable/main/ -U --allow-untrusted --root /mnt --initdb add alpine-base agetty # replace latest-stable by the wanted version 8 - echo "UUID=`blkid -s UUID -o value /dev/vda` / ext4 defaults,errors=remount-ro,discard,noatime 0 1" > /mnt/etc/fstab 9 - (optional) tty1::respawn:/sbin/agetty --autologin root tty1 linux # replace tty line from /etc/inittab with this line to have autologin - no need to set root password. you can remove other ttys 10 - cp /etc/network/interfaces /mnt/etc/network/interfaces 11 - cp /etc/resolv.conf /mnt/etc/resolv.conf 12 - vi /mnt/etc/hostname # setup hostname 13 - cp /etc/apk/repositories /mnt/etc/apk/repositories # setup alpine repos (edit to set alpine version), enable community 14 - for a in proc sys dev; do mount -o bind /$a /mnt/$a; done; chroot /mnt /bin/ash # chroot into target 15 - apk update 16 - apk add linux-virt linux-firmware-none acpi mkinitfs vim screen qemu-guest-agent 17 - enable services rc-update add seedrng boot rc-update add swap boot rc-update add networking boot rc-update add modules boot rc-update add hostname boot rc-update add hwclock boot rc-update add bootmisc boot rc-update add acpid default rc-update add crond default rc-update add qemu-guest-agent default rc-update add devfs sysinit rc-update add dmesg sysinit rc-update add mdev sysinit rc-update add hwdrivers sysinit rc-update add killprocs shutdown rc-update add mount-ro shutdown rc-update add savecache shutdown 18 - shutdown VM (force) 19 - setup kernel