Cloning VMs¶
Duplicate VMs with their home directory contents for parallel work, testing, or team onboarding.
Quick Start¶
# Clone single VM
azlin clone my-vm
# Clone with custom session name
azlin clone my-vm --session-prefix dev-env
# Create multiple clones
azlin clone my-vm --num-replicas 3 --session-prefix worker
Overview¶
The azlin clone command creates new VMs based on an existing VM with:
- Home directory copy - All files, code, and configurations
- Security filtering - Excludes SSH keys, credentials, tokens
- Parallel creation - Clone multiple VMs simultaneously
- Custom sizing - Override VM size for clones
- Session naming - Auto-generate meaningful session names
Command Reference¶
Arguments¶
| Argument | Description | Required |
|---|---|---|
SOURCE_VM | VM name or session name to clone | Yes |
Options¶
| Option | Description | Default |
|---|---|---|
--num-replicas INTEGER | Number of clones to create | 1 |
--session-prefix TEXT | Session name prefix for clones | None |
--resource-group, --rg TEXT | Resource group | From config |
--vm-size TEXT | VM size for clones | Same as source |
--region TEXT | Azure region | Same as source |
Common Usage Patterns¶
Single Clone¶
What happens:
- Creates new VM with same specs as source
- Copies
/home/azureuserfrom source to clone - Filters out sensitive files (SSH keys, .env, etc.)
- VM ready to use immediately
Clone with Session Name¶
# Clone and assign session name
azlin clone my-dev-vm --session-prefix backend-api
# Creates VM with session: backend-api
What happens:
- Creates clone as normal
- Sets session name to
backend-api - Can connect with:
azlin connect backend-api
Multiple Clones (Replicas)¶
# Create 3 identical VMs
azlin clone my-vm --num-replicas 3 --session-prefix worker
# Creates:
# - worker-1
# - worker-2
# - worker-3
What happens:
- Provisions 3 VMs in parallel
- Each gets sequentially numbered session name
- All share the same home directory contents (copied)
- Perfect for distributed workloads
Clone with Different Size¶
# Clone to larger VM
azlin clone dev-vm --vm-size Standard_E64s_v5 --session-prefix training
# Clone to smaller VM (for testing)
azlin clone ml-vm --vm-size Standard_D4s_v3 --session-prefix test
Clone by Session Name¶
# Set session on source VM
azlin session azlin-vm-12345 my-project
# Clone using session name
azlin clone my-project --session-prefix my-project-test
Use Cases¶
Parallel Development¶
# Create environment for each developer
azlin clone shared-dev-vm --num-replicas 5 --session-prefix dev
# Creates: dev-1, dev-2, dev-3, dev-4, dev-5
# Each developer connects to their own
azlin connect dev-1 # Sarah
azlin connect dev-2 # John
azlin connect dev-3 # Maria
Testing/QA¶
# Clone production-like environment for testing
azlin clone prod-vm --session-prefix qa-test --vm-size Standard_D16s_v3
# Run tests without affecting prod
azlin connect qa-test -- pytest tests/
Training/Education¶
# Clone instructor environment for students
azlin clone instructor-vm --num-replicas 20 --session-prefix student
# Creates: student-1, student-2, ..., student-20
# Each student gets identical setup
Distributed Computing¶
# Clone for parallel processing
azlin clone base-worker --num-replicas 10 --session-prefix worker
# Each worker processes different data
azlin connect worker-1 -- python process.py --shard 1
azlin connect worker-2 -- python process.py --shard 2
# ...
A/B Testing¶
# Clone for experimental features
azlin clone stable-vm --session-prefix experimental
# Test changes without affecting stable
azlin connect experimental
# Make changes, test, compare results
What Gets Copied¶
Included¶
- All files in
/home/azureuser - Code repositories
- Configuration files (non-sensitive)
- Docker images and containers
- Installed Python packages
- Project dependencies
Excluded (Security Filters)¶
- SSH keys (
~/.ssh/id_*) - Environment files (
.env,.env.*) - Credential files (
credentials.json, etc.) - API tokens and secrets
- Azure CLI credentials (
~/.azure) - Git credentials cache
Fresh Credentials
Clones get fresh SSH keys from Azure Key Vault automatically. You'll need to re-configure any API keys or tokens.
Performance¶
Timing¶
- Single clone: 10-15 minutes
- Multiple clones: Same (parallel provisioning)
- Home copy: 1-5 minutes (depends on size)
Optimization¶
# Faster cloning - clean up source first
azlin connect source-vm -- "
docker system prune -af
rm -rf ~/.cache
uv cache clean
"
azlin clone source-vm --num-replicas 5
Advanced Scenarios¶
Cross-Region Cloning¶
Custom Resource Group¶
# Clone to different resource group
azlin clone my-vm --rg production-rg --session-prefix prod-clone
Batch Clone Script¶
#!/bin/bash
# Create clones for entire team
TEAM=(alice bob carol dave)
for member in "${TEAM[@]}"; do
azlin clone shared-dev --session-prefix "dev-$member"
done
Troubleshooting¶
Clone Fails to Provision¶
# Check quota
azlin quota
# Try smaller VM size
azlin clone my-vm --vm-size Standard_D4s_v3
# Try different region
azlin clone my-vm --region westus
Home Directory Too Large¶
# Clean up source VM first
azlin connect source-vm -- "
docker system prune -af
rm -rf ~/.cache ~/.npm ~/.cargo/registry
"
# Then clone
azlin clone source-vm
Missing Files After Clone¶
# Check security filters
# Sensitive files are intentionally excluded
# Manually copy if needed (after verifying safety)
azlin connect source-vm -- tar czf /tmp/extra.tar.gz ~/specific-files
azlin connect clone-vm -- "cd ~ && tar xzf -" < /tmp/extra.tar.gz
Clones Have Same Name¶
# Always use --session-prefix for clarity
azlin clone source --session-prefix unique-name-1
azlin clone source --session-prefix unique-name-2
Cleanup¶
Delete Single Clone¶
Delete Multiple Clones¶
# Delete all worker clones
for i in {1..10}; do
azlin delete worker-$i
done
# Or use Azure CLI for batch deletion
az vm delete --ids $(az vm list -g <rg> --query "[?contains(name, 'worker')].id" -o tsv) --yes
Related Commands¶
azlin new- Create fresh VMazlin list- View all VMsazlin connect- Connect to cloneazlin session- Manage session namesazlin delete- Remove clones
Source Code¶
Last updated: 2025-11-24