[10.28 수정 / 개인참고용] HP Z440 현재까지의 셋업
최근 수정 내용 (Oct 28th, 2025)
netplan 대신 nmcli로 bridge 생성하는 걸로 변경.
원래는 netplan renderer을 NetworkManager로 설정해도 잘 되었는데, 보조 VM서버 셋업 중에 다시 해보니까 에러 발생함.
0. 스펙 및 용도
HP Z440 워크스테이션
- CPU : Intel Xeon E5-2686 v4 (18C/36T)
- RAM : DDR4 ECC 64GB (8 x 8GB)
- GPU1 : NVIDIA RTX 3060Ti (윈도우용, PCIe3 x16)
- GPU2 : AMD RX 460 (macOS용, PCIe3 x8)
- LAN1 : Onboard Intel i218LM 1GbE (윈도우용)
- LAN2 : Realtek RTL8111 1GbE
(브릿지로 Fedora Host와 macOS/FreeBSD Guest 공용 사용 중, PCIe3 x4) - SSD1 : HP zDrive에 SM961 256GB 연결 (PCIe3 x4, BTRFS, Fedora Host)
- SSD2 : MX500 1TB (Primary SATA p1, BTRFS, 윈도우/맥 VM image)
- HDD1 : WD Red Plus 2TB (Primary SATA p2, BTRFS)
- Fedora (Host) : KVM 호스트, Apache를 통한 WebDAV 파일 서버 등등.
- Windows (Guest) : 윈도우. 각종 프로그램/게임 구동.
- macOS (Guest) : 아이메세지, 애플 뮤직 라이브러리 관리, 2단계 인증 등 애플 아이클라우드 서비스 구동.
- FreeBSD (Guest) : 현재 이 블로그가 올라가있는 Ghost CMS 구동.
1. 리눅스 설정하고 WebDAV 파일서버 굴리기
별거 없음.
- Fedora 42 설치하고 apache랑 certbot 설치.
- 고정 ip 설정해놓기.
- ssh 포트 22에서 다른 번호로 바꿔주기.
- /mnt 에 필요한 디스크/디렉토리 자동으로 마운트 시키게 설정하고 apache에서 사용할 수 있게 권한 수정하기.
참고 : 요즘 다들 apache 말고 nginx 쓰라고 하던데, apache보다 nginx로 WebDAV 서버 여는게 훨씬 귀찮음. 아예 소스 수정해서 컴파일해야 함. - firewalld 설정 수정하거나 꺼서 apache랑 certbot 연결 문제 안 생기게 하기.
- SELinux는 끄거나 permissive로 해줘야 apache에서 권한 문제 안 생김.
- 80포트 포트포워딩 후 certbot으로 https 보안 접속용 인증서 받기.
- apache dav 모듈 설정 후 config 수정하기. http 말고 암호화되는 https만 사용하게 해서 보안 설정하기.
2. KVM에 윈도우 설치하기.
- qemu/kvm에 윈도우 대충 설치하기. 설명 안해도 될 정도로 쉬움.
- 미리 윈도우에 nomachine 설치해서 나중에 원격제어 가능하게 만들기.
윈도우를 제어할 수 있는 별도의 모니터/마우스/키보드가 있으면 필요 x.
이후에 virtio 가상 gpu 꺼놓아서 virt-manager에서 spice gui 제어 불가능하게 만들거임.
2-1. GPU / 랜카드 Passthrough 설정.
- /etc/default/grub 수정하기.
GRUB_CMDLINE_LINUX=" ... "
따옴표 사이에 아래 파라미터들 넣어주기 :
intel_iommu=on
=> 인텔 CPU 기준으로, AMD CPU의 경우에는 다른 파라미터를 사용해야 함.
rd.driver.pre=vfio-pci
=> VFIO 드라이버 로딩으로 VM에 PCI 장치를 넘겨줄 수 있게 하는 파라미터.
modprobe.blacklist=nouveau
rd.driver.blacklist=nouveau
=> NVIDIA GPU nouveau 드라이버 비활성화 파라미터.
호스트에서 nouveau 드라이버를 통해 NVIDIA GPU를 사용해야 하는 경우,
위의 두 줄은 넣으면 안 됨.
vfio-pci.ids=XXXX:XXXX,XXXX.XXXX,...
=> vfio를 통해 VM으로 넘겨줄 장치들의 목록.
여기서 XXXX:XXXX는 Passthrough를 할 장치(그래픽카드 등)의 pci id임.
참고 : lspci -nnk로 그래픽카드(+ 랜카드 등 타 pcie 장치)의 pci id 확인 가능.
그래픽카드 하나마다 잡히는 pci 장치가 2개 있음:
하나는 그래픽카드 본체, 하나는 hdmi 오디오용. 1002:62e7 이런 식으로 되어있음.
이후 sudo grub2-mkconfig -o /etc/grub2.cfg를 통해 grub 설정 파일 최신화 해주기.
랜카드도 마찬가지로 pci id를 추가하여 passthrough 해주기.
Nomachine 접속 설정을 한 후, 윈도우 vm 끄고 virtio 가상랜 삭제하기.
참고 : Host에서 bridge로 랜카드 하나로 VM마다 IP를 할당해 줄 수는 있지만,
필자는 윈도우로 네트워크 오버헤드가 큰 작업을 해야해서 별도의 랜카드를 사용함.
Looking glass라는 소프트웨어를 사용하면,
Host 상에서 GPU Passthrough가 되어있는 Guest를 제어할 수 있으나,
Host에는 GPU를 안 물려줄 것이라서 looking glass는 사용하지 않음.
3060Ti에 HDMI 더미 꽂아주고 nomachine으로 네트워크 원격 제어함.
로컬에선 레이턴시나 대역폭 문제 없음.
오버헤드 조금이라도 줄이기 위해 virt-manager에서 virtio 가상 gpu랑 spice 꺼주기.
virsh에서 xml 수정해서 guest가 vm인거 숨기기 (libvirt-stealth 깃허브 레포 참고)
참고 : 왜 virtio gpu를 사용하지 않는가?
=> virtio gpu는 cpu로 gpu를 에뮬레이션 하는거라 Guest 내에서 그래픽 가속이 가능하긴 해도 엄청 느림. 그리고 에뮬레이션이기 때문에 켜져만 있어도 cpu를 잡아먹기에, 오버헤드를 줄이려고 꺼놈.
2-2. virtio-fs로 디스크 볼륨 두 개 이상 공유하기
추가 예정.
3. 맥os kvm 설정하기
깃허브 osx-kvm 레포 다운받아서 vm에 macos 설치하기.
레포에 있는거 보고 따라해서 virt-manager에 macOS VM 추가해주기.
macOS도 Nomachine 설치해서 포트 지정하고 원격접속 가능하게 만들어놓기.
3-1. 브릿지 네트워킹 설정
랜카드를 꽂을만한 pcie 포트가 더 없어서 랜카드 하나에 브릿지 설정을 해서 호스트+macos vm에 각각 아이피 할당해줘야 함.
호스트 네트워크가 끊길 수 있기 때문에 원격 말고 직접 호스트에서 수정하는 것을 추천함.
아래 코드 복사해서 수정하고, chmod +x 걸어주고, root 권한으로 실행하기.
#!/bin/bash
set -e
# === Configuration ===
BR_NAME="userbr0"
DEV_NAME="실제 인터페이스 장치명 e.g. enp1s0"
HOST_IP="호스트 OS IP"
GATEWAY="게이트웨이 (공유기) IP"
DNS="1.1.1.1,1.0.0.1,8.8.8.8,8.8.4.4" #원하는 DNS Provider로 수정가능.
echo "[1 of 5] Cleaning old connections..."
sudo nmcli connection delete "$BR_NAME" || true
sudo nmcli connection delete "$DEV_NAME" || true
echo "[2 of 5] Creating new bridge $BR_NAME..."
sudo nmcli connection add type bridge ifname "$BR_NAME" con-name "$BR_NAME" \
ipv4.addresses "$HOST_IP" \
ipv4.gateway "$GATEWAY" \
ipv4.dns "$DNS" \
ipv4.method manual \
ipv6.method ignore
sudo nmcli connection modify "$BR_NAME" bridge.stp yes bridge.forward-delay 4
echo "[3 of 5] Adding $DEV_NAME as slave..."
sudo nmcli connection add type bridge-slave ifname "$DEV_NAME" master "$BR_NAME"
echo "[4 of 5] Enabling IP forwarding..."
sudo sysctl -w net.ipv4.ip_forward=1
sudo bash -c 'echo "net.ipv4.ip_forward = 1" > /etc/sysctl.d/99-ipforward.conf'
echo "[5 of 5] Configuring firewall for VM bridge..."
sudo firewall-cmd --permanent --add-forward
sudo firewall-cmd --permanent --zone=public --add-interface="$BR_NAME"
sudo firewall-cmd --permanent --zone=public --add-masquerade
sudo firewall-cmd --reload
echo "[Finalization] Bringing bridge up..."
sudo nmcli connection up "$BR_NAME"
echo
echo "Bridge setup complete!"
echo "-----------------------------------"
echo " Bridge : $BR_NAME"
echo " Interface : $DEV_NAME"
echo " IP : $HOST_IP"
echo " Gateway : $GATEWAY"
echo " DNS : $DNS"
echo "-----------------------------------"
echo "You can now attach your VMs to '$BR_NAME'."
virt-manager에서 macos vm의 인터페이스 설정:
Network source : Bridge device
Device name : userbr0
Device model : virtio
여기서 MAC address 복사해놓기.
이후 macos 내에서 진행:
설정에서 고정ip 원하는걸로 새로 넣고 dns주소도 수동으로 입력.
이러면 인터넷 연결 되고 ip주소도 따로 부여됨.
MountEFI 다운받아서 opencore efi 파티션 마운트. disk0s1 마운트하면 될거임.
/EFI/EFI/OC/config.plist 수정. plist 파일은 xcode나 propertree로 수정가능한데 그냥 텍스트 에디터로 해도 무방.
https://dortania.github.io/OpenCore-Post-Install/universal/iservices.html#using-gensmbios
대충 위에 있는 링크 따라하면 됨.
이러면 아이메세지, 애플뮤직 등등등 거의 다 사용 가능.
3-2 vbios reflash 및 gpu passthrough 설정 (XFX RX460 2GB LP 기준)
최신 버전 macos 기준 공식적으로 지원하는 엔비디아 gpu가 없어서
파스칼 이전 엔비디아 gpu+opencore legacy patcher을 사용하거나 amd gpu를 사용해야 함.
윈도우 vm과 마찬가지로 virtio-gpu를 사용 안하는 이유는 virtio-gpu 자체가 에뮬레이션이라서 느린데,
윈도우는 virtio-gpu에 드라이버를 깔아서 어찌저찌 굴러가더라도
macos는
- virtio-gpu에 대한 드라이버가 없어서 gpu 가속이 아예 불가능함.
- macos gui 자체가 gpu 가속을 매우 사용하기 때문에,
gpu 가속이 없으면 cpu 사용률이 굉장히 높아져서 정상적인 사용이 완전히 불가함.
rx400번대 이후 rx6000번대까지 왠만한 amd gpu는 다 지원하나,
xfx에서 나온 애들은 macOS에서 vbios 인식 문제로 부팅 불가 이슈가 있음.
하지만, gpu 자체의 vbios를 다른 vendor의 vbios로 re-flash하면 문제없음.
일단 윈도우 vm 혹은 물리적으로 다른 윈도우 pc에 gpu 꽂아서 부팅.
- 참고로 윈도우 vm에 gpu 두개 (기존에 꽂아서 passthrough 시켜놓은거 + 방금 막 꽂은 amd gpu)를 연결시켜 놓으면 부팅 과정에서 무한 루프가 발생할 수 있으므로, 기존에 passthrough된 gpu를 virt-manager vm 구성 설정에서 잠시 연결 해제해놓고 vitrio gpu를 사용해 virt-manager에서 제어하기.
techpowerup에서 ati-atiflash 2.93버전 (다른 버전 사용하면 flashing 불가능) 다운받고,
vga vbios collection에서 동일 gpu / 램 사이즈 가진 msi나 사파이어 vbios 선택 후
bios internals 항목에 나와있는 메모리 제조사 / 램타이밍 내꺼랑 동일한걸로 다운받기.
- 참고로 amd gpu는 코어 부활이라고, rx 460에 560 펌웨어를 올려서 성능을 높이는 경우가 있는데, 필자도 rx 460에 560 vbios를 올려서 사용 중임.
이후 gpu-z에서 원래 vbios를 혹시 모르니 백업해두고 atiflash에서 다운받은 vbios를 gpu에 flash해주면 끝.
다시 virt-manager에서 macos vm에 reflash한 amd gpu 연결하고 virtio gpu랑 spice 꺼주기.
더미 hdmi 플러그 꽂아준 다음에 macos vm 부팅.
부팅 후 nomachine이 로드될까지 좀 기다려주기. 대충 cpu 사용률 안정화되면 부팅 끝난거임.
nomachine으로 IP주소랑 포트 맞춰서 연결해주면 macos 화면 잘 나올거임.
-안먹힘- 3-2-1 Vendor Reset 설정
macos vm을 종료했다가 다시 macos vm을 켜면 호스트 freeze 현상 발생함.
gui만 뻗는게 아니라 시스템 자체가 뻗어서 ssh로도 접근이 불가능해짐.
vm이 종료되고 amd gpu가 host os에 reset 신호를 제대로 못 보내서 그렇다는거 같음.
이를 해결하기 위해 vendor-reset 모듈울 사용하면 되나, https://github.com/sakarie9/vendor-reset 포크 사용해야 함. (커널 6.12 이상에서 원본 레포 소스로는 빌드가 불가)
dkms로 설치해주고 /etc/modules-load.d 에 추가해주고 reboot.
근데 vendor-reset이 현재 사용 중인 gpu 모델에는 사용이 불가능한지, 직접 gpu power state를 reset 해줘야함.
3-2-2 Qemu hook을 이용한 gpu power state reset
여기 #7 참고 : https://forum.proxmox.com/threads/gpu-pass-through-with-radeon-vii.125733/
/usr/local/bin에 스크립트 3개 놓기.
PCI ID는 lspci에 뜨는 amd gpu꺼 두 개만 넣어주기. (pci id있는 4개 라인을 두개만 남겨놓고 두 줄의 id를 변경)
/etc/libvirt/hooks/qemu 파일 생성.
생성한 파일에 sudo chmod 744 sudo chmod +x로 권한 설정해주기.
파일 내용:
#!/bin/bash
VMNAME="macOS VM 이름"
if [[ $1 == $VMNAME ]] && [[ $2 == "stopped" ]]; then
/usr/local/bin/gpu-reset
fi
저장 후 호스트 재부팅.
터미널에서 sudo gpu-ps 실행했을 때 나오는 결과 중, amd gpu가 d3hot 상태로 나타나면 state reset 완료된거임.
이제 macOS VM이 꺼지면 자동으로 gpu power state가 reset될거임.
대신, 호스트 자체가 약 10초간 절전 상태로 들어가서 원격 접속이 끊길 수 있음.
그래도 호스트가 절전 후 자동 복구되어도 Windows VM은 호스트 절전 이전 상태 그대로 유지됨.
수동으로 sudo gpu-reset 실행해도 power state reset 가능.
위 스크립트 사용 이후 macOS VM 재부팅 시 문제 전혀 없었음.
4. FreeBSD에 Ghost 설치하기
추가 예정.
5. 추가적으로 해결해야 할 사항들
- macos sequoia에서 vm임을 인식해서 아이클라우드 로그인 자체가 불가능.
vmhide.kext 써봤는데도 해결 불가.
ㄴlibvirt-stealth 적용하니까 로그인 및 iMessages, Apple Music, 2FA는 사용 가능하나, Notes 앱 동기화가 안되고 설정에 계속 계정 정보를 업데이트 하라는 알림이 나옴.