CLI Üzerinden KVM Sanal Makinesi (VM) Ayağa Kaldırmak
Reklam
Herhangi birinin yarattığı o ilk KVM sanal makinesi (VM) neredeyse her zaman bir grafik arayüz (GUI) aracılığıyla olur. İster virt-manager, ister Cockpit, isterse de bir Proxmox web arayüzü olsun; disk boyutlarına, ağ köprülerine (bridge) ve ISO seçimlerine tıklaya tıklaya ilerlersiniz. Bu, tüm o seçeneklerin aslında ne anlama geldiğini görsel olarak öğrenmenin kesinlikle harika bir yoludur.
Ancak düzenli olarak VM oluşturmaya başladığınızda, GUI anında tüm sürecin açık ara en yavaş parçası haline gelir. Çünkü her defasında harfi harfine aynı şekilde yapılması gereken, inanılmaz derecede sıkıcı bir manuel tıklamalar dizisidir. Ve "her defasında harfi harfine aynı şekilde", komut satırının (command line) tam olarak yaratılış amacıdır.
İki parça: Bir temel (base) imaj ve cloud-init
Bir yükleyici (installer) ISO'sunu manuel olarak başlatıp o yavaş işletim sistemi kurulum ekranlarında tıklamak yerine, her zaman doğrudan bir "cloud imajı" ile başlarım. Bunlar büyük bulut (cloud) sağlayıcılarının kullandığı o son derece minimal, önceden kurulmuş imajların tıpatıp aynısıdır. Ardından, ilk önyükleme (first-boot) yapılandırmasını tamamen cloud-init'in halletmesine izin veririm:
# Bir cloud imajını tam olarak bir kez indirin
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 konfigürasyonu sadece iki küçük YAML dosyasından ibarettir. user-data dosyası ana kullanıcıyı otomatik olarak ayarlar, SSH anahtarınızı içeri enjekte eder ve ilk açılışta çalışması gereken tüm komutları çalıştırır:
# 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 dosyasının ise basitçe bir sunucu kimliğine (instance ID) ve hostname'e ihtiyacı vardır:
# meta-data
instance-id: app-01
local-hostname: app-01
Bu iki küçücük metin dosyası, cloud-init'in ilk açılışta doğrudan ve doğal olarak okuyabildiği çok küçük bir ISO dosyasının içine temiz bir şekilde paketlenir:
genisoimage -output app-01-seed.iso -volid cidata -joliet -rock user-data meta-data
Sanal Makineyi (VM) Oluşturmak
Temel imaj (base image) kopyalandıktan ve tohum (seed) ISO'su temiz bir şekilde oluşturulduktan sonra, virt-install sanal makineyi aslında tek ve son derece güçlü bir komutla oluşturur ve başlatır:
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
Buradaki --import bayrağı (flag), virt-install'a acı verici bir kurulum (installer) süreci yürütmek yerine var olan disk imajını doğrudan önyüklemesini (boot) açıkça söyler. --noautoconsole bayrağı ise sinir bozucu bir şekilde konsol penceresi açmak yerine, kontrolü anında terminalinize geri verir.
Bir veya iki dakika içinde sanal makine tamamen ayağa kalkar. Cloud-init user-data dosyasından aldığı o spesifik SSH anahtarıyla deploy kullanıcısını çoktan yaratmıştır, ve:
ssh deploy@<vm-ip>
...komutu anında, kusursuzca çalışır. Manuel işletim sistemi kurulumu yoktur, kurulum sihirbazlarında tıklamak yoktur ve sonrasında SSH anahtarını manuel olarak eklemeyi hatırlamaya çalışmak kesinlikle yoktur.
Neden sadece bir kerelik VM'ler için bile buna değer?
Bunun buradaki en bariz faydası tamamen script haline getirilebilir (scriptable) olmasıdır. Bunu basit bir shell fonksiyonunun veya bir Ansible görevinin (task) içine sarın; artık yeni bir VM ayağa kaldırmak argüman olarak sadece bir hostname alan tek bir komuttan ibarettir.
Ancak gerçekten sadece bir kerelik (one-off) kurulacak bir sanal makine için bile, çok daha sessiz ama çok daha büyük bir faydası vardır: Tüm konfigürasyon (hostname, kullanıcı, temel paketler, SSH anahtarı), diğer her şeyle tamamen aynı git reposuna (repo) gidebilecek iki küçük metin dosyasında temiz bir şekilde oturmaktadır.
Altı ay sonra o sanal makineyi umutsuzca yeniden yaratmanız gerektiğinde ya da sadece içine tam olarak ne kurulduğunu hatırlamaya çalıştığınızda, cevap "valla neye tıkladığımı tam hatırlamıyorum" olmayacaktır. Cevap, tam olarak otuz saniye içinde okuyup kontrol edebileceğiniz, son derece okunaklı iki dosyadır.
Reklam