「Distcc」の版間の差分
Kusanaginoturugi (トーク | 投稿記録) (序文を更新) |
|||
(5人の利用者による、間の27版が非表示) | |||
1行目: | 1行目: | ||
+ | {{Lowercase title}} |
||
[[Category:パッケージ開発]] |
[[Category:パッケージ開発]] |
||
+ | [[Category:分散コンピューティング]] |
||
[[en:Distcc]] |
[[en:Distcc]] |
||
[[it:Distcc]] |
[[it:Distcc]] |
||
− | [[ |
+ | [[ru:Distcc]] |
+ | [[zh-hans:Distcc]] |
||
{{Related articles start}} |
{{Related articles start}} |
||
− | {{ |
+ | {{Related|TORQUE}} |
− | {{ |
+ | {{Related|Slurm}} |
{{Related articles end}} |
{{Related articles end}} |
||
− | + | [[Wikipedia:distcc|distcc]] は C, C++, Objective C, Objective C++ のコードのビルドをネットワーク上の複数のマシンに分散させるプログラムです。distcc は常にローカルビルドと同じ結果を生成し、インストールと使用方法がシンプルで、ローカルコンパイルよりもずっと高速です。makepkg などの Arch のビルドツールで使うことができます。 |
|
− | ==用語== |
+ | == 用語 == |
− | ; |
+ | ; クライアント: クライアントは、コンパイルを開始するコンピューターです。 |
+ | ; ボランティア: ボランティアは、クライアントから送信されたコンパイル要求を受け入れるコンピューターです。複数のボランティアをセットアップすることも、単一のボランティアをセットアップすることもできます。 |
||
− | |||
− | ; スレーブ: distcc デーモンが動いており、マスターからコンパイルリクエストを受け取る。 |
||
==インストール== |
==インストール== |
||
− | + | クラスタの PC 全てに {{pkg|distcc}} パッケージを[[pacman|インストール]]してください。 |
|
他のディストロや、Cygwin を使用する Windows など他の OS を使う場合は、[http://distcc.samba.org/doc.html distcc のドキュメント] を参照してください。 |
他のディストロや、Cygwin を使用する Windows など他の OS を使う場合は、[http://distcc.samba.org/doc.html distcc のドキュメント] を参照してください。 |
||
− | ==設定== |
+ | == 設定 == |
− | === スレーブ === |
||
+ | === 動作モード === |
||
− | スレーブの設定は {{ic|/etc/conf.d/distccd}} に保存します。利用できるコマンドラインオプションは [http://distcc.googlecode.com/svn%20...%20%3Cdiv%20class=/trunk/doc/web/man/distccd_1.html distcc manual] に記載されています。最低でも、許可するアドレスの範囲を [[wikipedia:Classless_Inter-Domain_Routing|CIDR]] 形式で指定してください: |
||
+ | Distcc は、Plain mode (デフォルト) または Pump モードで実行できます。大まかに言えば、主な違いは、distcc が前処理されたソースを処理する方法にあります。Plain mode では、完全なソースとコンパイラ引数が転送されます。前処理はクライアント上で保持されます。Pump モードでは、前処理とコンパイルの両方が distcc クラスターに分散され、多くの場合、より効率的かつ高速になります。詳細については、{{man|1|distcc}} を参照してください。 |
||
− | DISTCC_ARGS="--allow 192.168.0.0/24" |
||
+ | === ボランティア === |
||
− | アドレスの範囲を CIDR 形式に変換するツールが次のページにあります: [http://www.ipaddressguide.com/cidr CIDR Utility Tool]。 |
||
+ | ボランティアの設定は {{ic|/etc/conf.d/distccd}} に保存されます。少なくとも、多くの ipv4 プライベートネットワーク範囲をカバーする {{ic|--allow-private}} スイッチを追加するか、ipv6 対応ネットワークがある場合は ipv6 CIDR で {{ic|--allow}} を使用します。ファイルへのログ記録は、必要に応じてトラブルシューティングにも役立ちます。 |
||
− | コンパイルに参加する全てのスレーブで {{ic|distccd.service}} を[[起動]]してください。起動時に {{ic|distccd.service}} を実行させるには、全てのマシンでサービスを[[有効化]]してください。 |
||
+ | DISTCC_ARGS="--allow-private --log-file /tmp/distccd.log" |
||
− | === マスター === |
||
+ | または、IPv6 アクセスを許可する必要があり、ネットワーク CIDR が /64 である場合: |
||
− | ==== スタンドアロン ==== |
||
+ | DISTCC_ARGS="--allow-private --allow aaaa:bbbb:cccc:dddd:eeee:::/64 --log-file /tmp/distccd.log" |
||
− | マスターで設定する distcc の最小設定は、利用するスレーブの設定です。環境変数 {{ic|DISTCC_HOSTS}} や {{ic|$DISTCC_HOSTS}}, {{ic|$DISTCC_DIR/hosts}}, {{ic|~/.distcc/hosts}}, {{ic|/etc/distcc/hosts}} などの設定ファイルでアドレスを指定することで設定できます。 |
||
+ | マシン上に複数のインターフェイスが存在する場合は、{{ic|--listen ADDRESS}} オプションも渡すことを検討してください。他のオプションも定義できます。{{man|1|distccd}} を参照してください。 |
||
− | {{ic|DISTCC_HOSTS}} を使ってスレーブのアドレスを設定する例: |
||
+ | 参加しているすべてのボランティアの {{ic|distccd.service}} を [[起動/有効化]] します。 |
||
− | $ export DISTCC_HOSTS="192.168.0.3,lzo,cpp 192.168.0.4,lzo,cpp" |
||
+ | === クライアント === |
||
− | {{Note|このリストは空白で分けられています。}} |
||
+ | ==== makepkg を使用する場合 ==== |
||
− | {{ic|hosts}} 設定ファイルでスレーブのアドレスを設定する例: |
||
+ | 次のセクションの {{ic|/etc/makepkg.conf}} を編集します。 |
||
− | {{hc|~/.distcc/hosts| |
||
− | 192.168.0.3,lzo,cpp 192.168.0.4,lzo,cpp |
||
− | }} |
||
+ | # {{ic|BUILDENV}} 配列には ''distcc'' をアンバンする必要があります。つまり、感嘆符なしでリストする必要があります。 |
||
− | サーバーのアドレスを明示的に指定する代わりに、avahi の zeroconf モードを使うこともできます。このモードを使うにはサーバーアドレスのところに {{ic|+zeroconf}} と記述して、スレーブ側で distcc デーモンを {{ic|--zeroconf}} オプションを使って起動するようにしてください。このオプションは pump モードをサポートしてないので注意してください。 |
||
+ | # {{ic|DISTCC_HOSTS}} 行のコメントを解除し、ボランティアのホスト名または IP アドレスを追加します。必要に応じて、この後にスラッシュと使用するスレッドの最大数を続けます。後続のノードは空白で区切る必要があります。このリストは、最も強力なものから (処理能力) の順に並べる必要があります。 |
||
+ | # サーバーあたりの最大スレッド数の約 2 倍に相当するように {{ic|MAKEFLAGS}} 変数を調整します。以下の例では、2x(9+5+5+3)=44 となります。 |
||
+ | {{Note|IP アドレスの代わりにホスト名を使用することもできますが、devtools ビルドスクリプトを使用してビルドすることが目的の場合、ビルドルートでの名前解決は現在サポートされていないため、このシナリオでは IP アドレスを使用してください。IP アドレスを使用するもう 1 つの理由は、名前解決のために pi-hole を実行しているネットワーク上です。pi-hole のログには distcc からのすべてのリクエストが記録され、ログに何千もの余分な行がスパム送信されるためです。}} |
||
− | 上記の例ではアドレスに以下のオプションを追加しています: |
||
+ | {{Warning|{{ic|1=-march=native}} フラグは、{{ic|CFLAGS}} および {{ic|CXXFLAGS}} 変数では使用できません。distccd は他のマシンに作業を分散しません。}} |
||
− | * {{ic|lzo}}: TCP と SSH ホスト (スレーブ) で LZO 圧縮を使う。 |
||
− | * {{ic|cpp}}: ホスト (スレーブ) で distcc-pump モードを使う。サーバーを起動するにはビルドコマンドを pump スクリプトでラッピングする必要があるので注意。 |
||
+ | 真に汎用的な設定は存在しないことに注意してください。1 つ試してテストし、結果を他の設定と比較します。以下に、一般的な設定をいくつか示します。 |
||
− | pump モードの説明は次のページにあります: [http://distcc.googlecode.com/svn%20...%20%3Cdiv%20class=/trunk/doc/web/man/distcc_1.html#TOC_8 HOW DISTCC-PUMP MODE WORKS] と [http://google-opensource.blogspot.de/2008/08/distccs-pump-mode-new-design-for.html distcc's pump mode: A New Design for Distributed C/C++ Compilation] 。 |
||
+ | ===== Plain mode の例 ===== |
||
− | スレーブで distcc-pump モードを使うには、pump スクリプトを使ってコンパイルを開始する必要があります。そうしないとコンパイルは失敗します。 |
||
+ | BUILDENV=(distcc fakeroot color !ccache check !sign) |
||
− | ==== Makepkg ==== |
||
+ | MAKEFLAGS="-j44" |
||
+ | DISTCC_HOSTS="localhost/9 192.168.10.2/5 192.168.10.3/5 192.168.10.4/3" |
||
+ | ===== Pump mode の例 ===== |
||
− | {{ic|/etc/makepkg.conf}} の以下の3つのセクションを編集してください: |
||
+ | BUILDENV=(distcc fakeroot color !ccache check !sign) |
||
− | #BUILDENV で distcc の前のエクスクラメーションポイントを外して有効にしてください。 |
||
+ | MAKEFLAGS="-j70" |
||
− | #''DISTCC_HOSTS'' 行をアンコメントして、スレーブの IP アドレスとスラッシュ、使用するスレッドの数を追加してください。後ろの IP アドレスとスレッドは空白で区切ります。リストは一番強力なサーバーから非力なサーバーの順で並べます (処理能力)。 |
||
+ | DISTCC_HOSTS="localhost/9 192.168.10.2,cpp,lzo 192.168.10.3,cpp,lzo 192.168.10.4,cpp,lzo" |
||
− | #MAKEFLAGS 変数を個々のサーバーの最大スレッド数をすべて合計した数字にしてください。下の例の場合、5+3+3=11 になります。合計数以上を指定した場合、余った論理スレッドは distcc によってブロックされ、下で説明している ''distccmon-text'' などの監視ユーティリティでそのように表示されます。 |
||
+ | ここで注意すべき点がいくつかあります。 |
||
− | {{Note|よく物理コアとハイパースレッドのコア数に1を加えた数をスレッド数として定義することがありますが、この設定では MAKEFLAGS で1を加えないようにしてください。}} |
||
+ | * Pump mode は、一般に、Plain mode よりも、{{ic|MAKEFLAGS}} の 値が高い方が良い性能を発揮します。 |
||
− | 例: |
||
+ | * Pump mode では、IPまたはホスト名は、Pump mode が要求するように、リテラル ',cpp,lzo' でサフィックスされます。さらに、この例の localhost はそうなっていません。これは、distcc が 9 つのジョブが定義された localhost をロードし、より積極的に有志にコード生成を分配することを意味します。より大規模なクラスタでは、クラスタへの分散処理を可能にするために、localhost 上のローカルジョブの数をより少なく制限したいと思うかもしれません。また、localhost の接尾辞に,cpp,lzo を使用することもできます。 |
||
− | BUILDENV=(distcc fakeroot color !ccache !check) |
||
+ | * 前述したように、すべての distcc クラスタで効率的に動作する単一の設定はありません/最適な設定の決定は、テストとベンチマークを通じて経験的に導き出されます。 |
||
− | MAKEFLAGS="-j11" |
||
− | DISTCC_HOSTS="192.168.0.2/5 192.168.0.3/3 192.168.0.4/3" |
||
+ | ==== makepkg を使用しない場合 ==== |
||
− | SSH を通して distcc を使いたい場合、セクションの IP アドレスの前に "@" シンボルを追加してください。キーベースの認証をセットアップしていないときは、認証済みのホストのチェックを無視するように DISTCC_SSH 変数を設定してください: {{ic|<nowiki>DISTCC_SSH="ssh -i"</nowiki>}}。 |
||
+ | |||
+ | ===== Plain mode の例 ===== |
||
+ | |||
+ | クライアント上の distcc の最小設定には、利用可能なボランティアの設定と {{ic|PATH}} の再定義が含まれます。 |
||
+ | |||
+ | $ export PATH="/usr/lib/distcc/bin:$PATH" |
||
+ | $ export DISTCC_HOSTS="localhost/9 192.168.10.2/5 192.168.10.3/5 192.168.10.4/3" |
||
+ | |||
+ | ===== Pump mode の例 ===== |
||
+ | |||
+ | $ export PATH="/usr/lib/distcc/bin:$PATH" |
||
+ | $ export DISTCC_HOSTS="localhost/9 192.168.10.2,cpp,lzo 192.168.10.3,cpp,lzo 192.168.10.4,cpp,lzo" |
||
==コンパイル== |
==コンパイル== |
||
− | === |
+ | === makepkg を使用する場合 === |
+ | ==== Plain mode の例 ==== |
||
− | distcc の pump モードを使ってソースファイルをコンパイルするには、次のコマンドを使用します: |
||
+ | {{ic|/etc/makepkg.conf}} が設定されたら、特別な手順は必要ありません。通常どおり makepkg を呼び出すだけです。 |
||
− | $ pump distcc g++ -c hello_world.cpp |
||
+ | ==== Pump mode の例 ==== |
||
− | この場合 pump スクリプトは distcc を実行してから "-c hello_world.cpp" をパラメータとして g++ を呼び出します。 |
||
+ | ユーザーは、makepkg を使用するかシェル上でコンパイルする前に Pump を開始する必要があります。Pump には、正しく設定された一連の {{ic|DISTCC_HOSTS}} があることを確認するチェックが含まれているため、最初に偽の {{ic|DISTCC_HOSTS}} 行を定義する必要があります。makepkg は、{{ic|/etc/makepkg.conf}} で指定された値を使用することに注意してください。 |
||
− | Makefile プロジェクトをコンパイルするには、まずコンパイラによって設定される変数を確認する必要があります。例えば、gzip-1.6 の場合、Makefile の中に次の行を見つけることができます: {{ic|1=CC = gcc -std=gnu99}}。基本的に {{ic|CC}} は C プロジェクトで使われる変数で、{{ic|CXX}} は C++ プロジェクトで使われる変数です。distcc を使ってプロジェクトをコンパイルするには以下のようにします: |
||
+ | $ export DISTCC_HOSTS="localhost,cpp,lzo" |
||
− | $ wget ftp://ftp.gnu.org/pub/gnu/gzip/gzip-1.6.tar.xz |
||
+ | $ eval $(pump --startup) |
||
− | $ tar xf gzip-1.6.tar.xz |
||
− | $ cd gzip-1.6 |
||
− | $ ./configure |
||
− | $ pump make -j2 CC="distcc gcc -std=gnu99" |
||
+ | ここで、通常どおり {{ic|makepkg}} を呼び出します。 |
||
− | 上記例では distcc の pump モードによって2つのコンパイルスレッドを使って gzip をコンパイルします。{{ic|-j}} の設定については [https://cdn.rawgit.com/distcc/distcc/master/doc/web/faq.html What -j level to use?] を見て下さい。 |
||
+ | 終了したら、必要に応じて Pump を停止します: |
||
− | === Makepkg === |
||
+ | $ pump --shutdown |
||
− | 通常通り makepkg でコンパイルしてください。 |
||
+ | {{tip|{{ic|makepkg}} を {{ic|pump}} で呼び出すと、{{ic|makepkg}} の終了後にインクルードサーバーが自動的に閉じられます。}} |
||
− | ==進捗を見る== |
||
− | 複数の方法で進行状況を確認することができます。 |
||
− | #distccmon-text |
||
− | #ログファイルを tail で表示する |
||
+ | === makepkg を使用しない場合 === |
||
− | distccmon-text を実行してコンパイル状況をチェックします: |
||
− | {{bc|$ distccmon-text |
||
− | 29291 Preprocess probe_64.c 192.168.0.2[0] |
||
− | 30954 Compile apic_noop.c 192.168.0.2[0] |
||
− | 30932 Preprocess kfifo.c 192.168.0.2[0] |
||
− | 30919 Compile blk-core.c 192.168.0.2[1] |
||
− | 30969 Compile i915_gem_debug.c 192.168.0.2[3] |
||
− | 30444 Compile block_dev.c 192.168.0.3[1] |
||
− | 30904 Compile compat.c 192.168.0.3[2] |
||
− | 30891 Compile hugetlb.c 192.168.0.3[3] |
||
− | 30458 Compile catalog.c 192.168.0.4[0] |
||
− | 30496 Compile ulpqueue.c 192.168.0.4[2] |
||
− | 30506 Compile alloc.c 192.168.0.4[0] |
||
− | }} |
||
+ | ==== Plain mode の例 ==== |
||
− | プログラムを持続的に実行させるには、watch を使うか、コマンドに空白と繰り返す待機秒数を加えます: |
||
− | $ watch distccmon-text |
||
− | または |
||
− | $ distccmon-text 2 |
||
+ | [[#makepkg を使用しない場合]] で説明されている 2 つの変数をエクスポートした後、コンパイラを呼び出すだけです: |
||
− | デーモンで {{ic|/var/log/messages.log}} を tail することもできます: |
||
− | # tail -f /var/log/messages.log |
||
+ | $ make -j44 |
||
− | ==distcc で "クロスコンパイル"== |
||
− | === X86 === |
||
+ | 一部のプログラムでは、適切に動作するために CC 変数または CXX 変数、あるいはその両方を定義する必要がある場合があります: |
||
− | 現在、x86_64 環境から i686 のパッケージをビルドするのに、distcc でクラスタに作業を分散させる方法は2つ存在します。どちらも理想的とは言いがたいですが、今のところ、この2つの方法しかドキュメントになっていません。 |
||
+ | $ make -j44 CC=distcc CXX=distcc |
||
− | An ideal setup is one that uses the unmodified ARCH packages for distccd running only once one each node regardless of building from the native environment or from within a chroot AND one that works with makepkg. Again, this Utopian setup is not currently known. |
||
+ | ==== Pump mode の例 ==== |
||
− | A [https://bbs.archlinux.org/viewtopic.php?id=129762 discussion thread] has been started on the topic; feel free to contribute. |
||
+ | 上図のように Pump を始動します。コンパイルは Plain mode の例と変わりません。 |
||
− | ==== Chroot を使う方法 (推奨) ==== |
||
− | {{Note|This method works, but is not very elegant requiring duplication of distccd on all nodes AND need to have a 32-bit chroots on all nodes.}} |
||
+ | === CMake を使用する場合 === |
||
− | [[64ビット環境に32ビット環境をインストール|32ビットの chroot]] を distcc クラスタの'''各ノード'''に設定したら、各ノードで2つの distccd インスタンスを別々のポートで実行させます。片方はネイティブの x86_64 環境で実行させ、もう片方は x86 chroot で動かします。makepkg は [[64ビット環境に32ビット環境をインストール#Schroot|schroot コマンド]]を通して実行します。 |
||
+ | distcc で CMake ベースのプロジェクトをビルドするには、次の CMake オプションを使用します: |
||
− | ===== i686 chroot の DISTCC_HOSTS にポート番号を追加する ===== |
||
− | Append the port number defined eariler (3692) to each of the hosts in {{ic|/opt/arch32/etc/makepkg.conf}} as follows: |
||
+ | $ cmake -DCMAKE_C_COMPILER_LAUNCHER=distcc -DCMAKE_CXX_COMPILER_LAUNCHER=distcc ... |
||
− | DISTCC_HOSTS="192.168.1.101/5:3692 192.168.1.102/5:3692 192.168.1.103/3:3692" |
||
+ | == 進捗を見る == |
||
− | {{Note|This only needs to be setup on the "master" i686 chroot. Where "master" is defined as the one from which the compilation will take place.}} |
||
+ | {{Pkg|distcc}} には、コンパイルステータスをチェックするために使用できる cli モニター {{ic|distccmon-text}} が付属しています。 |
||
− | ===== ネイティブ環境から makepkg を呼び出す ===== |
||
+ | cliモニターは、繰り返しクエリーを待つ秒数に相当するスペースと整数をコマンドに付加することで、連続的に実行できます: |
||
− | ネイティブの x86_64 環境に [[64ビット環境に32ビット環境をインストール#Schroot|schroot]] をセットアップしてください。ネイティブの x86_64 環境から makepkg を実行して i686 パッケージのビルドをするには: |
||
+ | {{hc|$ distccmon-text 3| |
||
− | $ schroot -p -- makepkg -src |
||
+ | 29291 Preprocess probe_64.c 192.168.10.2[0] |
||
+ | 30954 Compile apic_noop.c 192.168.10.2[0] |
||
+ | 30932 Preprocess kfifo.c 192.168.10.2[0] |
||
+ | 30919 Compile blk-core.c 192.168.10.2[1] |
||
+ | 30969 Compile i915_gem_debug.c 192.168.10.2[3] |
||
+ | 30444 Compile block_dev.c 192.168.10.3[1] |
||
+ | 30904 Compile compat.c 192.168.10.3[2] |
||
+ | 30891 Compile hugetlb.c 192.168.10.3[3] |
||
+ | 30458 Compile catalog.c 192.168.10.4[0] |
||
+ | 30496 Compile ulpqueue.c 192.168.10.4[2] |
||
+ | 30506 Compile alloc.c 192.168.10.4[0] |
||
+ | }} |
||
+ | == distcc でクロスコンパイル == |
||
− | ==== Multilib GCC を使う方法 (非推奨) ==== |
||
− | {{Warning|Errors have been reported when using this method to build the i686 linux package from a native x86_64 system! The chroot method is preferred and has been verified to work building the kernel packages.}} |
||
+ | distcc を使用すると、クロスコンパイルを支援できます: |
||
− | {{ic|/etc/pacman.conf}} を編集して [multilib] リポジトリをアンコメントしてください: |
||
+ | * ターゲットアーキテクチャを実行しているマシンをクライアントとして使用する必要があります。 |
||
− | [multilib] |
||
+ | * 非ネイティブアーキテクチャのボランティアがコンパイルを支援しますが、対応するツールチェーンがインストールされていて、それを指す distccd が必要です。 |
||
− | Include = /etc/pacman.d/mirrorlist |
||
+ | === クライアントとしての Arch Linux ARM (ボランティアとしての x86_64) === |
||
− | [[公式リポジトリ]]から {{pkg|gcc-multilib}} を[[pacman|インストール]]してください。 |
||
+ | このセクションでは、Arch Linux (x86_64) ボランティアを使用して Arch ARM デバイスのクロスコンパイルを支援する方法について詳しく説明します。ARM デバイスのコンパイルを支援する 1 台の x86_64 マシンだけで 2 〜 4 倍程度の速度向上が実現できるという証拠については、[https://github.com/graysky2/distccd-alarm これらのテスト] を参照してください。 |
||
− | {{ic|$HOME/.makepkg.conf}} に以下の行を追加するだけで x86_64 で i686 用のパッケージをコンパイルできます: |
||
− | CARCH="i686" |
||
− | CHOST="i686-pc-linux-gnu" |
||
− | CFLAGS="-march=i686 -O2 -pipe -m32" |
||
− | CXXFLAGS="${CFLAGS}" |
||
+ | ==== ボランティア ==== |
||
− | 次のコマンドで makepkg を呼び出して下さい: |
||
− | $ linux32 makepkg -src |
||
+ | Arch ARM 開発者は、x86_64 ボランティアにインストールする必要がある公式プロジェクト [https://archlinuxarm.org/wiki/Distcc_Cross-Compiling ツールチェーン] を使用することを ''強く'' 推奨します。これらを手動で管理するのではなく、[[AUR]] は 2 つのツールチェーンと構成および systemd サービス ユニットを提供します。 |
||
− | i686 パッケージをコンパイルし終わった後は {{ic|$HOME/.makepkg.conf}} を忘れずに削除または修正してください。 |
||
+ | * {{AUR|distccd-alarm-armv7h}} |
||
− | === 他のアーキテクチャ === |
||
+ | * {{AUR|distccd-alarm-armv8}} |
||
+ | arm/arm64 ツールチェーンを含むボランティアのセットアップは、構成と systemd サービスファイルの名前がそれぞれのパッケージの名前と一致することを除いて、[[#ボランティア]] と同じです。たとえば、''armv7h'' の場合、設定ファイルは {{ic|/etc/conf.d/distccd-'''armv7h''}} で、systemd サービスユニットは {{ic|distccd-''armv7h''.service}} です。 |
||
− | 他のアーキテクチャを対象にクロスコンパイルを行いたい場合、スレーブ上にクロスコンパイル環境をインストールする必要があります。クロスコンパイルツールチェインをビルドするか、設定済みのツールチェインを使って下さい。このセクションでは主として ARM のクロスコンパイルツールチェインを扱っていますが、ほとんどの場合、他のアーキテクチャにも適用できるはずです。ツールチェインを入手する方法は複数存在します: |
||
+ | 各ツールチェーンは固有のポート上で実行されるため、必要に応じて 4 つすべてがボランティア上で共存できることに注意してください。[[:カテゴリ:ファイアウォール]] と {{man|1|distcc}} を参照して、distcc が実行されているポートへのトラフィックを必ず許可してください。 |
||
− | * [https://embtoolkit.org/ EmbToolkit]: クロスコンパイルツールチェインを作成するためのツール。ARM と MIPS アーキテクチャをサポートしており、LLVM ベースのツールチェインのビルドをサポートしています。 |
||
− | * [http://crosstool-ng.org/ crosstool-ng]: EmbToolkit と同じようなツール。EmbToolkit よりも多数のアーキテクチャをサポートしています (詳しくはウェブサイトを参照)。 |
||
− | * [https://www.linaro.org/downloads/ Linaro]: ARM 開発用のツールチェインを提供しています。 |
||
+ | {| class="wikitable" align="center" |
||
− | {{ic|EmbToolkit}} にはツールチェインを設定するためのグラフィカルな設定メニュー ({{ic|make xconfig}}) が付属しています。 |
||
+ | |- |
||
+ | ! ターゲットアーキテクチャ !! Distcc ポート |
||
+ | |- |
||
+ | | ''armv7h'' || 3635 |
||
+ | |- |
||
+ | | ''armv8h/aarch64'' || 3636 |
||
+ | |- |
||
+ | |} |
||
+ | ==== クライアント ==== |
||
− | クロスコンパイラフォルダにするツリーの全てのフォルダについて others グループの実行ビットを設定してください。また、others グループのユーザーがコンパイラコマンドを実行できるようにしてください。この設定は distcc デーモンが基本的にユーザー {{ic|nobody}} として起動されるために必要になります ({{ic|/lib/systemd/system/distccd.service}} からユーザーを変更できます)。 |
||
+ | Arch ARM クライアントをセットアップする最も簡単な方法は、{{AUR|distccd-arch-arm}} を使用することです。これは、Arch ARM の 4 つのフレーバーすべてをカバーする 4 つの構成すべてと systemd サービスユニットを提供します。たとえば、Arch ARM クライアントが ''armv7h'' イメージを実行している場合は、必要に応じて {{ic|/etc/conf.d/distccd-'''armv7h'''}} を編集し、そのデフォルトを変更します。ビルドの準備ができたら、{{ic|distccd-'''armv7h'''.service}} [[有効化]] してコンパイルします。 |
||
− | 通常、実行可能ファイルにはプリフィックスが付きます。例えば {{ic|gcc}} は以下のようになります: {{ic|arm-unknown-linux-gnueabihf-gcc}}。distcc が使用する名前と一致するように、バイナリファイルが存在するフォルダで以下のスクリプトを実行してください: |
||
+ | より詳細なチュートリアルについては、[https://github.com/graysky2/distccd-arch-arm#usage-examples use-examples] を参照してください。 |
||
− | {{hc|create_links.sh|<nowiki> |
||
− | #!/bin/bash |
||
− | for file in `ls`; do |
||
− | if [[ "$file" == "link" ]]; then |
||
− | continue |
||
− | fi |
||
− | ln -s $file ${file#$1} |
||
− | done |
||
− | if [[ ! -f cc ]]; then |
||
− | ln -s $1gcc cc |
||
− | fi |
||
− | </nowiki>}} |
||
+ | 上記の AUR パッケージを使用せずにクライアントをセットアップしたい場合、クライアントの手動セットアップは [[#クライアント]] と同じですが、次の 2 つのファイルを変更してボランティアが使用する非標準ポートを定義する必要がある点が異なります。AUR パッケージを使用する場合は、上の表を参照してください。 |
||
− | スクリプトに実行可能属性を付与してから: |
||
+ | # {{ic|/etc/conf.d/distccd}}:armv7h マシンの例: {{ic|1=DISTCC_ARGS="--allow-private --log-level info --log-file /tmp/distccd-armv7h.log --port 3635"}} |
||
− | $ chmod +x create_links.sh |
||
+ | # {{ic|/etc/makepkg.conf}}: armv7h マシンの例: {{ic|1=DISTCC_HOSTS="192.168.10.2/5:3635 192.168.10.3/5:3635"}} |
||
+ | ===== ARM クライアント上の localhost に関する注意事項 ===== |
||
− | スクリプトを実行してください: |
||
+ | x86_64 ボランティアを使用して Arch ARM デバイス上に構築する場合、多くの ARM デバイスには必要な処理能力がないため、{{ic|localhost}} ディレクティブを {{ic|DISTCC_HOSTS}} から除外することを強くお勧めします。 |
||
− | $ ./create_links.sh arm-cortex_a8-linux-gnueabihf- |
||
+ | この効果を説明するために、Linux カーネルバージョン 5.10.44' のイメージターゲットをコンパイルする次の例を考えてみましょう。クライアントは RPi4B (aarch64) で、ボランティア (192.168.1.288) はクアッドコア/ハイパースレッドの Intel マシンです。各コンパイルジョブは 1 回だけ実行され、その合間に {{ic|make clean}} が実行されました。 |
||
− | 最初にクロスコンパイラが見つけられるように distcc のパスの設定を変更します: |
||
+ | {| class="wikitable" |
||
− | {{hc|/etc/conf.d/distccd|2= |
||
+ | |+ Running make -j15 Image CC=distcc CXX=distcc |
||
− | # |
||
+ | |- |
||
− | # Parameters to be passed to distccd |
||
+ | ! DISTCC_HOSTS= !! タイム (mm:ss) !! Fold slower |
||
− | # |
||
+ | |- |
||
− | # You must explicitly add IPs (or subnets) that are allowed to connect, |
||
+ | | "192.168.1.288:3636/9" || 6:50 || - |
||
− | # using the --allow switch. See the distccd manpage for more info. |
||
+ | |- |
||
− | # |
||
+ | | "localhost/5 192.168.1.288:3636/9" || 10:34 || 2.8x |
||
− | PATH=/home/martin/abs/embtoolkit-1.7.0/generated/tools-arm-linux-cortex-a8/bin:${PATH} |
||
+ | |- |
||
− | DISTCC_ARGS="--allow 10.42.0.0/24 --verbose" |
||
+ | | "192.168.1.288:3636/9 localhost/5" || 10:13 || 2.7x |
||
− | }} |
||
+ | |} |
||
+ | === クライアントとしての Arch Linux (x86_64) (ボランティアとしての Arch ARM) === |
||
− | それから {{ic|distcc.service}} を[[再起動]]してください。 |
||
+ | このセクションでは、Arch ARM ボランティアを使用して x86_64 クライアントのクロスコンパイルを支援する方法について詳しく説明します。コンパイル時間が大幅に長くなる可能性があることを示す証拠については、[https://github.com/graysky2/crosstool-ng_for_distcc#real-speed-gains-compiling-x86-64-can-be-realized-with-arm-volunteers these testing] を参照してください。Arch ARM ボランティアを 1 人でも使用すると速度が向上し、最大 2 つでその効果が 2 倍になります。 |
||
− | ==トラブルシューティング== |
||
− | === |
+ | ==== クライアント ==== |
+ | クライアントのセットアップは [[#クライアント]] と同じで、distcc は標準ポート 3632 で実行されます。 |
||
− | 問題が発生したときは {{ic|journalctl}} を使って原因を確認してください: |
||
+ | ==== ボランティア ==== |
||
− | $ journalctl $(which distccd) -e --since "5 min ago" |
||
+ | {{AUR|distccd-x86_64}} は、クロスコンパイルを可能にするために Arch ARM デバイスにインストールするツールチェーンを提供します。 |
||
− | === code 110 === |
||
+ | === 追加のツールチェーン === |
||
− | distcc デーモンのプロセスが起動されるユーザーアカウント (デフォルトは nobody) でツールチェインが正しく機能することを確認してください。以下ではユーザー nobody でツールチェインが動作することをテストします。{{ic|/etc/passwd}} で nobody ユーザーのログインを以下のように変更してください: |
||
+ | * [https://embtoolkit.org/ EmbToolkit]: クロスコンパイルツールチェインを作成するためのツール。ARM と MIPS アーキテクチャをサポートしており、LLVM ベースのツールチェインのビルドをサポートしています。 |
||
− | {{hc|$ cat /etc/passwd| |
||
+ | * [http://crosstool-ng.org/ crosstool-ng]: EmbToolkit と同じようなツール。EmbToolkit よりも多数のアーキテクチャをサポートしています (詳しくはウェブサイトを参照)。 |
||
− | ... |
||
+ | * [https://www.linaro.org/downloads/ Linaro]: ARM 開発用のツールチェインを提供しています。 |
||
− | nobody:x:99:99:nobody:/:/bin/bash |
||
− | ... |
||
− | }} |
||
+ | {{ic|EmbToolkit}} にはツールチェインを設定するためのグラフィカルな設定メニュー ({{ic|make xconfig}}) が付属しています。 |
||
− | それからクロスコンパイラのバイナリが存在するディレクトリに cd してからコンパイラの実行を試行します: |
||
+ | ==トラブルシューティング== |
||
− | # su nobody |
||
− | $ ./gcc --version |
||
− | bash: ./gcc: Permission denied |
||
+ | === ArchLinux カーネルパッケージをコンパイルするコツ === |
||
− | 上記のエラーが発生する場合、[[#他のアーキテクチャ]] に記述されているグループパーミッションの設定を正しく行ったか確認してください。 |
||
+ | 公式の PKGBUILD (または AUR からの多く)からカーネルをビルドする場合は、ビルドコマンドの一部としてCC=distcc 変数と CXX=distcc 変数を渡すように PKGBUILD を編集する必要があります。 |
||
+ | make bzImage modules htmldocs CC=distcc CXX=distcc |
||
− | 変更を行った後は {{ic|/etc/passwd}} を元に戻すようにしましょう。 |
||
+ | |||
+ | これを行わないと、ビルド中に distcc が機能しなくなります。 {{Bug|64275}} を参照してください。 |
||
+ | |||
+ | === chromium をコンパイルするコツ === |
||
+ | clang を使用する {{pkg|chromium}} のコンパイルは、現在 [https://github.com/distcc/distcc/issues/368 issue#386] の影響を受けています。 バグを回避するには、 [https://blogs.igalia.com/jaragunde/2018/06/13/chromium-official-release-builds] に従って PKGBUILD の {{ic|_flags}} 配列に以下を追加します。 [https://blogs.igalia.com/jaragunde/2018/06/13/chromium-official-release-builds-and-icecc/ こちら] ブログ: |
||
+ | 'clang_use_default_sample_profile=false' |
||
+ | 'is_cfi=false' |
||
+ | |||
+ | === Journalctl === |
||
+ | |||
+ | 問題が発生したときは {{ic|journalctl}} を使って原因を確認してください: |
||
+ | |||
+ | $ journalctl $(which distccd) -e --since "5 min ago" |
||
===ログレベルを設定する=== |
===ログレベルを設定する=== |
||
262行目: | 263行目: | ||
DISTCC_ARGS="--user nobody --allow 192.168.0.0/24 --log-level error --log-file /tmp/distccd.log" |
DISTCC_ARGS="--user nobody --allow 192.168.0.0/24 --log-level error --log-file /tmp/distccd.log" |
||
+ | ===$HOME/.distcc を移動して HDD/SSD の使用量を制限する=== |
||
− | ===CMake などのツールでビルドが失敗する=== |
||
− | CMake はときどき gcc に [http://gcc.gnu.org/wiki/Response_Files "レスポンスファイル"] を渡すことがありますが、distcc はレスポンスファイルを扱うことができません。[http://code.google.com/p/distcc/issues/detail?id=85&q=response パッチファイル] は存在しているのですが、上流のコードには適用されていないようです。この問題が発生する場合は、このファイルをパスするか [[AUR]] の {{AUR|distcc-rsp}} パッケージを使って下さい。 |
||
− | |||
− | ===HDD/SSD の使用量を制限する=== |
||
− | ====$HOME/.distcc を移動する==== |
||
デフォルトでは、distcc は {{ic|$HOME/.distcc}} を作成して、一時的に情報を保存してノードにコンパイルさせる作業を割り当てます。{{ic|/tmp}} などの RAM に ''.distcc'' という名前のディレクトリを作成して $HOME の ''.distcc'' にソフトリンクします。これで無駄な HDD の読み書きが減ります。特に SSD の場合は効果的です。 |
デフォルトでは、distcc は {{ic|$HOME/.distcc}} を作成して、一時的に情報を保存してノードにコンパイルさせる作業を割り当てます。{{ic|/tmp}} などの RAM に ''.distcc'' という名前のディレクトリを作成して $HOME の ''.distcc'' にソフトリンクします。これで無駄な HDD の読み書きが減ります。特に SSD の場合は効果的です。 |
||
277行目: | 274行目: | ||
d /tmp/.distcc 0755 <username> users - |
d /tmp/.distcc 0755 <username> users - |
||
</nowiki>}} |
</nowiki>}} |
||
+ | |||
+ | === distccd-alarm の場合 === |
||
+ | ==== No such file or directory ==== |
||
+ | 次のようなエラーは、ユーザが {{pkg|distcc}} によって提供される distccd サービスを誤って実行しており、 distccd-alarm パッケージ (つまり、{{AUR|distccd-alarm-armv5}}、 {{AUR|distccd-alarm-armv6h}}、{{AUR|distccd-alarm-armv7h}}、 または {{AUR|distccd-alarm-armv8}}です。) によって提供されていないことを示します。 |
||
+ | |||
+ | ターゲットアーキテクチャに適したサービスを開始してください。 |
||
+ | |||
+ | {{bc|distcc[25479] (dcc_execvp) ERROR: failed to exec armv7l-unknown-linux-gnueabihf-g++: No such file or directory |
||
+ | }} |
||
+ | |||
+ | === distccd.service の起動時に Avahi-daemon が発行を停止する === |
||
+ | |||
+ | {{Accuracy|This does not fix anything if the user [https://wiki.archlinux.jp/index.php/Systemd#.E3.83.A6.E3.83.8B.E3.83.83.E3.83.88.E3.82.92.E4.BD.BF.E3.81.86 再起動]s the service later.}} |
||
+ | |||
+ | {{ic|distccd.service}} をサービスとして起動すると、 {{ic|avahi-daemon}} の動作が停止する場合があります。これは、 {{ic|avahi-daemon.service}} のユニットファイル ([https://wiki.archlinux.jp/index.php/Systemd#.E3.83.A6.E3.83.8B.E3.83.83.E3.83.88.E3.83.95.E3.82.A1.E3.82.A4.E3.83.AB.E3.81.AE.E7.B7.A8.E9.9B.86 ユニットファイルの編集] を参照してください。) を編集し、 {{ic|[Unit]}} セクションの最後に {{ic|1=After=distccd.service}} を追加することで、 {{ic|avahi-daemon.service}} が {{ic|distccd.service}} の後に開始されるようにすることで軽減できます。 |
||
+ | |||
+ | {{hc|1=/etc/systemd/system/avahi-daemon.service|2 =... |
||
+ | |||
+ | [Unit] |
||
+ | Description=Avahi mDNS/DNS-SD Stack |
||
+ | Requires=avahi-daemon.socket |
||
+ | After=distccd.service |
||
+ | |||
+ | ...}} |
||
+ | |||
+ | == 参照 == |
||
+ | |||
+ | * https://github.com/distcc/distcc |
||
+ | |||
+ | * {{AUR|icecream}} - An easier to configure fork of distcc. |
2024年5月8日 (水) 18:39時点における最新版
distcc は C, C++, Objective C, Objective C++ のコードのビルドをネットワーク上の複数のマシンに分散させるプログラムです。distcc は常にローカルビルドと同じ結果を生成し、インストールと使用方法がシンプルで、ローカルコンパイルよりもずっと高速です。makepkg などの Arch のビルドツールで使うことができます。
用語
- クライアント
- クライアントは、コンパイルを開始するコンピューターです。
- ボランティア
- ボランティアは、クライアントから送信されたコンパイル要求を受け入れるコンピューターです。複数のボランティアをセットアップすることも、単一のボランティアをセットアップすることもできます。
インストール
クラスタの PC 全てに distcc パッケージをインストールしてください。
他のディストロや、Cygwin を使用する Windows など他の OS を使う場合は、distcc のドキュメント を参照してください。
設定
動作モード
Distcc は、Plain mode (デフォルト) または Pump モードで実行できます。大まかに言えば、主な違いは、distcc が前処理されたソースを処理する方法にあります。Plain mode では、完全なソースとコンパイラ引数が転送されます。前処理はクライアント上で保持されます。Pump モードでは、前処理とコンパイルの両方が distcc クラスターに分散され、多くの場合、より効率的かつ高速になります。詳細については、distcc(1) を参照してください。
ボランティア
ボランティアの設定は /etc/conf.d/distccd
に保存されます。少なくとも、多くの ipv4 プライベートネットワーク範囲をカバーする --allow-private
スイッチを追加するか、ipv6 対応ネットワークがある場合は ipv6 CIDR で --allow
を使用します。ファイルへのログ記録は、必要に応じてトラブルシューティングにも役立ちます。
DISTCC_ARGS="--allow-private --log-file /tmp/distccd.log"
または、IPv6 アクセスを許可する必要があり、ネットワーク CIDR が /64 である場合:
DISTCC_ARGS="--allow-private --allow aaaa:bbbb:cccc:dddd:eeee:::/64 --log-file /tmp/distccd.log"
マシン上に複数のインターフェイスが存在する場合は、--listen ADDRESS
オプションも渡すことを検討してください。他のオプションも定義できます。distccd(1) を参照してください。
参加しているすべてのボランティアの distccd.service
を 起動/有効化 します。
クライアント
makepkg を使用する場合
次のセクションの /etc/makepkg.conf
を編集します。
BUILDENV
配列には distcc をアンバンする必要があります。つまり、感嘆符なしでリストする必要があります。DISTCC_HOSTS
行のコメントを解除し、ボランティアのホスト名または IP アドレスを追加します。必要に応じて、この後にスラッシュと使用するスレッドの最大数を続けます。後続のノードは空白で区切る必要があります。このリストは、最も強力なものから (処理能力) の順に並べる必要があります。- サーバーあたりの最大スレッド数の約 2 倍に相当するように
MAKEFLAGS
変数を調整します。以下の例では、2x(9+5+5+3)=44 となります。
真に汎用的な設定は存在しないことに注意してください。1 つ試してテストし、結果を他の設定と比較します。以下に、一般的な設定をいくつか示します。
Plain mode の例
BUILDENV=(distcc fakeroot color !ccache check !sign) MAKEFLAGS="-j44" DISTCC_HOSTS="localhost/9 192.168.10.2/5 192.168.10.3/5 192.168.10.4/3"
Pump mode の例
BUILDENV=(distcc fakeroot color !ccache check !sign) MAKEFLAGS="-j70" DISTCC_HOSTS="localhost/9 192.168.10.2,cpp,lzo 192.168.10.3,cpp,lzo 192.168.10.4,cpp,lzo"
ここで注意すべき点がいくつかあります。
- Pump mode は、一般に、Plain mode よりも、
MAKEFLAGS
の 値が高い方が良い性能を発揮します。 - Pump mode では、IPまたはホスト名は、Pump mode が要求するように、リテラル ',cpp,lzo' でサフィックスされます。さらに、この例の localhost はそうなっていません。これは、distcc が 9 つのジョブが定義された localhost をロードし、より積極的に有志にコード生成を分配することを意味します。より大規模なクラスタでは、クラスタへの分散処理を可能にするために、localhost 上のローカルジョブの数をより少なく制限したいと思うかもしれません。また、localhost の接尾辞に,cpp,lzo を使用することもできます。
- 前述したように、すべての distcc クラスタで効率的に動作する単一の設定はありません/最適な設定の決定は、テストとベンチマークを通じて経験的に導き出されます。
makepkg を使用しない場合
Plain mode の例
クライアント上の distcc の最小設定には、利用可能なボランティアの設定と PATH
の再定義が含まれます。
$ export PATH="/usr/lib/distcc/bin:$PATH" $ export DISTCC_HOSTS="localhost/9 192.168.10.2/5 192.168.10.3/5 192.168.10.4/3"
Pump mode の例
$ export PATH="/usr/lib/distcc/bin:$PATH" $ export DISTCC_HOSTS="localhost/9 192.168.10.2,cpp,lzo 192.168.10.3,cpp,lzo 192.168.10.4,cpp,lzo"
コンパイル
makepkg を使用する場合
Plain mode の例
/etc/makepkg.conf
が設定されたら、特別な手順は必要ありません。通常どおり makepkg を呼び出すだけです。
Pump mode の例
ユーザーは、makepkg を使用するかシェル上でコンパイルする前に Pump を開始する必要があります。Pump には、正しく設定された一連の DISTCC_HOSTS
があることを確認するチェックが含まれているため、最初に偽の DISTCC_HOSTS
行を定義する必要があります。makepkg は、/etc/makepkg.conf
で指定された値を使用することに注意してください。
$ export DISTCC_HOSTS="localhost,cpp,lzo" $ eval $(pump --startup)
ここで、通常どおり makepkg
を呼び出します。
終了したら、必要に応じて Pump を停止します:
$ pump --shutdown
makepkg を使用しない場合
Plain mode の例
#makepkg を使用しない場合 で説明されている 2 つの変数をエクスポートした後、コンパイラを呼び出すだけです:
$ make -j44
一部のプログラムでは、適切に動作するために CC 変数または CXX 変数、あるいはその両方を定義する必要がある場合があります:
$ make -j44 CC=distcc CXX=distcc
Pump mode の例
上図のように Pump を始動します。コンパイルは Plain mode の例と変わりません。
CMake を使用する場合
distcc で CMake ベースのプロジェクトをビルドするには、次の CMake オプションを使用します:
$ cmake -DCMAKE_C_COMPILER_LAUNCHER=distcc -DCMAKE_CXX_COMPILER_LAUNCHER=distcc ...
進捗を見る
distcc には、コンパイルステータスをチェックするために使用できる cli モニター distccmon-text
が付属しています。
cliモニターは、繰り返しクエリーを待つ秒数に相当するスペースと整数をコマンドに付加することで、連続的に実行できます:
$ distccmon-text 3
29291 Preprocess probe_64.c 192.168.10.2[0] 30954 Compile apic_noop.c 192.168.10.2[0] 30932 Preprocess kfifo.c 192.168.10.2[0] 30919 Compile blk-core.c 192.168.10.2[1] 30969 Compile i915_gem_debug.c 192.168.10.2[3] 30444 Compile block_dev.c 192.168.10.3[1] 30904 Compile compat.c 192.168.10.3[2] 30891 Compile hugetlb.c 192.168.10.3[3] 30458 Compile catalog.c 192.168.10.4[0] 30496 Compile ulpqueue.c 192.168.10.4[2] 30506 Compile alloc.c 192.168.10.4[0]
distcc でクロスコンパイル
distcc を使用すると、クロスコンパイルを支援できます:
- ターゲットアーキテクチャを実行しているマシンをクライアントとして使用する必要があります。
- 非ネイティブアーキテクチャのボランティアがコンパイルを支援しますが、対応するツールチェーンがインストールされていて、それを指す distccd が必要です。
クライアントとしての Arch Linux ARM (ボランティアとしての x86_64)
このセクションでは、Arch Linux (x86_64) ボランティアを使用して Arch ARM デバイスのクロスコンパイルを支援する方法について詳しく説明します。ARM デバイスのコンパイルを支援する 1 台の x86_64 マシンだけで 2 〜 4 倍程度の速度向上が実現できるという証拠については、これらのテスト を参照してください。
ボランティア
Arch ARM 開発者は、x86_64 ボランティアにインストールする必要がある公式プロジェクト ツールチェーン を使用することを 強く 推奨します。これらを手動で管理するのではなく、AUR は 2 つのツールチェーンと構成および systemd サービス ユニットを提供します。
arm/arm64 ツールチェーンを含むボランティアのセットアップは、構成と systemd サービスファイルの名前がそれぞれのパッケージの名前と一致することを除いて、#ボランティア と同じです。たとえば、armv7h の場合、設定ファイルは /etc/conf.d/distccd-'armv7h
で、systemd サービスユニットは distccd-armv7h.service
です。
各ツールチェーンは固有のポート上で実行されるため、必要に応じて 4 つすべてがボランティア上で共存できることに注意してください。カテゴリ:ファイアウォール と distcc(1) を参照して、distcc が実行されているポートへのトラフィックを必ず許可してください。
ターゲットアーキテクチャ | Distcc ポート |
---|---|
armv7h | 3635 |
armv8h/aarch64 | 3636 |
クライアント
Arch ARM クライアントをセットアップする最も簡単な方法は、distccd-arch-armAUR を使用することです。これは、Arch ARM の 4 つのフレーバーすべてをカバーする 4 つの構成すべてと systemd サービスユニットを提供します。たとえば、Arch ARM クライアントが armv7h イメージを実行している場合は、必要に応じて /etc/conf.d/distccd-armv7h
を編集し、そのデフォルトを変更します。ビルドの準備ができたら、distccd-armv7h.service
有効化 してコンパイルします。
より詳細なチュートリアルについては、use-examples を参照してください。
上記の AUR パッケージを使用せずにクライアントをセットアップしたい場合、クライアントの手動セットアップは #クライアント と同じですが、次の 2 つのファイルを変更してボランティアが使用する非標準ポートを定義する必要がある点が異なります。AUR パッケージを使用する場合は、上の表を参照してください。
/etc/conf.d/distccd
:armv7h マシンの例:DISTCC_ARGS="--allow-private --log-level info --log-file /tmp/distccd-armv7h.log --port 3635"
/etc/makepkg.conf
: armv7h マシンの例:DISTCC_HOSTS="192.168.10.2/5:3635 192.168.10.3/5:3635"
ARM クライアント上の localhost に関する注意事項
x86_64 ボランティアを使用して Arch ARM デバイス上に構築する場合、多くの ARM デバイスには必要な処理能力がないため、localhost
ディレクティブを DISTCC_HOSTS
から除外することを強くお勧めします。
この効果を説明するために、Linux カーネルバージョン 5.10.44' のイメージターゲットをコンパイルする次の例を考えてみましょう。クライアントは RPi4B (aarch64) で、ボランティア (192.168.1.288) はクアッドコア/ハイパースレッドの Intel マシンです。各コンパイルジョブは 1 回だけ実行され、その合間に make clean
が実行されました。
DISTCC_HOSTS= | タイム (mm:ss) | Fold slower |
---|---|---|
"192.168.1.288:3636/9" | 6:50 | - |
"localhost/5 192.168.1.288:3636/9" | 10:34 | 2.8x |
"192.168.1.288:3636/9 localhost/5" | 10:13 | 2.7x |
クライアントとしての Arch Linux (x86_64) (ボランティアとしての Arch ARM)
このセクションでは、Arch ARM ボランティアを使用して x86_64 クライアントのクロスコンパイルを支援する方法について詳しく説明します。コンパイル時間が大幅に長くなる可能性があることを示す証拠については、these testing を参照してください。Arch ARM ボランティアを 1 人でも使用すると速度が向上し、最大 2 つでその効果が 2 倍になります。
クライアント
クライアントのセットアップは #クライアント と同じで、distcc は標準ポート 3632 で実行されます。
ボランティア
distccd-x86_64AUR は、クロスコンパイルを可能にするために Arch ARM デバイスにインストールするツールチェーンを提供します。
追加のツールチェーン
- EmbToolkit: クロスコンパイルツールチェインを作成するためのツール。ARM と MIPS アーキテクチャをサポートしており、LLVM ベースのツールチェインのビルドをサポートしています。
- crosstool-ng: EmbToolkit と同じようなツール。EmbToolkit よりも多数のアーキテクチャをサポートしています (詳しくはウェブサイトを参照)。
- Linaro: ARM 開発用のツールチェインを提供しています。
EmbToolkit
にはツールチェインを設定するためのグラフィカルな設定メニュー (make xconfig
) が付属しています。
トラブルシューティング
ArchLinux カーネルパッケージをコンパイルするコツ
公式の PKGBUILD (または AUR からの多く)からカーネルをビルドする場合は、ビルドコマンドの一部としてCC=distcc 変数と CXX=distcc 変数を渡すように PKGBUILD を編集する必要があります。
make bzImage modules htmldocs CC=distcc CXX=distcc
これを行わないと、ビルド中に distcc が機能しなくなります。 FS#64275 を参照してください。
chromium をコンパイルするコツ
clang を使用する chromium のコンパイルは、現在 issue#386 の影響を受けています。 バグを回避するには、 [1] に従って PKGBUILD の _flags
配列に以下を追加します。 こちら ブログ:
'clang_use_default_sample_profile=false' 'is_cfi=false'
Journalctl
問題が発生したときは journalctl
を使って原因を確認してください:
$ journalctl $(which distccd) -e --since "5 min ago"
ログレベルを設定する
デフォルトでは、distcc は /var/log/messages.log
にログを出力します。このログはファイルに直接出力することができます (distccd の man ページで実際に推奨されています)。ログファイルを /tmp
を使って RAM 上に配置することも可能です。また、ログファイルに出力されるエラーのログレベルを下げることもできます。接続のエントリよりもエラーメッセージを見たいというときに有用です。LEVEL は標準的な syslog のレベルで設定でき critical, error, warning, notice, info, debug などを指定します。
以下の行を /etc/conf.d/distccd
の DISTCC_ARGS に追記してください:
DISTCC_ARGS="--user nobody --allow 192.168.0.0/24 --log-level error --log-file /tmp/distccd.log"
$HOME/.distcc を移動して HDD/SSD の使用量を制限する
デフォルトでは、distcc は $HOME/.distcc
を作成して、一時的に情報を保存してノードにコンパイルさせる作業を割り当てます。/tmp
などの RAM に .distcc という名前のディレクトリを作成して $HOME の .distcc にソフトリンクします。これで無駄な HDD の読み書きが減ります。特に SSD の場合は効果的です。
$ mv $HOME/.distcc /tmp $ ln -s /tmp/.distcc $HOME/.distcc
systemd を使って再起動時にこのディレクトリを再作成 (他のファイルと同じように手動で削除されるまでソフトリンクは消えません) します。以下の tmpfile を作成:
/etc/tmpfiles.d/tmpfs-create.conf
d /tmp/.distcc 0755 <username> users -
distccd-alarm の場合
No such file or directory
次のようなエラーは、ユーザが distcc によって提供される distccd サービスを誤って実行しており、 distccd-alarm パッケージ (つまり、distccd-alarm-armv5AUR、 distccd-alarm-armv6hAUR、distccd-alarm-armv7hAUR、 または distccd-alarm-armv8AURです。) によって提供されていないことを示します。
ターゲットアーキテクチャに適したサービスを開始してください。
distcc[25479] (dcc_execvp) ERROR: failed to exec armv7l-unknown-linux-gnueabihf-g++: No such file or directory
distccd.service の起動時に Avahi-daemon が発行を停止する
distccd.service
をサービスとして起動すると、 avahi-daemon
の動作が停止する場合があります。これは、 avahi-daemon.service
のユニットファイル (ユニットファイルの編集 を参照してください。) を編集し、 [Unit]
セクションの最後に After=distccd.service
を追加することで、 avahi-daemon.service
が distccd.service
の後に開始されるようにすることで軽減できます。
/etc/systemd/system/avahi-daemon.service
... [Unit] Description=Avahi mDNS/DNS-SD Stack Requires=avahi-daemon.socket After=distccd.service ...
参照
- icecreamAUR - An easier to configure fork of distcc.