Hyper-V VM Creator
Create Ubuntu 24.04 VMs on Windows Hyper-V from cloud images with cloud-init. Returns a Docker-ready VM with SSH access.
When to Use
- - "create hyper-v vm"
- "spin up vm on hyper-v"
- "new hyper-v ubuntu vm"
- Any time you need a fresh Linux VM on a Windows Hyper-V host
This is a base skill. It creates the VM. Other skills (soc-deploy-thehive, soc-deploy-misp) deploy applications onto it.
User Inputs
| Parameter | Default | Required |
|---|
| VM name | - | Yes |
| Hyper-V host |
hyperv-host (YOUR
HYPERVIP) | No |
| CPU cores | 2 | No |
| RAM | 4GB | No |
| Disk | 40GB | No |
| VM user password | (generated) | No |
| Extra cloud-init packages | - | No |
| Network switch | DNS-NIC-Switch | No |
Prerequisites Check
CODEBLOCK0
Execution Flow
Step 1: Build cloud-init ISO (on Linux)
CODEBLOCK1
The ISO contains three files:
- -
user-data: deploy user, Docker, Compose v2, SSH password auth - INLINECODE1 : instance-id and hostname
- INLINECODE2 : hv_netvsc DHCP match (CRITICAL for Hyper-V networking)
Step 2: Transfer files to Hyper-V host
CODEBLOCK2
Step 3: Create VM (elevated PowerShell on Hyper-V host)
CODEBLOCK3
Step 4: Wait for boot and find IP
CODEBLOCK4
Step 5: Verify SSH and Docker
CODEBLOCK5
Return Values
Report to caller:
CODEBLOCK6
Teardown
To destroy a VM completely:
CODEBLOCK7
Or use scripts/destroy-vm.ps1:
CODEBLOCK8
Critical Gotchas
See references/gotchas.md for full details. Top blockers:
- 1. Sparse VHDX:
fsutil sparse setflag <path> 0 BEFORE Resize-VHD or error 0xC03A001A - Network config: Must include
match: driver: hv_netvsc or VM gets no IP - Permissions:
icacls /grant "NT VIRTUAL MACHINE\Virtual Machines:(F)" or Start-VM fails - Secure Boot Off: Ubuntu cloud images aren't signed for Hyper-V
- Cloud-init runs once: No redo. Delete VM + VHDX and start over
- Don't batch PowerShell: Run Hyper-V commands one at a time
- All commands need elevated PowerShell
- Docker Compose v2: Install via curl in runcmd, NOT apt
- IP discovery: Use ARP scan, not Get-VMNetworkAdapter (needs linux-tools-virtual)
Hyper-V VM 创建器
通过 cloud-init 从云镜像在 Windows Hyper-V 上创建 Ubuntu 24.04 虚拟机。返回一个支持 SSH 访问且已配置 Docker 的虚拟机。
使用场景
- - 创建 hyper-v 虚拟机
- 在 hyper-v 上启动虚拟机
- 新建 hyper-v ubuntu 虚拟机
- 任何需要在 Windows Hyper-V 主机上创建全新 Linux 虚拟机的场景
这是一个基础技能。它负责创建虚拟机。其他技能(soc-deploy-thehive、soc-deploy-misp)在此基础上部署应用程序。
用户输入
| 参数 | 默认值 | 是否必填 |
|---|
| 虚拟机名称 | - | 是 |
| Hyper-V 主机 |
hyperv-host (YOUR
HYPERVIP) | 否 |
| CPU 核心数 | 2 | 否 |
| 内存 | 4GB | 否 |
| 磁盘 | 40GB | 否 |
| 虚拟机用户密码 | (自动生成) | 否 |
| 额外的 cloud-init 包 | - | 否 |
| 网络交换机 | DNS-NIC-Switch | 否 |
前置条件检查
bash
SSH 连接到 Hyper-V 主机
ssh hyperv-host echo OK 2>/dev/null || echo 失败:无法通过 SSH 连接到 Hyper-V 主机
Windows 上的 qemu-img
ssh hyperv-host where C:\Program Files\qemu\qemu-img.exe 2>/dev/null || echo 失败:qemu-img 未安装 (choco install qemu -y)
Linux 上的 genisoimage(用于构建 cloud-init ISO)
which genisoimage || echo 失败:genisoimage 未安装 (apt install genisoimage)
执行流程
步骤 1:构建 cloud-init ISO(在 Linux 上)
bash
通过环境变量设置密码(推荐,避免暴露在 shell 历史/进程列表中)
VM_PASSWORD=<密码> bash scripts/build-cidata-iso.sh <虚拟机名称> [SSH公钥]
或通过标准输入
echo <密码> | bash scripts/build-cidata-iso.sh <虚拟机名称> [SSH公钥]
创建 /tmp/<虚拟机名称>-cidata.iso
ISO 包含三个文件:
- - user-data:部署用户、Docker、Compose v2、SSH 密码认证
- meta-data:实例 ID 和主机名
- network-config:hv_netvsc DHCP 匹配(对 Hyper-V 网络至关重要)
步骤 2:传输文件到 Hyper-V 主机
bash
云镜像(如果尚未缓存)
wget -q https://cloud-images.ubuntu.com/releases/24.04/release/ubuntu-24.04-server-cloudimg-amd64.img -O /tmp/ubuntu-24.04-cloud.img
scp /tmp/ubuntu-24.04-cloud.img hyperv-host:C:/Users/youruser/Downloads/
Cloud-init ISO
scp /tmp/<虚拟机名称>-cidata.iso hyperv-host:C:/Users/youruser/Downloads/
步骤 3:创建虚拟机(在 Hyper-V 主机上以提升权限运行 PowerShell)
bash
将脚本复制到主机
scp scripts/create-vm.ps1 hyperv-host:C:/Users/youruser/Downloads/
执行(需要提升权限)
ssh hyperv-host powershell -ExecutionPolicy Bypass -File C:\\Users\\youruser\\Downloads\\create-vm.ps1 \
-VMName <虚拟机名称> \
-CloudInitISO C:\\Users\\youruser\\Downloads\\<虚拟机名称>-cidata.iso \
-DiskSizeGB <磁盘> -MemoryGB <内存> -CPUCount <核心数>
步骤 4:等待启动并查找 IP
bash
sleep 90 # Cloud-init 需要约 90 秒
Hyper-V 虚拟机的 MAC 地址以 00-15-5d 开头
arp -a | grep 00-15-5d
获取虚拟机 MAC 地址进行匹配
ssh hyperv-host powershell (Get-VMNetworkAdapter -VMName <虚拟机名称>).MacAddress
PowerShell 显示:00155D38010A
ARP 显示: 00-15-5d-38-01-0a
步骤 5:验证 SSH 和 Docker
bash
ssh deploy@ docker --version && docker compose version && echo 虚拟机就绪
返回值
向调用者报告:
虚拟机已创建:<虚拟机名称>
IP 地址:
SSH:deploy@(密码:<密码>)
Docker:已安装
Docker Compose v2:已安装
销毁
完全销毁虚拟机:
bash
ssh hyperv-host powershell -Command \Stop-VM -Name <虚拟机名称> -Force -TurnOff; Remove-VM -Name <虚拟机名称> -Force; Remove-Item C:\\ProgramData\\Microsoft\\Windows\\Virtual Hard Disks\\<虚拟机名称>.vhdx -Force\
或使用 scripts/destroy-vm.ps1:
bash
scp scripts/destroy-vm.ps1 hyperv-host:C:/Users/youruser/Downloads/
ssh hyperv-host powershell -ExecutionPolicy Bypass -File C:\\Users\\youruser\\Downloads\\destroy-vm.ps1 -VMName <虚拟机名称>
关键注意事项
详见 references/gotchas.md。主要障碍:
- 1. 稀疏 VHDX:在 Resize-VHD 之前执行 fsutil sparse setflag <路径> 0,否则出现错误 0xC03A001A
- 网络配置:必须包含 match: driver: hv_netvsc,否则虚拟机无法获取 IP
- 权限:icacls /grant NT VIRTUAL MACHINE\Virtual Machines:(F),否则 Start-VM 失败
- 关闭安全启动:Ubuntu 云镜像未针对 Hyper-V 签名
- Cloud-init 只运行一次:无法重做。删除虚拟机 + VHDX 后重新开始
- 不要批量执行 PowerShell:一次只运行一个 Hyper-V 命令
- 所有命令都需要提升权限的 PowerShell
- Docker Compose v2:通过 curl 在 runcmd 中安装,不要使用 apt
- IP 发现:使用 ARP 扫描,不要用 Get-VMNetworkAdapter(需要 linux-tools-virtual)