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)