A3S Box provides one installer contract through native launchers for each host:
install.shfor Linux and macOS, without requiring PowerShell; andinstall.ps1for Windows, without requiring Bash.
Both launchers detect the host, resolve a GitHub release, verify its SHA-256 digest before extraction, validate the package layout and reported version, then replace a previous installer-managed copy as one staged operation.
| Host | Architecture | Release target |
|---|---|---|
| Linux | x86_64 | linux-x86_64 |
| Linux | arm64 | linux-arm64 |
| macOS | Apple Silicon | macos-arm64 |
| Windows | x86_64 | windows-x86_64 |
Intel macOS and Windows on ARM are rejected rather than receiving an incompatible archive. The installer installs the runtime distribution; it does not enable KVM, HVF, WHPX, or Linux Sandbox host capabilities by itself. Review Platform boundaries and the Windows WHPX guide before running real workloads. For Sandbox, complete Linux Sandbox host preparation after install.
Linux or macOS:
curl --proto '=https' --tlsv1.2 -fsSL \
https://raw.githubusercontent.com/A3S-Lab/Box/main/install.sh | shWindows PowerShell 5.1 or newer:
irm https://raw.githubusercontent.com/A3S-Lab/Box/main/install.ps1 | iexOpen a new terminal if the current one does not see the updated PATH, then
verify the result:
a3s-box --version
a3s-box info
Piping code from the network executes the current main branch. To inspect it
first, download install.sh or install.ps1, review the file, and invoke it
locally.
Homebrew remains available on Linux and macOS:
brew install a3s-lab/tap/a3s-boxThe default destinations are:
${XDG_DATA_HOME}/a3s-boxwhenXDG_DATA_HOMEis set;$HOME/.local/share/a3s-boxon other Linux and macOS hosts; and%LOCALAPPDATA%\Programs\A3S Boxon Windows.
The release stays self-contained at that location so its sibling libraries and
guest executable are not separated from a3s-box.
| Behavior | Linux/macOS | Windows |
|---|---|---|
| Pin a release | --version v3.3.0 |
-Version v3.3.0 |
| Choose destination | --install-dir PATH |
-InstallDir PATH |
Do not change PATH |
--no-modify-path |
-NoModifyPath |
| Replace an unmanaged directory | --force |
-Force |
| Install a local package | --archive FILE --sha256 HEX |
-ArchivePath FILE -Sha256 HEX |
Pass Unix options after sh -s -- when using a pipe:
curl --proto '=https' --tlsv1.2 -fsSL \
https://raw.githubusercontent.com/A3S-Lab/Box/main/install.sh |
sh -s -- --version v3.3.0 --no-modify-pathInvoke the downloaded PowerShell text as a script block when options are needed:
$installer = irm https://raw.githubusercontent.com/A3S-Lab/Box/main/install.ps1
& ([scriptblock]::Create($installer)) -Version v3.3.0 -NoModifyPathThe corresponding environment variables are A3S_BOX_VERSION,
A3S_BOX_INSTALL_DIR, A3S_BOX_ARCHIVE, and A3S_BOX_SHA256. Unix also
supports A3S_BOX_PROFILE or --profile to select the shell startup file.
Set A3S_BOX_NO_MODIFY_PATH=true to suppress PATH changes in a piped
invocation. Set GITHUB_TOKEN when authenticated GitHub API access is needed
because of rate limits.
The installer does not enable Sandbox host capabilities. On a certified Linux
host, after installing Box and locating the pinned a3s-oci binary:
sudo bash /path/to/box/scripts/prepare-linux-sandbox-host.sh \
--install-launcher /absolute/path/to/a3s-oci
export A3S_BOX_SANDBOX_DELEGATED_CGROUP_ROOT=... # printed by the script
a3s-box run --rm --isolation sandbox alpine:3.20 -- sleep 5The script:
- prepares a delegated cgroup v2 tree owned by the invoking non-root identity;
- ensures subordinate UID/GID ranges and userns-related sysctls when needed; and
- installs the setuid launcher at
/usr/local/libexec/a3s-box-sandbox-oci-launcherwhen--install-launcheris supplied (required on production hosts; discovery also checks env and packaged paths).
A mode 4755 launcher elevates effective uid only. The operator's real gid and
supplementary groups stay until a3s-oci adopts effective gid 0, clears
groups, and migrates into the Box-created child under the delegated root while
it is still effective uid 0. The unprivileged parent does not need write access
to the cgroup v2 common ancestor. Do not install mode 6755 or a separate
wrapper for that identity: the in-process adopt path is the product contract.
A Linux tip proof that the documented steps start a Sandbox is still required
before claiming the operator path closed.
Do not set A3S_BOX_OCI_MIGRATION for the Sandbox GA default. Use
A3S_BOX_OCI_MIGRATION=off only for MicroVM-only hosts without OCI prep.
CI qualification uses prepare-linux-sandbox-ci-host.sh (setpriv on nosuid
runners) and is not a substitute for the operator setuid install. Evidence:
Sandbox GA evidence. On a suid-capable host, prove the
operator path with scripts/proof-linux-sandbox-setuid-launcher.sh (non-root
run, setpriv unset). Non-root Host spawn without A3S_BOX_CI_SETPRIV_WRAPPER
now fail-closes unless the resolved launcher is root-owned mode 4755.
MicroVM -v host:guest:ro on Linux and WSL host-enforces write denial via a
private MS_RDONLY bind alias before virtio-fs attach. That path needs host
CAP_SYS_ADMIN (typically root). Without it, Box fails closed before durable
boot with a CAP_SYS_ADMIN hint — it does not fall back to guest-honor-only
:ro.
The Sandbox setuid launcher above elevates SandboxViaOci only; it does not
cover MicroVM RO staging. On WSL, run MicroVM :ro workloads as root (or an
equivalent capability-bearing identity), or omit :ro and use a writable bind.
Windows/WHPX MicroVM :ro uses BindFlt instead and does not need Linux
CAP_SYS_ADMIN. See Windows WHPX.
Tip (writable bind + named volume on WSL, no :ro): host marker write-through
and volume persist across two run --rm passed on tip (wsl_rw_tip=pass).
Does not claim Enterprise GA.
Tip (Windows WHPX writable bind truncate): after libkrun 5302041, guest
printf short > host-file truncates correctly (win_otrunc_bind_tip=pass).
Does not claim Enterprise GA or Linux UID/GID storage on Windows binds.
Tip (MicroVM egress on WSL Bridge / passt_bridge): default profile denies
link-local metadata; first-match --egress deny:1.1.1.1/32 denies that IP while
a control run without deny fetches public HTTP (wsl_microvm_egress_tip=pass).
Keep-authority Sandbox Bridge now installs the same packet-field FORWARD filter
on Linux (unit-proven); WSL tip-prove still needs interactive sudo on this host.
Does not claim Sandbox≈MicroVM or Enterprise GA.
An offline install must supply the release tag and a trusted SHA-256 value. The archive must retain its published root directory and target-specific layout.
Linux or macOS:
sh ./install.sh \
--version v3.3.0 \
--archive ./a3s-box-v3.3.0-linux-x86_64.tar.gz \
--sha256 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdefWindows:
.\install.ps1 `
-Version v3.3.0 `
-ArchivePath .\a3s-box-v3.3.0-windows-x86_64.zip `
-Sha256 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdefReplace the example digest with the value published for that release. The
online path reads the digest from GitHub release metadata and falls back to the
asset's .sha256 manifest. It never installs a download that lacks a valid
digest.
Every successful install writes .a3s-box-install.json inside the destination.
A later run may replace a directory carrying that marker. A non-empty directory
without the marker is left untouched unless --force or -Force is explicit.
Force never permits replacing a filesystem root, user-profile root, or known
system directory.
The new package is copied to a sibling staging directory and its executable is checked before activation. If activation or the final version check fails, the previous managed directory is restored.
On Unix, the installer manages one marked block in the selected shell profile.
On Windows, it adds the installation directory to the per-user PATH without
using setx, so an existing long PATH is not truncated.
Delete the exact installation directory shown by the installer. On Unix,
remove the block between # >>> a3s-box installer >>> and
# <<< a3s-box installer <<< from the shell profile it reported. On Windows,
remove that same installation directory from the user PATH. Runtime state
stored elsewhere is intentionally not deleted by uninstalling the binaries.