Dwanaście instalacji

Proxmox na metalicznej maszynie, z działającymi zagnieżdżonymi maszynami wirtualnymi

Maszyna single-tenant EPYC z Proxmox VE na zlustrowanym NVMe, routingowany most dla gości i zagnieżdżona wirtualizacja potwierdzona z wnętrza gościa.

Co to buduje

Bare metal z systemem Proxmox VE jako własnym hypervisorem, z lustrem ZFS na dyskach NVMe, mostem, który przekazuje gościom prawdziwe adresy, oraz włączoną i zweryfikowaną wirtualizacją zagnieżdżoną — co oznacza, że gość na tej maszynie może sam uruchamiać gości.

Zagnieżdżanie to powód, dla którego robi się to na metalu, a nie na instancji wirtualnej. Nie można zagnieździć się wewnątrz cudzego hypervisora z przewidywalnymi wynikami, a na BM-E nie ma naszego hypervisora na drodze: dostajesz IPMI, przycisk zasilania i płytę główną. To, co na niej działa, jest twoją decyzją.

Zanim zaczniesz

  • BM-E: trzydzieści dwa rdzenie Zen 4, 256 GB ECC, cztery dyski NVMe i osiem adresów IPv4. IPMI jest osiągalne przez VPN, który wsparcie konfiguruje przy przekazaniu maszyny.
  • Proxmox VE 8 wybrany przy zamówieniu lub niestandardowy ISO wgrany przez panel. Obie ścieżki kończą się w tym samym installerze.
  • Pół godziny, gdy nikt nie potrzebuje maszyny, bo krok pierwszy restartuje ją kilka razy.

1. Instalacja

Połącz się z konsolą przez VPN zarządczy, zamontuj ISO i uruchom z niego system. Na ekranie wyboru dysków zaznacz wszystkie cztery dyski NVMe, wybierz zfs (RAID10) i otwórz opcje zaawansowane:

  • ashift przy 12, co jest poprawną wartością dla sektorów czterokilobajtowych i nie można tego później zmienić bez przebudowy puli.
  • compress przy lz4. Kosztuje to ułamek rdzenia i zwykle zwraca jedną trzecią przestrzeni.
  • hdsize zmniejszone, aby resztę zostawić na storage dla gości, chyba że chcesz, aby pula główna posiadała wszystko.

Ustaw adres zarządzania i bramę zgodnie ze szczegółami z panelu i użyj w pełni kwalifikowanej nazwy maszyny jako hostname. Po dwóch restartach masz monit logowania i interfejs webowy na porcie 8006.

2. Repozytoria i pakiety

Repozytorium enterprise nie zadziała bez subskrypcji i będzie zaśmiecać każdy apt update, dopóki się tym nie zajmiesz:

rm -f /etc/apt/sources.list.d/pve-enterprise.sources
echo "deb http://download.proxmox.com/debian/pve bookworm pve-no-subscription" > /etc/apt/sources.list.d/pve-community.list
apt update && apt full-upgrade -y
apt install -y ifupdown2 chrony zfsutils-linux
reboot

3. Pamięć dla ZFS

ARC w przeciwnym razie urośnie do połowy RAM-u, a na maszynie, której całe zadanie to uruchamianie gości, ta pamięć ma lepsze zastosowanie:

echo "options zfs zfs_arc_max=34359738368" > /etc/modprobe.d/zfs.conf
update-initramfs -u -k all

Trzydzieści dwa gigabajty ARC na maszynie z 256 GB zostawia sporo na cache, nie głodząc gości. Zrestartuj, aby to zastosować, lub ustaw na żywo przez echo do /sys/module/zfs/parameters/zfs_arc_max, jeśli nie możesz.

4. Sieć

Osiem adresów to niewiele, więc goście siedzą na prywatnym moście, a tylko ci, którzy potrzebują publicznego adresu, dostają go routowanego. Edytuj /etc/network/interfaces:

auto lo
iface lo inet loopback

auto enp1s0f0
iface enp1s0f0 inet static
  address <public address>/24
  gateway <gateway>

auto vmbr0
iface vmbr0 inet static
  address 10.20.0.1/24
  bridge-ports none
  bridge-stp off
  bridge-fd 0
  post-up   iptables -t nat -A POSTROUTING -s 10.20.0.0/24 -o enp1s0f0 -j MASQUERADE
  post-down iptables -t nat -D POSTROUTING -s 10.20.0.0/24 -o enp1s0f0 -j MASQUERADE

iface vmbr0 inet6 static
  address 2001:db8:1a2b:20::1/64

IPv6 nie wymaga translacji adresów, ponieważ /64 routowany do maszyny jest naprawdę routowany: przypisz z niego adresy gościom na moście, a oni dotrą do internetu bezpośrednio. Ta asymetria między dwiema rodzinami nie jest elegancka, ale to uczciwy kształt przestrzeni adresowej, w której żyjemy.

sysctl -w net.ipv4.ip_forward=1
echo "net.ipv4.ip_forward = 1" > /etc/sysctl.d/80-pve.conf
echo "net.ipv6.conf.all.forwarding = 1" >> /etc/sysctl.d/80-pve.conf
ifreload -a

5. Wirtualizacja zagnieżdżona

cat /sys/module/kvm_amd/parameters/nested

Na obecnych jądrach to już wypisuje 1. Jeśli wypisuje 0:

echo "options kvm-amd nested=1" > /etc/modprobe.d/kvm-amd.conf
update-initramfs -u && reboot

Zagnieżdżanie wymaga również, aby gość widział CPU, który przyznaje się do tej funkcji, co oznacza, że typ procesora musi być host. Cokolwiek innego prezentuje syntetyczny model CPU z zamaskowanymi rozszerzeniami wirtualizacji, a wewnętrzny hypervisor odmawia startu z błędem, który o tym nie wspomina.

6. Gość

cd /var/lib/vz/template/iso
wget https://cloud.debian.org/images/cloud/trixie/latest/debian-13-genericcloud-amd64.qcow2

qm create 100 --name inner --memory 16384 --cores 8 --cpu host \
  --net0 virtio,bridge=vmbr0 --scsihw virtio-scsi-single --ostype l26 \
  --agent enabled=1 --machine q35 --bios ovmf
qm set 100 --efidisk0 local-zfs:1
qm importdisk 100 debian-13-genericcloud-amd64.qcow2 local-zfs
qm set 100 --scsi0 local-zfs:vm-100-disk-1,discard=on,ssd=1
qm set 100 --boot order=scsi0
qm set 100 --ipconfig0 ip=10.20.0.100/24,gw=10.20.0.1
qm set 100 --sshkeys /root/.ssh/authorized_keys
qm set 100 --ciuser admin
qm start 100

discard=on z ssd=1 oznacza, że usunięcia wewnątrz gościa wracają do puli, zamiast gromadzić się jako utracona przestrzeń.

7. Firewall

Interfejs webowy na porcie 8006 nie powinien być publicznie osiągalny. Ogranicz go na poziomie centrum danych do adresu, z którego administrujesz — punkt końcowy tunelu z przewodnika WireGuard jest oczywistym kandydatem:

cat > /etc/pve/firewall/cluster.fw <<EOF
[OPTIONS]
enable: 1
policy_in: DROP

[RULES]
IN SSH(ACCEPT) -source 10.7.0.0/24
IN ACCEPT -source 10.7.0.0/24 -dport 8006 -proto tcp
IN ACCEPT -p icmp
EOF
systemctl restart pve-firewall

Weryfikacja

Najpierw host:

pveversion -v | head -3
zpool status rpool
zpool list -o name,size,alloc,free,frag,cap
arc_summary | head -12

Pula raportuje ONLINE z dwiema parami lustrzanymi, a cel ARC znajduje się na trzydziestu dwóch gigabajtach, które ustawiłeś, a nie na połowie maszyny.

Teraz sedno tej konstrukcji. Zaloguj się do gościa i sprawdź procesor, który mu dano:

ssh [email protected]
lscpu | grep -E "Model name|Virtuali"
grep -c svm /proc/cpuinfo

Nazwa modelu powinna być prawdziwym EPYC-em, a linia wirtualizacji powinna raportować AMD-V. Zero z trzeciego polecenia oznacza, że typ procesora to nie host, a wszystko poniżej zawiedzie.

Następnie uruchom maszynę w maszynie:

apt install -y qemu-system-x86 qemu-utils cpu-checker
kvm-ok
wget https://dl-cdn.alpinelinux.org/alpine/v3.22/releases/x86_64/alpine-virt-3.22.0-x86_64.iso
qemu-system-x86_64 -enable-kvm -m 2048 -cdrom alpine-virt-3.22.0-x86_64.iso -nographic

kvm-ok wypisujące, że akceleracja może być użyta, po którym następuje boot Alpine osiągający monit logowania w kilka sekund, a nie pełzający, jest weryfikacją. Bez zagnieżdżania to samo polecenie albo odmawia wprost, albo emuluje w oprogramowaniu z prędkością około jednej dwudziestej, co jest nie do pomylenia.

Na koniec potwierdź, że interfejs jest zamknięty z zewnątrz:

curl -m5 -k https://<public address>:8006/ ; echo "exit $?"

Przekroczenie czasu połączenia jest poprawną odpowiedzią.

Potem

Snapshoty na ZFS są darmowe, dopóki nie zaczną się różnić, więc nocny harmonogram zfs-auto-snapshot kosztuje prawie nic i uratował więcej maszyn niż jakakolwiek polityka backupów. Przebudowy na metalu są w trybie tego samego dnia, ale przebudowa zwraca ci pustą maszynę, co jest czymś innym niż zwrócenie twojej maszyny.

Gotowi, gdy jesteś

Wybierz miasto. Wybierz rozmiar. Płać kryptowalutą.

Bez formularzy o tym, kim jesteś, bez czekania na akceptację człowieka, bez telefonu w celu weryfikacji. Faktura zostaje uregulowana, a dane logowania trafiają do Twojej skrzynki.