Phoenix: Zig로 처음부터 작성된 현대적 X 서버

1 month ago 11

  • Phoenix는 기존 Xorg를 포크하지 않고 Zig 언어로 처음부터 작성된 새로운 X 서버로, 현대적 대안을 목표로 함
  • 현재는 GLX, EGL, Vulkan 그래픽을 사용하는 간단한 애플리케이션을 기존 X 서버 내에서 중첩 실행할 수 있으며, 독립 실행은 아직 지원되지 않음
  • 단순성을 위해 최근 20년 내 작성된 애플리케이션과 15년 내 하드웨어만 지원하며, 서버 드라이버 인터페이스 없이 동작
  • 보안성을 강화해 프로토콜 메시지를 자동 파싱하고, 애플리케이션 간 접근은 권한 요청 기반 격리 구조로 제한
  • HDR, VRR, 다중 모니터, 내장 컴포지터 등 현대 기술을 지원하며, Wayland 호환성과 X11 프로토콜 확장도 계획

Phoenix 개요

  • Phoenix는 Xorg 서버를 대체할 현대적 X 서버로, Zig 언어로 완전 새로 작성된 구현체
    • Xorg의 포크가 아니며, 보다 단순하고 안전한 구조를 지향
  • 현재는 완전한 사용 단계가 아니며, 기존 X 서버 내 중첩 실행(nested mode) 만 지원
    • GLX, EGL, Vulkan 기반의 하드웨어 가속 렌더링을 수행 가능

목표

단순성

  • Xorg보다 단순한 서버로, X11 프로토콜의 일부만 지원
    • 최근 20년 내 작성된 애플리케이션에 필요한 기능만 포함
  • Linux DRM과 Mesa GBM을 지원하는 최근 15년 내 하드웨어만 대상
  • Xorg처럼 별도의 서버 드라이버 인터페이스는 사용하지 않음
    • Wayland 컴포지터와 유사한 구조

보안성

  • 프로토콜 메시지 자동 파싱으로 안전성 확보
    • Zig의 ReleaseSafe 빌드 옵션을 통해 배열 인덱스 초과 등 불법 동작 자동 감지
  • 기본적으로 애플리케이션 간 격리 실행
    • 다른 앱과의 상호작용은 GUI 권한 요청 또는 사전 권한 부여를 통해서만 가능
    • 예: 화면 녹화 앱은 지정된 창만 녹화 가능
  • 접근 제한 시 클라이언트는 오류 대신 더미 데이터를 수신
  • 글로벌 단축키는 수정키(ctrl, shift 등) 포함 시 동작
    • 수정키 없이 전역 단축키 사용 시 명시적 권한 필요
  • 옵션을 통해 Xorg와 동일한 동작 방식으로 전환 가능

현대 기술 지원

  • 다중 모니터, 서로 다른 주사율, VRR, HDR 등 최신 디스플레이 기술 지원
  • 단일 프레임버퍼 대신 각 디스플레이별 독립 처리

그래픽 처리 개선

  • 기본적으로 티어링 없는 렌더링내장 컴포지터 제공
    • 외부 컴포지터(picom 등) 실행 시 자동 비활성화
    • 전체화면 앱이 vsync를 끄면 해당 앱에 맞춰 조정
  • vsync 및 컴포지터 지연 시간 감소 목표

새로운 표준

  • 모니터별 DPI 속성(randr property) 정의 및 문서화
    • 애플리케이션이 모니터별 DPI에 맞춰 콘텐츠 스케일링 가능

X11 프로토콜 확장

  • HDR 등 새로운 기능 필요 시 X11 프로토콜 확장 예정

Wayland 호환성

  • 일부 앱이 Wayland 전용일 가능성을 고려
    • Phoenix가 Wayland를 직접 지원하거나, Wayland–X11 브리지(예: 12to11) 를 통해 실행 가능

중첩 디스플레이 서버

  • X11 또는 Wayland 내에서 하드웨어 가속 중첩 실행 가능
    • Phoenix 디버깅 및 윈도우 매니저·컴포지터 테스트에 유용
    • Wayland 환경에서 Xwayland 대안 서버로 활용 가능

비목표 (Non-goals)

  • Xorg 서버 완전 대체는 목표 아님
    • Xorg는 더 많은 X11 기능과 구형 하드웨어 지원 유지
  • 여러 X11 스크린은 지원하지 않음 (다중 모니터만 지원)
  • GrabServer 호출은 무효
  • 엔디안 스왑 클라이언트/서버는 필요 시 재검토
  • 간접 GLX(원격 렌더링) 지원 없음
    • 복잡성이 높으며, 원격 스트리밍이 더 효율적
    • 필요 시 GLX 프록시를 통한 원격 렌더링 가능

X11 프로토콜과의 차이

  • 폰트 관련 기능 등 X11 핵심 프로토콜 일부 미구현
  • 문자열 인코딩은 기본적으로 UTF-8 사용
    • 단, 프로토콜에서 ISO Latin-1로 명시된 경우 예외

설치 및 빌드

  • 설치 명령: zig build -Doptimize=ReleaseSafe sudo zig build install -p /usr/local -Doptimize=ReleaseSafe
  • 제거는 수동으로 /usr/local/bin/phoenix 삭제 필요
  • 개발용 빌드: zig build
    • 결과 바이너리: ./zig-out/bin/phoenix
    • 실행과 빌드를 동시에 수행 가능: zig build run

X11 프로토콜 문서 생성

  • 명령: zig build -Dgenerate-docs=true
    • 결과: ./zig-out/protocol/ 내 .txt 파일 생성
    • 공식 문서 스타일의 자동 생성 문서이며, 현재 진행 중 기능

의존성

  • Zig 0.14.1
  • x11 (xcb) — X11 중첩 모드용 (-Dbackends=x11)
  • wayland (wayland-client, wayland-egl) — Wayland 중첩 모드용 (-Dbackends=wayland, 현재 미지원)
  • drm (libdrm, gbm) — 독립 실행용 (-Dbackends=drm, 현재 미지원)
  • OpenGL (libglvnd) — gl 및 egl 제공

Read Entire Article