<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/diskless-windows-desktop-using-pxe-with-a-linux-backend-nwrsuxomh" -->

---
title: Diskless Windows Desktop using PXE with a Linux backend
description: A hands-on homelab experiment setting up a diskless Windows 10 desktop that boots entirely over the network using PXE/iPXE with a Linux (Ubuntu 20.04) backend....
canonical: https://daily.dev/posts/diskless-windows-desktop-using-pxe-with-a-linux-backend-nwrsuxomh
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: Diskless Windows Desktop using PXE with a Linux backend | daily.dev
og:description: A hands-on homelab experiment setting up a diskless Windows 10 desktop that boots entirely over the network using PXE/iPXE with a Linux (Ubuntu 20.04) backend....
og:url: https://daily.dev/posts/diskless-windows-desktop-using-pxe-with-a-linux-backend-nwrsuxomh
og:image: https://api.daily.dev/og/posts/NWrSuXomH.png
og:image:alt: Diskless Windows Desktop using PXE with a Linux backend
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Diskless Windows Desktop using PXE with a Linux backend

**[apalrd's adventures](https://daily.dev/sources/apalrd)** · 16 min read · 0 upvotes · 0 comments

## Summary

A hands-on homelab experiment setting up a diskless Windows 10 desktop that boots entirely over the network using PXE/iPXE with a Linux (Ubuntu 20.04) backend. The setup chains traditional PXE to iPXE, serves boot files via TFTP and HTTP (Apache2), shares installation media via Samba, and stores the Windows C drive as an iSCSI block device image. The guide covers configuring each component step by step, including DHCP (OPNsense), tftpd-hpa, tgt for iSCSI, building iPXE with an embedded boot script, and using wimboot to load WinPE for installation. The project ultimately hits a wall when the Windows 10 installer fails to partition the iSCSI drive, and the author concludes that diskless Windows over iSCSI is impractical for home use but has legitimate use cases in corporate environments, computing labs, and server clusters — especially with Linux clients using NFS.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://www.apalrd.net/posts/2021/pxe_windows>

## Questions this post answers

### Why do I get INACCESSIBLE_BOOT_DEVICE when booting Windows from an iSCSI target via iPXE?

This error typically occurs when Windows is not configured to load iSCSI drivers at boot time. Installing Windows inside a VM and then copying the image to an iSCSI target leaves it without the correct driver stack for iSCSI boot. The recommended workaround is to install Windows directly onto the iSCSI target using WinPE (wimboot method via iPXE), so the installer sets up the correct boot environment from the start.

_Developers troubleshooting iSCSI boot issues with Windows track solutions like this on daily.dev._

### What LUN number should I use in an iPXE sanboot command when using the tgt iSCSI target on Linux?

Use LUN 1, not LUN 0. With the default tgt configuration, LUN 0 is always a Controller LUN, and LUN 1 is the actual Disk. Most iPXE examples show the LUN field as blank (implying 0), but this results in a failed boot. The correct sanboot syntax is: sanboot iscsi:<IP>:::1:<IQN>.

_Homelab builders working through iSCSI and iPXE quirks find peer-tested answers faster on daily.dev._

### How do I build iPXE with an embedded boot script for iSCSI sanboot?

Clone the iPXE repository, create a boot.ipxe script containing your dhcp and sanboot commands, then build with: make bin/undionly.kpxe EMBED=boot.ipxe. Copy the resulting undionly.kpxe to your TFTP root and set it as the boot filename in your DHCP server. This embeds the script so no HTTP server is needed for the initial boot chain.

_Network boot setups like this get discussed and refined by the homelab community on daily.dev._

## Similar posts on daily.dev

- [Diskless Linux boot using ZFS, iSCSI & PXE](https://daily.dev/posts/diskless-linux-boot-using-zfs-iscsi-pxe-ztx932ijf) · Hacker News · 1 upvotes · 0 comments
- [I ditched physical monitors for KVM-over-IP, and my server closet actually looks clean now](https://daily.dev/posts/i-ditched-physical-monitors-for-kvm-over-ip-and-my-server-closet-actually-looks-clean-now-o6gayyzup) · XDA Developers · 0 upvotes · 0 comments
- [How to create Windows boot disks on Linux without special tools](https://daily.dev/posts/how-to-create-windows-boot-disks-on-linux-without-special-tools-yqdzfgs5t) · All Things Open · 0 upvotes · 0 comments
- [Effortless Red Hat Enterprise Linux virtual machines with Libvirt and Kickstart](https://daily.dev/posts/effortless-red-hat-enterprise-linux-virtual-machines-with-libvirt-and-kickstart-pm0n9lhbz) · Red Hat Developer · 0 upvotes · 0 comments

---

Tags: [#homelab](https://daily.dev/tags/homelab)

[View this post on daily.dev](https://daily.dev/posts/diskless-windows-desktop-using-pxe-with-a-linux-backend-nwrsuxomh)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"Diskless Windows Desktop using PXE with a Linux backend","url":"https://daily.dev/posts/diskless-windows-desktop-using-pxe-with-a-linux-backend-nwrsuxomh","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/diskless-windows-desktop-using-pxe-with-a-linux-backend-nwrsuxomh"},"datePublished":"2026-08-11T08:55:34.164Z","dateModified":"2026-08-11T09:25:46.051Z","description":"A hands-on homelab experiment setting up a diskless Windows 10 desktop that boots entirely over the network using PXE/iPXE with a Linux (Ubuntu 20.04) backend....","image":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/30376a5e063fd44a5cc004c56a7d6dfe?_a=AQAEuop","thumbnailUrl":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/30376a5e063fd44a5cc004c56a7d6dfe?_a=AQAEuop","isAccessibleForFree":true,"articleSection":"apalrd's adventures","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"apalrd's adventures","logo":"https://media.daily.dev/image/upload/s--4zkx8dRj--/f_auto,q_auto/v1786438309/logos/apalrd?_a=BAMAMicg0","url":"https://daily.dev/sources/apalrd"},"commentCount":0,"discussionUrl":"https://daily.dev/posts/diskless-windows-desktop-using-pxe-with-a-linux-backend-nwrsuxomh","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":0},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"keywords":"homelab","timeRequired":"PT16M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"apalrd's adventures","item":"https://daily.dev/sources/apalrd"},{"@type":"ListItem","position":3,"name":"Diskless Windows Desktop using PXE with a Linux backend"}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/diskless-windows-desktop-using-pxe-with-a-linux-backend-nwrsuxomh#faq","mainEntity":[{"@type":"Question","name":"Why do I get INACCESSIBLE_BOOT_DEVICE when booting Windows from an iSCSI target via iPXE?","acceptedAnswer":{"@type":"Answer","text":"This error typically occurs when Windows is not configured to load iSCSI drivers at boot time. Installing Windows inside a VM and then copying the image to an iSCSI target leaves it without the correct driver stack for iSCSI boot. The recommended workaround is to install Windows directly onto the iSCSI target using WinPE (wimboot method via iPXE), so the installer sets up the correct boot environment from the start. Developers troubleshooting iSCSI boot issues with Windows track solutions like this on daily.dev."}},{"@type":"Question","name":"What LUN number should I use in an iPXE sanboot command when using the tgt iSCSI target on Linux?","acceptedAnswer":{"@type":"Answer","text":"Use LUN 1, not LUN 0. With the default tgt configuration, LUN 0 is always a Controller LUN, and LUN 1 is the actual Disk. Most iPXE examples show the LUN field as blank (implying 0), but this results in a failed boot. The correct sanboot syntax is: sanboot iscsi:<IP>:::1:<IQN>. Homelab builders working through iSCSI and iPXE quirks find peer-tested answers faster on daily.dev."}},{"@type":"Question","name":"How do I build iPXE with an embedded boot script for iSCSI sanboot?","acceptedAnswer":{"@type":"Answer","text":"Clone the iPXE repository, create a boot.ipxe script containing your dhcp and sanboot commands, then build with: make bin/undionly.kpxe EMBED=boot.ipxe. Copy the resulting undionly.kpxe to your TFTP root and set it as the boot filename in your DHCP server. This embeds the script so no HTTP server is needed for the initial boot chain. Network boot setups like this get discussed and refined by the homelab community on daily.dev."}}]}
```

