처리중입니다. 잠시만 기다려주세요.
TTJ 코딩클래스
정규반 단과 자료실 테크 뉴스 코딩 퀴즈
테크 뉴스
Hacker News 2026.07.26 28

Proxmox VM에 블루투스를, 패스스루 대신 네트워크 공유로 해결하는 법

Hacker News 원문 보기

홈 서버나 게이밍용으로 Proxmox를 쓰다 보면 한 번쯤 부딪히는 벽이 있다. VM 안에서 블루투스 컨트롤러나 헤드셋을 붙이려 하는데, 아무리 설정을 만져도 어댑터가 잡히지 않는 경우다. lucid-fabrics가 공개한 proxmox-bluetooth는 바로 이 지점을 겨냥한 도구로, 호스트의 블루투스 어댑터를 로컬 네트워크를 통해 게스트 VM에 흘려보내는 방식을 택했다. USB 패스스루가 통하지 않는 환경을 위한 우회로인 셈이다.

왜 패스스루가 안 되는가

핵심 원인은 인텔의 온보드 블루투스 칩(BE200, AX210, AX211 등 CNVi 계열)의 설계에 있다. 이 칩들은 호스트의 btusb/btintel 드라이버가 부팅 시점에 펌웨어를 올려줘야만 동작한다. 그런데 USB 리다이렉트든 vfio든 드라이버 언바인드든, 칩을 VM으로 넘기는 순간 하드웨어가 ROM 부트로더 상태로 리셋되어 스스로를 비워버린다. 게스트는 펌웨어 핸드셰이크를 끝낼 방법이 없다. 이건 설정으로 고칠 수 있는 문제가 아니라 칩이 물리적으로 그렇게 만들어진 것이다. 저자의 표현대로 하드웨어가 고장 난 게 아니다.

반대로 평범한 USB 동글을 데비안이나 우분투 같은 표준 배포판에 그냥 패스스루하면 대개는 잘 된다. 그런 경우라면 이 도구는 필요 없다. 문제는 인텔 내장 칩, ChimeraOS·Bazzite 같은 게이밍 배포판의 독특한 커널과 펌웨어, 군살을 뺀 클라우드 커널, 그리고 몇 번 VM을 재시작하면 먹통이 되는 동글 같은 상황이다.

네트워크로 어댑터를 스트리밍한다

동작 원리는 의외로 단순하다. 칩은 계속 Proxmox 호스트에 남아 정상적으로 동작하고, 작은 브리지가 그 신호를 VM으로 흘려보낸다. VM 입장에서는 완전히 평범한 블루투스 어댑터가 하나 보일 뿐이다. 브리지의 실체는 BlueZ 소스 트리에 들어 있는 btproxy로, 배포판 패키지로는 제공되지 않는 물건이다. 호스트에서는 어댑터를 HCI user-channel 모드로 열어 원시 HCI 트래픽을 TCP로 내보내고, 게스트에서는 hci_vhci로 가상 컨트롤러를 만들어 그 스트림을 밀어 넣는다. 게스트의 BlueZ는 이 사정을 알 필요조차 없다.

프로토콜을 해석하지 않고 원시 블루투스 트래픽을 그대로 전달하기 때문에, 표준 리눅스 어댑터에서 되는 것은 원칙적으로 모두 된다. 컨트롤러, 오디오, HID, 그리고 Home Assistant용 BLE 센서까지 포함된다. 지연 시간은 같은 머신 안에서 1밀리초를 밑돌아, 블루투스 자체의 무선 지연보다 작다. 설치와 클라이언트 실행은 각각 명령 몇 줄이면 끝나고, 양쪽 모두 systemd 유닛(호스트의 btproxy-server.service, 게스트의 btproxy-client.service)으로 부팅 시 자동 시작·재연결된다. ChimeraOS나 Bazzite처럼 업데이트 때 시스템 이미지를 통째로 교체하는 배포판도 /etc와 /var는 보존하므로 설정과 페어링이 그대로 살아남는다.

실무에서 알아둘 한계

제약도 분명하다. 한 번에 하나의 VM만 칩을 소유할 수 있다. 여러 기기를 동시에 연결하는 것은 문제없지만, 두 개의 VM이 어댑터를 동시에 나눠 쓰는 것은 지원되지 않는다. 다른 VM으로 옮기려면 기존 VM의 클라이언트를 먼저 내려야 하고, 페어링 정보는 게스트 안에 저장되므로 새 VM에서 기기를 한 번 다시 페어링해야 한다. 보안 측면도 짚어둘 만하다. 브리지는 호스트 IP의 9700 포트에서 인증 없이 대기하며, 먼저 접속하는 쪽이 칩을 가져간다. 가정용 LAN 환경이라면 대체로 무방하지만, 신경이 쓰인다면 해당 포트를 VM의 IP만 접근하도록 방화벽으로 막으라고 권한다.

적용 범위도 명확히 해둘 필요가 있다. 이 도구는 리눅스 게스트 전용이다. 리눅스의 블루투스 스택에 의존하기 때문이다. 윈도우 VM은 대개 USB 동글을 그대로 패스스루하면 문제가 없어 애초에 이 도구가 필요 없다. LXC 컨테이너 역시 호스트 커널을 공유하므로 장치를 직접 바인딩하면 되고, 이 브리지는 자체 커널을 돌리는 진짜 VM을 위한 것이다. Proxmox에 한정된 것도 아니어서 KVM VM을 돌리는 리눅스 호스트라면 어디서든 쓸 수 있다.

게이밍 배포판 특유의 함정도 문서에 정리돼 있다. 유휴 상태에서 자동 서스펜드에 들어가면 GPU 패스스루가 걸린 VM은 깨어나지 못하는데, 게스트 안에서 sleep·suspend·hibernate 타깃을 마스킹해 아예 잠들지 않게 하라는 것이다. 특히 인용할 만한 대목은 인텔 칩이 빈 부팅 상태에 끼었을 때다. 재부팅이나 전면 전원 버튼으로는 풀리지 않고, 파워서플라이 스위치를 15초간 완전히 꺼야 한다. 저자가 하루를 통째로 날린 뒤에야 찾아냈다는 이 물리적 처방은, 소프트웨어로 해결되지 않는 하드웨어 문제의 성격을 그대로 보여준다.

이 뉴스가 유용했나요?

TTJ 코딩클래스 정규반

월급 외 수입,
코딩으로 만들 수 있습니다

17가지 수익 모델을 직접 실습하고, 1,300만원 상당의 자동화 도구와 소스코드를 받아가세요.

144+실전 강의
17개수익 모델
4.9수강생 평점
정규반 자세히 보기

"비전공 직장인인데 반년 만에 수익 파이프라인을 여러 개 만들었습니다"

실제 수강생 후기
  • 비전공자도 6개월이면 첫 수익
  • 20년 경력 개발자 직강
  • 자동화 프로그램 + 소스코드 제공

매일 AI·개발 뉴스를 받아보세요

주요 테크 뉴스를 매일 아침 이메일로 전해드립니다.

스팸 없이, 언제든 구독 취소 가능합니다.