- Add build-proxmox-iso.sh: remaster Ubuntu ISO with autoinstall config, offline packages, playbook, webapp, and boot files for zero-touch Proxmox VM deployment - Add boot-files/ directory for WinPE boot files (wimboot, boot.wim, BCD, ipxe.efi, etc.) sourced from WestJeff playbook - Update build-usb.sh and test-vm.sh to bundle boot-files automatically - Add usb_root variable to playbook, fix all file copy paths to use it - Unify Apache VirtualHost config (merge default site + webapp proxy) - Add CSRF token protection to all webapp POST forms and API endpoints - Update README with Proxmox deployment instructions Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
260 lines
12 KiB
Markdown
260 lines
12 KiB
Markdown
# GE Aerospace PXE Boot Server
|
|
|
|
Automated, air-gapped PXE boot server for deploying GE Aerospace Windows images. Built on Ubuntu 24.04 Server with zero-touch provisioning via autoinstall and Ansible.
|
|
|
|
## Overview
|
|
|
|
This project provides a complete, repeatable build process for a PXE boot server that serves Windows PE images to client machines on an isolated network. Everything runs offline after initial setup — no internet required on the target server.
|
|
|
|
### Boot Chain
|
|
|
|
```
|
|
Client PXE boot (UEFI Secure Boot)
|
|
-> iPXE (TFTP, Broadcom-signed for Secure Boot)
|
|
-> iPXE boot menu (HTTP, port 4433)
|
|
-> User selects boot option:
|
|
├── Windows PE -> wimboot -> boot.wim -> startnet.cmd -> Samba share -> Image deployment
|
|
├── Clonezilla -> vmlinuz/initrd -> Disk cloning/imaging
|
|
├── Blancco -> vmlinuz/initrd -> NIST 800-88 drive erasure
|
|
└── Memtest86+ -> Memory diagnostics
|
|
```
|
|
|
|
### Services
|
|
|
|
| Service | Port | Purpose |
|
|
|-------------|-----------|------------------------------------------|
|
|
| dnsmasq | 67/udp | DHCP (10.9.100.10-100, 12h lease) |
|
|
| dnsmasq | 69/udp | TFTP (serves ipxe.efi) |
|
|
| Apache | 80/tcp | HTTP (wimboot, WinPE boot files, proxy) |
|
|
| Apache | 4433/tcp | iPXE boot script (GetPxeScript.aspx) |
|
|
| Samba | 445/tcp | Deployment content + Clonezilla + Blancco|
|
|
| Flask Webapp| 9009/tcp | Web management interface |
|
|
|
|
### Network
|
|
|
|
- **PXE server IP:** `10.9.100.1/24`
|
|
- **DHCP range:** `10.9.100.10` - `10.9.100.100`
|
|
- **Firewall:** UFW deny-by-default, only service ports open
|
|
|
|
## Quick Start
|
|
|
|
### Prerequisites
|
|
|
|
**On your workstation (internet-connected):**
|
|
- Ubuntu 24.04 (or Linux Mint / similar) for downloading packages
|
|
- Ubuntu Server 24.04 ISO
|
|
- GE Aerospace Media Creator LITE (for WinPE images)
|
|
- USB drive >= 8 GB (32+ GB if bundling WinPE images)
|
|
|
|
**GE Access Packages (MyAccess portal):**
|
|
- EPM Rufus Exception Request
|
|
- EPM DT Functions
|
|
- DLP - Encrypted Removable (USB) Long Term Access
|
|
|
|
### Step 1: Download Offline Packages
|
|
|
|
```bash
|
|
./download-packages.sh
|
|
```
|
|
|
|
Downloads all .deb packages and Python wheels for offline installation (~140 MB of debs, ~20 MB of wheels).
|
|
|
|
### Step 2: Prepare Boot Tools (optional)
|
|
|
|
```bash
|
|
./prepare-boot-tools.sh /path/to/blancco.iso /path/to/clonezilla.zip /path/to/memtest.bin
|
|
```
|
|
|
|
Extracts and configures boot tool files (Blancco, Clonezilla, Memtest86+). Automatically patches Blancco's config.img to auto-save erasure reports to the PXE server's Samba share.
|
|
|
|
### Step 3: Build the USB
|
|
|
|
```bash
|
|
sudo ./build-usb.sh /dev/sdX /path/to/ubuntu-24.04-live-server-amd64.iso
|
|
```
|
|
|
|
Creates a bootable USB with two partitions:
|
|
- **Partition 1:** Ubuntu Server installer
|
|
- **Partition 2:** CIDATA (autoinstall config, offline .debs, pip wheels, Ansible playbook, webapp, boot tools)
|
|
|
|
### Step 4: Install on Target Server
|
|
|
|
1. Insert USB into the target machine
|
|
2. Press F12 and boot from USB
|
|
3. Ubuntu auto-installs with no interaction
|
|
4. After reboot, the first-boot script:
|
|
- Installs all offline .deb packages
|
|
- Runs the Ansible playbook (configures dnsmasq, Apache, Samba, UFW, webapp)
|
|
- Configures static IP `10.9.100.1/24`
|
|
5. Move the server's wired NIC to the isolated PXE switch
|
|
|
|
### Step 5: Access the Web Interface
|
|
|
|
Open `http://10.9.100.1:9009` from any machine on the isolated network.
|
|
|
|
## Web Management Interface
|
|
|
|
The Flask webapp (port 9009) provides a browser-based management UI:
|
|
|
|
- **Dashboard** — Service status overview, disk usage, connected DHCP clients
|
|
- **Image Import** — Import WinPE deployment images from USB drives
|
|
- **Unattend Editor** — Edit Windows unattend.xml files per image type (XML syntax highlighting)
|
|
- **startnet.cmd Editor** — Modify the startnet.cmd inside boot.wim without Windows (uses wimtools)
|
|
- **Clonezilla Backups** — Upload, download, and manage disk backup images
|
|
- **Blancco Reports** — View, download, and manage drive erasure reports (auto-collected via Samba)
|
|
- **Audit Log** — Activity history for all write operations (imports, edits, deletes)
|
|
|
|
### Image Types Supported
|
|
|
|
| Image Type | Domain | Description |
|
|
|----------------------|-----------------|-------------------------|
|
|
| gea-standard | geaerospace.com | Standard desktop |
|
|
| gea-engineer | geaerospace.com | Engineering desktop |
|
|
| gea-shopfloor | geaerospace.com | Shop floor kiosk |
|
|
| ge-standard | ge.com | Standard desktop |
|
|
| ge-engineer | ge.com | Engineering desktop |
|
|
| ge-shopfloor-lockdown| ge.com | Shop floor (locked) |
|
|
| ge-shopfloor-mce | ge.com | Shop floor (MCE) |
|
|
|
|
## Project Structure
|
|
|
|
```
|
|
pxe-server/
|
|
├── autoinstall/
|
|
│ ├── user-data # Cloud-init autoinstall config + first-boot script
|
|
│ └── meta-data # Cloud-init metadata (required, empty)
|
|
├── playbook/
|
|
│ ├── pxe_server_setup.yml # Ansible playbook: all server configuration
|
|
│ └── inventory.ini # Ansible inventory
|
|
├── webapp/
|
|
│ ├── app.py # Flask application (~900 lines)
|
|
│ ├── requirements.txt # Python deps (flask, lxml)
|
|
│ ├── static/
|
|
│ │ ├── ge-aerospace-logo.svg # GE Aerospace branding
|
|
│ │ ├── favicon.ico # Browser favicon
|
|
│ │ ├── app.js # Frontend JavaScript
|
|
│ │ ├── bootstrap.min.css # Bootstrap 5 (bundled offline)
|
|
│ │ ├── bootstrap.bundle.min.js
|
|
│ │ ├── bootstrap-icons.min.css
|
|
│ │ └── fonts/ # Icon fonts (woff/woff2)
|
|
│ └── templates/
|
|
│ ├── base.html # Layout with GE branding and sidebar nav
|
|
│ ├── dashboard.html # Service status and overview
|
|
│ ├── import.html # USB image import wizard
|
|
│ ├── unattend_editor.html # XML editor for unattend files
|
|
│ ├── startnet_editor.html # startnet.cmd WIM editor
|
|
│ ├── backups.html # Clonezilla backup management
|
|
│ ├── reports.html # Blancco erasure reports
|
|
│ └── audit.html # Activity audit log
|
|
├── unattend/
|
|
│ └── FlatUnattendW10.xml # Windows unattend.xml template
|
|
├── boot-tools/ # Extracted boot tool files (gitignored)
|
|
│ ├── blancco/ # Blancco Drive Eraser (Arch Linux-based)
|
|
│ ├── clonezilla/ # Clonezilla Live
|
|
│ └── memtest/ # Memtest86+
|
|
├── offline-packages/ # .deb files (gitignored, built by download-packages.sh)
|
|
├── pip-wheels/ # Python wheels (gitignored, built by download-packages.sh)
|
|
├── download-packages.sh # Downloads offline .debs + pip wheels
|
|
├── build-usb.sh # Builds the installer USB (2-partition)
|
|
├── prepare-boot-tools.sh # Extracts and patches boot tool files
|
|
├── build-proxmox-iso.sh # Builds self-contained Proxmox installer ISO
|
|
├── test-vm.sh # KVM test environment for validation
|
|
├── SETUP.md # Detailed setup guide
|
|
└── setup-guide-original.txt # Original manual setup notes (reference)
|
|
```
|
|
|
|
## Testing with KVM
|
|
|
|
A test VM script is included for validating the full provisioning pipeline without dedicated hardware:
|
|
|
|
```bash
|
|
# Download Ubuntu Server ISO
|
|
wget -O ~/Downloads/ubuntu-24.04.3-live-server-amd64.iso \
|
|
https://releases.ubuntu.com/noble/ubuntu-24.04.3-live-server-amd64.iso
|
|
|
|
# Launch test VM (requires libvirt/KVM)
|
|
sudo ./test-vm.sh ~/Downloads/ubuntu-24.04.3-live-server-amd64.iso
|
|
|
|
# Watch install progress
|
|
sudo virsh console pxe-test
|
|
|
|
# Clean up when done
|
|
sudo ./test-vm.sh --destroy
|
|
```
|
|
|
|
The test VM creates an isolated libvirt network (10.9.100.0/24) and runs the full autoinstall + Ansible provisioning.
|
|
|
|
## Proxmox Deployment
|
|
|
|
A single ISO can be built for deploying the PXE server in a Proxmox VM:
|
|
|
|
### Build the ISO
|
|
|
|
```bash
|
|
# Prerequisites (on build workstation)
|
|
sudo apt install xorriso p7zip-full
|
|
|
|
# Build the installer ISO
|
|
./build-proxmox-iso.sh /path/to/ubuntu-24.04-live-server-amd64.iso
|
|
```
|
|
|
|
This creates `pxe-server-proxmox.iso` containing the Ubuntu installer, autoinstall config, all offline packages, the Ansible playbook, webapp, and boot tools.
|
|
|
|
### Deploy on Proxmox
|
|
|
|
1. Upload `pxe-server-proxmox.iso` to Proxmox storage (Datacenter -> Storage -> ISO Images)
|
|
2. Create a new VM:
|
|
- **OS:** Linux 6.x kernel
|
|
- **BIOS:** OVMF (UEFI) or SeaBIOS
|
|
- **Memory:** 4096 MB
|
|
- **CPU:** 2+ cores
|
|
- **Disk:** 40+ GB (VirtIO SCSI)
|
|
- **Network:** Bridge connected to your isolated PXE network
|
|
3. Attach the ISO as CD-ROM and start the VM
|
|
4. Ubuntu auto-installs with zero interaction (~10-15 minutes)
|
|
5. After reboot, first-boot configures all PXE services automatically
|
|
6. Access the web interface at `http://10.9.100.1:9009`
|
|
|
|
### Import WinPE Images
|
|
|
|
After the server is running, import deployment images via the web interface at `http://10.9.100.1:9009/import` or by mounting a USB drive with WinPE content.
|
|
|
|
## Samba Shares
|
|
|
|
| Share | Path | Purpose |
|
|
|-----------------|---------------------------|--------------------------------|
|
|
| winpeapps | /srv/samba/winpeapps | WinPE deployment images |
|
|
| clonezilla | /srv/samba/clonezilla | Clonezilla disk backup images |
|
|
| blancco-reports | /srv/samba/blancco-reports| Blancco erasure reports (auto) |
|
|
|
|
All shares use guest access (no authentication) for ease of use on the isolated network.
|
|
|
|
## Blancco Drive Erasure
|
|
|
|
Blancco Drive Eraser is configured to automatically save XML erasure reports to the PXE server's Samba share (`blancco-reports`). The `prepare-boot-tools.sh` script patches Blancco's `config.img` to set:
|
|
- Network share hostname: `10.9.100.1`
|
|
- Share path: `blancco-reports`
|
|
- Auto-backup: enabled
|
|
- Erasure standard: NIST 800-88 Purge
|
|
|
|
Reports are viewable and downloadable from the web interface at `http://10.9.100.1:9009/reports`.
|
|
|
|
## Notes
|
|
|
|
- Run `download-packages.sh` before building USB — it downloads all offline `.deb` packages including wimtools (needed for startnet.cmd editing)
|
|
- The webapp uses session-based CSRF tokens on all POST forms and API endpoints
|
|
|
|
## Commit History
|
|
|
|
| Commit | Description |
|
|
|---------|--------------------------------------------------------------------|
|
|
| 5791bd1 | Initial project setup: automated PXE server provisioning |
|
|
| cee4ecd | Add web management UI, offline packages, WinPE consolidation |
|
|
| f614596 | Fix unattend.xml path to match actual image structure |
|
|
| e7313c2 | Add multi-boot PXE menu, Clonezilla backups, GE Aerospace branding|
|
|
| 89b5834 | Add wimtools and startnet.cmd editor for boot.wim modification |
|
|
| 05dbb7e | Add Blancco erasure reports Samba share and webapp viewer |
|
|
| ef75839 | Auto-patch Blancco config.img for network report storage |
|
|
| 92c9b0f | Fix review findings: offline assets, security, audit logging |
|
|
| 725c8f4 | Change webapp to port 9009, add test VM script |
|