# VM 원격 제어 가이드 (PVE + QEMU) > Claude Code 환경에서 Proxmox 위의 Windows/Linux VM을 화면 캡처 + 명령 실행 + GUI 조작까지 원격으로 다루는 방법. > > 작성일: 2026-05-18 / 검증 환경: Windows 10 Pro VM on Proxmox VE 8.1, virtio-scsi-single + iothread + discard ## 표기 규약 - `` ``: Proxmox 노드 IP - `` ``: 각 노드 root 비밀번호 (또는 SSH key 사용 권장) - `` `` ``: SMB/CIFS 파일 서버 접속 정보 - ``: Windows 게스트 로그인 사용자 - VMID 예시는 `101`, zvol 예시는 `vm-101-disk-N` — 본인 환경 값으로 치환 --- ## 1. 인프라 개요 ### Proxmox 호스트 | 호스트 | IP | SSH | 비고 | |---|---|---|---| | pve5 | `` | `root` / `` | 메인 VM 호스트 (운영) | | pve7 | `` | `root` / `` | 보조 / 백업 호스트 | ### SMB 파일 서버 - 주소: `` - 인증: `` / `` - 주요 공유: `vhd` (VHD 디스크 이미지 보관) ### 접속 패턴 ```bash # pve5 SSH (모든 VM 작업은 여기서) sshpass -p "$PVE_PASSWORD" ssh -o StrictHostKeyChecking=no root@ '<명령>' # SMB 마운트 (pve5 또는 작업 VM에서) mkdir -p /mnt/vhd-src mount -t cifs ///vhd /mnt/vhd-src \ -o username=,password=$SMB_PASSWORD,ro,vers=3.0,iocharset=utf8,file_mode=0444,dir_mode=0555 ``` --- ## 2. VM 화면 캡처 (보기) PVE 8.x에는 `qm screendump` 명령이 **없음**. QEMU monitor에 직접 명령 보내야 함. ### 한 줄 캡처 (pve5에서) ```bash echo "screendump /tmp/vm101.ppm" | qm monitor 101 ``` 결과는 PPM(Netpbm raw bitmap) 형식. 일반 뷰어가 못 읽으므로 PNG로 변환 필요. ### Claude 환경에서 보기까지 풀 흐름 ```bash # 1) pve5에서 screendump sshpass -p "$PVE_PASSWORD" ssh root@ \ 'echo "screendump /tmp/vm101.ppm" | qm monitor 101' # 2) PPM 가져오기 sshpass -p "$PVE_PASSWORD" scp root@:/tmp/vm101.ppm /tmp/vm101.ppm # 3) PNG 변환 (ffmpeg는 작업 VM에 설치돼있음, pve5에는 없음) ffmpeg -y -i /tmp/vm101.ppm /tmp/vm101.png # 4) Read 툴로 열기 → 멀티모달 모델이 이미지 인식 ``` ### PVE API 방식 (대안) ```bash pvesh get /nodes/pve5/qemu/101/screenshot > /tmp/vm101.png ``` *이 엔드포인트는 PNG 직접 반환. 단 PVE 권한 토큰 설정에 따라 동작 여부 다름.* --- ## 3. QGA (QEMU Guest Agent)로 명령 실행 ### 전제 조건 - VM config에 `agent: 1` - 게스트 OS에 qemu-ga 서비스 설치/실행 중 - 확인: `qm agent ping` (응답 없으면 = OK) ### 핵심 명령 ```bash # 상태 확인 qm agent 101 ping qm agent 101 get-osinfo qm agent 101 get-host-name qm agent 101 get-users # 명령 실행 (동기 / 결과 회수) qm guest exec 101 --timeout 30 -- cmd.exe /c whoami qm guest exec 101 --timeout 30 -- powershell.exe -NoProfile -Command "