Requirements
- Go 1.24+ to build from source.
- An OpenNebula installation with XML-RPC API enabled (default port 2633).
- Credentials via
ONE_AUTHenvironment variable or~/.one/one_auth.
Installation
Pre-built binaries (recommended)
Download the zip for your platform from GitHub Releases:
unzip one9s-linux-amd64.zip
chmod +x one9s
Platforms: one9s-linux-amd64, one9s-linux-arm64, one9s-darwin-amd64, one9s-darwin-arm64, one9s-windows-amd64.exe.
From source
cd one9s
make build
Configuration
one9s looks for credentials in this order:
ONE_AUTH+ONE_XMLRPCenvironment variables~/.one9s/configfile (recommended)~/.one/one_authfile (legacy, OpenNebula CLI compatible)
Quick setup (recommended)
cat > ~/.one9s/config << 'EOF'
ONE_XMLRPC=http://opennebula:2633/RPC2
ONE_AUTH=oneadmin:password
EOF
chmod 600 ~/.one9s/config
./one9s
Config file format
~/.one9s/config is a simple KEY=VALUE file:
ONE_AUTH=oneadmin:password
Lines starting with # are comments. Blank lines are ignored.
Encrypted vault (recommended)
Store credentials encrypted with AES-256-GCM:
one9s vault init
# Run (prompts for vault password)
./one9s
# Skip vault with direct env vars
ONE_AUTH="oneadmin:password" ONE_XMLRPC="http://opennebula:2633/RPC2" ./one9s
| Command | Description |
|---|---|
one9s vault init | Create new encrypted config |
one9s vault encrypt | Encrypt existing plain config |
one9s vault decrypt | Decrypt and display contents |
one9s vault edit | Decrypt, edit in $EDITOR, re-encrypt (password rotation, endpoint change) |
Note: Vault password can be set via ONE_VAULT_PASS env var to skip the prompt. When ONE_AUTH + ONE_XMLRPC are set directly, vault is not used.
Alternative: environment variables
Note: If neither config file nor environment variables are set, one9s shows a clear error with setup instructions.
Usage & key bindings
one9s opens a tabbed TUI. Navigate tabs and interact with the data.
| Key | Action |
|---|---|
q / Ctrl+C | Quit |
tab | Next tab |
? | Help / back to VMs |
↑/↓ / j/k | Navigate rows |
PgUp/PgDn / b/f | Page up / page down |
g/G | Go to start / end |
enter | View details (VMs/Hosts split view) |
/ | Fuzzy search / filter (all tabs) |
F5 | Refresh current view |
VMs tab
All VMs with state, user, CPU, memory, IP and host. Split view with detail pane on the right. Press enter to load VM details. Filter by state (i active, o stopped, p poweroff, e error, a all) or use / for fuzzy text search.
Hosts tab
Cluster hosts with state, CPU%, memory%, running VMs. Enter to view host details with CPU/Memory progress bars. Enable, disable, offline, delete or rename hosts.
Datastores tab
Storage pools with type, total capacity, used and free space.
ACLs tab
Access control rules with decoded hex values: user, resource, rights and zone in human-readable format.
Quotas tab
User quotas for VMs, CPU, Memory, Running VMs, Images, Size and Leases.
VM Actions
Actions are performed on the selected VM. State-aware: invalid actions show an error.
| Key | Action | Valid States |
|---|---|---|
r | Reboot | ACTIVE only |
s | Stop | ACTIVE only |
u | Resume / Start | POWEROFF, SUSPENDED, STOPPED, UNDEPLOYED |
x | Suspend | ACTIVE only |
d | Terminate (hard) | Any state (with confirmation) |
State filters
| Key | Filter |
|---|---|
a | All VMs |
i | Active only (ACTIVE/*) |
o | Stopped (STOPPED, SUSPENDED, HOLD, DONE) |
p | Poweroff (POWEROFF, UNDEPLOYED) |
e | Error (CLONING_FAILURE, ACTIVE/*FAILURE*) |
Host Actions
| Key | Action | Confirmation |
|---|---|---|
e | Enable host | No |
d | Disable host | No |
o | Offline host | Yes (y/n modal) |
x | Delete host | Type yes to confirm |
n | Rename host | Type new name |
ACL Decoding
OpenNebula ACL rules are stored as hex values. one9s decodes them automatically:
| Field | Example | Decoded |
|---|---|---|
| User | 100000002 | #2 (UID 2) |
| User | 200000001 | @1 (GID 1) |
| User | 400000000 | * (all) |
| Resource | 20400000000 | HOST |
| Resource | 40100000065 | NET/#101 |
| Rights | f | USE+MANAGE+ADMIN+CREATE |
| Rights | 2 | MANAGE |
| Zone | 400000000 | * (all zones) |
Quotas
one9s shows per-user quotas fetched from one.user.info for each user. The table lists global VM quotas and a summary of datastore quotas. Press enter for the full breakdown, or e to edit.
- VMs, total VMs allocated
- CPU, CPU cores allocated
- Memory, Memory in MB
- Running, Currently running VMs
- Datastores, per-datastore SIZE and IMAGES limits (e.g.
1:10G)
Edit form is sectioned:
- Virtual machine quotas — VMs, CPU, memory, running limits, sys disk
- Datastore quotas (existing) — size MB + images per datastore that already has a quota
- Network quotas (existing) — leases per network that already has a quota
- Create datastore quota — one block: Datastore ID + Size MB + Images (all three apply to that ID)
- Create network quota — Network ID + Leases (both apply to that ID)
Note: Empty form fields keep the current limit. -1 = use default, -2 = unlimited. Per-resource quotas survive VM-only updates (OpenNebula merges section-wise).
Note: Quota data requires individual one.user.info calls per user. With many users, the first load may take a few seconds.
Networks
Tab 4:Net lists virtual networks with:
- ID, name, bridge, VN_MAD (dummy/bridge/vxlan/...)
- Lease usage
used/total(total = sum of AR sizes) - Owner
Use / to filter. Numbers 1–6 jump between tabs.