Netboot Alpine Linux using iPXE

From Alpine Linux

Copy the files needed by iPXE to a web server

  • For this guide we will provide the files at http://ipxe-boot.example.com/ from the directory /var/www/ixpe-boot.example.com/ on the web server, which is writable by your non-root admin user. We also assume the web server follows symlinks within /var/www/ipxe-boot.example.com (but not outside that directory tree).
  • Copy the netboot tarball (for example the 3.16.0 stable release of Alpine's netboot image for x86_64) to your non-root admin user on your web server.
  • Extract the netboot tarball to your webserver directory. For example:

tar -C /var/www/ipxe-boot.example.com -xzf alpine-netboot-3.16.0-x86_64.tar.gz

  • This will create a directory structure such as:
boot/
boot/initramfs-lts
boot/config-virt
boot/dtbs-virt/
boot/System.map-lts
boot/vmlinuz-virt
boot/System.map-virt
boot/config-lts
boot/initramfs-virt
boot/modloop-lts
boot/modloop-virt
boot/dtbs-lts/
boot/vmlinuz-lts

Create an iPXE boot script

For example, create a script called boot.ipxe with contents:

Contents of boot.ipxe

#!ipxe set base-url http://ipxe-boot.example.com kernel ${base-url}/boot/vmlinuz-virt console=tty0 modules=loop,squashfs quiet nomodeset alpine_repo=https://dl-cdn.alpinelinux.org/alpine/v3.16/main modloop=http://ipxe-boot.example.com/boot/modloop-virt initrd ${base-url}/boot/initramfs-virt boot

Boot using the iPXE boot script

Using QEMU (for testing)

Assuming you have the binary qemu-system-x86_64 on your system:

qemu-system-x86_64 -boot n -m 512M -enable-kvm -device virtio-net,netdev=n1 -netdev user,id=n1,tftp=$(pwd),bootfile=/boot.ipxe

Using Libvirt

  • Copy the boot.ipxe script to your webserver at /var/www/ipxe-boot.example.com/boot.ipxe (substituting for your actual directory, of course).
  • Create a new NAT network with XML such:
<network>
  <name>ipxeboot</name>
  <forward mode="nat">
    <nat>
      <port start="1024" end="65535"/>
    </nat>
  </forward>
  <bridge name="virbr1" stp="on" delay="0"/>
  <mac address="52:54:00:a4:10:b3"/>
  <domain name="ipxeboot"/>
  <ip address="192.168.129.1" netmask="255.255.255.0">
    <dhcp>
      <range start="192.168.129.128" end="192.168.129.254"/>
      <bootp file="http://ipxe-boot.example.com/boot.ipxe"/>
    </dhcp>
  </ip>
</network>
  • Use virt-install such as:

virt-install -n vm-name --memory 512 --vcpus 1 --pxe --disk size=5,bus=virtio --network network=ipxeboot,model=virtio --input tablet --video virtio --os-variant id=http://alpinelinux.org/alpinelinux/3.13

On Vultr.com

NOTE: Other cloud providers have similar features, but I haven't used them. iPXE Boot Feature - Vultr.com

See Also