{% extends "layout.html" %} {% from "_partials/page_description.html" import page_description %} {% block title %}Settings - pixie{% endblock %} {% block subnav %} {% endblock %} {% block content %} {{ page_description('sliders', 'Operator-editable knobs that pixie persists across restarts, alongside the environment variables the deploy consumes at startup. UI edits below win over env-var defaults, so tuning a knob live in the browser does not need a redeploy. Env-var defaults are documented in the Deployment card at the bottom.') }} {% if flash_error %}
{{ flash_error }}
{% endif %}
Display timezone + strftime pattern for every operator-facing timestamp
IANA timezone name. Blank falls back to {{ display_tz.env }} then {{ display_tz.default }}. Currently effective: {{ display_tz.effective }}. {% if display_tz.updated_at %}
Last updated: {{ display_tz.updated_at | fmt_ts }}. {% endif %}
Python strftime pattern (e.g. %Y-%m-%d %H:%M:%S %Z, %d %b %Y %H:%M). Blank falls back to {{ datetime_format.env }} then the default. Currently effective: {{ datetime_format.effective }}. {% if datetime_format.updated_at %}
Last updated: {{ datetime_format.updated_at | fmt_ts }}. {% endif %}
Blank fields CLEAR the override. Env / default takes over.
Live-env per-deploy kernel-cmdline workarounds for hardware quirks
Tokens appended verbatim to the pixie-live-env kernel cmdline (after pixie.mac= / bty.mac=, so last-token-wins on any conflict). Whitespace-separated; single line. Blank falls back to {{ live_env_extra_cmdline.env }} then no append. Currently effective: {% if live_env_extra_cmdline.effective %} {{ live_env_extra_cmdline.effective }} {% else %} (none) {% endif %}. Known-good values per hardware in docs/hardware-quirks.md. {% if live_env_extra_cmdline.updated_at %}
Last updated: {{ live_env_extra_cmdline.updated_at | fmt_ts }}. {% endif %}
Takes effect on the NEXT GET /pxe/<mac>; a target already mid-boot must be power-cycled.
Deployment environment variables consumed at startup + DHCP handoff

Environment variables the pixie process reads at startup. The compose file bundled by pixie deploy sets the important ones from envvars; anything not set falls back to the default in the table. Changes here require a container restart (they are read once at startup), unlike the UI knobs above which are live.

{% for row in deployment_envvars %} {% endfor %}
Variable Default Purpose
{{ row.name }} {% if row.default %}{{ row.default }} {% else %}(none){% endif %} {{ row.purpose }}

Pointing DHCP at pixie

Pixie chainloads iPXE via TFTP: the DHCP server tells the target's PXE firmware where to fetch the iPXE bootloader, and iPXE then chains to pixie's HTTP endpoint. The two options below cover the common firmware split:

Legacy BIOS / PXE
Target boots via PXE ROM. DHCP hands out an iPXE binary that pixie serves over TFTP; iPXE re-DHCPs and pixie sees the second request come in from an iPXE user-class + chains to /pxe-bootstrap.ipxe.
# dnsmasq
dhcp-boot=tag:!ipxe,undionly.kpxe,{{ deployment.host }},{{ deployment.host }}
dhcp-userclass=set:ipxe,iPXE
dhcp-boot=tag:ipxe,http://{{ deployment.host }}:{{ deployment.port }}/pxe-bootstrap.ipxe
UEFI
Target boots via UEFI PXE. Same shape but the DHCP hand-off must serve an EFI iPXE binary. Same iPXE user-class re-DHCP dance lands on /pxe-bootstrap.ipxe.
# dnsmasq
dhcp-boot=tag:!ipxe,ipxe.efi,{{ deployment.host }},{{ deployment.host }}
dhcp-userclass=set:ipxe,iPXE
dhcp-boot=tag:ipxe,http://{{ deployment.host }}:{{ deployment.port }}/pxe-bootstrap.ipxe
TFTP listen: {% if deployment.tftp_enabled %} {{ deployment.tftp_bind }}:{{ deployment.tftp_port }}/udp (root {{ deployment.tftp_root }}) {% else %} disabled (set PIXIE_TFTP_ENABLED=1 to bind udp/69) {% endif %}
Bootstrap URL: http://{{ deployment.host }}:{{ deployment.port }}/pxe-bootstrap.ipxe
NBD listen: {{ deployment.nbd_bind }} from port {{ deployment.nbd_port_base }} upward (one export per bound nbdboot image)
{% endblock %}