MoonLightOS

Ubuntu의 기반, Ubuntu의 데스크톱은 빼고

패키지 저장소의 규모와 하드웨어 지원의 폭에서 Ubuntu를 따라올 리눅스 기반은 없습니다. linux-firmware 하나만으로도 실제로 쓰이는 Wi-Fi, 블루투스, 그래픽, 칩셋 하드웨어 대부분을 덮고, NVIDIA 그래픽은 ubuntu-drivers-common이 제대로 처리합니다. Canonical이 서명한 shim과 GRUB이 저장소에 있고 커널도 서명되어 있어 Secure Boot가 그대로 동작합니다. 게다가 이 기반에는 12년간의 보안 유지 보수가 따라옵니다.

바꿀 만한 것은 오히려 Ubuntu의 데스크톱이었습니다. 무겁고, 시작 단추도 바탕 아이콘도 작업 표시줄도 없습니다. Cinnamon에는 그 셋이 다 있습니다. 그래서 MoonLightOS는 최소 기반에서 출발해 그 위에 데스크톱을 직접 쌓습니다. Ubuntu 자체 데스크톱은 하나도 설치하지 않으며, 사용자 눈에 띄는 어디에도 기반 시스템 이름이 나오지 않습니다.

일부러 그대로 둔 것이 하나 있습니다. apt가 보는 릴리스 코드명은 「resolute」로 남아 있는데, PPA와 lsb_release를 부르는 모든 것이 여기에 기대고 있기 때문입니다. 사람들 눈에 보이는 제품 이름은 /etc/os-release에서 옵니다.

MoonLightOS 스크린샷
로고는 가만히 있고 그 둘레의 빛이 숨 쉬듯 번집니다. 주기가 2.6초와 3.1초인 후광 그림 두 장이 조금씩 어긋나므로, 빛이 기계적으로 보이는 일이 없습니다. 둘 다 빌드할 때 원본 그림에서 생성하며, 같은 로고와 후광이 GRUB 메뉴, 로그인 화면, 설치 프로그램, MoonLightOS 정보, 환영 둘러보기에도 나타납니다.

겉모습

아래쪽에 패널 하나, 높이는 52픽셀입니다. 왼쪽에 시작 단추와 검색창, 가운데에 실행 중인 앱이 패널에서 가장 큰 아이콘으로 놓이고, 오른쪽이 상태 영역입니다. 메뉴에는 사진과 이름, 그리고 이 컴퓨터를 관리할 권한이 있는지가 표시되며, 메뉴의 검색창으로 앱과 설정, 파일, 웹 결과를 찾을 수 있습니다.

MoonLightOS 스크린샷
설치한 이미지를 실제로 부팅해 찍은 스크린샷이며, 연출한 이미지가 아닙니다.

세 가지 배치

  • MoonLight

    아래쪽에 패널 하나. 독에 자주 쓰는 앱도 함께 놓이므로 실행기 줄을 따로 둘 필요가 없습니다.

  • 패널 두 개

    위쪽에 시계와 상태 아이콘을 담은 가느다란 막대, 아래쪽에 저절로 숨는 독을 둡니다.

  • 간결

    위쪽에 가느다란 막대 하나뿐입니다. 화면을 가장 적게 차지하고, 오래된 그래픽에서 가장 가볍습니다.

밝게와 어둡게

두 테마 모두 스크립트 하나와 색상 팔레트 하나에서 생성하며, GTK 2와 3과 4, Cinnamon 셸, 창 테두리까지 아우릅니다. GTK 테마는 Adwaita를 가져와 색만 바꾸는 방식이라, 새로 생긴 위젯과 상류의 수정 사항이 저절로 따라옵니다. 아이콘 테마는 Papirus를 바탕으로, 배포판을 드러내는 아이콘만 바꿔 놓았습니다. 강조색은 데스크톱과 독 설정에서 바꿀 수 있습니다.

시간에 맞춘 전환

기본값은 07:00부터 밝게, 19:00부터 어둡게입니다. 작은 백그라운드 서비스가 테마를 이 시간표에 맞춰 둡니다.

바탕 위젯

기본으로 큼직한 시계와 프로세서, 메모리, 디스크 사용량 표시기가 놓입니다. 오른쪽 단추를 누르면 달력과 붙임쪽지를 더할 수 있고, 붙임쪽지는 적는 동안 일반 텍스트로 저장됩니다.

부팅 애니메이션

로고는 가만히 있고 그 둘레의 빛이 숨 쉬듯 번집니다. 주기가 2.6초와 3.1초인 후광 그림 두 장이 조금씩 어긋나므로, 빛이 기계적으로 보이는 일이 없습니다. 둘 다 빌드할 때 원본 그림에서 생성하며, 같은 로고와 후광이 GRUB 메뉴, 로그인 화면, 설치 프로그램, MoonLightOS 정보, 환영 둘러보기에도 나타납니다.

글꼴

화면에는 Inter, 코드에는 JetBrains Mono, 나머지 전부에는 Noto를 씁니다. 중국어, 일본어, 한국어와 컬러 이모지까지 포함합니다.

배경 그림 일곱 장

펭귄과 호수, 초승달이 담긴 사진 다섯 장에 더해, 생성한 낮과 밤 한 쌍이 있습니다. 이번 릴리스는 「호수 위의 노을」로 시작합니다.

이미 알고 있는 단축키

Windows와 macOS는 거의 모든 동작에 서로 다른 단축키를 씁니다. 두 벌이 겹치는 일이 거의 없으므로 MoonLightOS는 양쪽을 다 받아들였습니다. Super 키는 Windows 방식을, Control 키는 Mac 방식을 따릅니다.

동작Windows에서 왔다면macOS에서 왔다면
메뉴 열기SuperSuper
검색Super+SpaceSuper+Space
파일Super+E—
화면 잠그기Super+LCtrl+Super+Q
바탕 보기Super+DCtrl+Super+D
창을 화면 절반에 붙이기Super+Left / Right—
최대화와 되돌리기Super+Up / Super+DownAlt+F10 / Alt+F5
최소화Super+HAlt+F9
창 닫기Alt+F4Super+Q
전체 화면Super+FCtrl+Super+F
창 돌아가며 전환Alt+Tab, Super+TabAlt+Tab
같은 앱의 다음 창Alt+`Super+`
모든 창Super+WCtrl+Up
모든 데스크톱Super+SCtrl+Down
데스크톱 전환Ctrl+Alt+Left / RightCtrl+Left / Right
창을 다른 데스크톱으로 옮기기Ctrl+Shift+Alt+Left / RightCtrl+Shift+Left / Right
설정Super+ISuper+,
시스템 모니터Ctrl+Shift+Esc—
명령 실행Super+R, Alt+F2—
터미널Ctrl+Alt+TCtrl+Alt+T
브라우저Super+BSuper+B
계산기Super+CSuper+C
믹서 및 이퀄라이저Super+ASuper+A
클립보드 기록Super+VSuper+V
메모Super+NSuper+N
파일 변환Super+Shift+CSuper+Shift+C
화면 전체 스크린샷PrintShift+Super+3
영역 스크린샷Shift+PrintShift+Super+4
창 스크린샷Alt+Print—
캡처 및 녹화 패널Ctrl+Shift+PrintShift+Super+5
로그아웃Ctrl+Alt+Delete—

포인터를 화면 왼쪽 위 모서리로 가져가면 창 모아 보기가 열립니다. Super 키만 누르면 메뉴가 열리고, Super+Space를 누르면 커서가 검색창에 들어간 채로 열립니다.

패키지 형식 셋, 스토어 하나

apt와 snap, Flatpak이 모두 설치되어 있고 GNOME Software가 셋을 함께 보여 줍니다. snap이 먼저, 그다음이 Ubuntu 저장소의 패키지, 마지막이 Flathub입니다. .deb 패키지가 언제나 가장 가벼운 선택이고, 나머지는 Flathub이 채웁니다.

Snap Store 앱 자체가 snap이고 의존성까지 더하면 1기가바이트쯤 됩니다. 메모리 2 GB 컴퓨터까지 염두에 둔 이미지에 담기에는 너무 큽니다. 그래서 스토어는 처음 켤 때부터 snap을 보여 주고 설치할 수 있게 해 두고, Snap Store 앱 자체는 연결이 되는 대로 서비스가 내려받습니다.

설정의 앱 페이지에서는 무엇이 설치되어 있는지, 각 앱이 세 형식 중 어느 쪽으로 들어왔는지, 같은 것이 두 번 설치되지는 않았는지 확인할 수 있습니다.

이미지에 담긴 앱

인터넷에 연결하지 않아도 처음 켠 순간부터 일반 용도의 데스크톱으로 쓸 수 있도록 골랐습니다.

인터넷

Firefox(Mozilla 공식 빌드. uBlock Origin을 로컬 확장으로 함께 넣어 오프라인에서도 쓸 수 있습니다), Thunderbird, Geary, Transmission

오피스와 문서

LibreOffice Writer, Calc, Impress, Draw, Evince, GNOME 텍스트 편집기, Xournal++, PDF Arranger, MoonLight PDF, 달력, 시계, 날씨, 지도, 계산기

미디어

VLC, Celluloid, Rhythmbox, 그리고 libav와 「bad」·「ugly」 플러그인 묶음, VA-API를 갖춘 GStreamer. 덕분에 H.264, H.265, AAC가 어느 앱에서나 재생됩니다

그래픽과 스캔

GIMP, Drawing, Eye of GNOME, MoonLight Export, Simple Scan, 글꼴 보기, 스크린샷

시스템

GNOME Software, 시스템 모니터, 디스크, GParted, 디스크 사용량 분석, Timeshift, Redshift, File Roller, Seahorse, Blueman, 프린터, MoonLight Tweaks

네트워크와 VPN

NetworkManager와 OpenVPN, OpenConnect(Cisco AnyConnect, GlobalProtect, Fortinet), L2TP, PPTP, SSH, 그리고 기본 내장된 WireGuard 지원

개발

Visual Studio Code, gcc·g++·make·gdb, git·git-lfs, cmake·meson·ninja, Python 3(pip, venv, NumPy, OpenCV), Node.js와 npm, Rust와 Cargo, Go, OpenJDK 21(Maven, Gradle), Docker Engine·Compose v2·Buildx, SQLite

터미널

GNOME 터미널, bash·zsh·fish, tmux·screen, Neovim·nano, ripgrep·fd·jq·yq·htop·btop·ncdu·tree, nmap·dig·whois·traceroute·httpie·socat, rsync·rclone·aria2, shellcheck, inxi·fastfetch

Windows 호환

32비트를 지원하는 Wine, winetricks, DXVK(Direct3D 9~11), VKD3D(Direct3D 12)

하드웨어와 드라이버

펌웨어

linux-firmware 전체와 Intel·AMD 마이크로코드, 그리고 펌웨어 업데이트를 위한 fwupd.

그래픽

Intel과 AMD를 위한 Mesa에 Vulkan, VA-API, VDPAU를 더했습니다. NVIDIA 드라이버는 ISO에 들어 있어 인터넷 없이도 드라이버 페이지에서 켤 수 있습니다.

Wi-Fi와 이더넷

커널에 무선 드라이버가 쉰 개 넘게 들어 있고, 표준 드라이버가 잘 다루지 못하는 칩을 위해 broadcom-sta와 r8168을 DKMS로 빌드해 넣었습니다.

프린터와 스캐너

드라이버를 모두 갖춘 CUPS, PDF로 인쇄, SANE, Simple Scan.

블루투스

BlueZ와 Blueman, PipeWire의 블루투스 코덱. 설정 페이지는 컴퓨터에 블루투스 하드웨어가 없을 때 그 사실을 분명히 알려 줍니다.

오디오

PipeWire와 WirePlumber, PulseAudio 호환, 그리고 10밴드 이퀄라이저를 내장했습니다.

노트북

power-profiles-daemon, thermald, 패널의 배터리 비율 표시, 기본으로 켜 둔 탭하여 누르기와 자연스러운 스크롤, Wacom과 Synaptics 입력 지원.

가상 머신

VirtualBox, QEMU/SPICE, VMware용 게스트 도구가 들어 있어 화면 크기가 맞춰지고 클립보드도 공유됩니다.

지문 인식기

fprintd와 libfprint, TOD 로더를 설치해 PAM과 이어 두었습니다. MoonLight Fingerprint가 센서를 알아보고 등록 과정을 안내합니다.

얼굴 인식 잠금 해제

OpenCV를 쓴 얼굴 인식을 로그인 화면과 잠금 화면, sudo에서 쓸 수 있습니다. 직접 켜기 전에는 꺼져 있습니다.

보안

아래 내용은 설치한 MoonLightOS에서 모두 기본으로 켜져 있습니다.

  • Secure Boot

    펌웨어 → Canonical의 shim → 서명된 GRUB → 서명된 커널로 이어집니다. 설정 → MoonLightOS 정보에서 내 컴퓨터에 켜져 있는지 확인할 수 있습니다.

  • 디스크 암호화

    설치 프로그램에서 확인란 하나면 LUKS2로 디스크 전체를 암호화합니다.

  • 방화벽

    ufw가 켜져 있어 들어오는 연결은 막고 나가는 연결은 허용합니다.

  • AppArmor

    강제 모드로 돌아가며, snap도 대상에 들어갑니다.

  • 보안 업데이트 자동 설치

    Ubuntu 보안 저장소와 packages.mozilla.org에서 날마다 받아 옵니다. 쓰지 않는 커널과 의존성은 정리되고, 컴퓨터가 제멋대로 다시 시작하지 않습니다.

  • 잠긴 root, 추적되는 sudo

    첫 번째 사용자 계정이 sudo로 컴퓨터를 관리합니다. root 암호는 아예 설정하지 않습니다.

  • 암호 품질과 계정 잠금

    두 가지 문자 종류를 섞어 여덟 자 이상이어야 합니다. 여덟 번 틀리면 계정을 15분 동안 잠급니다.

  • 커널 강화

    권한 없는 프로그램이 시스템과 서로에 대해 알아낼 수 있는 범위를 좁히도록 커널을 설정했습니다. 커널 내부 주소와 부팅 메시지는 감추고, 다른 프로세스를 디버깅하지 못하게 막았으며, 구동 중에 다른 커널을 올리는 것도 막아 두었습니다. 네트워크 계층은 위조된 경로와 연결 폭주에 대비해 단단히 했고, IPv6 주소는 주기적으로 바꿉니다.

  • 줄어든 공격 표면

    FireWire와 좀처럼 쓸 일 없는 파일 시스템·네트워크 프로토콜 모듈은 저절로 올라오지 않습니다. 장치를 꽂거나 패킷을 받았다는 이유만으로 이 컴퓨터가 결코 쓰지 않는 코드가 올라오는 일은 없습니다.

  • 처음 켤 때부터 고유하게

    머신 ID와 SSH 호스트 키는 설치한 컴퓨터에서 만듭니다. 모든 설치가 호스트 키를 함께 쓰면 호스트 확인이 아무 의미가 없어집니다.

  • 수집 기능 없음

    오류 보고와 사용 통계 서비스는 이미지에 들어 있지 않습니다. Firefox의 수집 기능과 실험, Pocket, 후원 콘텐츠는 정책으로 껐고, 추적 방지는 켜 두었습니다.

  • USB 보호

    USBGuard를 설치해 두어, 화면이 잠긴 동안 꽂은 장치는 신뢰하지 않습니다. 기본으로는 꺼져 있고, 보안 페이지의 단추 하나로 켭니다.

  • 비상 암호

    로그인이 아닌 다른 일을 하는 두 번째 암호입니다. 지움 모드는 디스크의 LUKS 키를 없애고 컴퓨터를 끄며, 미끼 모드는 빈 세션을 연 뒤 5분이 지나면 멈춥니다. 기본으로 꺼져 있고, 설정하려면 진짜 암호가 필요하며, 진짜 암호와 같게 둘 수는 없습니다.

  • 부팅 메뉴 암호

    보안 페이지에서 설정할 수 있습니다. 그러지 않으면 컴퓨터를 다시 켤 수 있는 사람이 부팅 메뉴를 고쳐 root 셸을 띄울 수 있기 때문입니다.

  • 분명한 인증 창

    MoonLight 도우미 프로그램마다 이름이 붙은 polkit 동작이 있어서, 암호를 묻는 창이 무엇에 동의하는 것인지 알려 줍니다.

MoonLightOS 스크린샷
설치한 이미지를 실제로 부팅해 찍은 스크린샷이며, 연출한 이미지가 아닙니다.

메모리가 적은 컴퓨터에서

메모리 압축(zram)메모리의 절반, 최대 8 GB, zstd 압축, 우선순위 100. 데스크톱 메모리 페이지에서 압축률은 대략 3:1입니다.
스왑 조정커널 기본값 60은 스왑이 곧 디스크 접근이라고 전제합니다. zram에서는 메모리 복사로 끝납니다.
메모리 부족 대비남은 메모리 4%에서 움직이고 2%에서 SIGKILL을 보냅니다. Cinnamon과 Xorg, LightDM, Nemo는 절대 끝내지 않고 Firefox와 Thunderbird, Code, LibreOffice, 컴파일러를 먼저 끝냅니다.
색인 없음tracker도 없고 백그라운드에서 디스크를 훑지도 않습니다.
그래픽 자동 조정로그인할 때 시스템이 OpenGL 렌더러를 확인합니다. llvmpipe 같은 소프트웨어 렌더러라면 애니메이션을 끕니다. 그 뒤에 직접 고른 설정을 덮어쓰는 일은 없습니다.
GRUB낮은 그래픽 모드를 요청하고 대비책도 두었기에, 비디오 메모리가 적은 가상 머신에서도 메뉴가 나타납니다.
Squashfszstd로 압축해, USB 메모리에서도 라이브 세션이 빨리 올라옵니다.

언어

처음 켤 때 나오는 마법사는 짧은 목록으로 영어(미국·영국), 이탈리아어, 프랑스어, 독일어, 스페인어, 브라질 포르투갈어, 네덜란드어, 폴란드어, 러시아어를 보여 주고, 나머지 로캘은 「더 많은 언어」에 담았습니다. 키보드 배치는 고른 언어를 따라가므로 두 번째 단계는 보통 다음을 누르기만 하면 됩니다.

MoonTools의 문구는 모두 774개이며, 영어에 더해 위 여덟 언어로 번역되어 있습니다. 번역되지 않은 문구가 화면에 드러나는 프로그램이 있으면 빌드가 실패합니다. 이탈리아어 언어 팩과 LibreOffice 사전은 이미지에 들어 있어 이탈리아에서 오프라인으로 설치해도 완전히 현지화되며, 다른 언어 팩은 한 번 눌러 내려받을 수 있습니다.

명령줄 도구는 일부러 영어로 두었습니다. 그 출력은 문서와 나란히 읽고 버그 신고에 붙여 넣는 것이라, 한 가지 언어로 통일하는 편이 다루기 쉽습니다.

MoonLightOS 스크린샷

알아 둘 만한 설계 선택

  • GTK 테마는 Adwaita를 가져와 색을 바꿉니다.

    손으로 적은 테마는 GTK에 위젯이 늘어날 때마다 깨집니다. 이 방식은 상류의 수정을 그대로 물려받습니다.

  • Cinnamon의 System Info 페이지는 지우지 않고 돌려놓았습니다.

    그래야 Cinnamon 업데이트가 우리 페이지 옆에 원래 페이지를 슬그머니 되살리지 못하고, MoonLightOS 패키지를 지우면 깔끔하게 되돌아옵니다.

  • squashfs는 커널을 따로 한 벌 품고 있습니다.

    설치 프로그램이 디스크로 옮기는 것이 바로 이 squashfs입니다. 여기서 /boot를 빼면 부팅되지 않는 시스템이 설치됩니다.

  • 부팅 테마 이름은 moonlight가 아니라 moonlightos입니다.

    Debian의 desktop-base 패키지에 이미 moonlight라는 Plymouth 테마가 있어서, 업데이트 한 번에 애니메이션이 슬그머니 바뀔 수 있습니다.

  • uBlock Origin은 함께 넣었고 내려받지 않습니다.

    addons.mozilla.org를 가리키는 정책은 Firefox가 연결이 되는 상태로 처음 실행될 때만 확장을 설치합니다. 이 확장은 이미지에 들어 있으며, 물론 지울 수도 있습니다.

  • Docker Desktop이 아니라 Docker Engine을 골랐습니다.

    리눅스에서 Docker Desktop은 엔진을 자기 가상 머신 안에서 돌립니다. 노트북에 커널 하나와 메모리 예산 하나가 더 얹히는 셈입니다.

  • 무거운 개발 묶음은 선택 사항입니다.

    가상 머신과 PHP·데이터베이스, LaTeX은 환영합니다에서 한 번 누르면 설치됩니다. 모든 설치가 1기가바이트를 짊어질 이유는 없습니다.