🌞 Oracle Solaris
All Solaris content — SPARC hardware, ZFS, LDOMs, Zones, Veritas Cluster, Kernel Debugging
| Area | Solaris 10 | Solaris 11 |
|---|---|---|
| Patching | patchadd / patchrm | pkg update (IPS) |
| Package install | pkgadd | pkg install |
| Service mgmt | svcadm / svcs (SMF) | svcadm / svcs (same) |
| Zones | zoneadm / zonecfg | zoneadm / zonecfg (same) |
| Network | ifconfig / ndd | ipadm / dladm |
| Default FS | UFS (root) + ZFS | ZFS only (incl. root) |
| Deployment | JumpStart | Automated Installer (AI) |
| Patch rollback | Live Upgrade | Boot Environments (beadm) |
Solaris 11 uses IPS. Combined with ZFS Boot Environments this gives essentially-free, instant rollback — one of the most powerful patching stories on any Unix.
| Attribute | T-Series | M-Series |
|---|---|---|
| Optimised for | Highly-threaded (CMT) workloads | Mission-critical RAS |
| Threads | T4: 8 cores × 8 threads = 64/socket | High core count with ECC |
| Key features | Java/web/app servers | Silicon Secured Memory; M12: 32 sockets, 32TB RAM |
| Best for | Throughput / concurrency | SAP HANA, Oracle DB, core banking |
ILOM (Integrated Lights Out Manager) provides out-of-band management independent of the host OS — accessible even when Solaris is crashed or powered off.
| vdev Type | Redundancy | Use Case |
|---|---|---|
| stripe | None | NEVER for production data |
| mirror | N-1 disk | Boot pools, high IOPS |
| raidz1 | 1 disk | General storage, min 3 disks |
| raidz2 | 2 disks | Production data pools, min 4 disks |
| raidz3 | 3 disks | Archival, min 5 disks |
| cache (L2ARC) | N/A | SSD random-read acceleration |
| log (ZIL) | Mirror | SSD sync-write acceleration |
A Boot Environment is a complete, independent snapshot of the OS root dataset. Switch between bootable OS states instantly; rollback in seconds.
A Zone is OS-level virtualization in Solaris — multiple isolated user environments sharing one kernel. A brand defines which OS environment the zone emulates, allowing modern hardware to run legacy Solaris OS versions or even Linux.
| Zone Type | Brand | Kernel | Best For |
|---|---|---|---|
| Global Zone | global | Host OS | Physical host management |
| Native NGZ | solaris (S11) / native (S10) | Shared | App isolation on same OS |
| Solaris 10 brand | solaris10 | Emulated S10 on S11 | Run legacy Sol 10 apps on Sol 11 |
| Solaris 9 brand | solaris9 | Emulated S9 on S10 | Legacy retention on Solaris 10 |
| Solaris 8 brand | solaris8 | Emulated S8 on S10 | Long-tail legacy migration |
| Kernel Zone | solaris-kz | Own kernel (S11.2+) | Independent patching/upgrade |
| lx brand | lx | Linux syscalls translated | Run RHEL/CentOS userland on Solaris |
This is what the JD asks about — running legacy Solaris 10 workloads on modern Solaris 11 hardware via the solaris10 brand.
-u flag on zoneadm install performs an unconfigure so the zone boots into the system identification dialog. Without it, the cloned host identity persists — a classic interview gotcha.- One zone per application tier — never mix prod and non-prod in the same global zone.
- Always cap CPU AND memory — uncapped zones are how a single runaway process takes the whole host down.
- Use Resource Pools + Fair Share Scheduler (FSS) so zones get guaranteed minimums under pressure.
- Separate ZFS datasets per zone — gives per-zone snapshot/rollback and I/O isolation.
- Dedicated VNICs per zone — clean network isolation and easier troubleshooting.
capped-cpu with cpu-shares. The cap is a hard ceiling; the shares decide how un-capped slack is divided when zones compete. Set one without the other and you get starvation or noisy-neighbour problems.| Domain | Role | Responsibility |
|---|---|---|
| Control | Primary / Manager | Manages all domains via ldm CLI; Hypervisor interface |
| Service | Virtual I/O Provider | Runs vds, vsw, vcc for guests |
| Root | PCIe root complex | Direct hardware access, SR-IOV |
| Guest | Virtual Machine | Separate OS/kernel — isolated crash domain |
- Same architecture/firmware compatibility on source and target.
- Shared SAN storage accessible from both hosts.
- Virtual switch on target; SSH key auth between control domains.
- Enough free CPU/RAM on target.
| Zone Type | Kernel | Best For |
|---|---|---|
| Global Zone | Host OS kernel | Physical host management |
| Non-Global (NGZ) | Shared with GZ | App isolation, dev/test, multi-tenant |
| Kernel Zone (11.2+) | Own kernel | Run older Solaris on newer GZ |
| solaris10 brand | Emulated S10 | Legacy app support |
| dcmd | Purpose |
|---|---|
| ::status | System info + panic message |
| ::panicinfo | Panic details |
| ::msgbuf | Kernel message buffer |
| ::stack | Stack trace of crash thread |
| ::kmastat | Kernel memory allocator statistics |
| ::modinfo | Loaded kernel modules |
| 0xADDR::print struct | Print C structure at address |
| Method | Version | Mechanism |
|---|---|---|
| /etc/minor_perm | Solaris 10 | sd:block oracle:dba 0660 |
| SMF + devfsadm script | Solaris 11 | Manifest sets perms after discovery |
| /etc/devlink.tab + init.d | Both | Post-mount chown on Oracle devices |
IPMP (IP Network Multipathing) provides NIC failover and load balancing — Active-Active or Active-Standby.
The Solaris boot process has six well-defined phases. Knowing each phase by name and what runs there is fundamental L3 knowledge.
- <b>POST</b> — power-on self-test runs from firmware; tests CPU, memory, devices.
- <b>OBP (OpenBoot PROM)</b> on SPARC / BIOS-UEFI on x86 — initialises hardware, executes the FCode boot device and loads the bootblk.
- <b>Bootblk</b> — primary bootloader on the disk's first sector; loads the secondary bootloader (ufsboot or zfsboot).
- <b>Kernel load</b> — secondary bootloader loads /platform/`uname -i`/kernel/unix and /etc/system; kernel mounts root filesystem.
- <b>init / SMF</b> — Solaris 10+ uses SMF; svc.startd takes over and brings the system to the milestone target (multi-user-server by default).
- <b>Login prompt</b> — getty/sshd start, the system is ready.
| Area | Solaris 10 | Solaris 11 |
|---|---|---|
| Package mgmt | SVR4 (pkgadd, pkgrm, patchadd) | IPS (pkg install/update) |
| Root FS | UFS or ZFS | ZFS only (mandatory) |
| Boot loader | SPARC: OBP; x86: GRUB Legacy | SPARC: bootlst/loader; x86: GRUB 2 |
| Network config | ifconfig / /etc/hostname.* | ipadm / dladm (profile-based) |
| Patch rollback | Live Upgrade (LU) | Boot Environments (beadm) |
| Zones default brand | native | solaris (S11) — solaris10 brand emulates S10 |
| Service mgmt | SMF | SMF (enhanced) |
| Provisioning | JumpStart | Automated Installer (AI) |
| Crypto framework | KCF | KCF + native ZFS encryption |
| Repository | Patchadd from MOS | IPS repo (publisher) |
Stuck at OBP means the system has not progressed past firmware. Either the boot device is missing/corrupt, the boot path is wrong, or hardware has failed.
- First confirm OBP responsiveness — type
banner; it should print system info. If not, hardware fault or watchdog. - Check the current boot device:
printenv boot-device— is the alias pointing at a valid disk? - Probe attached devices:
probe-scsi-allandshow-disks— does the OS disk respond? - Try booting from an alternate disk:
boot disk1or by full device path. - Boot from network for rescue:
boot net— requires a JumpStart/AI server. - Boot from CD/DVD/USB:
boot cdrom -sfor a single-user rescue shell, then mount the root pool/UFS and inspect. - If you suspect a corrupt bootblk on SPARC, reinstall it:
installboot /usr/platform/`uname -i`/lib/fs/zfs/bootblk /dev/rdsk/c0t0d0s0. - Check OBP NVRAM variables:
printenv; reset them withset-defaultsif corrupted. - If hardware suspect, capture and engage Oracle support with the
obdiagoutput.
set-defaults on a production server — it resets all NVRAM including the boot device list. Record printenv first.SMF is Solaris's service management framework, introduced in Solaris 10. It replaces traditional /etc/rc*.d init scripts with an XML manifest-based system that provides dependency management, automatic restarts, and a unified administration interface.
| Aspect | Init scripts | SMF |
|---|---|---|
| Dependencies | Order = K/S number | Declarative dependencies in manifest |
| Failure handling | No restart | Auto-restart with backoff |
| Status visibility | ps + scripts | svcs unified view |
| Logs | Mixed locations | /var/svc/log/<svc>.log per service |
| Configuration | Edit script | svccfg / svcprop |
| State persistence | None | Maintained in repository |
online, offline, disabled, maintenance, degraded, uninitialized. Move out of maintenance with svcadm clear <fmri>.This is the textbook reason Boot Environments exist on Solaris 11. On Solaris 10 you rely on Live Upgrade or failsafe boot.
beadm create) or a LU BE on Solaris 10 (lucreate). Mentioning this in the interview demonstrates you actually practice safe patching.| Run Level | SMF Milestone | Purpose |
|---|---|---|
| 0 | milestone/none | Powered down, OBP |
| S / 1 | milestone/single-user | Single user, root only |
| 2 | milestone/multi-user | Multi-user, no network FS |
| 3 | milestone/multi-user-server | Multi-user + network (default) |
| 5 | — | Power off (halt) |
| 6 | — | Reboot |
milestone=none when SMF itself is broken — gives you a shell with only PID 1 running. From there you can disable broken services and bring the system up./etc/system is read by the kernel at boot and used to set kernel tunables, force-load modules, and exclude modules. It is the legacy way to tune the Solaris kernel; Solaris 11 increasingly uses project resource controls instead, but /etc/system still applies.
/etc/system mistakes can prevent boot. Always keep a backup line in /etc/system.bak and use boot -as to load with /dev/null as /etc/system if you've corrupted it: ok> boot -a then specify /dev/null when prompted for system file.Solaris saves kernel crash dumps to /var/crash/<hostname>/ via savecore. The dump consists of unix.N (namelist) and vmcore.N (image). You analyze with mdb -k.
::msgbuf — it shows the last kernel messages before the panic, which often name the offending driver or subsystem. Always start there.Core files are process memory snapshots created when a process receives a fatal signal (SIGSEGV, SIGABRT, etc). They are essential for application debugging. Solaris controls them via coreadm.
%f=executable, %p=PID, %t=epoch, %n=hostname, %u=uid. Naming cores well is half the troubleshooting battle.- Start with a long-term trend:
kstat -m unix -n system_pages -s freememover time. A steadily falling freemem with no userland growth = kernel leak suspect. - Per-cache view:
mdb -k→::kmastat. Look for caches whosebuf inuseandbuf totalgrow without bound. - Profile allocations:
::kmem_logrequires kmem_flags = 0x1f (audit). Enable withmdb -kw→kmem_flags/W 1f(only on test systems — high overhead). - Use DTrace:
dtrace -n 'fbt::kmem_alloc:entry { @[stack()] = count(); }'to find hot allocation stacks. - Check known offenders: ZFS ARC (
kstat -n arcstats), networking buffers, third-party drivers. - If a specific module is suspected,
::findleaksin mdb runs garbage-collection-style leak detection on the live kernel.
| Aspect | UFS | ZFS |
|---|---|---|
| Volume mgmt | Separate (SVM, VxVM) | Built-in (zpool) |
| Integrity | Last-mount fsck | Always-on checksums + scrub |
| Snapshots | fssnap (limited) | Native, instant, unlimited |
| Resize | growfs (grow only) | Live grow + dataset quotas |
| Max FS size | ~16 TB | 16 EB |
| Block | Fixed 8 KB | Variable up to 1 MB |
| RAID | SVM external | RAID-Z1/Z2/Z3 built-in |
| Compression | None | lz4 / gzip native |
| Boot | Solaris 10 default | Solaris 11 only root option |
- <b>Pool (zpool)</b> — a storage pool built from one or more vdevs (mirror, raidz, etc). The pool provides aggregated capacity and redundancy. Example:
tank. - <b>Dataset</b> — a manageable unit carved from the pool. Types: filesystem (mounted), volume (zvol, block device), snapshot (read-only point-in-time), clone (writable copy of a snapshot).
- Datasets inherit properties from their parents (compression, quota, mountpoint).
- Naming is hierarchical:
tank/data,tank/data/db.
- Run
zpool status -vto identify the type of corruption — DEGRADED (redundancy lost but readable), FAULTED (unusable), or specific damaged files. - If checksum errors exist on a healthy pool, run
zpool scrub <pool>to verify and self-heal from redundant copies. - If a vdev is FAULTED but the pool is importable:
zpool clear <pool>to acknowledge transient errors after fixing the underlying issue. - If a disk replacement is needed:
zpool replace <pool> <old-disk> <new-disk>; monitor resilver progress. - If the pool will not import:
zpool import -fF <pool>attempts forced import with rewind to the last consistent transaction group. - Last resort for catastrophic damage:
zpool import -fFX <pool>(extreme rewind) — discards recent writes; use only after taking advice/backup. - If specific files are corrupted, restore them from snapshots or backup; the file paths are listed in
zpool status -v.
-X (extreme rewind) can roll back hours of committed writes. Always engage Oracle Support before using it in production, and take a snapshot of the disks (if possible) for forensic recovery.A snapshot is a read-only, point-in-time view of a dataset. It is nearly instant and initially consumes no extra space — it grows only as the original dataset diverges. A clone is a writable filesystem created from a snapshot; it shares blocks with the parent until written to (copy-on-write).
zfs-auto-snapshot SMF service. Combined with zfs send -i incremental replication, you get an extremely robust DR setup at near-zero cost.| Aspect | Mirror | RAID-Z1 | RAID-Z2 | RAID-Z3 |
|---|---|---|---|---|
| Redundancy | N-1 disks | 1 disk | 2 disks | 3 disks |
| Min disks | 2 | 3 | 4 | 5 |
| Write perf | Best (parallel) | Lower (parity calc) | Lower | Lowest |
| Read perf | Best (split reads) | Sequential good | Sequential good | Sequential good |
| Usable % | 50% (2-way) | (N-1)/N | (N-2)/N | (N-3)/N |
| Best for | DB, low-latency | General storage | Production data | Archive, very large arrays |
| Resilver speed | Fast (1 disk copy) | Slow (full parity) | Slowest | Slowest |
zpool remove). Plan capacity carefully — a wrong pool layout is permanent.A classic L3 scenario: df shows 30% free but the application fails with ENOSPC. Several causes — diagnose systematically.
- <b>Inode exhaustion</b> (UFS):
df -F ufs -o i /mountpoint. If%iusedis 100%, you have inode starvation — too many small files. Solution: delete files or reformat with more inodes (newfs -i). - <b>Reserved space</b> (UFS): UFS reserves 10% by default for root. Non-root writes fail before df shows full. Check with
tunefs -p, reduce withtunefs -m 5if needed. - <b>Open deleted files</b>: a process holds a file open after
rm. Space is not reclaimed until the process closes the file or restarts. Find withlsof | grep deletedorpfiles <pid>. - <b>ZFS quotas/reservations</b>:
zfs get used,quota,reservation tank/data. A dataset may be at quota even if the pool has free space. - <b>ZFS snapshot space</b>: snapshots hold blocks.
zfs list -t snapshot -o name,used,refer— old snapshots consume real space. - <b>Pool fragmentation / metaslab issues</b> (ZFS):
zpool get fragmentation tank. Above ~80% fragmentation, writes slow drastically even with free space.
lsof | grep deleted is your first reflex.A stale NFS file handle occurs when a file or directory on the NFS server is removed/replaced while a client still holds a handle to it. The client gets ESTALE errors. A hung mount happens when the NFS server is unreachable and the client is using a hard mount.
- Identify the stuck mount:
dfhangs,mountshows it. Usenfsstat -mon the client for mount stats. - Check NFS server reachability:
ping nfs-srv,rpcinfo -p nfs-srv,showmount -e nfs-srv. - On the client side, processes blocked on the mount appear in 'D' state and can't be killed easily.
- Try a forced lazy unmount:
umount -f /mnt. On Solaris,umount -fexists but is less reliable; sometimes you need to kill all processes touching the mount first. - Find stuck processes:
fuser -c /mntlists PIDs;fuser -ck /mntkills them (use carefully). - If the mount is completely wedged and umount fails: identify and restart the NFS server, OR reboot the client as a last resort.
- Preventive: use
soft,intr,timeo=300,retrans=2for non-critical mounts;hard,intrfor critical data; always use NFS server's HA virtual IP, never physical.
hard mounts WILL hang processes indefinitely if the server is down — but they guarantee data integrity. soft mounts return errors after timeout — fast but can silently corrupt writes. Critical data ALWAYS uses hard,intr.Methodical layered investigation — CPU → memory → I/O → network → application — and always correlate with recent changes.
- <b>Baseline first</b>:
uptimefor load,prstat -a 1 5for top processes and zones. - <b>CPU saturation?</b>
mpstat 1 5— per-CPU %sys, %usr, %wt. Sustained %sys high = kernel/driver; %usr high = app loop. - <b>Run queue?</b>
vmstat 1 5—rcolumn > CPU count means contention. Also watchw(waiting on resource). - <b>Memory pressure?</b>
vmstat 1—sr(scan rate) > 0 sustained = memory shortage; pages being scanned for eviction. - <b>Swap activity?</b>
vmstat 1si/so> 0 = active paging. Bad. - <b>Disk I/O?</b>
iostat -xnz 1 5—%b(busy) > 80,asvc_t(service time) > 30ms = storage bottleneck. - <b>Network?</b>
netstat -i 1,dlstat,nicstat— drops, errors, saturation. - <b>Application?</b>
truss -p <pid>for syscall traces;pstack <pid>for stack; DTrace for production-safe deep dive. - <b>Recent changes?</b>
showrev -p | tail,pkg history,last reboot, app deploy history. 80% of “sudden slow” incidents tie to a change.
prstat -mLa for microstate accounting — it shows what each LWP is actually doing (USR/SYS/TRP/TFL/DFL/LCK/SLP/LAT/STP). A high LAT means waiting for CPU (run queue); high LCK means lock contention. This is the L3 differentiator.- <b>System-wide</b>:
vmstat 1—rcolumn sustained above CPU count = run-queue saturation. - <b>Per-CPU</b>:
mpstat 1— find imbalanced CPUs (one pegged, others idle = single-threaded bottleneck). - <b>Per-process</b>:
prstat -mLa 1— find threads with high USR or SYS or low LAT. - <b>Drill-down USR-heavy</b>: profile with DTrace —
dtrace -n 'profile-997 /pid==<PID>/ { @[ustack()]=count(); }' - <b>Drill-down SYS-heavy</b>: which syscalls?
dtrace -n 'syscall:::entry /pid==<PID>/ { @[probefunc]=count(); }' - <b>Lock contention</b>:
lockstat -A sleep 5for kernel locks;plockstat -A <PID>for userland.
- <b>Free memory low</b>:
vmstat 1—freebelowlotsfreethreshold triggers scanning. - <b>Scan rate sustained</b>:
vmstat 1srcolumn > 0 over time = kernel scanning pages to reclaim. Hard threshold. - <b>Paging</b>:
vmstat 1pi/pocolumn > 0 means active paging — system is short on RAM. - <b>Per-process growth</b>:
prstat -s rsssorts by resident set size; check for runaway leaks. - <b>Microstate DFL</b>:
prstat -mLa— highDFL(data fault) = thread waiting on page-ins. - <b>ZFS ARC</b>:
kstat -n arcstatsor::arcin mdb; ARC can dominate but is reclaimable. - <b>OOM-style events</b>: check
/var/adm/messagesfor “not enough memory” or process kills.
Solaris uses an anonymous memory reservation model. When a process allocates memory (e.g. malloc), Solaris reserves enough swap space to back it — even if not yet paged out. This is different from Linux's overcommit model.
- Total virtual memory = physical RAM + swap space.
- Each anonymous allocation reserves backing store from this pool.
- If total reservation exceeds available swap+RAM, allocation fails (no OOM killer like Linux).
- Solaris swap is usually small (1×–2× RAM); reservation primarily uses RAM.
swap -s — you may have reserved all swap even though RAM is free. Solaris will refuse new allocations rather than OOM-kill an existing process.Load average on Solaris is the sum of the run queue and processes waiting on disk I/O — not just CPU. So a load of 20 on a 4-CPU box could be CPU-bound, I/O-bound, or a mix.
- Confirm load:
uptime,w— 1/5/15-minute averages. - Distinguish CPU vs I/O:
vmstat 1—rcolumn is run queue (CPU);bis blocked-on-I/O. - If
rdominates: CPU saturation — drill withmpstat+prstat -mLa. - If
bdominates: storage waits — drill withiostat -xnz 1looking for%b> 80 and highasvc_t. - Mix of both: usually one is primary; identify by which is highest more often.
- Check for fork bombs / process explosion:
ps -ef | wc -l, watch withprstatfor sudden process count growth. - Check for runaway zones (in global zone):
prstat -Zshows per-zone CPU. - Investigate top consumers; if legitimate workload, that's a capacity problem, not a tuning problem.
IPMP provides NIC failover and load spreading at the IP layer. Multiple physical interfaces are grouped; if one fails, traffic continues on others. Solaris 11 uses link-based failure detection (via dladm) by default, with optional probe-based detection.
| Mode | Behavior | Use Case |
|---|---|---|
| Active-Active | All interfaces carry traffic; load spread by hash | Throughput-critical |
| Active-Standby | Standby idle until active fails | Strict failover semantics |
| Link-based detection | Detects link down (cable, NIC) | Default; fast |
| Probe-based detection | Pings a target on each interface | Detects upstream switch failures |
- Confirm symptoms: end-to-end ping (
ping -s), then progressive hops (traceroute). - Local NIC health:
dladm show-phys,dladm show-link -sfor stats,kstat -n <link>for errors/drops. - Driver stats:
nicstat 1— packets/sec, MBPS, utilisation. High%Util= saturation. - TCP state:
netstat -s | grep tcp— retransmits, out-of-order, duplicate ACKs. - Active connections:
netstat -an;ss -tin S11. Look for manyCLOSE_WAIT/FIN_WAIT. - Packet capture if needed:
snoop -d net0 -o /tmp/cap host x.x.x.x; analyze withsnoop -ior Wireshark. - DNS:
nslookup,dig; slow DNS resolves look like 5-second hangs. - Check IPMP probe statistics for upstream switch issues.
netstat -s are a strong signal of network loss. tcpRetransSegs as a percentage of tcpOutSegs > 0.5% indicates a real problem somewhere on the path.- <b>Physical interface</b> — a NIC port (e.g.
net0,e1000g0,ixgbe0). Has a MAC, one link state. - <b>Logical interface</b> — an additional IP address bound on top of a physical or virtual interface (e.g.
net0:1,net0:2). Same MAC; multiple IPs. - On Solaris 11 with
ipadm, logical interfaces are simply additional addresses on the same IP interface — distinguished by name suffix likenet0/v4a. - Use cases: virtual IPs for cluster failover, multi-homing, alias for service migration.
VLANs let you put a single physical NIC on multiple IEEE 802.1Q tagged networks. Solaris creates a VLAN interface on top of the physical link.
e1000g100000 means instance 0, VLAN 100. e1000g1100 means instance 1, VLAN 100.- Server vs client side:
nfsstat -son server,nfsstat -con client. - Look at
badcalls,retrans,timeouts— non-zero values point to network or server overload. - Server load: is the NFS server itself CPU- or I/O-bound? Use the perf methodology there.
- Network path: ping latency client→server should be sub-millisecond on a LAN. Use
nicstaton both ends. - Mount options: NFSv3 vs v4,
rsize/wsize(default 1 MB is good for modern networks; older systems may have 8 KB). nfsstat -mon client shows actual negotiated read/write sizes and timing buckets.- If NetApp/array-backed: check array stats; the bottleneck may be downstream of the NFS server itself.
dtrace -n 'nfsv4:::op-*-start { @[probename] = count(); }'profiles op mix.
nfsstat -m shows the timing distribution skewed toward longer buckets (>= 80ms), the server is overloaded. Sub-10ms buckets = healthy LAN NFS.Solaris Zones are OS-level virtualization — multiple isolated user-space environments sharing a single kernel. Each zone has its own filesystem, process namespace, network identity, and root user, but all run on one Solaris kernel instance. Lightweight (no hypervisor overhead) and high-density (hundreds per host).
- <b>Process isolation</b> — zone A cannot see or signal zone B's processes.
- <b>Filesystem isolation</b> — zonepath is the root; usually a ZFS dataset.
- <b>Network isolation</b> — exclusive-IP zones get their own stack; shared-IP share the global zone's.
- <b>Resource isolation</b> — capped CPU, memory, swap; FSS shares; dedicated CPUs.
- <b>Branding</b> — a brand defines the runtime environment (solaris, solaris10, lx, etc).
| Aspect | Global Zone (GZ) | Non-Global Zone (NGZ) |
|---|---|---|
| Role | The host OS itself | A guest user environment |
| Privileges | Full system access | Restricted; can't see other zones |
| Kernel | Owns the kernel | Shares GZ's kernel |
| Hardware access | Direct | Through GZ |
| zoneadm visibility | Sees all zones | Sees only itself |
| Patch/upgrade | Updates kernel + all NGZs | Updates only NGZ's apps |
| Filesystems | All physical | Only the zonepath |
zoneadm, zonecfg). A non-global zone's root cannot install a kernel module, change the system clock, or affect another zone.These are Solaris 10 concepts. They define how the zone's filesystem layout relates to the global zone.
| Aspect | Sparse Root | Whole Root |
|---|---|---|
| /usr, /lib, /sbin, /platform | Inherited read-only from GZ via loopback | Own private copy |
| Disk space | Minimal (~100 MB) | Larger (~5 GB) |
| Patching | Patch GZ; sparse zones get updates automatically | Each zone patched independently |
| Customization | Cannot modify inherited paths | Full control of /usr et al |
| Boot time | Faster | Normal |
| Use case | Dense, identical app servers | Custom builds, third-party tools in /usr |
A Kernel Zone (introduced in Solaris 11.2) runs its own independent kernel — a true hypervisor-like isolation while still using the Solaris zones management tooling. Brand name: solaris-kz.
- Own kernel and SMF — patch the kernel zone independently of the global zone.
- Live migration between hosts is supported (cold and warm).
- Different Solaris versions can run as KZ guests (within compatibility).
- Higher resource overhead than NGZ but lower than full hypervisor VMs.
- Requires SPARC T-series or Intel/AMD VT-x with EPT.
| Aspect | Solaris Zones | VMware VMs |
|---|---|---|
| Overhead | Near-zero (shared kernel) | Significant (own OS per VM) |
| Density | 100s per host | 10s per host |
| Boot time | Seconds | Minutes |
| OS diversity | Solaris (or solaris10/lx brand) | Any OS |
| Patching | GZ patch updates kernel for all | Per-VM patching |
| Live migration | Kernel Zones only | Full vMotion support |
| Resource granularity | CPU shares, caps | vCPU + RAM allocation |
| License model | Free with Solaris | Per-host/socket commercial |
dladm create-vnic -l net0 vnic1. Shared-IP zones reuse the GZ's IP stack — simpler but less isolated.| State | Meaning | How To Get There |
|---|---|---|
| configured | Definition exists in /etc/zones, not installed | zonecfg ... commit |
| incomplete | Install in progress or interrupted | Failed install left this state |
| installed | Files installed under zonepath, not booted | zoneadm install |
| ready | Resources allocated (devices/network), not booted | zoneadm ready |
| running | Booted, services running | zoneadm boot |
| shutting_down | Stopping | zoneadm shutdown |
| down | Halted but resources retained | Transition only |
| mounted | Read/write access from GZ for upgrade | zoneadm -z X mount |
| Command | Purpose | Typical Usage |
|---|---|---|
| zonecfg | Define / edit zone configuration | zonecfg -z <zone> |
| zoneadm | Lifecycle (install/boot/halt/clone) | zoneadm -z <zone> boot |
| zlogin | Log into / execute in zone | zlogin -C <zone> for console |
| zonename | Print current zone name | zonename |
| zonestat | Live per-zone resource stats | zonestat 1 |
Cloning makes an identical copy of a zone — useful for rapid deployment of standard images or test environments. On ZFS-backed zones it uses snapshot+clone semantics — instant and space-efficient.
Solaris zones support cold migration via detach/attach. Live migration is supported only for Kernel Zones (solaris-kz brand).
zfs send | zfs recv) is far faster than tar+scp for large zones. Use zfs snapshot + zfs send to transfer the zonepath dataset directly.installed means files exist on disk but the zone won't transition to ready/running. Common causes: missing devices, network config errors, filesystem permission issues, brand incompatibility.
- Try a controlled boot and capture errors:
zoneadm -z appzone -v boot(verbose). - Check the zone install log:
/var/log/zones/zoneadm.<date>.<zone>.log. - Verify the configuration is valid:
zonecfg -z appzone verify. - Check network resources exist:
dladm show-link— does the VNIC/datalink referenced in the zonecfg exist? - Check zonepath:
ls -ld /zones/appzone— must exist, owned root, mode 700. - If ZFS-backed:
zfs list | grep appzone— is the dataset mounted? - Test
readystate explicitly:zoneadm -z appzone ready— what error? - Brand mismatch: if the source was a different OS version, you may need
zoneadm -z appzone attach -uto update. - Last resort:
zoneadm -z appzone uninstall+ reinstall after fixing root cause. Backup any data first.
| Log | Path | Use For |
|---|---|---|
| zoneadm operations | /var/log/zones/zoneadm.<date>.<zone>.log | install/attach/boot operations |
| zone console | zlogin -C <zone> | Boot console (services starting) |
| Per-zone messages | <zonepath>/root/var/adm/messages | System log inside the zone |
| GZ messages | /var/adm/messages | Zone-related kernel events visible from GZ |
| SMF per-service | <zonepath>/root/var/svc/log/... | Failed services inside zone |
| FMA | fmadm faulty | Hardware/resource faults |
zlogin -C BEFORE the boot command in a separate window — that way you see boot output live, including kernel messages and SCI prompts on first boot.Most resource caps can be adjusted live with zoneadm apply; a few require a zone reboot. The pattern is: edit with zonecfg → apply or reboot.
prctl/rcapadm changes are runtime-only — they revert on zone reboot. Always edit zonecfg for persistence, then zoneadm apply to push the change live.- Try to attach for repair from the global zone:
zoneadm -z appzone mount— gives you read/write access to<zonepath>/rootfrom the GZ. - Inspect and repair: check
/etc/passwd,/etc/shadow,/etc/system, broken symlinks. Edit from the GZ. - If SMF is corrupt inside the zone:
svccfg -s -repair manifests, or restore from a snapshot. - If filesystem corruption: for UFS-backed zones
fsckthe zonepath; for ZFS runzpool scrub. - ZFS rollback if you have a snapshot:
zfs rollback rpool/zones/appzone/rpool/ROOT/solaris@before-bad-change. - Worst case: clone from a known-good zone, restore data into the new one, retire the corrupted one.
- Always take a snapshot BEFORE attempting repair — your first failed repair attempt is data you may need.
- First determine IP-type:
zonecfg -z <zone> info ip-type. Troubleshooting paths differ for shared vs exclusive. - Shared-IP: the zone shares the GZ's stack — most troubleshooting happens in the GZ.
- Exclusive-IP: the zone has its own stack. Run
ipadm,netstatINSIDE the zone viazlogin. - Datalink visible: in GZ,
dladm show-vnic— is the zone's VNIC up and on the correct underlying NIC? - Inside zone:
ipadm show-addr,ipadm show-if,route -n,netstat -rn. - Ping in stages: zone → GZ (anycast same VLAN), zone → default gateway, zone → external. Identify where it stops.
- DNS:
cat /etc/resolv.confinside zone;nslookup somehost. - Firewall:
svcs -a | grep ipfilterin both GZ and zone. ipf rules can block traffic invisibly. - Packet capture:
snoopon the GZ's underlying interface, filter by VLAN/zone IP — useful when you suspect traffic isn't leaving the host.
- Confirm the zone is running:
zoneadm list -cvfrom GZ. - Log in:
zlogin <zone>. Check uptime, load, recent boots:uptime ; who -b. - Application service state:
svcs -xvinside zone — failed services? - Application logs:
/var/logor app-specific log path; look for errors aligned with the report time. - Resource caps: from GZ
prstat -Z 1 5— is the zone hitting its cpu-cap or capped-memory?rcapstat 1shows memory cap enforcement. - Inside zone:
vmstat 1,iostat -xnz 1,prstat -mLa 1for thread microstates (LCK, LAT, DFL). - Filesystem:
df -hinside zone — full FS often kills apps silently. - Network: ping internal services from inside zone; confirm DNS, NTP.
- Recent changes inside the zone:
pkg history(S11), application deploy logs. - Take coredumps/snoop if reproducible; engage app team with concrete evidence.
- Confirm scope: is the zonepath full, or a filesystem mounted inside the zone?
df -hboth in GZ and zone. - If zonepath: from GZ
du -sh /zones/<zone>/root/*sorts by directory. - ZFS dataset usage:
zfs list -r rpool/zones/<zone>— see per-dataset used. - Largest files inside zone:
find / -xdev -type f -size +1G 2>/dev/null | xargs ls -lh. - Look for runaway logs:
/var/log,/var/adm, application logs. - Open-deleted files:
lsof | grep deletedin zone — file deleted but still held open. - ZFS snapshots eating space:
zfs list -t snapshot -r rpool/zones/<zone>. - Core dumps:
coreadm+ check /var/cores. - Quotas: if dataset has a quota, the zone may hit dataset quota before pool exhaustion.
- Quantify: measure with
time zoneadm -z appzone boot; compare to a known-good zone. - Watch the boot live:
zlogin -C appzonefrom another window before boot — see where it pauses. - Zone install log:
/var/log/zones/zoneadm.*<zone>*for the boot transaction. - SMF inside zone:
svcs -xvimmediately after boot — failed services delay milestones. - Long-running services:
svcs -pshows process trees; check/var/svc/log/<svc>.logfor slow startup. - FS check: large UFS filesystems run fsck at boot if not clean — moves to ZFS to eliminate this.
- Network timeouts:
nfs/clientservice can hang on missing NFS server; check/etc/vfstab. - If the zone has many services with deep dependency chains, examine the SMF dependency graph for cycles or fan-out.
- Resource starvation: if the GZ is under heavy load,
zoneadm bootcompetes for I/O. Check withiostatduring boot.
svcs -xv immediately after boot will name it.LDOMs (Logical Domains, officially Oracle VM Server for SPARC) are full hardware partitions on SPARC servers — each LDOM has its own kernel, OBP, and OS instance. Unlike zones (OS-level virtualization), LDOMs are firmware-level virtualization. They run on the hyper-privileged Solaris kernel on SPARC T-series and M-series systems.
- Each LDOM is a complete logical machine — own kernel, own OS, own console.
- Resources (CPU strands, memory, I/O) are allocated by the Control Domain.
- Multiple OS versions can run side-by-side (Sol 10, Sol 11, even Linux on some platforms).
- Live migration supported between compatible hosts.
- Lower overhead than VMware — direct hardware access via I/O Domains.
| Domain Type | Role | Notes |
|---|---|---|
| Control Domain (primary) | Manages all other LDOMs via ldm CLI | Required; usually also the I/O Domain |
| Service Domain | Provides virtual I/O (vds, vsw, vcc) to guests | Disk + network proxy |
| I/O Domain | Has direct PCIe / PCI-root assignment | Native HW performance for guests |
| Guest Domain | Runs production workloads | Uses virtual I/O from Service Domain |
In small deployments, one domain plays all roles (Control + Service + I/O). In large deployments, separating roles improves availability — a Service Domain reboot can be tolerated by HA-configured guests.
SPARC processors use strands (hardware threads). T-series chips have many strands per core (e.g. T4 = 8 strands/core, 64 strands per socket). LDOMs allocate strands or whole cores.
set-vcpuassigns logical strands (fine grained).set-coreassigns whole cores — preferred for production to avoid cross-core interference (“whole-core allocation”).set-cryptoassigns crypto units (MAU) on T-series.- Dynamic reconfiguration: add/remove CPU on a running LDOM with
ldm add-vcpu/remove-vcpu(no reboot). - Power management:
elasticmode lets unused CPUs power down;performancekeeps them ready.
set-core over set-vcpu for production LDOMs. Sharing cores between LDOMs (“strand stealing”) hurts performance under contention.| Aspect | LDOMs | Zones |
|---|---|---|
| Virtualization level | Hardware (firmware) | OS-level |
| Own kernel | Yes | No — shared with GZ |
| OS diversity | Different Sol versions / Linux | Solaris only (or solaris10 brand) |
| Overhead | Low (but >0) | Near zero |
| Density | 10s per host | 100s per host |
| Live migration | Yes | Kernel Zones only |
| Hardware access | Direct via I/O Domain | Always virtualised |
| Boot time | Minutes (full OS boot) | Seconds |
| Best for | OS isolation, mixed versions | High density app isolation |
Yes, absolutely — and this is the standard architecture for large SPARC deployments. Each LDOM runs its own Solaris OS, and inside each LDOM you can configure dozens of zones.
- Provides two layers of isolation: LDOM for OS-level separation, Zones for app-level density.
- Different LDOMs can run different Solaris versions and have different patch levels.
- Each zone inside an LDOM still uses that LDOM's kernel — no double-virtualization overhead.
- Resource caps apply at both layers: LDOM gets allocated cores; zones get capped within those.
- Common in banks and telcos: “2 LDOMs per host (prod + non-prod) × 20 zones each”.
| Command | Purpose |
|---|---|
| ldm list | Concise list of all LDOMs + state + CPU/mem |
| ldm list -l | Long listing with all resources |
| ldm list-bindings | Detailed binding map (CPU, memory, vdisk, vnet) |
| ldm list-services | Virtual services (vds, vsw, vcc) |
| ldm list-spconfig | Service Processor saved configs |
| ldm add-domain | Create empty domain definition |
| ldm bind-domain | Bind resources to a domain (commit allocation) |
| ldm start-domain / stop-domain | Boot / halt the OS in the domain |
| ldm migrate-domain | Live migration to another host |
ldm add-spconfig <name>. This snapshots the entire LDOM layout in the Service Processor — your safety net if something goes wrong.A virtual switch (vsw) is a software bridge in a Service Domain that connects guest VNETs to a physical network. Multiple VNETs share the vsw; the vsw forwards frames between them and the underlying physical NIC.
VDS is the kernel module in a Service Domain that exports block devices to guest LDOMs. Each exported device is a vdsdev, identified as <name>@<vds>. The guest sees it via the vdc (virtual disk client) driver as a regular disk device.
- Backing store can be: physical LUN, ZFS volume, file, or whole disk.
- Best perf: physical LUN passed via SR-IOV (rare) or ZFS zvol with logbias=throughput.
- Whole disk vs slice: whole disk gives flexibility (guest can repartition); slice locks layout.
- Multipath: configure two vdsdevs from two Service Domains, bind both as the same vdisk in the guest — guest uses mpxio across both paths.
- <b>SPARC architecture compatibility</b> — source and target must run compatible CPU generations.
ldm list -o domain targetshows the supported migration targets. - <b>OS and firmware</b> — same or compatible Solaris release in the Control Domain; matching hypervisor versions.
- <b>Shared storage</b> — guest's vdisks must be accessible from BOTH source and target. Usually via SAN.
- <b>Network</b> — target must have an equivalent vsw on the same VLAN; source and target on the same VLAN for guest connectivity.
- <b>Resources on target</b> — equal or larger free cores/memory available before initiating migration.
- <b>SSH key-based authentication</b> between Control Domains.
- <b>Cryptographic compatibility</b> — same crypto resources (e.g. MAU) on both ends.
- <b>No DR delay</b> in flight — pending delayed-reconfig changes must be applied or cancelled first.
ldm migrate-domain -n guestdom1 target-host. This validates all preconditions without actually moving anything. The -n flag is your safety net.- Pre-checks: validate SSH connectivity, target resources, shared storage visibility.
- Dry run:
ldm migrate-domain -n guestdom1 target-host— verifies all preconditions. - Initiate:
ldm migrate-domain guestdom1 target-host. - Phase 1 — Setup: target creates an empty domain definition matching source.
- Phase 2 — Memory copy (pre-copy): source streams memory pages to target while guest continues running.
- Phase 3 — Dirty page iteration: repeatedly copies pages modified during the previous copy round; converges as dirty rate drops.
- Phase 4 — Suspend + final copy: guest briefly suspended; remaining dirty pages + CPU state transferred — typically sub-second.
- Phase 5 — Resume on target: target starts the guest; source releases resources.
- Verification:
ldm liston both hosts confirms guest is now on target with same uptime.
| Cause | Symptom | Fix |
|---|---|---|
| Storage not shared | Migration fails at validation | Confirm both hosts can see the vdisk backing store |
| VLAN mismatch | Guest loses network on target | Add matching vsw + vlan on target |
| CPU type mismatch | “Not compatible” error | Check ldm list -o domain target; use newer source |
| Insufficient resources on target | Validation fails | Free cores/memory on target before migrate |
| Pending delayed reconfig | Validation fails | ldm cancel-reconf or apply first |
| Dirty rate too high | Migration never converges | Migrate during low-load window |
| MAU / crypto mismatch | Validation fails | Match crypto on target |
| Firmware/hypervisor skew | Compatibility error | Patch one side to match |
- Check domain state:
ldm list guestdom1. Is itactive,bound, orinactive? - If
inactive: bind firstldm bind-domain guestdom1. - If
boundbut not starting:ldm start-domain guestdom1; check return code. - Connect to console:
ldm list -o console guestdom1gets the port;telnet localhost <port>to see boot output. - OBP visible? If you see
ok>, OS is not booting — checkboot-devicevariable. ok> printenv boot-device;ok> devalias;ok> probe-scsi-allif disks not seen.- Try
ok> bootmanually; capture errors. - If kernel panic visible: capture
::msgbufvia mdb (after reboot). - Resource issue?
ldm list -o resmgmton Control Domain — pending delayed-reconfig blocks operations. - vDisk backing store accessible? On Service Domain check
ldm list-services; verify zvol/file exists. - vNet/vSwitch up?
dladm show-linkin Service Domain.
- On Control/Service Domain:
ldm list-services— is the vdsdev still exported and bound? - Backing store:
ls -lthe file orzfs listthe zvol — does it still exist? Permissions correct? - Inside guest:
formatorecho | format— does the disk appear? If not, the path is broken. - Inside guest:
cfgadm -alfor SAN-attached, ordevfsadm -Cto refresh. - Check guest's
/var/adm/messagesfor I/O errors or device timeout. - If multipath:
mpathadm show LU— both paths up? - If migrated recently: did the target Service Domain export the same vdsdev name?
- If the vdsdev was accidentally removed:
ldm add-vdsdevwith the same backing store, then in the guestcfgadmto rescan.
Delayed reconfiguration is a mode the Control Domain enters when you make changes that require an LDOM reboot to take effect. Multiple changes can be queued, then applied together at the next stop/start cycle.
- Triggered when you change resources that the OS cannot accept dynamically.
- While in delayed-reconfig, most other operations are blocked until you commit or cancel.
- Common triggers: changing certain crypto, changing certain memory configs, modifying primary domain heavily.
- Visible via
ldm list -o resmgmtshowing pending changes.
If ldm rm-vdsdev was run on a live vdsdev, guests immediately lose access. Recovery: re-export with the same name and same backing store; the guest's vdisk reconnects.
ldm add-spconfig pre-change before any significant operation is best practice. It costs nothing and gives you a single-command rollback. Doubly important on production.- Confirm scope: only this LDOM, or others on the same host too? If multiple LDOMs lost network, suspect the host/vsw/physical NIC.
- On Control/Service Domain:
dladm show-link— physical NIC up? Any errors? ldm list-services primary— is the vsw still up and bound to the right NIC?ldm list -o network guestdom1— is vnet0 still attached?- Inside guest:
ipadm show-if,ipadm show-addr— interface up and addressed? - Guest's
/var/adm/messagesfor link state changes. - Ping in stages: guest → vsw IP (on Service Domain), guest → default gateway, guest → external.
- If only this guest is affected and link is up: check ARP cache (
arp -a), routes, and firewall. - Snoop from the Service Domain on the underlying NIC, filtered by the guest's IP — confirm packets reach/leave the host.
- If vsw issue: stop/start the vsw or migrate the guest to a different Service Domain's vsw.
This is the classic L3 question. The key insight: CPU utilization seen inside the guest is relative to what the guest has. The Control Domain sees the actual hardware utilization.
- On Control Domain:
ldm list— note CPU columns:UTIL%is real hardware utilization for that LDOM. IfUTIL%matches what the guest reports, the load is real. - If guest reports 100% but Control sees lower: guest is over-reporting because it doesn't see siblings sharing strands — “whole-core” allocation prevents this.
- If Control sees 100% but guest sees lower: guest is being throttled / waiting for CPU at the hypervisor level.
- Inside guest:
prstat -mLa— high LAT (latency) means threads waiting on CPU; high USR/SYS means real work. - Per-LWP profiling:
dtrace -n 'profile-997 /pid==<pid>/ { @[ustack()] = count(); }'. - On Control Domain:
cpustat -c <ldom_cpus> 1for hardware counter activity. - Compare with other LDOMs on the same host — if they're idle but yours is pegged, it's inside your guest.
- If hypervisor-level contention: temporarily add cores to the guest (
ldm add-core 2 guestdom1) and see if utilization drops — confirms throttling.
- Read the dry-run output first:
ldm migrate-domain -n -v guestdom1 targetnames the failing precondition. - <b>CPU compatibility</b>:
ldm list -o domain target— same chip family? (T4→T4, M7→M7 generally compatible; mixing is restricted.) - <b>Memory</b>: target has free memory >= guest's allocation?
- <b>Cores</b>: target has enough free cores in the right configuration?
- <b>Shared storage</b>: all guest vdisks must point to backing stores visible from both sides. Check vds + LUN paths.
- <b>Network</b>: equivalent vsw on the same VLAN exists on target?
- <b>Firmware/hypervisor</b>:
ldm -Vshows hypervisor version — should match. - <b>Crypto</b>: if guest has MAU allocations, target must have free MAU.
- <b>SSH/auth</b>: passwordless SSH between Control Domains is required.
- <b>Pending delayed-reconfig</b>:
ldm list -o resmgmt— must be clean. - <b>Time sync</b>: control domains should be in time agreement (NTP).
- <b>Logs</b>:
/var/svc/log/ldoms-ldmd:default.logon both sides for protocol-level errors.
Veritas Cluster Server (now Veritas InfoScale Availability) is an enterprise HA clustering product. It monitors applications and infrastructure, and on failure automatically fails services over to a healthy node — minimizing downtime. Runs on Solaris, AIX, HP-UX, Linux, Windows.
- Application-aware: agents probe each resource (IP, mount, app process) for liveness.
- Multi-node: 2 to 64 nodes; failover or parallel service groups.
- Storage agnostic: works with SAN-backed shared storage; VxVM/VxFS native.
- Mature: very common in banking, telco, large Oracle DB environments.
- Heavy: requires LLT (heartbeat), GAB (membership), HAD (engine), often I/O fencing.
| Concept | Definition | Example |
|---|---|---|
| Cluster | Set of nodes running VCS that share configuration | oracle-prod-cluster |
| System | A single node in the cluster | node1, node2 |
| Service Group (SG) | Collection of resources that fail over together | oracle_sg (= VIP + mount + listener + db) |
| Resource | Individual managed entity | DiskGroup, Mount, IP, Oracle |
| Resource Type | Agent that controls a class of resources | Mount, NIC, IPMultiNIC, Oracle |
| Dependency | Parent depends on Child (start child first) | Oracle depends on Mount depends on DiskGroup |
| Aspect | Failover SG | Parallel SG |
|---|---|---|
| Active where | One node at a time | All listed nodes simultaneously |
| Use case | Active/passive apps (most DBs) | Stateless apps, monitoring, NTP |
| Failover behavior | Moves to another node on fault | Independent restart on local node |
| Shared storage | Required (single owner) | Optional (or independent per node) |
| Examples | Oracle single-instance, NFS server | ClusterService, NIC monitor |
GAB (Group Membership Atomic Broadcast) is the VCS membership and broadcast layer. It tracks which nodes are alive in the cluster and provides reliable broadcast of cluster-wide messages — config changes, fault events. GAB uses LLT for the underlying transport.
- Configured via
/etc/gabtab— typicallygabconfig -c -n <num_nodes>. - GAB “ports” identify subsystems: a (GAB), b (I/O fencing), h (HAD/VCS engine), f (VxFS), v (CVM), w (vxconfigd).
- Each port must show membership of all expected nodes; missing port = that subsystem isn't joined.
- GAB seed = number of nodes required before the cluster is considered formed.
gabconfig -a is the second command after hastatus -sum. If port h shows different membership from port a, HAD has crashed on a node even though the kernel still thinks the node is up.LLT (Low Latency Transport) is the heartbeat/communication layer underneath GAB. It runs over private network links (or shared disks in some configs) and provides fast, reliable node-to-node messaging. Heartbeats detect node failures within sub-second timeframes.
- Configured in
/etc/llttab(link definitions) and/etc/llthosts(node IDs). - Recommended: at least TWO heartbeat links on separate switches/paths for redundancy.
- Detects link failure typically in 16–32 seconds depending on timeout settings.
- LLT runs over Ethernet (preferred) or over UDP (LLT-over-UDP) for routed environments.
- Does NOT run over the same subnet as data traffic — must be private.
HAD (High Availability Daemon) is the VCS engine — the userland process that owns the cluster configuration, runs agents, and makes decisions about online/offline/failover. It runs on every node and communicates over GAB port h.
- Reads config from
/etc/VRTSvcs/conf/config/main.cfandtypes.cf. - Spawns agents — one process per resource type per node — to monitor resources.
- If HAD dies,
hashadowrespawns it. If both fail, the node exits the cluster. - All
ha*commands (hares, hagrp, hastop) talk to HAD via local socket.
- Node boots; LLT driver loads (
llttab) and starts heartbeats on configured links. - GAB driver loads (
gabtab); waits for seed (configured node count) before opening ports. - Once GAB seeded: I/O fencing (vxfen) joins port b — coordinates fencing membership.
- HAD starts via SMF / init script; joins GAB port h.
- HAD reads
main.cf; rebuilds cluster state from peers via GAB. - Agents start for each Resource Type used by Service Groups on this node.
- Per Service Group
AutoStartList: SG comes online on the listed node. hastatus -sumreports the cluster + SG state.
lltstat -nvv), then GAB (gabconfig -a), then HAD (engine_A.log). Always work bottom-up — fixing HAD when LLT is broken is wasted effort.<b>Minimum two</b> heartbeat links, on physically independent paths. Veritas best practice is two LLT links + a low-priority heartbeat over the public network as backup.
- Two LLT links on separate NICs, separate switches.
- Optionally a low-pri (“ltm”) heartbeat over the public network for partition detection only.
- Three or more LLT links for very critical or geographically distributed clusters.
- Each link should have its own subnet/VLAN — never share a switch port group across links.
- VCS detects link failure via
lltstat— alert in engine log, but cluster continues. - Heartbeats automatically use the remaining link(s).
- If only ONE link remains, the cluster enters jeopardy state — single point of communication failure.
- If the last link fails: cluster is partitioned; fencing decides which side survives.
- Action: repair the failed link ASAP — engage networking; replace cable/NIC/switch port.
Jeopardy is the VCS state when the cluster has only ONE heartbeat link remaining — the redundancy is gone. If that last link fails, VCS cannot distinguish between a node death and a partition, so it changes failover behavior to avoid split-brain.
- Service Groups can still come online and fail over normally.
- But: if the last heartbeat link goes down, VCS will NOT automatically fail over an SG to the other side — it would risk running on both sides (split-brain).
- Operator intervention is then required to determine which side should host the SG.
- Jeopardy is a warning state: “one more failure away from manual intervention.”
Split-brain occurs when nodes can no longer communicate (all heartbeats failed) but each node is still alive. Each side believes the others are dead and tries to take over shared resources — risking double writes to shared storage and data corruption.
- All heartbeat links fail simultaneously (network failure, dual switch outage).
- Each node loses GAB membership of the others.
- Without fencing: each side promotes itself, mounts shared disks, starts the app — DATA CORRUPTION risk.
- With I/O fencing: only the side that wins the SCSI-3 reservation race can write to disks; the other side is fenced off (panics or stops resources).
I/O fencing is a mechanism to prevent a node from accessing shared storage when it has been ejected from the cluster. VCS uses SCSI-3 Persistent Reservations (PR) on shared disks: surviving nodes win the reservation race and registered keys remove the ejected node's access — the kernel itself blocks I/O.
- Activated automatically on split-brain or node ejection.
- Operates at the SCSI command layer — independent of OS or app.
- Coordinator disks (or coordination point server / CP server) used to break ties.
- Without fencing, two-node clusters cannot safely survive a heartbeat partition.
- Prevents <b>data corruption</b> caused by two nodes writing to the same shared storage simultaneously.
- Prevents <b>split-brain</b>: deterministic decision about which node survives a partition.
- Required for production deployments with shared storage. Non-fenced clusters are only safe with shared-nothing architectures.
- Many auditors require fencing as a compliance baseline for HA architectures.
SCSI-3 fencing uses Persistent Reservations on shared SAN LUNs. Each cluster node registers a unique key on each LUN; only nodes with current registrations can write. When a node is ejected, the survivor preempts its key and the ejected node's writes are rejected by the array — providing OS-independent isolation.
- <b>Coordination Points</b> — small LUNs used to break ties in even-node clusters. Three CPs is the standard count; an odd number is required to vote a majority.
- Can be: dedicated SAN LUNs (“coordinator disks”), CP servers (network-based), or a mix.
- On partition: each side races to gain majority of CPs. The losing side panics (“preempt-and-abort”), removing it from shared storage cleanly.
vxfentablists the coordinator disks in use.
- If fencing initialization fails at boot: HAD will refuse to start; the node won't join the cluster.
- If a fencing operation fails during a live event: the node attempting the eject typically panics itself to maintain integrity (“panic on fencing loss”).
- If coordinator disks are lost (e.g. SAN outage): fencing degrades. Add new CPs or replace before the next event.
- Operator action: never disable fencing under pressure. Engage Veritas/Symantec support; let the cluster degrade safely rather than risk corruption.
Freezing a Service Group tells VCS to stop monitoring/managing it — no auto-failover, no fault response. Used during maintenance so VCS doesn't react to expected disruption. Persistent freeze survives cluster restarts; ordinary freeze does not.
| Operation | Survives HAD restart? | Survives node reboot? | Typical Use |
|---|---|---|---|
| hagrp -freeze | No | No | Quick maintenance, single op |
| hagrp -freeze -persistent | Yes | Yes | Long maintenance, planned outage |
AutoStartList is an attribute on a Service Group listing the nodes where VCS should automatically bring the SG online when the cluster starts. Without it, SGs stay offline until manually started.
- VCS attempts to start the SG on the first listed node available.
- If that node is unavailable, it tries the next, and so on.
- Combine with
SystemListpriorities to control failover destination after fault.
SystemList defines which nodes are eligible to host a Service Group and their priority. Lower number = higher priority. Combined with policies like FailOverPolicy it determines failover targets.
hastatus -sum— what state is the SG in? FAULTED, PARTIAL, OFFLINE?- Check freeze state:
hagrp -display oracle_sg | grep -i freeze. A frozen SG won't move. - Auto-failover enabled?
hagrp -display oracle_sg | grep AutoFailOver. SystemList— are alternative nodes listed and eligible? Are they up?- Target node's resource state: maybe a dependent resource is FAULTED on the target side, blocking online.
tail /var/VRTSvcs/log/engine_A.log— VCS narrates every decision; the answer is usually in this log.- Resource-specific logs: agent logs in
/var/VRTSvcs/log/<agent>_A.log. - Try manual failover:
hagrp -switch oracle_sg -to node2. Failure messages name the cause. - Check for cluster-wide blockers:
hasys -display | grep Frozen— a frozen node accepts no SGs.
UNKNOWN means VCS cannot determine the resource state — usually because its monitor probe is failing or timing out.
- Check the resource type's agent:
ps -ef | grep <type>Agent— agent process running? - Agent log:
/var/VRTSvcs/log/<type>_A.log— what is the agent reporting? - Probe the resource manually:
hares -probe lvm_dg -sys node1— forces a monitor run. - Engine log:
/var/VRTSvcs/log/engine_A.logfor related decisions. - Resource attributes:
hares -display lvm_dg— checkMonitorInterval,MonitorTimeout; an underconfigured timeout returns UNKNOWN. - If the underlying app is genuinely confused: check it directly on the node (e.g.
vxdg listfor a DiskGroup resource). - If agent is hung:
haagent -stop <type> -sys node1thenhaagent -start <type> -sys node1to restart it.
- Check:
ps -ef | grep had— confirm absence. - Check
hashadow: it should respawn HAD automatically. If hashadow is also gone, both have failed. - Logs:
/var/VRTSvcs/log/engine_A.logfor the cause of crash (assertion, config error, panic). - Coredump? Solaris saves to /var/crash; check for HAD core files.
- Restart manually:
hastart. If immediate crash: examine config files —main.cf,types.cf. - If config is corrupt and won't load: copy a known-good
main.cf.bakin place and try again. Always keep backups. - If HAD repeatedly crashes due to bug: engage Veritas support with the engine_A.log + coredump; meanwhile keep SGs running on the remaining nodes.
- Make sure HAD restart doesn't disrupt active SGs: VCS is designed so HAD failure leaves SGs running; HAD restart re-attaches without disrupting them.
lltstat -nvv— confirms which link(s) are down and on which node.cat /etc/llttab— verify link declarations match physical interfaces.cat /etc/llthosts— node-id-to-hostname mapping correct.dladm show-linkoripadm show-if— physical interface state.- Cable / switch: ask networking to verify port up, no errors, correct VLAN.
lltstat -l— packet rates per link; zero rates = no traffic at all.- If LLT itself is broken:
lltconfigshows driver state; reload withlltconfig -U+lltconfig -conly after stopping VCS.
gabconfig -a— see which ports are open and which nodes are in each port's membership.- Identify the missing port: a (gab base), b (fencing), h (HAD).
- If port h is missing on a node: HAD isn't running there. Restart HAD (
hastart). - If port b is missing: fencing isn't initialized; check
vxfenadm -dand/etc/vxfenmode. - If port a is missing entirely: GAB seed not reached. Check
cat /etc/gabtaband confirm all expected nodes are configured. gabconfig -lshows GAB driver state; checkcat /etc/gabtabto confirm seed value.- Engine log + GAB messages in
/var/adm/messagesname protocol-level errors.
- Failed node stops sending LLT heartbeats; surviving node's LLT detects loss within timeout (typically 16 seconds).
- GAB on survivor sees member loss; cluster membership updates to 1.
- I/O fencing kicks in: surviving node races for coordinator disk reservations to confirm it's the legitimate survivor.
- If fencing succeeds: HAD on survivor declares the failed node EXITED.
- VCS evaluates Service Groups that were ONLINE on the failed node: it will fail them over if they're eligible on this node (SystemList, no freeze, AutoFailOver=1).
- For each affected SG: VCS brings up resources in dependency order (DiskGroup → Mount → IP → Application).
- Each resource's agent runs its
onlineaction; monitor verifies it; next resource starts. - Once all resources are ONLINE, the SG state becomes ONLINE on the survivor.
- Application is back in service; clients reconnect via the VIP (which moved to the survivor).
- Failed node, when rebooted, joins cluster as PASSIVE (SGs remain on survivor unless re-balanced).
- <b>SG is frozen</b>:
hagrp -display oracle_sg | grep Frozen. Frozen SGs don't move. - <b>AutoFailOver=0</b>: SG configured not to auto-fail-over. Operator must manually
hagrp -switch. - <b>Target node frozen</b>:
hasys -display node2 | grep Frozen. Frozen nodes accept no SGs. - <b>SystemList exhausted</b>: the SG ran out of eligible target nodes (all faulted or not in list).
- <b>Resource fault on target</b>: a resource is already FAULTED on the target node (e.g. previous attempt left a stale state).
- <b>Fencing failed</b>: cluster cannot complete the eject, so it refuses to move SGs.
- <b>Persistent attribute conflict</b>: TriggersEnabled or AdminWait state — engine log explains.
- <b>Concurrency violation</b>: another SG with conflicting resources is already online on the target.
- Work bottom up: LLT → GAB → fencing → HAD.
- <b>LLT</b>:
lltstat -nvv— are heartbeats flowing? Check/etc/llttabmatches reality. - <b>GAB</b>:
gabconfig -a. If port a is missing on this node, checkcat /etc/gabtabseed value. - <b>Fencing</b>:
vxfenadm -d— fencing module loaded and joined? Check coordinator disk visibility. - <b>HAD</b>:
ps -ef | grep had; checkengine_A.logfor startup errors. - <b>Config consistency</b>: this node's
main.cfmust match the cluster's; if it joined and config diverged, HAD refuses. - <b>Cluster ID mismatch</b>: confirm
set-clusterinllttabmatches the other nodes. - <b>Patch level / kernel</b>: VCS expects matching kernel versions; major patch skew can prevent join.
- <b>Network</b>: are private LLT links physically up to the cluster? Many “won't join” issues are misseated cables on the heartbeat NICs.
- SMF/init:
svcs -xv— find which VCS-related service failed. - Engine log:
/var/VRTSvcs/log/engine_A.log— most VCS startup issues are explicitly logged here. - Kernel modules loaded?
modinfo | grep -i 'llt\|gab\|vxfen'— missing modules = kernel/Veritas package mismatch. - Module version vs package version:
pkg list VRTS* | grep vcsandmodinfooutput — patch may have updated kernel but not VRTS package, or vice versa. - Check
/etc/llttab,/etc/llthosts,/etc/gabtabstill exist and aren't corrupted. - Try manual driver load:
/etc/init.d/llt start ; /etc/init.d/gab start— see specific error. - If patch corrupted modules: reinstall the affected VRTS packages; reapply Veritas SP if available.
- Veritas support: provide
vxexploreroutput bundle. - Last resort if it's truly broken: bring up the other node first, then troubleshoot the failed node offline.
Removing a node is a routine but high-stakes change. Plan and execute methodically; ensure no SG depends on the departing node for HA.
- Raise a Change Request; communicate with app teams about reduced redundancy.
- Switch any active SGs OFF the departing node:
hagrp -switch <sg> -to <other_node>. Verify each one is healthy on its new home. - Remove the departing node from each SG's
SystemListandAutoStartList:hagrp -modify <sg> SystemList -delete <node>. - If any resource has the node in
FailOvertargets or attributes referencing it, clean those too. - Save the running config to disk:
haconf -dump. - Stop VCS on the departing node:
hastop -local. - Remove fencing reservation for that node: it should drop out of coordinator disk membership automatically.
- Edit
/etc/llthostson REMAINING nodes to remove the node's entry; edit/etc/gabtabto lower the seed count. - Restart LLT/GAB or reboot remaining nodes in a rolling fashion if seed change requires it.
- On the departed node: stop and disable VCS SMF services; uninstall VRTS packages if decommissioning; remove from inventory.
- Update CMDB, runbook, monitoring, on-call rotation.
SystemList entries on every SG will still reference the missing node — VCS will throw errors on every config change attempt until you clean it up properly.Low CPU/memory with user-reported slowness means the bottleneck is somewhere other than capacity. Classic causes: I/O, locks, network, application logic, dependent services.
- <b>Quantify the slowness</b>: time a specific user operation; ask app team for transaction logs with timestamps.
- <b>Storage I/O</b>:
iostat -xnz 1 5— highasvc_t(>30 ms) or%b(>80%) means storage saturation. Disk-bound apps look CPU-idle. - <b>Thread state</b>:
prstat -mLa 1— highLCK= lock contention; highSLP= waiting for resources; highDFL= paging. - <b>Network</b>:
nicstat 1; check latency to upstream services (DB, app server, LDAP). - <b>Dependent services</b>: slow DNS, slow LDAP, slow database — application sits idle waiting. Test each from this host.
- <b>NFS</b>:
nfsstat -mon any NFS mounts; slow NFS server makes the app look slow. - <b>App logs</b>: many “slow” issues are application-level (GC pauses, connection pool exhaustion, lock waits in code).
- <b>DTrace</b>:
dtrace -n 'syscall:::entry /pid==<pid>/ { @[probefunc] = count(); }'for syscall mix; identify what the app actually spends time on. - <b>Recent changes</b>:
showrev -p, app deploy logs — sudden slowness often follows a change.
prstat -mLa 1 5. The microstate columns tell you exactly where threads spend time — USR (CPU), LCK (locks), SLP (waiting), LAT (run queue), DFL (paging). 90% of slow-but-not-CPU cases are diagnosed from this output alone.- Confirm pattern:
grep FAULTED /var/VRTSvcs/log/engine_A.log | tail -20— what time, which resource, which node? - Identify the resource that triggered the fault: a SG fault originates from ONE resource's monitor failure.
- Read that resource's agent log:
/var/VRTSvcs/log/<ResourceType>_A.logfor the same timestamps. - Resource-specific health: e.g. for a Mount resource, check
dmesg//var/adm/messagesfor I/O errors at the fault timestamp. - Look for periodicity: every N hours suggests a cron job, a backup, or a scheduled GC/maintenance window.
- Resource attributes:
hares -display <res> | grep -i 'monitor\|timeout'— too-aggressiveMonitorTimeoutcan produce spurious faults. - Underlying issue: app process restarting on its own? Network blip? Storage latency? — fault means VCS monitor returned OFFLINE.
- Mitigation: increase
MonitorTimeoutonly after confirming the underlying transient is benign; raising it blindly hides real problems. - Open a Problem Record (not just resolve the incident); recurring SG faults need a documented RCA.
- Quick triage:
timeout 5 ls /mnt— confirms the mount is wedged without hanging your shell. - NFS server reachability:
ping nfs-srv,showmount -e nfs-srvfrom another host. - If NFS server is down/restarting: it may recover automatically once the server returns;
hardmounts wait indefinitely. fuser -c /mnt— lists processes touching the mount. These are stuck in 'D' state and can't be killed normally.- Try a forced lazy unmount:
umount -f /mnt. On Solaris this often hangs if processes still hold the FS — proceed to next step. - Kill stuck processes:
fuser -ck /mnt— this issues SIGKILL. Withhard,intrmounts and intr-aware syscalls, processes can be killed; without intr, they may stay stuck. - Once all processes are gone:
umount -f /mntshould succeed. - Repair the underlying NFS server first if it's the issue; remount after server is healthy.
- Preventive: change to
hard,intr,timeo=300,retrans=2on non-critical mounts. Critical mounts stayhard,intr.
fuser -ck is destructive — those processes lose any unsaved work. In production always confirm with the app owner before killing; if the NFS server can be restored, that's the safer path.Layered triage — confirm what the zone is and isn't doing, then narrow.
- From GZ:
zoneadm list -cv— is it running or down? - From GZ:
prstat -Z 1 3— does the zone show CPU/memory consumption? If it's pegged at its cap, that's your answer. rcapstat 1— is the memory cap being enforced (pages out)?- From GZ:
zlogin appzone uptime— does the zone respond at all? If timeout, the kernel/zone interaction is degraded. - If
zloginworks: inside zoneprstat -mLa,vmstat 1,iostat -xnz 1. - Filesystem:
df -hinside zone;du -sh /*to find space hogs. - Network: from GZ
snoopon the zone's VNIC; inside the zoneipadm show-addr,route -n,pingtests. - If
zloginhangs entirely but GZ is healthy: zone may be in a stuck state. Tryzoneadm -z appzone reboot -- -ias a careful restart. - If still stuck and zone is critical: forcibly halt and boot:
zoneadm -z appzone haltthenboot.
- Confirm migration completed cleanly:
ldm liston target — UTIL%, allocated cores/memory should match source. - Whole-core allocation preserved?
ldm list-bindings target-ldom; mismatched core layout vs source can hurt cache locality. - I/O Domain path: on the target, are vdisks served by the same Service Domain as before? A migration might have re-pathed via a slower service domain.
iostat -xnz 1inside the guest — hasasvc_tchanged materially compared to before migration?- Network: VLAN/vsw on target equivalent?
netstat -iin guest — retransmits or drops post-migration? - CPU generation difference: even compatible generations have small clock/cache differences; if the target is a slower model, you'll see a measurable hit.
- Memory placement: post-migration, all guest memory may end up on one socket (NUMA imbalance). On large guests this is significant.
- Crypto offload: did MAU/crypto units transfer? If guest uses SSL heavily, missing crypto means software fallback = slow.
- Application reconnection state: connection pools, caches, TCP — sometimes “slow after migration” is just cold caches; measure after warmup.
- Mitigation: migrate back to source as a test; if perf restored, you've identified target as the issue.
- <b>Pre-work</b>: identify every Service Group that includes the node in its
SystemList:hagrp -list | awk '...'or simply iterate and grep. - <b>Migrate active SGs off</b>:
hagrp -switch <sg> -to <other>for each currently ONLINE on the node. Wait for each to be confirmed online elsewhere. - <b>Remove from SystemList</b>: for each affected SG,
hagrp -modify <sg> SystemList -delete <node>. - <b>Remove from AutoStartList</b>:
hagrp -modify <sg> AutoStartList -delete <node>for any SG that listed the node. - <b>Clean other attributes</b>:
FailOverPolicy,PreOnlinetriggers, agent-specific attributes that reference the node. - <b>Persist config</b>:
haconf -dump -makeroto save tomain.cf. - <b>Stop VCS on the node</b>:
hastop -local. This leaves the SGs running on their current homes. - <b>LLT/GAB membership</b>: edit
/etc/llthostson remaining nodes to remove the entry; lower the GAB seed in/etc/gabtabif needed. - <b>Fencing</b>: confirm coordinator disks no longer reference the node's reservation key.
- <b>On the decommissioned node</b>: stop+disable SMF services; uninstall VRTS packages if retiring hardware; unzone/unrack as appropriate.
- <b>Verify cluster health</b>:
hastatus -sumon remaining nodes — confirm clean state, no warnings. - <b>Documentation</b>: update CMDB, runbooks, monitoring inventory, on-call rotation, DR plan.
Solaris — Linux Admin Guide: LDOM, SVM & Health Checks
LDOM live migration, SVM disk mirroring, and Solaris health check commands from the Linux Admin reference guide
LDOM Live Migration Steps
/opt/IHSldmcfg/sbin/PWP_config -c then -s to set up the ldommig account password. Then ensure xmpp_enabled and incoming_migration_enabled are set to true via svccfg.LDOMs (Logical Domains) are hypervisor-level virtualization on SPARC servers — each LDOM has its own OS, CPU cores, memory, and I/O devices. It's full hardware virtualization. Zones (Solaris Containers) are OS-level virtualization — multiple zones share the same kernel. LDOMs provide stronger isolation (separate kernels), Zones provide more lightweight density. LDOMs require SPARC T-series or similar hypervisor-capable hardware. Zones can run on any Solaris system.
The LDOM configuration (spconfig) stored in NVRAM tells the SP (Service Processor) how to configure domains at boot. After a migration, the configuration in NVRAM on both the source and destination frames is outdated. If either frame reboots without an updated spconfig, the LDOM layout won't match reality. ldm add-spconfig YYYYMMDD.N-normal saves the current running config to NVRAM. Always do this on BOTH source and destination frames post-migration.
Solaris SVM Disk Mirroring Procedure
Solaris Volume Manager (SVM) mirroring steps for root + swap + data partitions. Essential for HA on legacy SPARC systems.
- 1Backup
/etc/vfstab:cp /etc/vfstab /etc/vfstab.orig - 2Partition mirror disk identical to boot disk:
prtvtoc /dev/rdsk/c0t0d0s2 | fmthard -s - /dev/rdsk/c0t1d0s2 - 3Create state DB replicas (at least 3):
metadb -a -f -c 3 c0t0d0s7 c0t1d0s7 - 4Create submirrors for root:
metainit -f d10 1 1 c0t0d0s0,metainit d0 -m d10 - 5Run metaroot:
metaroot d0(updates /etc/vfstab and /etc/system) - 6Mirror swap and all other slices similarly
- 7Reboot:
lockfs -fa && init 6 - 8Attach second submirrors:
metattach d0 d20 - 9Monitor sync:
while true; do metastat | grep %; sleep 10; done - 10Install boot block:
installboot /usr/platform/`uname -i`/lib/fs/ufs/bootblk /dev/rdsk/c0t1d0s0
State database replicas (metadb) store the configuration and state of all meta-devices. SVM uses a voting quorum system — it needs a majority of replicas to be active to function. With 3 replicas, you can lose 1 and still have 2 (majority). With 2 replicas, losing 1 leaves only 1, which isn't a majority, so the system panics (refuses to continue) to prevent data corruption. Best practice: create an odd number (3, 5, 7) spread across multiple disks for maximum fault tolerance.