Table of contents

Introduction

Alpine Linux is a very lightweight and simple Linux distribution. It is especially well suited to run servers. This article should provide a reference how to install it inside a QEMU-based virtual machine.

It has to be noted that the installation mode will be the diskless mode which erases all changes on a reboot if they were not saved by the lbu utility.

Create virtual machine image file

The first step to setup the virtual Alpine machine is to create a vm.qcow2 file which will be used as the disk for the final virtual machine:

qemu-img create -f qcow2 vm.qcow2 30G

It has to be noted that the size is set to 30 gigabytes which is what the VM will see. Independent of that virtual size the vm.qcow2 file will use only as much disk space as required on the host system so that the file is actually way smaller than 30 GB.

Start and setup temporary Alpine system

An Alpine Linux image file is required for the first run of the virtual machine. They can be obtained on the Alpine Linux download page.

For this article the image alpine-standard-3.19.0-x86_64.iso was selected. To start QEMU with the created vm.qcow2 disk connected and the Alpine image file inserted the following command is used:

qemu-system-x86_64 \
    -enable-kvm \
    -m 4G \
    -nic user,model=virtio \
    -drive file=vm.qcow2,media=disk,if=virtio \
    -smp cpus=4 \
    -display sdl \
    -cdrom alpine-standard-3.19.0-x86_64.iso

After booting this the live system has to be prepared. For this purpose one can log in with the username root and use the following setup script:

setup-alpine

This interactive program will configure the system. A quite minimal configuration should be preferred. The defaults are usually sufficient. Disks and SSH servers should not be configured.

Future versions of this article should provide a so called “answers file” for setup-alpine so that the script can run without user interaction.

Make disk bootable

Since the created virtual disk vm.qcow2 is empty and thus cannot be used without the Alpine image file the next step is to make it independently bootable.

Since lsblk is not included in the default Alpine image file the command ls -l /dev/block has to be used to list all block devices which include the created virtual disk.

ls -l /dev/block

The output should contain a symbolic link to a file like /dev/vda which corresponds to the created vm.qcow2 file on the host system.

The next step is to create a partition table and one partition on that disk to store the operating system. The interactive program fdisk is used for that purpose. The exact inputs are noted down below. An empty line requires to accept the default by hitting only ‘Enter’:

fdisk /dev/vda
o
n
p
1
2048

t
0c
a
1
p
w

This will create a new DOS partition table, create one primary partition which takes the whole size of the disk, set the type of this partition and make it bootable. Finally the result is printed with p and the changes are written to disk with w. The process can be aborted by hitting q before w is used. m will print details about all available options.

After partitioning the only created primary partition has to be formatted. This can be done with the following command:

mkdosfs /dev/vda1

To allow mounting DOS filesystems and prevent errors on the next command the vfat kernel module has to be loaded with modprobe:

modprobe vfat

The final command to make vm.qcow2 bootable is

setup-bootable /media/cdrom /dev/vda1

It will copy the contents of the Alpine live image mounted at /media/cdrom to the just formatted DOS partition /dev/vda1 and installs the syslinux bootloader to the disk /dev/vda.

The temporary Alpine system can be powered off with poweroff.

Configure final system

Booting the final system the first time works like with the qemu-system-x86_64 command for the temporary system except that the -cdrom option has to be ommitted. This is possible since vm.qcow2 is now independently bootable.

The final system can be configured like the temporary one:

setup-alpine

By default only the main package repository is enabled. If it is required to also install packages from the community repository it has to be enabled in the related configuration file:

vi /etc/apk/repositories

An upgrade to the latest package revisions on the Alpine Linux package servers is a good idea at that point:

apk upgrade -a

Finally the changes have to be changed with the lbu tool to make it persistent after reboots:

lbu commit -d

Install a desktop system

The optional installation of a graphical desktop is also well supported by a setup script:

setup-desktop

Currently the GNOME desktop, KDE Plasma and Xfce are supported. Xfce worked best so far.

Finally the installation of the desktop environment has to be committed too:

lbu commit -d

The last step can be ommitted to remove the desktop environment cleanly after a reboot.