Ako správne nasadiť OpenBSD 7.9 na Google Cloude

Cieľ

Chcem v prostredí Google Cloudu vytvoriť dočasnú VM inštanciu:

  • s oficiálnym a čo najaktuálnejším vydaním OpenBSD
  • VM bez verejnej IP
  • aby bol z VM prístup do Cloud Storage / Buckets
  • aby bol z VM prístup na internet

Upozornenie

Toto nie je oficiálny návod ani postup!

Výsledkom tohto postupu bude vytvorenie zdrojov v prostredí Google Cloud, ktoré budú spoplatnené!

Na záver je vyslovene odporúčané všetky vytvorené, nepotrebné zdroje odstrániť.


Riešenie

Dostupnosť operačných systémov, ktoré je možné použiť pri vytvárani VM si viem jednoducho overiť.

gcloud compute images list \
  --project=zw-gcp-test-01 \
  --format="value(family)" | sort -u

A konkrétne napríklad len z rodiny OS Debian.

gcloud compute images list \
  --project=zw-gcp-test-01 \
  --filter='family~^debian' \
  --format="value(name,family,status)"

Keďže Google Cloud podľa všetkého neponúka obrazy OpenBSD, budem si musieť aspoň jeden vytvoriť 😎.

Pokiaľ taký obraz s aktuálnou verziou OpenBSD už mám, môžem rovno skočiť na časť o vytváraní VM s OpenBSD .


Vytvorenie pomocnej VM

Na vytváranie vlastného obrazu operačného systému budem potrebovať jednoduchú VM napríklad s OS Debian a so zapnutou nested virtualization .

gcloud compute instances create builder-debian \
  --project=zw-gcp-test-01 \
  --zone=europe-west4-a \
  --machine-type=n2-standard-4 \
  --image-family=debian-13 \
  --image-project=debian-cloud \
  --boot-disk-size=40GB \
  --boot-disk-type=pd-balanced \
  --enable-nested-virtualization \
  --scopes=cloud-platform

Práve kôli potrebe vnorenej (nested) virtualizácii môžem použiť len obmedzené typy VM: N2, N1, C2.


Inštalácia potrebných balíkov

Prihlásim sa do vytvorenej pomocnej VM s Debianom.

gcloud compute ssh builder-debian \
  --project=zw-gcp-test-01 \
  --zone=europe-west4-a \
  --tunnel-through-iap

Na vytvorenej VM môžem najskôr overiť, či má povolenú nested virtualization, je potrebné dostať akúkoľvek inú odpoveď, len nie 0.

grep -cw vmx /proc/cpuinfo

Potom doinštalujem potrebné balíky. Debian som zvolil okrem iného aj preto, lebo balíky emulačného a virtualizačného nástroja QEMU sú obsiahnuté priamo v hlavnom repozitári.

sudo apt-get update
sudo apt-get install -y qemu-system-x86 qemu-utils wget cloud-utils

Aby som nemusel qemu spúšťať s admin právami, pridám bežného užívateľa do skupiny kvm.

sudo usermod -aG kvm "$USER"
newgrp kvm

Stiahnutie OpenBSD

Pokračujem ďalej v pomocnej VM s Debianom a stiahnem si aktuálny inštalačný obraz OpenBSD z ich oficiálnych stránok.

mkdir ~/openbsd-build && cd ~/openbsd-build
wget https://cdn.openbsd.org/pub/OpenBSD/7.9/amd64/install79.iso

Vytvorenie diskového obrazu s OpenBSD

Stále z pomocnej VM. Najskôr vytvorím prázdny diskový obraz.

qemu-img create -f raw disk.raw 10G

Potom spustím vnorenú virtuálnu VM s pripojeným stiahnutým inštalačným obrazom OpenBSD.

qemu-system-x86_64 \
  -enable-kvm \
  -m 2048M \
  -smp 2 \
  -drive file=disk.raw,format=raw,if=virtio \
  -netdev user,id=net0 \
  -device virtio-net-pci,netdev=net0 \
  -cdrom install79.iso \
  -boot d \
  -nographic

Ihneď ako sa objaví vo výpise boot>, respektíve hneď po spustení qemu musím viacnásobným stláčaním klávesy medzerník prerušiť proces zavádzania OS aby som mohol vložiť príkaz na presmerovanie výstupu do terminálu.

set tty com0

Po vložení príkazu stlačím enter a po opätovnom zobrazení výzvy boot> stlačím enter ešte raz. Výpis bude vyzerať nejako takto:

SeaBIOS (version 1.16.3-debian-1.16.3-2)


iPXE (https://ipxe.org) 00:03.0 CA00 PCI2.10 PnP PMM+7EFC6EE0+7EF06EE0 CA00



Booting from DVD/CD...
CD-ROM: E0
Loading /7.9/AMD64/CDBOOT
probing: pc0 com0 mem[639K 2046M a20=on]
disk: fd0 hd0+* cd0
>> OpenBSD/amd64 CDBOOT 3.65
boot>  set tty com0
switching console to com>> OpenBSD/amd64 CDBOOT 3.65
boot>

Postupne prejdem celým procesom inštalácie OpenBSD. Buď vyberiem jednu z možností podľa písmena v okrúhlych zátvorkách, alebo predvolenú možnosť v hranatých zátvorkách, alebo vložím/napíšem požadovanú hodnotu.

  • (I)nstall
  • [vt220]
  • openbsd79
  • [vio0]
  • [autoconf]
  • [autoconf]
  • [done]
  • tajneheslo
  • tajneheslo
  • [yes]
  • no
  • [yes]
  • 115200
  • rado
  • Rado van Zwieratko
  • tajneheslo
  • tajneheslo
  • [no]
  • [Europe/Amsterdam]
  • [sd0]
  • [no]
  • [whole]
  • [a]
  • cd0
  • [7.9/amd64]
  • [done]
  • yes
  • [done]
  • halt

Potom môžem po zastavení OpenBSD inštalátora qemu úplne vypnúť: ctrl + A a potom X.

Tu je celý priebeh odpovedí:

Welcome to the OpenBSD/amd64 7.9 installation program.
(I)nstall, (U)pgrade, (A)utoinstall or (S)hell? i
At any prompt except password prompts you can escape to a shell by
typing '!'. Default answers are shown in []'s and are selected by
pressing RETURN.  You can exit this program at any time by pressing
Control-C, but this can leave your system in an inconsistent state.

Terminal type? [vt220]
System hostname? (short form, e.g. 'foo') openbsd79

Available network interfaces are: vio0 vlan0.
Network interface to configure? (name, lladdr, '?', or 'done') [vio0]
IPv4 address for vio0? (or 'autoconf' or 'none') [autoconf]
IPv6 address for vio0? (or 'autoconf' or 'none') [autoconf]
Available network interfaces are: vio0 vlan0.
Network interface to configure? (name, lladdr, '?', or 'done') [done]
Using DNS domainname my.domain
Using DNS nameservers at 10.0.2.3

Password for root account? (will not echo)
Password for root account? (again)
Start sshd(8) by default? [yes]
Do you expect to run the X Window System? [yes] no
Change the default console to com0? [yes]
Available speeds are: 9600 19200 38400 57600 115200.
Which speed should com0 use? (or 'done') [9600] 115200
Setup a user? (enter a lower-case loginname, or 'no') [no] rado
Full name for user rado? [rado] Rado van Zwieratko
Password for user rado? (will not echo)
Password for user rado? (again)
WARNING: root is targeted by password guessing attacks, pubkeys are safer.
Allow root ssh login? (yes, no, prohibit-password) [no]
What timezone are you in? ('?' for list) [Europe/Amsterdam]

Available disks are: sd0.
Which disk is the root disk? ('?' for details) [sd0]
Encrypt the root disk with a (p)assphrase or (k)eydisk? [no]
No valid MBR or GPT.
Use (W)hole disk MBR, whole disk (G)PT or (E)dit? [whole]
Setting OpenBSD MBR partition to whole sd0...done.
The auto-allocated layout for sd0 is:
#                size           offset  fstype [fsize bsize   cpg]
  a:          1190.2M               64  4.2BSD   2048 16384     1 # /
  b:           256.0M          2437568    swap
  c:         10240.0M                0  unused
  d:          3072.0M          2961856  4.2BSD   2048 16384     1 # /usr
  e:          2048.0M          9253312  4.2BSD   2048 16384     1 # /home
Use (A)uto layout, (E)dit auto layout, or create (C)ustom layout? [a]
/dev/rsd0a: 1190.2MB in 2437504 sectors of 512 bytes
6 cylinder groups of 202.50MB, 12960 blocks, 25920 inodes each
/dev/rsd0e: 2048.0MB in 4194304 sectors of 512 bytes
11 cylinder groups of 202.50MB, 12960 blocks, 25920 inodes each
/dev/rsd0d: 3072.0MB in 6291456 sectors of 512 bytes
16 cylinder groups of 202.50MB, 12960 blocks, 25920 inodes each
/dev/sd0a (e1f775f25bb12b2d.a) on /mnt type ffs (rw, asynchronous, local)
/dev/sd0e (e1f775f25bb12b2d.e) on /mnt/home type ffs (rw, asynchronous, local, nodev, nosuid)
/dev/sd0d (e1f775f25bb12b2d.d) on /mnt/usr type ffs (rw, asynchronous, local, nodev)

Let's install the sets!
Location of sets? (cd0 disk http nfs or 'done') [http] cd0
Pathname to the sets? (or 'done') [7.9/amd64]

Select sets by entering a set name, a file name pattern or 'all'. De-select
sets by prepending a '-', e.g.: '-game*'. Selected sets are labelled '[X]'.
    [X] bsd           [X] base79.tgz    [X] game79.tgz    [X] xfont79.tgz
    [X] bsd.mp        [X] comp79.tgz    [X] xbase79.tgz   [X] xserv79.tgz
    [X] bsd.rd        [X] man79.tgz     [X] xshare79.tgz
Set name(s)? (or 'abort' or 'done') [done]
Directory does not contain SHA256.sig. Continue without verification? [no] yes
Installing bsd          100% |**************************| 32203 KB    00:17
Installing bsd.mp       100% |**************************| 32331 KB    00:17
Installing bsd.rd       100% |**************************|  4734 KB    00:02
Installing base79.tgz   100% |**************************|   510 MB    05:07
Extracting etc.tgz      100% |**************************|   269 KB    00:00
Installing comp79.tgz   100% |**************************| 88886 KB    00:57
Installing man79.tgz    100% |**************************|  8406 KB    00:05
Installing game79.tgz   100% |**************************|  2742 KB    00:01
Installing xbase79.tgz  100% |**************************| 47835 KB    00:30
Extracting xetc.tgz     100% |**************************|  8772       00:00
Installing xshare79.tgz 100% |**************************|  4562 KB    00:03
Installing xfont79.tgz  100% |**************************| 23022 KB    00:13
Installing xserv79.tgz  100% |**************************| 11815 KB    00:07
Installing BUILDINFO    100% |**************************|    54       00:00
Location of sets? (cd0 disk http nfs or 'done') [done]
Saving configuration files... done.
Making all device nodes... done.
Multiprocessor machine; using bsd.mp instead of bsd.
fw_update: add none; update none
Relinking to create unique kernel... done.

CONGRATULATIONS! Your OpenBSD install has been successfully completed!

When you login to your new system the first time, please read your mail
using the 'mail' command.

Exit to (S)hell, (H)alt or (R)eboot? [reboot] halt
syncing disks... done

The operating system has halted.
Please press any key to reboot.

QEMU: Terminated

Na záver skontrolujem vytvorený súbor.

ls -l disk.raw

A skomprimujem vytvorený súbor - obraz disku s čerstvo nainštalovaným OpenBSD, podľa GCP špecifikácie .

tar --format=oldgnu -Sczf openbsd-79-v2.tar.gz disk.raw

Nahratie do bucketu

A ešte posledný krok z pomocnej VM, nahrám vytvorený obraz disku s OpenBSD do projektového bucketu.

gcloud storage cp openbsd-79-v2.tar.gz gs://zw_test-01/custom-images/

Registrácia nového obrazu disku

Keďže obraz disku je už v buckete, nasledujúci krok môžem vykonať aj z pomocnej VM, ale už aj z Cloud Shellu alebo odkiaľkoľvek kde mám gcloud s prístupom do tohto projektu.

gcloud compute images create openbsd-79-v2 \
  --project=zw-gcp-test-01 \
  --source-uri=gs://zw_test-01/custom-images/openbsd-79-v2.tar.gz \
  --family=openbsd

A môžem si aj rovno overiť či už obraz z takejto rodiny uvidím vo výpise.

gcloud compute images list \
  --project=zw-gcp-test-01 \
  --filter='family~^openbsd' \
  --format="value(name,family,status)"

Odstránenie pomocnej VM

Po vytvorení a nahratí obrazu disku s OpenBSD môžem pomocnú VM s Debianom odstrániť.

gcloud compute instances delete builder-debian \
  --zone=europe-west4-a \
  --project=zw-gcp-test-01

Prípadne môžem skontrolovať, či bola pomocná VM odstránená.

gcloud compute instances list --project=zw-gcp-test-01

Nastavenie siete v cloude

Povolím prístup z daného subnetu ku Google cloudovým API endpointom.

gcloud compute networks subnets update default \
  --region=europe-west4 \
  --enable-private-ip-google-access \
  --project=zw-gcp-test-01

Vytvorím cloudový router vo VPC sieti/regióne.

gcloud compute routers create nat-router-euw4 \
  --network=default \
  --region=europe-west4 \
  --project=zw-gcp-test-01

Vo vytvorenom routri pridám NAT pre všetky subnety v regióne.

gcloud compute routers nats create nat-gateway-euw4 \
  --router=nat-router-euw4 \
  --region=europe-west4 \
  --auto-allocate-nat-external-ips \
  --nat-all-subnet-ip-ranges \
  --project=zw-gcp-test-01

Tieto vytvorené prostriedky sú už ale spoplatnené, presnejšie Cloud NAT. A teda na rozdiel od zmeny nastavenia pre prístup k interným API, ktorý môžem ponechať povolený, tak tieto prostriedky je vyslovene vhodné po ukončení používania odstrániť.


Vytvorenie VM s OpenBSD

A konečne 🎉 môžem pristúpiť ku vytvorenie dočasnej VM v Google Cloude s OS OpenBSD.

Pri výbere typu VM sa zameriam na Intel, bo pri detekcii AMD EPYC sa jadro v C funkcii cpu_fix_msrs pokúša zapísať bezpečnostnú opravu pre špekulatívne vykonávanie instrukcií a v GCP virtualizácii to kvôli prísnej izolácii vyvolá protection fault trap a pád do debuggeru.

kernel: protection fault trap, code=0
Stopped at      cpu_fix_msrs+0x13f:     wrmsr
ddb{0}>

Takže po prvotných pokusoch s e2-medium som nakoniec zvolil n2-standard-2.

gcloud compute instances create openbsd-server-01 \
  --project=zw-gcp-test-01 \
  --zone=europe-west4-a \
  --machine-type=n2-standard-2 \
  --image=openbsd-79-v2 \
  --boot-disk-size=10GB \
  --boot-disk-type=pd-balanced \
  --no-address \
  --scopes=cloud-platform \
  --metadata=serial-port-enable=true

A môžem sa ku novovytvorenej VM s OpenBSD pripojiť cez sériovú konzolu. Zatiaľ tam nie sú žiadne SSH kľúče!

gcloud compute connect-to-serial-port openbsd-server-01 \
  --zone=europe-west4-a \
  --project=zw-gcp-test-01

Zo sériovej konzoly sa nakoniec odpojím kombináciou:
enter, ~, . (enter, potom tilda a potom bodka).


Základné nastavenie po inštalácii OpenBSD

Ak sa chcem ku VM s OpenBSD prihlasovať pomocou SSH kľúčov, potrebujem počas pripojenia cez sériovú konzolu pridať verejnú časť SSH medzi autorizované kľúče daného užívateľa. Kľúč vytiahnem z meta-dát projektu.

(printf "GET /computeMetadata/v1/project/attributes/ssh-keys HTTP/1.0\r\nHost: metadata.google.internal\r\nMetadata-Flavor: Google\r\n\r\n") | nc 169.254.169.254 80 | grep '^rado:' | sed 's/^rado://' > ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

A môžem ešte bežného užívateľa pridať medzi administrátorov. Toto potrebujem vykonať ako root (ešte stále cez sériovú konzolu).

echo "permit keepenv :wheel" > /etc/doas.conf
usermod -G operator rado
usermod -G wheel rado

Teraz už by som sa mal vedieť prihlásiť aj pomocou SSH kľúčov ako bežný užívateľ.

gcloud compute ssh rado@openbsd-server-01 \
  --project=zw-gcp-test-01 \
  --zone=europe-west4-a \
  --tunnel-through-iap

Po opätovnom prihlásení (ako bežný užívateľ), už môžem zadávať príkazy ako admin.

# doinštalovanie chýbajúcich ovládačov
doas fw_update

# aktualizácia systému
doas syspatch

Odstránenie VM s OpenBSD

A ak už VM s OpenBSD nepotrebujem, môžem ju odstrániť.

gcloud compute instances delete openbsd-server-01 \
  --zone=europe-west4-a \
  --project=zw-gcp-test-01

Ak som si odstraňovanou VM úplne istý, môžem použiť prepínač --quiet, -q a tak vypnúť interatívne potvrdenie. VM sa jednoducho zmaže pbez ďalšieho potvrdenia!

Ďalej odstránim NAT bránu.

gcloud compute routers nats delete nat-gateway-euw4 \
  --router=nat-router-euw4 \
  --region=europe-west4 \
  --project=zw-gcp-test-01

Odstránim aj Cloud router.

gcloud compute routers delete nat-router-euw4 \
  --region=europe-west4 \
  --project=zw-gcp-test-01

Na záver môžem vykonať kontrolu, či v danom projekte ešte niečo neostalo.

# Kontrola VM
gcloud compute instances list --project=zw-gcp-test-01

# Kontrola samostatných diskov
gcloud compute disks list --project=zw-gcp-test-01

# Kontrola routerov
gcloud compute routers list --project=zw-gcp-test-01

Všetky tri príkazy by mali vrátiť prázdny zoznam: Listed 0 items..


Zdroj


zw

GCPOpenBSD

1965 slov

2026-09-13 05:16 +0000

2026-09-15 16:03 +0000