VMware Fusion + Apple Silicon Ubuntu VM, 화면이 안 나올 때

VM은 살아있는데, 화면만 죽었다
Apple Silicon Mac에서 VMware Fusion으로 Ubuntu VM을 돌리다가 이상한 상황을 만났다. VM을 시작하면 VMware Fusion 창에 화면이 멈춰있다. 마우스를 움직여도, 키보드를 눌러도 반응이 없다. 그런데 SSH로 접속하면 게스트 OS는 멀쩡하게 돌아가고 있다.
심한 경우에는 VMX 프로세스가 크래시되면서 VM 자체가 죽어버렸다. VMware 로그에는 VUsbVideo: Failed to handle control request 오류가 줄줄이 찍혀 있었다.
환경은 이랬다.
- Host: macOS (Apple Silicon / ARM64)
- VMware Fusion: 25.0.0
- Guest: Ubuntu 22.04.5 LTS (arm64)
- Kernel: 5.15.0-170-generic
원인: efifb와 vmwgfx의 영역 다툼
dmesg를 확인해보니 원인이 보였다.
[ 0.018925] pci 0000:00:0f.0: BAR 2: assigned to efifb
[ 0.360618] vmwgfx 0000:00:0f.0: BAR 2: can't reserve [mem 0x70000000-0x77ffffff 64bit pref]
[ 0.360627] vmwgfx: probe of 0000:00:0f.0 failed with error -16
error -16은 EBUSY. 해당 메모리 영역을 이미 다른 드라이버가 점유하고 있다는 뜻이다.
VMware Fusion의 가상 디스플레이는 SVGA 가상 GPU 장치(vmwgfx 드라이버)를 통해 동작한다. 이 장치는 PCI BAR 2 영역(0x70000000-0x77ffffff)을 VRAM으로 사용한다. 문제는 ARM64 EFI 부팅 과정에서 이 영역이 먼저 선점된다는 것이다.
부팅 순서를 따라가보면 이렇다.
- EFI 펌웨어가 부팅하면서 화면 출력을 위해 framebuffer 메모리 영역을 사용
- Linux 커널이 로드되면서 PCI 장치 열거(enumeration) 시작
- PCI 서브시스템이 SVGA 장치의 BAR 2를 efifb에 할당
- vmwgfx 드라이버 로드 시도 → BAR 2가 이미 efifb에 점유됨 → 로드 실패
- 화면 출력 불가 → 화면 멈춤
x86_64 VM에서는 이런 문제가 없다. VGA 호환 모드가 있어서 레거시 프레임버퍼와 SVGA 드라이버가 서로 다른 메모리 영역을 사용하기 때문이다. ARM64에는 VGA 호환 모드가 없고, EFI 펌웨어가 SVGA 장치의 VRAM 영역을 직접 프레임버퍼로 쓴다. 그래서 충돌이 발생한다.
해결: efifb 초기화 차단
핵심은 efifb가 BAR 2를 선점하지 못하게 막는 것이다. 커널 부팅 파라미터로 efifb 초기화를 차단한다.
GRUB 설정 수정
SSH로 접속한 뒤 아래 명령을 실행한다.
sudo sed -i 's/^GRUB_CMDLINE_LINUX_DEFAULT=.*/GRUB_CMDLINE_LINUX_DEFAULT="initcall_blacklist=efifb_init,sysfb_init"/' /etc/default/grub
sudo update-grub
sudo reboot| 파라미터 | 역할 |
|---------|------|
| initcall_blacklist=efifb_init | efifb 드라이버 초기화를 차단하여 BAR 2 점유를 방지 |
| sysfb_init | 시스템 프레임버퍼 초기화도 함께 차단 (이중 점유 방지) |
VMX 파일 설정 (권장)
VM이 종료된 상태에서 .vmx 파일에 아래 설정을 추가하면 더 안정적이다.
svga.vramSize = "134217728"
svga.autodetect = "TRUE"
mks.enable3d = "FALSE"
| 설정 | 변경 내용 | 이유 |
|------|----------|------|
| svga.vramSize | 256MB → 128MB | VRAM 영역 축소로 메모리 매핑 충돌 가능성 감소 |
| svga.autodetect | 활성화 | SVGA 설정을 자동 감지하도록 변경 |
| mks.enable3d | 비활성화 | ARM64에서 불안정한 3D 가속 비활성화 |
적용 결과
수정 전:
vmwgfx 0000:00:0f.0: BAR 2: can't reserve [mem 0x70000000-0x77ffffff 64bit pref]
vmwgfx: probe of 0000:00:0f.0 failed with error -16
수정 후:
vmwgfx 0000:00:0f.0: [drm] VRAM at 0x0000000070000000 size is 131072 kiB
vmwgfx 0000:00:0f.0: [drm] Running on SVGA version 3.
[drm] Initialized vmwgfx 2.19.0 20210722 for 0000:00:0f.0 on minor 0
vmwgfx가 정상적으로 VRAM을 할당받고, 화면 출력이 복구된다.
참고: Stale Lock 파일
VMX 프로세스가 크래시된 경우 lock 파일이 남아서 VM 재시작이 안 될 수 있다. 이때는 수동으로 삭제한다.
rm -rf "<VM 경로>/<VM 이름>.vmx.lck"
rm -rf "<VM 경로>/Virtual Disk.vmdk.lck"lock 파일이 남아있으면 .vmx 파일의 cleanShutdown 값이 FALSE로 되어있고, VMware Fusion에서 VM이 응답 없는 상태로 표시된다.
나중에 알게 된 더 쉬운 방법: HWE 커널
위 방법으로 문제를 해결하고 한참 뒤에야 알게 된 것인데, Ubuntu 설치 시 HWE(Hardware Enablement) 옵션을 선택하면 이 문제를 처음부터 피할 수 있다.
HWE 커널은 Ubuntu LTS 릴리스에 최신 커널을 백포트하는 프로그램이다. 예를 들어 Ubuntu 22.04의 기본 커널은 5.15이지만, HWE를 선택하면 6.x 계열 커널이 설치된다. 최신 커널에는 ARM64 환경에서의 efifb/vmwgfx 충돌에 대한 개선이 포함되어 있어, GRUB 설정을 수동으로 건드리지 않아도 화면이 정상적으로 출력된다.
Ubuntu Server 설치 시 설치 과정에서 HWE 커널 옵션이 제공되며, 이미 설치된 시스템이라면 아래 명령으로 전환할 수 있다.
sudo apt install linux-generic-hwe-22.04
sudo reboot새 VM을 만들 계획이라면, 애초에 설치 단계에서 HWE를 선택하는 것이 가장 간단한 해결책이다. 기존 VM에서 GRUB 파라미터를 수정하는 방법도 유효하지만, 원인 자체를 커널 레벨에서 해결하는 쪽이 더 깔끔하다.
새 VM 설치 시 체크리스트
- Ubuntu ARM64 설치 시 HWE 커널 옵션 선택 (가장 간단)
- HWE를 선택하지 않았다면, SSH 접속 후 GRUB에
initcall_blacklist=efifb_init,sysfb_init추가 - VMX 파일에
svga.vramSize,svga.autodetect,mks.enable3d설정 추가 dmesg | grep vmwgfx로 드라이버 정상 로드 확인