MoonLightOS

Ubuntuのベース、Ubuntuのデスクトップなし

パッケージリポジトリの広さとハードウェア対応の幅広さで、Ubuntuに並ぶLinuxベースはありません。linux-firmwareだけでも、実際に使われているWi-Fi、Bluetooth、GPU、チップセットの大半をカバーし、NVIDIAのカードはubuntu-drivers-commonが適切に処理します。Canonicalの署名済みshimとGRUBがリポジトリにあり、カーネルも署名済みなので、Secure Bootはそのまま動きます。さらにベースには12年間のセキュリティメンテナンスが付きます。

置き換える価値があったのはUbuntuのデスクトップの部分でした。重いうえに、スタートボタンもデスクトップアイコンもタスクバーもありません。Cinnamonにはその3つがそろっています。そのためMoonLightOSは最小のベースから始め、その上にデスクトップを組み上げています。Ubuntu自身のデスクトップは一切インストールせず、利用者の目に触れるところにベースの名前は出てきません。

ひとつだけ意図的に変えていないものがあります。aptから見えるリリースのコードネームは「resolute」のままです。PPAやlsb_releaseを呼ぶものがこれに依存しているからです。実際に表示されるブランド名は/etc/os-releaseから来ています。

MoonLightOSのスクリーンショット
ロゴは静止したまま、その周囲の光が脈打ちます。周期2.6秒と3.1秒の2枚のハロー画像が少しずつずれていくため、光り方が機械的に見えることはありません。どちらもビルド時に元の画像から生成しており、同じロゴとハローがGRUBメニュー、ログイン画面、インストーラー、「MoonLightOSについて」、ようこそツアーにも表示されます。

外観

画面下にパネルが1本、高さは52ピクセルです。左にスタートボタンと検索ボックス、中央に起動中のアプリがパネル上で最も大きなアイコンで並び、右にステータス表示があります。メニューには画像と名前、そしてこのパソコンを管理できる権限があるかどうかが表示され、検索ボックスからアプリ、設定、ファイル、ウェブの結果を探せます。

MoonLightOSのスクリーンショット
インストール済みイメージを実際に起動して撮影したスクリーンショットです。イメージ画像ではありません。

3つのレイアウト

  • MoonLight

    画面下にパネルが1本。ドックにはよく使うアプリも並ぶので、ランチャーの列をもう1つ置く必要がありません。

  • 2本パネル

    上に時計とステータスアイコン用の細いバー、下に自動で隠れるドック。

  • コンパクト

    上に細いバーが1本だけ。画面を最も広く使え、古いグラフィックスでは最も軽い構成です。

ライトとダーク

どちらのテーマも、1つのスクリプトと1つの配色から生成しており、GTK 2、3、4、Cinnamonシェル、ウィンドウの枠までを一通りカバーします。GTKテーマはAdwaitaを読み込んで色を差し替える方式なので、新しいウィジェットや上流の修正が自動的に反映されます。アイコンテーマはPapirusをベースに、ディストリビューションを示すアイコンだけを差し替えています。アクセントカラーは「デスクトップとドック」から変更できます。

時刻に合わせた切り替え

初期設定では7時からライト、19時からダークになります。小さな常駐サービスが、テーマをこの時間どおりに保ちます。

デスクトップウィジェット

初期状態では大きな時計と、プロセッサー、メモリ、ディスクの使用状況を示すモニターが表示されます。右クリックすると、カレンダーと付箋メモを追加できます。付箋メモは入力しながらプレーンテキストで保存されます。

起動アニメーション

ロゴは静止したまま、その周囲の光が脈打ちます。周期2.6秒と3.1秒の2枚のハロー画像が少しずつずれていくため、光り方が機械的に見えることはありません。どちらもビルド時に元の画像から生成しており、同じロゴとハローがGRUBメニュー、ログイン画面、インストーラー、「MoonLightOSについて」、ようこそツアーにも表示されます。

書体

画面表示にInter、コードにJetBrains Mono、それ以外にはNotoを使い、中国語、日本語、韓国語、カラー絵文字にも対応します。

7枚の壁紙

ペンギン、湖、三日月を題材にした写真5枚に、生成した昼と夜の1組を加えています。初期状態では「湖に沈む夕日」が設定されています。

すでに知っているショートカット

WindowsとmacOSは、ほとんどの操作で違うキーボードショートカットを使います。この2つはめったに衝突しないので、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なら検索ボックスにカーソルが入った状態で開きます。

3つのパッケージ形式を、ひとつのストアで

apt、snap、Flatpakをすべて導入済みで、GNOME Softwareはその3つをまとめて一覧表示します。順番はsnap、Ubuntuリポジトリのパッケージ、Flathubです。.debパッケージが常に最も軽く、それ以外はFlathubがカバーします。

Snap Storeアプリ自体がsnapで、依存関係を含めると約1GBあります。メモリ2GBのパソコンを想定したイメージに入れるには大きすぎます。そこで、ストアは最初からsnapの一覧表示とインストールができるようにしておき、Snap Storeアプリ本体は接続が使えるようになった時点でサービスがダウンロードします。

設定の「アプリケーション」ページでは、何が入っているか、各アプリが3つの形式のどれで入ったか、二重にインストールされているものがないかを確認できます。

イメージに入っているアプリ

インターネットに接続していなくても、汎用デスクトップとして最初から使えるように選びました。

インターネット

Firefox(Mozilla公式ビルド。uBlock Originをローカル拡張として同梱しているため、オフラインでも使えます)、Thunderbird、Geary、Transmission

オフィスと文書

LibreOffice Writer、Calc、Impress、Draw、Evince、GNOME Text Editor、Xournal++、PDF Arranger、MoonLight PDF、カレンダー、時計、天気、地図、電卓

メディア

VLC、Celluloid、Rhythmbox、GStreamer(libav、「bad」「ugly」プラグイン、VA-API付き)。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 Terminal、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互換

Wine(32ビット対応)、winetricks、DXVK(Direct3D 9〜11)、VKD3D(Direct3D 12)

ハードウェアとドライバー

ファームウェア

linux-firmware一式、IntelとAMDのマイクロコード、ファームウェア更新用のfwupd。

グラフィックス

IntelとAMD向けにMesa、Vulkan、VA-API、VDPAU。NVIDIAドライバーはISOに収録しているので、インターネットに接続していなくてもドライバーのページから有効にできます。

Wi-Fiとイーサネット

カーネルに50を超える無線ドライバーを収録。標準のドライバーではうまく動かないチップ向けに、broadcom-staとr8168をDKMSでビルドして同梱しています。

プリンターとスキャナー

CUPSとドライバー一式、PDFへの印刷、SANE、Simple Scan。

Bluetooth

BlueZ、Blueman、PipeWireのBluetoothコーデック。設定ページでは、Bluetoothのハードウェアがない場合にそのことをはっきり表示します。

オーディオ

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によるディスク全体の暗号化は、インストーラーのチェックボックス1つです。

  • ファイアウォール

    ufwが有効です。外部からの接続は遮断し、外部への接続は許可します。

  • AppArmor

    強制モードで動作します。snapも対象です。

  • セキュリティ更新の自動適用

    Ubuntuのセキュリティリポジトリとpackages.mozilla.orgから毎日取得します。使われていないカーネルや依存関係は削除され、パソコンが勝手に再起動することはありません。

  • rootは無効、sudoは追跡可能

    最初のユーザーアカウントがsudo経由でパソコンを管理します。rootパスワードは一切設定しません。

  • パスワードの強度とロックアウト

    2種類の文字種を含む8文字以上。8回間違えると、アカウントを15分間ロックします。

  • カーネルの堅牢化

    権限のないプログラムがシステムや他のプログラムについて知りうる範囲を狭めるよう、カーネルを設定しています。カーネル内部のアドレスや起動時のメッセージは見えないようにし、他のプロセスのデバッグは禁止し、動作中に別のカーネルを読み込むこともできません。ネットワーク層は経路の詐称や接続の洪水に備えて強化し、IPv6アドレスは定期的に入れ替えます。

  • 攻撃対象領域の縮小

    FireWireと、めったに使わないファイルシステムやネットワークプロトコルのモジュールは自動では読み込まれません。機器を挿したり通信を受け取ったりしただけで、このパソコンが決して使わないコードが読み込まれることはありません。

  • 初回起動時に固有の値を生成

    マシンIDとSSHホスト鍵は、インストールしたパソコン上で生成します。すべてのインストールで同じホスト鍵を使っていては、ホストの検証に意味がなくなります。

  • テレメトリーなし

    クラッシュや利用状況を報告するサービスはイメージに入っていません。Firefoxのテレメトリー、スタディーズ、Pocket、スポンサーコンテンツはポリシーで無効にし、トラッキング防止を有効にしています。

  • USBの保護

    USBGuardを導入しているので、画面がロックされている間に挿された機器は信頼されません。初期状態では無効で、セキュリティのページのボタン1つで有効になります。

  • 緊急パスワード

    ログイン以外の動作をする2つ目のパスワードです。消去モードはディスクのLUKS鍵を破棄して電源を切り、おとりモードは空のセッションを開いて5分後に固まります。初期状態では無効で、設定には本当のパスワードが必要です。本当のパスワードと同じものは設定できません。

  • 起動メニューのパスワード

    セキュリティのページで設定できます。再起動できる人なら、そうでなければ起動メニューを編集してrootシェルを起動できてしまうからです。

  • 何に同意するのか分かる認証画面

    MoonLightのヘルパーにはそれぞれ名前付きのpolkitアクションがあるので、パスワードを求める画面に、何に同意するのかが表示されます。

MoonLightOSのスクリーンショット
インストール済みイメージを実際に起動して撮影したスクリーンショットです。イメージ画像ではありません。

メモリの少ないパソコンでの動作

メモリの圧縮(zram)メモリの半分、最大8GB、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件あり、英語に加えてこの8言語に翻訳されています。訳されていない文字列が画面に出るプログラムがあると、ビルドは失敗します。イタリア語の言語パックとLibreOfficeの辞書はイメージに収録しているので、イタリアでオフラインインストールしても完全に現地語化されます。ほかの言語パックはワンクリックでダウンロードできます。

コマンドラインのツールは意図的に英語のままにしています。出力はドキュメントと見比べたり、不具合の報告に貼り付けたりするものなので、言語が1つのほうが扱いやすいからです。

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を採用しました。

    LinuxのDocker Desktopはエンジンを専用の仮想マシンの中で動かします。ノートパソコンでカーネルとメモリをもう1つ抱えることになります。

  • 重い開発環境は任意です。

    仮想マシン、PHPとデータベース、LaTeXは、ようこそからワンクリックで入ります。すべてのインストールに1GB分を背負わせる必要はありません。