Sekarang ini kami tidak bisa lepas dari pekerjaan yang melibatkan GNU/Linux atau Microsoft Windows.
Maka setiap system yang kami bangun mau tidak-mau harus memiliki semacam hypervisor yang dapat diandalkan.
Tidak terkecuali dengan NetBSD yang sedang kami coba ini.
Ternyata saat imi hampir semua keluarga BSD sudah punya hypervisor nya sendiri. Tidak tekecuali NetBSD dengan NVMM nya atau NetBSD Virtual Machine Manager.
Akhirnya kami berhasil membangun sebuah ekosistem kecil untuk menjankan NVMM ini dengan lancar.
Berikut ini adalah diagram dari sistem yang telah berhasil kami bangun.
┌──────────┐
│ Internet │
└─────▲────┘
│
┌───┼───┐
│ NPF │
└───▲───┘
│
│
┌───────┐ ┌────┼─────┐ ┌──────────┐
┌───────► Tap 1 ┼─────────► Bridge0 ◄──────┼ Vether0 │
│ └───────┘ ┌────►───▲──────┘ └────▲─────┘
│ │ │ │
│ ┌───────┐ │ │ │
│ ┌───► Tap 2 ├────┘ │ ┌───┼──────┐
│ │ └───────┘ │ │ dnsmasq │
│ │ ┌──────────────── ┘ └──────────┘
│ │ ┌───────┐
│ │ │ Tap 3 │◄───────────────┐
│ │ └───────┘ └───────────────┐
│ └─────────────────────────┐ │
│ ┌──────────┐ ┌────┼─────┐ ┌────┼─────┐
└───────┼ VM 1 │ │ VM 2 │ │ VM 3 │
└──────────┘ └──────────┘ └──────────┘
┌──────────────────────────────────────────────┐
│ Qemu │
└──────────────────────────────────────────────┘
┌──────────────────────────────────────────────┐
│ NVMM │
└──────────────────────────────────────────────┘
Sedikit penjelasan, setiap instance VM akan memiliki satu atau lebih interface tap yang kemudian akan terkoneksi ke interface bridge0. Interface bridge0 bertindak sebagai software-based switch atau virtual bridge.
Sedangkan interface Vether akan menjadi virual interface yang mewakili host. Yang pada akhirnya akan kemi konekkan ke virtual bridge. Kami sengaja tidak menggunakan intrerface fisik dari host. Kebetulan vether baru saja diperkenalkan di versi NetBSD 10 ini.
Interface dan Bridging
Baik kita masuk lebih dalam, bagian pertama adalah bagaimana kita setup jaringan dan pengalamatan IP. Pertama kami buat file /etc/ifconfig.bridge0
.
Kemudian kami isi dengan config seperti ini
create
up
descr "Qemu Bridge"
! brconfig bridge0 add vether0
Selanjutnya kami membuat file /etc/ifconfig.tap0
dan kami isi dengan baris config berikut ini
create
descr "NetBSD VM" up
! brconfig bridge0 add tap0
Kemudian kami membuat file /etc/ifconfig.vether0
dan mengisinya dengan config berikut ini
create
inet 2.2.2.1 netmask 255.255.255.0
Dapat kita perhatikan bahwa vether0 akan mewakili interface host dan akan bertindak juga sebagai ip gateway. Kami milih ip subnet 2.2.2.0/24 agar mudah mengetikannya.
Network Address Translation
Agar nantinya semua vm yang berjalan dapat terhubung ke internet kami harus menyiapkan infrastruktur NAT dan ip gateway. Untuk itu ada beberapa file yang harus diedit.
Pertama kita edit file /etc/rc.conf
dan tambahkan baris ini.
npf=yes
Kedua edit atau buat file file /etc/npf.conf
isi dengan baris ini
$ext_if = "re0"
$int_if = "vether0"
$ext_addrs = { ifaddrs($ext_if) }
$localnet = { 2.2.2.0/24 }
# Allow pings.
alg "icmp"
# Perform IPv4 NAT.
map inet4($ext_if) dynamic $localnet -> inet4($ext_if)
group "external" on $ext_if {
# Allow all outbound traffic
pass stateful out all
# Block all incoming traffic
block in all
}
group "internal" on $int_if {
# We trust the internal network.
pass in final all
pass out final all
}
group default {
pass final on lo0 all
block all
}
Ketiga edit file /etc/sysctl.conf
dan tambahkan beris ini
net.inet.ip.forwarding=1
DNS dan DHCP
Agar lebih mudah dalam manajemen IP kita akan menggunakan DHCP yang ditenagai oleh dnsmasq. Kenapa tidak menggunakan fasilitas built-in ? Karena kami belum familiar selain itu dnsmasq bisa juga bertindak sebagai dns cache dan dhcp server secara bersamaan.
Pertama kita install paket dnsmasq dengan perintah
doas pkgin install dnsmasq
Copy file rc dengan perintah
doas cp /usr/pkg/share/examples/rc.d/dnsmasq /etc/rc.d
Tambahkan baris ini di /etc/rc.conf
dnsmasq=yes
Buat file /usr/pkg/etc/dnsmasq.conf isi dengan baris ini
interface=vether0
listen-address=2.2.2.1
dhcp-range=2.2.2.2,2.2.2.200,255.255.255.0,12h
dhcp-host=02:00:00:55:6A:5B,2.2.2.2
dhcp-option=3,2.2.2.1
Perhatikan baris ke 4, pada baris itu terdapat notasi dhcp-host. Notasi ini akan memerintahkan kepada dnsmasq apabil terdapat request DHCP dari mac address tertentu maka selalu berikan IP yang sama. Lewat sini lah kita bisa dengan mudah mengatur IP berapa untuk VM mana nantinya.
Untuk membuat alamat mac yang dapat digunakan disini kami menggunakan perintah ini
printf '02:00:00:%02X:%02X:%02X\n' $((RANDOM%256)) $((RANDOM%256)) $((RANDOM%256))
Setelah semuanya tersetup maka saat nya kita restart system kita.
Menjalankan Qemu
Untuk keperluan kali ini kami hanya membuat direktori kerja sebagai tempat meletakan disk dan startup command file. Buat direktori
~/Vmdir/docker
dengan perintah
mkdir -p ~/Vmdir/docker
Masuk ke direktori tersebut dan buat lah disk sebesar 32GB untuk qemu dengan perintah
qemu-img create -f qcow2 disk1.qcow2 32G
Buat startup command dengan nama run.sh
dan isi dengan barus berikut ini
#!/bin/sh
qemu-system-x86_64 -accel nvmm \
-cpu max -smp cpus=2 -m 1G \
-display sdl,gl=on \
-drive file=disk1.qcow2,if=none,id=hd0 \
-device virtio-blk-pci,drive=hd0 \
-object rng-random,filename=/dev/urandom,id=viornd0 \
-device virtio-rng-pci,rng=viornd0 \
-netdev tap,id=tap0,ifname=tap0,script=no \
-device virtio-net-pci,netdev=tap0,mac=02:00:00:55:6A:5B \
-cdrom /home/bram/Iso/alpine-virt-3.20.3-x86_64.iso
Ubah permission file run.sh
chmod +x run.sh
Jalankan run.sh dan lihat bagimana vm baru kita menyala.
Terima kasih selamat mencoba