Qué construye esto
Una máquina de metal desnudo que ejecuta Proxmox VE como su propio hipervisor, con un espejo ZFS en las unidades NVMe, un puente que entrega direcciones reales a los invitados y virtualización anidada activada y verificada, lo que significa que un invitado en esta máquina puede ejecutar sus propios invitados.
El anidamiento es la razón para hacer esto en metal en lugar de en una instancia virtual. No se puede anidar dentro del hipervisor de otro con resultados predecibles, y en un BM-E no hay ningún hipervisor nuestro en el camino: usted tiene IPMI, un botón de encendido y la placa. Lo que se ejecuta en ella es su decisión.
Antes de empezar
- Un BM-E: treinta y dos núcleos Zen 4, 256 GB de ECC, cuatro unidades NVMe y ocho direcciones IPv4. IPMI es accesible a través de una VPN, que el soporte configura cuando la máquina se entrega.
- Proxmox VE 8 seleccionado en el momento del pedido, o un ISO personalizado subido a través del panel. Ambas rutas terminan en el mismo instalador.
- Media hora cuando nadie necesite la máquina, porque el primer paso la reinicia varias veces.
1. Instalación
Conéctese a la consola a través de la VPN de gestión, monte el ISO y arránquelo. En la pantalla de selección de discos, elija los cuatro dispositivos NVMe, seleccione zfs (RAID10) y abra las opciones avanzadas:
ashiften 12, que es el valor correcto para sectores de cuatro kilobytes y no se puede cambiar después sin reconstruir el pool.compressen lz4. Cuesta una fracción de núcleo y normalmente devuelve un tercio del espacio.hdsizereducido para dejar el resto para almacenamiento de invitados, a menos que quiera que el pool raíz lo posea todo.
Establezca la dirección de gestión y la puerta de enlace desde los detalles del panel, y use el nombre completamente cualificado de la máquina como nombre de host. Dos reinicios más tarde tiene un prompt de inicio de sesión y una interfaz web en el puerto 8006.
2. Repositorios y paquetes
El repositorio empresarial fallará sin una suscripción y saturará cada apt update hasta que lo resuelva:
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. Memoria para ZFS
La ARC crecerá hasta la mitad de su RAM si no lo evita, y en una máquina cuyo trabajo es ejecutar invitados, esa memoria tiene un mejor uso:
echo "options zfs zfs_arc_max=34359738368" > /etc/modprobe.d/zfs.conf
update-initramfs -u -k allTreinta y dos gigabytes de ARC en una máquina de 256 GB deja suficiente para caché sin privar a los invitados. Reinicie para que se aplique, o establézcalo en vivo con echo en /sys/module/zfs/parameters/zfs_arc_max si no puede.
4. Redes
Ocho direcciones no es mucho, así que los invitados se sientan en un puente privado y solo los que necesitan una dirección pública reciben una enrutada hacia ellos. Edite /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 no necesita traducción de direcciones, porque el /64 enrutado a la máquina está genuinamente enrutado: asigne direcciones de él a los invitados en el puente y alcanzarán Internet directamente. Esa asimetría entre las dos familias no es elegante, pero es la forma honesta del espacio de direcciones en el que vivimos.
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. Virtualización anidada
cat /sys/module/kvm_amd/parameters/nestedEn los kernels actuales esto ya imprime 1. Si imprime 0:
echo "options kvm-amd nested=1" > /etc/modprobe.d/kvm-amd.conf
update-initramfs -u && rebootEl anidamiento también requiere que el invitado vea una CPU que admita tener la característica, lo que significa que el tipo de procesador debe ser host. Cualquier otra cosa presenta un modelo de CPU sintético con las extensiones de virtualización enmascaradas, y el hipervisor interno se niega a arrancar con un error que no menciona nada de esto.
6. Un invitado
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 con ssd=1 significa que las eliminaciones dentro del invitado se devuelven al pool en lugar de acumularse como espacio que ha perdido de vista.
7. Firewall
La interfaz web en el puerto 8006 no tiene razón de ser accesible públicamente. Restrínjala a nivel de centro de datos a la dirección desde la que administra: el endpoint del túnel de la guía de WireGuard es el candidato obvio:
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-firewallVerifíquelo
Primero el host:
pveversion -v | head -3
zpool status rpool
zpool list -o name,size,alloc,free,frag,cap
arc_summary | head -12El pool reporta ONLINE con dos pares en espejo, y el objetivo de ARC se sitúa en los treinta y dos gigabytes que configuró en lugar de en la mitad de la máquina.
Ahora el punto real de esta construcción. Inicie sesión en el invitado y compruebe el procesador que se le asignó:
ssh [email protected]
lscpu | grep -E "Model name|Virtuali"
grep -c svm /proc/cpuinfoEl nombre del modelo debe ser la parte EPYC real, y la línea de virtualización debe reportar AMD-V. Un cero del tercer comando significa que el tipo de procesador no es host, y todo lo siguiente fallará.
Luego ejecute una máquina dentro de la máquina:
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 imprimiendo que la aceleración se puede usar, seguido de un arranque de Alpine que alcanza un prompt de inicio de sesión en un par de segundos en lugar de arrastrarse, es la verificación. Sin anidamiento, ese mismo comando o se niega rotundamente o emula en software a aproximadamente una vigésima parte de la velocidad, lo cual es inconfundible.
Finalmente, confirme que la interfaz está cerrada desde fuera:
curl -m5 -k https://<public address>:8006/ ; echo "exit $?"Una pérdida de conexión es la respuesta correcta.
Después
Las instantáneas en ZFS son gratuitas hasta que divergen, por lo que un programa nocturno de zfs-auto-snapshot cuesta casi nada y ha salvado más máquinas que cualquier política de respaldo. Las reconstrucciones en metal son el mismo día, pero una reconstrucción le devuelve una máquina vacía, que es algo diferente a devolverle su máquina.