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 つあります。

  • jフラグは、CPU に割り当てるコンパイルジョブの量を指定します。この値を設定する際の目安としては、CPUのコア数の半分程度にするとよいでしょう。例えば、クアッドコアのCPUを使用している場合、この値を-j2` に設定することができます。
  • 一方、-lフラグは、システムに必要なロードアベレージを設定します。ロードアベレージとは、CPUがある時間内に行うタスクの総量です。例えば、システムのコンパイル時間を短縮したい場合、この値を -l2 に設定します。

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つのプログラムに分割されています。

  • distccdは、コンピュートサーバで動作するユーティリティです。これは、クライアントから入ってくるDistCCリクエストを聞き、それらからタスクを取り込む単純なプログラムです。コンパイルが終わると、コンパイルされたオブジェクトはクライアントに送り返され、パッケージ化されます。
  • 一方、distccは、distccdに接続するクライアントプログラムです。これは、Portageと連携して、ネットワーク上でシームレスにコンパイル作業をスケジュールし、分散させるプログラムです。

小さな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"
  • port フラグは distccd が着信接続を待ち受けるポートを示します。3632はDistCCのデフォルトのポートです。 3632はDistCCのデフォルトのポートです。 * log-levellog-file はDistCCが取っているタスクのログファイルを保持するように指示します。
  • N フラグは distccd の “niceness” を表します。これは DistCC がコンパイルタスクのためにどれだけサーバーの CPU を使うことができるかを示す変数です。これは 0 から 20 までの値で、0 が最も悪く、20 が最も良いということです。
  • 最後に、allowフラグはDistCCに特定のアドレスからの着信接続のみをリッスンするように指示します。例えば、上の行は、DistCCに、1つのクライアントからの着信接続のみをリッスンするように指示します。

このような場合、 を使用します。 次に必要なことは、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つあります。

  • march オプションは、あなたが望むCPUでプログラムをコンパイルするようにGCCに指示します。ほとんどの場合、あなたは GCC にあなたのローカル CPU 用にプログラムを作成するよう指示します。そうするためには、“native “という値を与えれば、GCCは現在動作しているCPU用にビルドします。
  • O` オプションは、プログラムの最適化のレベルを指定します。これは0から3の間の値で、高い値を設定するほどプログラムの実行速度が速くなります。しかし、そうすることでコンパイルにかかる時間が長くなります。
  • pipe オプションはトグルで、コンパイルの速度を上げるために設定します。これは、オブジェクトを一時ファイルに保存するのではなく、RAMに保持することで行います。そのため、メモリを大量に消費し、限られたRAMでこれを使うとGCCがクラッシュします。

よくある質問

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