4.4. 環境設定

作業しやすい動作環境とするために bash シェルに対するスタートアップファイルを二つ作成します。 lfs ユーザーでログインして、以下のコマンドによって .bash_profile ファイルを生成します。

cat > ~/.bash_profile << "EOF"
exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash
EOF

lfs ユーザーとしてログインした時、あるいは su コマンドとそのオプション-を使って lfs に切り替えた時、起動されるシェルはログインシェルとなります。 この時、ホストシステムの /etc/profile ファイル (おそらく環境変数がいくつか定義されている) と .bash_profile が読み込まれます。 .bash_profile ファイル内の exec env -i.../bin/bash というコマンドが、起動しているシェルを全くの空の環境として起動し直し HOMETERMPS1 という環境変数だけを設定します。 これはホストシステム内の不要な設定や危険をはらんだ設定を、ビルド環境に持ち込まないようにするためです。

新しく起動するシェルはログインシェルではなくなります。 したがってこのシェルは /etc/profile ファイルや .bash_profile ファイルの内容を読み込んで実行することはなく、代わりに .bashrc ファイルを読み込んで実行します。 そこで以下のようにして .bashrc ファイルを生成します。

cat > ~/.bashrc << "EOF"
set +h
umask 022
LFS=/mnt/lfs
LC_ALL=POSIX
LFS_TGT=$(uname -m)-lfs-linux-gnu
PATH=/usr/bin
if [ ! -L /bin ]; then PATH=/bin:$PATH; fi
PATH=$LFS/tools/bin:$PATH
CONFIG_SITE=$LFS/usr/share/config.site
export LFS LC_ALL LFS_TGT PATH CONFIG_SITE
EOF

.bashrc 内の設定の意味

set +h

set +h コマンドは bash のハッシュ機能を無効にします。 通常このハッシュ機能は有用なものです。 実行ファイルのフルパスをハッシュテーブルに記憶しておき、再度そのパスを探し出す際に PATH 変数の探査を省略します。 しかしこれより作り出すツール類はインストール直後にすぐ利用していきます。 ハッシュ機能を無効にすることで、プログラム実行が行われる際に、シェルは必ず PATH を探しにいきます。 つまり $LFS/tools/bin ディレクトリ以下に新たに構築したツール類は必ず実行されるようになるわけです。 そのツールの古いバージョンがホストディストリビューションのディレクトリ、/usr/bin または /bin にあったとしても、その場所を覚えていて実行されるということがなくなります。

umask 022

ユーザーのファイル生成マスク (file-creation mask; umask) を 022 にセットするのは、新たなファイルやディレクトリの生成はその所有者にのみ許可し、他者は読み取りと実行を可能とするためです。 (システムコール open(2) にてデフォルトモードが適用される場合、新規生成ファイルのパーミッションモードは 644、同じくディレクトリは 755 となります。)

LFS=/mnt/lfs

環境変数 LFS は常に指定したマウントポイントを指し示すように設定します。

LC_ALL=POSIX

LC_ALL 変数は特定のプログラムが扱う国情報を制御します。 そのプログラムが出力するメッセージを、指定された国情報に基づいて構成します。 LC_ALL 変数はPOSIXCにセットしてください。 (両者は同じです。) そのようにセットしておけば、クロスコンパイル環境下での作業が問題なく進められます。

LFS_TGT=$(uname -m)-lfs-linux-gnu

LFS_TGT 変数は標準にないマシン名称を設定します。 しかしこれはこの先、クロスコンパイラーやクロスリンカーの構築、これを用いたツールチェーンの構築の際に、うまく動作させるための設定です。 詳しくは ツールチェーンの技術的情報にて説明しているので参照してください。

PATH=/usr/bin

最近の Linux ディストリビューションでは /bin/usr/bin をマージしているものが多くあります。 その場合、第 6 章 に対しての標準の PATH 変数は /usr/bin/ に設定するだけで十分です。 そうでない場合は、パスに対して /bin を加える必要があります。

if [ ! -L /bin ]; then PATH=/bin:$PATH; fi

/bin がシンボリックリンクではないは PATH 変数に加える必要があります。

PATH=$LFS/tools/bin:$PATH

$LFS//tools/bin ディレクトリを PATH 変数の先頭に設定します。 第 5 章の冒頭においてインストールしたクロスコンパイラーは、インストールした直後からシェル上から実行できるようになります。 この設定を行うことで、ハッシュ機能をオフにしたことと連携して、ホスト上のコンパイラーが利用されないようにします。

CONFIG_SITE=$LFS/usr/share/config.site

第 5 章第 6 章 においてこの変数を設定しておかないと、ディストリビューションによっては configure スクリプトが、ホストシステム上の /usr/share/config.site から設定項目を取得してしまうことがあります。 ホストの影響が及ばないようにここでオーバーライドします。

export ...

上のコマンド実行は、設定済の変数を改めて設定するものになりますが、シェルを新たに呼び出しても確実に設定されるようにエクスポートを行うことにします。

[重要]

重要

商用ディストリビューションの中には、bash の初期化を行うスクリプトとして、ドキュメント化されていない /etc/bash.bashrc というものを加えているものがあります。 このファイルは lfs ユーザー環境を修正してしまう可能性があります。 それにより LFS にとっての重要パッケージのビルドに支障をきたすことがあります。 lfs ユーザー環境をきれいに保つため、/etc/bash.bashrc というファイルが存在しているかどうかを確認してください。 そして存在していたらファイルを移動させてください。 root ユーザーになって以下を実行します。

[ ! -e /etc/bash.bashrc ] || mv -v /etc/bash.bashrc /etc/bash.bashrc.NOUSE

(第 7 章 の冒頭において) lfs ユーザーを必要としなくなったら、(必要に応じて)/etc/bash.bashrc を元に戻してください。

なお 「Bash-5.2.21」 においてビルドした、LFS における Bash パッケージは、/etc/bash.bashrc をロードしたり読み取ったりするように設定されていません。 したがって完璧な LFS システムであれば、このファイルは不要なものです。

最新のシステムは複数プロセッサー (デュアルコアとも言います) であることが多く、パッケージのビルドにあたっては「同時並行のビルド」によりビルド時間を削減できます。 その場合プロセッサー数がいくつなのかを make プログラムの実行時に、コマンドラインオプション引数として、あるいは環境変数として指定します。 Intel コア i9-13900K プロセッサーは 8 P コア(P は performance の意味)、および 16 E コア(E は efficiency の意味)を持ちます。 1 つの P は同時に 2 つのスレッド実行が可能であり、Linux カーネルからは 2 つの論理コアとして扱われます。 したがって合計で 32 の論理コアを持つことになります。 明示的にその全コアを利用するには、make が 32 個のビルドジョブまで生成できるようにすることです。 これには make に対して -j32 オプションを与えます。

make -j32

あるいは環境変数 MAKEFLAGS を用います。 この変数の設定値は make が自動的にコマンドラインオプションとして利用します。

export MAKEFLAGS=-j32
[重要]

重要

-j オプションに数値を与えずに make コマンドに受け渡したり、あるいは MAKEFLAGS に設定することはやめてください。 それを行ってしまうと make に対して無限のビルドジョブ生成を行わせるものとなり、システムの安定性を損なう問題が発生します。

第 5 章 および 第 6 章 におけるパッケージのビルドに対して、利用可能な論理コアをすべて利用するように、ここで .bashrc にて MAKEFLAGS を設定します。

cat >> ~/.bashrc << "EOF"
export MAKEFLAGS=-j$(nproc)
EOF

$(nproc) 部分は、論理コアすべてでなく利用したい論理コア数を設定してください。

一時的なツールを構築する準備の最後として、bash シェルが、今作り出したユーザープロファイルを読み込むようにします。

source ~/.bash_profile