PXE/iPXE boot of MicroOS

Hello everyone,

I’m trying to boot openSUSE MicroOS via PXE (specifically iPXE), ideally using local sources rather than relying only on the public mirrors. My ultimate goal would be to combine this with automated provisioning through Ignition or Combustion.
So far I’ve attempted different setups based on the sparse documentation available for other SUSE systems (like Tumbleweed netboot), but without success. Before I invest more time, I’d like to clarify whether PXE/iPXE boot of MicroOS with local sources and provisioning support is actually possible, or if MicroOS only supports installation through other methods (offline ISO, cloud images, etc.).

Has anyone managed to achieve this, or can confirm if it’s officially supported?

Thanks in advance.

Thanks, but unfortunately doens’t works for me with MicroOS (“VFS Unable to mount root fs…”) and both http/nfs. Myabe I forgot something…

Some minutes ago I got the UEFI HTTP boot (instead of (i)PXE, but that doesn’t matter) working with MicroOS:

  1. Check my documentation for a installation and configuration of Grub2 and Nginx for a network boot
  2. Download and extract the MicroOS files:
SOURCE_DIR="/my/absolute/path/to/nginx/html"

mkdir -p ${SOURCE_DIR}/files/images/openSUSE-MicroOS
wget -O ${SOURCE_DIR}/files/images/openSUSE-MicroOS/openSUSE-MicroOS.x86_64-16.0.0-SelfInstall-Snapshot20251217.install.tar \
    -nc https://cdn.opensuse.org/download/tumbleweed/appliances/openSUSE-MicroOS.x86_64-16.0.0-SelfInstall-Snapshot20251217.install.tar

tar xvf ${SOURCE_DIR}/files/images/openSUSE-MicroOS/openSUSE-MicroOS.x86_64-16.0.0-SelfInstall-Snapshot20251217.install.tar \
    -C ${SOURCE_DIR}/files/images/openSUSE-MicroOS --overwrite

→ The MicroOS version in the link has version 16.0.0, so please check if you need a newer version number.

  1. Create a host file based on the MAC address under hosts/grub2, e.g. hosts/grub2/a8:a1:59:1d:ca:c0 with the following content:
# openSUSE MicroOS

echo Grub2: Host specific file has been loaded

set default="opensuse-microos"
set timeout=30

if [ x"${feature_menuentry_id}" = xy ]; then
  menuentry_id_option="--id"
else
  menuentry_id_option=""
fi

menuentry "Boot from Hard Disk" --class os --unrestricted $menuentry_id_option 'boot-from-hard-disk' {
    exit
}
menuentry "Install openSUSE MicroOS" --class os --unrestricted $menuentry_id_option 'opensuse-microos' {
    echo Loading kernel...
    linux ($root)/images/openSUSE-MicroOS/pxeboot.openSUSE-MicroOS.x86_64-16.0.0.kernel rd.kiwi.oem.installdevice=/dev/disk/by-id/wwn-0x5002538d40db1ab0 rd.kiwi.install.pass.bootparam rd.kiwi.install.pxe rd.kiwi.install.image=http://192.168.2.10/images/openSUSE-MicroOS/openSUSE-MicroOS.x86_64-16.0.0.xz ignition.config.url=http://192.168.2.10/hosts/cl2-standalone1.ign
    echo Loading initrd...
    initrd ($root)/images/openSUSE-MicroOS/pxeboot.openSUSE-MicroOS.x86_64-16.0.0.initrd
}

→ But you need to enter your IP address of your Nginx server as I use 192.168.2.10.
→ The MicroOS version in the linkes files has version 16.0.0, so change it to the downloaded version number.

  1. Have fun or ask questions :grinning:
1 Like

…and if someone needs a working example for Butane (.yaml) and Ignition (.ign) configs:

butane_example.yaml file:
(Don’t forget to change the username, SSH keys, hostname, disk IDs, network interface name, network IPs and so on)

variant: fcos
version: 1.4.0
passwd:
  groups:
    - name: yourusername
      gid: 1000
  users:
    - name: root
      ssh_authorized_keys:
        - "ssh-ed25519 AAAAyourPublicKeyXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX yourname@example.com"
      # test1234
      password_hash: $6$sxfGOnw5tPck1LoS$N.YsNpCFM1MnbmAUGqmmZt/wy.42ugI7K1ZcGBfp4XdufTXxst1.I0u297hCWf.CKWxNwQ9joSgdh7KU96VKH1
    - name: yourusername
      uid: 1000
      primary_group: yourusername
      ssh_authorized_keys:
        - "ssh-ed25519 AAAAyourPublicKeyXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX yourname@example.com"
      # test1234
      password_hash: $6$sxfGOnw5tPck1LoS$N.YsNpCFM1MnbmAUGqmmZt/wy.42ugI7K1ZcGBfp4XdufTXxst1.I0u297hCWf.CKWxNwQ9joSgdh7KU96VKH1
      home_dir: /home/yourusername
      shell: /bin/bash
storage:
  disks:
    - device: "/dev/disk/by-id/wwn-0x50014ee21264eceb"
      wipe_table: true
      partitions:
        - number: 1
          size_mib: 0
          label: opt
  filesystems:
    - path: /home
      device: "/dev/disk/by-id/wwn-0x5002538d40db1ab0-part3"
      format: btrfs
      wipe_filesystem: false
      with_mount_unit: true
      mount_options:
        - "subvol=/@/home"
    - path: /opt
      device: "/dev/disk/by-partlabel/opt"
      format: btrfs
      wipe_filesystem: true
      with_mount_unit: true
  files:
    - path: /etc/hostname
      mode: 0644
      overwrite: true
      contents:
        inline: yourhostname
    - path: /etc/NetworkManager/system-connections/enp1s0.nmconnection
      mode: 0600
      contents:
        inline: |
          [connection]
          id=enp1s0
          uuid=b5344841-0f14-4406-b699-c9d70cc198f9
          type=ethernet
          autoconnect-priority=-100
          autoconnect-retries=1
          interface-name=enp1s0
          multi-connect=1

          [ethernet]

          [ipv4]
          address1=192.168.0.5/23
          dns=192.168.0.1;
          gateway=192.168.0.1
          may-fail=false
          method=manual

          [ipv6]
          method=disabled

          [proxy]
systemd:
  units:
    - name: sshd.service
      enabled: true
    - name: cockpit.socket
      enabled: true

That Butane config file can now be converted into Ignition using Podman (…or Docker…):

podman run --interactive --rm quay.io/coreos/butane:release --pretty --strict < butane_example.yaml > ignition_example.ign

That ignition_example.ign file can now be used for installing a new server.

Thanks, I’ll try in my environment with iPXE and http(s) requests answered by Caddy.
Apparently easy to translate.
I’ll report back asap.

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.