가상화 없이 리눅스에서 MS 365 구동하는 Nix 플레이크 공개, 워드 실행까지 성공

Hacker News23일 전조회 4

리눅스 데스크톱에서 마이크로소프트 365를 쓰려면 지금까지 가상머신이나 원격 데스크톱, 혹은 웹 버전이 사실상 유일한 선택지였다. Wine 위에서 클릭투런(Click-to-Run) 방식 오피스가 동작하지 않는다는 것이 오랫동안 정설이었기 때문이다. GitHub에 공개된 office365_flake는 이 전제를 정면으로 건드린다. Nix 플레이크와 스크립트 묶음으로, 가상화 계층 없이 Wine 기반 런타임 위에서 오피스 365 설치와 실행을 시도한다.

핵심은 런타임 선택이다. 일반 Wine 대신 게임용으로 Valve와 GloriousEggroll이 관리하는 GE-Proton 빌드를 umu-launcher로 감싸서 쓴다. 두 번째 러너로는 Bottles 프로젝트의 ProtoSoda Wine 코어를 지정할 수 있다. GE-Proton 11과 ProtoSoda는 모두 Wine 11 계열을 기반으로 하며, 2026년 9월 Bottles 쪽에서 Soda 11 코어로 마이크로소프트 365 설치와 2단계 인증 로그인, 워드 실행까지 성공했다는 발표가 나온 것이 이 선택의 근거다.

배포 방식은 마이크로소프트 구성 요소를 전혀 담지 않는다. 오피스 배포 도구(ODT)와 오피스 본체는 설치 시점에 ms365 스크립트가 내려받는다. 따라서 사용자에게는 유효한 마이크로소프트 365 구독이 있어야 한다. `nix run .#ms365 -- install`로 프리픽스를 만들고 winetricks를 적용한 뒤 ODT를 받아 오피스를 설치하며, 이후 `nix run .#word`나 `nix profile install .#ms365`로 ms365, ms365-word, ms365-excel 같은 실행 파일을 얻는다. 설치 과정에서 수 GB가 ~/.local/share/ms365/odt/Office 아래로 내려받아지고, 클릭투런 설치 프로그램이 프리픽스 안에서 돌아간다. 이 창은 한동안 멈춘 것처럼 보이므로 건드리지 말라고 안내한다.

설정은 대부분 환경 변수로 노출된다. 러너 종류, Proton 호환 데이터 디렉터리, ODT 제품 ID(O365BusinessRetail, O365HomePremRetail, ProPlus2024Retail 등), 특정 빌드 고정(예: 16.0.18129.20158), 제외할 앱(Teams, OneDrive, Lync, Bing, Groove, Outlook, OneNote, Access, Publisher), 필수 winetricks 목록(corefonts, msxml6, riched20, gdiplus), 로컬 setup.exe 사용 여부, 공유 컴퓨터 정품 인증 전환, Wayland 드라이버 사용, DPI 값 등을 지정할 수 있다. 로그는 ~/.local/share/ms365/logs/와 ~/.local/share/ms365/odt/logs/에 쌓이고, `ms365 exec regedit`처럼 프리픽스 안에서 도구를 직접 실행할 수도 있다.

배경에는 Wine 생태계의 축적된 노하우가 있다. 2026년 2월 Bottles 트래커에는 Wine 10.20에서 오피스 365 x64가 corefonts, msxml6, riched20, gdiplus와 ODT, 몇 개의 DLL 복사로 동작한다는 보고가 올라왔고, ruados/eylenburg의 고전적인 오피스-온-Wine 노트는 Direct2D 레지스트리 조정과 AppvIsvSubsystems*, C2R* DLL을 오피스 바이너리 옆에 복사하는 요령을 정리해 왔다. 이 플레이크는 그런 개별 요령들을 Nix 재현 가능 빌드로 묶은 결과물에 가깝다.

현재 상태는 2026년 9월 16일, GE-Proton11-7과 오피스 앱 빌드 16.0.20326.20144 조합을 기준으로 정리돼 있다. ODT가 전체 제품군을 프리픽스 안에 설치하고, 워드는 시작 화면과 리본을 그리고 로그인 버튼까지 표시한다. 다만 첫 실행 때 정품 인증을 확인할 수 없다는 대화상자가 뜬다. 라이선스 심(shim)이 설치된 라이선스가 없다고 보고하기 때문이며, 로그인과 정품 인증 자체는 아직 이뤄지지 않았다. 엑셀, 파워포인트, 아웃룩 등은 설치되지만 테스트되지 않은 상태다.

이를 위해 프로젝트는 Wine과 클릭투런 로그를 읽어가며 찾아낸 수정을 자동으로 적용한다. sppc.dll의 SLInstallLicense에서 중단되던 설치 오류를 대체 DLL로 우회하고, WinRT PackageManager가 새 인터페이스에 E_NOINTERFACE를 돌려주며 널 참조로 죽던 문제는 appxdeploymentclient 오버라이드를 끄는 방식으로 피한다. ole32 심은 누락된 CoRegisterActivationFilter를 구현하고, kernel32가 내보내지 않는 SetFileShortNameW, FindPackagesByPackageFamily, SetThreadpoolTimerEx를 로더 알림으로 무해한 대체 함수에 연결한다. 엑셀이 ole32를 아예 건드리지 않는 문제 때문에 같은 DLL을 ms365shim.dll로도 설치해 AppInit_DLLs로 모든 프로세스에 주입한다. 그 밖에 App-V 가상 파일 시스템 트리를 심볼릭 링크로 Program Files에 반영하고, 크래시 후 안전 모드 프롬프트를 막기 위해 Resiliency 키를 지우며, winhttp/wininet가 미구현 옵션 코드를 12009로 거부하는 경로를 심에서 받아준다.

렌더링 쪽 수정도 눈에 띈다. GE-Proton 11의 Wine 11.0 기반 d2d1이 지오메트리 그룹의 채움 모드를 무시해서 리본의 글꼴·크기 상자나 공유 버튼이 회색 덩어리로 보이는 문제가 있었는데, 2026년 2월에 업스트림에서 고쳐진 Wine 11.16의 d2d1.dll을 네이티브 오버라이드로 등록해 해결한다. Wayland 드라이버에서는 대화상자 그림자가 소유자 없는 팝업으로 그려져 창이 흔들리는 문제가 있어, 심이 해당 창에 소유자를 지정해 일시적 창으로 만든다. 맞춤법 검사 도구를 찾지 못하는 문제는 패키지 매니페스트에서 MSI 등록 정보를 재구성하는 스크립트로 메운다.

개발자 입장에서 이 프로젝트의 가치는 "리눅스에서 오피스가 된다"는 결론보다, Wine 호환성 문제를 어떤 식으로 진단하고 우회하는지에 대한 사례집이라는 점이다. 로그를 읽어 실패 지점을 찾고, DLL 심과 로더 알림, 레지스트리 조정으로 메우는 과정이 그대로 공개돼 있다. 리눅스 데스크톱에서 오피스 문서 호환성이 필요한 팀이라면 Nix 환경에서 재현 가능한 형태로 시도해 볼 수 있고, 반대로 순수 Wine이나 Proton 기반 앱을 다루는 개발자라면 같은 기법을 참고할 만하다.

다만 전제를 분명히 해야 한다. 마이크로소프트 365 구독이 필요하고, 설치 시 수 GB를 내려받으며, 로그인과 정품 인증은 아직 되지 않는다. 워드 외 제품은 검증되지 않았고, Wayland 환경에서는 팝업 메뉴가 즉시 닫히는 등 별도 조정이 필요할 수 있다. 프로젝트 스스로도 최선의 시도(best-effort)라고 규정하고 있으므로, 업무용으로 바로 투입하기보다는 실험적 환경에서 검증하는 편이 안전하다.