6.4 KiB
6.4 KiB
Ubuntu VM Management with Cloud Hypervisor
This directory contains scripts for creating and managing Ubuntu VMs using Cloud Hypervisor with btrfs thin provisioning.
Scripts Overview
ubuntu_vm_start.sh
- Creates and starts new VMsubuntu_vm_manage.sh
- Manages existing VMs (list, status, console, stop, etc.)setup_vm_network.sh
- Sets up networking for SSH access to VMs
Prerequisites
- Root access
- Btrfs filesystem (script will detect and guide setup)
- Cloud Hypervisor installed
- Basic networking tools
Quick Start
1. Set up networking (one-time setup)
sudo ./setup_vm_network.sh
2. Create and start a VM
sudo ./ubuntu_vm_start.sh my-vm 2048 2
This creates a VM named "my-vm" with 2GB RAM and 2 CPU cores.
3. List all VMs
sudo ./ubuntu_vm_manage.sh list
4. Connect to VM console
sudo ./ubuntu_vm_manage.sh console my-vm
Detailed Usage
Creating VMs
sudo ./ubuntu_vm_start.sh <vm_name> <memory_mb> <cpu_cores>
Examples:
# Create a small VM
sudo ./ubuntu_vm_start.sh test-vm 1024 1
# Create a larger VM
sudo ./ubuntu_vm_start.sh dev-vm 4096 4
What happens:
- Downloads Ubuntu 24.04 cloud image (first time only)
- Creates btrfs subvolumes for thin provisioning
- Sets up cloud-init with default user
- Creates network interfaces
- Starts the VM with Cloud Hypervisor
Managing VMs
sudo ./ubuntu_vm_manage.sh <command> [vm_name]
Available commands:
Command | Description | Example |
---|---|---|
list |
Show all VMs and their status | ./ubuntu_vm_manage.sh list |
status <vm> |
Detailed status of specific VM | ./ubuntu_vm_manage.sh status my-vm |
console <vm> |
Connect to VM console | ./ubuntu_vm_manage.sh console my-vm |
stop <vm> |
Stop a running VM | ./ubuntu_vm_manage.sh stop my-vm |
delete <vm> |
Delete VM completely | ./ubuntu_vm_manage.sh delete my-vm |
ssh <vm> |
Show SSH connection info | ./ubuntu_vm_manage.sh ssh my-vm |
Accessing VMs
Method 1: Console Access (Always Available)
sudo ./ubuntu_vm_manage.sh console my-vm
- Direct serial console access
- No network required
- Press
Ctrl+A
thenX
to exit - Default login:
ubuntu
/ubuntu
Method 2: SSH Access (Requires Network Setup)
-
Set up networking first:
sudo ./setup_vm_network.sh
-
Find VM IP address:
vm-ips # or arp -a | grep 192.168.100
-
SSH to the VM:
ssh ubuntu@192.168.100.X
Default password:
ubuntu
Network Configuration
The setup_vm_network.sh
script configures:
- Bridge interface:
br0
with IP192.168.100.1/24
- DHCP server: Assigns IPs
192.168.100.10-100
to VMs - NAT: Enables internet access for VMs
- DNS: Uses Google DNS (8.8.8.8, 8.8.4.4)
Network Troubleshooting
-
Check bridge status:
ip addr show br0
-
Check VM IP assignments:
vm-ips
-
Check DHCP leases:
cat /var/lib/dhcp/dhcpd.leases
-
Restart networking:
systemctl restart dnsmasq
Storage (Btrfs)
VMs use btrfs subvolumes for efficient storage:
- Base image: Shared read-only Ubuntu image
- VM snapshots: Copy-on-write clones for each VM
- Thin provisioning: Only changed blocks use disk space
Storage locations:
- Base images:
/var/lib/vms/base/
- VM instances:
/var/lib/vms/vms/<vm-name>/
Storage commands:
# List subvolumes
btrfs subvolume list /var/lib/vms
# Show space usage
btrfs filesystem usage /var/lib/vms
# Show individual VM sizes
du -sh /var/lib/vms/vms/*
VM Configuration
Default VM Setup:
- OS: Ubuntu 24.04 LTS
- User:
ubuntu
(password:ubuntu
) - Sudo: Passwordless sudo enabled
- SSH: Enabled with password authentication
- Packages: curl, wget, git, htop, vim pre-installed
Customizing VMs:
Edit the cloud-init configuration in ubuntu_vm_start.sh
to:
- Add SSH keys
- Install additional packages
- Set custom passwords
- Configure services
Troubleshooting
VM won't start:
-
Check if Cloud Hypervisor is installed:
which cloud-hypervisor
-
Check btrfs filesystem:
btrfs filesystem show /var/lib/vms
-
Check available resources:
free -h nproc
Can't connect to VM:
-
Verify VM is running:
./ubuntu_vm_manage.sh status my-vm
-
Try console access first:
./ubuntu_vm_manage.sh console my-vm
-
Check network setup:
ip addr show br0 vm-ips
VM is slow or unresponsive:
-
Check host resources:
top iostat
-
Adjust VM resources:
- Stop VM:
./ubuntu_vm_manage.sh stop my-vm
- Delete and recreate with different specs
- Stop VM:
Security Notes
- Default password is
ubuntu
- change after first login - Consider adding SSH keys instead of password auth
- VMs have internet access through NAT
- Console access requires root privileges on host
Examples
Create a development environment:
# Set up networking
sudo ./setup_vm_network.sh
# Create VM
sudo ./ubuntu_vm_start.sh dev-env 4096 4
# Wait for boot, then connect
sudo ./ubuntu_vm_manage.sh console dev-env
# Inside VM, change password and install tools
passwd
sudo apt update && sudo apt install -y build-essential nodejs npm
Create multiple VMs:
# Create web server
sudo ./ubuntu_vm_start.sh web-server 2048 2
# Create database server
sudo ./ubuntu_vm_start.sh db-server 4096 2
# Create load balancer
sudo ./ubuntu_vm_start.sh lb 1024 1
# List all VMs
sudo ./ubuntu_vm_manage.sh list
Performance Tips
- Use appropriate VM sizing - Don't over-allocate resources
- Monitor host resources - Ensure sufficient RAM/CPU
- Use btrfs compression - Add
compress=zstd
mount option - Regular cleanup - Delete unused VMs to free space
- SSD storage - Use SSD for better I/O performance
Backup and Recovery
Backup a VM:
# Stop VM first
sudo ./ubuntu_vm_manage.sh stop my-vm
# Create snapshot
sudo btrfs subvolume snapshot /var/lib/vms/vms/my-vm /var/lib/vms/backups/my-vm-$(date +%Y%m%d)
Restore from backup:
# Delete current VM
sudo ./ubuntu_vm_manage.sh delete my-vm
# Restore from snapshot
sudo btrfs subvolume snapshot /var/lib/vms/backups/my-vm-20231215 /var/lib/vms/vms/my-vm