Preparation

  1. Disable Secure Boot. ZFS modules can not be loaded if Secure Boot is enabled.

  2. Download latest extended variant of Alpine Linux live image and boot from it.

  3. Login as root user. There is no password.

  4. Configure Internet:

    setup-interfaces -r
    # example:
    network interface: wlan0
    WiFi name:         <ssid>
    ip address:        dhcp
    <enter done to finish network config>
    manual netconfig:  n
    
  5. Configure SSH server:

    setup-sshd
    # example:
    ssh server:        openssh
    allow root:        "prohibit-password" or "yes"
    ssh key:           "none" or "<public key>"
    

    Configurations set here will be copied verbatim to the installed system.

  6. Set root password or /root/.ssh/authorized_keys.

  7. Connect from another computer:

    ssh root@192.168.1.19
    
  8. Configure NTP client for time synchronization:

    setup-ntp chrony
    
  9. Pick a mirror from Alpine Mirrors and add it to package manager configuration:

    tee -a /etc/apk/repositories <<EOF
    https://dl-5.alpinelinux.org/alpine/latest-stable/community/
    https://dl-5.alpinelinux.org/alpine/latest-stable/main/
    EOF
    
  10. Throughout this guide, we use predictable disk names generated by udev:

    apk update
    apk add eudev
    setup-udev
    

    It can be removed after reboot with setup-devd mdev && apk del eudev.

  11. Target disk

    List available disks with:

    ls /dev/disk/by-id/*
    

    If using virtio as disk bus, use /dev/disk/by-path/*.

    Declare disk array:

    DISK='/dev/disk/by-id/ata-FOO /dev/disk/by-id/nvme-BAR'
    

    For single disk installation, use:

    DISK='/dev/disk/by-id/disk1'
    
  12. Install ZFS support and partition tool:

    apk add zfs zfs-lts sgdisk e2fsprogs
    modprobe zfs
    

    Many errors about firmware will appear. They are safe to ignore.

  13. Install bootloader for both legacy boot and UEFI:

    apk add grub-bios grub-efi