Open9

Asahi Linux (Arch Linux ARM) に関する動向

Nanai10aNanai10a

Asahi Linux は ALARM (Arch Linux ARM) の公式サポートを "not recommended"[1] としています. また, そもそも Asahi Linux がマイナーなのもあり[2], 文献の比較的多い Arch Linux でも Asahi Linux もとい Apple Silicon 搭載の MacBook についての言及は (x86_64 に比べ[3]) 圧倒的に少ないと言えます. 私としては細かくない記録は記事化しています[4] が細かい記録は記事化するより垂れ流せる場所があった方が良いかなと思い場を設けました.

注意ですが, 各コメントは随時更新されます. ただ, 原則として追記のみ行う形に留めるようにします.

脚注
  1. https://github.com/AsahiLinux/asahi-installer/blob/8bbbb8ca5a347d99b243e10f24358573f1587df0/data/installer_data.json#L152 ↩︎

  2. 主観による ↩︎

  3. そもそも Arch Linux ってのは x86_64 向けであり, ARM 向けは ALARM の範疇って話があり, そして Apple Silicon が登場するまで ARM でデスクトップ的に使えるのは精々 Raspberry Pi 4 とかその辺しか無かったというのがあり... ↩︎

  4. ダイマ: https://qiita.com/Nanai10a ↩︎

Nanai10aNanai10a

linux-asahi 及び mesa-asahi-edge を最新に追従させる為に PKGBUILDs[1] にパッチを当てていたのでその記録.

大前提:環境構築

カーネルビルド時には必ず Rust サポートを入れなければなりません[3]. ですので makepkg する前に今の環境で Rust がカーネルビルド向けに使えるのか確認をしましょう. ちなみに特に意識してなければ十中八九使えません.

ビルド対象とするカーネルソースを展開した直下に移動します. 例えば asahi-6.6-15 のソースを落として展開します. ここで make rustavailable を実行します[4].

期待される出力はこれです. これになる必要があります.

alarm% make rustavailable
Rust is available!

出力を見てよくわかんねえなと思った場合はこちらを参照して下さい.

https://www.kernel.org/doc/html/latest/rust/quick-start.html

Rust に慣れてる場合はこうお伝えすれば解決出来るでしょう.

cd <カーネルソースのディレクトリ>
rustup override set <期待されるバージョン>
cargo install --version <期待されるバージョン> bindgen-cli

また bindgen を pacman で入れている場合は $PATH で競合する場合があります. これの対処案は取り敢えず 2 つあります.

  1. extra/rust-bindgen を remove して makepkg の出すエラーを --nodeps で無視する
  2. $PATH の結合順を変えて, ~/.cargo/bin を優先するようにする

linux-asahi のパッチ

ここでは asahi-6.5-15 から asahi-6.6-15 への更新を考えます.

https://github.com/AsahiLinux/linux/releases/tag/asahi-6.6-15

_rcver で元のカーネルのバージョンを指定します.

PKGBUILD
-_rcver=6.5
+_rcver=6.6

_asahirel でハイフン以後のバージョンを指定します. 今回は変更ありませんが.

PKGBUILD
 _asahirel=15

Asahi Linux が公式で提供しているリポジトリのパッケージと共存する為に名前を変更します. 置き換えたい場合はこの手順は不要です.

PKGBUILD
-pkgbase=linux-asahi
+pkgbase=linux-asahi-new

あとこれも.

PKGBUILD
 echo "Setting version..."
+echo "-new" > localversion.06-new
 echo "-$_asahirel-$pkgrel" > localversion.10-pkgrel

そしたらチェックサムを更新しましょう. 一番楽なのは, 一旦 makepkg を実行してカーネルソースを落としてから, 整合性チェックが落ちて異常終了した後に updpkgsums[5] することです. そうでない場合は... 頑張って編集してください.

そしたら後はビルドして導入して GRUB の設定更新しておしまいです. 導入時には makepkg -i を使った方が楽だと思います. 3 つのパッケージ[6] をわざわざ pacman -U で指定する利点って無いと思いますし.

mesa-asahi-edge のパッチ

ここでは mesa-asahi-20230904 から mesa-asahi-20240214 への更新を考えます.

https://gitlab.freedesktop.org/asahi/mesa/-/tags/asahi-20240214

やることは超単純. _asahiver を使いたい日付タグに合わせるだけ.

PKGBUILD
-_asahiver=20230904
+_asahiver=20240214

あとは先に述べたチェックサムの更新をしたら makepkg しておしまい. こちらも makepkg -i を使えば 3 つのパッケージ[7] をまとめて導入できます.

注意ですが, これのビルドより先に linux-asahi をパッチしたものを導入して起動することをおすすめします. 古いカーネル上で最新の mesa-asahi-edge をビルドしても上手く動かなかったと記憶しています. 必要なカーネルの機能が有効じゃなかったとかそういうオチかもしれませんが...

脚注
  1. https://github.com/AsahiLinux/PKGBUILDs ↩︎

  2. 検証が足りていない為断定は出来ない. 前は動いた気もした… ↩︎

  3. Asahi Linux の推奨する config に Rust の有効化が盛り込まれているので. wiki の Kernel config notes for distros などを参照 ↩︎

  4. 流石に make が無いとか無いよね...? core/make で提供. 一般的には base-devel での導入を推奨 ↩︎

  5. extra/pacman-contrib にて提供. ↩︎

  6. linux-asahi, linux-asahi-edge, linux-asahi-headers ↩︎

  7. mesa-asahi-edge, mesa-asahi-edge-debug, vulkan-swrast-asahi-edge ↩︎

Nanai10aNanai10a

paru という AUR helper / Pacman wrapper があります.

https://github.com/Morganamilo/paru

最近知ったのですが, これには任意の "PKGBUILD repository"[1] を設定し運用できる機能があるようです. それによって, 自分でカスタムしたり bump したり新しく作った package を気軽に公開[2] (GitHub など) した上で paru / pacman による管理下に置くことが出来ると考えました. そんな私は今まで書いたことのない PKGBUILD[3] 執筆 (?) に当たって参考にしたり考えたことについて書き置きします. でもこれ Asahi には直接関係ねえなとは思います.


https://wiki.archlinux.org/title/PKGBUILD

https://wiki.archlinux.org/title/Creating_packages

まず大前提として PKGBUILD の書き方を知らないので聖書[4] を参照することから始めました. あとは core/linux (x86_64) 辺り程度に複雑な PKGBUILD も参照すると参考になります. あとは同じ言語を扱う package のお作法を既存の PKGBUILD を参照してみるとか. 例えば Rust[5]aur/dust-git[6].


https://spdx.org/licenses/

言わずと知れた SPDX license identifer ですが, license= に指定するライセンス名の形式はこれ になり始めた[7] ようです. GitHub や GitLab といえ, これを完全に網羅しているわけではない且つ UI 上で SPDX license identifer を確認できる機能はないので, LICENSE とにらめっこして適切なものを探すようにしています.


https://guide.bash.academy/expansions/

Bash は現在のデファクトスタンダードな sh として有名ですが, Arch のインフラはこれにべったりな面があります. ABS[8] も例外ではなく, PKGBUILD は formal なだけの Bash スクリプトです. 逆に言えば PKGBUILD 内では Bash 独自の拡張機能が使えるわけで, そこらの PKGBUILD を漁り見ると特に変数展開構文[9] はかなり活用されている印象でした. でそれを目の当たりにした私はこの構文を未履修だった[10]のでこのサイトとにらめっこしながら色々試してました. 未履修の方にはおすすめしますし, 履修済みの方もチートシートとして使ってみるのはいかがでしょうか.


https://wiki.archlinux.org/title/Category:Arch_package_guidelines

これは私も追々って感じですが, Arch には package guideline という PKGBUILD の書き方等に関する作法があります. ただ, あくまでも AUR に投稿しない以上これを厳守するつもりはありません. これを厳守しようとすると折角 AUR から離れて自分の PKGBUILD repository を立てても遵守が面倒で及び腰になってしまうからです. ただ, Arch 周辺のコミュニティではこういった作法を個々がよく意識することで品質の向上[11] に役立てていると私は思うので, 出来る限り従っておきたいなーとは思っています.


https://github.com/AsahiLinux/PKGBUILDs

そもそもですが多分そのまま運用できるであろう PKGBUILD repository が Asahi にはあります. ビルドしたものを公開する mirror が立っているので規定ではそちらから package を導入することになるでしょうが, それが古く保守されてない[12] から困ってこんなことしてるんですよね. ですからこれを置きかえるのが現在のモチベーションです. 万人向けではなく私のしたいようにカスタムもする見込みですが.

とは言いつつも貴重な PKGBUILD なのでよく読んで (時には引用して) 上手くやっていきたい. あとこれは有益情報ですがコレの fork や Pull Requests に先駆者のパッチが紐付いています. Asahi の upstream へ merge されない以上, 敬意を示しつつ私の PKGBUILD へ取り込む他ないなみたいな気持ちに…


そんな私の PKGBUILD repository はこちら (ダイマ). 充実させていきたい.

https://github.com/Nanai10a/nra

脚注
  1. 分かる人向けに言えば, "カスタム AUR" みたいな感じ? ↩︎

  2. AUR に公開すると容易に Arch 遣いの手に渡るので責任が (自己責任とは銘打っても流布される事実は変わらないわけで...) 生じる上, そもそも ALARM 向けの package を x86_64 向け distri である mainstream Arch 向けに (arch=(aarch64) 指定だとしても) 公開するのは何か違うなーというもやもやを抱えていました ↩︎

  3. https://wiki.archlinux.org/title/PKGBUILD ↩︎

  4. ArchWiki のこと. 宗教的な意味合いがあるわけじゃない...よね? https://wiki.archlinux.org/ ↩︎

  5. Asahi は積極的に Rust を使うので, sh の次にメジャーな記述言語が Rust ...だと思います (主観) ↩︎

  6. Package Actions の View PKGBUILD から閲覧できます. また, これは VCS[13] package と呼ばれるもので少し特殊な package ではあります https://wiki.archlinux.org/title/VCS_package_guidelines ↩︎

  7. 厳密にはまだ移行中らしい. 執筆時現在はそういった記述が wiki にある https://wiki.archlinux.org/title/PKGBUILD#license ↩︎

  8. https://wiki.archlinux.org/title/Arch_build_system ↩︎

  9. 正しい言い回しが分かりません ↩︎

  10. これでも私 zsh 信者 (という割に使ってるだけのエセだけど) な上 "拡張" って嫌いで, 且つ POSIX 互換以外の機能にあんま好印象を持っていなかったので, "Bash 独自の拡張?知るかそんなもん!拡張に頼りだしたら移植性もクソも無ぇだろうが!" と頑なに履修していませんでした. ちなみに字面通りの過激な感じではなく, ふんわり懐疑的な気持ちってだけです ↩︎

  11. 品質というのは formal ってだけでなく, 例えば ABS の仕様上で効率的とされる方法を採るとか, 少ない労力でより良く保守されるようにするだとか, 読みやすく他者と共有しやすい形にするだとか, 色々… ↩︎

  12. 少なくとも Fedora Asahi Remix に比べれば保守は放棄されているも同然だと思っている ↩︎

  13. Version Control System ↩︎

Nanai10aNanai10a

Fedora Asahi Remix は Asahi Linux 公式が唯一サポートする distribution です. また, Asahi Linux プロジェクトにおける最新の成果もこれにのみ反映されます. 関連するソフトウェアのソースコード他は GitHub やらで公開されていますが, 導入手順なんかはドキュメントされていないことが多いです. そして当然 ALARM 向けには更新されません. ですから Fedora Asahi Remix 向けのビルドスクリプトやらなにやらを参照すれば解決策が見えてくるのではないかという, そういうことです.


https://copr.fedorainfracloud.org/groups/g/asahi/coprs/

https://pagure.io/group/fedora-asahi

前者はビルドシステム, 後者はソースコードリポジトリです.

特に @asahi/mesa / fedora-asahi/mesa は見ています. ただ, 原文の spec は読みづらいのでその実行結果であるビルドログを読んでみたりもしています. ビルドログには実行されたコマンドも載っているので, 結果論としては分かりやすいという感じです.

Nanai10aNanai10a

Asahi Linux 周りの設定は色々と難儀なもので, 従来のツールがそのまま運用できないケースが存在します. 最たる例は efivarfs でしょうか, そもそも UEFI で一元管理されている訳ではない[1] ので, 例えば
efibootmgr を使っても従来のマシンのような有意な操作が出来ません. そういった Asahi Linux 固有のテクニック[2] について述べられている場面は少ないです. ですので, これについて言及されている場面を集めてみています.


https://github.com/AsahiLinux/docs/wiki

他の何よりも熟読すべきもの.


https://github.com/leifliddy/asahi-fedora-builder

Fedora Asahi Remix の前身…という訳でもないユーザーによる Fedora インストールのためのリポジトリですが, これの README にユーザスペースで有用な情報が多く書き記されています. 例えば, 起動時の音を消音する方法 など.

脚注
  1. iBoot から m1n1 を経由して U-Boot が UEFI をエミュレートしているので, つまりそこらのマシンにおける UEFI は Apple Silicon マシンの iBoot に相当し, iBoot は UEFI とは別物です. ↩︎

  2. ハックではない. どちらかというと固有の, 共通化されていない技術というだけ ↩︎

Nanai10aNanai10a

Asahi Linux がスピーカーのサポートをしたのは比較的記憶に新しいですが, これを有効化するには少し手間が要ります. 正確に言えば "不要に有効化して使用するとハードウェア的損傷を与える可能性があるので無効化されている" という所ですが, それはそれとして使いたいものが使えないのは困ります. あくまで自己責任ですが, Asahi Linux のスピーカーに関する備忘録です.


https://github.com/AsahiLinux/asahi-audio

PipeWire と WirePlumber 向けの設定ファイル群です. これを動かすためには色々必要なものがある[1] わけですが, つまるところスピーカー周りのトップレベルのモジュールに相当します.


https://github.com/AsahiLinux/speakersafetyd

Rust で書かれたスピーカー保護デーモン. 詳しいことは知りませんがとにかく危ねえ入力から保護するための実装だそう. 逆に今まで使っていたスピーカーはどうやって保護されていたのか気になる所…


https://github.com/chadmed/bankstown

Rust で書かれた低音強化 LV2 プラグイン. その, 実際に Asahi Linux を使うと分かるのですが, macOS の DSP はかなり強力で, 比喩抜きで魔法の様な感じがします. これを再現する…とかではありませんが, 少なくともチープ過ぎる音からグレードアップさせる DSP をしている, のだと思います.


https://github.com/AsahiLinux/alsa-ucm-conf-asahi

ALSA UCM の設定. 詳しくは知りません…


https://github.com/AsahiLinux/linux/tree/asahi/sound/soc/apple

さてここから本筋です. スピーカーのドライバは当然カーネルソースに含まれていますが, この中でスピーカーは全て無効化された状態になっています. このままビルドしても当然使うことはできません. しかし Fedora Asahi Remix 他で使うことができますが, これは何故か?

https://github.com/AsahiLinux/linux/blob/bd0a1a7d465fcb60685a2360565ed424bafff354/sound/soc/apple/macaudio.c#L1488-L1530

ここを変更する必要があります. 1 列目の真偽値が false であれば必ずスピーカーは無効化されるようになっています.

https://github.com/AsahiLinux/linux/blob/bd0a1a7d465fcb60685a2360565ed424bafff354/sound/soc/apple/macaudio.c#L568-L571

親の顔程みたエラーメッセージがこんなところに…

asahi-diagnose より, 私の使っているモデルは…

## Device information
    Model:          Apple MacBook Pro (16-inch, M1 Pro, 2021)
    Compatible:     apple,j316s apple,t6000 apple,arm-platform

J316[2] ですので, 少なくともその設定は有効化する必要があります.


https://gitlab.com/fedora-asahi/kernel-asahi

そしてここに Fedora Asahi Remix で使われているカーネルソースがあります[3].

コミット履歴を見ていくと, 以下のような 2 つのコミットが見つかります.

  • macaudio: Enable first round of models
  • macaudio: Enable second round of models

例えばこのような.

https://gitlab.com/fedora-asahi/kernel-asahi/-/commit/c9fd7f493639e1ca4b5b2b8ba1f1ca34aa2ae000

https://gitlab.com/fedora-asahi/kernel-asahi/-/commit/055a5383f8123d8f7751013ea9ce6f93e9288656

さて, 私は別に Asahi Linux の専門家ではないので, 何が危険たらしめ且つ安全たらしめるのか解りません. ですので GitHub の AsahiLinux/linux に上がっているカーネルソースと GitLab の fedora-asahi/kernel-asahi で差分を取り, それらしい変更が無さそうであればパッチを抽出して適用してやろうと考えました.

パッチを抽出する過程は端折るとして, 何故コミットの差分を流用しないかといえば, 当然その macaudio.c の他の部分にも変更が加わることがあるからです. てか変更があります. 何なんですか (八つ当たり). ですから安直に true を書き込むより公式でサポートされているソースにきちんと従っておくべきかなという思考です.

パッチ適用自体は AsahiLinux/PKGBUILDs の PKGBUILD でもプロセスが組まれているので, パッチを作ったら PKGBUILD と同じ階層に置けば勝手に適用されます.

https://github.com/AsahiLinux/PKGBUILDs/blob/bb0afd19058730b63ece9ae3199cc6c8afbe80a1/linux-asahi/PKGBUILD#L43-L56


最後にですが, asahi-diagnose は定期的に実行しましょう. もしもスピーカー周りで危険な設定が存在する場合, これを検出して報告してくれます. 例えば, こういう ページへ案内してくれたりします.

脚注
  1. ちなみに, これを網羅する意図はありません ↩︎

  2. j316s って何すか?これ, 末尾の s って無視して良いよね…? ↩︎

  3. 余談ですが, fedora-asahi/rust-kernel の description には "This is a fork of the Fedora Rust package for building kernel." とあります. ここから辿り着きました… ↩︎

Hidden comment
Nanai10aNanai10a

Android Studio は Android 向けの開発をする上で必須ともいえる IDE です. 但し投稿時現在, Android Studio と周辺ツールチェーンは aarch64 Linux 向けに提供されていません. これを動かしてやろうというのが今回の趣旨です.

結論を言うと動かすのは私には無理でした.


Android Studio は JVM 上で動作する IDE です. 規定では同梱されたランタイムで動作しますが, これを適当なものに置き換えれば動くという寸法です. 簡単ですね. 詳しくは上記 Stack Overflow の回答を見てください. 非常に簡単です.

ただ私は Arch Linux (ARM) ユーザです. ここは PKGBUILD で自動化していきましょう. x86_64 向けのパッケージは AUR 上に存在しているので, これを流用します.

@@ -7,15 +7,16 @@
 # Contributor: Philippe Hürlimann <p@hurlimann.org>
 # Contributor: Julian Raufelder <aur@raufelder.com>
 # Contributor: Dhina17 <dhinalogu@gmail.com>
+# Contributor: Nanai Jua <me@n7i.dev>
 # Maintainer: Kordian Bruck <k@bruck.me>

 pkgname=android-studio
 pkgver=2024.1.1.12
 pkgrel=1
 pkgdesc="The official Android IDE (Stable branch)"
-arch=('i686' 'x86_64')
+arch=('i686' 'x86_64' 'aarch64')
 url="https://developer.android.com/"
-license=('APACHE')
+license=('Apache-2.0')
 makedepends=()
 depends=('alsa-lib' 'freetype2' 'libxrender' 'libxtst' 'which')
 optdepends=('gtk2: GTK+ look and feel'
@@ -23,13 +24,15 @@ optdepends=('gtk2: GTK+ look and feel'
             'ncurses5-compat-libs: native debugger support')
 options=('!strip')
 source=("https://dl.google.com/dl/android/studio/ide-zips/$pkgver/android-studio-$pkgver-linux.tar.gz"
+        "openjdk-17.0.2_linux-aarch64_bin.tar.gz"
         "$pkgname.desktop"
         "license.html")
 sha256sums=('42f8bf31ce0d124ddd11195f662a30064d8f9aab206e5e66839e876a6bc6eda2'
+            '13bfd976acf8803f862e82c7113fb0e9311ca5458b1decaef8a09ffd91119fa4'
             '73cd2dde1d0f99aaba5baad1e2b91c834edd5db3c817f6fb78868d102360d3c4'
             '9a7563f7fb88c9a83df6cee9731660dc73a039ab594747e9e774916275b2e23e')

-if [ "$CARCH" = "i686" ]; then
+if [ "$CARCH" != "x86_64" ]; then
     depends+=('java-environment')
 fi

@@ -49,5 +52,8 @@ package() {
   install -Dm644 bin/studio.png $pkgdir/usr/share/pixmaps/$pkgname.png
   install -Dm644 $srcdir/$pkgname.desktop $pkgdir/usr/share/applications/$pkgname.desktop

+  rm -r $pkgdir/opt/$pkgname/jbr
+  cp -a $srcdir/jdk-17.0.2 $pkgdir/opt/$pkgname/jbr
+
   chmod -R ugo+rX $pkgdir/opt
 }

多分余分な物も入っていますが, 動くので良いでしょう.


Pure Wayland toolkit prototype - Pure Wayland toolkit prototype - OpenJDK Wiki

私のデスクトップ環境は Sway, つまり Wayland です. そして Android Studio は AWT を使っているようで, これは Linux 環境下では X11 にのみ対応しています. OpenJDK ではこれに Wayland サポートを入れるという話もあったようですが, 現状入っていないので停滞しているのでしょう[1]. またこれをサポートするライブラリ?もあるようですが, 今回は使用を見送りました. そんなこんなで, 今回は Xwayland を有効化して動かすこととします.


次に問題になるのが SDK tools です. Android SDK の一部で, CLI 向けのツール群です. 基本的には Android Studio から導入しますが, 当然降ってくるのは x86_64 Linux 向けのバイナリです. 動かそうとすると当然落ちますが, その中でも特に adb は動かせないと全く話になりません[2]. 従ってどうにかして aarch64 Linux 環境上でこれを動かす必要があります.

AndroidIDE

さてここで Android が OSS であることを考えます. であれば, きっとソースが手に入ればビルドして動かせるものではないかと思うわけですが, これが上手く行きません. まずもって公式には SDK tools のビルド手順など公開されていないからです[3].

そこでコミュニティのリポジトリなんかを漁るわけですが, その中で lzhiyong/android-sdk-tools は冒頭の Stack Overflow の回答でも参照されています. これは SDK tools を Android 上で使用することを目的としていて, AndroidIDE[4] から参照されていたりします. つまり今回求めている物ではない訳です.

で最終的にたどり着いたのが sheerlox/adb-standalone-build です. これは正真正銘 adb をビルドする為の物です. …ですが, 弊環境ではビルドが通りません. 外部依存のビルドに失敗するのです. BoringSSL とか, zlib とか. upstream のビルドは通るのですが…どういうことでしょう.


Android 関係のソースリポジトリはここに纏まっている様なので色々見ていたのですが, 恐らく platform/build がビルドスクリプト?プログラム?なのだと思います. まあ, 動かないのですが. 察するに, 作法というかやることが色々あるのだと思いますが, 公式の文言が無い事にはいまいち分かりません. おとなしく引き下がることにしました.


まあ, こうなれば次に挙がる選択肢は QEMU の User-mode emulation です. が, 私にはまだ QEMU を運用する知識は無いので一先ず断念とします. 加えて, Arch Linux は x86_64 向けの Linux distribution ですので, ホストマシンが aarch64 であることを想定したパッケージも無い訳です (Arch Linux ARM のリポジトリに無いというのもあります). 従って QEMU を手動でビルドするところから始まる訳ですが, これは割と簡単なのでやるだけやってあります. 手順は…メモってないので忘れました. ./configure をきちんと扱えば問題無くビルドできた筈です.

追加情報ですが, Android Studio on IDX というものが計画されているようなのでこれに少し期待しています. 詳しく知りませんが. Waitlist には登録しておきました.

という訳で消化不良ですが, ひとまず備忘録として残しておきます.

脚注
  1. 推測です. ↩︎

  2. adb だけ動作しても Android 向けの開発が出来る訳ではありませんが. ↩︎

  3. もしあったら教えて下さい. ↩︎

  4. こんなものあるんだ. 知りませんでした. ↩︎