Bir KVM VM'i CLI'dan Ayağa Kaldırmak
Herhangi birinin oluşturduğu ilk KVM VM'i genelde bir GUI üzerinden olur, virt-manager, Cockpit, ya da bir Proxmox web interface'i, disk size, network, ve ISO seçiminde tıklayarak ilerlersiniz. Seçeneklerin ne anlama geldiğini öğrenmek için bu iyi bir yol. Ama düzenli olarak VM oluşturmaya başladığınızda, GUI yavaş kısım haline geliyor: her seferinde aynı şekilde gerçekleşmesi gereken bir tıklama dizisi, ve "her seferinde aynı şekilde" tam olarak bir command line'ın iyi olduğu şey.
İki parça: bir base image ve cloud-init
Bir installer ISO'su boot edip bir OS install'unda tıklayarak ilerlemek yerine, cloud provider'ların kullandığı aynı minimal, pre-installed image'lardan, bir cloud image'dan başlıyorum, ve first-boot configuration'ı cloud-init'e bırakıyorum:
# Download a cloud image once
wget https://cloud-images.ubuntu.com/releases/24.04/release/ubuntu-24.04-server-cloudimg-amd64.img \
-O /var/lib/libvirt/images/ubuntu-24.04-base.img
Cloud-init configuration'ı iki küçük YAML dosyası. user-data, user'ı, SSH key'i, ve herhangi bir first-boot komutunu set up ediyor:
# user-data
#cloud-config
hostname: app-01
users:
- name: deploy
sudo: ALL=(ALL) NOPASSWD:ALL
groups: sudo
shell: /bin/bash
ssh_authorized_keys:
- ssh-ed25519 AAAA... your-key-here
package_update: true
packages:
- curl
- git
meta-data'nın tek ihtiyacı bir instance ID ve hostname:
# meta-data
instance-id: app-01
local-hostname: app-01
Bunlar, cloud-init'in first boot'ta okuduğu küçük bir ISO'ya paketleniyor:
genisoimage -output app-01-seed.iso -volid cidata -joliet -rock user-data meta-data
VM'i oluşturmak
Base image kopyalanmış ve seed ISO build edilmişken, virt-install VM'i tek bir komutla oluşturup başlatıyor:
cp /var/lib/libvirt/images/ubuntu-24.04-base.img /var/lib/libvirt/images/app-01.qcow2
qemu-img resize /var/lib/libvirt/images/app-01.qcow2 40G
virt-install \
--name app-01 \
--memory 4096 \
--vcpus 2 \
--disk /var/lib/libvirt/images/app-01.qcow2,format=qcow2,bus=virtio \
--disk app-01-seed.iso,device=cdrom \
--os-variant ubuntu24.04 \
--network bridge=br0,model=virtio \
--import \
--noautoconsole
--import, virt-install'a bir installer çalıştırmak yerine mevcut disk image'ını direkt boot etmesini söylüyor, ve --noautoconsole, bir console penceresi açmak yerine kontrolü terminale geri veriyor. Bir iki dakika içinde, VM çalışıyor, cloud-init user-data'daki SSH key'le deploy user'ını oluşturmuş, ve:
ssh deploy@<vm-ip>
direkt çalışıyor, manuel OS install yok, bir wizard'da tıklama yok, sonradan SSH key eklemeyi hatırlama yok.
Tek seferlik VM'ler için bile buna neden değer
Belirgin fayda bunun script'lenebilir olması, bir shell function'a ya da bir Ansible task'ına sarın ve yeni bir VM, argüman olarak bir hostname alan tek bir komut haline geliyor. Ama gerçekten tek seferlik bir VM için bile, daha sessiz bir fayda var: tüm configuration, hostname, user, package'lar, SSH key, başka her şeyle aynı git repo'suna gidebilecek iki küçük text dosyasında oturuyor. Altı ay sonra, bu VM'i yeniden oluşturmanız gerekirse ya da sadece üzerine ne kurulduğunu hatırlamak isterseniz, cevap "tıklarken ne hatırlıyorsam" değil, otuz saniyede okuyabileceğiniz iki dosya.