Setup hypervisor management sederhan dengan NetBSD

4 minute read Published: 2024-09-27

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