
서랍에 잠든 아이패드를 노트북 옆에 세워 두고 채팅 창이나 문서를 띄워 두고 싶을 때가 있습니다. 맥이면 사이드카 한 번이면 끝나지만, 리눅스 노트북(Pop!_OS 24.04, COSMIC 데스크톱, Wayland)에서는 이야기가 달랐습니다. Claude Code 와 함께 하나씩 막힌 곳을 뚫어 가며 아이패드를 터치까지 되는 보조화면으로 만든 과정을 정리합니다. 같은 환경을 쓰는 분이라면 그대로 따라 하실 수 있습니다.
1. 먼저, 안 되는 방법부터
| 방법 | 리눅스에서 | 이유 |
|---|---|---|
| 사이드카 | 불가 | 맥 전용 |
| Spacedesk, Duet | 불가 | 리눅스 서버 프로그램이 없음 |
| USB-C 케이블 직결 | 불가 | 아이패드는 영상 입력이 안 됨. 꽂아도 USB 기기로만 잡힘 |
| AirPlay 미러링 | 방향 반대 | 아이패드 화면을 내보내는 기능. 받는 쪽이 될 수 없음 |
| UVC 캡처카드(iPadOS 17+) | 가능 | HDMI 캡처카드가 있어야 함. 보기 전용 |
캡처카드가 없어서 Wi-Fi 방식으로 가기로 했습니다. 후보는 두 가지였습니다.
- Deskreen CE — 설치 후 QR 한 번 찍으면 바로 됩니다. 크롬 계열 캡처라 COSMIC 과 잘 맞습니다. 다만 보기 전용입니다.
- Weylus — 아이패드 Safari 에서 화면을 보면서 터치·펜으로 노트북을 조작할 수 있습니다. 그런데 COSMIC 에서는 연결하자마자
failed to init screen cast!가 떴습니다.
2. Weylus 가 COSMIC 에서 안 되던 진짜 원인
로그와 PipeWire 협상 기록을 보니 원인은 화면 픽셀 형식이 서로 안 맞는 것이었습니다.
- COSMIC 의 화면 공유(스크린캐스트)는
RGBA,BGRA형식만 내줍니다. - Weylus 는 소스(
src/capturable/pipewire.rs)에서 받는 형식을BGRx,RGBx두 가지로 고정해 두었습니다. - 그래서 PipeWire 가
no more output formats로 연결을 끊습니다.
RGBA 와 RGBx 는 네 번째 바이트(투명도)를 쓰느냐 마느냐의 차이일 뿐 메모리 배치가 같습니다. 즉 Weylus 가 RGBA 를 받아서 네 번째 바이트를 무시하기만 하면 됩니다.
3. 해결 — 빌드 없이 바이너리 문자열만 바꾸기
정석은 소스를 고쳐 다시 빌드하는 것이지만, Weylus 빌드에는 ffmpeg·GStreamer 개발 패키지가 줄줄이 필요합니다. 대신 flatpak 으로 설치된 실행 파일을 복사해서, 그 안의 BGRx/RGBx 문자열을 같은 길이의 BGRA/RGBA 로 바꿨습니다. 정확히 5곳(요청 형식 2곳, 받은 형식을 비교하는 코드 2곳, 로그 문구 1곳)이고, 길이가 같아서 실행 파일 구조는 그대로입니다.
APP=io.github.electronstudio.WeylusCommunityEdition
SRC=$(flatpak info --user --show-location $APP)/files/bin/weylus
mkdir -p ~/Applications/weylus-cosmic
python3 - "$SRC" <<'EOF'
import sys, os
b = bytearray(open(sys.argv[1], 'rb').read())
n = 0
for old, new in ((b'BGRx', b'BGRA'), (b'RGBx', b'RGBA')):
i = b.find(old)
while i != -1:
b[i:i+4] = new; n += 1; i = b.find(old, i + 4)
assert n == 5, n # 버전이 다르면 멈춤
dst = os.path.expanduser('~/Applications/weylus-cosmic/weylus')
open(dst, 'wb').write(b); os.chmod(dst, 0o755)
EOF
# 원본 flatpak 환경에서 패치본을 실행
flatpak run --filesystem=$HOME/Applications/weylus-cosmic:ro \
--command=$HOME/Applications/weylus-cosmic/weylus $APP \
--auto-start --wayland-support
아이패드 Safari 에서 http://노트북IP:1701 을 열면, 노트북에 COSMIC 화면 공유 선택 창이 뜹니다. 허용하면 화면이 넘어오고 터치로 조작됩니다. 원본 flatpak 은 건드리지 않으므로 언제든 되돌릴 수 있습니다.
4. 더 가볍게 — GPU 인코딩(VAAPI)
문제는 CPU 였습니다. Weylus 가 화면을 CPU(x264)로 압축해서 CPU 를 123~145% 쓰고 있었습니다. 발열이 심한 노트북이라 버벅임으로 이어집니다. --try-vaapi 옵션을 줘도 CPU 로 돌아갔는데, 원인이 두 겹이었습니다.
- flatpak 에 같이 들어 있는 ffmpeg 8 이 VAAPI 없이 빌드돼 있었습니다. 런타임의 ffmpeg 는 7.x 라 바꿔 끼울 수도 없었습니다.
- ffmpeg 8 은 필터 그래프를 만드는 순간 필터를 초기화하는데, Weylus 는 그 뒤에 GPU 장치를 붙입니다. 그래서
A hardware device reference is required to upload frames to오류로 실패합니다.
해결은 이렇게 했습니다.
- ffmpeg 8.1.1 을 VAAPI 포함으로 직접 빌드했습니다. sudo 없이 사용자 폴더에 설치했고, libva 는 헤더만 받아 시스템 라이브러리에 연결했습니다.
hwupload필터가 초기화 때 장치가 없으면 기다렸다가, 형식 협상 단계에서 받도록 몇 줄 고쳤습니다.- flatpak 실행 시
--env=LD_LIBRARY_PATH=<내 ffmpeg>/lib:/app/lib로 이 라이브러리를 먼저 불러오게 했습니다.
결과는 로그의 Video: 1912x1074@h264_vaapi, 그리고 Weylus CPU 사용량 123~145% → 60% 입니다. 인텔 내장 GPU(UHD 630)가 압축을 맡습니다.
5. 써 보며 알게 된 팁
- 창 말고 모니터를 공유하세요. 창 하나만 공유하면 터치 위치가 어긋납니다. Wayland 에서 터치 입력은 모니터 전체 좌표로 들어가는데, 창의 위치는 알려주지 않기 때문입니다.
- 전체 화면: Safari 공유 버튼에서 "홈 화면에 추가"를 하고 그 아이콘으로 열면 주소창 없이 뜹니다.
- 연결이 끊기면: 아이패드가 잠기거나 Safari 가 백그라운드로 가면 끊깁니다. 쓰는 동안에는 자동 잠금을 "안 함"으로 두세요.
- 검은 화면만 보이면: 노트북에 공유 선택 창이 떠 있는 상태입니다. 노트북에서 모니터를 골라 주세요.
- 방화벽: ufw 를 쓰면
sudo ufw allow from 192.168.0.0/24 to any port 1701 proto tcp로 같은 공유기 안에서만 열어 두세요. 접속 코드(--access-code)도 함께 거는 게 안전합니다. - 소리는 전송되지 않습니다. 노트북 스피커나 이어폰으로 들어야 합니다.
6. 정리
보기만 하면 되는 분은 Deskreen CE 가 가장 쉽습니다. 터치까지 원하고 COSMIC(Wayland) 을 쓴다면 위의 Weylus 형식 패치가 필요하고, 발열이 걱정되면 VAAPI ffmpeg 까지 붙이면 됩니다. 이 과정은 노트북 관리 앱 popmgr 에 "아이패드" 탭으로 넣는 중입니다. 켜기/끄기와 접속 QR 코드를 한 화면에서 다루게 됩니다. 원인을 찾을 때 가장 도움이 된 건 추측보다 로그와 PipeWire 협상 기록이었습니다.