Systems Operators
Copy-paste command reference for kldloadOS operations.
No explanations. Just commands. For someone who already has kldload running and needs to get things done.
Build & Deploy
# Full rebuild from scratch
./deploy.sh clean && ./deploy.sh builder-image && PROFILE=desktop ./deploy.sh build
# Build ISO only (uses cached darksites)
PROFILE=desktop ./deploy.sh build
# Deploy to KVM + Proxmox + print USB command
./deploy.sh deploy-all
# Full pipeline: build + deploy + burn + upload
./rebuild-all.sh
USB Operations
# One-liner: download + burn + eject (replace /dev/sdX)
curl -L -o /tmp/kldload.iso https://dl.kldload.com/kldload-free-latest.iso && \
dd if=/tmp/kldload.iso of=/dev/sdX bs=4M status=progress oflag=sync conv=fsync && \
sync && eject /dev/sdX
# Burn local ISO
dd if=kldload-free-*.iso of=/dev/sdX bs=4M status=progress oflag=sync conv=fsync && sync
# Quick wipe USB (no zerofill — 2 seconds)
wipefs -a /dev/sdX && sgdisk --zap-all /dev/sdX
# Verify checksum
sha256sum -c kldload-free-latest.iso.sha256
KVM / libvirt
# Create a VM from the ISO
virt-install --name kldload-vm1 --ram 4096 --vcpus 4 \
--disk path=/var/lib/libvirt/images/kldload-vm1.qcow2,size=40,format=qcow2 \
--cdrom /var/lib/libvirt/images/kldload-free-latest.iso \
--os-variant centos-stream9 --network network=default \
--graphics vnc,listen=0.0.0.0 \
--boot uefi,firmware.feature0.enabled=no,firmware.feature0.name=secure-boot \
--noautoconsole
# Batch create 4 VMs
for i in 1 2 3 4; do
virt-install --name kldload-test${i} --ram 4096 --vcpus 4 \
--disk path=/var/lib/libvirt/images/kldload-test${i}.qcow2,size=40,format=qcow2 \
--cdrom /var/lib/libvirt/images/kldload-free-latest.iso \
--os-variant centos-stream9 --network network=default \
--graphics vnc,listen=0.0.0.0 \
--boot uefi,firmware.feature0.enabled=no,firmware.feature0.name=secure-boot \
--noautoconsole
done
# List VMs + VNC ports
virsh list --all
for vm in $(virsh list --all --name); do
echo "$vm → VNC $(virsh vncdisplay $vm 2>/dev/null)"
done
# Get VM IPs
virsh net-dhcp-leases default
# Get specific VM IP
virsh domifaddr kldload-vm1
# Console access
virsh console kldload-vm1 # serial (Ctrl+] to exit)
virsh vncdisplay kldload-vm1 # VNC port
# Lifecycle
virsh start kldload-vm1
virsh shutdown kldload-vm1 # graceful
virsh destroy kldload-vm1 # force stop
virsh reboot kldload-vm1
virsh autostart kldload-vm1 # start on host boot
# Destroy specific VM + disk
virsh destroy kldload-vm1 && virsh undefine kldload-vm1 --nvram --remove-all-storage
# Destroy ALL VMs
for vm in $(virsh list --all --name); do
virsh destroy "$vm" 2>/dev/null
virsh undefine "$vm" --nvram --remove-all-storage 2>/dev/null
done
# CoW clone from golden image (instant, near-zero space)
qemu-img create -f qcow2 -b golden.qcow2 -F qcow2 clone-1.qcow2
# Resize VM disk
virsh shutdown kldload-vm1
qemu-img resize /var/lib/libvirt/images/kldload-vm1.qcow2 +20G
# Live migration to another host
virsh migrate --live kldload-vm1 qemu+ssh://other-host/system
Proxmox
# Upload ISO + create VM
scp kldload-free-*.iso root@proxmox:/var/lib/vz/template/iso/
# Create VM (q35, host CPU, OVMF, TPM, virtio-scsi)
ssh root@proxmox "qm create 900 --name kldload \
--machine q35 --cpu host --cores 4 --memory 4096 --balloon 0 \
--bios ovmf --efidisk0 local-zfs:1,efitype=4m \
--tpmstate0 local-zfs:1,version=v2.0 \
--scsi0 local-zfs:40,discard=on,iothread=1,ssd=1 \
--scsihw virtio-scsi-single \
--ide2 local:iso/kldload-free-latest.iso,media=cdrom \
--net0 virtio,bridge=vmbr0 \
--serial0 socket \
--boot order='ide2;scsi0' --ostype l26 \
&& qm start 900"
# Clone a VM on Proxmox
ssh root@proxmox "qm clone 900 901 --name kldload-clone --full"
# Start / stop / destroy
ssh root@proxmox "qm start 900"
ssh root@proxmox "qm stop 900"
ssh root@proxmox "qm destroy 900 --purge"
# Import qcow2 as disk
ssh root@proxmox "qm importdisk 900 /var/lib/vz/images/kldload.qcow2 local-zfs"
ZFS Operations
# ── Snapshots ──
# Snapshot all datasets recursively
zfs snapshot -r rpool@$(date +%Y%m%d-%H%M%S)
# Snapshot a specific dataset
zfs snapshot rpool/srv/data@before-change
# List all snapshots (newest first)
zfs list -t snapshot -o name,used,creation -S creation
# Rollback
zfs rollback rpool/srv/data@before-change
# Destroy a snapshot
zfs destroy rpool/srv/data@before-change
# Destroy all snapshots matching a pattern
zfs list -t snapshot -H -o name | grep "pattern" | xargs -n1 zfs destroy
# ── Cloning ──
# Instant CoW clone
zfs snapshot rpool/srv/prod@clone-src
zfs clone rpool/srv/prod@clone-src rpool/srv/staging
# Promote a clone to independent dataset
zfs promote rpool/srv/staging
# ── Replication ──
# Full send to remote
zfs snapshot -r rpool@replicate
zfs send -R rpool@replicate | ssh backup-server zfs receive -F tank/backup
# Incremental send
zfs snapshot -r rpool@snap2
zfs send -R -i rpool@snap1 rpool@snap2 | ssh backup-server zfs receive -F tank/backup
# Compressed send
zfs send -R rpool@snap | zstd -3 | ssh backup-server "zstd -d | zfs receive -F tank/backup"
# Syncoid (automated — handles incrementals)
syncoid -r rpool backup-server:tank/backup
# ── Pool Operations ──
# Pool health
zpool status rpool
zpool list
# Scrub (verify all checksums)
zpool scrub rpool
# Pool I/O stats (live, 2 second interval)
zpool iostat rpool 2
# ARC cache stats
cat /proc/spl/kstat/zfs/arcstats | grep -E "^hits|^misses|^size"
# Set ARC max (4GB)
echo "options zfs zfs_arc_max=4294967296" > /etc/modprobe.d/zfs-arc.conf
# ── Datasets ──
# Create dataset
zfs create -o mountpoint=/srv/myapp -o compression=lz4 rpool/srv/myapp
# Create with quota
zfs create -o mountpoint=/srv/db -o recordsize=8k -o quota=100G rpool/srv/db
# List all datasets
zfs list -o name,used,avail,compress,mountpoint
# Check compression ratio
zfs get compressratio rpool
# Change compression
zfs set compression=zstd rpool/srv/archive
# Destroy dataset
zfs destroy rpool/srv/test
# ── Boot Environments ──
# Create boot environment
zfs snapshot rpool/ROOT/default@before-upgrade
# List boot environments
zfs list -r rpool/ROOT -o name,used,mountpoint
# Set active boot environment
zpool set bootfs=rpool/ROOT/default rpool
# Rollback to previous BE
zfs rollback rpool/ROOT/default@before-upgrade
WireGuard
# Generate keypair
umask 077 && wg genkey | tee /etc/wireguard/private.key | wg pubkey > /etc/wireguard/public.key
# Generate pre-shared key (post-quantum protection)
wg genpsk > /etc/wireguard/psk.key
# Start / stop / enable at boot
systemctl enable --now wg-quick@wg0
systemctl stop wg-quick@wg0
wg-quick up wg0
wg-quick down wg0
# Show all interfaces + handshakes
wg show
# Show transfer stats
wg show wg0 transfer
# Show latest handshakes
wg show wg0 latest-handshakes
# Add peer live (no restart)
wg set wg0 peer <pubkey> allowed-ips 10.200.0.5/32 endpoint 1.2.3.4:51820 persistent-keepalive 25
# Remove peer live
wg set wg0 peer <pubkey> remove
# Dump running config
wg showconf wg0
# Save running config to file
wg showconf wg0 > /etc/wireguard/wg0.conf
# Start 4 WireGuard planes (cluster mode)
for iface in wg0 wg1 wg2 wg3; do systemctl enable --now wg-quick@${iface}; done
# Check all planes
for iface in wg0 wg1 wg2 wg3; do echo "=== $iface ===" && wg show $iface; done
Image Export
# Export to specific format
kexport qcow2 # KVM / Proxmox / OpenStack
kexport raw # dd-ready / AWS import
kexport vhd # Azure / Hyper-V
kexport vmdk # VMware ESXi / vSphere
kexport ova # VMware / VirtualBox portable
kexport all # all five formats
# Export with custom name
KEXPORT_NAME=myserver kexport qcow2
# Upload raw to AWS as AMI
kexport raw
aws s3 cp kldload-export-*.raw s3://my-images/
aws ec2 import-image \
--disk-containers "Format=RAW,UserBucket={S3Bucket=my-images,S3Key=kldload-export-*.raw}" \
--boot-mode uefi
# Upload VHD to Azure
kexport vhd
az storage blob upload --account-name myaccount --container images \
--name kldload.vhd --type page --file kldload-export-*.vhd
az image create --resource-group mygroup --name kldload \
--os-type Linux --source https://myaccount.blob.core.windows.net/images/kldload.vhd
# Convert between formats manually
qemu-img convert -f qcow2 -O raw input.qcow2 output.raw
qemu-img convert -f raw -O vmdk -o subformat=streamOptimized input.raw output.vmdk
Fleet Operations
# Run command on multiple nodes
for ip in 10.200.0.{1..16}; do
echo "=== $ip ==="
ssh admin@$ip 'zpool status rpool | head -5' 2>&1
done
# Check pool health across fleet
for ip in 10.200.0.{1..16}; do
health=$(ssh admin@$ip 'zpool list -H -o health rpool' 2>/dev/null)
echo "$ip: $health"
done
# Patch a file on all nodes
for ip in 10.200.0.{1..16}; do
scp bootstrap.sh admin@$ip:/tmp/
ssh admin@$ip "sudo cp /tmp/bootstrap.sh /usr/lib/kldload-installer/lib/bootstrap.sh"
done
# Snapshot all nodes before upgrade
for ip in 10.200.0.{1..16}; do
ssh admin@$ip "sudo zfs snapshot -r rpool@pre-upgrade-$(date +%Y%m%d)" &
done; wait
# Rolling upgrade
for ip in 10.200.0.{1..16}; do
echo "=== Upgrading $ip ==="
ssh admin@$ip "sudo zfs snapshot -r rpool@pre-upgrade && sudo kupgrade"
sleep 5
done
# Verify all nodes
for ip in 10.200.0.{1..16}; do
echo "=== $ip ==="
ssh admin@$ip 'hostname; zpool list -H -o health rpool; zfs list -H -o name | wc -l; uname -r'
done
# Copy SSH key to all nodes
for ip in 10.200.0.{1..16}; do
ssh-copy-id admin@$ip
done
kldloadOS Tools (Desktop & Server profiles)
# System health dashboard
kst
# Snapshot all key datasets
ksnap
# Snapshot specific path
ksnap /home
# List snapshots
ksnap list
# Rollback
ksnap rollback /home
# Boot environment management
kbe list
kbe create before-upgrade
kbe activate before-upgrade
kbe delete old-be
# Instant clone
kclone /srv/prod /srv/staging
# ZFS-aware disk usage
kdf
# Create ZFS dataset (instead of mkdir)
kdir /srv/myproject
kdir -o compression=zstd -o quota=50G /srv/archive
# Universal package manager (auto-detects apt/dnf, snapshots first)
kpkg install nginx
kpkg remove nginx
kpkg search redis
kpkg update
kpkg upgrade
kpkg list
kpkg info nginx
# Safe system upgrade (creates boot environment first)
kupgrade
# Disaster recovery (boot from kldload ISO)
krecovery import rpool
krecovery list-be
krecovery activate <snapshot>
krecovery chroot
krecovery reinstall-bootloader /dev/sda
krecovery export-logs /mnt/usb
eBPF / Observability
# Trace every process launched
execsnoop
# Trace file opens
opensnoop
# TCP connections with PID
tcpconnect
# TCP sessions with duration + bytes
tcplife
# TCP retransmits (network problems)
tcpretrans
# Disk I/O latency histogram
biolatency
# Slow file operations (>10ms)
fileslower 10
# Per-process I/O
biotop
# Cache hit rate
cachestat
# CPU scheduler latency
runqlat
# ZFS slow operations (>1ms)
zfsslower 1
# Custom bpftrace: who is opening files?
bpftrace -e 'tracepoint:syscalls:sys_enter_openat { printf("%s %s\n", comm, str(args.filename)); }'
# Count syscalls by process
bpftrace -e 'tracepoint:raw_syscalls:sys_enter { @[comm] = count(); }'
# Histogram of read sizes
bpftrace -e 'tracepoint:syscalls:sys_exit_read /args.ret > 0/ { @bytes = hist(args.ret); }'
# Packet count per WireGuard interface
bpftrace -e 'tracepoint:net:net_dev_xmit /str(args.name) == "wg0"/ { @packets = count(); }'
Networking
# Set static IP
nmcli connection modify "Wired connection 1" \
ipv4.method manual ipv4.addresses 10.100.10.50/24 \
ipv4.gateway 10.100.10.1 ipv4.dns "1.1.1.1"
nmcli connection up "Wired connection 1"
# Switch to DHCP
nmcli connection modify "Wired connection 1" ipv4.method auto
nmcli connection up "Wired connection 1"
# Create bridge for VMs
nmcli connection add type bridge ifname br0 con-name br0 \
ipv4.method manual ipv4.addresses 10.100.10.50/24 \
ipv4.gateway 10.100.10.1 ipv4.dns "1.1.1.1"
nmcli connection add type bridge-slave ifname eth0 master br0
nmcli connection up br0
# Firewall — open ports (CentOS/RHEL)
firewall-cmd --permanent --add-port=8080/tcp
firewall-cmd --permanent --add-port=51820/udp
firewall-cmd --permanent --zone=trusted --add-interface=wg0
firewall-cmd --reload
# Firewall — open ports (Debian)
nft add rule inet filter input tcp dport 8080 accept
nft add rule inet filter input udp dport 51820 accept
# Enable IP forwarding
sysctl -w net.ipv4.ip_forward=1
echo "net.ipv4.ip_forward = 1" > /etc/sysctl.d/99-forwarding.conf
Unattended Install
# Create answers file
cat > /tmp/answers.env << 'EOF'
KLDLOAD_DISTRO=debian
KLDLOAD_DISK=/dev/vda
KLDLOAD_HOSTNAME=my-server
KLDLOAD_USERNAME=admin
KLDLOAD_PASSWORD=changeme
KLDLOAD_PROFILE=server
KLDLOAD_NET_METHOD=dhcp
KLDLOAD_TIMEZONE=UTC
EOF
# Run unattended install
kldload-install-target --config /tmp/answers.env
# Core profile (ZFS only, no tools)
KLDLOAD_PROFILE=core kldload-install-target --config /tmp/answers.env
# Manual storage mode (drops to shell for custom pool layout)
KLDLOAD_STORAGE_MANUAL=1 kldload-install-target --config /tmp/answers.env
R2 / Cloud Storage
# Upload ISO to R2
aws s3 cp kldload-free-*.iso s3://kldload-releases/kldload-free-latest.iso \
--endpoint-url https://YOUR_ACCOUNT.r2.cloudflarestorage.com --profile r2
# Upload checksum
sha256sum kldload-free-*.iso | sed 's|.*/|kldload-free-latest.iso |' > /tmp/latest.sha256
aws s3 cp /tmp/latest.sha256 s3://kldload-releases/kldload-free-latest.iso.sha256 \
--endpoint-url https://YOUR_ACCOUNT.r2.cloudflarestorage.com --profile r2
# List bucket
aws s3 ls s3://kldload-releases/ \
--endpoint-url https://YOUR_ACCOUNT.r2.cloudflarestorage.com --profile r2 --human-readable
Website Deploy
# Deploy website (git pull on hosting)
ssh -i ~/.ssh/kldload-deploy kldload.com@ssh.us.stackcp.com "cd ~/public_html && git pull"
# Check GitHub traffic
curl -s -H "Authorization: token TOKEN" \
"https://api.github.com/repos/kldload/kldload/traffic/clones" | jq '.count, .uniques'
Full documentation with tutorials and walkthroughs:
github.com/kldload/kldload/docs →