A growing number of Linux deployments are moving away from local disk storage, booting directly from network-attached storage using ZFS snapshots, iSCSI targets, and PXE firmware. This approach promises faster provisioning, easier replication, and greater resilience — but it comes with tradeoffs in performance and complexity.
Overview
Diskless booting relies on three components: a ZFS pool on a remote server to provide snapshots and flexible storage, an iSCSI target to expose that storage as a block device over the network, and PXE firmware on the client to load the bootloader and operating system from the network. The result is a fully functional Linux system that has no local disk — the OS, applications, and data all live on the remote storage array.
What you need
- A server running Debian 13 (or Proxmox) that will act as the netboot, TFTP, iSCSI target, and ZFS host.
- A DHCP server that supports DNSMasq (e.g., an Asus router with Merlin firmware).
- A client machine with PXE-capable firmware (UEFI or BIOS).
- A ZFS pool on the server with a ZVOL of at least 32 GB for the Debian installation.
Step-by-step setup
1. Install and configure Netboot.xyz
On the server, install the required packages:
apt install apache2 git ansible tftpd-hpa targetcli-fb
Clone the Netboot.xyz repository and customize the configuration:
cd /opt
git clone https://github.com/netbootxyz/netboot.xyz.git
cd netboot.xyz
Edit /opt/netboot.xyz/user_overrides.yml to set site_name and boot_domain to the server's IP address (e.g., 192.168.50.167).
Edit /opt/netboot.xyz/roles/netbootxyz/templates/menu/boot.cfg.j2 — find the :end section and change it to:
:end
chain local-vars.ipxe || exit
Edit /opt/netboot.xyz/roles/netbootxyz/templates/local-vars.ipxe.j2 and set:
#!ipxe
set custom_url http://192.168.50.167
Run the Ansible playbook to install Netboot.xyz to /var/www/html:
ansible-playbook -i inventory site.yml
2. Create a custom iPXE boot script
Create /var/www/html/debian13-iscsi.ipxe with the following content, adjusting IP addresses and IQNs to match your setup:
#!ipxe
set iscsi-server 192.168.50.167
set iscsi-target iqn.2026-05.xyz.716697.pve-vt:tank-debian-disk-12700k
set initiator-iqn iqn.2026-05.xyz.716697.pve-vt:12700k
set username myuser
set password mypassword
set reverse-username targetuser
set reverse-password targetpassword
sanboot iscsi:${iscsi-server}::::${iscsi-target} || goto installer
:installer
imgfree
kernel http://${iscsi-server}/assets/debian13/linux
initrd http://${iscsi-server}/assets/debian13/initrd.gz
imgargs linux root=/dev/ram0 initrd=initrd.gz vga=normal
boot
Create /var/www/html/custom.ipxe to add a menu entry:
#!ipxe
menu Local Custom Menu
item --gap --
item debian13-iscsi Debian 13 iSCSI Boot (192.168.50.167)
item --gap --
item back Back to main menu
choose menu || goto back
goto ${menu}
:debian13-iscsi
chain http://192.168.50.167/debian13-iscsi.ipxe || goto back
:back
chain http://192.168.50.167/menu.ipxe
Download the Debian installer files:
mkdir -p /var/www/html/assets/debian13
cd /var/www/html/assets/debian13
wget http://ftp.debian.org/debian/dists/trixie/main/installer-amd64/current/images/netboot/debian-installer/amd64/initrd.gz
wget http://ftp.debian.org/debian/dists/trixie/main/installer-amd64/current/images/netboot/debian-installer/amd64/linux
3. Configure TFTP
Edit /etc/default/tftpd-hpa:
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftp"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="--secure"
Copy the Netboot.xyz binaries:
mkdir -p /srv/tftp/ipxe
cp /var/www/html/ipxe/netboot.xyz-undionly.kpxe /srv/tftp/ipxe/
cp /var/www/html/ipxe/netboot.xyz-snp.efi /srv/tftp/ipxe/
cp /var/www/html/ipxe/netboot.xyz.efi /srv/tftp/ipxe/
chown -R tftp:tftp /srv/tftp/ipxe
service tftpd-hpa restart
4. Configure DNSMasq on the DHCP server
On your router (or DHCP server), add the following to the DNSMasq configuration (e.g., /jffs/configs/dnsmasq.conf.add on Asus Merlin):
# BIOS Clients
dhcp-boot=tag:!ipxe,ipxe/netboot.xyz-undionly.kpxe,,192.168.50.167
# UEFI x86-64 clients
dhcp-match=set:efi-x86_64,option:client-arch,7
dhcp-boot=tag:efi-x86_64,ipxe/netboot.xyz-snp.efi,,192.168.50.167
# Tag iPXE clients (option 175 present)
dhcp-match=set:ipxe,175
# All other iPXE clients get the netboot.xyz menu
dhcp-boot=tag:ipxe,http://192.168.50.167/menu.ipxe
Restart DNSMasq.
5. Create a ZFS ZVOL
zpool create tank /dev/disk/by-id/${DISK_ID}
zfs create -V 32G tank/debian-disk-12700k
6. Configure iSCSI target
Use targetcli to create the iSCSI target and backstore:
cd /backstores/block
create debian-disk-12700k /dev/zvol/tank/debian-disk-12700k
cd /iscsi
create iqn.2026-05.xyz.716697.pve-vt:tank-debian-disk-12700k
cd iqn.2026-05.xyz.716697.pve-vt:tank-debian-disk-12700k/tpg1
set attribute demo_mode_write_protect=1
set attribute generate_node_acls=0
cd acls
create iqn.2026-05.xyz.716697.pve-vt:12700k
cd iqn.2026-05.xyz.716697.pve-vt:12700k
set attribute authentication=1
set auth userid=myuser
set auth password=mypassword
set auth mutual_userid=targetuser
set auth mutual_password=targetpassword
cd ../../luns
create /backstores/block/debian-disk-12700k
cd /
saveconfig
7. Install Debian via the network
Boot the client machine from the network. Select the custom menu entry. The installer will fail to find a local disk — select "Configure iSCSI volumes." Switch to TTY 2 (Super+F2), edit /etc/iscsi/initiatorname.iscsi to match the initiator IQN you configured, kill the iscsid processes, and restart iscsid. Switch back to TTY 1 (Super+F1), log into the iSCSI target with the credentials you set, and proceed with the standard Debian installation. The iSCSI disk will appear as a block device.
Tradeoffs
- Performance: Installing Debian on a network drive is noticeably slower than a native install. Once booted, performance depends on network speed and RAM — the author notes that with enough RAM, the OS runs smoothly after boot.
- Complexity: The setup requires multiple services (Apache, TFTP, DNSMasq, iSCSI, ZFS) and careful configuration of authentication and ACLs.
- Resilience: ZFS snapshots provide easy rollback, and the OS is independent of local disk failures. However, the network boot server becomes a single point of failure.
- Use case: Best suited for server environments or development machines where local disk is reserved for other purposes (e.g., gaming, model storage).
Bottom line
Diskless Linux boot with ZFS, iSCSI, and PXE is a viable alternative to local disk installations for specific use cases. It requires a dedicated server and careful setup, but offers benefits in terms of manageability, snapshot-based recovery, and the ability to keep local disks free for other workloads. For most desktop users, the performance penalty and complexity outweigh the advantages.