Install menu and Advanced Install wizard
Every dialog a container script shows before it creates the container, in order, with what each one sets.
A container script calls start, which on a host runs install_script
(ui/menu.func).
That function runs the host checks, shows the install menu and, for Advanced
Install, the 32-step wizard advanced_settings
(ui/advanced.func).
ui/build-ui.func
loads these parts; the same dialogs run on Proxmox VE and on Incus.
Before the menu
install_script runs these in order. Each one either passes silently or stops
the run.
| Check | What it does |
|---|---|
shell_check | Requires Bash, otherwise exit 103 |
root_check | Requires root and refuses sudo, otherwise exit 104 |
pve_check | Requires a supported host and a working /etc/pve |
ensure_whiptail | Installs whiptail when it is missing |
arch_check | amd64 or arm64 only; on arm64 follows the script's var_arm64 |
arm64_notice | On arm64 shows the ARM64 SUPPORT message box |
ssh_check | Warns when connected over SSH from another subnet |
maxkeys_check | Offers to raise the kernel key limits when they are nearly used up |
storage_content_check | Requires a storage for templates and one for container disks; offers to enable the content on an existing storage |
diagnostics_check | On the first run asks whether to send diagnostics |
The DIAGNOSTICS dialog asks Send Diagnostics of LXC Installation? once and
stores the answer as DIAGNOSTICS=yes or DIAGNOSTICS=no in the file
diagnostics in the state directory (/usr/local/community-scripts). Later
runs read the file and do not ask.
Scripts that support two operating systems, such as ct/adguard.sh, ask
Choose the container OS in plain text before all of this, with a 10 second
timeout that picks the first entry. Setting var_os skips the question.
The install menu
Title Community-Scripts Options, buttons Select and Exit Script.
| Entry | mode= | What happens |
|---|---|---|
| Default Install | default | Uses the script's defaults and any var_* from the command line, prints the summary and continues. |
| Advanced Install | advanced | Runs the wizard below. |
| User Defaults | mydefaults | Loads default.vars. Creates it on first use. |
| App Defaults for the app | appdefaults | Loads defaults/<app>.vars. Only listed when that file exists. |
| Settings | settings | Opens the settings menu and returns here. |
Setting mode on the command line picks the entry without showing the menu.
The accepted spellings are in the
configuration reference. What each
entry loads and which value wins is in
Defaults and install modes.
After Default Install, Advanced Install and User Defaults the storage for the
template and for the container is settled against default.vars; after App
Defaults against the app's file. With one suitable storage it is taken
silently, with several the Storage Pools dialog asks.
Settings
Title Community-Scripts SETTINGS Menu.
| Entry | What it does |
|---|---|
| Manage API-Diagnostic Setting | Shows the current diagnostics choice and offers to switch it |
| Edit Default.vars | Opens default.vars in nano |
| Configure dev mode | Opens the dev mode picker |
| Edit App.vars for the app | Opens defaults/<app>.vars in nano. Only listed when the file exists. |
| Back to Main Menu | Returns to the install menu |
Advanced Install, step by step
The wizard shows Step N/32 in the top line. Next accepts a step, Back
returns to the previous one, and Exit on step 1 ends the script. In the
yes/no steps, Yes and No both move forward; Esc goes back. Nothing is applied
until the last step is confirmed.
Fields that show a value start from the var_* the script or the command line
set. Steps 4 and 11 to 15 start empty or from the app name regardless of
var_hostname, var_mtu, var_searchdomain, var_ns, var_mac and
var_vlan, and an empty answer there means "not set".
| Step | Dialog title | Sets | Starts at | Accepts |
|---|---|---|---|---|
| 1 | CONTAINER TYPE | Unprivileged or privileged | var_unprivileged, else unprivileged. A script that needs privileged labels that entry Privileged (app default). | one of the two |
| 2 | ROOT PASSWORD, then PASSWORD VERIFICATION | Root password | blank | Blank for automatic login. Otherwise no spaces and at least 5 characters after leading - are removed; typed twice. |
| 3 | CONTAINER ID (on Incus CONTAINER NAME) | Container ID | var_ctid if free, else the next free ID | On Proxmox VE a number from 100 up without leading zero. An ID in use opens ID Already In Use and offers the next free one. |
| 4 | HOSTNAME | Hostname or FQDN | app name in lower case | Lower-cased, spaces removed. Labels of letters, digits and hyphens, max 63 each, 253 total. |
| 5 | DISK SIZE | Root disk in GB | var_disk | positive whole number |
| 6 | CPU CORES | CPU cores | var_cpu | positive whole number |
| 7 | RAM SIZE | Memory in MiB | var_ram | whole number, at least 128. A smaller number gets Did you mean ... MiB. |
| 8 | NETWORK BRIDGE | Bridge, or an SDN vnet | list of bridges found in /etc/network/interfaces and interfaces.d, plus vnets marked [SDN] | An entry that exists. With no bridge found, vmbr0 is used without asking, or the run ends with exit 116 if it is missing. |
| 9 | IPv4 CONFIGURATION | IPv4 address and gateway | dhcp | dhcp; static asks STATIC IPv4 ADDRESS (address with prefix) and GATEWAY IP (must be in the subnet); range asks IP RANGE SCAN, pings the range for the first free address, then asks GATEWAY IP. |
| 10 | IPv6 CONFIGURATION | IPv6 method, address, gateway | first entry, auto | auto (SLAAC), dhcp, static (asks STATIC IPv6 ADDRESS and the optional IPv6 GATEWAY), none, disable |
| 11 | MTU SIZE | Interface MTU | blank | blank, or 576-65520 |
| 12 | DNS SEARCH DOMAIN | Search domain | blank (host setting) | blank, or DNS names |
| 13 | DNS SERVER | DNS servers | blank (host setting) | blank, or IP addresses separated by spaces |
| 14 | MAC ADDRESS | MAC address | blank (generated) | blank, or XX:XX:XX:XX:XX:XX |
| 15 | VLAN TAG | VLAN tag | blank | blank, or 1-4094 |
| 16 | CONTAINER TAGS | Tags | community-script plus the script's var_tags | letters, digits, -, _, separated by ; |
| 17 | SSH KEY SOURCE, then SSH ACCESS | Root SSH keys and SSH login | no keys, SSH off | Keys: found (pick from the host's keys in SELECT HOST KEYS), manual (paste one in SSH Public Key), folder (Scan Folder/Glob, then SELECT FOLDER KEYS), none. Then Enable root SSH access?, default No. |
| 18 | FUSE SUPPORT | FUSE feature | var_fuse, else No | Yes / No |
| 19 | TUN/TAP SUPPORT | /dev/net/tun in the container | var_tun, else No | Yes / No |
| 20 | NESTING SUPPORT | Nesting feature | var_nesting, else Yes | Yes / No. No shows a NESTING WARNING unless the OS is Alpine. |
| 21 | GPU PASSTHROUGH | GPU detection and passthrough | var_gpu, else No | Yes / No |
| 22 | KEYCTL SUPPORT | keyctl | var_keyctl, else No | Yes / No. Skipped for an unprivileged container, where it is always on. |
| 23 | APT CACHER PROXY, then APT CACHER IP | apt-cacher-ng use and address | var_apt_cacher, else No | Yes asks for an IP or URL |
| 24 | HTTP/HTTPS PROXY, then HTTP PROXY URL and NO_PROXY EXCEPTIONS | Proxy and exceptions | Yes when a proxy is already set, else No | Yes asks for the URL, then the exceptions, pre-filled with localhost,127.0.0.1,.local |
| 25 | HOST CA INHERITANCE | Copy host CA certificates into the container | var_inherit_host_ca, else No | Yes / No. Skipped, and set to no, when the host has no *.crt in /usr/local/share/ca-certificates. |
| 26 | CONTAINER TIMEZONE | Timezone | var_timezone, else the host's | blank for the host's zone, or a zone name such as Europe/Berlin |
| 27 | CONTAINER PROTECTION | Protection against removal | var_protection, else No | Yes / No |
| 28 | CONSOLE MODE | How the web console attaches | var_cmode, else tty | tty, console, shell |
| 29 | DEVICE NODE CREATION | mknod feature | var_mknod, else No | Yes / No |
| 30 | MOUNT FILESYSTEMS | Filesystem types the container may mount | var_mount_fs | blank, or types such as nfs,cifs; paths are refused |
| 31 | POST-INSTALL HOOK (HOST) | Script run on the host after the install | var_post_install | blank, or an absolute path without shell metacharacters. A path that does not exist opens FILE NOT FOUND and can be kept. |
| 32 | VERBOSE MODE, then CONFIRM SETTINGS | Verbose output; final confirmation | var_verbose, else No | The summary lists every choice; Create LXC starts the build, Back returns to step 31. |
Operating system and version are not part of the wizard. They come from the
script or from var_os and var_version.
After the last step
- The chosen settings are printed and written to the build log.
- Storage is settled as described above.
maybe_offer_save_app_defaultsoffers to keep the answers for this app:Save these advanced settings as defaults for <app>?when no file exists, or theAPP DEFAULTSmenu withUpdate Defaults,Keep Current,View DiffandCancelwhen the answers differ from the saved file. See Defaults and install modes.
Other dialogs you may see
| Title | When |
|---|---|
Storage Pools | More than one storage can hold the template or the container disk and none was preselected |
UPDATE DEFAULTS | A storage named in default.vars no longer holds that content; offers to write the new choice back |
OS VERSION NOT AVAILABLE | The host's template catalog lacks the requested release; pick another |
STORAGE ALMOST FULL | The chosen storage is at least 95% full |
POST-INSTALL HOOK FAILED | The hook from step 31 was not found or returned an error; the container is kept |
Preflight is optional
run_preflight loads host/preflight.func only when ENABLE_PREFLIGHT=1 is
set. A normal run skips it.