Asahi Linux で Waydroid は動かない

# TL;DR

**Waydroid は Asahi Linux では動きません！**

少なくとも現状, 良くても… 向こう数年？ (Linux on ARM がより普及したり対応が進んだら話は変わるのかな)

# Waydroid とは

ggrks.

https://waydro.id

# 環境

- `OS: Arch Linux ARM aarch64`
- `Host: Apple MacBook Pro (16-inch, M1 Pro, 2021)`

ここで `waydroid`<sup>[aur](https://aur.archlinux.org/packages/waydroid)</sup> を導入しています. 詳しいことは聖書を読みなさい (Waydroid すら Arch 関係は[聖書に丸投げ](https://docs.waydro.id/usage/install-on-desktops#arch-linux)しています).

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

# 試したこと

## `binder_linux-dkms`<sup>[aur](https://aur.archlinux.org/packages/binder_linux-dkms)</sup> を導入してみる

dkms のことよく知らなんですが, exec format error って言われるので恐らく x86_64 のバイナリが降ってきてる気がします. `binder_linux-dkms-git`<sup>[aur](https://aur.archlinux.org/packages/binder_linux-dkms-git)</sup> でも同様です.

## なにもしない！

当然起動しません.

## binderfs を有効化した kernel を使う

知らないこと多すぎてしんどかったです (弱者並感).

1. `linux-asahi`<sup>asahi</sup> の PKGBUILD 周りを[ここ](https://github.com/AsahiLinux/PKGBUILDs/tree/main/linux-asahi)から落としてくる
2. 気合で version を変える
3. 気合で config を変える
4. makepkg して update して起動する

色々あったかもしれませんが決定的な出力がコレです.

```:waydroid log
lxc-start: waydroid: ../src/lxc/conf.c: run_buffer: 322 Script exited with status 126
```

この後色々試しますが多分これで死んでるので無理です. 諦めは肝心だよ？

### version を変える

実質的な `linux-asahi`<sup>asahi</sup> の fork なので, これをこのまま makepkg して update すると既存の kernel が置き換えられてしまいます. これはもしも成果物が起動しない kernel だった場合に致命傷になりかねません. ですからまず version から変えることにしたのですね.

で version って何ぞっていうと package name 的に言えば `linux-asahi-6.5.asahi15-1` とかの `6.5.asahi15-1` なのですが, kernel 的に言えば `6.5.0-asahi-15-1-edge-ARCH` てな具合ですね. ここの `-asahi` を `-asahi-binderfs` に変更したいです. Arch の何となくの風潮を汲んでの所です.

でやることは… うーんどうだろ. これが正解かは知らないけど, 動きはする.

```diff:PKGBUILD
-pkgbase=linux-asahi
+pkgbase=linux-asahi-binderfs
```

まず pkgbase を変えます. package name 的な文脈です.

```diff:PKGBUILD
-_commit_id=asahi-${_rcver}${_rcrel+-rc}${_rcrel}-${_asahirel}
+_commit_id_orig=asahi-${_rcver}${_rcrel+-rc}${_rcrel}-${_asahirel}
+_commit_id=asahi-binderfs-${_rcver}${_rcrel+-rc}${_rcrel}-${_asahirel}
+_srcname_orig=linux-${_commit_id_orig}
 _srcname=linux-${_commit_id}
 ```

 次に `_commit_id` 周りを変えます. …思い返すとやんなくても良いかもしれません. ~~もう知ったことではありませんが.~~

```diff:PKGBUILD
 source=(
-  https://github.com/AsahiLinux/linux/archive/${_commit_id}.tar.gz
+  https://github.com/AsahiLinux/linux/archive/${_commit_id_orig}.tar.gz
```

`_commit_id_orig` に変えます. こうしないときちんと src を落としてくれません (当然です).

```diff:PKGBUILD
 prepare() {
+  mv $_srcname_orig $_srcname
   cd $_srcname
```

コレの所為で makepkg が壊れやすくなりますが知ったことではありません. `$_srcname_orig` として展開されるのでこれを `$_srcname` ってことにしときます.

```diff:PKGBUILD
   echo "Setting version..."
+  echo "-binderfs" > localversion.06-pkgrel
   echo "-$_asahirel-$pkgrel" > localversion.10-pkgrel
```

最後に `.**-pkgrel` を追加することで kernel 的な文脈で version を変えられます. ちなみに `localversion.05-asahi` には `-asahi` って書いてあります. つかこれ `.06-pkgrel` じゃなくて `.06-binderfs` って書くべきでしたね. 間違えた…

### config を変える

有識者向けに言うと `.config` (XDG_CONFIG_HOME のことではありません) のことです.

で, 私はなんか怖くて面倒だったので `config.edge` だけ変えることにしました. 分かりやすいし. いつも使ってるし.

```diff:config.edge
 CONFIG_DRM_ASAHI=m
 CONFIG_SUSPEND=y
 
+CONFIG_ANDROID=y
+CONFIG_ANDROID_BINDER_IPC=y
+CONFIG_ANDROID_BINDERFS=y
+CONFIG_ANDROID_BINDER_DEVICES=""
```

これでおしまい. 本当なら `scripts/config` を使うとかいう話もありますが知りません. 変わらん変わらん…

あ, あと, PKGBUILD の checksum を飛ばさないと検証に落ちるので注意.

```diff:PKGBUILD
 sha256sums=('633796ecdc1e210565a67b20f8fdaa748204c32275403212a30f735b8de66abd'
             '46917e449d51ce37675442cd280892f6521b719bdb75a05b558d456ad7fc9193'
-            '5cbdda1262f989a5247f4ef70690b569f9be8212bf8f576242bf6ac69036bddf')
+            'SKIP')
 b2sums=('f1e8ca0919f218dce288a9f024fd211239212a17d7c19cf5f43736519fc6e7b7ef90853c3d80485ada2f2b2c0d91954c543f8f52d517317f25deed118cd8a0cd'
         '8b3089d22d0b68e9b0c20a5e8f7ebe2626ef43cdc7053a94590ea3ca25417e76866e220ae98ff184e4912033d877eb89fd3c64bbe476889696220c5dd3b05e97'
-        '01a8b3b7e3c7bd528f6d07d2b581b8a56688305d42fdd0b1555fd26319c4369e2357bcaa8434a1a5e3123aa9fdc6f1a24de4813b819397af89ba8d0c5e896228')
+        'SKIP')
```

## binder (legacy) を有効化した kernel を使う

```diff:config.edge
 CONFIG_ANDROID=y
+CONFIG_ANDROID_BINDER_IPC=y
+CONFIG_ANDROID_BINDERFS=n
+CONFIG_ANDROID_BINDER_DEVICES="binder,hwbinder,vndbinder"
```

これでおしまい. まあ起動はしませんでした.

## Waydroid を downgrade してみる

(このへんかな… (うろ覚え))

https://github.com/waydroid/waydroid/issues/631

なんか Waydroid を downgrade すると動くみたいな話を聞いた気がしたので試してみました. 動きませんでした. `sudo rm -rf /var/lib/waydroid && sudo waydroid init -f` とかしたんだけどね. ままならないね.

## ashmem を使うために `anbox-modules-dkms`<sup>[aur](https://aur.archlinux.org/packages/anbox-modules-dkms)</sup> を導入してみる

なんか make に失敗する. dkms の install か何かでコケてたので多分救いようは無さそう. ただ, aarch64 はサポートしてる表記でした.

`anbox-modules-dkms-git`<sup>[aur](https://aur.archlinux.org/packages/anbox-modules-dkms-git)</sup> も試しましたが, exec format error が出てたのでこっちもどうしようもなさそうです.

## ashmem を有効化した kernel を使う

https://github.com/anbox/anbox-modules/issues/75

ashmem は多分今で言う memfd で, linux 5.18 で完全に削除された古の機能です. なので, この削除パッチを復元して動かそうとかいう…

(詳細は issue 参照)

1. [これ](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/patch/?id=721412ed3d819e767cac2b06646bf03aa158aaec)を落とす
2. `patchutils`<sup>[x86_64 extra](https://archlinux.org/packages/extra/x86_64/patchutils/)</sup> の `interdiff` を使って削除パッチを追加パッチに変換: `interdiff -q remove_ashmem.patch /dev/null > enable_ashmem.patch`
3. 気合でパッチを当てる
4. makepkg して update して起動する

ちなみに動きませんでした. そして最後まで例のエラーはつきまといましたとさ.

### パッチを当てる

よくわかんない.

```diff:PKGBUILD
+  echo "Applying patch (enable ashmem)"
+  patch -p1 -i ../../enable-ashmem.patch
+
   echo "Creating build directories..."
   mkdir -p build/base build/edge
```

あとついでに言うとそもそもこれうまく行ってなさそう (modprobe できないし `/dev/ashmem` も作られない).

# 結論

ARM は一応サポート環境ではありますが…

https://github.com/waydroid/waydroid/issues/1158

> We won't support Asahi Linux until android grows the capability to run with 16K pages (and we manage to upgrade to that version)

Waydroid は Asahi Linux では動きません. 少なくとも私の力では.

おしまい.