service-control --status shows services STOPPEDNo space left on device in /var/log/messagesIdentify which partitions are full
# SSH to VCSA as root:
df -h
# Check top consumers per partition:
du -sh /storage/log/* | sort -rh | head -20
du -sh /storage/db/* | sort -rh | head -10
du -sh /storage/seat/* | sort -rh | head -10
Check service status and identify stopped services
# List all service states:
service-control --status
# Check for core dumps consuming space:
ls -lh /storage/core/
du -sh /storage/core/
Clean old logs and rotate current logs
# Remove old compressed logs:
find /storage/log -name "*.gz" -mtime +7 -delete
find /storage/log -name "*.log.*" -mtime +3 -delete
# Force log rotation:
logrotate -f /etc/logrotate.conf
# Clean old core dumps:
rm -f /storage/core/core.*
Restart services after freeing space
# Verify space recovered:
df -h
# Start all vCenter services:
service-control --start --all
# Verify all services running:
service-control --status
Expand disk or resize VCSA for long-term fix
# Option A — Expand disk via VAMI:
# https://vcsa:5480 → Storage → Increase storage size
# Option B — Resize VCSA deployment size:
# Shut down VCSA → Increase CPU/RAM/Disk in vSphere
# Boot → VAMI detects new size automatically
# Option C — Move to larger VCSA size:
# Backup → Deploy new VCSA with correct sizing → Restore
service-control --status vmware-vpxd shows STOPPEDPanic: Unhandled exception or ODBC errorCheck vpxd logs for crash reason
# Primary vpxd log:
tail -200 /var/log/vmware/vpxd/vpxd.log | grep -i "error\|panic\|abort\|fatal"
# Profiler log for performance/DB issues:
tail -100 /var/log/vmware/vpxd/vpxd-profiler.log | grep -i "pool\|connection\|timeout"
# Check if OOM killed:
journalctl -u vmware-vpxd --since "1 hour ago" | grep -i "oom\|killed"
Verify database connectivity
# Test PostgreSQL connection:
/opt/vmware/vpostgres/current/bin/psql -U postgres -d VCDB -c "SELECT 1;"
# Check active connections:
/opt/vmware/vpostgres/current/bin/psql -U postgres -d VCDB \
-c "SELECT count(*) FROM pg_stat_activity;"
Restart vpxd service cleanly
# Stop vpxd and its dependencies:
service-control --stop vmware-vpxd
# Wait 10 seconds, then start:
service-control --start vmware-vpxd
# Monitor startup in real-time:
tail -f /var/log/vmware/vpxd/vpxd.log
Increase DB connection pool if exhausted
# Edit vpxd configuration:
vi /etc/vmware-vpxd/vpxd.cfg
# Find and increase maxDbConnections:
# <maxDbConnections>80</maxDbConnections>
# Restart vpxd after change:
service-control --stop vmware-vpxd
service-control --start vmware-vpxd
Remove problematic plugin if blocking startup
# List registered extensions via MOB:
# https://vcsa/mob → content → ExtensionManager → extensionList
# Or via CLI — query registered extensions:
/opt/vmware/vpostgres/current/bin/psql -U postgres -d VCDB \
-c "SELECT ext_key FROM vpx_ext WHERE enabled = true;"
# Disable a problematic extension:
/opt/vmware/vpostgres/current/bin/psql -U postgres -d VCDB \
-c "UPDATE vpx_ext SET enabled = false WHERE ext_key = 'com.vendor.plugin';"
kill -9 — this can corrupt in-flight DB transactions. Always use service-control for clean shutdown. If vpxd is in a crash loop, check certificate validity before anything else: expired machine SSL certs are the #1 cause of persistent vpxd failures.
ODBC connection timeout or connection refused/storage/db partition usage climbing rapidlytoo many connections for role "vc"Connect to PostgreSQL and check connection stats
# Connect to embedded PostgreSQL:
/opt/vmware/vpostgres/current/bin/psql -U postgres VCDB
# Check active connections:
SELECT datname, usename, state, query_start, query
FROM pg_stat_activity
WHERE datname = 'VCDB'
ORDER BY query_start;
# Connection count vs max:
SELECT count(*) AS active,
(SELECT setting FROM pg_settings WHERE name='max_connections') AS max
FROM pg_stat_activity;
Check table bloat and vacuum status
# Find largest tables:
SELECT schemaname, relname,
pg_size_pretty(pg_total_relation_size(relid)) AS total_size,
n_dead_tup, last_autovacuum
FROM pg_stat_user_tables
ORDER BY pg_total_relation_size(relid) DESC
LIMIT 20;
# Check WAL file accumulation:
SELECT count(*) FROM pg_ls_waldir();
Kill long-running queries and run vacuum
# Kill idle-in-transaction connections older than 1 hour:
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE state = 'idle in transaction'
AND query_start < now() - interval '1 hour';
# Run manual vacuum on bloated tables:
VACUUM (VERBOSE, ANALYZE) vpx_event;
VACUUM (VERBOSE, ANALYZE) vpx_event_arg;
VACUUM (VERBOSE, ANALYZE) vpx_task;
VACUUM (VERBOSE, ANALYZE) vpx_task_arg;
Purge old events and tasks
# Check event/task counts:
SELECT count(*) FROM vpx_event;
SELECT count(*) FROM vpx_task;
# Delete events older than 30 days (adjust as needed):
DELETE FROM vpx_event_arg WHERE event_id IN
(SELECT event_id FROM vpx_event WHERE create_time < now() - interval '30 days');
DELETE FROM vpx_event WHERE create_time < now() - interval '30 days';
# Reclaim space after large deletes:
VACUUM FULL vpx_event;
VACUUM FULL vpx_event_arg;
Tune PostgreSQL settings for vCenter workload
# Key tuning parameters in postgresql.conf:
# /storage/db/vpostgres/postgresql.conf
# Increase max connections if needed:
max_connections = 100
# Tune autovacuum to be more aggressive:
autovacuum_vacuum_cost_delay = 10
autovacuum_vacuum_cost_limit = 400
autovacuum_max_workers = 4
# Restart PostgreSQL after changes:
service-control --stop vmware-vpostgres
service-control --start vmware-vpostgres
Connect-VIServer returns 401 Unauthorizedcom.vmware.vapi.std.errors.unauthenticatedToken is not valid: expired certificateCheck STS certificate expiry date
# Check all trusted certificates:
/usr/lib/vmware-vmafd/bin/dir-cli trustedcert list --login administrator@vsphere.local
# For each cert ID, check expiry:
/usr/lib/vmware-vmafd/bin/dir-cli trustedcert get --id <cert-id> --outcert /tmp/cert.pem
openssl x509 -in /tmp/cert.pem -noout -dates
# Quick check — STS signing cert in VMDIR:
/usr/lib/vmware-vmafd/bin/vecs-cli entry list --store STS_INTERNAL_SSL_CERT
Check machine SSL and solution user certificates
# Machine SSL cert expiry:
/usr/lib/vmware-vmafd/bin/vecs-cli entry getcert --store MACHINE_SSL_CERT --alias __MACHINE_CERT \
| openssl x509 -noout -dates
# List all certificate stores:
/usr/lib/vmware-vmafd/bin/vecs-cli store list
# Check each store for expired certs:
for store in $(/usr/lib/vmware-vmafd/bin/vecs-cli store list); do
echo "=== $store ==="
/usr/lib/vmware-vmafd/bin/vecs-cli entry list --store "$store" 2>/dev/null
done
Renew STS signing certificate using fixsts script
# VMware KB 79248 — fix expired STS certificate:
# Download fixsts.sh from VMware KB or use built-in:
# Option A — Use the fixsts.sh script:
chmod +x /tmp/fixsts.sh
/tmp/fixsts.sh
# Option B — Use certificate-manager (interactive):
/usr/lib/vmware-vmca/bin/certificate-manager
# Select Option 8: Reset all certificates
# After renewal, restart all services:
service-control --stop --all
service-control --start --all
Verify certificate renewal and test login
# Verify new STS cert dates:
/usr/lib/vmware-vmafd/bin/dir-cli trustedcert list --login administrator@vsphere.local
# Test authentication:
curl -k -X POST "https://localhost/rest/com/vmware/cis/session" \
-u "administrator@vsphere.local:PASSWORD"
# Check all services healthy:
service-control --status
# Verify from vSphere Client login page
Fix clock skew if present
# Check VCSA time:
date
timedatectl status
# Configure NTP on VCSA:
# VAMI → Time → Edit NTP servers
# Or via CLI:
/usr/lib/vmware-applmgmt/bin/timesync.py set --mode NTP
/usr/lib/vmware-applmgmt/bin/timesync.py set --servers "ntp1.example.com ntp2.example.com"
Content library sync session failedSSL certificate problem: unable to get local issuer certificateTest connectivity from subscriber vCenter to publisher URL
# SSH to subscriber VCSA — test HTTPS connectivity:
curl -vk https://publisher-vcsa.example.com:443/cls/vcsp/lib/<library-id>/lib.json
# Check DNS resolution:
nslookup publisher-vcsa.example.com
# Test port connectivity:
python3 -c "import socket; s=socket.create_connection(('publisher-vcsa.example.com', 443), timeout=5); print('OK'); s.close()"
Verify publisher SSL certificate thumbprint
# Get current publisher certificate thumbprint:
echo | openssl s_client -connect publisher-vcsa.example.com:443 2>/dev/null \
| openssl x509 -noout -fingerprint -sha256
# Compare with thumbprint configured in subscribed library:
# vSphere Client → Content Libraries → Select subscribed library → Settings
# Check Content Library logs:
tail -100 /var/log/vmware/content-library/cls.log | grep -i "error\|fail\|ssl"
Update SSL thumbprint and resync
# In vSphere Client:
# Content Libraries → Select subscribed library → Actions → Edit Settings
# Click "Probe" to fetch new publisher cert → Accept thumbprint
# Click "Sync Now"
# Or via REST API:
curl -k -X POST "https://vcsa/rest/com/vmware/content/subscribed-library/id:<lib-id>?~action=sync" \
-H "vmware-api-session-id: <session-id>"
Configure proxy settings if needed
# Set proxy for VCSA outbound connections:
# VAMI (https://vcsa:5480) → Networking → Proxy Settings
# Or via CLI:
/opt/vmware/share/vami/vami_set_proxy https proxy.example.com 8080
# Verify proxy is applied:
/opt/vmware/share/vami/vami_get_proxy
# Add no-proxy exceptions for internal publisher:
# No proxy: localhost,127.0.0.1,publisher-vcsa.example.com
Recreate library if persistent corruption
# If sync continues to fail after all fixes:
# 1. Delete the broken subscribed library
# 2. Re-create it with the correct publisher URL
# 3. Accept the SSL thumbprint
# 4. Set sync schedule (immediate or on-demand)
# Verify sync completes:
# Content Libraries → Select library → check "Last Successful Sync" timestamp
Verify vmdir replication status across all nodes
# Check replication status:
/usr/lib/vmware-vmdir/bin/vdcrepadmin -f showpartners \
-h localhost -u administrator -w 'PASSWORD'
# Check replication agreements:
/usr/lib/vmware-vmdir/bin/vdcrepadmin -f showservers \
-h localhost -u administrator -w 'PASSWORD'
# Verify no replication lag:
/usr/lib/vmware-vmdir/bin/vdcrepadmin -f showpartnerstatus \
-h localhost -u administrator -w 'PASSWORD'
Verify all services are healthy before convergence
# On the vCenter:
service-control --status
# On the external PSC:
service-control --status
# Verify VCHA (if configured) is disabled before convergence:
# vSphere Client → vCenter HA → Edit → Turn Off vCenter HA
Run the convergence tool on vCenter
# SSH to the vCenter Server (not the PSC):
# Run the convergence CLI tool:
/usr/lib/vmware-vmca/bin/cdc-converge
# The tool will:
# 1. Validate current topology
# 2. Move SSO/vmdir data into the embedded vCenter
# 3. Reconfigure endpoints
# 4. Restart all services
# Monitor progress — convergence takes 15-30 minutes
Verify convergence success and decommission PSC
# After convergence — verify topology:
/usr/lib/vmware-vmdir/bin/vdcrepadmin -f showservers \
-h localhost -u administrator -w 'PASSWORD'
# Should show only vCenter nodes, no external PSC
# Verify all services running on vCenter:
service-control --status
# Test login to vSphere Client
# Test SSO, permissions, roles
# Decommission external PSC:
# 1. Take final backup of PSC
# 2. Power off PSC VM
# 3. After 7 days of stable operation, delete PSC VM
Configure backup schedule via VAMI
# Access VAMI:
# https://vcsa:5480 → Backup → Configure Backup Schedule
# Settings:
# Protocol: SCP (recommended)
# Server: backup-server.example.com
# Path: /backups/vcsa/
# Username: backup-user
# Schedule: Daily at 02:00
# Retention: Keep last 5 backups
# Backup type: Full (with stats)
# Encryption: Enable with strong passphrase
Configure backup via REST API (for automation)
# Create a backup schedule via API:
curl -k -X POST "https://vcsa/api/appliance/recovery/backup/schedules" \
-H "vmware-api-session-id: $SESSION" \
-H "Content-Type: application/json" \
-d '{
"schedule_id": "daily-backup",
"spec": {
"location": "scp://backup-server.example.com/backups/vcsa",
"location_user": "backup-user",
"location_password": "PASSWORD",
"enable": true,
"recurrence_info": {
"minute": 0, "hour": 2,
"days": ["MONDAY","TUESDAY","WEDNESDAY","THURSDAY","FRIDAY","SATURDAY","SUNDAY"]
},
"retention_info": { "max_count": 5 },
"backup_password": "ENCRYPTION_PASSPHRASE"
}
}'
Trigger manual backup and verify
# Trigger on-demand backup via VAMI:
# https://vcsa:5480 → Backup → Backup Now
# Or via API:
curl -k -X POST "https://vcsa/api/appliance/recovery/backup/jobs" \
-H "vmware-api-session-id: $SESSION" \
-H "Content-Type: application/json" \
-d '{
"piece": { "location": "scp://backup-server.example.com/backups/vcsa",
"location_user": "backup-user",
"location_password": "PASSWORD",
"backup_password": "ENCRYPTION_PASSPHRASE",
"parts": ["common","seat"] }
}'
# Monitor backup job:
curl -k "https://vcsa/api/appliance/recovery/backup/jobs" \
-H "vmware-api-session-id: $SESSION"
Restore VCSA from file-based backup
# Full restore process:
# 1. Mount VCSA ISO on a workstation with network access
# 2. Launch the VCSA Installer
# 3. Select "Restore" instead of "Install"
# 4. Stage 1: Deploy new VCSA appliance (fresh OVA)
# 5. Stage 2: Select "Restore from file-based backup"
# - Protocol: SCP/FTP/etc.
# - Backup location: scp://backup-server/backups/vcsa/
# - Select the backup to restore
# - Enter encryption passphrase
# 6. Wait for restore to complete (30-90 minutes)
# 7. Verify vSphere Client access and all services
"An internal error has occurred"Check vSphere Client UI logs for plugin errors
# vSphere Client (HTML5) logs:
tail -200 /var/log/vmware/vsphere-ui/logs/vsphere_client_virgo.log \
| grep -i "error\|exception\|plugin\|extension"
# Check plugin loading times:
grep -i "plugin.*load\|extension.*register" \
/var/log/vmware/vsphere-ui/logs/vsphere_client_virgo.log | tail -30
# Check for connectivity issues to plugin backends:
grep -i "connect.*refused\|timeout\|unreachable" \
/var/log/vmware/vsphere-ui/logs/vsphere_client_virgo.log | tail -20
List all registered extensions
# Via MOB (Managed Object Browser):
# https://vcsa/mob → content → ExtensionManager → extensionList
# Review each extension's key, description, and server URL
# Via PowerCLI:
Connect-VIServer vcsa.example.com
$ext = Get-View ExtensionManager
$ext.ExtensionList | Select-Object Key,
@{N='Company';E={$_.Description.Label}},
@{N='Version';E={$_.Version}} | Format-Table -AutoSize
Unregister broken plugin via MOB
# 1. Navigate to MOB:
# https://vcsa/mob → content → ExtensionManager
# 2. Click "UnregisterExtension" method
# 3. Enter the extension key (e.g., "com.vmware.vrops.install")
# 4. Click "Invoke Method"
# Common plugin keys to check:
# com.vmware.vrops.install — vROps
# com.vmware.vcHms — NSX
# com.vmware.vcDr — SRM
# com.vmware.vsan.health — vSAN Health
Clear vSphere Client cache and restart
# Stop the vSphere Client service:
service-control --stop vsphere-ui
# Clear the client cache:
rm -rf /etc/vmware/vsphere-ui/vc-packages/vsphere-client-serenity/*
rm -rf /etc/vmware/vsphere-ui/cm-init-status
# Restart vSphere Client:
service-control --start vsphere-ui
# Monitor startup (takes 2-5 minutes):
tail -f /var/log/vmware/vsphere-ui/logs/vsphere_client_virgo.log
Re-register plugin with correct version
# After fixing the plugin backend (upgrade, cert renewal, etc.):
# Re-register from the product's management interface:
# For NSX: NSX Manager → vCenter Registration → Re-register
# For SRM: SRM appliance → Reconfigure → Register vCenter plugin
# For vROps: vROps → Administration → vCenter Adapter → Re-register
# Verify in MOB that the new version is registered:
# https://vcsa/mob → content → ExtensionManager → extensionList
Failed to connect to lookup serviceList all Lookup Service registrations
# Use lstool to list all registered endpoints:
python /usr/lib/vmware-lookupsvc/tools/lstool.py list \
--url https://localhost/lookupservice/sdk \
--no-check-cert
# Filter for specific service types:
python /usr/lib/vmware-lookupsvc/tools/lstool.py list \
--url https://localhost/lookupservice/sdk \
--no-check-cert --type vcenterserver
# Check for stale entries (services that no longer exist):
python /usr/lib/vmware-lookupsvc/tools/lstool.py list \
--url https://localhost/lookupservice/sdk \
--no-check-cert 2>&1 | grep -i "serviceUrl\|nodeId"
Check solution user status and certificates
# List solution users:
/usr/lib/vmware-vmafd/bin/dir-cli service list \
--login administrator@vsphere.local
# Check specific solution user certificate:
/usr/lib/vmware-vmafd/bin/vecs-cli entry list --store vpxd-extension
# Verify Lookup Service is healthy:
service-control --status vmware-lookupsvc
tail -50 /var/log/vmware/lookupsvc/lookupsvc.log | grep -i "error\|fail"
Remove stale Lookup Service entries
# Unregister a stale service endpoint:
python /usr/lib/vmware-lookupsvc/tools/lstool.py unregister \
--url https://localhost/lookupservice/sdk \
--no-check-cert \
--id "<service-id-from-list>" \
--user "administrator@vsphere.local" \
--password "PASSWORD"
# After cleanup, restart affected services:
service-control --stop --all
service-control --start --all
Re-register solution users
# Re-register vpxd solution user:
/usr/lib/vmware-vpxd/bin/vpxd_servicecfg fix
# Or use certificate-manager to refresh solution user certs:
/usr/lib/vmware-vmca/bin/certificate-manager
# Option 6: Replace solution user certificates with VMCA certificates
# Restart all services after re-registration:
service-control --stop --all
service-control --start --all
# Verify endpoints are registered:
python /usr/lib/vmware-lookupsvc/tools/lstool.py list \
--url https://localhost/lookupservice/sdk --no-check-cert
Fix Enhanced Linked Mode registration
# If ELM is broken between vCenters:
# Verify vmdir replication is working:
/usr/lib/vmware-vmdir/bin/vdcrepadmin -f showpartnerstatus \
-h localhost -u administrator -w 'PASSWORD'
# Re-point the Lookup Service if FQDN changed:
cmsso-util repoint --repoint-psc psc.example.com \
--username administrator@vsphere.local \
--passwd 'PASSWORD'
# Verify cross-vCenter connectivity:
python /usr/lib/vmware-lookupsvc/tools/lstool.py list \
--url https://remote-vcsa/lookupservice/sdk --no-check-cert
Monitor vpxd task and session metrics
# Check active vpxd tasks:
/opt/vmware/vpostgres/current/bin/psql -U postgres VCDB \
-c "SELECT count(*) AS active_tasks FROM vpx_task WHERE state = 'running';"
# Check concurrent sessions:
/opt/vmware/vpostgres/current/bin/psql -U postgres VCDB \
-c "SELECT count(*) AS active_sessions FROM vpx_session WHERE logged_out IS NULL;"
# Monitor vpxd CPU and memory usage:
top -bn1 | grep vpxd
ps aux | grep vpxd | grep -v grep
Check inventory scale and growth
# Count managed objects:
/opt/vmware/vpostgres/current/bin/psql -U postgres VCDB -c "
SELECT 'Hosts' AS type, count(*) FROM vpx_host
UNION ALL
SELECT 'VMs', count(*) FROM vpx_vm
UNION ALL
SELECT 'Clusters', count(*) FROM vpx_compute_resource WHERE type='CLUSTER'
UNION ALL
SELECT 'Datastores', count(*) FROM vpx_datastore;
"
# Check VCSA resource utilization via VAMI:
# https://vcsa:5480 → Monitor → CPU, Memory, Network, Storage
Tune vpxd configuration for large environments
# Edit vpxd.cfg:
vi /etc/vmware-vpxd/vpxd.cfg
# Key tuning parameters:
# <maxQueryResult>
# Default: 1000 — increase to 5000 for large inventories
# </maxQueryResult>
# config.vpxd.stats.maxQueryMetrics
# Default: 64 — increase for heavy monitoring tools
# Set via Advanced Settings in vSphere Client:
# vCenter → Configure → Advanced Settings → Add:
# config.vpxd.stats.maxQueryMetrics = 256
# Restart vpxd after changes:
service-control --stop vmware-vpxd
service-control --start vmware-vpxd
Optimize task and event retention
# Reduce event/task retention to lower DB load:
# vSphere Client → vCenter → Configure → General → Database
# Task retention: 30 days (default)
# Event retention: 30 days (default)
# For large environments, consider:
# Task retention: 15 days
# Event retention: 15 days
# Disable stats levels not needed:
# vSphere Client → vCenter → Configure → General → Statistics
# Level 1 (Basic) for intervals > 1 day
# Level 2 (Detailed) only for 5-minute interval
Scale up VCSA when approaching limits
# Check if current sizing is sufficient:
# VAMI → Monitor → check CPU/RAM sustained utilization
# If CPU > 80% sustained or RAM > 85% — scale up
# Scale-up procedure:
# 1. Take backup via VAMI
# 2. Shut down VCSA gracefully
# 3. Edit VM settings — increase vCPU and RAM to next size tier
# 4. Power on VCSA
# 5. VAMI will detect new resources automatically
# Note: Cannot downsize — only scale up
# Note: Storage can be expanded while VCSA is running (VAMI → Storage)