HosterOS installation
The fourteen-screen installer, one screen at a time: what each one asks, what it does with the answer, and which decisions you cannot revisit later.
HosterOS turns a machine booted from the live ISO into a configured Hoster node. It partitions the disks, builds the ZFS pools, installs Ubuntu 26.04 LTS or Rocky Linux 10 from an archive already on the media, and configures networking, the internal bridge, swap, the ARC limit and any PCI devices you want to hand to guests.
It is a terminal interface, which means it works the same way on a physical console, in an iDRAC or iLO window, and over SSH. Nothing needs a browser or a graphical session.
The screenshots below were taken in the installer’s UI preview mode (
--ui-preview), which draws every screen against sample hardware, needs no root, and touches nothing. The real installer looks identical — it just has your disks in it. To rehearse against your own hardware without erasing it, use--dry-runinstead.
Take a photo or capture of the ISO being written to a USB stick, or the server's virtual-media dialog with the HosterOS ISO attached — something that shows the starting point before the installer appears.
Before you start
- The HosterOS live ISO, written to USB or attached as virtual media.
- At least one disk you are willing to erase. Two if you want a mirror.
- Root access on the live environment. The live system boots the installer on tty1 automatically.
- Networking is optional — the rootfs archives are on the ISO and the install is fully offline. You only need a network if you want to drive the installer over SSH.
Finishing the install from your desk
You almost never have to stay at the console. When the installer starts on the live
system it starts SSH, enables root login, generates a one-time password for that boot,
and prints the credentials and the exact ssh command on its first screen.
ssh root@<live-environment-ip>
cd /opt/hosteros-installer
./HosterOS
The password is generated once per live boot and stored in the clear at
/run/hosteros-installer/ssh-credentials. That is deliberate: the live system is a
throwaway, RAM-backed environment, the password does not survive a reboot, and you have
to be able to read it off the console. Re-running the installer reuses it rather than
locking you out. The installed system’s root password is a separate thing you set on
screen 7.
If the live system never got an address, the panel says so and shows no SSH details, because there would be nothing to connect to. Bring up networking and restart the installer and they appear.
Reading the screens
Every screen shares the same frame. On the left is the step list with a marker on where
you are, and beneath it a running summary of every decision so far — so the
consequences of a change are visible from any screen, not just the review. The bottom
bar shows the keys that work here. ? opens the controls help from anywhere, and
PgUp/PgDn move between screens.
1 · Welcome
by-id, falling back to by-path, falling back to the raw node), and selected PCI devices are bound to vfio-pci during early boot. In a live install this panel also carries the generated SSH credentials.The sentence that governs the whole flow is at the foot of the overview: every value is reviewed before a separate hostname confirmation unlocks installation. Nothing here is destructive until screen 13, twice over.
2 · Hostname
Choose carefully — this is also the string you will have to type from memory at the destructive confirmation on screen 13.
3 · Disks
Space toggles the highlighted row. The panel on the right resolves the highlighted disk to the exact path the installer will use and tells you which identifier it settled on — here by-id, with by-path unavailable. The third disk in this example is flagged by-path, meaning it has no stable by-id link.By-id paths survive re-cabling and controller reordering; /dev/sdX does not. This is
why the installer prefers them and shows you which one it picked.
4 · ZFS layout
This is the decision you cannot revisit. Changing the topology later means reinstalling. Redundancy is not a backup, but a mirror is the difference between a dead disk being an inconvenience and being an outage.
5 · Target OS
Checksum: present column is the pre-flight for that — an archive without one will not be used. Locale and timezone are set here too, through the two action buttons at the bottom, and the package mirror comes from the profile unless you override it.Pick the distribution your team already knows how to operate. Hoster itself behaves the same on both.
6 · Firmware
7 · Root password
The requirements panel also states the position worth keeping: password-based remote root login stays disabled unless you explicitly need it. Use keys.
8 · Host network
eno2 is down and left unchecked, and a VLAN with tag 120 rides on eno1.Interfaces are matched by MAC and given a stable name, so the configuration survives the kernel renaming devices between boots. Each one can take a static address or DHCP.
9 · PCI passthrough
vfio-pci in early boot and handed to guests rather than the host. The panel on the right shows the installer detected an AMD CPU and will add amd_iommu=on iommu=pt to the kernel arguments. Note the two NVIDIA rows: selecting the GPU also selected its audio function, because both sit in IOMMU group 34 and an IOMMU group can only move as a unit.Doing this at install time means the bindings are in the initramfs from first boot, so the host never briefly claims the GPU on its way up.
9.1 · The experimental laptop workaround
The checkbox at the bottom — Laptop/SoC ACS workaround (EXPERIMENTAL) — is for the
case where a discrete GPU shares its IOMMU group with an upstream PCIe root port that
has no ACS, which is common on laptops and some mini PCs and SoCs. Enabling it installs
a boot-time service that binds the selected functions to vfio-pci and unbinds the
upstream root port from pcieport, making an otherwise unusable group viable.
Leave it off on desktops and servers. There the GPU usually has its own clean group and releasing a root port is unnecessary and potentially disruptive.
10 · Hoster bridge
Choose a private range that does not overlap your host uplinks or any VPN you will route to this machine. Overlapping ranges are painful to unpick after guests exist on them.
11 · Swap size
/etc/fstab. The guidance offers the usual bands — 8 for a small lab box, 16 for a moderate host, 32 or more where memory pressure is real.12 · ARC limit
The trade-off is stated on the screen and is worth taking seriously on a hypervisor: too little ARC and you lose cache hits, too much and you are competing with the guests for memory. On a host whose job is running VMs, leaving headroom is usually right.
13 · Review
/dev/nvme… name that could have moved. The action bar stays fixed while the summary scrolls, and the warning line at the bottom never leaves the screen.Read the network section carefully — it is the last place the VLAN tags, the bridge range and the DHCP pool appear together before they are written.
14 · Install
Show raw file log when you want the unfiltered output. The left-hand summary grows a progress line so the state is legible even from a narrow console. Ctrl+C requests cancellation rather than killing it outright.A real install runs seven steps, in order, each with rollback if it fails:
- Preflight — confirms it is on supported live media, that every disk and ZFS tool
it needs is present on the ISO, and stops
zedso it cannot fight over the pools. - Disk preparation — swap off, partition tables and filesystem signatures wiped, then the layout written to each selected disk (see below).
- Pool creation —
rpoolin the topology you chose, plusbpoolwhere the target uses a separate boot pool, mirrored when there are several disks. - Datasets — the standard dataset hierarchy under
rpool. - Bootstrap — verifies the rootfs archive against its checksum, extracts it, and
sets hostname,
/etc/hostsand package repositories. - Chroot setup — locale, timezone, kernel, GRUB/EFI, the profile’s network backend, the ZFS hostid and the ZFS initramfs hooks.
- Finalize — everything is unmounted and the pools are exported cleanly.
The screenshot above shows six stages because preview mode simulates a shortened run. A real install reports seven.
The partition layout depends on the distribution you picked
This is the one place where screen 5 has a consequence beyond which userland you get:
| Ubuntu | Rocky | |
|---|---|---|
| EFI partition | 512 MB | 4 GB |
| Swap | your size, per disk | your size, per disk |
Separate bpool |
yes, 3 GB | no |
| Root pool | remaining space | remaining space |
Ubuntu keeps /boot on a small separate ZFS pool, so GRUB only has to read a pool
created with a conservative feature set. Rocky puts it in a larger EFI partition and has
no bpool at all. BIOS mode adds a 1 MB BIOS boot partition, where a separate boot pool
is in use.
Nothing about operating the node changes; it is worth knowing before you go looking for
bpool on a Rocky machine and do not find it.
Take a screenshot of the first successful boot: the GRUB entry, or the login prompt of the installed system with the hostname visible.
After the reboot
Remove the installation media and reboot. The machine comes up on its new ZFS root,
with the network, bridge, swap and ARC settings you chose, and any passthrough devices
already bound to vfio-pci.
Expect it to reboot itself once or twice more
This is normal, and it is not a failure. After your first boot the machine will restart itself — usually once, sometimes two or three times in total before it settles. Let it. Do not interrupt it, and do not reach for the installer again.
Those extra boots are how the root pool’s import gets made reliable. Running the root filesystem on ZFS means the pool has to be imported by the initramfs, before the system that owns it is running, and getting that to happen the same way every time takes a handful of things agreeing with each other:
- a stable
/etc/hostid, generated for this machine and also passed on the kernel command line asspl_hostid, so the pool is not seen as belonging to another host - a
zpool.cachebaked into the initramfs that matches the pool as it now exists - an initramfs rebuilt after both of those are in place
The installer sets all of it up, but some of it can only settle on a real boot of the
installed system rather than from inside the installer’s chroot. A one-shot service
handles that pass and then disables itself, leaving a marker at
/var/lib/hosteros/first-boot-reboot.done so it never runs again.
We would rather this were not here. It is a limitation of ZFS-on-root that we have not found a clean way around yet, not a design decision. If the machine is still rebooting after the third time, that is a genuine fault — grab
/var/log/hosteros-installer.logand tell us, because at that point something else is wrong.
There is no bootstrap step — the installer already did that work. Log in, check the
node with hoster host info, and go straight to
Your first VM.
Running it again, or by hand
The installer is a single binary on the live media. If it exits you land in a rescue shell and can start it again:
cd /opt/hosteros-installer
./HosterOS
| Flag | Default | What it does |
|---|---|---|
--dry-run |
false |
Walks every screen against your real hardware and simulates the phases, without touching a disk |
--ui-preview |
false |
Draws every screen against synthetic hardware; needs no root and does no discovery |
--log-path |
/var/log/hosteros-installer.log |
Where the installation log is written |
--version |
— | Print the version and exit |
--dry-run is the honest way to rehearse an install — on the exact machine, with its
real disks listed, without erasing anything.
Something unclear on this page?
Ask about this specific page and we will come back to you. Your question arrives with a link to it, so you do not have to describe where you were.