FreeBSD, bhyve, cloud-init, ubuntu-24.04-server-cloudimg-amd64

Fórum kérdésnek indult, mert a cloud-init-tel csúnyán elakadtam, de végül sikerült megoldani, így blogpost lett. :)

Kipróbáltam FreeBSD alatt a bhyve hypervisort, szeretnék használni virtuális gépeket is az itthoni szerveren.

Nem szeretnék operációs rendszert telepítgetni virtuális gépekbe, ezért gondoltam, hogy egy cloud image-et fogok használni.

Telepítés

A telepítése egyszerű volt, ezt az oldalt néztem a legtöbbet: https://github.com/churchers/vm-bhyve

A következő csomagokat tettem fel:

  • vm-bhyve
  • grub2-bhyve
  • bhyve-firmware
  • edk2-bhyve
  • qemu-tools
  • cdrkit-genisoimage

A vm-bhyve-ban van egy alap szintű cloud init támogatás, a qemu-tools, és a cdrkit-genisoimage csomagok ehhez kellenek.

Az /etc/rc.conf-ba ezeket kellett felvenni:

vm_enable="YES"
vm_dir="zfs:zroot/vm"

És a vmm kernel modult kellett engedélyezni, /boot/loader.conf:

vmm_load="YES"

A https://github.com/churchers/vm-bhyve oldalon a quick start-ban leírtak teljesen jól működnek, javaslom hogy az ott leírt lépéseket kövesd, ha Te is ki akarod próbálni a bhyve-ot.

Hálózat beállítása

A hálózati beállításoknál volt egy kisebb módosítás nekem a leíráshoz képest, mert már van egy bridge-em a jail-ek miatt, és így nem tudtam újat létrehozni, mert ahhoz nem lehet már hozzáadni az em0 (vagyis nekem re0) interfészt:

Tehát ez a rész a leírásból:

7. vm switch create public
8. vm switch add public em0

módosult erre:

vm switch create -t manual -b bridge0 public

 

Virtuális gép létrehozása - csapó 1

A VNC csak UEFI-s boottal működik.

Az első bhyve-os virtuális gépemhez a következő template-et csináltam:

# cat /zroot/vm/.templates/ubuntu.conf 
loader="uefi"
cpu=4
memory=4096M
network0_type="virtio-net"
network0_switch="public"
disk0_type="nvme"
disk0_name="zvol"
disk0_dev="sparse-zvol"
graphics="yes"
graphics_res="1280x1024"

vm img paranccsal le tudom tölteni az ubuntu cloud image-et, innen: https://cloud-images.ubuntu.com/releases/24.04/release/ubuntu-24.04-ser…

vm img https://cloud-images.ubuntu.com/releases/24.04/release/ubuntu-24.04-server-cloudimg-amd64.img

Ezt eltette a /zroot/vm/.img könyvtárba. Ha iso-t tölt le valaki, akkor a "vm iso" paranccsal kell, és az a zroot/vm/.iso-ba került.

SSH kulcs generálása:

ssh-keygen -t ed25519

Gép létrehozása:

A vm-bhyve-nak a -C paraméterrel mondhatjuk meg, hogy cloud-init-et szeretnénk használni. Ekkor létrehozza a /zroot/vm/virutális_gép/.cloud_init-be a cloud_init fájlokat, amit utána becsomagol a seed.iso-ba, kb így. Ehhez kellhetett a cdrkit-genisoimage csomag.  (pl.: genisoimage -output ./seed.iso -volid cidata -joliet -rock .cloud-init/*)

A -n paraméterrel a hálózati beállítások adhatóak meg, amit a vm create beleír a network-config cloud-init fájlba, megtaláltam az Interneten a példát:

vm create -t ubuntu -s 20g -i ubuntu-24.04-server-cloudimg-amd64.img -C -n "ip=192.168.4.230;gateway=192.168.4.1;nameservers=1.1.1.1" -k ~/.ssh/id_ed25519.pub ubuntu

Indítás:

vm start ubuntu

És pufff, nem működik! A vm console-lal csatlakozni szeretnék, de az nem csinál semmit (vagy lehet, hogy csak hosszú idő után reagált), VNC-vel be tudok lépni, de látszólag 2 másodperc után kifagyott a boot. Hosszú várakozás után valami timeoutra ment, és megjelent a login. De itt SSH lett beállítva, nincs a usernek jelszava, nem tudok belépni.

Látszólag nincs hálózat.

Virtuális gép létrehozása - csapó 2

vm create -t ubuntu -s 20g -i ubuntu-24.04-server-cloudimg-amd64.img -C -k ~/.ssh/id_ed25519.pub ubuntu
vm start ubuntu

A gép viszonylag gyorsan létrejön, és egy pillanat alatt elindul. DHCP-n kapott IP címet, és működik, SSH-val be tudok lépni. A routerben néztem meg a listát, MAC address alapján, hogy kik kaptak IP címet.

A MAC address-t pl le lehet kérdezni a "vm info" paranccsal, de a virtuális gép könyvtárában is benne van valahol: /zroot/vm/ubuntu

De nekem statikus IP címmel kell a virtuális gép, nem DHCP-vel.

Virtuális gép létrehozása - csapó 1000

Már mindent kipróbáltam és mindennek elszidtam magamban a cloud-init-et is, és az ubuntut is, hogy ez miért nem működik, és egyébként is miért kell valaminek ilyen bonyolultnak lennie, az Interneten semmi infó erről, hogy miért nem megy, kb 4 órát töltöttem próbálkozással, és hibakereséssel.

Végső elkeseredésemben elkezdtem megnézni a vm-bhyve forráskódját, hátha találok egy olyan hálózati beállítást, amit nem ismerek:

A lib könyvtárban találtam egy csomó shell script-et (ezek szerint ez a tool shell scriptekből áll). A neve alapján a vm-cmd nevűben megkerestem a vm create parancsot, ami a core::create-re hivatkozott:

create)    core::create "$@" ;;

A vm-core fájlban ott van a core::create, és azon belül a -n a network config:

n) _network_config=${OPTARG} ;;

és végül a network config-ra ugyanitt találtam meg a példát:

if [ -n "${_network_config}" ]; then
  # Example netconfig param: "ip=10.0.0.2/24;gateway=10.0.0.1;nameservers=1.1.1.1,8.8.8.8"

Még jó, hogy a példa nem a doksiban van, hanem a forráskódban egy commentben.

Hát, én lefelejtettem a /24-et!

vm create -t ubuntu -s 20g -i ubuntu-24.04-server-cloudimg-amd64.img -C -n "ip=192.168.4.230/24;gateway=192.168.4.1;nameservers=1.1.1.1" -k ~/.ssh/id_ed25519.pub ubuntu

Így már elindult a gép:

vm start ubuntu
ssh ubuntu@192.168.4.230

cloud-init

Persze én nem értek ehhez sem, biztos, hogy én csináltam rosszul, de sehol egy hibaüzenet, ami bootoláskor szembe jött volna, egyszerűen csak nem sikerült configolni a network-öt, és nem működött. A cloud-init doksiját olvasva 1000 dolgot tud, kicsit bonyolultnak tűnik. Nem igazán lett a szívem csücske a cloud-init. (De ez még változhat, ha jobban megismerem.)

Hozzászólások

Ugye egy IP cím hálózati maszk nélkül csak 4 szám ponttal elválasztva. ;-)

De ettől függetlenül valami hibaüzenetet dobhatott volna a parancs kiadásakor.

Szerintem ma - a classless IP korában - még mindig 3 csoportba sorolhatók a szoftverek.

- Legtöbb *szerintem* még mindig úgy gondolja, hogy ha nincs netmask, akkor ott az A (B, C, D, E) osztály szerint odaillő netmask van

- utána jön amelyik /32-nek veszi

- és végül vannak azok, amelyek ezt hibának tekintik (és vagy szólnak róla, vagy nem)

És mi jött ma szembe???

https://lists.freebsd.org/archives/freebsd-current/2024-June/006075.html

Azaz FreeBSD 14-ben sikeresen elültettek egy hibát, és netmask nélküli megadásnál /8-as értékel "képzel oda" az ifconfig - függetlenül az IP-cím "osztályától". Jelenlegi állapotban ez marhaság, a javítás élesítése után ez így hibát fog dobni. Meg lehet adni A.B.C.D/X illetve A.B.C.D netmask X.Y.U.V formában is, de valamelyik forma szükséges (*). Az már biztosnak látszik, hogy 15-ben és 14.2-ben javítják, hogy lesz-e javítás 14.0-hoz és 14.1-hez, az egyelőre nem ismert.

(*) értelemszerűen ez akkor érdekes, ha hiányos az rc.conf-beli interfész beállítás