📝

Gentoo Linuxを選ぶ理由と戦略

に公開

「Gentooはコンパイルに時間がかかるばかりで、現代のPCではメリットが薄い」
そう言われ久しいですが、私はこのディストリビューションに中学生の頃に出会い、10年以上メイン環境として使い続けています。

単なる愛着や移行コストを嫌ってのことではありません。利用者への技術的要求は高いですが、その要求さえ満たせれば、他では比較にならないほどの安定性とパフォーマンスが得られるのです。

なぜGentooなのか: 技術的負担と引き換えに得られるもの

Gentooは「最大限の選択の自由をユーザに与える」という理念を掲げています。それを実現するためにシステム構築や管理の負担をユーザが持つことになりますが、システムのあらゆる権限をユーザが持っているのです。

依存関係制御の粒度

多くのディストリビューションにおける依存関係はパッケージ単位で解決されます。しかしPortageシステムはUSEフラグが依存関係を持つので、機能単位で解決します。

たとえば、Portageの net-misc/netifrc は dhcp フラグを持っています。netifrc は一般に net-misc/dhcpcd に依存しますが、これは dhcp フラグが要求しているので、dhcp フラグを無効にしている場合は dhcpcd はマージされません。

もしあなたがPCを固定IPアドレスでしか使わないのであれば dhcp を無効にし、dhcpcd のマージを回避し、dhcpcd だけが依存するパッケージがあればそれらも全て回避できます。

不必要な機能や依存を根本から断つことで、システム全体のパフォーマンスと安定性を高く保ち、セキュリティリスクを最小化できます。
この強みは、USEフラグというシステムによる管理の粒度がもたらすものです。

パフォーマンスの正体

「Gentooは速い」とよく言われます。それは事実です。
コンパイルすることによるバイナリ最適化、グローバルなコンパイルオプションによる最適化の制御、USEフラグによるプログラム規模の制御は大いに影響します。しかしこれらは古いハードウェアにおいて特に顕著で、よく言われるように現代のPCでは相対的に意味は薄いです。

しかし、それだけではありません。

Gentooは選択の自由のディストリビューションです。前述したUSEフラグもそうですし、そもそも導入するツールも大部分を自分で選べます。
DEやWMが選べる。X11を自分で管理してWMのみという事もできる。OpenRCが標準ですがSystemDも使える。liloとgrubも選べるし、efibootmgrを使えばブートローダ無しも可能。やろうとすればaptのようにportage以外のパッケージシステムの導入すらできます。

Gentooユーザは利便性と軽量さを天秤にかける権利を持っています。必要なものを必要なだけ集め、いらないものは全て排除できる。
不要なデーモンは走らず、自分の理解しているプロセスだけが動いている。いらない機能や意味のないコードのためのリソース消費がない。
この透明性が安定性と将来的な扱いやすさに、この軽量さが体感できるほどのレスポンスの良さに繋がります。

最適化、運用

手間が少なく、効果が感じられやすい最適化やメンテナンスをいくつか挙げましょう。

Portageシステム関係

  • jumbo-build USEフラグ: たとえば qtwebengine はコンパイルに恐ろしく時間がかかる事が知られていますが、これを軽減する jumbo-build USEフラグが用意されています。しっかりUSEの内容を調べてみましょう。
  • ccache: 過去のコンパイルの結果を再利用して高速化します。これは qtwebengine のような時間のかかるコンパイルに対ししばしば覿面に効果が出ます。
  • tmpfsの活用: メモリに余裕があるなら tmpfs を積極的に使いましょう。大規模なビルドは大きな読み書きも多いので、単にプログラムの一時ファイルをメモリに書くのとはわけが違います。
  • Git同期: リポジトリの同期はrsyncではなくgitにします。比較するとわかりますが数倍、数十倍速くなります。eselect repository で追加するオーバーレイはデフォルトでgitですが、gentooリポジトリはデフォルトでrsyncの可能性があります。
  • データベースのメンテナンス: Portageは emerge -uDN @world などで依存関係を計算しますが、この計算は使っているとわりとすぐ重くなります。実際にworldが肥大したり依存が壊れている事もありますが、emaint --check; emaint --fix や emaint --metadata、あるいは emerge --regen などでデータベースやキャッシュを整理するとあっさり直る事も多いです。
  • emerge -1 (oneshot): emerge -1 を早めに覚えましょう。自分で emerge -C すれば良いだろと思ってるとわりと取り零してゴミデータを残します。

コンパイル地獄を避けるために

「Gentooユーザはずっとコンパイルを眺めている」と言われますが、わたしに言わせればそれは誤解です。

  • 2~3日に1回、できるなら毎日1回は emerge --sync と emerge -uDN @world を実行しましょう。ちゃんとやれていれば更新の数は精々が4,5パッケージ程度です。溜め込んで一気にやると単純に時間がかかりますし、依存が混乱してわけのわからない事になります。
  • FirefoxやRustのようにコンパイルに時間のかかるパッケージは、大抵が firefox-bin や rust-bin のような名前でバイナリパッケージが提供されているので、利用を検討してみましょう。
  • あるいは、特定のバージョン範囲を /etc/portage/package.mask あたりでマスクして更新頻度をコントロールします。わたしはマスクを使う方法をよくとります。
  • make.conf で並列数や最大ロードアベレージを制御できます。負荷を抑えて裏でゆっくりコンパイルさせることも検討して良いでしょう。Gentooはもともと軽量なので、少しコンパイルが走っているくらいなら体感できるような差はほとんどありません。

さいごに

Gentooは、ユーザへの技術要求の対価としてそれ以外の全てを手にしたディストリビューションです。導入コストと軽いメンテナンスを負担する覚悟とそれに耐える技術さえあればこれ以上に合理的なOSはなかなかありません。
もしあなたがブラックボックス化されたシステムに疲れていたり、マシンのすべてを掌握したい、筋の通ったシステムが良いと感じているのなら、Gentoo Linuxはその最良の選択になるかもしれません。

Discussion