Barn 0.9.3 Changes
5 minute read
This page records the user-visible changes shipped in Barn 0.9.3 on 2026-10-31. The workflow changes began in source commit 27f17bb and were completed by the commits leading to the release. Check barn version when auditing another build.
See the Barn 0.9.3 release notes for the upgrade summary and the complete bilingual release note.
Resource changes and recovery
Edit vm_cpu or vm_mem and run barn resize [node...]. QEMU hot-plugs supported increases when the running VM has reserved capacity; decreases, older VMs, and unsupported backends use a stop/start fallback. The VM identity, disks, and SSH keys remain unchanged. resize refuses image, disk, network, share, creation, removal, and deployment-wide changes; use recreate, up, destroy, or a full selected operation as indicated by its next: field.
Linux and macOS lifecycle, persistent-disk, and replacement operations journal their transition state. If a process is interrupted or receives SIGINT or SIGTERM, the next lifecycle command can recover the operation; cancelled commands report the structured cancelled result. On macOS, barn mac up --no-wait returns when the VM process starts and may leave first-boot SSH and sudo provisioning running. Run barn mac up NAME again to wait for readiness.
Paths
barn init and setup work through directory symlinks. init -o ./lab/config/barn.yml also creates missing parent directories. Existing files still require --force, and writes never follow or replace an output-file symlink.
User-selected paths now accept normal development layouts:
| Input | Resolution |
|---|---|
BARN_HOME |
Relative paths, ~/, and directory symlinks; may also be the working directory |
Inventory and provision --script |
Symlinks to regular files; each file retains its 4 MiB limit |
Linux vm_shares.host |
Relative to the inventory’s real file, or an absolute/~/ path; directory symlinks work |
Local image repository and image import |
Relative paths, ~/, and symlink inputs |
catalogexport output |
Relative paths and ~/, directory aliases, and automatic parent creation; target must be absent |
BARN_MAC_RUNNER and local socket_vmnet archive |
Relative paths and ~/; archive inputs may be symlinks and still undergo digest verification |
CLI-relative paths, including a relative BARN_HOME, are interpreted from the current working directory. Use an absolute BARN_HOME to reach the same deployment from different directories. Barn still rejects / and the user’s home directory as data roots and checks the ownership and structure of its managed state. An owned ~/.ssh directory may be reached through a directory symlink; a linked ~/.ssh/config is still left for manual Include integration.
Shared folders and mount paths
Linux guests use QEMU Virtio-9p, now supported on macOS hosts as well as Linux hosts. QEMU and the guest kernel must support 9p. Native macOS guests continue to use VirtioFS through barn mac --share.
- Linux share sources use the invoking user’s actual filesystem permissions. A directory may belong to another user, overlap another source, or be writable by multiple guests. Coordinate concurrent writes as you would between host processes.
- Source paths support spaces, Unicode, and commas. Linux guest mount paths are normalized and escaped for shell commands and
fstab, including spaces, Unicode, and shell punctuation. - Mac share names support spaces and Unicode: valid UTF-8, 1–255 bytes, excluding
.,..,/, and ASCII control characters. Share sources may be directory symlinks. - The eight-share limit is removed. Backend device and host resource limits still apply. Linux sources must not overlap
BARN_HOME, and mount targets must not overlap each other, system directories, data-disk mounts, or the guest SSH directory.
See Storage and Access for Linux shares and Mac Commands for native macOS shares. Barn never changes host ownership to make a share writable.
Apply only the selected node changes
Explicit selections in plan, up, reload, and recreate preserve unselected peers’ applied definitions, even if those peers were edited or omitted in the current inventory. Uncreated, unselected nodes do not require image resolution. This allows a multi-node edit to be applied in batches:
The entire inventory must still parse correctly. Conflicts with applied addresses, aliases, control-node roles, or shared deployment settings are checked before stopping or deleting nodes. Omitting selectors evaluates the whole inventory; removing a YAML entry never deletes its VM. See Daily Operations.
Generated template image selection
barn init [template] --image <reference> writes an explicit vm_image under all.vars for every generated node. barn setup [template] --image <reference> uses the same behavior while preparing a generated template. References may be aliases, channels, or version selectors; the flag does not download an image. Existing inventories selected with -f or discovered automatically are never rewritten by this option.
Images and development limits
| Area | New behavior |
|---|---|
| Linux node count | No separate 20-node ceiling; nodes need distinct usable addresses in the deployment’s /24 and sufficient host resources |
| External inventory hosts | vm_skip: true entries may use hostnames or IPv6 keys; managed VMs still use IPv4, and at least one managed node is required |
| Linux capacity strings | Case-insensitive units; K/M/G/T and KiB/MiB/GiB/TiB are binary, while KB/MB/GB/TB remain decimal |
| Provisioning | --parallel accepts positive integers and uses at most the selected node count; --timeout accepts any positive duration, without the old four-worker or 24-hour ceilings |
| Image size | No 8 GiB artifact ceiling for local imports or catalog artifacts with declared sizes; downloads without a declared size retain the legacy 8 GiB bound |
| Image imports | Arbitrary source filenames; new cache entries use local/<sha256>.qcow2, so same-name files with different contents coexist and identical contents reuse the cache |
| Local aliases | No 256-alias ceiling; updates exceeding the 1 MiB registry metadata limit fail before writing. Reimporting an existing alias preserves its old cache path |
| Local repositories | Relative or linked roots and shared writable directories work; repo.yaml may be a symlink to a regular file |
| Mac logs | Any positive --lines count; requested lines are no longer silently clipped at 1 MiB or 10,000 lines |
| Fallback ports | Try preferred + n × 10000 through port 65535, rather than stopping after five candidates |
Provisioning still defaults to one worker and a one-hour deadline, with 1 MiB of captured stdout and stderr per node. These user-facing limits are separate from the internal VM startup scheduler. Image digests, declared sizes, qcow2 structure, retained-disk compatibility, and process identity are still verified. The contributor image pipeline retains its own recipe bounds.