AgentSkillsCN

fedora-cloud-vm

使用 QEMU 启动 Fedora Cloud 虚拟机。

SKILL.md
--- frontmatter
name: fedora-cloud-vm
description: Bring up a Fedora Cloud VM using QEMU.

Fedora Cloud VM Skill

Provision Fedora Cloud VMs for testing or running commands in an isolated environment.

Prerequisites

Requires: qemu-system-x86_64, genisoimage, jq, SSH key pair.

Step-by-Step Instructions

1. Setup Working Directory

bash
mkdir -p ~/fedora-cloud-vm && cd ~/fedora-cloud-vm

2. Download Fedora Cloud Image

bash
IMAGE_URL=$(curl -s https://fedoraproject.org/releases.json | \
  jq -r '[.[] | select(.variant=="Cloud" and .arch=="x86_64" and (.link | endswith(".qcow2")))] | sort_by(.version | tonumber) | last | .link')
IMAGE=/srv/imgs/$(basename "$IMAGE_URL")
[[ ! -f "$IMAGE" ]] && curl -L -o "$IMAGE" "$IMAGE_URL"

3. Create Cloud-Init Config

bash
SSH_PUBKEY=$(cat ~/.ssh/id_ed25519.pub)
cat > user-data << EOF
#cloud-config
users:
  - name: fedora
    sudo: ALL=(ALL) NOPASSWD:ALL
    ssh_authorized_keys:
      - $SSH_PUBKEY
EOF
touch meta-data

4. Generate Cloud-Init ISO

bash
genisoimage -output seed.iso -volid cidata -joliet -rock user-data meta-data

5. Launch VM with QEMU

bash
qemu-img create -f qcow2 -F qcow2 -b "$IMAGE" vm-disk.qcow2
VCPUS=$(($(nproc) < 16 ? $(nproc) : 16))
qemu-system-x86_64 -m 4096 -smp $VCPUS -cpu host -enable-kvm -nographic \
  -drive "if=virtio,file=vm-disk.qcow2" \
  -drive "if=virtio,file=seed.iso,format=raw" \
  -nic user,model=virtio,hostfwd=tcp::2222-:22 &
echo $! > qemu.pid

6. Wait for VM to Boot

bash
echo "Waiting for SSH..."
for i in {1..60}; do
  if ssh -o ConnectTimeout=2 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
       -i ~/.ssh/id_ed25519 -p 2222 fedora@localhost true 2>/dev/null; then
    echo "SSH ready after ~$((i*2)) seconds"
    break
  fi
  sleep 2
done

7. Run Commands via SSH

bash
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
    -i ~/.ssh/id_ed25519 -p 2222 fedora@localhost "command here"

8. Stop and Cleanup

bash
kill $(cat qemu.pid) && rm -rf ~/fedora-cloud-vm

Share Directory with VM (virtiofs)

bash
SHARE_DIR="/path/to/share"
SOCKET_PATH="${PWD}/virtiofsd.sock"

/usr/libexec/virtiofsd --socket-path "$SOCKET_PATH" --shared-dir "$SHARE_DIR" \
  --sandbox none --seccomp none &
echo $! > virtiofsd.pid
sleep 1

VCPUS=$(($(nproc) < 16 ? $(nproc) : 16))
qemu-system-x86_64 -m 4096 -smp $VCPUS -cpu host -enable-kvm -nographic \
  -object memory-backend-memfd,id=mem,size=4096M,share=on \
  -numa node,memdev=mem \
  -chardev socket,id=char0,path="$SOCKET_PATH" \
  -device vhost-user-fs-pci,queue-size=1024,chardev=char0,tag=hostshare \
  -drive "if=virtio,file=vm-disk.qcow2" \
  -drive "if=virtio,file=seed.iso,format=raw" \
  -nic user,model=virtio,hostfwd=tcp::2222-:22 &
echo $! > qemu.pid

Mount inside VM:

bash
sudo mkdir -p /mnt/host && sudo mount -t virtiofs hostshare /mnt/host

Stop both:

bash
kill $(cat qemu.pid) $(cat virtiofsd.pid)