| Both sides previous revisionPrevious revisionNext revision | Previous revision |
| vm-reactor:start [01.11.2026 19:39] – VM Reactor 0.13 aria | vm-reactor:start [07.11.2026 19:51] (current) – stratum-core instead of stratum-init aria |
|---|
| |
| <WRAP centeralign> | <WRAP centeralign> |
| **VM Reactor 0.13 – Technical Preview** · Debian 13 (trixie) and Debian 14 (forky) · amd64 and arm64 · free software (GPL-3+) · package ''vm-reactor'' in the Stratum repository (component //contrib//) | **VM Reactor 0.24 – Technical Preview** · Debian 13 (trixie) and Debian 14 (forky) · amd64 and arm64 · free software (GPL-3+) · package ''vm-reactor'' in the Stratum repository (component //contrib//) |
| </WRAP> | </WRAP> |
| |
| |
| <WRAP center round info 80%> | <WRAP center round info 80%> |
| **A contrib package of the Stratum repository.** VM Reactor is published in the component //contrib// of the Stratum repository, next to the Stratum modules in //main//. It builds on Stratum – it needs ''stratum-init'' and works together with the Stratum modules – but it enjoys a certain independence from them: its own versions and release cycle, its own web interface, its own handbook and this page of its own. | **A contrib package of the Stratum repository.** VM Reactor is published in the component //contrib// of the Stratum repository, next to the Stratum modules in //main//. It builds on Stratum – it needs ''stratum-core'' and works together with the Stratum modules – but it enjoys a certain independence from them: its own versions and release cycle, its own web interface, its own handbook and this page of its own. |
| </WRAP> | </WRAP> |
| |
| <grid cols="1fr 1fr 1fr"> | <grid cols="1fr 1fr 1fr"> |
| <col> | <col> |
| <card header="Storage" subtitle="Directory · LVM thin pool · NFS share" shadow="small"> | <card header="Storage" subtitle="Directory · Btrfs pool · LVM thin pool · NFS share" shadow="small"> |
| Guests, ISO images, LXC templates and backups in the storage you choose: a directory, an LVM thin pool – thin volumes with instant snapshots – or an NFS share. | Guests, ISO images, LXC templates and backups in the storage you choose: a directory, a btrfs pool on one or more disks – RAID 0, 1, 1C3 or 10, snapshots, compression and checksums – an LVM thin pool or an NFS share. Disks of the pools are added, removed and replaced while the guests keep running. |
| </card> | </card> |
| </col> | </col> |
| <col> | <col> |
| <card header="Memory" subtitle="on by default · deduplication · compression · ballooning" shadow="small"> | <card header="Memory" subtitle="on by default · deduplication · compression · ballooning" shadow="small"> |
| A page of its own and switched on by default: deduplication (ksm), compression (zram with ''stratum-zram'', zstd) and ballooning (virtio-balloon with free page reporting and an automatic balloon) – tuned for a hypervisor. The Overview shows in real time how much RAM each of them saves. | A page of its own and switched on by default: deduplication (ksm), compression (zram, zstd) and ballooning (virtio-balloon with free page reporting and an automatic balloon) – tuned for a hypervisor, managed by ''stratum-memory''. The Overview shows in real time how much RAM each of them saves. |
| </card> | </card> |
| </col> | </col> |
| |
| <WRAP centeralign> | <WRAP centeralign> |
| **More guests in the same memory – an advanced feature of VM Reactor.** **Memory** – a page of the main menu – brings three techniques together, always in this order: **deduplication** keeps identical memory pages of the virtual machines only once (ksm), **compression** keeps idle guest memory compressed in RAM (zram, typically 3:1 and more), and **ballooning** returns memory the machines do not use to the host (virtio-balloon). VM Reactor switches them on at the installation with values recommended for a virtualization host, and the panel **Memory management** on the **Overview** shows in real time – one curve each – how much RAM they save. | **More guests in the same memory – an advanced feature of VM Reactor.** **Memory** – a page of the main menu – brings three techniques together, always in this order: **deduplication** keeps identical memory pages of the virtual machines only once (ksm), **compression** keeps idle guest memory compressed in RAM (zram, typically 3:1 and more), and **ballooning** returns memory the machines do not use to the host (virtio-balloon). VM Reactor switches them on at the installation with values recommended for a virtualization host (''stratum-memory'', type //VM Reactor host//), and the panel **Memory management** on the **Overview** shows in real time – one curve each – how much RAM they save. |
| </WRAP> | </WRAP> |
| |
| | System | **Debian 13 (trixie)** or **Debian 14 (forky)**, ''amd64'' or ''arm64'' – a physical computer or a virtual machine with nested virtualization | | | System | **Debian 13 (trixie)** or **Debian 14 (forky)**, ''amd64'' or ''arm64'' – a physical computer or a virtual machine with nested virtualization | |
| | Virtualization | **VT-x / AMD-V** switched on in the firmware for KVM machines; without it, machines run emulated and slowly (containers and applications do not need it) | | | Virtualization | **VT-x / AMD-V** switched on in the firmware for KVM machines; without it, machines run emulated and slowly (containers and applications do not need it) | |
| | Stratum | ''stratum-init'' 0.40 or newer and the Stratum repository with the components ''main'' **and** ''contrib'' – see [[stratum:start#quick_setup|Stratum – quick setup]] | | | Stratum | ''stratum-core'' 0.49 or newer (the Stratum core, written in Go) and the Stratum repository with the components ''main'' **and** ''contrib'' – see [[stratum:start#quick_setup|Stratum – quick setup]] | |
| | Memory and disk | Enough for the host and all guests; memory compression, deduplication and the balloon help when it gets tight | | | Memory and disk | Enough for the host and all guests; memory compression, deduplication and the balloon help when it gets tight | |
| | Browser | Any current browser; the web interface uses HTTPS on port ''8443'' | | | Browser | Any current browser; the web interface uses HTTPS on port ''8443'' | |
| </card> | </card> |
| |
| Sources written by older versions of ''stratum-archive-keyring'' have only ''main''; installing the current ''stratum-archive-keyring'' (or ''stratum-init'') adds ''contrib'' and ''non-free'' by itself. | Sources written by older versions of ''stratum-archive-keyring'' have only ''main''; installing the current ''stratum-archive-keyring'' (or ''stratum-core'') adds ''contrib'' and ''non-free'' by itself. |
| |
| ==== 2. Install the package ==== | ==== 2. Install the package ==== |
| </card> | </card> |
| |
| APT brings everything VM Reactor needs from Debian – libvirt and QEMU, LXC, nftables, dnsmasq, noVNC – together with ''ksmtuned'' and ''stratum-zram'' for the memory setup, and recommends ''stratum-firewall''. The installation asks one question – **Install Docker from Docker's repository?** (yes by default): VM Reactor then sets up Docker's key and repository and installs Docker as soon as APT has finished, as a task you can follow under **Tasks**. At the end, the installation prints the address of the web interface and where the first password is: | APT brings everything VM Reactor needs from Debian – libvirt and QEMU, LXC, nftables, dnsmasq, noVNC – together with the Stratum modules it works with: ''stratum-memory'' for the memory setup, ''stratum-firewall'', ''stratum-security'', ''stratum-watchdog'', ''stratum-software'', ''stratum-support'' and ''stratum-wireguard''. The installation asks one question – **Install Docker from Docker's repository?** (yes by default): VM Reactor then sets up Docker's key and repository and installs Docker as soon as APT has finished, as a task you can follow under **Tasks**. At the end, the installation prints the address of the web interface and where the first password is: |
| |
| <card header="Output" shadow="small"> | <card header="Output" shadow="small"> |
| | **NAT** (bridge ''vmnat0'', ''10.10.10.0/24'' by default) | a private address from the host's DHCP, names ''<name>.vm-reactor.lan''; reachable from outside through **published ports**. Fixed addresses below the DHCP range. | | | **NAT** (bridge ''vmnat0'', ''10.10.10.0/24'' by default) | a private address from the host's DHCP, names ''<name>.vm-reactor.lan''; reachable from outside through **published ports**. Fixed addresses below the DHCP range. | |
| | **Local network** | its own address in your LAN (machines: macvtap, containers: macvlan) – the host itself cannot reach these guests | | | **Local network** | its own address in your LAN (machines: macvtap, containers: macvlan) – the host itself cannot reach these guests | |
| | **Bridge** | a bridge on a network card (''vmbrN'') – guests are like computers next to the host; the change of ''/etc/network/interfaces'' must be confirmed, otherwise it is rolled back after 2 minutes | | | **Bridge** | a bridge on a network card (''vmbrN'') – guests are like computers next to the host; the change of ''/etc/network/interfaces'' must be confirmed within 60 seconds, otherwise it is rolled back | |
| | **Internal bridge** | a bridge without a network card – guests talk only to each other | | | **Internal bridge** | a bridge without a network card – guests talk only to each other | |
| | **Applications** | the front service of a Docker application joins the NAT network (Docker network ''vmnat'' on ''vmnat0'', addresses ''.64''–''.95'' by default, ''NAT_DOCKER''): a fixed address, ''<name>.vm-reactor.lan'', published ports and the firewall of the guest; its other services (e.g. a database) stay in the application's own network. New applications join by themselves, existing ones under **Network** of the application. | | | **Applications** | the front service of a Docker application joins the NAT network (Docker network ''vmnat'' on ''vmnat0'', addresses ''.64''–''.95'' by default, ''NAT_DOCKER''): a fixed address, ''<name>.vm-reactor.lan'', published ports and the firewall of the guest; its other services (e.g. a database) stay in the application's own network. New applications join by themselves, existing ones under **Network** of the application. | |
| |
| Every guest also has its own **firewall** (nftables on the bridge): policies, rules and protection against address spoofing. With ''stratum-wireguard'' the NAT network can be **announced in the mesh** – the other members then reach the guests directly; when several hosts share a mesh, give each one its own NAT network (the guests keep the host part of their address). | Every guest also has its own **firewall** (nftables on the bridge): policies, rules and protection against address spoofing. With ''stratum-wireguard'' the NAT network can be **announced in the mesh** – the other members then reach the guests directly; when several hosts share a mesh, give each one its own NAT network (the guests keep the host part of their address). |
| | |
| | **Protection against lock-out.** A change of the NAT network, of a bridge on a network card or of the access to the web interface (port, address, allowed networks under **Settings – General**) must be kept within **60 seconds**: a banner with the countdown and **Keep the change** appears on every page. Confirm it from the browser over the new configuration; when the host can no longer be reached, the previous configuration comes back by itself (a systemd timer, ''vm-reactor settings-rollback''). |
| |
| ==== Storage ==== | ==== Storage ==== |
| <code> | <code> |
| local dir /var/lib/vm-reactor guests,iso,templates,backup | local dir /var/lib/vm-reactor guests,iso,templates,backup |
| | data btrfs /var/lib/vm-reactor/storage/data guests,iso,templates,backup source=<uuid> options=compress=zstd:1 |
| thin lvmthin /var/lib/vm-reactor/storage/thin guests source=vmr-thin/data | thin lvmthin /var/lib/vm-reactor/storage/thin guests source=vmr-thin/data |
| </code> | </code> |
| </card> | </card> |
| |
| Types: ''dir'' (Directory), ''lvmthin'' (LVM thin pool: thin volumes and snapshots) and ''nfs'' (NFS share). Add them in **Storage**; the web interface checks the tools and can format a new disk. | **Add storage** offers four types; the dialog checks your entries at once and shows what is wrong: |
| | |
| | * **Directory** – any mounted directory: a second disk, an existing btrfs file system or an NFS share the host mounts itself. VM Reactor recognises the file system: on btrfs the guests get subvolumes and snapshots, on an NFS share the storage is offline while the share is not there. |
| | * **Btrfs pool** – a new btrfs file system on one or more empty disks or partitions: **single**, **RAID 0**, **RAID 1** (2+ disks), **RAID 1C3** (3 copies, 3+ disks) or **RAID 10** (4+ disks). RAID 5/6 are not offered – their write hole can lose data. The metadata always have two copies at least. Compression zstd, checksums with self-repair from the copies, instant snapshots of every guest (its own subvolume), clones as reflinks; disks of machines are raw files (optionally without copy-on-write). **Disks** on the card adds, removes and replaces disks – also a failed or missing one – converts the profile, starts a scrub or a balance and mounts a pool with a missing disk degraded, all while the guests keep running. VM Reactor watches the pools (missing disks, device errors, scrub results) and runs a scrub every 30 days. |
| | * **LVM thin pool** – a new thin pool on one or more empty disks (or an existing one such as ''pve/data''): thin volumes for disks of machines and file systems of containers, instant snapshots; disks can be added and taken out later. A thin pool cannot shrink – to take a disk out, the other disks need room for its data. |
| | * **NFS share** – an export (''server:/path''), mounted by VM Reactor through ''/etc/fstab''; the server must answer on port 2049. |
| | |
| | <card header="Terminal — root@host" shadow="large"> |
| | <code bash> |
| | vm-reactor storage list # all storages: type, state, size, free space |
| | vm-reactor storage add data btrfs /dev/sdb /dev/sdc --profile raid1 --yes # a btrfs pool, RAID 1 |
| | vm-reactor storage disk add data /dev/sdd --yes # one more disk, the data are spread |
| | vm-reactor storage profile data raid1c3 # three copies |
| | vm-reactor storage disk replace data /dev/sdb /dev/sde --yes # replace a disk (devid:N: a missing one) |
| | vm-reactor storage scrub data # check every block, repair from the copies |
| | vm-reactor storage disk list data # disks, errors, the last scrub |
| | vm-reactor storage add thin lvmthin --new /dev/sdf --yes # an LVM thin pool |
| | vm-reactor storage add share nfs 10.0.0.5:/srv/vm # an NFS export |
| | </code> |
| | </card> |
| |
| ==== Backups and restore ==== | ==== Backups and restore ==== |
| * **Start with the host**: guests with autostart start in their **start order** with delays (''vm-reactor-guests.service''); at host shutdown they are shut down in reverse order, each with a timeout (''SHUTDOWN_TIMEOUT''). | * **Start with the host**: guests with autostart start in their **start order** with delays (''vm-reactor-guests.service''); at host shutdown they are shut down in reverse order, each with a timeout (''SHUTDOWN_TIMEOUT''). |
| * **Watchdog**: every ''WATCHDOG_INTERVAL'' seconds it checks the components (libvirt, LXC, Docker, the NAT network, the firewall rules, the storages) and the guests. A guest that should run but stopped or crashed is started again when its option //restart// is on – at most three times an hour; a machine whose guest agent stops answering is reset. With ''stratum-watchdog'', VM Reactor itself is watched too. | * **Watchdog**: every ''WATCHDOG_INTERVAL'' seconds it checks the components (libvirt, LXC, Docker, the NAT network, the firewall rules, the storages) and the guests. A guest that should run but stopped or crashed is started again when its option //restart// is on – at most three times an hour; a machine whose guest agent stops answering is reset. With ''stratum-watchdog'', VM Reactor itself is watched too. |
| * **Memory** (main menu): deduplication (ksm with ''ksmtuned''; ksm belongs to the physical host – inside a virtual machine ''ksmtuned'' does not start), compression (stratum-zram with the profile //VM Reactor host//, zstd or lz4, and the recommended kernel values for a hypervisor) and ballooning (virtio-balloon: free page reporting, and an automatic balloon that never takes a machine below its minimum memory – half its memory by default, //Hardware//). All of it is switched on at the installation; ''vm-reactor memory-defaults --force'' applies it again. | * **Memory** (main menu): deduplication (ksm with ''ksmtuned''; ksm belongs to the physical host – inside a virtual machine ''ksmtuned'' does not start), compression (zram with zstd or lz4 and the recommended kernel values for a hypervisor) and ballooning (virtio-balloon: free page reporting, and an automatic balloon that never takes a machine below its minimum memory – half its memory by default, //Hardware//). All of it is done by ''stratum-memory'' with the type of computer //VM Reactor host// – VM Reactor shows it and changes its settings; it is switched on at the installation, ''vm-reactor memory-defaults --force'' applies it again. |
| |
| ==== Stratum modules ==== | ==== Stratum modules ==== |
| | stratum-wireguard | the NAT network is announced in the mesh; the members reach the guests | Network | | | stratum-wireguard | the NAT network is announced in the mesh; the members reach the guests | Network | |
| | stratum-support | support sessions; ''vm-reactor report'' is part of the diagnostic report | Settings → Support | | | stratum-support | support sessions; ''vm-reactor report'' is part of the diagnostic report | Settings → Support | |
| | stratum-zram | memory compression for VM hosts (zstd or lz4) | Memory | | | stratum-memory | compression (zram), deduplication (ksm) and the automatic ballooning of the machines | Memory | |
| | stratum-ansible | dynamic inventory of the machines and containers | ''vm-reactor inventory'' | | | stratum-ansible | dynamic inventory of the machines and containers | ''vm-reactor inventory'' | |
| |
| |
| VM Reactor is updated with APT like every other package (''apt-get upgrade''). Restarting the web interface does not touch the guests – they keep running. | VM Reactor is updated with APT like every other package (''apt-get upgrade''). Restarting the web interface does not touch the guests – they keep running. |
| | |
| | **Optional packages** (**Settings – Packages**, one click each): ''vm-reactor-virtio-win'' – the VirtIO drivers for Windows machines (the virtio-win ISO image 0.1.302 of the Fedora project, BSD licence): it appears in the storage ''local'' among the ISO images as ''virtio-win-0.1.302.iso'' – attach it to a Windows machine as a second CD drive and load the drivers during the Windows setup (''viostor'' or ''vioscsi'') or install them all afterwards with ''virtio-win-guest-tools.exe''; ''vm-reactor-handbook'' – the VM Reactor Handbook as PDF. |
| | |
| | VM Reactor is written in **Go** – the server, the API and the command line are one Go program; the web interface uses Vue.js. |
| |
| ===== VM Reactor Handbook ===== | ===== VM Reactor Handbook ===== |
| <card header="Download" shadow="small"> | <card header="Download" shadow="small"> |
| **[[https://www.skraba.net/stratum-apt/handbook/vm-reactor-handbook.pdf|VM Reactor Handbook (PDF, A4, 28 pages, 0.7 MB)]]** \\ | **[[https://www.skraba.net/stratum-apt/handbook/vm-reactor-handbook.pdf|VM Reactor Handbook (PDF, A4, 28 pages, 0.7 MB)]]** \\ |
| Draft · November 2026 · VM Reactor 0.08 · Stratum Project \\ | Draft · November 2026 · VM Reactor 0.24 · Stratum Project \\ |
| On a VM Reactor host: ''apt install vm-reactor-handbook'' – the book is then at ''/usr/share/vm-reactor/handbook/vm-reactor-handbook.pdf''. | On a VM Reactor host: ''apt install vm-reactor-handbook'' (or **Settings – Packages**) – the book is then at ''/usr/share/vm-reactor/handbook/vm-reactor-handbook.pdf'', with a link in ''/root/vm-reactor-handbook.pdf''. |
| </card> | </card> |
| </col> | </col> |