콘텐츠로 이동

트러블슈팅

증상원인해결
데몬 시작 실패소켓 경로 디렉터리 없음sudo mkdir -p /var/run/purecvisor
REST API 503서킷 브레이커 OPENjournalctl -u purecvisorsd -f로 libvirt 상태 확인
VM 생성 실패스토리지 풀 미존재zfs list 확인, daemon.conf [storage] 검증
인증 토큰 만료15분 초과refresh token으로 갱신
Rate Limit 429요청 빈도 초과Retry-After 헤더 참조
WebSocket 끊김300초 유휴클라이언트 ping 구현
VM 삭제 지연ZFS 스냅샷 의존성vm delete-status 확인 후 스냅샷 정리
VM 삭제 후 ISO가 사라짐vm.delete가 CD-ROM ISO <source file>을 파일 디스크로 오인한 회귀ADR-0017 기준으로 device='disk' source만 삭제 대상인지 확인하고 최신 데몬 배포
메모리 누수 의심알 수 없음make memcheck-daemon (Valgrind 5초)
빌드 경고헤더 누락/타입 불일치make clean && make single 후 경고 확인
/health 느림libvirt 장애 (degraded)virsh list 확인, libvirt 재시작
컨테이너 IP 없음lxc-info 지연시작 후 10초 대기 (IP 할당 폴백)
Permissions-Policyambient-light-sensor 경고브라우저가 더 이상 인식하지 않는 feature 토큰nginx/데몬 보안 헤더에서 해당 토큰 제거
CSP가 Iconify API 접속을 차단외부 아이콘 런타임이 JSON API를 fetchIconify 런타임 제거, inline SVG 또는 로컬 아이콘 사용
CSP가 Chart.js sourcemap 접속을 차단CDN JS 끝의 sourceMappingURL을 devtools가 요청Chart.js를 ui/vendor/에 self-host하고 sourcemap 주석 제거
VNC 화면 진입 시 CSP가 noVNC import를 차단noVNC ESM을 jsDelivr에서 동적 importnoVNC를 ui/vendor/novnc/에 self-host하고 로컬 import 사용
https://도메인/ui 접근 시 CSS/JS가 401 application/json MIME 오류로 차단됨trailing slash 없는 /ui에서 상대 자산이 /style.css, /app.bundle.js처럼 루트 경로로 해석됨index.html<base href="/ui/">가 배포됐는지 확인하고 /ui/style.css, /ui/app.bundle.js, /ui/manifest.json MIME을 확인
#ops-triage 직접 링크가 빈 화면을 보임오래된 라우터가 #/ops-triage만 처리함최신 ui/modules/uxlib.js, app.bundle.js, sw.js를 배포하고 /ui#ops-triage/ui#/ops-triage를 모두 확인
로컬 UI 검사는 통과했지만 공개 사이트 번들에 CDN import가 남음개발 호스트와 공개 운영 서버가 다르거나 공개 서버의 정적 파일이 stale 상태공개 URL의 app.bundle.js 해시를 로컬 산출물과 비교하고 운영 서버 /usr/local/share/purecvisor/ui/app.bundle.js, sw.js를 같은 릴리스로 갱신
Pretendard CSS sourcemap JSON이 표시됨jsDelivr가 생성한 외부 CSS sourcemap을 devtools가 요청Pretendard CSS/woff2를 ui/vendor/pretendard/로 self-host
manifest 아이콘 404 또는 invalid imageicon-192.png 미배포 또는 text/html MIME 응답아이콘 파일 배포, nginx/static MIME을 image/png로 고정
WebSocket send on CONNECTING전역 소켓 교체 중 이전 onopen이 새 소켓에 sendlocal WebSocket 인스턴스에만 인증 메시지 전송
/api/v1/metrics 401 반복UI의 raw metrics fetch에 JWT 누락Authorization: Bearer 헤더를 붙이고 non-OK 응답은 조용히 무시
noVNC 새 창의 Reconnect 버튼 무응답about:blank 팝업에 document.write()로 만든 문서를 location.reload()로 재연결하려는 회귀팝업 내부 RFB 객체를 disconnect() 후 새 RFB(container, wsUrl)로 재생성
CD/DVD ISO PATH가 비어 보이거나 빈 Mount가 성공 표시됨설정 UI가 cdrom_path를 input에 반영하지 않고 vm.mount_iso가 빈 경로를 거부하지 않음cdrom_path를 현재 ISO로 표시하고 빈/상대/없는 ISO path는 RPC에서 거부
VM Export OVA 확인창에 <br> 또는 <b> 태그가 그대로 보임오래된 UI 번들 또는 customConfirm() 호출부가 HTML 조각을 메시지로 전달한 회귀최신 UI 번들을 배포하고 공개 URL의 app.bundle.js 해시를 확인한다. 호출부는 plain text와 \n만 넘긴다
대시보드 > 요약 > VM에서 디스크 사용량 버튼이 보이지 않음공개 도메인이 오래된 UI 번들을 서빙하거나 표준/호환 도메인이 서로 다른 서버를 바라봄purecvisor.example.compurecvisor-compat.example.comapp.bundle.js, sw.js 해시를 로컬 산출물과 비교하고 두 운영 서버를 같은 릴리스로 재배포한다
vm.clone accepted 후 clone VM이 생성되지 않음오래된 배포본이 실제 libvirt disk source 대신 daemon.conf [storage].zvol_pool 기본값으로 target zvol을 추정최신 데몬으로 재배포하고 accepted 응답의 source_disk/target_disk가 실제 XML disk source와 일치하는지 확인
vm.clone 후 worker CPU가 높게 유지됨오래된 MAC 치환 루프가 새로 생성한 <mac address='...'>를 다시 매칭해 무한 반복one-pass g_regex_replace_eval() 기반 수정본을 배포하고 orphan zvol/snapshot을 정리한 뒤 재시도
일반 VM vm.clone이 libguestfs 도구 없음으로 거부됨host에 libguestfs-tools가 설치되지 않아 virt-sysprep, virt-customize, virt-filesystems, guestfish를 실행할 수 없음libguestfs-tools 설치 후 재시도하거나, 운영자가 이미 정리한 템플릿이면 template_prepared=true로 호출
vm.clone이 source power on으로 거부됨실행 중인 VM의 디스크와 guest identity를 복제하면 일관성을 보장할 수 없음source VM을 종료한 뒤 재시도. qcow2/raw는 mode=full 사용
Terminal window
# 데몬 상태
sudo systemctl status purecvisorsd
# 실시간 로그
journalctl -u purecvisorsd -f
# 디버그 로그 레벨
# daemon.conf에서 log_level=debug 후 SIGHUP
sudo kill -HUP $(pidof purecvisorsd)
# libvirt 로그
journalctl -u libvirtd -n 50
# 수동 RPC 테스트
echo '{"jsonrpc":"2.0","method":"vm.list","params":{},"id":"1"}' \
| nc -U /var/run/purecvisor/daemon.sock | python3 -m json.tool
# Health 프로브
curl -s http://127.0.0.1:8080/api/v1/health | python3 -m json.tool
# 브릿지/nftables
ip link show type bridge && brctl show
sudo nft list table inet purecvisor
# OVS 상태
sudo ovs-vsctl show
# Valgrind 메모리 검사
make memcheck-daemon
# 정적 분석
make cppcheck
로그경로
데몬 로그journalctl -u purecvisorsd
감사 로그/var/log/purecvisor/audit.log
감사 DB/var/lib/purecvisor/pcv_audit.db
logrotate/etc/logrotate.d/purecvisor (일일 회전, 30일 보존)