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:
ashiftprzy 12, co jest poprawną wartością dla sektorów czterokilobajtowych i nie można tego później zmienić bez przebudowy puli.compressprzy lz4. Kosztuje to ułamek rdzenia i zwykle zwraca jedną trzecią przestrzeni.hdsizezmniejszone, 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
reboot3. 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 allTrzydzieś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/64IPv6 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 -a5. Wirtualizacja zagnieżdżona
cat /sys/module/kvm_amd/parameters/nestedNa 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 && rebootZagnież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 100discard=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-firewallWeryfikacja
Najpierw host:
pveversion -v | head -3
zpool status rpool
zpool list -o name,size,alloc,free,frag,cap
arc_summary | head -12Pula 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/cpuinfoNazwa 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 -nographickvm-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.