Learn OpenStack · core/compute
Nova Operations
Server Lifecycle
Create a Server
# Minimal: flavor + image + network
openstack server create \
--flavor m1.small \
--image ubuntu-24.04 \
--network private-net \
my-instance
# Full: key pair, security group, user-data, availability zone, boot volume
openstack server create \
--flavor m1.medium \
--image ubuntu-24.04 \
--network private-net \
--key-name mykey \
--security-group web-sg \
--user-data /path/to/cloud-init.yaml \
--availability-zone nova:compute01.example.com \
--description "Web server" \
my-instance
# Boot from an existing Cinder volume
openstack server create \
--flavor m1.medium \
--volume my-boot-volume \
--network private-net \
--key-name mykey \
my-volume-instance
# Boot from image and create a new volume (volume-backed)
openstack server create \
--flavor m1.medium \
--image ubuntu-24.04 \
--boot-from-volume 50 \
--network private-net \
--key-name mykey \
my-vb-instance
# Schedule on a specific host (admin)
openstack server create \
--flavor m1.small \
--image ubuntu-24.04 \
--network private-net \
--availability-zone nova:compute03.example.com \
my-pinned-instance
List and Inspect Servers
# List servers in current project
openstack server list
# List all servers across all projects (admin)
openstack server list --all-projects
# Filter by status
openstack server list --status ERROR
openstack server list --status ACTIVE
# Filter by host (admin)
openstack server list --all-projects --host compute01.example.com
# Show full details of a server
openstack server show my-instance
# Show server events/actions (useful for troubleshooting)
openstack server event list my-instance
openstack server event show my-instance <request-id>
# Show diagnostics (hypervisor metrics)
openstack server show --diagnostics my-instance
Power State Operations
# Soft reboot (ACPI shutdown signal then power on)
openstack server reboot --soft my-instance
# Hard reboot (power cycle, like pressing the reset button)
openstack server reboot --hard my-instance
# Stop (power off; instance remains on host, resources held)
openstack server stop my-instance
# Start a stopped server
openstack server start my-instance
# Pause (freeze CPU/memory in place; fast; requires hypervisor support)
openstack server pause my-instance
openstack server unpause my-instance
# Suspend (save state to disk; slower; uses no CPU)
openstack server suspend my-instance
openstack server resume my-instance
Shelve and Unshelve
Shelving offloads the instance from the compute host (frees up RAM and CPU) while preserving the instance record and its associated resources (volumes, floating IPs).
# Shelve: snapshot the instance, then power off and offload from host
openstack server shelve my-instance
# Unshelve: restore from snapshot back onto a host
openstack server unshelve my-instance
# Unshelve to a specific availability zone (2022.1+)
openstack server unshelve --availability-zone nova my-instance
Delete a Server
# Normal delete (waits for graceful shutdown)
openstack server delete my-instance
# Force delete (skips graceful shutdown; use with caution)
openstack server delete --force my-instance
# Delete multiple servers
openstack server delete server1 server2 server3
Rebuild a Server
Rebuild re-images the instance in place: the root disk is replaced with a new image, but the instance stays on the same host with the same UUID, flavor, and network ports.
# Rebuild with the same image
openstack server rebuild my-instance --image ubuntu-24.04
# Rebuild with a different image
openstack server rebuild my-instance --image ubuntu-22.04
# Rebuild with new admin password and user-data
openstack server rebuild my-instance \
--image ubuntu-24.04 \
--admin-password NewP@ss123 \
--user-data /path/to/new-user-data.yaml
Resize a Server
# Resize to a larger flavor (moves to new host if required)
openstack server resize --flavor m1.large my-instance
# Poll until status is VERIFY_RESIZE
openstack server show my-instance -c status
# Confirm the resize (destroys old disk, keeps new)
openstack server resize confirm my-instance
# Revert the resize (back to original flavor and host)
openstack server resize revert my-instance
Migrate a Server
# Cold migration: stop, copy disk, start on new host (admin)
openstack server migrate my-instance
# Confirm cold migration (same as resize confirm)
openstack server resize confirm my-instance
# Live migration: keep running, move to any available host
openstack server live-migrate my-instance
# Live migration to a specific host
openstack server live-migrate --host compute04.example.com my-instance
# Block migration (copies local disk; use when no shared storage)
openstack server live-migrate --block-migrate my-instance
Evacuate a Server
Evacuation moves an instance off a dead compute host to a new one. Requires the source host to be down (fenced).
# Evacuate to any available host
openstack server evacuate my-instance
# Evacuate to a specific host
openstack server evacuate --host compute05.example.com my-instance
# Evacuate all instances from a host (admin bulk operation)
openstack server list --all-projects --host compute02.example.com -f value -c ID | \
xargs -I {} openstack server evacuate {}
Add and Manage Attachments
# Attach a Cinder volume
openstack server add volume my-instance my-volume
# Attach at a specific device path
openstack server add volume --device /dev/vdb my-instance my-volume
# Detach a volume
openstack server remove volume my-instance my-volume
# Add a floating IP
openstack server add floating ip my-instance 203.0.113.42
# Remove a floating IP
openstack server remove floating ip my-instance 203.0.113.42
# Add a security group
openstack server add security group my-instance database-sg
# Remove a security group
openstack server remove security group my-instance database-sg
Console Access
# Get VNC console URL (novnc)
openstack console url show --novnc my-instance
# Get SPICE console URL
openstack console url show --spice my-instance
# Get serial console URL
openstack console url show --serial my-instance
# Read the console log (last 50 lines)
openstack console log show --lines 50 my-instance
Server Backup
# Create a snapshot image of the instance
openstack server image create --name my-instance-snap-2025-04-01 my-instance
# Create a scheduled backup (daily, keep 7 copies)
openstack server backup create \
--name my-instance-backup \
--type daily \
--rotate 7 \
my-instance
Flavors
Flavors define the virtual hardware profile (vCPU count, RAM, root disk, ephemeral disk, swap).
# List all flavors
openstack flavor list
# List including private flavors (admin)
openstack flavor list --all
# Show flavor details
openstack flavor show m1.small
# Create a standard flavor
openstack flavor create \
--vcpus 2 \
--ram 4096 \
--disk 40 \
--ephemeral 0 \
--swap 0 \
--public \
m1.medium
# Create a private flavor for a specific project
openstack flavor create \
--vcpus 16 \
--ram 65536 \
--disk 200 \
--private \
hpc.xlarge
# Grant access to a private flavor
openstack flavor set --project engineering hpc.xlarge
# Set extra specs (used by scheduler filters and virt driver)
openstack flavor set m1.medium \
--property hw:cpu_policy=dedicated \
--property hw:mem_page_size=large \
--property aggregate_instance_extra_specs:ssd=true
# Remove an extra spec
openstack flavor unset --property hw:cpu_policy m1.medium
# Delete a flavor
openstack flavor delete m1.medium
Common Flavor Extra Specs
| Extra Spec | Values | Effect |
|---|---|---|
hw:cpu_policy |
dedicated, shared |
CPU pinning |
hw:mem_page_size |
large, small, any |
Huge page allocation |
hw:numa_nodes |
integer | NUMA topology |
hw:cpu_sockets |
integer | vCPU socket topology |
hw:cpu_cores |
integer | vCPU core topology |
hw:cpu_threads |
integer | vCPU thread topology |
hw:vif_multiqueue_enabled |
true |
Enable virtio-net multiqueue |
hw:boot_menu |
true |
Show boot menu in console |
aggregate_instance_extra_specs:<key> |
any | Match host aggregate metadata |
trait:<trait-name> |
required |
Require Placement trait on host |
Key Pairs
# Create a new key pair (generates and downloads private key)
openstack keypair create mykey > ~/.ssh/mykey.pem
chmod 600 ~/.ssh/mykey.pem
# Import an existing public key
openstack keypair create --public-key ~/.ssh/id_rsa.pub mykey
# List key pairs
openstack keypair list
# Show a key pair (public key + fingerprint)
openstack keypair show mykey
# Delete a key pair
openstack keypair delete mykey
Quotas
# Show current project quota and usage
openstack quota show
# Show quota for a specific project (admin)
openstack quota show --project engineering
# Show compute quota details only
openstack quota show --compute
# Set project quotas (admin)
openstack quota set \
--instances 50 \
--cores 200 \
--ram 512000 \
--key-pairs 20 \
--server-groups 10 \
--server-group-members 10 \
engineering
# Reset a quota to the default
openstack quota delete --compute engineering
# Show default quotas (the baseline for all projects)
openstack quota show --default
Common Quota Fields
| Field | Default | Description |
|---|---|---|
instances |
10 | Maximum running instances |
cores |
20 | Maximum total vCPUs |
ram |
51200 | Maximum total RAM (MB) |
key_pairs |
100 | Maximum key pairs per user |
server_groups |
10 | Maximum server groups |
server_group_members |
10 | Maximum instances per server group |
Server Groups
Server groups apply anti-affinity or affinity scheduling policies to a set of instances.
# Create an anti-affinity group (instances spread across hosts)
openstack server group create --policy anti-affinity web-tier
# Create an affinity group (instances land on the same host)
openstack server group create --policy affinity batch-workers
# Soft anti-affinity (best effort, not hard requirement)
openstack server group create --policy soft-anti-affinity api-nodes
# Launch an instance into a server group
openstack server create \
--flavor m1.small \
--image ubuntu-24.04 \
--network private-net \
--hint group=<server-group-uuid> \
web-01
# List server groups
openstack server group list
# Show members of a server group
openstack server group show web-tier
Hypervisor Management (Admin)
# List hypervisors with resource summary
openstack hypervisor list --long
# Show details of a specific hypervisor
openstack hypervisor show compute01.example.com
# Show hypervisor statistics across all hosts
openstack hypervisor stats show
# List compute services and their state
openstack compute service list
# Disable a compute service (drain host before maintenance)
openstack compute service set --disable \
--disable-reason "Scheduled maintenance 2025-04-05" \
compute02.example.com nova-compute
# Re-enable a compute service
openstack compute service set --enable compute02.example.com nova-compute
# Force-delete a service record (after host permanently removed)
openstack compute service delete <service-id>
Host Aggregates and Availability Zones
# Create an aggregate
openstack aggregate create ssd-hosts
# Add a host to an aggregate
openstack aggregate add host ssd-hosts compute03.example.com
# Set aggregate metadata (matched by scheduler filters)
openstack aggregate set --property ssd=true ssd-hosts
# Create an availability zone via an aggregate
openstack aggregate create --zone az-gpu gpu-zone
# Add a host to the AZ aggregate
openstack aggregate add host gpu-zone compute05.example.com
# List aggregates
openstack aggregate list
# Show aggregate details
openstack aggregate show ssd-hosts
Configuration Reference
Nova reads /etc/nova/nova.conf. The most important sections follow.
[DEFAULT]
[DEFAULT]
# Transport URL for RabbitMQ
transport_url = rabbit://nova:nova-pass@controller:5672/nova
# Block of IPs to use for instance metadata
my_ip = 10.0.0.11
# Enable compute (set on compute nodes only)
enabled_apis = osapi_compute,metadata
# Log directory
log_dir = /var/log/nova
[api]
[api]
auth_strategy = keystone
[keystone_authtoken]
[keystone_authtoken]
www_authenticate_uri = http://controller:5000
auth_url = http://controller:5000
memcached_servers = controller:11211
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = nova
password = nova-service-pass
[scheduler]
[scheduler]
# How many hosts to pass to the scheduler per instance
max_attempts = 3
# Period between scheduler periodic tasks (seconds)
periodic_task_interval = 60
# Enable periodic discovery of new compute hosts
discover_hosts_in_cells_interval = 300
[filter_scheduler]
[filter_scheduler]
# Ordered list of enabled filters
enabled_filters = ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,ServerGroupAntiAffinityFilter,ServerGroupAffinityFilter,AggregateInstanceExtraSpecsFilter,AvailabilityZoneFilter,PciPassthroughFilter
# Number of candidate hosts to consider before weighing
host_subset_size = 1
# Track instance counts in DB for NumInstancesFilter
track_instance_changes = True
[compute]
[compute]
# CPU allocation ratio: overcommit factor
cpu_allocation_ratio = 4.0
# RAM allocation ratio
ram_allocation_ratio = 1.5
# Disk allocation ratio
disk_allocation_ratio = 1.0
# Interval between resource tracker updates (seconds)
resource_tracker_poll_interval = 60
# Reserved host RAM (MB) — excluded from Placement inventory
reserved_host_memory_mb = 512
# Reserved host disk (MB)
reserved_host_disk_mb = 0
[libvirt]
[libvirt]
# Virtualisation type: kvm, qemu, xen, lxc
virt_type = kvm
# Connection URI to libvirt daemon
connection_uri = qemu:///system
# Disk image format: qcow2, raw
images_type = qcow2
# Live migration URI (tcp or tls)
live_migration_uri = qemu+ssh://nova@%s/system
# Use SSH tunnelling for live migration
live_migration_tunnelled = False
# Seconds before a live migration is aborted
live_migration_completion_timeout = 800
# Timeout for post-copy migration phase (seconds)
live_migration_timeout_action = abort
# Snapshot format
snapshot_image_format = qcow2
# CPU mode: host-passthrough, host-model, custom, none
cpu_mode = host-model
[placement]
[placement]
region_name = RegionOne
project_domain_name = Default
project_name = service
auth_type = password
user_domain_name = Default
auth_url = http://controller:5000/v3
username = placement
password = placement-service-pass
[vnc]
[vnc]
# Enable VNC for this compute node
enabled = True
# novnc proxy address (controller node)
novncproxy_base_url = http://controller:6080/vnc_auto.html
# Address nova-compute binds VNC to (this host)
server_listen = 0.0.0.0
server_proxyclient_address = $my_ip
[notifications]
[notifications]
# Notification driver: noop, messagingv2
driver = messagingv2
# Transport URL for notifications (can differ from main bus)
transport_url = rabbit://nova:nova-pass@controller:5672/nova_notifications
# Notification format: unversioned, versioned, both
notification_format = versioned
[oslo_concurrency]
[oslo_concurrency]
lock_path = /var/lib/nova/tmp
[glance]
[glance]
api_servers = http://controller:9292
[neutron]
[neutron]
auth_url = http://controller:5000
auth_type = password
project_domain_name = Default
user_domain_name = Default
region_name = RegionOne
project_name = service
username = neutron
password = neutron-service-pass
service_metadata_proxy = True
metadata_proxy_shared_secret = metadata-proxy-secret
[cinder]
[cinder]
os_region_name = RegionOne
Database Management
# Sync the API database schema
nova-manage api_db sync
# Sync the cell0 database schema
nova-manage db sync --database nova_cell0
# Sync the cell1 (default cell) database schema
nova-manage db sync
# Create cell0 (run once on initial deploy)
nova-manage cell_v2 map_cell0 --database-connection \
mysql+pymysql://nova:nova-pass@controller/nova_cell0
# Create cell1 (run once on initial deploy)
nova-manage cell_v2 create_cell \
--name cell1 \
--transport-url "rabbit://nova:nova-pass@controller:5672/nova_cell1" \
--database-connection "mysql+pymysql://nova:nova-pass@controller/nova_cell1"
# Discover new compute hosts added to a cell
nova-manage cell_v2 discover_hosts --cell-uuid <cell-uuid> --verbose
# List all cells
nova-manage cell_v2 list_cells
# Check database migrations status
nova-manage db version
nova-manage api_db version