Knowledge Base Article

How To Deploy a PXE Imaging Server at a New Site

From an empty server to imaging PCs: build the installer USB on Windows, install the server, load the images

Overview

The PXE imaging server images Shop Floor, Standard and Engineer PCs over an isolated imaging network, and wipes PCs with Blancco. A new site builds one from scratch: a Windows PC builds the installer USB, the server installs itself from it, and the images are loaded from Media Creator Lite. No Linux knowledge and no existing PXE server are needed.

Prerequisites:

  • Server: UEFI firmware, a 500 GB+ disk, at least one wired NIC (two if it also joins the GE network)
  • An unmanaged switch for the isolated imaging network (never connected to the GE network)
  • A Windows 10/11 PC with local administrator rights and 25 GB free disk
  • A USB stick of 32 GB (everything on it is erased)
  • The pxe-usb build folder from the DT team (about 10 GB)
  • A PC with Media Creator Lite, for the images (Part 3)

Objectives:

  • Build and verify the installer USB on Windows
  • Install the PXE server; the imaging port is picked automatically
  • Load the Shop Floor, Standard and Engineer images and image a test PC
Build folder: The pxe-usb folder holds everything the server needs offline: the Ubuntu installer, packages, the setup, the web interface, boot files, Blancco and Clonezilla. Get the current copy from: <build folder location>. Always use a fresh copy; never edit files in it.

Part 1 - Build the Installer USB

Step 1

Copy the build folder to the Windows PC

Copy the whole pxe-usb folder to a local disk, for example C:\pxe-usb. If the site has settings (admin subnets, Clonezilla password), add site-vars.yml now: see Site Settings.

Why local: The build runs as administrator, and an administrator window cannot see network drives mapped in your normal session. A local copy is also faster and does not fail half-way if the network drops.
Step 2

Run the USB builder

  1. Plug in the USB stick.
  2. Start menu, type PowerShell, right-click Windows PowerShell, Run as administrator.
  3. Run:
cd C:\pxe-usb
powershell -ExecutionPolicy Bypass -File .\scripts\Build-PxeUsb.ps1 -Interactive
  1. It lists the USB disks. Type the number of your stick and press Enter.
  2. It checks the build folder, shows the disk again and asks you to type the disk number once more to confirm.

It then erases the stick, creates one FAT32 partition labelled CIDATA, copies the installer, the payload and your site-vars.yml (if there is one), and reads every file back to verify it. It ends with USB build complete and verified and waits for Enter. Expect 10-20 minutes.

Erases the disk: Everything on the selected disk is destroyed. The script refuses disks that are not on the USB bus and the Windows system disk, but check the model and size it shows before typing the number.
Step 3

Eject the stick

Use Safely Remove Hardware before unplugging it.


Part 2 - Install the Server

Cabling rule: During the install plug in ONLY the imaging switch. Leave the GE network cable unplugged. The first boot picks the imaging port by its link, and refuses if it cannot tell which port that is.
Step 1

Boot the USB stick

  1. Connect one server port to the imaging switch. Nothing else.
  2. Insert the stick, power on and open the one-time boot menu (F12 on Dell).
  3. Choose the USB stick under UEFI boot.

Ubuntu installs itself with no questions and reboots (about 10 minutes).

Step 2

Let the first boot finish

The first boot picks the imaging port, checks it is isolated (no GE switch, no 802.1X, no other DHCP server), gives it 172.16.9.1 and sets up every service. This takes 15-30 minutes. It is done when the console shows a normal login prompt without a red banner.

Leave the stick in until the first boot has finished: setup reads its files from it. Remove it afterwards.
Step 3

Connect the GE network (optional)

Plug the GE cable into any other wired port. It gets an address by DHCP; SSH and the web interface then work from GE too. The server never serves DHCP or PXE on that port.

Step 4

Open the web interface

From a PC on the imaging switch: http://172.16.9.1:9009 (from GE: http://<server GE address>:9009). The Overview page should show every service green.


Part 3 - Load the Images

The images come from Media Creator Lite (MCL). Each run of MCL caches one operating system; upload and import it, then repeat for the next image. Shop Floor uses Windows LTSC; Standard and Engineer use Windows Pro.

Step 1

Build the MCL cache

On the MCL PC, run Media Creator Lite for the image you are loading and let it finish completely (it writes a -Production.tag file when done).

Step 2

Upload it to the server

  1. Connect the MCL PC to the imaging switch (it gets a 172.16.9.x address).
  2. Copy scripts\Upload-Image.ps1 from the build folder to it and run:
powershell -ExecutionPolicy Bypass -File .\Upload-Image.ps1

It checks the MCL cache first (finished, consistent, every file matching MCL's own hashes), copies it to the server and has the server hash every file; files that arrived wrong are sent again. It ends with Upload complete: all N file(s) verified on the server. Add -IncludeDrivers to also send the hardware drivers MCL downloaded.

Step 3

Import it

  1. In the web interface open Images > All images and import.
  2. Under From the network upload share the upload shows as verified, with the operating system MCL cached.
  3. Choose the image it is for (only the matching images are offered) and import.

Repeat Steps 1-3 for each image type.


Part 4 - Site Content

The build folder carries no site content. Add these in the web interface; each one can be replaced later the same way.

Step 1

Enrollment package (Shop Floor)

Shop Floor PCs enroll with a provisioning package. Open Tools > Enrollment packages, click Upload SFLD package and upload the current GCCH_Prod_SFLD_v<version>.ppkg. The package you upload becomes the active one (shown on that page); upload a newer version the same way when one is released.

Step 2

Engineering Layer (Engineer)

Engineer PCs install the Engineering Layer at first logon. Without it they still image, but with no engineering applications. Open Images > Engineer, tab Engineering Layer, and upload one of:

  • the whole payload as a .zip, with the folders engineering_layer\ (holding Engineering_Install_v<version>.exe) and prereqs\ (VC++ and .NET 3.5) at its top, or inside one extra_engineering\ folder. Use this the first time.
  • only a newer Engineering_Install_v<version>.exe. It replaces the installer and keeps the prerequisites.

The page shows the installer version in use and the status Ready once both parts are present. The two previous uploads are kept under Previous versions, with a Restore button. The Engineer image must be imported (Part 3) first.

Step 3

Blancco site settings

Open Updates > Blancco releases and fill in Site settings:

  • Business location: your site, as it should appear on every erasure report.
  • Wi-Fi network (SSID) and Wi-Fi password: the internet-only Wi-Fi Blancco joins to license each erasure in the GE Blancco cloud. Usually INTERNETACCESS; the password differs between sites, so get yours from the site network team.

Click Save. The settings go into the active Blancco release at once and into every release staged later.

Step 4

Shop Floor apps (optional)

A Shop Floor PC gets the provisioning package and the ShopFloor auto-logon and lockdown, and nothing else. To install your own applications on it, see Adding Shop Floor Apps.


Part 5 - Image a Test PC

  1. Connect a test PC to the imaging switch and PXE boot it (F12, network boot).
  2. Pick the image in the boot menu and follow the prompts.
  3. Follow it on Operate > Imaging floor in the web interface.
Deployment Complete The server images PCs on the isolated switch at 172.16.9.1. Keep the USB stick: it rebuilds the server the same way.

Site Settings

Site settings live in one small text file, site-vars.yml, in the build folder. The USB builder copies it onto the stick and the server reads it while it installs. Without the file the defaults are used: fine for a test, but every production site should set at least site_name and clonezilla_smb_password.

Step 1

Create the file

  1. In Explorer turn on View > Show > File name extensions (so the file does not end up named site-vars.yml.txt).
  2. In C:\pxe-usb, copy site-vars.example.yml and rename the copy to site-vars.yml.
  3. Right-click it, Open with > Notepad, change the values (see the table below), save.
Step 2

Follow the format

  • One setting per line: name: value, with a space after the colon.
  • Put text in double quotes: site_name: "Example Site".
  • Lists go in square brackets: corp_admin_cidrs: ["10.12.34.0/24", "10.12.40.0/24"].
  • A line starting with # is a note and is ignored. Remove the # to turn a setting on.
  • Start every setting at the beginning of the line. No tabs.
Step 3

Build the USB

Build as in Part 1. The builder checks the NIC addresses; the server checks everything else while it installs. If a value is wrong it stops before changing anything; the console banner points at /var/log/first-boot.log, which names the setting. Fix the file on the stick (playbook\site-vars.yml) and reboot: setup runs again.

The settings

SettingWhat it doesWhen to set itExample
site_nameThe site name stamped on Blancco erasure reports and the monthly CMMC evidence packs. Not set: Unnamed site. Letters, digits, spaces and . , - ( ) & / only.Always"Example Site"
site_timezoneTime zone of the server clock, of every time in the web interface, and of the evidence-pack month boundaries.If the site is not on US Eastern time"America/Chicago"
clonezilla_smb_passwordPassword of the share Clonezilla backs up to and restores from. The boot menu carries it, so it protects the share on the imaging network only. 8-64 characters from A-Z a-z 0-9 . _ ~ -Always (the default is the same at every site)"ExSite-Clone-2026"
corp_admin_cidrsThe GE subnets allowed to reach the web interface (port 9009) and SSH. Not set: all of GE. The imaging network always has access.Recommended once the server is on the GE network["10.12.34.0/24"]
pxe_nic_mac
corp_nic_mac
Pin the imaging port and the GE port by MAC address instead of picking the imaging port at install. Then both cables may be in from the start.Only if the automatic pick is not wanted"34:c8:d6:b1:10:10"
pxe_nic_allowed_switchesA managed imaging switch sends LLDP/CDP like a GE switch, and the server would refuse to serve on it. Its name (or MAC) here marks it as the imaging switch. Comma separated.Only if the imaging switch is managed"IMG-SW-01"
pxe_dhcp_start
pxe_dhcp_end
pxe_dhcp_lease
The addresses handed to PCs being imaged. Default 172.16.9.10 to .100 (91 PCs at once), 12 hour leases.Only if more than about 90 PCs image at the same time"172.16.9.250"
Do not change: pxe_server_ip and pxe_subnet (172.16.9.1, 172.16.9.0/24). That address is built into the boot menu, WinPE and the Windows answer files.

Finding the values

Admin subnet (corp_admin_cidrs)

On each admin PC that should manage the server, run ipconfig and read the GE adapter's IPv4 address and subnet mask. Replace the last part of the address with 0 and add the suffix for the mask:

Subnet maskSuffixExample: address 10.12.34.56
255.255.255.0/2410.12.34.0/24
255.255.254.0/2310.12.34.0/23 (third number even: 34 stays, 35 becomes 34)
255.255.252.0/2210.12.32.0/22 (third number rounded down to a multiple of 4)
Locked out from GE? A wrong subnet only blocks the GE side. The web interface still works from a PC on the imaging switch at http://172.16.9.1:9009; fix the file and re-apply it (below).

MAC address (pxe_nic_mac, corp_nic_mac)

From the label on the server or the network page of its firmware setup. Write it with colons and lower case: 34:c8:d6:b1:10:10.

Time zone (site_timezone)

Common names: America/New_York, America/Chicago, America/Denver, America/Phoenix, America/Los_Angeles, Europe/London, Europe/Warsaw, Asia/Kolkata. The full list: the "TZ identifier" column of the tz database.

A complete example

# C:\pxe-usb\site-vars.yml

# Name on Blancco erasure reports and the monthly evidence packs.
site_name: "Example Site"

# Time zone of the server clock and the web interface.
site_timezone: "America/New_York"

# Password of the Clonezilla backup share (8-64 characters from
# A-Z a-z 0-9 . _ ~ -).
clonezilla_smb_password: "ExSite-Clone-2026"

# Who may reach the web interface and SSH from the GE network.
# Remove the # once you know your admin subnet(s):
# corp_admin_cidrs: ["10.12.34.0/24"]

Changing settings after the install

  1. On the USB stick, edit playbook\site-vars.yml (same format).
  2. Plug the stick into the server, log in as pxe and run the setup again:
sudo /opt/first-boot.sh

It re-applies every setting and changes only what differs. Run it when no PCs are imaging: while they are, it postpones restarting services, and a change to the network settings is refused until the floor is idle.


Adding Shop Floor Apps

A Shop Floor PC installs two app lists, both empty when the server is installed:

ListWhen it installsUse it for
preinstall.jsonAt first logon, in the same run as the provisioning package, before the PC restartsApps that must be present before the PC enrolls
postppkg.jsonOnce, after the restart that follows the provisioning package (as SYSTEM)Everything else

Both are in the pre-install folder of the enrollment share. The first list shows as a step on Operate > Imaging floor; each PC keeps its logs in C:\Logs\PreInstall\install.log and C:\Logs\PostPpkg\install.log.

Step 1

Open the share

From a PC on the imaging switch, open \\172.16.9.1\enrollment\pre-install and sign in as pxe-upload (password pxe, the account Upload-Image.ps1 uses).

Step 2

Copy the installer

Make a folder per app under installers\ and copy the installer into it, for example installers\exampleapp\ExampleApp.msi.

Step 3

Add it to a list

Open the list in Notepad and add one entry per app to Applications. Each list contains an _example entry to copy; it is ignored. Apps install in list order, and an app already detected on the PC is skipped, so a PC can be re-imaged safely.

FieldMeaningRequired
NameShown in the logYes
InstallerPath under installers\. In JSON, write every \ as \\Yes
TypeMSI (run with msiexec /i) or EXE (run directly)Yes
InstallArgsSilent-install switches, e.g. /qn /norestart for an MSIUsually
DetectionMethodRegistry (a registry key, optionally one value) or File (a file or folder exists)Recommended
DetectionPathThe registry key (HKLM:\\SOFTWARE\\...) or file path that proves the app is installedWith DetectionMethod
DetectionName
DetectionValue
Registry only: a value under the key, and the data it must haveNo
PCTypesLimit the app to these PC types, e.g. ["gea-shopfloor-standard"]. Not set: every Shop Floor PCNo
LogFileEXE only: the installer's own log, copied into the install log when it failsNo

Example

{
  "Version": "1.0",
  "Applications": [
    {
      "Name": "Example App 1.2",
      "Installer": "exampleapp\\ExampleApp.msi",
      "Type": "MSI",
      "InstallArgs": "/qn /norestart",
      "DetectionMethod": "Registry",
      "DetectionPath": "HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{00000000-0000-0000-0000-000000000000}"
    },
    {
      "Name": "Example Tool 4.0",
      "Installer": "exampletool\\setup.exe",
      "Type": "EXE",
      "InstallArgs": "/S",
      "DetectionMethod": "File",
      "DetectionPath": "C:\\Program Files\\Example Tool\\tool.exe"
    }
  ]
}
Test before the floor: A broken list or a failed install never stops imaging: it is logged and the PC carries on without that app. Image one test PC after every change and check its install log.

Reinstalling the server (sudo /opt/first-boot.sh) keeps both lists and the installers.


Script Options

Only needed for special cases. Run the script from an elevated PowerShell in C:\pxe-usb with options instead of -Interactive:

powershell -ExecutionPolicy Bypass -File .\scripts\Build-PxeUsb.ps1 -DiskNumber 1 -SiteVars .\site-vars.yml
OptionEffect
-DiskNumber NThe USB disk to erase and build. Without it the script lists USB disks.
-SiteVars FILE / -NoSiteVarsPer-site values, or the defaults.
-SkipEnrollment, -SkipBios, -SkipDrivers, -SkipBootToolsLeave that payload off the stick.
-QuickVerifyRead back by size only instead of SHA-256 (faster, weaker).

Troubleshooting

Issue: "cannot be run because it contains a #requires statement for running as Administrator"

Resolution: the PowerShell window is not elevated. Close it and open Windows PowerShell with Run as administrator (Part 1, Step 2).

Issue: "Cannot find path" for the build folder

Resolution: an administrator window cannot see network drives mapped in your normal session. Copy the pxe-usb folder to C:\pxe-usb (Part 1, Step 1) and run it from there.

Issue: The USB build stops with "does not match" or "was built for ISO"

Resolution: the build folder is incomplete or out of date. Delete the local copy and copy a fresh pxe-usb folder.

Issue: "The stick is NOT good"

Resolution: the read-back found missing or different files. Rebuild on a different USB port or stick. Never boot a stick that failed verification.

Issue: The server does not boot the stick

Resolution: the stick boots in UEFI mode only. In the firmware setup set the boot mode to UEFI (not Legacy/CSM) and pick the UEFI entry for the stick in the F12 menu.

Issue: Console banner "Could not pick the imaging port"

Symptoms: no port had a link, two ports had a link, or the port looked like the GE network.

Resolution: log in on the console as pxe and run the picker. When asked, pull the imaging switch cable out and plug it back into the same port; the port that blinked becomes the imaging port and setup runs again.

sudo pxe-pick-nic

Issue: Setup failed for another reason

Resolution: the reason is on the console banner and in the log. Setup retries at every reboot (5 attempts).

sudo less /var/log/first-boot.log

Issue: Upload-Image.ps1 reports files NOT verified

Resolution: run it again; it re-sends only the files that differ. Files that are bad in the MCL cache itself must be downloaded again by MCL (delete the cache and run MCL again).