Setting up Alpine Linux

Published on December 29, 2020


Use any live environment (LiveISO or rescue image) to boot up the system you want to set up. The image doesn't necessarily have to be Alpine Linux, but if you can boot up Alpine linux, the installation may be slightly easier. Use fdisk, gdisk or gparted to partition the disk.

Mount the partition that you want to use as the root filesystem:

mkdir /mnt/chroot
mount /dev/vda1 /mnt/chroot

Download and extract the Alpine Linux rootfs:

tar -xvpzf alpine-minirootfs-3.12.3-x86_64.tar.gz -C /mnt/chroot/

Check for the latest version.

Edit /mnt/chroot/

mount --rbind /dev /mnt/chroot/dev
mount --make-rslave /mnt/chroot/dev
mount -t proc /proc /mnt/chroot/proc
mount --rbind /sys /mnt/chroot/sys
mount --make-rslave /mnt/chroot/sys
mount --rbind /tmp /mnt/chroot/tmp
cp /etc/resolv.conf /mnt/chroot/etc/resolv.conf

Using this script you can easily chroot into the installation:

chroot /mnt/chroot /bin/bash

Add the following lines to /etc/apk/repositories:


Installing basic software:

apk add bash shadow openrc vim

Remove the # from the following line in /etc/inittab to enable the serial console at boot:

ttyS0::respawn:/sbin/getty -L ttyS0 115200 vt100

If you installed Alpine to a VPS or a container, then you may not need a boot loader, a kernel and the firmware to boot into Alpine. Otherwise, you can set up a Linux kernel:

apk add linux-firmware linux-lts grub grub-efi

Install GRUB:

grub-install --target=x86_64-efi --efi-directory=/boot /dev/vda

Generate the GRUB config:

grub-mkconfig -o /boot/grub/grub.cfg

Create user

Create a user that you can use to log onto the server:

useradd -mUG wheel user

Configure a password for the user:

passwd user

Setting the timezone

Install the tzdata package:

apk add tzdata

You can list the available timezones as follows:

ls /usr/share/zoneinfo

Assuming you want to use the Europe/Amsterdam timezone, you can copy it as follow to the localtime file:

cp /usr/share/zoneinfo/Europe/Amsterdam /etc/localtime

Do also specify your timezone:

echo "Europe/Amsterdam" > /etc/timezone

You can check the current time and date:


After configuring the timezone, you can remove the tzdata package:

apk del tzdata

Setting the hostname

Edit /etc/hostname:



Edit /etc/network/interfaces and adjust the settings for IPv6 accordingly:

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp
iface eth0 inet6 static
	address 2001:bc8:600:1236::1
	netmask 64
	gateway 2001:bc8:600:1236::
	pre-up echo 1 > /proc/sys/net/ipv6/conf/eth0/accept_ra

Restart the service:

/etc/init.d/networking restart


Install ufw:

apk add ip6tables ufw@testing

Block incoming traffic by default:

ufw default deny incoming
ufw default allow outgoing

Start the service:

ufw enable
rc-update add ufw

Check the status of ufw:

ufw status


Install OpenSSH:

apk add openssh-server

Edit /etc/ssh/sshd_config:

PasswordAuthentication no
AllowTcpForwarding yes

Open the SSH port, but limit the amount of possible traffic:

ufw limit ssh

Start the service:

/etc/init.d/sshd start
rc-update add sshd

Log in as user:

su user
mkdir .ssh
chmod 0700

Upload your public key as ~/.ssh/authorized_keys.


Add an A-record and AAAA-record with your IPv4 and IPv6 addresses to your DNS records:

@ IN A ( "" );
@ IN AAAA ( "2001:bc8:600:1236::1" );

Add a CNAME-record to your DNS record:

* IN CNAME ( "@" );

Finally, you also want to set up reverse DNS to map your IP addresses back to the hostname. This can typically be done through the provider of your server instance.

[ #alpine ]

If you like my work or if my work has been useful to you in any way, then feel free to donate me a cup of coffee. Any donation is much appreciated!