Gentooは、強力で柔軟なLinuxディストリビューションです。その革新的なパッケージマネージャ - Portage - により、コンピュータシステムを最も基本的な部分まで作り上げることができます。

Gentooはデフォルトで、インストールしたいすべてのパッケージをコンパイルすることを要求しているからです。このアプローチにより、コンパイル時の設定を変更することができます。これには、バイナリベースのディストリビューションでは不可能であった、様々な技術に対する設定が含まれます。

ソースパッケージ管理とは何ですか?

ソースベースのパッケージ管理は、Linux でサードパーティのプログラムを配布 するためのオリジナルの方法です。これは、メンテナがプログラムを入手し作成する際のレシピのリストを持つシステムです。

このレシピには、プログラムのソースコードと、それを入手するための手順が含まれていることがあります。ユーザーとしては、これらのレシピをパッケージマネージャを通じてディストリビュータからダウンロードすることができます。一度ダウンロードすれば、あなたのマシンはプログラムのソースコードをダウンロードし、あなたのためにリアルタイムでそれを作成します。

これは古くさく見えるかもしれませんが、この方法でやると、多くの利点があります。

しかし、この方法にはいくつかの欠点もあります。例えば、FirefoxやChromiumなどのパッケージは、コンパイルとインストールに数時間かかります。これは、これらが数百万行のコードと数百の依存関係を持つプログラムであるためです。

それを知った上で、この記事ではGentooを使うときにコンパイル時間を改善するために使える5つのトリックを紹介することを目的としています。

1. MAKEOPTSを最適化する

Gentooでコンパイル時間を短縮する最も簡単な方法の1つは、make.confを最適化することです。これはPortageがあなたのマシンのコンパイル設定を決定するために使用するメインの設定ファイルです。そのため、あなたのシステムのアーキテクチャや設定を決定する様々な変数が含まれています。

make.conf ファイルは、"/etc/portag" にあります。また、このファイルの内容は、以下のコマンドで表示することができます。

cat /etc/portage/make.conf

Portageを最適化するために変更する必要があるのは、MAKEOPTSだけです。これは、あなたのシステムの最適化フラグを扱う設定です。以下の例で考えてみましょう。

[...]
 
MAKEOPTS="-j1 -l1"
 
[...]

この場合、MAKEOPTS で使用できるフラグは 2 つあります。

2. CCache を利用する

コンパイル時間を短縮するもう一つの方法は、CCacheを利用することです。これはサードパーティのプログラムで、一般的なコンパイル済みファイルをコンピュータの一時的なスペースに保存することができます。

そこから、コンパイラは、再コンパイルする代わりに、この保存されたファイルを使うことができます。これは,常にプログラムをリビルドしている場合や,大きなパッケージをコンパイルしている場合に特に便利です.

CCacheはPortageからインストールすることができます。

sudo emerge --ask dev-util/ccache

次に行うことは、CCacheの設定です。そのためには、ccache.conf ファイルを作成する必要があります。

sudo mkdir /var/cache/ccache/ && touch /var/cache/ccache/ccache.conf

ここから、CCacheのデフォルトのコンフィギュレーション設定を使って、作業を開始することができます。

max_size = 20.0G
umask = 002
ハッシュディレクトリ = false
compiler_check = %compiler% -v
キャッシュディールレベル = 3

最後に、パッケージのコンパイル時にCCacheを使用するようにPortageに指示する必要があります。そのためには、make.confに以下の行を追加してください。

FEATURES="ccache"
CCACHE_DIR="/var/cache/ccache"

3. DistCCを試す

CCacheと同様に、DistCCもまた、コンパイル時間を短縮するのに役立つサードパーティーのプログラムです。CCache と違って、DistCC はコンパイル作業をネットワーク上の他のコンピュータに分散させることで、これを実現します。これは、家庭内に使っていないコンピュータが複数ある場合に、特に有用です。

DistCCは、distccdとdistccという2つのプログラムに分割されています。

小さなDistCCクラスタを作成するのは比較的簡単です。そのためには、サーバとクライアントの両方のPCにdistccプログラムをインストールする必要があります。

sudo emerge --ask sys-devel/distcc

DistCCサーバーの設定

次に、DistCC接続を受け入れるようにサーバーを設定する必要があります。これは、"/etc/conf.d/“にdistccの設定ファイルを作成することで行えます。

sudo touch /etc/conf.d/distccd

それができたら、次のコードの行を distccd ファイルに記述してください。

DISTCCD_OPTS="--port 3632 --log-level notice --log-file /var/log/distccd.log -N 10 --allow 192.168.254.101"

このような場合、 を使用します。 次に必要なことは、distccdのログファイルを作成することです。

sudo touch /var/log/distccd.log
sudo chown distcc:root /var/log/distccd.log

これで、Distccd サーバーが DistCC の接続を受け入れることができるようになりました。

sudo rc-update add distccd default
sudo rc-service distccd start

DistCCクライアントの設定

distccdと違って、DistCCクライアントの設定は信じられないほど簡単です。まず、クライアントにどこでdistccdサーバを探すかを教える必要があります。

sudo /usr/bin/distcc-config --set-hosts "localhost 192.168.254.102".

これは、プログラムをコンパイルするためにローカルマシンとサーバーの両方を使用するようにDistCCに指示します。ここから、DistCCを使うようにmake.confを設定することだけが残されています。

CCacheと同様に、FEATURES変数を使用して、ネットワークでDistCCを実行していることをPortageに伝える必要があります。例えば、これはクライアントマシンからのmake.confです。

MAKEOPTS="-j4 -l4"
FEATURES="distcc"

4. BuildPKGを使用する

Gentooでコンパイル時間を短縮するもう一つの方法は、バイナリ配布サーバーを作成することです。この場合、パッケージがビルドされ、バイナリ形式で配布される別のマシンを使用することになります。

DistCCとは異なり、バイナリを配布するには、1台のマシンでコンパイルを行うだけでよいのです。出来上がったプログラムは、複数のマシンで共有され、普通にインストールすることができます。

この方法は、すでに多くの同じようなマシンでGentooを使っている場合に便利です。バイナリによって、1つのクライアントの構築と保守にかかる時間が短縮されるからです。

ビルドサーバーのmake.confに以下の行を追加するだけで、ビルドを開始できます。

FEATURES="buildpkg" (ビルドパック)

これは、サーバにインストールするすべてのプログラムについて、バイナリパッケージを自動的に作成するようにPortageに指示するものです。

そこから、これらのバイナリをネットワーク上のマシンと共有するための方法を作成する必要があります。これを行うには、簡単なHTTPウェブサーバをインストールします。

sudo emerge --ask www-servers/lighttpd

次に、"/etc/lighttpd/lighttpd.conf “に以下の行を追加して、lighttpdにあなたのサーバーのパッケージを提供するように指示します。

server.modules += ( "mod_alias" )
alias.url = ( "/packages" => "/var/cache/binpkgs" )

Gentooへのバイナリパッケージのインストール

これで、ディストリビューションサーバーからバイナリパッケージをインストールするのは、簡単な2ステップのプロセスになりました。まず、ディストリビューションサーバのアドレスをPortageに教える必要があります。

PORTAGE\_BINHOST="http://192.168.254.110/packages"

そこから、Portageを使ってバイナリパッケージをインストールしました。

sudo emerge --ask -K www-client/firefox

ここで、-KオプションはPortageにインストールしたいパッケージのバイナリだけを探させます。

この際、サーバに Firefox プログラムのコピーがあるかどうかを調べます。Portageが見つからない場合、インストールは失敗します。これは結局のところ、クライアントがプログラムのバイナリを要求する前に、 サーバがすでにバイナリを持っていなければならないことを意味します。

5. Gentooでコンパイラを最適化する

最後に、GNU C Compiler (GCC) のオプションを設定して、速度を最適化できるようにすることもできます。

を参照してください。 しかし、MAKEOPTSとは異なり、これらのオプションはあなたの持っているマシンに依存します。CPUはもちろんのこと、ハードディスクやメモリも含めてです。

さらに、これらのオプションは COMMON_FLAGS 変数内に配置する必要があります。例えば

COMMON_FLAGS="-march=native -O1 -pipe".

この中で、GCCを最適化するために設定できるオプションは3つあります。

よくある質問

1. make.confにMAKEOPTSやFEATURES変数がありません。私のGentooインストールは壊れているのでしょうか?

いいえ!デフォルトのmake.confファイルにMAKEOPTSとFEATURES変数がないのは正常です。Make.confに変数とその値を追加すれば、Portageがそれを認識してすぐに適用してくれます。

2. 2. CCache を必要なパッケージだけ有効にすることは可能ですか?

はい!特定のパッケージに対してのみCCacheを有効にすることができます。そのためには、まず FEATURES 変数から “ccache” という値を削除する必要があります。

そこから、"/etc/portage/package.env” ファイルを編集する必要があります。これは、パッケージ単位でPortageの機能を有効にするためのファイルです。それを知った上で、これはいくつかのプログラムでCCacheを使うpackage.envファイルです。

www-client/firefox ccache.conf
sys-devel/gcc ccache.conf
sys-devel/clang ccache.conf

そうすることで、Firefox、GCC、ClangのCCacheを有効にしました。これは、Portageがこれらのプログラムとそれに関連する依存関係のオブジェクトファイルのみを保存することを意味します。

3. Gentooディストリビューションサーバーを運用する上で、何か問題はありますか?

Gentooディストリビューション・サーバーを運営する際の主な問題の1つは、バイナリ・パッケージを最新の状態に保つ責任があなたにあることです。つまり、クライアントをアップデートする前に、まずディストリビューションサーバーをアップデートし、クライアントの古いバイナリを削除する必要があります。

ディストリビューションサーバを実行する際のもう一つの問題は、クライアントマシンのUSEフラグの柔軟性を失うことです。つまり、すべてのマシンで不要なフラグを有効にする必要があるのです。

画像引用元:Unsplash

Akira
Akiraは情熱的なゲーマーであり、製品レビュアーです。ゲームをしていないときは、最新のゲーミングアクセサリーを試したり、製品のレビューをしていることが多い。彼の分かりやすいスタイルは、ゲーマーが自分のニーズに最も適した製品を簡単に判断できるようにするものです。また、技術的な問題にも精通しており、その解決方法も知っている。