# Apple Silicon で実践Linuxデスクトップ M1 MacBook Airを買いました. これは私が持ってる一番速いコンピュータで, 私は長年の GNOME/GNU/Linux ユーザーでもあります. ここから, Apple Silicon でLinux デスクトップ環境が必要であるという明らかな結論が導かれます. 幸いにも, Linux は Apple Silicon で既に動作します. しかし *実用性* はどうでしょうか? - 2つのネイティブの移植があります. - Corellium. これは古くなっています. https://corellium.com/blog/linux-m1 - Asahi Linux. 大幅に改善されており, 場合によっては実用的と言えます. しかし, 今のところグラフィックスアクセラレーションなどが欠けています. https://asahilinux.org - QEMU は CPU上でコードをネイティブ動作させることが可能です. しかし GPU についてはどうでしょう? また, 残念ながら, QEMU は macOS 向けにあまり最適化されていません. 私は Linux デスクトップが直ちに必要だったので, QEMU をハックすることにしました. 最大の困難は当然グラフィックスアクセラレーションですが, このために用いることができる, Virgil 3D という, ホストの OpenGL をゲストに見せるブリッジが存在します. https://virgil3d.github.io 残念ながらこれは macOS ホスト上で動きませんでした. そういうわけで **動くようにしました. 以上!** 以下は Apple Silicon/M1 上での OpenGL を実演する動画です. https://www.youtube.com/watch?v=k0bVlVQU2JQ&list=PLesZxBYUPr3wdU3sONUv4Q7UDOg1Dn_Ue&index=4 ## 改変 ### QEMU #### ui/cocoa - OpenGL サポートを追加. - Pixel by pixel 表示を実装. - カーソルの合成を追加. - キーウィンドウが変化したときにマウスの捕捉を適切に解除するように修正. (@kov, 2021-05-12) - macOS によって処理されているキーも含めて全てのキーを捕捉する機能を追加. (@kov, `full-grab=on` を `cocoa` ディスプレイ指定に追加することで有効にしてください. 2021-05-12) - キーマッピングを改善 (日本語 IME キーなど, 2021-06-17) - ui/gtk や ui/sdl2 との同時ビルドを可能に (2022-07-06) #### hw/block - macOS でのファイルロッキングを修正. (2021-07-07, 間違って同じ仮想マシンを 並行に起動してしまった場合にディスクが壊れるのを防ぐためには `drive` に `file.locking=on` を追加してください.) #### net - vmnet (https://developer.apple.com/documentation/vmnet) サポートを追加. (@codyd51 と @shchuko, 2021-03-15) #### hvf - 最新の Linux のために AArch64 ID レジスタを修正 (@agraf, 2022-02-07) #### coreaudio - デバイスの変更処理を修正 (2022-02-26) ### Virgil 3D renderer OpenGL ES サポートを改善 ## Do It Yourself ## @knazarov の Homebrew formulae 独自に保守されているため少し古いかもしれませんが, 便利かもしれません. https://github.com/knazarov/homebrew-qemu-virgl ### セットアップ 1\. ターミナルを開く. 2\. GLib, Meson, Pixman, pkg-config, そして spice-protocol を Homebrew でインストールする. ```bash brew install glib meson pixman pkg-config spice-protocol ``` 3\. 空のディレクトリを作って working directory をそれに変更する. 4\. ```bash curl -L https://gist.github.com/akihikodaki/87df4149e7ca87f18dc56807ec5a1bc5/raw/8cbc9c9e04b4ca80bee9e3f70764870ea60e8697/run.sh | bash - ``` 5\. ```bash bin/qemu-img create var/virtio.raw 64G ``` データが記録されるまで物理領域を消費しないため, イメージをかなり大きくできます. ただし, 物理ディスクが許容する以上のデータを書き込むとおかしな挙動が現れます. 6\. ```bash curl -LO https://download.fedoraproject.org/pub/fedora/linux/releases/36/Silverblue/aarch64/iso/Fedora-Silverblue-ostree-aarch64-36-1.5.iso ``` 8\. ```bash ./run -cdrom Fedora-Silverblue-ostree-aarch64-36-1.5.iso ``` インストールプロセスを進めてください. `./run` を実行することで Fedora を起動できるようになるはずです. ### 更新 単に最新の `run.sh` をダウンロードしてワークスペースディレクトリで実行して ください. ## OpenGL プロファイルを選択する `run` を編集してください. - `gl=off` は Virgil 3D GPU を無効にします. 安定していますがラグいです. - `gl=core` は OpenGL.framework を有効にします. 不安定です. - `gl=es` は ANGLE を有効にします. 安定していて速いです. ## アップストリーミング アップストリーミングが進行中です. 願わくば将来は私が実装した機能が `brew install qemu` とするだけで動作するようになるはずです. - Epoxy: https://github.com/anholt/libepoxy/pull/239 - QEMU: https://patchew.org/search?q=project%3AQEMU+from%3Aakihiko.odaki%40gmail.com - Virgil 3D renderer: https://gitlab.freedesktop.org/virgl/virglrenderer/-/merge_requests?scope=all&utf8=✓&state=all&author_username=akihiko.odaki ## 考察 ### QEMU この QEMU の改変は **セキュアではありません** . グラフィックスアクセラレーションのコードが仮想マシンの他のあらゆるもの全てと同じプロセスに存在していて, そのコードは巨大です. グラフィックススタックはシェーダコンパイルのために LLVM を含んでおり, その中の簡単な不具合1つでゲストの完全な乗っ取りが可能です. vhost-user-gpu はグラフィックスアクセラレーションの分離を提供しますが, Linux 以外で動作するように修正が必要です. - 歴史的には, vhost-user は Linux カーネルの vhost インターフェイスの再実装となっていて, インターフェイス定義のためにカーネルヘッダに依存しています. - vhost-user は Linux でしか利用できない eventfd を利用しています. これは難しくないでしょうが, プロセス分離がなくても満足してるのでやりません. やってもグラフィックスアクセラレーションプロセスは共有されたままになるでしょうし, 単独のグラフィカルプロセスの攻撃がグラフィックス出力全体の暴露につながるのは変わりないでしょう. ### Apple Silicon/M1 上の Linux デスクトップ一般について 先に説明したとおり, このような仮想化ソフトウェアは Linux デスクトップを実行する 実用的で効率的な方法です. 性能上のオーバーヘッドも日常的な利用には許容できる範囲で, Linux と macOS のよりよい統合を提供しさえします. 例えば, macOS と Linux をトラックパッド上の3本指ジェスチャーで切り替えられます. VirtFS も使えます. しかし, 仮想化による複雑さもあります. 要は1つのハードウェアを2つのシステムで 共有することになるので, 資源を適切に割り当てなければユーザー体験を悪化させます. この問題はあらゆる場面でおきます (キーボードのような HID, CPU のような計算資源, 電力管理などなど). この方法は *効率的* ですが *最善* ではありません. 長期的には ネイティブの Linux 移植が最善でしょう. Asahi Linux は期待できます. 今でも利用法によっては私が改変した QEMU よりよいかもしれません.