이것이 만드는 것
베어 메탈 머신에 Proxmox VE를 자체 하이퍼바이저로 실행하고, NVMe 드라이브에 걸친 ZFS 미러, 게스트에 실제 주소를 제공하는 브리지, 그리고 중첩 가상화를 켜고 검증한 것 — 즉, 이 머신의 게스트가 다시 게스트를 실행할 수 있음을 의미합니다.
중첩은 가상 인스턴스가 아닌 메탈에서 이 작업을 수행하는 이유입니다. 다른 사람의 하이퍼바이저 안에서 예측 가능한 결과로 중첩할 수 없으며, BM-E에는 우리의 하이퍼바이저가 방해하지 않습니다: IPMI, 전원 버튼, 보드가 있습니다. 그 위에서 무엇을 실행할지는 당신의 결정입니다.
시작하기 전에
- BM-E: 32개의 Zen 4 코어, 256GB ECC 메모리, 4개의 NVMe 드라이브, 8개의 IPv4 주소. IPMI는 VPN을 통해 접근할 수 있으며, 지원팀이 머신을 인도할 때 설정합니다.
- 주문 시 Proxmox VE 8 선택, 또는 패널을 통해 사용자 정의 ISO 업로드. 두 경로 모두 동일한 설치 프로그램으로 끝납니다.
- 아무도 머신을 필요로 하지 않는 30분, 1단계에서 여러 번 재부팅하기 때문입니다.
1. 설치
관리 VPN을 통해 콘솔에 연결하고 ISO를 마운트한 후 부팅합니다. 디스크 선택 화면에서 4개의 NVMe 장치를 모두 선택하고 zfs (RAID10)을 선택한 다음 고급 옵션을 엽니다:
ashift은 12로, 4KB 섹터에 올바른 값이며 나중에 풀을 다시 만들지 않고는 변경할 수 없습니다.compress은 lz4로. 코어의 일부만 소모하며 일반적으로 공간의 3분의 1을 절약합니다.hdsize는 게스트 스토리지를 위해 줄이십시오. 루트 풀이 전체를 소유하려는 경우가 아니라면.
패널 세부 정보에서 관리 주소와 게이트웨이를 설정하고, 머신의 완전한 이름을 호스트 이름으로 사용하십시오. 재부팅 두 번 후 로그인 프롬프트와 8006 포트의 웹 인터페이스가 나타납니다.
2. 리포지토리 및 패키지
엔터프라이즈 리포지토리는 구독 없이는 실패하고 처리할 때까지 모든 apt update을 어지럽힙니다:
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. ZFS 메모리
그렇지 않으면 ARC가 RAM의 절반까지 자라며, 게스트 실행이 전부인 머신에서 그 메모리는 더 나은 용도가 있습니다:
echo "options zfs zfs_arc_max=34359738368" > /etc/modprobe.d/zfs.conf
update-initramfs -u -k all256GB 머신에서 32GB의 ARC는 게스트를 굶기지 않고 캐싱에 충분한 공간을 남깁니다. 적용하려면 재부팅하거나, 할 수 없다면 echo을 /sys/module/zfs/parameters/zfs_arc_max에 실행하여 즉시 설정하십시오.
4. 네트워킹
8개의 주소는 많지 않으므로 게스트는 사설 브리지에 있고 공개 주소가 필요한 게스트만 라우팅되어 받습니다. /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는 주소 변환이 필요 없습니다. 머신으로 라우팅된 /64가 진정으로 라우팅되기 때문입니다: 브리지의 게스트에 그 범위에서 주소를 할당하면 인터넷에 직접 도달합니다. 두 주소 체계 사이의 비대칭은 우아하지 않지만, 우리가 사는 주소 공간의 정직한 모습입니다.
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. 중첩 가상화
cat /sys/module/kvm_amd/parameters/nested현재 커널에서는 이미 1을 출력합니다. 0을 출력하면:
echo "options kvm-amd nested=1" > /etc/modprobe.d/kvm-amd.conf
update-initramfs -u && reboot중첩은 또한 게스트가 해당 기능을 인정하는 CPU를 보아야 하며, 즉 프로세서 유형이 host이어야 합니다. 다른 것은 가상화 확장이 마스킹된 합성 CPU 모델을 제시하며, 내부 하이퍼바이저는 이에 대해 언급하지 않는 오류로 시작을 거부합니다.
6. 게스트
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 및 ssd=1는 게스트 내부의 삭제가 추적을 잃은 공간으로 축적되는 대신 풀로 반환됨을 의미합니다.
7. 방화벽
8006 포트의 웹 인터페이스가 공개적으로 접근 가능할 이유가 없습니다. 데이터센터 수준에서 관리하는 주소로 제한하십시오 — WireGuard 가이드의 터널 엔드포인트가 분명한 후보입니다:
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검증
호스트 먼저:
pveversion -v | head -3
zpool status rpool
zpool list -o name,size,alloc,free,frag,cap
arc_summary | head -12풀은 두 개의 미러 쌍으로 ONLINE을 보고하고, ARC 대상은 머신의 절반이 아닌 설정한 32GB에 있습니다.
이제 이 빌드의 실제 요점입니다. 게스트에 로그인하여 제공된 프로세서를 확인하십시오:
ssh [email protected]
lscpu | grep -E "Model name|Virtuali"
grep -c svm /proc/cpuinfo모델 이름은 실제 EPYC 부품이어야 하며, 가상화 라인은 AMD-V를 보고해야 합니다. 세 번째 명령의 0은 프로세서 유형이 host이 아님을 의미하며, 아래의 모든 것이 실패합니다.
그런 다음 머신 안에서 머신을 실행하십시오:
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이 가속을 사용할 수 있다고 출력하고, 뒤이어 Alpine 부팅이 몇 초 만에 로그인 프롬프트에 도달하는 것을 확인하는 것이 검증입니다. 중첩 없이 같은 명령은 완전히 거부하거나 소프트웨어로 에뮬레이션하여 약 20분의 1 속도로 실행되며, 이는 명백합니다.
마지막으로 인터페이스가 외부에서 닫혀 있는지 확인하십시오:
curl -m5 -k https://<public address>:8006/ ; echo "exit $?"연결 시간 초과가 올바른 답입니다.
이후
ZFS의 스냅샷은 분기되기 전까지 무료이므로, 밤마다 zfs-auto-snapshot 스케줄은 거의 비용이 들지 않으며 어떤 백업 정책보다 더 많은 머신을 구했습니다. 메탈에서의 재구축은 당일 가능하지만, 재구축은 빈 머신을 반환하며, 이는 머신을 반환하는 것과 다른 것입니다.