Hacker News

Wine ported to OpenBSD

Wine을 OpenBSD로 포팅했습니다

OpenBSD에서 64비트 Windows 프로그램을 실행하는 Wine 포트 초안이 공개됐습니다. 수십 종의 프로그램을 시험해 대부분 실행했으며 The Witcher 3 리마스터도 동작합니다. 다만 32비트 프로그램은 WoW64 미지원으로 실행되지 않고, 테스트와 보안 격리는 아직 과제로 남았습니다.

에디터 노트

이번 포트의 성과는 Windows 호환 계층을 OpenBSD에서 돌렸다는 사실뿐 아니라, %gs 명령을 트랩해 별도 스텁으로 실행하는 구체적인 처리까지 공개했다는 데 있습니다. 수십 종의 64비트 프로그램과 게임이 동작했다는 결과도 제시됐지만, WoW64가 없어 32비트 프로그램은 제외되고 내장 테스트도 아직 비활성화 상태입니다. 댓글의 기술 설명은 포팅의 부담이 %gs 처리에 그치지 않고 시그널과 프로세스 간 메모리 접근까지 이어진다는 점을 보완합니다. 업스트림 수용이 불확실해 OpenBSD 쪽 유지보수 부담이 남을 수 있다는 지적도 설득력 있습니다. 따라서 현재 성과는 실제 실행 사례로 확인된 포트 초안이며, 폭넓은 호환성과 장기 유지 가능성은 아직 별개의 문제입니다.

AI 요약

OpenBSD 포트 관리자인 Thomas Frohwein이 Windows 프로그램 호환 계층 Wine의 포트 초안을 공개했습니다. Andrii와 Fabien이 주요 작업을 맡았고 여러 개발자가 시험과 기여에 참여했습니다. 포팅의 큰 걸림돌은 Windows 프로그램이 스레드별 데이터에 쓰는 x86의 %gs 레지스터였습니다. OpenBSD에서는 gsbase를 설정할 수 없어, %gs 접두사를 사용하는 명령을 처리하는 별도 방식을 마련했습니다.

%gs 명령 처리와 호환성

포트는 %gs를 쓰는 명령을 트랩한 뒤 명령을 해석하고 %gs 접두사를 제거한 형태로 실행하는 방식을 사용합니다. 원래 명령 자리에 상대 점프를 넣어 별도 코드 스텁으로 보내며, 명령 길이가 짧아 점프를 넣기 어려운 경우에는 트랩 위치와 스텁 위치를 해시로 연결합니다. 개발자 설명에 따르면 이 방식은 Notepad, Notepad++, Factorio 등 여러 프로그램 실행에 쓰입니다. 명령을 바꿔 실행하는 과정에서 스크래치 레지스터를 사용하고 상태를 복원해야 합니다.

다른 차이는 프로세스와 스레드 간 통신입니다. Wine은 일부 Windows 스레드 API를 Unix 시그널로 구현하지만, OpenBSD에서는 한 프로세스가 다른 프로세스의 스레드에 시그널을 보낼 수 없습니다. 포트는 활성 스레드에서 이를 받아 프로세스 내부의 SIGUSR2로 다시 전달합니다. SIGUSR1 관련 변경은 Electron과 Chromium 기반 프로그램의 스레드 통신을 염두에 뒀습니다.

Steam과 Electron 프로그램에는 다른 제약도 있습니다. Wine의 NtReadVirtualMemory와 NtWriteVirtualMemory 구현은 프로세스 간 메모리 접근이 필요합니다. OpenBSD에서는 wineserver가 Wine 프로세스의 조상이 아니므로 ptrace로 해당 프로세스에 접근할 수 없으며, 기본 커널 설정을 유지하려면 관련 동작을 별도로 처리해야 합니다. 포트 개발자는 Steam의 steamwebhelper와 오버레이 같은 기능이 OpenBSD 보안 모델과 충돌한다고 설명했습니다.

시험 결과와 남은 제약

개발진은 64비트 Windows 프로그램 수십 종을 시험해 대부분 실행했다고 밝혔습니다. 지난달 출시된 The Witcher 3 리마스터도 동작하며, 이를 실행하려면 README 안내에 따라 vkd3d-proton을 추가해야 합니다. Disco Elysium, Hollow Knight, Prey 2017, Death Stranding 등의 실행 영상도 공유됐습니다. 영상 작성자가 Reddit에 올린 사양은 AMD Ryzen 9 9900X, 메모리 16GB, AMD Radeon RX 9070입니다.

현재 가장 큰 기능 제약은 WoW64가 작동하지 않는 점입니다. 따라서 32비트 Windows 프로그램은 실행되지 않습니다. 실행 파일의 비트 수는 OpenBSD의 file(1) 명령으로 확인할 수 있습니다. 예를 들어 출력에 Intel 80386 32-bit라고 표시되면 해당 프로그램은 32비트입니다.

Wine 내장 테스트는 아직 비활성화했습니다. 테스트에 X 서버 접근이 필요하고 일부 테스트가 멈추는 문제가 있습니다. 실제 여러 프로그램을 실행한 시험에서는 같은 멈춤 현상이 관찰되지 않았으며, 테스트를 활성화하는 작업은 계속 진행 중입니다. 작성자는 시험용 프로그램으로 비교적 작은 64비트 응용 프로그램인 Notepad++를 권했습니다. Wine 실행은 위험을 수반하므로 별도의 비관리자 계정에서 시험하는 방안도 제안했습니다. OpenBSD의 unveil(2) 등을 활용한 격리 가능성은 아직 검토 중입니다.

포트 유지와 커뮤니티 반응

Hacker News 댓글에서 한 사용자는 패치를 살펴본 뒤 OpenBSD 전용 API 차이를 처리하는 변경과 %gs 처리 작업이 주요 부분이라고 설명했습니다. Wine이 FreeBSD와 macOS를 지원해 새 Unix 계열 지원 자체는 낯선 일이 아니지만, %gs 처리가 가장 복잡한 부분이라는 의견입니다. 다른 개발자는 ucontext, 스택 매핑, mmap, 트랩 문맥 보정도 필요했다고 덧붙였습니다.

Wine 업스트림과의 관계도 쟁점입니다. 댓글에 인용된 후속 메일에 따르면 Wine 유지관리자는 새 운영체제를 계속 지원해야 하는 부담과 애플리케이션 코드를 바꾸는 방식 때문에 변경 수용에 신중한 태도를 보였습니다. 따라서 당분간 OpenBSD 쪽에서 패치를 유지해야 할 수 있다는 의견이 나왔습니다. 반면 원 포트 작성자는 OpenBSD 전용 변경을 표시해 다른 운영체제에 영향을 주지 않도록 했다고 설명했습니다.

댓글에는 개발 과정에서 AI를 사용했는지를 둘러싼 논쟁도 있었습니다. 포트 작성자는 AI가 제안한 접근법으로 가능성을 시험하고 관련 개념을 익힌 뒤 코드를 다시 작성했다고 밝혔습니다. 한 댓글 작성자는 코드를 이해하고 유지할 책임이 개발자에게 있다는 관점에서 이 방식을 지지했습니다. 다른 댓글에서는 AI 활용 여부보다 코드 품질과 라이선스, 유지보수 가능성이 중요하다는 의견이 이어졌습니다.

원문: OpenBSD ports 메일링 리스트 / 번역·요약: Trawling