Ce que cela permet de construire
Une machine bare metal exécutant Proxmox VE comme son propre hyperviseur, avec un miroir ZFS sur les disques NVMe, un pont qui attribue des adresses réelles aux invités, et la virtualisation imbriquée activée et vérifiée — ce qui signifie qu'un invité sur cette machine peut lui-même exécuter des invités.
L'imbrication est la raison de faire cela sur du métal plutôt que sur une instance virtuelle. Vous ne pouvez pas imbriquer à l'intérieur de l'hyperviseur de quelqu'un d'autre avec des résultats prévisibles, et sur un BM-E, il n'y a pas de notre hyperviseur sur le chemin : vous avez IPMI, un bouton d'alimentation et la carte mère. Ce qui y tourne est votre décision.
Avant de commencer
- Un BM-E : trente-deux cœurs Zen 4, 256 Go de RAM ECC, quatre disques NVMe et huit adresses IPv4. IPMI est accessible via un VPN, que le support configure lors de la remise de la machine.
- Proxmox VE 8 sélectionné à la commande, ou une ISO personnalisée téléchargée via le panneau. Les deux chemins aboutissent au même installateur.
- Une demi-heure où personne n'a besoin de la machine, car la première étape la redémarre plusieurs fois.
1. Installation
Connectez-vous à la console via le VPN de gestion, montez l'ISO et démarrez-la. À l'écran de sélection des disques, choisissez les quatre NVMe, sélectionnez zfs (RAID10) et ouvrez les options avancées :
ashiftà 12, ce qui est la valeur correcte pour des secteurs de quatre kilo-octets et ne peut pas être modifié par la suite sans reconstruire le pool.compressà lz4. Cela coûte une fraction de cœur et rend généralement un tiers de l'espace.hdsizeréduit pour laisser le reste au stockage des invités, sauf si vous voulez que le pool racine possède le tout.
Définissez l'adresse de gestion et la passerelle à partir des détails du panneau, et utilisez le nom de domaine complet de la machine comme nom d'hôte. Deux redémarrages plus tard, vous avez une invite de connexion et une interface web sur le port 8006.
2. Dépôts et paquets
Le dépôt entreprise échouera sans abonnement et encombrera chaque apt update jusqu'à ce que vous le traitiez :
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. Mémoire pour ZFS
Sinon, l'ARC atteindra la moitié de votre RAM, et sur une machine dont le travail est d'exécuter des invités, cette mémoire a un meilleur usage :
echo "options zfs zfs_arc_max=34359738368" > /etc/modprobe.d/zfs.conf
update-initramfs -u -k allTrente-deux gigaoctets d'ARC sur une machine de 256 Go laisse de la place pour le cache sans affamer les invités. Redémarrez pour appliquer, ou réglez-le en direct avec echo dans /sys/module/zfs/parameters/zfs_arc_max si vous ne le pouvez pas.
4. Réseau
Huit adresses, ce n'est pas beaucoup, alors les invités sont sur un pont privé et seuls ceux qui ont besoin d'une adresse publique en reçoivent une qui leur est routée. Modifiez /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 n'a pas besoin de traduction d'adresse, car le /64 routé vers la machine est réellement routé : attribuez des adresses de celui-ci aux invités sur le pont et ils atteignent Internet directement. Cette asymétrie entre les deux familles n'est pas élégante, mais c'est la forme honnête de l'espace d'adressage dans lequel nous vivons.
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. Virtualisation imbriquée
cat /sys/module/kvm_amd/parameters/nestedSur les noyaux actuels, cela affiche déjà 1. S'il affiche 0 :
echo "options kvm-amd nested=1" > /etc/modprobe.d/kvm-amd.conf
update-initramfs -u && rebootL'imbrication nécessite également que l'invité voie un CPU qui admet la fonctionnalité, ce qui signifie que le type de processeur doit être host. Tout autre chose présente un modèle de CPU synthétique avec les extensions de virtualisation masquées, et l'hyperviseur interne refuse de démarrer avec une erreur qui ne mentionne rien de tout cela.
6. Un invité
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 avec ssd=1 signifie que les suppressions dans l'invité sont retournées au pool plutôt que de s'accumuler comme espace que vous avez perdu de vue.
7. Pare-feu
L'interface web sur le port 8006 n'a rien à faire accessible publiquement. Restreignez-la au niveau du centre de données à l'adresse depuis laquelle vous administrez — le point de terminaison du tunnel du guide WireGuard est le candidat évident :
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-firewallVérification
D'abord l'hôte :
pveversion -v | head -3
zpool status rpool
zpool list -o name,size,alloc,free,frag,cap
arc_summary | head -12Le pool indique ONLINE avec deux paires en miroir, et la cible de l'ARC est à trente-deux gigaoctets que vous avez définis plutôt qu'à la moitié de la machine.
Maintenant, l'intérêt réel de cette construction. Connectez-vous à l'invité et vérifiez le processeur qui lui a été attribué :
ssh [email protected]
lscpu | grep -E "Model name|Virtuali"
grep -c svm /proc/cpuinfoLe nom du modèle doit être le vrai EPYC, et la ligne virtualisation doit indiquer AMD-V. Un zéro de la troisième commande signifie que le type de processeur n'est pas host, et tout ce qui suit échouera.
Puis exécutez une machine dans la machine :
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 affichant que l'accélération peut être utilisée, suivi d'un démarrage Alpine qui atteint une invite de connexion en quelques secondes plutôt qu'en rampant, est la vérification. Sans imbrication, cette même commande refuse carrément ou émule en logiciel à environ un vingtième de la vitesse, ce qui est indubitable.
Enfin, confirmez que l'interface est fermée de l'extérieur :
curl -m5 -k https://<public address>:8006/ ; echo "exit $?"Un délai de connexion est la réponse correcte.
Après
Les instantanés sur ZFS sont gratuits jusqu'à divergence, donc un plan zfs-auto-snapshot nocturne coûte presque rien et a sauvé plus de machines que n'importe quelle politique de sauvegarde. Les reconstructions sur métal sont le jour même, mais une reconstruction vous rend une machine vide, ce qui est différent de vous rendre votre machine.