OviOS Storage Controller

Administrator Guide — Complete operational reference
OviOS Linux 6.2 System Administrators ZFS · iSCSI · NFS · SMB
← Home ← Back to Docs

1 Introduction

OviOS Linux v6 is a purpose-built ZFS-based storage appliance operating system. It is designed to be configured entirely through a guided shell interface — no Linux expertise is required for day-to-day administration. Every major operation has an interactive wizard that walks you through each step.

What OviOS Can Do

iSCSIPresent block storage to VMware ESXi, Windows, Linux
NFSShare filesystems with Linux and Unix clients
SMB/CIFSShare filesystems with Windows and macOS clients
S3Host an S3-compatible object storage endpoint
ZFS PoolsRAID, snapshots, replication, scrub, and compression
ovios-webWeb monitoring interface and PDF health reports
Active DirectoryJoin a domain for integrated Windows authentication
ReplicationReplicate LUNs and volumes to a secondary site
💡

Key design principle: Just run the command and follow the prompts. You rarely need to memorize syntax — OviOS guides you step-by-step through every operation.

2 Network Configuration

2.1 Interface Setup — netsetup

netsetup configures physical interfaces (and bonds/VLANs) for systemd-networkd. Use --text for non-interactive scripted mode.

DHCP

netsetup --text --iface enp1s0 --method dhcp

Static IP

netsetup --text --iface enp1s0 --method static \
  --address 192.168.10.20 --prefix 24 \
  --gateway 192.168.10.1 \
  --dns 1.1.1.1 9.9.9.9

Fix Speed / Duplex

netsetup --text --iface enp1s0 --method dhcp --speed 1000 --duplex full

Remove Persistent Link Tuning

netsetup --text --iface enp1s0 --method dhcp --clear-link-tuning
⚡

For maximum iSCSI or NFS throughput, set MTU 9000 (jumbo frames) on storage-dedicated interfaces. Ensure your switch supports jumbo frames end-to-end.

2.2 Network Bonding — bondadm

Bonding combines multiple physical NICs into one logical interface for redundancy and/or throughput aggregation.

Mode Name Use Case
0 balance-rr Round-robin load balancing (requires switch config)
1 active-backup Failover only — simplest and most compatible
4 802.3ad (LACP) Active load balancing + failover; requires switch LACP support
6 balance-alb Adaptive load balancing; no switch config needed

Create a Bond (LACP)

bondadm -n bond0 -m 4 -i enp1s0 -i enp2s0

Create a Bond (Active-Backup)

bondadm -n bond0 -m 1 -i enp1s0 -i enp2s0

Assign IP to Bond

netsetup --text --iface bond0 --method static \
  --address 192.168.10.20 --prefix 24 --gateway 192.168.10.1

List / Remove Bonds

bondadm -l           # list all bonds
bondadm -r bond0    # remove bond
ℹ️

bondadm writes a fallback 99-*.network file. Always run netsetup afterward to create a properly numbered profile (e.g. 20-bond0.network) that takes precedence.

2.3 VLANs — vlanadm

Creates tagged VLAN sub-interfaces on top of a physical or bonded interface. Interactive mode is recommended — you will be prompted for parent interface, VLAN name, and VLAN ID.

vlanadm                           # interactive — recommended
vlanadm --remove VLAN_NAME       # remove a VLAN

# Assign IP after creation:
netsetup --text --iface vlan10 --method static --address 10.10.10.1 --prefix 24

3 Command Reference Overview

Access the full command list at any time from the OviOS shell by typing ?. The most commonly used commands are listed below.

Command Purpose
pool Create and manage ZFS storage pools
zfs-admin View and change tunable ZFS dataset properties (compression, recordsize, quota ...). OviOS-managed properties are locked: ovios:* and ret:*, sizes owned by vol/lun, shares, and readonly/mountpoint/canmount on replicated or clustered datasets. Run it with no arguments for the interactive editor, or zfs-admin set tank/vol01 compression=lz4
lun Create, map, resize, and delete iSCSI LUNs
lun_setup Interactive wizard: create LUN → map to target in one flow
target Create and manage iSCSI targets
vol Create ZFS datasets for NFS/SMB sharing
smb-export Add/remove SMB shares
nfs-export Add/remove NFS exports
smb-user Manage local SMB users
smb-join Join an Active Directory domain
service Start/stop/restart/status all OviOS services
options View and set system-wide options (ARC size, TRIM, ZIL, etc.)
snap Create and manage ZFS snapshots
retadm Configure volume/LUN replication tasks
listdsk / ld List physical disks
ovios Unified health check and service manager
sync-config Configuration backups (bo), partner sync (sync), restore, and the 6.2 stateless saves (persist, persist-status)
restore Restore pool attributes and LUN mappings after a crash (restore all)
send-logs Collect and email diagnostic logs
sensors View hardware temperatures, fan speeds, voltages
htop Interactive process monitor

4 Listing Disks

Before creating pools, inspect available disks using listdsk (or its alias ld).

listdsk           # full details (default)
listdsk --free    # only disks not assigned to any pool
listdsk simple   # name and size only
listdsk by-id    # persistent /dev/disk/by-id/ paths
listdsk by-path  # persistent /dev/disk/by-path/ paths
💡

Use listdsk by-id to identify disks by serial number before you build a pool — it avoids picking the wrong disk on systems with many drives. You can type either kernel names (sdb) or /dev/disk/by-id/ names in pool create; the names must match exactly. ZFS finds pool members by their on-disk labels, so a pool still imports if kernel names change after a reboot.

5 Services Management

Interactive Service Manager

Run service and use the arrow keys to select a service, then choose start, stop, restart, or status.

service

Full Status Dashboard

service   # then select → status-all
SERVICE      STATUS             WORKLOAD / DETAILS
SSH          ONLINE    Listening on port 22
OVIOS-WEB    ONLINE    -
SMB          ONLINE    1 Connected Users
NFS          ONLINE    -
ISCSI        ONLINE    0 Active Sessions
SMARTD       OFFLINE   -

Recommended Services to Enable

Service Why
ovios-web Web dashboard and PDF health report generation
smartd Continuous disk health monitoring with email alerts
prometheus Prometheus on port 9090, for metrics and Grafana (options prometheus.enable on)
ntp Time synchronization — required for Active Directory and log accuracy
s3 Object storage endpoint (if needed)
auditd Security event logging
options smartd.enable on   # enable S.M.A.R.T. monitoring
send-logs                     # collect and email diagnostic logs

6 Creating Storage Pools

What Is a Pool?

A ZFS storage pool is the top-level storage container. It is built from one or more physical disks organized into a RAID layout. All LUNs and volumes live inside pools.

RAID Layouts

stripe

No Redundancy

1+ drives. Maximum space, zero fault tolerance. Development use only.

raidz1

1 Disk Tolerance

3+ drives. Good balance of space and protection for general workloads.

raidz3

3 Disk Tolerance

5+ drives. Highest fault tolerance. Best for archival and compliance workloads.

Creating a Pool

pool create

The wizard prompts you for a pool name, RAID layout, and which disks to include. That is all.

⚠️

If pool creation is interrupted and mirror vdevs were partially initialized, you need to wipe affected disks before retrying. Enter the system shell via su-ovios, then run:

# Replace sdX with each affected disk
sudo wipefs -af /dev/sdX

Pool Commands

pool list      # show all pools with health and capacity
pool status    # detailed pool status including vdev tree
pool health    # quick health summary across all pools
pool extend    # add vdevs to grow an existing pool online
pool modify    # add and remove spare, read cache (L2ARC) and log (SLOG) devices
pool delete    # destroy a pool — irreversible, all data lost

7 iSCSI Targets

What Is an iSCSI Target?

iSCSI presents block-level storage over an IP network. The target is the server side (OviOS) that exports one or more LUNs. The initiator is the client — VMware ESXi, Windows Server, Linux — that connects and sees the LUN as a locally attached disk.

Every target has a unique IQN (iSCSI Qualified Name) automatically generated by OviOS:

iqn.YYYY-MM.org.ovios:<unique-id>-<your-name>
ℹ️

Targets with no LUNs mapped to them will not appear in the OviOS web interface. Always map at least one LUN to a target for it to be visible.

Creating a Target

target create

Example session:

Enter a custom target name: tg-esx01
Creating Target iqn.2026-05.org.ovios:lxh5jtu1zf9u-tg-esx01 ...
Define an initiator for this target? [y/n] (Default: n): y
Enter the IQN (e.g., iqn.1991-05.com.microsoft:client1) or the IP address of the initiator: 192.168.10.50
Add another initiator? [y/n] (Default: n): n

The iSCSI service must be running (options iscsi.enable on) to create or change targets.

⚠️

If you skip the initiator restriction step, all initiators on the network can connect. Always restrict access in production environments.

Target Commands

target list           # show all targets with IDs and IQNs
target show           # detailed view including mapped LUNs and initiators
target remove         # delete a target (only when no LUNs are mapped)
target bind           # allow an initiator (IQN or IP) on a target
target unbind         # remove an initiator from a target
target chap           # add or remove incoming, outgoing and mutual CHAP accounts (6.2)
target edit [nano|vim] # edit raw target configuration

CHAP Authentication (6.2)

target chap opens a menu to require a username and password from initiators (incoming CHAP), to have the target prove itself to initiators (outgoing CHAP), or both (mutual CHAP). Passwords are entered masked and stored in /etc/tgt/chap.secrets (root only); targets.conf only names the users. CHAP accounts are included in configuration sync, backups and stateless saves.

8 LUNs — iSCSI Block Storage

What Is a LUN?

A LUN (Logical Unit Number) is a virtual block device carved from a ZFS pool and exported through an iSCSI target. From the initiator's perspective, it looks exactly like a locally attached hard disk.

Thin vs. Thick Provisioning

Type Description Use Case
Thin Space allocated only as data is written. LUN appears larger than actual consumed space. Most VM deployments; efficient pool utilization
Thick All space pre-allocated immediately at creation. Latency-sensitive workloads; guaranteed reservation
💡

Use thick provisioning for most workloads to avoid performance issues as pools fill up. Keep pools below 80% to maintain ZFS performance.

Creating a LUN

lun create              # fully interactive
lun create esx/lun02   # shortcut — skips pool/name prompts

You will be prompted for size (e.g. 50g, 1t) and provisioning type.

Mapping a LUN to a Target

A LUN must be mapped to an iSCSI target before initiators can use it. The recommended all-in-one approach is:

lun_setup   # guided: create LUN → map to target in one flow
ℹ️

The target must already exist before running lun_setup. If you need to map an existing LUN separately, use lun map.

LUN Commands Reference

lun list        # all LUNs with size, provisioning, mapping status
lun mappings    # all active target→LUN mappings
lun map         # map a LUN to an iSCSI target
lun umap        # unmap a LUN from a target
lun resize      # expand a LUN online (no downtime on most OS)
lun clone       # full, independent copy of a LUN (zfs send/receive)
lun info        # detailed LUN properties
lun delete      # permanently destroy a LUN — always umap first
# Example: lun mappings output
ID   TARGET IQN                                     LUN   PATH            STATUS
4    iqn.2026-05.org.ovios:...-tg-01-esx             1     /esx/lun01      IDLE
5    iqn.2026-05.org.ovios:...-vmware                1     /data/vms_lun   IDLE

Reclaiming Space: Thin LUNs, Discard and UNMAP (6.2)

Thin LUNs support SCSI UNMAP. When a client deletes data and sends discard / UNMAP commands, the freed blocks are returned to the pool, so a thin LUN only uses the space that holds live data.

Choose thin at the LUN type prompt of lun create (or lun_setup). UNMAP is enabled automatically for thin LUNs only. Thick LUNs keep their full reservation and never advertise UNMAP; the opt-out property below has no effect on them.

Every thin LUN is opted in by default. To opt one out, or back in, set the ZFS property on its volume (from the system shell, su-ovios):

sudo zfs set ovios:thin_provisioning=off <pool/lun>   # opt this thin LUN out of UNMAP
sudo zfs inherit ovios:thin_provisioning <pool/lun>   # opt it back in (default)
zfs get ovios:thin_provisioning <pool/lun>         # off = opted out, - = opted in
⚠️

The change takes effect only after you unmap and re-map the LUN. Changing the property on a mapped LUN does nothing until then. Stop client I/O first, run lun umap, then lun map to the same target, and rescan the disk on the client so it sees the new setting. The re-mapped LUN may get a different LUN ID; check it with lun mappings.

ClientHow it reclaims space
Linuxfstrim -av (or the fstrim.timer), or mount with the discard option
WindowsAutomatic delete notifications; or run Optimize Drives / Optimize-Volume -ReTrim
VMware ESXiAutomatic space reclamation on VMFS 6 datastores, or esxcli storage vmfs unmap

Older clients without UNMAP support can zero free space instead (for example sdelete -z on Windows); with ZFS compression enabled, zeroed blocks take no pool space.

ℹ️

options zfs.trim.enable is a different setting: it lets the pool pass TRIM to its own SSDs. Enable it on SSD-backed pools; it is not needed for client UNMAP.

9 Volumes — File-Based Sharing (NFS & SMB)

What Is a Volume?

A volume in OviOS is a ZFS dataset — a mountable filesystem exported over the network via NFS or SMB. Unlike LUNs (block devices), volumes are accessed as standard network file shares.

Creating a Volume

vol create                  # fully interactive
vol create data/myshare    # shortcut — skips pool/name prompts

You are asked for a size. It is set as both the quota and the reservation: the space is reserved in the pool immediately, so the volume can always grow to that size. If the volume already exists, OviOS exits gracefully with an error rather than overwriting data.

vol list     # all volumes with size and availability
vol resize   # change a volume's size (quota and reservation)
vol clone    # full, independent copy of a volume (zfs send/receive)
vol delete   # remove a volume and all its data

NFS Exports

NFS is the standard protocol for sharing filesystems with Linux and Unix clients.

nfs-export add data/myshare      # add export (interactive prompts for options)
nfs-export list                   # list active exports
nfs-export remove data/myshare   # remove export

Default options applied: rw,no_root_squash,no_subtree_check

Option Meaning
rw Read-write access
ro Read-only access
no_root_squash Root on the client has root-equivalent access on the share
root_squash Root on the client is mapped to anonymous user (more secure)
no_subtree_check Disables subtree checking — improves reliability for most setups
sync Writes acknowledged only after committed to disk (safer)
async Writes acknowledged before committing to disk (faster, less safe)

SMB/CIFS Shares

SMB is the standard protocol for Windows file sharing, also supported natively by macOS and Linux.

Without Active Directory (Local Users)

# Step 1 — create a local SMB user
smb-user add username home_share_path

# Step 2 — share a volume with that user
smb-export add /data/myshare username

# Manage shares
smb-export list
smb-export remove data/myshare

With Active Directory

smb-join   # select option 1, provide domain, DC, and admin credentials

OviOS handles the Kerberos ticket and Samba configuration automatically. Once joined, use smb-export add to share a volume, then assign permissions from the Windows side using standard ACL tools (Security tab on share properties).

smb-join          # option 3 — renew Kerberos ticket if auth stops working
ovios ad status   # check AD join status

10 Centralized Management with ovios

The ovios command is a single entry point for the most common administrative tasks and a quick health check of your entire system.

ovios smb list           # list SMB exports
ovios smb add            # add SMB export
ovios nfs list           # list NFS exports
ovios nfs add pool/data # add NFS export
ovios ad join            # join Active Directory
ovios ad status          # check AD status
ovios user add           # add local SMB user
ovios hc                 # full storage health check

Health Check

ovios hc is the single most useful command for situational awareness. Run it after any configuration change or when troubleshooting.

ovios hc

Reports in a single output: all service statuses, AD join state, SMB/NFS share consistency, all LUN mappings with sizes and provisioning, and ZFS pool health with error counters.

11 Configuration Backup & Disaster Recovery

🛡️ How OviOS Protects Your Data

OviOS stores your data on ZFS pools — completely separate from the OS system disk. This means:

  • A system disk failure does not affect your storage data
  • You can reinstall OviOS or start in RAM and restore all settings from a backup in seconds and fully recover by running a single command
  • iSCSI targets, LUN mappings, share definitions, and pool attributes are all restored automatically

Full recovery from OS disk failure = reinstall OviOS (or boot into RAM) + restore config from a backup + run restore all. That's it. With OviOS 6.2 it is even simpler: boot with ovios.autorestore=1 and the configuration is restored from your pools automatically (Stateless Operation).

11.1 Automatic Configuration Saves (6.2)

From OviOS 6.2, every configuration change is saved automatically to a hidden dataset on each data pool (.ovios-system), as a ZFS snapshot per change. Nothing to schedule:

sync-config persist          # save now
sync-config persist-status   # saved generations per pool

11.2 Configuration Backup Archives

In addition, you can write a backup archive (.tar.gz) to the osbackup dataset of system.backup.pool (or /tmp/osbackup if no backup pool is set):

sync-config bo             # backup-only: create an archive
sync-config list-backups   # list archives
sync-config sync           # push the configuration to replication partners
💡

Run sync-config bo after creating or modifying pools, targets, LUNs, or shares, changing system options, or joining/leaving Active Directory — or schedule it (11.4).

11.3 Restoring After a Crash

After reinstalling OviOS on a new or repaired system disk:

  1. Import your pools. OviOS detects existing pools on connected disks and prompts you to import them on first boot. Or run manually:
  2. options skip.import off
    service zfs  start
    sync-config restore
  3. Restore OviOS configuration. This reads metadata from the imported pools and reconstructs all iSCSI targets, LUN mappings, pool attributes, and share/export configurations:
  4. restore all   # apply ovios specific flags on pools, targets, LUNs, exports, ...
  5. Restart services and verify.
  6. ovios hc   # verify everything is back online

11.4 Automated Configuration Backup

Schedule backup archives so they are always current — strongly recommended in production:

edit-cron   # edit system cron table
```
5 0 * * * /usr/bin/os sync-config bo  # backup at 5 minutes past midnight every day
```

And enable the cron service with the options command.

options cron.enable on

Or use the APIs to setup your own backup script with notifications, etc

11.5 Snapshot-Based Protection

ZFS snapshots protect against accidental deletion or data corruption. They are separate from the system-level configuration backup described above.

snap   # interactive wizard: choose volume/LUN, name snapshot, schedule

Snapshots are instant and space-efficient (copy-on-write). For off-site protection, use retadm to configure ZFS replication to a secondary OviOS system.

ℹ️

Snapshots protect against accidental changes. Your RAID layout protects against disk failure. Both are needed — they serve different purposes.

12 Advanced Operations & Best Practices

12.1 ZIL and SLOG

The ZFS Intent Log (ZIL) protects synchronous write operations against power loss. It is enabled by default and should remain enabled unless you have UPS protection.

options zfs.zil.disable poolname  # disable ZIL — only with UPS protection
options zfs.zil.disable reset     # re-enable ZIL for all pools
💡

For high-throughput workloads with many small synchronous writes (databases, VMware), adding a dedicated NVMe or Optane SLOG device to the pool dramatically improves write performance while maintaining full data integrity.

12.2 ARC Cache Tuning

The ZFS Adaptive Replacement Cache (ARC) uses system RAM to cache frequently read data. Correct sizing is the single largest performance lever in ZFS.

ovios hc                    # view current ARC stats
options arc.size 70         # set ARC to 70% of RAM
Scenario Recommended ARC %
Dedicated NAS/SAN appliance 60–80% of RAM
System also runs other services 40–60%
Minimum safe value 25% — never go below this

12.3 Performance Best Practices

Storage Layout

  • Use mirrors for VM datastores — best random IOPS and lowest latency
  • Use raidz2 for backup targets and bulk storage — best capacity with good resilience
  • Keep pool utilization below 80% — ZFS fragmentation increases sharply above this threshold

Network

  • Dedicate a separate NIC (or bond) to storage traffic — keep it off the management network
  • Enable jumbo frames (MTU 9000) on storage NICs and switches for 10–15% throughput improvement
  • For Windows SMB clients on multi-NIC systems, enable SMB Multichannel (requires Windows 8 / Server 2012+):
options smb.multichannel on

Disk Maintenance

  • Turn on the monthly ZFS scrub (options zfs.scrub.auto on) to detect and correct silent data corruption
  • Enable smartd to receive email alerts before a disk fails
  • After a disk replacement, OviOS automatically begins resilver (RAID rebuild) — monitor with pool status
  • Enable AutoTRIM on SSD-backed pools:
options zfs.trim.enable poolname

Compression

ZFS LZ4 compression is CPU-cheap and often improves throughput on compressible data (VM images, logs, databases). Compression is a ZFS dataset property; pool modify does not change it. Check or set it from the system shell (su-ovios), for example sudo zfs set compression=lz4 poolname; child volumes and LUNs inherit it.

12.4 Replication

retadm manages ZFS send/receive replication to a secondary OviOS system for off-site disaster recovery. Replication sends incremental snapshots over SSH and provides near-zero RPO with a fully independent copy of your data at a secondary site.

retadm   # interactive replication task manager

⚡ Quick Reference Card

Task Command
Check all services & health ovios hc
List pools pool list
List all disks listdsk
List free disks only listdsk --free
Create pool pool create
Create LUN lun create
Create LUN + map to target lun_setup
View LUN mappings lun mappings
Create iSCSI target target create
Create volume vol create
Add NFS share nfs-export add pool/volname
Add SMB share smb-export add /pool/volname user
Backup config sync-config bo (saves to the pools are automatic: sync-config persist-status)
Restore config after crash sync-config restore, then restore all (or boot with ovios.autorestore=1)
Create snapshot snap
View service status service → status-all
View all commands ?