手のひらの中のGentoo

2016-12-15
これは、Gentoo Advent Calendar 15日目の記事です。

はじめに

スマートフォンに代表されるモバイルデバイスは、今日では10年前のデスクトップコンピュータを凌ぐほどの性能をもつまでになりました。 中でも多くのデバイスに採用されているAndroidは、Linuxカーネルの上に構築されたシステムです。 Androidは便利な環境ですが、Gentooユーザーの皆さんには、その機能や設計について不満をもつ方もおられるのではないでしょうか。 モバイルデバイスにも、Gentooの提供する選択と自由がほしい。 Gentooには、Androidと共存してインストールできる選択肢があります。それが、Gentoo RAP (RAP Ain't Prefix)です。 今回は、このRAPを試してみたいと思います。

RAPについて

Prefixについて

RAPについて説明する前に、Gentoo Prefixについて書いておくべきでしょう。 Gentoo Prefixは、様々なOSの上でPortage(とか)を使えるようにする仕組みです。 普通のGentoo Linuxでは、emerge(とか)したパッケージはrootファイルシステムにインストールされますが、Gentoo Prefixの場合、あるディレクトリ(prefix)を決めて、その中にパッケージをインストールします。 こうすることで、下のOSには一切影響を与えず、また、スーパーユーザでなくても管理できるGentoo環境が作れるのです。 Gentoo Prefixの力は凄まじく、Mac OS XやSolaris、果てはWindows(Interix)の上でさえGentooが動いてしまいます。

Prefixとの違い

RAPも基本的にはPrefixと似ていますが、ひとつだけ大きく違うところがあります。 RAPは、libcを自前で用意するという点です。 たとえば、RHEL 5で使われているglibc 2.5では、バージョンがあまりにも古いため、fortifyなどの重要な機能が使えません。 同じく、Androidで使われているbionic libcも、BSDのlibcをベースに機能を削ったもので、かなりのライブラリ関数が使えません。 こういった環境で通常のGentoo Prefixを使うことはできないため、RAPでは、prefix内のlibcを無理やり使うようになっています。 かつでのUbuntu for Androidでも似たようなことを行っていたようです。

RAPのインストール

インストール方法は簡単で、tarballをAndroid上で展開するだけです。 実際にAndroid端末にRAPをインストールする前に、いくつか注意事項があります:
  1. インストールする端末は、root化済みであること。
  2. (古い端末のみ)端末のLinuxカーネルバージョンを確認すること。(glibc-2.20以上では、linux-2.6.32以上が必要)
  3. ストレージのマウントオプションに気をつける。dataパーティションはnodev,noexec,nosuidとかになってると思うので、解除しておく。
  4. (ストレージが小さい場合)inodeが枯渇する場合があるので、なんとかして切り抜ける。
  5. Androidについてくるtarはよく落ちるので、busyboxのtarを使う。

# busybox wget http://distfiles.gentoo.org/experimental/prefix/rap/rap-stage3-armv7a_hardfp-latest.tar.xz
# busybox tar -C /data -xf rap-stage3-armv7a_hardfp-latest.tar.xz
root権限がどうしても必要なのはここだけです。 prefixに入るには、

$ /data/gentoo/startprefix
あとは適当に、リポジトリを設定したりうどんワールドしたりしましょう。

遊ぶ

現時点ではXが動かないので、コンソールで動くものをインストールしてみましょう。 app-misc/sl、games-roguelike/rogue、games-misc/bsd-games あたりがいいんじゃないかな。

おわりに

今回はたいしたことができませんでしたが、Gentoo RAPがもっと成長すれば、モバイルコンピューティングの世界は今よりずっと自由で豊かなものになるでしょう。 RAPでWaylandを動かすプロジェクトもあるようです。夢が広がりますね。

リンク

Project:Android - Gentoo Wiki
Project:Android/tarball - Gentoo Wiki
Prefix/libc - Gentoo Wiki
DSAS開発者の部屋:Android NDKで使えないシステムコール・ライブラリ関数一覧