クロスコンパイル Linux From Scratch

SYSVINIT-20170702-x86_64-Multilib

Copyright © 2005-2017, Joe Ciccone, Jim Gifford, Ryan Oliver

All rights reserved.

This material may be distributed only subject to the terms and conditions set forth in the Open Publication License v1.0 or later (the latest version is presently available at http://www.opencontent.org/openpub/).

Linux® Linus Torvalds の登録商標です。

本書は "Linux From Scratch" ブックに基づくものであり、以下に示すライセンスにより提供します。

Copyright © 1999–2017, Gerard Beekmans

All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  • Redistributions in any form must retain the above copyright notice, this list of conditions and the following disclaimer

  • Neither the name of 「Linux From Scratch」 nor the names of its contributors may be used to endorse or promote products derived from this material without specific prior written permission

  • Any material derived from Linux From Scratch must contain a reference to the 「Linux From Scratch」 project

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 「AS IS」 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.


目次

序文

はじめに

Linux From Scratch プロジェクトはここ数年において大きく変化しています。 私個人が参加した時期は 1999年であり 2.x がリリースされていた頃です。 その頃のビルド方法と言えば、ホストシステム上にスタティックライブラリを生成し chroot を用いてそのスタティックライブラリに基づく最終的な実行モジュールを作り上げるものでした。

後に /static ディレクトリは初期のスタティックライブラリのビルドにおいてのみ用いられるようになります。 それは最終システムとは切り離され、Ryan Oliver と Greg Schafer により開発された PureLFS に基づく作業を通じて新たなツールチェーンの構築作業に入ります。 この作業段階においては、ホストシステムを用いた初期段階でのビルド作業とは完全に離れます。 最終的に LFS バージョン 6 にて Linux カーネル 2.6、udev による動的デバイス構成、健全化されたカーネルヘッダーといった種々の改善が Linux From Scratch システムに組み入れられます。

LFS における一つの "欠点" は常に x86系のプロセッサーを対象としていたことです。 Athlon 64 プロセッサーや Intel EM64T プロセッサーが登場してくると、x86 だけを取り扱っている LFS が理想形でなくなってしまいました。 このようなときに Ryan Oliver が Linux を構築する新たな作業手順を開発しドキュメント化します。 その手順はターゲットとするシステムもホストとするシステムも何でもよく、クロスコンパイルの手法を用いたものです。 こうしてクロスコンパイル LFS (CLFS) が誕生しました。

CLFS は LFS プロジェクトが常に採用してきた原則に従っています。 それは自分自身でシステムを構築していくことを通じ、システムの内部を隅々まで学ぶという姿勢です。 CLFS の作業はそれにとどまらず、応用技術としてクロスビルドによるツールチェーンやマルチライブラリ (32ビット、64ビットのライブラリ) サポートを学ぶことができます。 さらには対象とするアーキテクチャーも Sparc や MIPS とすることも出来、学ぶ範囲はさらに広がっています。

CLFS システム作りを楽しんでください。 また必要に応じて作り上げたシステムが役立つことを望みます。

--
Jeremy Utley, CLFS 1.x リリースマネージャー (ページ作成者)
Jonathan Norman, リリースマネージャー
Jim Gifford, CLFS プロジェクト共同リーダー
Ryan Oliver, CLFS プロジェクト共同リーダー
Joe Ciccone, CLFS プロジェクト共同リーダー
Jonathan Norman, Justin Knierim, Chris Staub, Matt Darcy, Ken Moffat,
Manuel Canales Esparcia, Nathan Coulson, William Harrington - CLFS 開発者

対象読者

本書を読む理由はさまざまにあると思います。 その第一は Linux システムをソースコードから作り上げる点です。 よく挙がってくる質問として以下があります。 「既にある Linux をダウンロードしてインストールすれば良いのに、どうして苦労してまで手作業で Linux を構築しようとするのか。」 良い質問です。 本節を示す理由がそこにあります。

CLFS を提供する最大の理由は Linux システムがどのようにして動作しているのか、これを学ぶためのお手伝いをすることです。 CLFS システムを構築してみれば、さまざまなものが連携し依存しながら動作している様子を知ることができます。 そうした経験をした人であれば Linux システムを自分の望む形に作りかえる手法も身につけることができます。

CLFS の重要な利点として、他の Linux システムに依存することなくシステムをより適切に制御できる点が挙げられます。 CLFS システムではあなたが運転台に立って、システムのあらゆる側面への指示を下していきます。 ディレクトリレイアウトであったりブートスクリプトの設定であったり。 そして各種プログラムをどこへ何のためにどうやってインストールするかも思いのままです。

さらに非常にコンパクトな Linux システムを作る方法も身につけられます。 通常の Linux ディストリビューションを用いる場合、多くのプログラムをインストールすることになりますが、たいていのプログラムは使わないものです。 それらのプログラムはディスク容量や CPU リソースを無駄に消費することになります。 CLFS のビルドを 100MB 以内に収めることも可能です。 これは世に存在するディストリビューションに比べて相当に小さなシステムであるはずです。 その容量でもまだ大きいと思いますか? 我々の中には非常に小さな組み込み用の CLFS システム作りにチャレンジしている者もいます。 実際に Apache ウェブサーバーの起動に特化したシステムを作り出していて、そのディスク容量はほぼ 8MB 程度です。 そこからもっとスリム化を図れば 5MB 以下になるかもしれません。 普通のディストリビューションでこれを試してみてください! これは Linux 作りを行うことで得られる利点のほんの一つにすぎません。

Linux ディストリビューションは言ってみればファーストフードレストランで食べるハンバーガーにたとえることができます。 客にとっては食べているハンバーガーの中に何が入っているのか分からないものです。 では CLFS はというとハンバーガーを提供するのではありません。 CLFS が提供するのは求められているハンバーガーを作るためのレシピです。 レシピを明らかにするわけですから、不要な食材は取り除いて独自のものを加えることができます。 ハンバーガーの風味を思いのまま増すことができるでしょう。 レシピに満足できてこそ初めて作業に入ることができます。 これがまさに手順書です。 焼くもよし揚げるもよしバーベキューにするのもよし。

別のたとえで言うなら CLFS は建売住宅にも似ています。 CLFS は住宅の設計図を提供しますが、それを建てるのはあくまであなたです。 CLFS は全作業工程において設計図を修正していくのは自由です。 あなたが必要とする状況や好みに応じていくらでも変えていったらよいのです。

カスタマイズした Linux システムを構築するもう一つの利点としてセキュリティがあります。 ソースコードからコンパイルしてシステムを構築するということは、あらゆることを制御する権限を有することになり、セキュリティパッチは望みどおりに適用できます。 他の人がセキュリティホールを修正しバイナリパッケージを提供するのを待つ必要がなくなるということです。 他の人がパッチとバイナリパッケージを提供してくれたとしても、それが本当に正しく構築され、問題を解決してくれているかどうかは、調べてみなければ分からないわけですから。

Cross Linux From Scratch の最終目標は、実用的で完全で基盤となるシステムを構築することです。 Linux システムを一から作り出すつもりのない方は、本書から得られるものはないかもしれません。 コンピューター起動時に何が起きるかということだけを知りたいなら 「From Power Up To Bash Prompt」 というハウツーが http://axiom.anu.edu.au/~okeefe/p2b/ か、Linux ドキュメンテーションプロジェクト (Linux Documentation Project; LDP) の http://www.tldp.org/HOWTO/From-PowerUp-To-Bash-Prompt-HOWTO.html にあります。 このハウツーが構築するシステムは本書が作り出すシステムと似ています。 しかしこのハウツーは、システムが起動でき BASH プロンプトが利用できるところまでを目指しているだけです。 目的とするところにもよりますが、Linux システムをビルドしてこれを学んでいこうとするなら、本書こそ読むべきものと思います。

CLFS を構築する理由はさまざまですからすべてを列記することはできません。 ここで示した内容はほんの氷山の一角にすぎません。 CLFS 構築作業の経験を積むことによって、情報や知識を通じてもたらされる意義が十二分に理解できるはずです。

必要な知識

CLFS システムの構築作業は決して単純なものではありません。 ある程度の Unix システム管理の知識が必要です。 問題を解決したり、説明されているコマンドを正しく実行することが求められます。 ファイルやディレクトリのコピー、それらの表示確認、カレントディレクトリの変更、といったことは最低でも知っていなければなりません。 さらに Linux の各種ソフトウェアを使ったりインストールしたりする知識が必要です。 CLFS の作業においては CPU アーキテクチャーやホストオペレーティングシステムに対する基本的な知識も必要です。

CLFS ブックでは、最低でも そのようなスキルがあることを前提としていますので、数多くの CLFS サポートフォーラムは、ひょっとすると役に立たないかもしれません。 フォーラムにおいて基本的な知識を尋ねたとしたら、誰も回答してくれないでしょう。 そうするよりも CLFS に取り掛かる前に以下のような情報をよく読んでください。

CLFS システムの構築作業に入る前に、以下のハウツーを読むことをお勧めします。

  • ソフトウェア構築のハウツー (Software-Building-HOWTO) http://www.tldp.org/HOWTO/Software-Building-HOWTO.html

    これは Linux 上において「一般的な」 Unix ソフトウェアを構築してインストールする方法を総合的に説明しています。

  • Linux ユーザーズガイド (The Linux Users' Guide) http://www.tldp.org/pub/Linux/docs/ldp-archived/users-guide/

    このガイドは Linux の各種ソフトウェアの利用方法を網羅しています。

  • 基本的な事前ヒント情報 (The Essential Pre-Reading Hint) http://hints.clfs.org/index.php/Essential_Prereading

    これは Linux 初心者に向けて書かれたヒントです。 ここには非常に多くの有用なトピックへのリンクがあります。 CLFS を構築しようとするなら、これらのヒントに示されている内容は出来るだけ多く理解しておくことが必要でしょう。

ホストシステム要件

CLFS は Unix タイプのオペレーティングシステム上に生成していきます。 ホストシステムには以下に示すソフトウェアが必要であり、それぞれに示されているバージョン以降である必要があります。 ディストリビューションによっては、ソフトウェアのヘッダーファイル群を別パッケージとして提供しているものが多々あります。 例えば "[パッケージ名]-devel" であったり "[パッケージ名]-dev" といった具合です。 お使いのディストリビューションがそのような提供の仕方をしている場合は、それらもインストールしてください。

  • Bash-2.05a

  • Binutils-2.12 (2.28 以上のバージョンはテストしていないためお勧めしません。)

  • Bison-1.875

  • Bzip2-1.0.2

  • Coreutils-5.0

  • Diffutils-2.8

  • Findutils-4.1.20

  • Gawk-3.1.5

  • GCC-4.1.2 と C++ コンパイラーである g++ (7.1.0 以上のバージョンはテストしていないためお勧めしません。)

  • Glibc-2.2.5 (2.25 以上のバージョンはテストしていないためお勧めしません。)

  • Grep-2.5

  • Gzip-1.2.4

  • Make-3.80

  • Ncurses-5.3

  • Patch-2.5.4

  • Sed-3.0.2

  • Tar-1.22

  • Texinfo-4.7

  • XZ Utils-4.999.8beta

ホストシステムに上のソフトウェアの適切なバージョンがインストールされているかどうかは、以下のスクリプトを生成し実行して確認することができます。 その出力にエラーがないかを確認してください。 パッケージが見つからなかった場合はインストールしてください。

cat > version-check.sh << "EOF"
#!/bin/bash

# Simple script to list version numbers of critical development tools

bash --version | head -n1 | cut -d" " -f2-4
echo -n "Binutils: "; ld --version | head -n1 | cut -d" " -f3-
bison --version | head -n1
bzip2 --version 2>&1 < /dev/null | head -n1 | cut -d" " -f1,6-
echo -n "Coreutils: "; chown --version | head -n1 | cut -d")" -f2
diff --version | head -n1
find --version | head -n1
gawk --version | head -n1
gcc --version | head -n1
g++ --version | head -n1
ldd $(which ${SHELL}) | grep libc.so | cut -d ' ' -f 3 | ${SHELL} | head -n 1 | cut -d ' ' -f 1-7
grep --version | head -n1
gzip --version | head -n1
make --version | head -n1
tic -V
patch --version | head -n1
sed --version | head -n1
tar --version | head -n1
makeinfo --version | head -n1
xz --version | head -n1
echo 'int main(){}' | gcc -v -o /dev/null -x c - > dummy.log 2>&1
if ! grep -q ' error' dummy.log; then
  echo "Compilation successful" && rm dummy.log
else
  echo 1>&2  "Compilation FAILED - more development packages may need to be \
installed. If you like, you can also view dummy.log for more details."
fi
EOF

bash version-check.sh 2>errors.log &&
[ -s errors.log ] && echo -e "\nThe following packages could not be found:\n$(cat errors.log)"

本書の表記

本書では、特定の表記を用いて分かりやすく説明を行っていきます。 ここではクロスコンパイル Linux From Scratch ブックを通じて利用する表記例を示します。

./configure --prefix=/usr

この表記は特に説明がない限りは、そのまま入力するテキストを示しています。 またコマンドの説明を行うために用いる場合もあります。

install-info: unknown option '--dir-file=/mnt/clfs/usr/info/dir'

上の表記は固定幅フォントで示されており、たいていはコマンド入力の結果として出力される端末メッセージを示しています。 あるいは /etc/ld.so.conf といったファイル名を示すのに利用する場合もあります。

Emphasis

上の表記はさまざまな意図で用いています。 特に重要な説明内容やポイントを表します。

http://clfs.org/

この表記は CLFS コミュニティ内や外部サイトへのハイパーリンクを示します。 そこには「ハウツー」やダウンロードサイトなどが含まれます。

cat > ${CLFS}/etc/group << "EOF"
root:x:0:
bin:x:1:
......
EOF

上の表記は設定ファイル類を生成する際に示します。 1行目のコマンドは ${CLFS}/etc/group というファイルを生成することを指示しています。 そのファイルへは2行目以降 EOF が記述されるまでのテキストが出力されます。 したがってこの表記は通常そのままタイプ入力します。

[REPLACED TEXT]

上の表記は入力するテキストを仮に表現したものです。 これをそのまま入力するものではないため、コピー、ペースト操作で貼り付けないでください。

passwd(5)

上の表記はマニュアルページ (man ページ) を参照するものです。 カッコ内の数字は man の内部で定められている特定のセクションを表しています。 例えば passwd コマンドには2つのマニュアルページがあります。 LFS のインストールに従った場合、2つのマニュアルページは /usr/share/man/man1/passwd.1/usr/share/man/man5/passwd.5 に配置されます。 この2つの man ページは内容が異なります。 passwd(5) という表記は /usr/share/man/man5/passwd.5 を参照することを意味します。 man passwd という入力に対しては「passwd」という語に合致する最初のマニュアルページが表示されるものであり /usr/share/man/man1/passwd.1 が表示されることになります。 特定のマニュアルページを見たい場合は man 5 passwd といった入力を行う必要があります。 マニュアルページが複数あるケースはまれですので、普通は man[プログラム名] と入力するだけで十分です。

本書の構成

本書は以下の部から構成されます。

第I部 - はじめに

第I部ではクロス LFS 構築作業を進めるための重要事項について説明します。 また本書のさまざまな情報についても説明します。

第II部 - ビルド作業のための準備

第II部では、パーティションの生成、パッケージのダウンロード、一時的なツールのコンパイルといった、システム構築の準備作業について説明します。

第II 部 - クロスコンパイルツールの生成

第III部ではクロスコンパイラーツールの生成方法を示します。 このツールはホストシステム上で動かしますが、ビルドするパッケージがターゲットシステム上で動作させるようにします。

第IV部 - 基本ツールの構築

第IV部ではターゲットシステムを制御するためのツールチェーンの生成方法を示します。 このツールはターゲットシステム上にワーキングシステムを作り上げるためのものです。

第V部 - CLFS システムの構築

第V部は CLFS システムの構築方法を説明していきます。 各パッケージのコンパイルとインストールを一つずつ行い、ブートスクリプトの設定とカーネルのインストールを行います。 できあがった Linux システムは他のソフトウェアをビルドしていく基礎となるものであり、望みどおりに拡張していくことができます。 本書の終わりでは、作業を通じてインストールしてきたプログラム、ライブラリ、重要なファイル類の一覧を示します。

付録

付録の章では上に述べたもの以外について触れます。 付録Aには本書で用いる用語の定義を示します。 付録BとCでは各パッケージの依存関係やビルド順について示します。 アーキテクチャーによっては独自の付録を加えているものがあります。

正誤情報

CLFS システムを構築するためのソフトウェアは日々拡張され更新されています。 CLFS ブックがリリースされた後に、セキュリティフィックスやバグフィックスが公開されているかもしれません。 場合によっては特定のホストシステムでの CLFS 構築に問題が生じているかもしれません。 本版にて説明するパッケージや作業手順に対して、セキュリティフィックス、バグフィックス、ホスト情報などが公開されていないかどうか、ビルド作業を行う前に http://trac.clfs.org/wiki/errata を確認してください。 そして CLFS ビルド作業を進めながら、対応する節においての変更を確認し適用してください。

日本語訳について

日本語訳情報

本節はオリジナルの CLFS ブックにはないものです。 日本語訳に関する情報を示すために設けました。

はじめに

本書は CLFS ブック SYSVINIT-20170702 の日本語版 20170704 です。 オリジナルの CLFS ブックと同様に DocBook を用いて構築しています。

日本語版の生成について

日本語版 CLFS ブックの生成は、以下のようにして行っています。

  • そもそも CLFS ブックのソースは、CLFS のサイト http://clfs.org/ において、Stable 版として公開されていると同時に Git により、日々開発更新されているソース (XMLソース) が公開されています。 日本語版はその XML ソースに基づいて作成しています。

  • XML ソースは DocBook XML DTD の書式に従ったファイル形式です。 日本語版では、XMLソースに記述された原文を日本語訳文に変えて、同様の処理により生成しています。 オリジナルソース内に含まれる INSTALL ファイルには、処理に必要となるツール類の詳細が示されています。 それらのツール類はすべて BLFS にてインストールする対象となっていますので、興味のある方は参照してください。

  • 日本語訳にあたっては、原文にて「地の文」として表現されている文章を日本語化しています。 逆に各手順におけるコマンド説明 (四角の枠囲いで示されている箇所) は、日本語化の対象とはしていません。 コマンド類や設定記述が英単語で行われるわけですから、これは当たり前のことです。 ただ厳密に言えば、その四角の枠囲いの中でシェルのコメント書きが含まれる場合があり、これは日本語化せずそのまま表記しています。

日本語版における注意点

CLFSブック日本語版を参照頂く際には、以下の点に注意してください。

  • 本ページの冒頭にあるように、原文にはない記述は「日本語訳情報」として枠囲い文章で示すことにします。

  • 訳者は Linux に関する事柄を隅から隅まで熟知しているわけではありません。 したがってパッケージのことや Linux の仕組みに関して説明されている原文の、真の意味が捉えられず、原文だけを頼りに訳出している箇所もあります。 もし誤訳、不十分な訳出、意味不明な箇所に気づかれた場合は、是非ご指摘、ご教示をお願いしたいと思います。

  • 日本語訳にて表記しているカタカナ用語について触れておきます。 特に語末に長音符号がつく (あるいはつかない) 用語です。 このことに関しては訳者なりに捉えているところがあるのですが、詳述は省略します。 例えば「ユーザー (user)」という用語は語末に長音符号をつけるべきと考えます。 一方「コンピュータ (computer)」という用語は、情報関連その他の分野では長音符号をつけない慣用があるものの、昨今これをつけるような流れもあり情勢が変わりつつあります。 このように用語表記については、大いに "ゆれ" があるため、訳者なりに取り決めて表記することにしています。 なじみの表記とは若干異なるものが現れるかもしれませんが、ご了承いただきたいと思います。

第I部 はじめに

第1章 はじめに

1.1. CLFS 関係者への謝辞

CLFS チームより本書製作にご協力頂いた方々へ感謝いたします。

リーダー:

  • William Harrington - 開発リーダー。

  • Jonathan Norman - x86, x86_64, PowerPC, UltraSPARC のビルド。 2.x シリーズのリリースマネージャー。

  • Chris Staub - x86 と x86_64 のビルド。品質管理リーダー。

CLFS チーム:

  • Matt Darcy - x86, X86_64, Sparc のビルド。

  • Manuel Canales Esparcia - XML 製作者。

  • Justin Knierim - ウェブサイト設計者。

  • Ken Moffat - PowerPC と X86_64 のビルド。 Pure 64 ヒント開発者。

開発チーム以外

  • Jürg Billeter - Linux ヘッダーパッケージ開発に関わるテストとヘルプ。

  • Richard Downing - テスト、誤字指摘、内容修正。

  • Peter Ennis - 誤字指摘、内容修正。

  • Tony Morgan - 誤字指摘、内容修正。

CLFS チームでは、clfs-dev@lists.cross-lfs.org をはじめとする関連メーリングリストにて、貢献をして頂いた多くの方々に感謝します。 皆様には CLFS ブックのテストを通じて、数々の技術的指摘や誤記指摘をして頂いています。

  • G. Moko - 内容更新、誤字指摘。

  • Maxim Osipov - MIPS テスト。

  • Doug Ronne - x86_64 の種々の更新。

  • Theo Schneider - Linux ヘッダーパッケージのテスト。

  • Martin Ward - Systemd とブート方式の推奨、その他。

  • William Zhou - テキスト修正と誤字指摘。

旧チームメンバー

  • Joe Ciccone - 開発リーダー。

  • Nathan Coulson - ブートスクリプト。

  • Jim Gifford - 開発リーダー。

  • Jeremy Huntwork - PowerPC, x86, Sparc のビルド。

  • Karen McGuiness - 校正。

  • Ryan Oliver - ビルド手順開発。

  • Alexander E. Patrakov - Udev/ホットプラグ開発。

  • Jeremy Utley - 1.x シリーズのリリースマネージャー。

  • Zack Winkles - 本書の安定化。

Linux From Scratch プロジェクト

  • Gerard Beekmans <gerard AT linuxfromscratch D0T org> – Linux From Scratch の製作者、CLFS はこれに基づいて構築される

サポート頂いた方々すべてに感謝します。

1.2. CLFS をどうやって作るか

CLFS システムは、既にインストールされている Unix システムや Linux ディストリビューション (Debian、Fedora、openSUSE、Ubuntu など) を利用して構築していきます。 この既存のシステム(ホスト)は、CLFS 構築のためにさまざまなプログラム類を利用する基盤となります。 プログラム類とはコンパイラー、リンカー、シェルなどです。 したがってそのディストリビューションのインストール時には "開発 (development)" オプションを選択し、それらのプログラム類が利用できるようにしておく必要があります。

コンピューター内にインストールされているディストリビューションを利用するのではなく LiveCD を利用することもできます。 ディストリビューションにはたいてい LiveCD があります。 これを利用して必要なツールを導入した上で、本書に示す手順を進めていくことができます。 ただし LiveCD を再起動した場合には、ビルド作業を再開する前に必ずホスト環境を再整備しなければならない点には注意してください。

新しいパーティションの準備では、新しく構築する Linux のためのパーティションとファイルシステムの生成方法について説明します。 そのパーティション上にて CLFS システムをコンパイルしインストールします。 パッケージとパッチでは CLFS 構築に必要となるパッケージとパッチについて説明します。 これらをダウンロードして新たなファイルシステム内に保存します。 準備作業の仕上げは作業環境の準備について述べています。 この章では重要な説明を行っていますので、クロスコンパイルツールの構築以降に進む前に是非注意して読んでください。

クロスコンパイルツールの構築 ではクロスコンパイルツールのインストール方法を説明します。 これはホストシステム上に生成していきますが、ターゲットマシンにて動作するプログラムをコンパイルできるものです。 このクロスコンパイルツールにより一時システムを構築し、これをベースとして最終的な CLFS システムを作り上げます。 パッケージの中には自分自身を循環的に必要とするような依存関係を持つものがあります。 例えばコンパイラーをコンパイルするためにはコンパイラーが必要となります。

クロスコンパイルツールの構築作業はまず初めに、ターゲットマシン用のビルドシステムを作るために必要となるツール類をビルドしインストールします。 その作業ではツールチェーン内にホストシステムへの依存がないようにしていきます。

"クロスツール" を作り上げた次には /tools ディレクトリ内に必要最小限の一時システムを構築します。 これは /cross-tools ディレクトリ内にあるクロスツールチェーンを用いて行います。 一時システムが出来上がったら多少の作業を行った後に、再起動を行うか chroot を行うかのいずれかを通じて一時システムのビルド環境へ入ります。 再起動か chroot かの違いについての詳細は 6.30.「再起動か chroot か?」 を参照してください。

基本的なシステムソフトウェアのインストール では、再起動または chroot により一時的なビルド環境に入り完全な CLFS システムを構築します。

インストールの仕上げとしてシステム設定にてベースシステムの設定を行い、CLFS システムのブート設定にてカーネルとブートローダーを設定します。 作業終了では CLFS システム構築経験を踏まえて、その先に進むための情報を示します。 本書に示す作業をすべて実施すれば、新たな CLFS システムを起動することが出来ます。

上はごく簡単な説明にすぎません。 各作業の詳細はこれ以降の章やパッケージの説明を参照してください。 内容が難しいと思っていても、それは徐々に理解していけるはずです。 読者の皆さんには、是非 CLFS アドベンチャーに挑んで頂きたいと思います。

1.3. 変更履歴 (共通)

本書はクロスコンパイル Linux From Scratch (CLFS) バージョン SYSVINIT-20170702 (2017/07/02 リリース) です。 本書が6ヶ月以上更新されていなければ、より新しい版が公開されているはずです。 http://trac.clfs.org/ を通じてミラーサイトを確認してください。

以下は前版からの変更点を示したものです。

変更履歴:

日本語訳情報

以下の変更履歴は訳出せずに表記します。

  • 03 July 2017

    • [Chris] - Added attr, acl, and libcap. Fixes ticket #1117.

  • 02 July 2017

    • [William Harrington] - Upgrade Diffutils to 3.6. Fixes ticket #1175.

  • 09 June 2017

    • [William Harrington] - Upgrade PERL to 5.26.0. Fixes ticket #1167.

  • 04 June 2017

    • [Chris] - Simplified sed command in temp-system Bzip2.

  • 02 June 2017

    • [William Harrington] - Upgrade Sed to 4.4. Fixes ticket #1149.

  • 01 June 2017

    • [William Harrington] - Upgrade Shadow to 4.5. Fixes ticket #1150.

  • 29 May 2017

    • [William Harrington] - Upgrade File to 5.31. Fixes ticket #1163.

    • [William Harrington] - Upgrade Flex to 2.6.4. Fixes ticket #1089.

  • 24 May 2017

    • [William Harrington] - Upgrade Coreutils to 8.27. Fixes ticket #1142.

  • 19 May 2017

    • [William Harrington] - Upgrade Libcap to 2.25. Fixes ticket #1140.

    • [William Harrington] - Move Libcap after Acl.

  • 17 May 2017

    • [William Harrington] - Upgrade Vim to 8.0-0597. Fixes ticket #1154.

  • 14 May 2017

    • [William Harrington] - Upgrade Perl to 5.24.1. Fixes ticket #1035.

    • [William Harrington] - Upgrade Binutils to 2.28. Fixes ticket #1108.

    • [William Harrington] - Upgrade ISL to 0.17.1. Fixes ticket #1114.

  • 13 May 2017

    • [William Harrington] - Upgrade GCC to 7.1.0. Fixes ticket #1114.

  • 10 May 2017

    • [William Harrington] - Upgrade MPFR to 3.1.5. Fixes ticket #1145.

  • 06 May 2017

    • [William Harrington] - Upgrade GLIBC to 2.25. Fixes ticket #1109.

    • [William Harrington] - Upgrade Check to 0.11.0. Fixes ticket #1127.

  • 04 May 2017

    • [William Harrington] - Upgrade Man-DB to 2.7.6.1. Fixes ticket #1143.

    • [William Harrington] - Upgrade Tar to 1.29. Fixes ticket #1151.

    • [William Harrington] - Upgrade BC to 1.07.1. Fixes ticket #1124.

    • [William Harrington] - Upgrade Grep to 3.0. Fixes ticket #1107.

    • [William Harrington] - Upgrade Readline to 7.0. Fixes ticket #1086.

  • 03 May 2017

    • [William Harrington] - Upgrade Bash to 4.4. Fixes ticket #1085.

  • 16 April 2017

    • [William Harrington] - Upgrade Util-linux to 2.29.2. Fixes ticket #1038.

    • [William Harrington] - Upgrade Systemd 233. Fixes ticket #1003.

    • [William Harrington] - Update group and user ids.

  • 16 April 2017

    • [William Harrington] - Upgrade Linux kernel to 4.9.21. Fixes ticket #1105.

    • [William Harrington] - Upgrade IProute2 to 4.9.0. Fixes ticket #1103.

  • 15 April 2017

    • [William Harrington] - Upgrade DejaGNU to 1.6. Fixes ticket #1128.

    • [William Harrington] - Upgrade DHCPCD to 6.11.5. Fixes ticket #1077.

    • [William Harrington] - Upgrade Diffutils to 3.5. Fixes ticket #1129.

    • [William Harrington] - Upgrade E2fsprogs to 1.43.4. Fixes ticket #1113.

    • [William Harrington] - Upgrade File to 5.30. Fixes ticket #1131.

    • [William Harrington] - Upgrade Findutils to 4.6.0. Fixes ticket #1101.

    • [William Harrington] - Upgrade Gawk to 4.1.4. Fixes ticket #1132.

    • [William Harrington] - Upgrade GDBM to 1.13. Fixes ticket #1133.

    • [William Harrington] - Upgrade Gettext to 0.19.8.1. Fixes ticket #1134.

    • [William Harrington] - Upgrade GMP to 6.1.2. Fixes ticket #1100.

    • [William Harrington] - Upgrade GZIP to 1.8. Fixes ticket #1136.

    • [William Harrington] - Upgrade KBD to 2.0.4. Fixes ticket #1137.

    • [William Harrington] - Upgrade LESS to 491. Fixes ticket #1139.

    • [William Harrington] - Upgrade Libestr to 0.1.10. Fixes ticket #1141.

    • [William Harrington] - Upgrade M4 to 1.4.18. Fixes ticket #1142.

    • [William Harrington] - Upgrade Make to 4.2.1. Fixes ticket #1112.

    • [William Harrington] - Upgrade Man-pages to 4.09. Fixes ticket #1144.

    • [William Harrington] - Upgrade Procps-ng to 3.3.12. Fixes ticket #1148.

    • [William Harrington] - Upgrade Texinfo to 6.3. Fixes ticket #1152.

    • [William Harrington] - Upgrade TZData to 2017b. Fixes ticket #1153.

    • [William Harrington] - Upgrade XZ-Utils to 5.2.3. Fixes ticket #1157.

    • [William Harrington] - Upgrade Zlib to 1.2.11. Fixes ticket #1156.

  • 28 December 2016

    • [Chris] - Added "ext_attr" to the list of filesystem attributes to check for when creating a filesystem. Thanks to Roger Koehler for pointing this out.

  • 13 March 2016

    • [Chris] - Updated Gawk dependencies - Gawk can use GMP, MPFR, Readline.

  • 04 March 2016

    • [Chris] - Added creation of /var/log/faillog to Shadow instructions.

  • 19 February 2016

    • [Chris] - Removed --disable-profile from Glibc instructions - profiling is disabled by default.

    • [Chris] - Removed commands to create libcurses* symlinks in Ncurses, as few packages now are likely to need them. Fixes ticket #1102.

    • [Chris] - Modified Ncurses instructions to move fewer libs to /lib{,32,64} as only libncursesw itself is needed there.Fixes ticket #1104.

    • [Chris] - Prevented the bashbug script from being installed in /bin, as it is not needed there. Fixes ticket #1099.

  • 17 January 2016

    • [Chris] - Removed redundant commands from multilib Ncurses pages.

  • 07 January 2016

    • [Chris] - Removed command in Grep instructions for security fix that was addressed in latest version.

  • 28 December 2015

    • [William Harrington] - Upgrade to GREP 2.22. Fixes ticket #1087.

    • [William Harrington] - Upgrade to LESS 481. Fixes ticket #1088.

    • [William Harrington] - Upgrade to Ncurses 6.0. Fixes ticket #1044.

    • [William Harrington] - Upgrade to GCC 5.3.0. Fixes ticket #1094.

  • 23 December 2015

    • [Chris] - Changed LSB link to its new location at linuxfoundation.org.

  • 19 December 2015

    • [Chris] - Added -j1 to vim install command to prevent errors in make install output.

  • 13 December 2015

    • [Chris] - Edited configure options to have one per line. Fixes ticket #1091.

  • 05 December 2015

    • [Chris] - Removed unneeded directory and symlink creation on Pure64 Essential Symlinks page.

  • 30 November 2015

    • [Chris] - Removed one more remaining --disable-libstdcxx-pch option from final-system GCC installation.

    • [Chris] - Updates to command explanations.

  • 27 November 2015

    • [William Harrington] - Update GCC to 5.2.0. Fixes ticket #1019.

    • [William Harrington] - Remove CLooG. Fixes ticket #1020.

    • [William Harrington] - Update ISL to 0.15. Fixes ticket #978.

  • 17 October 2015

    • [William Harrington] - Update GLIBC to 2.22. Fixes ticket #1027.

  • 16 October 2015

    • [William Harrington] - Update Binutils to 2.25.1. Fixes ticket #1023.

    • [William Harrington] - Update XZ to 5.2.2. Fixes ticket #1081.

    • [William Harrington] - Update KBD to 2.0.3. Fixes ticket #1057.

    • [William Harrington] - Update TZDATA to 2015g. Fixes ticket #1051.

    • [William Harrington] - Update Libpipeline to 1.4.1. Fixes ticket #1067.

  • 01 October 2015

    • [Chris] - Removed unneeded --disable-static option from Cross-Tools File page, as that is now the default.

    • [Chris] - Removed --without-shared option from Cross-Tools Ncurses page, as that is the default.

  • 22 September 2015

    • [William Harrington] - Update Libtool to 2.4.6. Fixes ticket #1076.

    • [William Harrington] - Update Gettext to 0.19.6. Fixes ticket #1075.

    • [William Harrington] - Update File to 5.25. Fixes ticket #1074.

  • 18 September 2015

    • [William Harrington] - Remove sed for E2fsprogs. Fixes ticket #1073.

  • 16 September 2015

    • [William Harrington] - Update IProute2 to 4.1.1. Fixes ticket #992.

    • [William Harrington] - Update Linux to 4.1.7. Fixes ticket #995.

  • 15 September 2015

    • [William Harrington] - Update Procps-ng to 3.3.11. Fixes ticket #1072.

  • 07 September 2015

    • [William Harrington] - mv gzexe and uncompress to /usr/bin.

  • 06 September 2015

    • [William Harrington] - Add IPv6 entry to /etc/hosts for localhost

    • [William Harrington] - Update iputils to s20150815. Fixes ticket #1066.

    • [William Harrington] - mv fuser killall to /bin per the FHS. Fixes ticket #1068.

    • [William Harrington] - Update MPFR to 3.1.3. Fixes ticket #1043.

    • [William Harrington] - Update Texinfo to 6.0. Fixes ticket #1041.

    • [William Harrington] - Update XZ to 5.2.1. Fixes ticket #1037.

    • [William Harrington] - Update Patch to 2.7.5. Fixes ticket #1034.

    • [William Harrington] - Update MPC to 1.0.3. Fixes ticket #1033.

    • [William Harrington] - Update KMOD to 21. Fixes ticket #1031.

    • [William Harrington] - Update Groff to 1.22.3. Fixes ticket #1029.

    • [William Harrington] - Update Grep to 2.21. Fixes ticket #1028.

    • [William Harrington] - Update DejaGNU to 1.5.3. Fixes ticket #1025.

    • [William Harrington] - Update Bison to 3.0.4. Fixes ticket #1024.

    • [William Harrington] - Update Automake to 1.15. Fixes ticket #1022.

    • [William Harrington] - Update LESS to 479. Fixes ticket #1056.

  • 04 September 2015

    • [William Harrington] - Update File to 5.24. Fixes ticket #1021.

    • [William Harrington] - Update Man-db to 2.7.2. Fixes ticket #1032.

    • [William Harrington] - Update TCL to 8.6.4. Fixes ticket #1036.

    • [William Harrington] - Update Check to 0.10.0. Fixes ticket #1045.

    • [William Harrington] - Update E2fsprogs to 1.42.13. Fixes ticket #1046.

    • [William Harrington] - Update Gawk to 4.1.3. Fixes ticket #1047.

    • [William Harrington] - Update Gettext to 0.19.5.1. Fixes ticket #1048.

    • [William Harrington] - Update Man-pages to 4.02. Fixes ticket #1050.

    • [William Harrington] - Add Bc memory leak patch. Fixes ticket #1055.

  • 30 July 2015

    • [Chris] - Removed reference to Freecode, as it's no longer being updated.

  • 07 February 2015

    • [Chris] - Updated FHS URL to new location.

  • 2 November 2014

    • [Chris] - Removed obsolete command for fixing tzselect from Glibc instructions.

    • [William Harrington] - Update E2FSprogs to 1.42.12. Fixes ticket #1012.

    • [William Harrington] - Update Libtool to 2.4.3. Fixes ticket #1013.

  • 31 October 2014

    • [William Harrington] - Update TZDATA to 2014i. Fixes ticket #1006.

    • [William Harrington] - Update Util-linux to 2.25.2. Fixes ticket #1007.

    • [William Harrington] - Update XZ Utils to 5.0.7. Fixes ticket #1008.

    • [William Harrington] - Update DHCPCD to 6.6.0. Fixes ticket #1009.

    • [William Harrington] - Update Libpipeline to 1.4.0. Fixes ticket #1010.

    • [William Harrington] - Update GLIBC to 2.20. Fixes ticket #982.

    • [William Harrington] - Update Coreutils to 8.23. Fixes ticket #975.

  • 25 October 2014

    • [William Harrington] - Update GREP to 2.20. Fixes ticket #969.

    • [William Harrington] - Update Check to 0.9.14. Fixes ticket #986.

    • [William Harrington] - Update DHCPCD to 6.5.1. Fixes ticket #988.

    • [William Harrington] - Update File to 5.20. Fixes ticket #990.

    • [William Harrington] - Update Gettext to 0.19.3. Fixes ticket #991.

    • [William Harrington] - Update KBD to 2.0.2. Fixes ticket #993.

    • [William Harrington] - Update Libpipeline to 1.3.1. Fixes ticket 994.

    • [William Harrington] - Update Make to 4.1. Fixes ticket #996.

    • [William Harrington] - Add Man-DB Home Page. Fixes ticket #997.

    • [William Harrington] - Update Man-DB to 2.7.0.2. Fixes ticket #998.

    • [William Harrington] - Update Man-pages to 3.75. Fixes ticket #999.

    • [William Harrington] - Update Perl to 5.20.1. Fixes ticket #1000. All hail the 1000 ticket!

    • [William Harrington] - Update Procps-ng to 3.3.10. Fixes ticket #1001.

    • [William Harrington] - Update Tar to 1.28. Fixes ticket #1004.

    • [William Harrington] - Update TCL to 8.6.2. Fixes ticket #1005.

  • 18 October 2014

    • [William Harrington] - Update LESS to 464.

  • 18 October 2014

    • [William Harrington] - Changelog restarted, see the 3.0.0 book for the old changelog.

1.4. 変更履歴 (x86_64)

以下は前版からのアーキテクチャー固有の変更点を示したものです。 全般的な変更に関しては 変更履歴 (共通) を参照してください。

変更履歴:

日本語訳情報

以下の変更履歴は訳出せずに表記します。

  • 18 October 2014

    • [William Harrington] - Changelog restarted, see the 3.0.0 book for the old changelog.

1.5. 情報源

1.5.1. FAQ

LFS システムの構築作業中にエラー発生したり、疑問を抱いたり、あるいは本書の誤記を発見した場合、まず手始めに http://trac.clfs.org/wiki/faq に示されている「よく尋ねられる質問」(Frequently Asked Questions; FAQ) を参照してください。

1.5.2. メーリングリスト

clfs.org サーバーでは CLFS 開発プロジェクトのために多くのメーリングリストを立ち上げています。 このメーリングリストは主となる開発用とは別に、サポート用のものもあります。 FAQ の中に答えがなかった場合は メールアーカイブ (Mail Archive) http://www.mail-archive.com において CLFS のメーリングリストを検索してみてください。 以下のリンクからもアクセスすることができます。

http://www.mail-archive.com/index.php?hunt=clfs

これ以外に、投稿の方法、アーカイブの配置場所などに関しては http://trac.clfs.org/wiki/lists を参照してください。

1.5.3. ニュースサーバー

CLFS には独自のニュースサーバーはありませんが gmane.org http://gmane.org を通じてこれを提供しています。 CLFS リストにニュースリーダーを通して投稿する場合は gmane.org を利用してください。 gmane 内の CLFS 関連の情報は以下のリンクから検索できます。

http://dir.gmane.org/search.php?match=clfs

1.5.4. IRC

CLFS コミュニティのメンバーの中には、インターネットリレーチャット (Internet Relay Chat; IRC) によるサポートを行っている者もいます。 ここに対して質問を挙げる場合は、FAQ やメーリングリストに同様の質問や答えがないかどうかを必ず確認してください。 IRC は chat.freenode.net において、チャネル名 #cross-lfs により提供しています。 また質問の際に出力結果を示す場合は http://pastebin.clfs.org を利用しその URL をお知らせください。

1.5.5. ミラーサイト

CLFS プロジェクトは世界中にミラーサイトがあります。 これらを使えばウェブサイト参照やパッケージのダウンロードがより便利に利用できます。 以下のサイトによりミラーサイトの情報を確認してください。 http://trac.clfs.org/wiki/mirrors

1.5.6. 連絡先

質問やコメントは (上に示した) メーリングリストを活用してください。

1.6. ヘルプ

本書に基づく作業の中で問題が発生したり疑問が生まれた場合は http://trac.clfs.org/wiki/faq#generalfaq にある FAQ のページを確認してください。 質問への回答が示されているかもしれません。 そこに回答が示されていなかったなら、問題の本質部分を見極めてください。 トラブルシューティングとして以下のヒントが有用かもしれません。 http://hints.clfs.org/index.php/Errors

我々のサイトにはメーリングリストやチャットを通じての情報提供を行う CLFS コミュニティがあります。 (詳細は 1.5.「情報源」を参照してください。) 我々は日々数多くのご質問を頂くのですが、たいていの質問は FAQ やメーリングリストを調べてみれば容易に答えが分かるものばかりです。 したがって我々が最大限の支援を提供できるよう、ある程度の問題はご自身で解決するようにしてください。 そうして頂くことで、我々はもっと特殊な状況に対するサポートを手厚く行っていくことができるからです。 いくら調べても解決に至らず、お問い合わせ頂く場合は、以下に示すように十分な情報を提示してください。

1.6.1. 特記事項

問題が発生し問い合わせをする場合には、以下に示す基本的な情報を含めてください。

  • お使いの CLFS ブックのバージョン。 (本書の場合 SYSVINIT-20170702)

  • CLFS 構築に用いたホスト Linux のディストリビューションとそのバージョン。

  • ホストシステムとターゲットシステムのそれぞれのアーキテクチャー。

  • 環境変数 ${CLFS_HOST} と ${CLFS_TARGET} の値。 また ${BUILD32}, ${BUILD64}, ${BUILDN32}, ${GCCTARGET} を利用しているならその値。

  • 問題が発生したパッケージまたは本書内の該当の章または節。

  • 問題となったエラーメッセージや状況に対する詳細な情報。 その例としては 1.6.3.「コンパイル時の問題」 を参照。

  • 本書どおりに作業しているか、逸脱していないかの情報。 異なるパッケージバージョンの利用の有無。 些細であったとしても作業手順が逸脱していると思われるコマンド実行。

注記

本書の作業手順を逸脱していたとしても、 我々がお手伝いしないわけではありません 。 つまるところ CLFS は個人的な趣味によって構築されるものです。 本書の手順とは異なるやり方を正確に説明してください。 そうすれば内容の評価、原因究明が容易になります。

1.6.2. Configure スクリプトの問題

configure スクリプトの実行時に何か問題が発生した時は config.log ファイルを確認してみてください。 configure スクリプトの実行中のエラーがこのファイルに出力されているかもしれません。 エラーログは必ずしも画面出力されるとは限りません。 問合せを行う際には 該当する 行のみを示してください。

1.6.3. コンパイル時の問題

コンパイル時に問題が発生した場合は、端末画面への出力とともに、数々のファイルの内容も問題解決の糸口となります。 configure スクリプトと make コマンドの実行によって端末画面に出力される情報は重要です。 問い合わせの際には、出力されるすべての情報を示す必要はありませんが、関連する情報は十分に含めてください。 以下に示すのは make コマンドの実行時に出力される情報を切り出してみた例です。

gcc -DALIASPATH=\"/mnt/clfs/usr/share/locale:.\"
-DLOCALEDIR=\"/mnt/clfs/usr/share/locale\"
-DLIBDIR=\"/mnt/clfs/usr/lib\"
-DINCLUDEDIR=\"/mnt/clfs/usr/include\" -DHAVE_CONFIG_H -I. -I.
-g -O2 -c getopt1.c
gcc -g -O2 -static -o make ar.o arscan.o commands.o dir.o
expand.o file.o function.o getopt.o implicit.o job.o main.o
misc.o read.o remake.o rule.o signame.o variable.o vpath.o
default.o remote-stub.o version.o opt1.o
-lutil job.o: In function `load_too_high':
/clfs/tmp/make-3.79.1/job.c:1565: undefined reference
to `getloadavg'
collect2: ld returned 1 exit status
make[2]: *** [make] Error 1
make[2]: Leaving directory `/clfs/tmp/make-3.79.1'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/clfs/tmp/make-3.79.1'
make: *** [all-recursive-am] Error 2

たいていの方は、上のような場合に終わりの数行しか示してくれません。

make [2]: *** [make] Error 1

問題を解決するにはあまりに不十分な情報です。 そんな情報だけでは「何かがオカしい結果となった」ことは分かっても「なぜオカしい結果となった」のかが分からないからです。 上に示したのは、十分な情報を提供して頂くべきであることを例示したものであり、実行されたコマンドや関連するエラーメッセージが十分に含んだ例となっています。

インターネット上に、問い合わせを行う方法を示した優れた文章があります。 http://catb.org/~esr/faqs/smart-questions.html この文章に示される内容やヒントを参考にして、より確実に回答が得られるよう心がけてください。

第II部 構築作業のための準備

第2章 新しいパーティションの準備

2.1. はじめに

この章では CLFS システムをインストールするパーティションを準備します。 パーティションを生成しファイルシステムを構築した上で、これをマウントします。

2.2. 変数 ${CLFS} の設定

本書の中では環境変数 CLFS を何度も用います。 CLFS システムのビルド作業時には常に定義しておくことを忘れないでください。 この変数は CLFS システムをビルドするディレクトリ名を設定します。 例えば /mnt/clfs というものを用います。 他のものとしても構いません。 CLFS を別のパーティションにビルドする場合、このマウントポイントはそのパーティションを示すようにしてください。 ディレクトリを取り決めたら、変数を以下のコマンドにより設定します。

export CLFS=/mnt/clfs

上のように変数を定義しておくと、例えば install -dv ${CLFS}/tools といったコマンドを、この通りに入力することで実行できるので便利です。 これが実行されると、シェルが "${CLFS}" を "/mnt/lfs" に (あるいは変数にセットされている別のディレクトリに) 置換して処理してくれます。

${CLFS} が常にセットされていることを忘れずに確認してください。 特に、別ユーザーでログインし直した場合 (su コマンドによって root ユーザーや別のユーザーでログインした場合) には、忘れずに確認してください。

echo ${CLFS}

上の出力結果が CLFS システムのビルドディレクトリであることを確認してください。 本書に示す例に従っている場合は /mnt/clfs が表示されるはずです。 出力が正しくない場合は、冒頭に示したコマンド実行により ${CLFS} 変数に正しいディレクトリを設定してください。

2.3. 新しいパーティションの生成

どのようなオペレーティングシステムでも同じことが言えますが、本システムでもインストール先は専用のパーティションを用いることにします。 CLFS システムを構築していくには、利用可能な空のパーティションか、あるいはパーティション化していないものをパーティションとして生成して利用することにします。 ただし異なるアーキテクチャーのシステムをビルドする場合は、単純に "/mnt/clfs" (あるいはあなたが定める別のディレクトリ) にてビルドすればよく、ターゲットマシンに向けてすべてを転送するだけ済みます。 CLFS のビルドにあたってパーティションを分けるつもりがない場合は、本章の残りの記述は読み飛ばしてパッケージとパッチに進んでいただいて構いません。

最小限のシステムであれば 6 GB 程度のディスク容量があれば十分です。 これだけあればパッケージやソースの収容に十分で、そこでコンパイル作業を行っていくことができます。 CLFS システムそのものがそれだけの容量を要するわけではありません。 これだけの容量は十分なテンポラリ領域のために必要となるものです。 パッケージをインストールした後はテンポラリ領域は開放されますが、コンパイルの間は多くの領域を利用します。 主要なシステムとして CLFS を構築するなら、さらにソフトウェアをインストールすることになるはずなので、さらなる容量 (2~10GB) が必要となります。

コンパイル処理において十分なランダムアクセスメモリ (Random Access Memory; RAM) を確保できるとは限りませんので、スワップ (swap) 領域をパーティションとして設けるのが普通です。 この領域へは利用頻度が低いデータを移すことで、アクティブな処理プロセスがより多くのメモリを確保できるようにカーネルが制御します。 swap パーティションは CLFS システムのものとホストシステムのものを共有することもできます。 その場合は新しいパーティションを作る必要はありません。

ディスクのパーティション生成は root ユーザーになって cfdisk コマンドや fdisk コマンドを使って行います。 コマンドラインオプションにはパーティションを生成するハードディスク名を指定します。 例えば IDE (Integrated Drive Electronics) ディスクや Serial ATA (SATA) ディスクであれば /dev/sda といったものになります。 そして Linux ネイティブパーティションと、必要なら swap パーティションを生成します。 プログラムの利用方法について不明であれば cfdisk(8)fdisk(8) を参照してください。

新しく生成したパーティションの名前を覚えておいてください。 (例えば sda5 など。) 本書ではこのパーティションを CLFS パーティションとして説明していきます。 また swap パーティションの名前も忘れないでください。 これらの名前は、後に生成する /etc/fstab ファイルに記述するために必要となります。

2.4. ファイルシステムの生成

空のパーティションが準備できたのでファイルシステムを作ります。 Linux において広く用いられるファイルシステムは ext2 (extended file system) です。 より新しく大容量のハードディスクに対しては、ジャーナリングファイルシステムが一般的となりつつあります。 本書では ext2 ファイルシステムを生成することにします。 他のファイルシステムの生成方法については http://cblfs.clfs.org/index.php?section=6#File_System を参照してください。

CLFS 用のパーティションに対して ext2 ファイルシステムを生成するために、root ユーザーになって以下のコマンドを実行します。

mke2fs /dev/[xxx]

[xxx] の部分は CLFS パーティション名に合わせて置き換えてください。 (本書の例では sda5 としています。)

注記

ホストとして利用する Linux ディストリビューションの中には、ファイルシステムを生成するツール (E2fsprogs) に特別な機能を実装しているものがあります。 CLFS システムをブートする際に、それらの機能が原因で問題が発生する場合があります。 そのような機能は CLFS においてインストールする E2fsprogs ではサポートしていません。 おそらくは unsupported filesystem features, upgrade your e2fsprogs(サポートされていないファイルシステムです。 e2fsprogs をアップグレードしてください) といったエラーメッセージが表示されるはずです。 ホストシステムが機能拡張しているかどうかを確認するには以下のコマンドを実行します。

debugfs -R feature /dev/[xxx]

コマンドの出力結果の中に dir_index, ext_attr, filetype, large_file, resize_inode, sparse_super といったものとは異なるものが表示されていたら、あなたのホストシステムは機能拡張がなされていることを意味します。 後に問題となりますので、純粋な E2fsprogs パッケージをコンパイルし、これを用いて CLFS パーティションのファイルシステムを再生成してください。 root ユーザーになって以下を実行します。

cd /tmp
tar xjf /path/to/sources/e2fsprogs-1.43.4.tar.bz2
cd e2fsprogs-1.43.4
mkdir build
cd build
../configure
make #note that we intentionally don't 'make install' here!
./misc/mke2fs /dev/[xxx]
cd /tmp
rm -rf e2fsprogs-1.43.4

swap パーティションを生成した場合は初期化する必要があります。 root ユーザーになって以下のコマンドを実行します。

mkswap /dev/[yyy]

[yyy] の部分は swap パーティションの名に合わせて置き換えてください。 既存の swap パーティションを利用する場合は初期化する必要はありません。

2.5. 新しいパーティションのマウント

ファイルシステムが生成できたら、パーティションをアクセスできるようにします。 これを行うためにはマウントポイントを定める必要があります。

CLFS 変数がセットされていることを確認してください。 セットされていない場合は root ユーザーになって以下を実行します。

export CLFS=/mnt/clfs

次にマウントポイントを生成し CLFS ファイルシステムをマウントします。 root ユーザーになって以下を実行します。

mkdir -pv ${CLFS}
mount -v /dev/[xxx] ${CLFS}

[xxx] の部分は CLFS パーティション名に合わせて置き換えてください。

CLFS において複数のパーティションを利用する場合 (例えば //usr など) 、root ユーザーになって以下のようにマウントします。

mkdir -pv ${CLFS}
mount -v /dev/[xxx] ${CLFS}
mkdir -v ${CLFS}/usr
mount -v /dev/[yyy] ${CLFS}/usr

[xxx][yyy] の部分は、それぞれ適切なパーティション名に置き換えてください。

この新しいパーティションは特別な制限オプション (nosuid, nodev, noatime など) は設定せずにマウントします。 mount | grep ${CLFS} というコマンドを実行すれば、CLFS パーティションがどのようなオプション設定によりマウントされているかが分かります。 もし nosuid, nodev, noatime オプションが設定されていたら、マウントし直してください。

こうして動作環境が整いました。次はパッケージのダウンロードです。

第3章 パッケージとパッチ

3.1. はじめに

この章では基本的な Linux システム構築のためにダウンロードするべきパッケージの一覧を示します。 各パッケージのバージョンは動作が確認されているものを示しており、本書ではこれに基づいて説明します。 ここに示すバージョンよりも新しいものは使わないようお勧めします。 あるバージョンでビルドしたコマンドが、新しいバージョンでも動作する保証はないからです。 最新のパッケージの場合、何かの対処を要するかもしれません。 そのような対処方法は本書の開発版において開発され安定化が図られるかもしれません。

ダウンロードサイトは常にアクセス可能であるとは限りません。 本書が提供された後にダウンロードする場所が変更になっていたら Google (http://www.google.com/) を使って検索してみてください。 たいていのパッケージを見つけ出すことが出来るはずです。 それでも見つけられなかったら http://clfs.org/files/packages/sysvinit/ に示されている方法に従って入手してください。

${CLFS}/sources というディレクトリを生成しソースやパッチの保存場所とし、そこでビルドを行う作業ディレクトリとします。 他の場所でコンパイル作業をする場合は予期しないことが起きるかもしれませんから注意してください。

ダウンロードを行う前にまずはそのようなディレクトリを生成します。 root ユーザーとなって以下のコマンドを実行します。

mkdir -v ${CLFS}/sources

このディレクトリには書き込み権限とスティッキーを与えます。 ディレクトリに "スティッキー (sticky)" を与えるということは、複数ユーザーに対して書き込み権限が与えられても、削除については所有者しか実行出来ないようにすることです。 root ユーザーになり以下のコマンドを実行して書き込み権限とスティッキーを定めます。

chmod -v a+wt ${CLFS}/sources

必要となるパッケージとパッチはこれ以降の説明ページに示されたリンクを使ってダウンロードすることができます。 あるいは wget コマンドにて ダウンロードリスト を用いて入手することもできます。

wget -i dl.list -P ${CLFS}/sources

ダウンロードしたパッケージ類の検証には、以下の MD5 あるいは SHA1 によるチェックサムリストをダウンロードして実行します。

MD5SUMS:

pushd ${CLFS}/sources
md5sum -c MD5SUMS
popd

SHA1SUMS:

pushd ${CLFS}/sources
sha1sum -c SHA1SUMS
popd

3.2. 全パッケージ

以下に示すパッケージをダウンロードするなどしてすべて入手してください。

Acl (2.2.52) - 384 KB:

ホームページ: http://savannah.nongnu.org/projects/acl

ダウンロード: http://download.savannah.gnu.org/releases/acl/acl-2.2.52.src.tar.gz

MD5 sum: a61415312426e9c2212bd7dc7929abda

Attr (2.4.47) - 340 KB:

ホームページ: http://savannah.nongnu.org/projects/attr

ダウンロード: http://download.savannah.gnu.org/releases/attr/attr-2.4.47.src.tar.gz

MD5 sum: 84f58dec00b60f2dc8fd1c9709291cc7

Autoconf (2.69) - 1,188 KB:

ホームページ: http://www.gnu.org/software/autoconf/autoconf.html

ダウンロード: http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.xz

MD5 sum: 50f97f4159805e374639a73e2636f22e

Automake (1.15) - 1,497 KB:

ホームページ: http://www.gnu.org/software/automake

ダウンロード: http://ftp.gnu.org/gnu/automake/automake-1.15.tar.xz

MD5 sum: 9a1ddb0e053474d9d1105cfe39b0c48d

Bash (4.4) - 9,377 KB:

ホームページ: http://www.gnu.org/software/bash

ダウンロード: http://ftp.gnu.org/gnu/bash/bash-4.4.tar.gz

MD5 sum: 148888a7c95ac23705559b6f477dfe25

Bc (1.07.1) - 420 KB:

ホームページ: http://www.gnu.org/software/bc/

ダウンロード: http://ftp.gnu.org/gnu/bc/bc-1.07.1.tar.gz

MD5 sum: cda93857418655ea43590736fc3ca9fc

Binutils (2.28) - 26,556 KB:

ホームページ: http://sources.redhat.com/binutils

ダウンロード: http://ftp.gnu.org/gnu/binutils/binutils-2.28.tar.bz2

MD5 sum: 9e8340c96626b469a603c15c9d843727

Bison (3.0.4) - 1,974 KB:

ホームページ: http://www.gnu.org/software/bison

ダウンロード: http://ftp.gnu.org/gnu/bison/bison-3.0.4.tar.xz

MD5 sum: c342201de104cc9ce0a21e0ad10d4021

CLFS 用 Bootscripts (3.0-20140710) - 41 KB:

ダウンロード: http://ftp.clfs.org/pub/clfs/conglomeration/bootscripts-cross-lfs/bootscripts-cross-lfs-3.0-20140710.tar.xz

MD5 sum: ebe69a3adc1da12bfcdfab3e094eeb1a

Bzip2 (1.0.6) - 764 KB:

ホームページ: http://www.bzip.org/

ダウンロード: http://www.bzip.org/1.0.6/bzip2-1.0.6.tar.gz

MD5 sum: 00b516f4704d4a7cb50a1d97e6e8e15b

Check (0.11.0) - 754 KB:

ホームページ: http://libcheck.github.io/check/

ダウンロード: https://github.com/libcheck/check/releases/download/0.11.0/check-0.11.0.tar.gz

MD5 sum: 9b90522b31f5628c2e0f55dda348e558

CLFS Network Scripts (20140224) - 22 KB:

ダウンロード: http://clfs.org/files/clfs-network-scripts-20140224.tar.xz

MD5 sum: 831308d5e80bdaa3f494dc218ee43f78

Coreutils (8.27) - 5,286 KB:

ホームページ: http://www.gnu.org/software/coreutils/coreutils.html

ダウンロード: http://ftp.gnu.org/gnu/coreutils/coreutils-8.27.tar.xz

MD5 sum: 502795792c212932365e077946d353ae

DejaGNU (1.6) - 524 KB:

ホームページ: http://www.gnu.org/software/dejagnu

ダウンロード: http://ftp.gnu.org/gnu/dejagnu/dejagnu-1.6.tar.gz

MD5 sum: 1fdc2eb0d592c4f89d82d24dfdf02f0b

DHCPCD (6.11.5) - 198 KB:

ホームページ: http://roy.marples.name/projects/dhcpcd

ダウンロード: http://roy.marples.name/downloads/dhcpcd/dhcpcd-6.11.5.tar.xz

MD5 sum: 2465624b62c1154f0e89dc69c42c849b

Diffutils (3.6) - 1,398 KB:

ホームページ: http://www.gnu.org/software/diffutils

ダウンロード: http://ftp.gnu.org/gnu/diffutils/diffutils-3.6.tar.xz

MD5 sum: 07cf286672ced26fba54cd0313bdc071

E2fsprogs (1.43.4) - 5,266 KB:

ホームページ: http://e2fsprogs.sourceforge.net

ダウンロード: http://www.kernel.org/pub/linux/kernel/people/tytso/e2fsprogs/v1.43.4/e2fsprogs-1.43.4.tar.xz

MD5 sum: 8903379ef0b902f4e29b6cafea359fe1

Eudev (1.7) - 1,756 KB:

ホームページ: https://wiki.gentoo.org/wiki/Eudev

ダウンロード: http://dev.gentoo.org/~blueness/eudev/eudev-1.7.tar.gz

MD5 sum: 80649a0350ff9620fc2da9562d9f2a6a

Expect (5.45) - 616 KB:

ホームページ: http://expect.sourceforge.net

ダウンロード: http://downloads.sourceforge.net/project/expect/Expect/5.45/expect5.45.tar.gz

MD5 sum: 44e1a4f4c877e9ddc5a542dfa7ecc92b

File (5.31) - 792 KB:

ホームページ: http://www.darwinsys.com/file

ダウンロード: ftp://ftp.astron.com/pub/file/file-5.31.tar.gz

MD5 sum: 319627d20c9658eae85b056115b8c90a

注記

File パッケージ (5.31) は上記の場所から入手できなくなっているかもしれません。 これはサイト管理者が、新バージョンのリリースと同時に古いバージョンを削除することがあるためです。 適切なバージョンをダウンロードするためには、以下に示す別のサイトを参照してください。 http://clfs.org/files/packages/sysvinit/

Findutils (4.6.0) - 3,780 KB:

ホームページ: http://www.gnu.org/software/findutils

ダウンロード: http://ftp.gnu.org/gnu/findutils/findutils-4.6.0.tar.gz

MD5 sum: 9936aa8009438ce185bea2694a997fc1

Flex (2.6.4) - 1,419 KB:

ホームページ: https://github.com/westes/flex

ダウンロード: https://github.com/westes/flex/releases/download/v2.6.4/flex-2.6.4.tar.gz

MD5 sum: 2882e3179748cc9f9c23ec593d6adc8d

Gawk (4.1.4) - 2,368 KB:

ホームページ: http://www.gnu.org/software/gawk

ダウンロード: http://ftp.gnu.org/gnu/gawk/gawk-4.1.4.tar.xz

MD5 sum: 4e7dbc81163e60fd4f0b52496e7542c9

GCC (7.1.0) - 84,304 KB:

ホームページ: http://gcc.gnu.org

ダウンロード: ftp://gcc.gnu.org/pub/gcc/releases/gcc-7.1.0/gcc-7.1.0.tar.bz2

MD5 sum: 6bf56a2bca9dac9dbbf8e8d1036964a8

GDBM (1.13) - 892 KB:

ホームページ: http://www.gnu.org/software/gdbm

ダウンロード: http://ftp.gnu.org/gnu/gdbm/gdbm-1.13.tar.gz

MD5 sum: 8929dcda2a8de3fd2367bdbf66769376

Gettext (0.19.8.1) - 7,210 KB:

ホームページ: http://www.gnu.org/software/gettext

ダウンロード: http://ftp.gnu.org/gnu/gettext/gettext-0.19.8.1.tar.xz

MD5 sum: df3f5690eaa30fd228537b00cb7b7590

Glibc (2.25) - 13,874 KB:

ホームページ: http://www.gnu.org/software/libc/

ダウンロード: http://ftp.gnu.org/gnu/glibc/glibc-2.25.tar.xz

MD5 sum: 1496c3bf41adf9db0ebd0af01f202eed

GMP (6.1.2) - 1,946 KB:

ホームページ: https://gmplib.org/

ダウンロード: http://ftp.gnu.org/gnu/gmp/gmp-6.1.2.tar.xz

MD5 sum: f58fa8001d60c4c77595fbbb62b63c1d

Grep (3.0) - 1,375 KB:

ホームページ: http://www.gnu.org/software/grep

ダウンロード: http://ftp.gnu.org/gnu/grep/grep-3.0.tar.xz

MD5 sum: fa07c1616adeb9c3262be5177d10ad4a

Groff (1.22.3) - 4,189 KB:

ホームページ: http://www.gnu.org/software/groff

ダウンロード: http://ftp.gnu.org/gnu/groff/groff-1.22.3.tar.gz

MD5 sum: cc825fa64bc7306a885f2fb2268d3ec5

Gzip (1.8) - 728 KB:

ホームページ: http://www.gnu.org/software/gzip/gzip.html

ダウンロード: http://ftp.gnu.org/gnu/gzip/gzip-1.8.tar.xz

MD5 sum: f7caabb65cddc1a4165b398009bd05b9

Iana-Etc (2.30) - 204 KB:

ホームページ: https://www.archlinux.org/packages/core/any/iana-etc/

ダウンロード: http://ftp.clfs.org/pub/clfs/conglomeration/iana-etc/iana-etc-2.30.tar.bz2

MD5 sum: 3ba3afb1d1b261383d247f46cb135ee8

IPRoute2 (4.9.0) - 613 KB:

ホームページ: http://www.linuxfoundation.org/collaborate/workgroups/networking/iproute2

ダウンロード: http://www.kernel.org/pub/linux/utils/net/iproute2/iproute2-4.9.0.tar.xz

MD5 sum: 44a8371a4b2c40e48e4c9f98cbd41391

IPutils (s20150815) - 152 KB:

ホームページ: http://www.linuxfoundation.org/collaborate/workgroups/networking/iputils

ダウンロード: http://clfs.org/files/packages/sysvinit/iputils-s20150815.tar.xz

MD5 sum: d184faea97095265452dce19ef98daf6

ISL (0.17.1) - 1,441 KB:

ホームページ: http://isl.gforge.inria.fr

ダウンロード: http://isl.gforge.inria.fr/isl-0.17.1.tar.xz

MD5 sum: 20b83900e234f982a566a3a6b3503bf1

Kbd (2.0.4) - 1,019 KB:

ホームページ: http://ftp.altlinux.org/pub/people/legion/kbd/

ダウンロード: http://www.kernel.org/pub/linux/utils/kbd/kbd-2.0.4.tar.xz

MD5 sum: c1635a5a83b63aca7f97a3eab39ebaa6

Kmod (24) - 537 KB:

ホームページ: http://git.kernel.org/?p=utils/kernel/kmod/kmod.git;a=summary

ダウンロード: http://www.kernel.org/pub/linux/utils/kernel/kmod/kmod-24.tar.xz

MD5 sum: 08297dfb6f2b3f625f928ca3278528af

Less (491) - 320 KB:

ホームページ: http://www.greenwoodsoftware.com/less

ダウンロード: http://www.greenwoodsoftware.com/less/less-491.tar.gz

MD5 sum: 81e260e8b12f253c31565acad6ee0e59

Libcap (2.25) - 64 KB:

ホームページ: http://sites.google.com/site/fullycapable/

ダウンロード: http://www.kernel.org/pub/linux/libs/security/linux-privs/libcap2/libcap-2.25.tar.xz

MD5 sum: 6666b839e5d46c2ad33fc8aa2ceb5f77

Libee (0.4.1) - 352 KB:

ホームページ: http://www.libee.org/

ダウンロード: http://www.libee.org/download/files/download/libee-0.4.1.tar.gz

MD5 sum: 7bbf4160876c12db6193c06e2badedb2

Libestr (0.1.10) - 336 KB:

ホームページ: http://libestr.adiscon.com/

ダウンロード: http://libestr.adiscon.com/files/download/libestr-0.1.10.tar.gz

MD5 sum: f4c9165a23587e77f7efe65d676d5e8e

Libpipeline (1.4.1) - 805 KB:

ホームページ: http://libpipeline.nongnu.org/

ダウンロード: http://download.savannah.gnu.org/releases/libpipeline/libpipeline-1.4.1.tar.gz

MD5 sum: e54590ec68d6c1239f67b5b44e92022c

Libtool (2.4.6) - 948 KB:

ホームページ: http://www.gnu.org/software/libtool

ダウンロード: http://ftp.gnu.org/gnu/libtool/libtool-2.4.6.tar.xz

MD5 sum: 1bfb9b923f2c1339b4d2ce1807064aa5

Linux (4.9) - 93,192 KB:

ホームページ: http://www.kernel.org

ダウンロード: http://www.kernel.org/pub/linux/kernel/v4.x/linux-4.9.tar.xz

MD5 sum: 59351116e4dfdb9072dd8cccd15e1800

M4 (1.4.18) - 1,208 KB:

ホームページ: http://www.gnu.org/software/m4/m4.html

ダウンロード: http://ftp.gnu.org/gnu/m4/m4-1.4.18.tar.xz

MD5 sum: 730bb15d96fffe47e148d1e09235af82

Make (4.2.1) - 1,407 KB:

ホームページ: http://www.gnu.org/software/make

ダウンロード: http://ftp.gnu.org/gnu/make/make-4.2.1.tar.bz2

MD5 sum: 15b012617e7c44c0ed482721629577ac

Man-DB (2.7.6.1) - 1,541 KB:

Home page: http://man-db.nongnu.org

ダウンロード: http://clfs.org/files/packages/sysvinit/man-db-2.7.6.1.tar.xz

MD5 sum: 2948d49d0ed7265f60f83aa4a9ac9268

Man-pages (4.09) - 1,522 KB:

ホームページ: http://www.win.tue.nl/~aeb/linux/man

ダウンロード: http://www.kernel.org/pub/linux/docs/man-pages/man-pages-4.09.tar.xz

MD5 sum: 91c721409bbf823d8f62bee3a1fe8ae3

MPC (1.0.3) - 670 KB:

ホームページ: http://www.multiprecision.org/

ダウンロード: http://www.multiprecision.org/mpc/download/mpc-1.0.3.tar.gz

MD5 sum: d6a1d5f8ddea3abd2cc3e98f58352d26

MPFR (3.1.5) - 1,127 KB:

ホームページ: http://www.mpfr.org/

ダウンロード: http://www.mpfr.org/mpfr-3.1.5/mpfr-3.1.5.tar.xz

MD5 sum: c4ac246cf9795a4491e7766002cd528f

Ncurses (6.0) - 3,132 KB:

ホームページ: http://www.gnu.org/software/ncurses

ダウンロード: http://ftp.gnu.org/gnu/ncurses/ncurses-6.0.tar.gz

MD5 sum: ee13d052e1ead260d7c28071f46eefb1

Patch (2.7.5) - 728 KB:

ホームページ: http://savannah.gnu.org/projects/patch

ダウンロード: http://ftp.gnu.org/gnu/patch/patch-2.7.5.tar.xz

MD5 sum: e3da7940431633fb65a01b91d3b7a27a

Perl (5.26.0) - 11,962 KB:

ホームページ: https://www.perl.org

ダウンロード: http://www.cpan.org/src/5.0/perl-5.26.0.tar.xz

MD5 sum: 8c6995718e4cb62188f0d5e3488cd91f

Pkg-config-lite (0.28-1) - 384 KB:

ホームページ: http://sourceforge.net/projects/pkgconfiglite

ダウンロード: http://sourceforge.net/projects/pkgconfiglite/files/0.28-1/pkg-config-lite-0.28-1.tar.gz

MD5 sum: 61f05feb6bab0a6bbfab4b6e3b2f44b6

Procps-ng (3.3.12) - 845 KB:

ホームページ: http://sourceforge.net/projects/procps-ng

ダウンロード: http://sourceforge.net/projects/procps-ng/files/Production/procps-ng-3.3.12.tar.xz

MD5 sum: 957e42e8b193490b2111252e4a2b443c

Psmisc (22.21) - 458 KB:

ホームページ: http://psmisc.sourceforge.net

ダウンロード: http://downloads.sourceforge.net/psmisc/psmisc-22.21.tar.gz

MD5 sum: 935c0fd6eb208288262b385fa656f1bf

Readline (7.0) - 2,910 KB:

ホームページ: http://cnswww.cns.cwru.edu/php/chet/readline/rltop.html

ダウンロード: http://ftp.gnu.org/gnu/readline/readline-7.0.tar.gz

MD5 sum: 205b03a87fc83dab653b628c59b9fc91

Rsyslog (6.4.2) - 2,519 KB:

ホームページ: http://www.rsyslog.com/

ダウンロード: http://www.rsyslog.com/files/download/rsyslog/rsyslog-6.4.2.tar.gz

MD5 sum: 7de0124ec7d67ce2bfda0009ab1263ee

Sed (4.4) - 1,182 KB:

ホームページ: http://www.gnu.org/software/sed

ダウンロード: http://ftp.gnu.org/gnu/sed/sed-4.4.tar.xz

MD5 sum: e0c583d4c380059abd818cd540fe6938

Shadow (4.5) - 1,627 KB:

ホームページ: http://pkg-shadow.alioth.debian.org

ダウンロード: https://github.com/shadow-maint/shadow/releases/download/4.5/shadow-4.5.tar.xz

MD5 sum: c350da50c2120de6bb29177699d89fe3

Sysvinit (2.88dsf) - 104 KB:

ホームページ: http://savannah.nongnu.org/projects/sysvinit

ダウンロード: http://download.savannah.gnu.org/releases/sysvinit/sysvinit-2.88dsf.tar.bz2

MD5 sum: 6eda8a97b86e0a6f59dabbf25202aa6f

Tar (1.29) - 1,996 KB:

ホームページ: http://www.gnu.org/software/tar

ダウンロード: http://ftp.gnu.org/gnu/tar/tar-1.29.tar.xz

MD5 sum: a1802fec550baaeecff6c381629653ef

Tcl (8.6.4) - 8,857 KB:

ホームページ: http://www.tcl.tk

ダウンロード: http://downloads.sourceforge.net/tcl/tcl-core8.6.4-src.tar.gz

MD5 sum: 8b8c9d85469d8dbe32e51117b8ef11e3

Texinfo (6.3) - 4,468 KB:

ホームページ: http://www.gnu.org/software/texinfo

ダウンロード: http://ftp.gnu.org/gnu/texinfo/texinfo-6.3.tar.xz

MD5 sum: 32baefe5c7080dfb512a4eac5ce67b2a

タイムゾーン (Time Zone) データ (2017b) - 324 KB:

ホームページ: http://www.iana.org/time-zones

ダウンロード: http://www.iana.org/time-zones/repository/releases/tzdata2017b.tar.gz

MD5 sum: 50dc0dc50c68644c1f70804f2e7a1625

Util-linux (2.29.2) - 4,278 KB:

ダウンロード: http://www.kernel.org/pub/linux/utils/util-linux/v2.29/util-linux-2.29.2.tar.xz

MD5 sum: 63c40c2068fcbb7e1d5c1d281115d973

Vim (8.0) - 10,867 KB:

ホームページ: http://www.vim.org

ダウンロード: ftp://ftp.vim.org/pub/vim/unix/vim-8.0.tar.bz2

MD5 sum: b35e794140c196ff59b492b56c1e73db

XZ Utils (5.2.3) - 1,032 KB:

ホームページ: http://tukaani.org/xz/

ダウンロード: http://tukaani.org/xz/xz-5.2.3.tar.xz

MD5 sum: 60fb79cab777e3f71ca43d298adacbd5

Zlib (1.2.11) - 468 KB:

ホームページ: http://www.zlib.net

ダウンロード: http://zlib.net/zlib-1.2.11.tar.xz

MD5 sum: 85adef240c5f370b308da8c938951a68

注記

Zlib (1.2.11) は上記の場所から入手できなくなっているかもしれません。 これはサイト管理者が、新バージョンのリリースと同時に古いバージョンを削除することがあるためです。 適切なバージョンをダウンロードするためには、以下に示す別のサイトを参照してください。 http://clfs.org/files/packages/sysvinit/

全パッケージのサイズ合計: 約 339 MB

3.3. 追加のパッケージ (x86_64 Multilib 向け)

GRUB (2.00) - 5,020 KB:

ホームページ: http://www.gnu.org/software/grub

ダウンロード: http://ftp.gnu.org/gnu/grub/grub-2.00.tar.xz

MD5 sum: a1043102fbc7bcedbf53e7ee3d17ab91

全パッケージのサイズ合計: 約 5 MB

3.4. 必要なパッチ

パッケージに加えて、いくつかのパッチも必要となります。 それらのパッチはパッケージの不備をただすもので、本来なら開発者が修正すべきものです。 パッチは不備修正だけでなく、ちょっとした修正を施して扱いやすいものにする目的のものもあります。 以下に示すものが CLFS システム構築に必要となるパッチすべてです。

日本語訳情報

各パッチに付けられている簡略な名称については、訳出せずそのまま表記することにします。

Automake Perl Patch - 0.685 KB:

ダウンロード: http://patches.clfs.org/sysvinit/automake-1.15-perl_5_26-1.patch

MD5 sum: 99dd9d0a31f4a51fbe77bbc13aa9d783

Bash Branch Update Patch - 17 KB:

ダウンロード: http://patches.clfs.org/sysvinit/bash-4.4-branch_update-1.patch

MD5 sum: 9f59bec94bfd1023d9c6a76b49187420

Bootscripts Cross-LFS Updates Patch - 16 KB:

ダウンロード: http://patches.clfs.org/sysvinit/bootscripts-cross-lfs-3.0-20140710-tools_updates-2.patch

MD5 sum: 460b0a4710dd74edea76b5398fd24b47

Coreutils Uname Patch - 5.020 KB:

ダウンロード: http://patches.clfs.org/sysvinit/coreutils-8.27-uname-1.patch

MD5 sum: e9bc0459d313f677cebc2095c3b18818

Iana-Etc Protocol and Port Numbers Update - 282 KB:

ダウンロード: http://patches.clfs.org/sysvinit/iana-etc-2.30-numbers_update-20140202-2.patch.xz

MD5 sum: b0e7051fef0b3ba064209a5f3d23bd2a

IPUtils Fixes Patch - 47 KB:

ダウンロード: http://patches.clfs.org/sysvinit/iputils-s20150815-build-1.patch

MD5 sum: 113c166a13d33a3ec10e1ec65542bdc3

Linux Sublevel Patch - 465 KB:

ダウンロード: http://patches.clfs.org/sysvinit/patch-4.9.21.xz

MD5 sum: 0a68ef3615c64bd5ee54a3320e46667d

MPFR Fixes Patch - 5.101 KB:

ダウンロード: http://patches.clfs.org/sysvinit/mpfr-3.1.5-fixes-1.patch

MD5 sum: c9e1bfc93ee8d90226772b628ab77f38

Ncurses Bash Patch - .743 KB:

ダウンロード: http://patches.clfs.org/sysvinit/ncurses-6.0-bash_fix-1.patch

MD5 sum: e3b6d45ce0f0b87e0df98e5bc0d09415

Readline Branch Update - 3.049 KB:

ダウンロード: http://patches.clfs.org/sysvinit/readline-7.0-branch_update-1.patch

MD5 sum: 8b429202ce52362ae927f36a48461c23

Sysvinit Tools Updates Patch - 2.339 KB:

ダウンロード: http://patches.clfs.org/sysvinit/sysvinit-2.88dsf-tools_updates-1.patch

MD5 sum: c3f6981c46868b68bfd58921570ea51f

Vim Branch Update Patch - 961 KB:

ダウンロード: http://patches.clfs.org/sysvinit/vim-8.0-branch_update-1.patch

MD5 sum: 5a076d526aee80e1d32decf46b5287f9

全パッチの合計サイズ: 約 1,804.937 KB

上に挙げた必須のパッチに加えて LFS コミュニティが提供する任意のパッチが数多くあります。 それらは微小な不備改修や、デフォルトでは利用できない機能を有効にするなどを行います。 http://patches.clfs.org/sysvinit/ にて提供しているパッチ類を確認してください。 そして自分のシステムにとって必要なものは自由に適用してください。

3.5. 追加のパッチ (x86_64 Multilib 向け)

日本語訳情報

各パッチに付けられている簡略な名称については、訳出せずそのまま表記することにします。

GCC Specs Patch - 21 KB:

ダウンロード: http://patches.clfs.org/sysvinit/gcc-7.1.0-specs-1.patch

MD5 sum: 9f4efe1ae2cb46e6ad41b2ba2a24e5d8

Perl Configure Multilib Patch - 2.030 KB:

ダウンロード: http://patches.clfs.org/sysvinit/perl-5.26.0-Configure_multilib-1.patch

MD5 sum: 87bbdf3d6414916f9e89531a2d4bfefa

全パッチの合計サイズ: 約 23.03 KB

第4章 準備作業の仕上げ

4.1. はじめに

本章では一時システムをビルドするために、あともう少し作業を行います。 ${CLFS} ディレクトリ内にインストールディレクトリを作ります。 リスク軽減のために一般ユーザーを生成し、このユーザーにおいてのビルド環境を作ります。

4.2. ${CLFS}/tools ディレクトリの生成

一時システムの構築 にてコンパイルするプログラムは、すべて ${CLFS}/tools ディレクトリ配下にインストールされ、基本的なシステムソフトウェアのインストール にてコンパイルされるプログラムとは区別されます。 ここでコンパイルするプログラムは一時的ツールであって、最終的な CLFS システムを構成するものではありません。 このようにプログラムを分離したディレクトリに置いておけば、後に必要がなくなった時には簡単に削除できます。 またホストシステムの実行環境に入り混じってしまうことを避ける意味もあります。 (一時システムの構築 の作業でついうっかり、といった失敗がなくなります。)

必要なディレクトリを生成するために、root ユーザーになって以下を実行します。

install -dv ${CLFS}/tools

次はホストシステム上に、/tools のシンボリックリンクを生成します。 このリンクは CLFS パーティション上の新たなディレクトリを指し示すことになります。 先ほどと同じく root ユーザーになって以下を実行します。

ln -sv ${CLFS}/tools /

注記

上のコマンドに間違いはありません。 ln コマンドにはいくつか文法の異なるバージョンがあります。 間違いがあると思った場合には info coreutils lnln(1) をよく確認してください。

シンボリックリンクを作成することで、ツールチェーンをコンパイルする準備が整いました。 これにより常に /tools ディレクトリを参照したツールチェーンが生成でき、コンパイラー、アセンブラー、リンカーが動作するようになります。 これが一時システムの作業場所となります。

4.3. ${CLFS}/cross-tools ディレクトリの生成

クロスコンパイルツールの構築 にてビルドするクロス binutils やコンパイラーは、${CLFS}/cross-tools ディレクトリ配下にインストールされ、ホストシステム内のプログラムとは区別されます。 ここでコンパイルするプログラムはクロスコンパイルツールであって、最終的な CLFS システムや一時システムを構成するものではありません。 このようにプログラムを分離したディレクトリに置いておけば、後に必要がなくなった時には簡単に削除できます。

必要なディレクトリを生成するために、root ユーザーになって以下を実行します。

install -dv ${CLFS}/cross-tools

次はホストシステム上に、/cross-tools のシンボリックリンクを生成します。 このリンクは CLFS パーティション上の新たなディレクトリを指し示すことになります。 先ほどと同じく root ユーザーになって以下を実行します。

ln -sv ${CLFS}/cross-tools /

4.4. CLFS ユーザーの追加

root ユーザーでログインしていると、ちょっとした誤操作がもとで、システムを破壊する重大な事態につながることがあります。 そこでパッケージのビルドにあたっては通常のユーザー権限にて作業することにします。 あなた自身のユーザーを利用するのでも構いませんが、全く新しいユーザー環境として clfs というユーザーを作成するのが分かりやすいでしょう。 所属するグループも clfs という名で作成します。 ビルド作業においてはこのユーザーを利用していきます。 そこで root ユーザーになって、新たなユーザーを追加する以下のコマンドを実行します。

groupadd clfs
useradd -s /bin/bash -g clfs -d /home/clfs clfs
mkdir -pv /home/clfs
chown -v clfs:clfs /home/clfs

コマンドラインオプションの意味

-s /bin/bash

clfs ユーザーが利用するデフォルトのシェルを bash とします。

重要項目

ビルド手順においては bash シェルを既に用いているものとします。

-g clfs

このオプションは clfs グループに対して新たなユーザーを追加します。

-d /home/clfs

このオプションはユーザーのホームディレクトリを設定するものですが、ディレクトリ生成は行いません。 useradd コマンドに -m オプションを与えて実行すればホームディレクトリの生成を行うこともできます。 ただこの場合にはホストシステムの /etc/skel ディレクトリからファイルコピーが行われてしまいます。 ここではクリーンなユーザー環境を生成することにします。 つまりユーザー追加を行った後に空のホームディレクトリを生成するという方法をとります。

clfs

生成するグループおよびユーザーの名称を与えます。

clfs ユーザーとしてログインするために clfs に対するパスワードを設定します。 (root ユーザーでログインしている時に clfs へのユーザー切り替えを行なう場合には clfs ユーザーのパスワードは設定しておく必要はありません。)

passwd clfs

root ユーザーとなり、${CLFS}/cross-tools${CLFS}/tools のディレクトリ所有者を clfs とすることにより clfs のフルアクセス権限を与えます。

chown -v clfs ${CLFS}/tools
chown -v clfs ${CLFS}/cross-tools

前述したような作業ディレクトリを作成している場合は root ユーザーになって以下のコマンドを実行します。 その作業ディレクトリに対しても所有者を clfs ユーザーとします。

chown -v clfs ${CLFS}/sources

clfs でログインします。 これはディスプレイマネージャーを通じて仮想端末を用いることもできます。 要は以下のユーザーコマンドに相当するログインを行います。

su - clfs

パラメーター「-」は su コマンドの実行において、非ログイン (non-login) シェルではなく、ログインシェルを起動することを指示します。 ログインシェルとそうでないシェルの違いについては bash(1)info bash を参照してください。

注記

特に指定を行わない限りここから先のコマンド実行は、すべて clfs ユーザーにより行っていくことになります。

4.5. 環境設定

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

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

clfs ユーザーとしてログインした時、起動されるシェルは普通はログイン シェルとなります。 この時、ホストシステムの /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
CLFS=/mnt/clfs
LC_ALL=POSIX
PATH=/cross-tools/bin:/bin:/usr/bin
export CLFS LC_ALL PATH
unset CFLAGS CXXFLAGS PKG_CONFIG_PATH
EOF

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

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

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

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

/cross-tools/bin ディレクトリを PATH 変数の先頭に設定します。 こうすることで一時システムにおける各パッケージのビルド時には クロスコンパイルツールの構築 において構築するクロスコンパイラーが利用されることになります。 つまりホストシステム内にあるコンパイラーが用いられないようにします。 この設定は、ハッシュ機能をオフとしたことと連携し、クロスコンパイルツールを用いて /tools ディレクトリ内に一時システムを構築していくものとなります。

CFLAGSCXXFLAGSPKG_CONFIG_PATH の各変数は、一時システムの構築時には設定すべきではありません。 そこでそれらは非設定とします。

一時的なツールを構築する準備の最後として、今作り出したユーザープロファイルを source によって取り込みます。

source ~/.bash_profile

4.6. ビルド変数

ホストおよびターゲットの設定

クロスコンパイルツールをビルドする間には、環境に合わせた固有の情報を変数に設定しておく必要があります。 一つめの変数はホストマシンのターゲットの三つ組 (target triplets) を変数 CLFS_HOST に設定します。 ホストとターゲットのアーキテクチャーは同一である可能性があるわけですが、両者が同一であるとクロスコンパイル作業がうまく出来ません。 そこで三つ組の情報は一部を微妙に変える必要があります。 ここでは三つ組の情報に "cross" を加えます。 以下のコマンドにより CLFS_HOST を設定します。

export CLFS_HOST=$(echo ${MACHTYPE} | sed -e 's/-[^-]*/-cross/')

ターゲットアーキテクチャーに対応してターゲットの三つ組 (target triplets) を設定する必要があります。 以下のコマンドを使ってターゲット変数を設定します。

export CLFS_TARGET="x86_64-unknown-linux-gnu"

32 ビット用の三つ組を定めます。

export CLFS_TARGET32="i686-pc-linux-gnu"

コンパイラーおよびリンカーにおいてのターゲット固有のフラグ変数を定めます。

export BUILD32="-m32"
export BUILD64="-m64"
環境への設定コピー

ホストおよびターゲットのための変数、コンパイラーおよびリンカーフラグの変数を ~/.bashrc に設定します。 ログアウトしなければならない場合であってもビルド作業を再開できるようにするためです。

cat >> ~/.bashrc << EOF
export CLFS_HOST="${CLFS_HOST}"
export CLFS_TARGET="${CLFS_TARGET}"
export CLFS_TARGET32="${CLFS_TARGET32}"
export BUILD32="${BUILD32}"
export BUILD64="${BUILD64}"
EOF

4.7. テストスイートについて

各パッケージにはたいていテストスイートがあり、スクリプトや make のターゲットとして提供されます。 コンパイルされたプログラムやライブラリを実行したりリンクしたりすることでテストを行います。 テストスイートはパッケージのコンパイルが正しく行われたことを確認します。 ただしクロスコンパイル時はテスト実行することはできません。 このためテストスイートの手順については 基本的なシステムソフトウェアのインストール 以降に示します。

第III部 クロスコンパイルツールの生成

第5章 クロスコンパイルツールの構築

5.1. はじめに

本章はクロスプラットフォームツールの生成方法について説明します。

何かの都合によりいったん作業中断し再度ここに戻ってきた場合には su - clfs コマンドを実行することを忘れないでください。 このコマンドにより、ビルド環境の設定を元に戻すことができます。

5.1.1. 共通メモ

重要項目

パッケージのビルド手順においては、必ずそのパッケージを伸張 (解凍) して cd コマンドによってそのパッケージのディレクトリに移動してください。 作業はそのディレクトリ内にて行います。

パッケージの中には、コンパイルする前にパッチを当てるものがあります。 パッチを当てるのは、そのパッケージが抱える問題を回避するためです。 本章と次章の双方でパッチを当てるものがあり、あるいは本章と次章のいずれか一方でパッチを当てるものもあります。 したがってパッチをダウンロードする説明が書かれていないなら、何も気にせず先に進んでください。 パッチを当てた際に offsetfuzz といった警告メッセージが出る場合がありますが、これらは気にしないでください。 このような時でもパッチは問題なく適用されています。

コンパイルの最中に、警告メッセージが画面上に出力されることがよくあります。 これは問題はないため無視して構いません。 警告メッセージは、メッセージ内に説明されているように、C や C++ の文法が誤りではないものの推奨されていないものであることを示しています。 C 言語の標準はよく変更されますが、パッケージの中には古い基準に従っているものもあります。 問題はないのですが、警告として画面表示されることになるわけです。

重要項目

個々のパッケージをインストールし終えたら、特に指示がない限りはソースディレクトリとビルドディレクトリを削除してください。 ソースを削除しておけば、再びインストール作業を行うような場合に、無用な作業不備を避けることができます。

5.2. File-5.31

File パッケージは指定されたファイルの種類を決定するユーティリティを提供します。

5.2.1. File のインストール

file が指示されたファイルを識別するには「マジックテスト (magic tests)」を実行します。 これが実行されるとファイル内容と「マジックファイル (magic files)」内のデータを比較します。 マジックファイルには標準的なファイルフォーマットの情報が数多く含まれています。 File がビルドされると file -C が実行され、ソースディレクトリ内のマジックファイルの情報が収集されて magic.mgc という1つのファイルとなります。 このファイルはインストール後に用いられます。 一時システムの構築 では File のビルドはクロスコンパイルにより行うため、file プログラムをただビルドされた状態のまま実行することはできません。 そこでホストシステム上で実行できるものをビルドする必要があります。

File をコンパイルするための準備をします。

./configure \
    --prefix=/cross-tools

configure オプションの意味

--prefix=/cross-tools

configure スクリプトに対して、パッケージのインストール先を /cross-tools ディレクトリにすることを指示します。

パッケージをコンパイルします。

make

パッケージをインストールします。

make install

本パッケージの詳細は 10.64.2.「File の構成」を参照してください。

5.3. Linux-4.9.21 ヘッダー

Linux カーネルには 「健全化された (sanitized)」カーネルヘッダーをインストールするための make ターゲットがあります。

5.3.1. Linux ヘッダーのインストール

注記

カーネルの tarball (linux-4.9.tar.xz) を伸張 (解凍) し、ソースディレクトリに cd で移動します。 その後に本ページに示す各コマンドを実行していきます。

最新のサブレベルのパッチを適用します。

xzcat ../patch-4.9.21.xz | patch -Np1 -i -

カーネルのヘッダーファイルをインストールします。

make mrproper
make ARCH=x86_64 headers_check
make ARCH=x86_64 INSTALL_HDR_PATH=/tools headers_install

make コマンドの意味

make mrproper

カーネルソースディレクトリをクリーンなものにします。

make ARCH=x86_64 headers_check

ユーザー空間のプログラムが利用できるように、生のカーネルヘッダーを健全化 (sanitizing) します。

make ARCH=x86_64 INSTALL_HDR_PATH=/tools headers_install

これはカーネルヘッダーを /tools/include にインストールします。

本パッケージの詳細は 10.5.2.「Linux ヘッダーの構成」を参照してください。

5.4. M4-1.4.18

M4 パッケージはマクロプロセッサーを提供します。

5.4.1. M4 のインストール

M4 は GMP のビルドに必要となります。 m4 プログラムは /cross-tools ディレクトリにインストールします。 このようにすることで GMP ビルドに利用できる最適な M4 をクロスツール内および一時システム内の双方にて構築します。

M4 をコンパイルするための準備をします。

./configure \
    --prefix=/cross-tools

パッケージをコンパイルします。

make

パッケージをインストールします。

make install

本パッケージの詳細は 10.10.2.「M4 の構成」を参照してください。

5.5. Ncurses-6.0

Ncurses パッケージは、端末に依存しない、文字ベースのスクリーン制御を行うライブラリを提供します。

5.5.1. Ncurses のインストール

Ncurses をコンパイルすると tic が実行され ${prefix}/share/terminfo ディレクトリに terminfo データベースが生成されます。 コンパイルしたばかりの tic コマンドを Makefile が利用してくれれば良いのですが、Ncurses をクロスコンパイルするときにはそのようになってくれません。 一時システムの構築 において Ncurses のビルドをうまく進めるために、tic のビルドとインストールはホストシステム上にて行うことにします。

Ncurses をコンパイルするための準備をします。

AWK=gawk ./configure \
    --prefix=/cross-tools \
    --without-debug

configure オプションの意味

--without-debug

デバッグ情報を含めずに Ncurses をビルドすることを指示します。

クロスツールとしては、ただ一つのバイナリさえあれば十分です。 ヘッダーをビルドした上で tic をビルドします。

make -C include
make -C progs tic

tic コマンドをインストールするために以下を実行します。

install -v -m755 progs/tic /cross-tools/bin

本パッケージの詳細は 10.37.2.「Ncurses の構成」を参照してください。

5.6. Pkg-config-lite-0.28-1

Pkg-config-lite は、アプリケーションやライブラリをビルドする際のコンパイラーオプションをコマンドライン上にて提供するツールです。

5.6.1. Pkg-config-lite のインストール

一時システムにおけるパッケージの中で pkg-config を利用して必須あるいは任意の依存パッケージを探すものがあります。 これをそのままにしておくと、そのようなパッケージはホストシステム上のライブラリなどを探し出しリンクしてしまいます。 これではシステムが動作しなくなります。 そうならないように pkg-config プログラムは /cross-tools ディレクトリにインストールし、configure において Pkg-config ファイルが /tools ディレクトリから取得されるようにします。

Pkg-config-lite をコンパイルするための準備をします。

./configure \
    --prefix=/cross-tools \
    --host=${CLFS_TARGET} \
    --with-pc-path=/tools/lib64/pkgconfig:/tools/share/pkgconfig

configure オプションの意味

--host=${CLFS_TARGET}

このオプションを指定することで、クロスコンパイルおよびブートの章において {$CLFS_TARGET}-pkg-config が正しく検出され用いられるようにします。

--with-pc-path

デフォルトの PKG_CONFIG_PATH を /tools/lib64/pkgconfig/tools/share/pkgconfig に設定します。

パッケージをコンパイルします。

make

パッケージをインストールします。

make install

本パッケージの詳細は 10.35.2.「Pkg-config-lite の構成」を参照してください。

5.7. GMP-6.1.2

GMP は、任意精度、有理数、浮動小数点などの演算処理を行うライブラリを提供します。

5.7.1. GMP のインストール

本パッケージとこれに続く二つのパッケージ MPFR と MPC は /cross-tools にインストールします。 こうすることで、これを必要としている GCC をビルドできるようになります。

GMPをコンパイルするための準備をします。

./configure \
    --prefix=/cross-tools \
    --enable-cxx \
    --disable-static

configure オプションの意味

--enable-cxx

GMP の C++ サポートを有効にします。

--disable-static

スタティックライブラリはビルドおよびインストールをしないように指示します。 これはクロスツールでは必要ないからです。

パッケージをコンパイルします。

make

パッケージをインストールします。

make install

本パッケージの詳細は 10.12.2.「GMP の構成」を参照してください。

5.8. MPFR-3.1.5

MPFR ライブラリは、倍精度演算 (multiple precision) の浮動小数計算と適切な丸みを実現する C ライブラリです。

5.8.1. MPFR のインストール

アップストリームによるパッチを適用します。

patch -Np1 -i ../mpfr-3.1.5-fixes-1.patch

MPFR をコンパイルするための準備をします。

LDFLAGS="-Wl,-rpath,/cross-tools/lib" \
./configure \
    --prefix=/cross-tools \
    --disable-static \
    --with-gmp=/cross-tools

configure オプションの意味

LDFLAGS="-Wl,-rpath,/cross-tools/lib"

configure がライブラリを探すディレクトリを /cross-tools に指定します。

--with-gmp=/cross-tools

configure が GMP を探すディレクトリを指定します。

パッケージをコンパイルします。

make

パッケージをインストールします。

make install

本パッケージの詳細は 10.14.2.「MPFR の構成」を参照してください。

5.9. MPC-1.0.3

MPC パッケージは複素数演算を行うライブラリを提供するものです。 高い精度と適切な丸め (rounding) を実現します。

5.9.1. MPC のインストール

MPC をコンパイルするための準備をします。

LDFLAGS="-Wl,-rpath,/cross-tools/lib" \
./configure \
    --prefix=/cross-tools \
    --disable-static \
    --with-gmp=/cross-tools \
    --with-mpfr=/cross-tools

パッケージをコンパイルします。

make

パッケージをインストールします。

make install

本パッケージの詳細は 10.16.2.「MPC の構成」を参照してください。

5.10. ISL-0.17.1

ISL は、線形制約条件に該当する整数ポイントやその関連を操作するためのライブラリを提供します。

5.10.1. ISL のインストール

GCC の特別な機能を有効とするために ISL をインストールします。 このパッケージは厳密には必要ではありません。 Graphite と呼ばれる新たなループ生成機能を有効とするためには GCC にリンクすることが必要です。

ISL をコンパイルするための準備をします。

LDFLAGS="-Wl,-rpath,/cross-tools/lib" \
./configure \
    --prefix=/cross-tools \
    --disable-static \
    --with-gmp-prefix=/cross-tools

パッケージをコンパイルします。

make

パッケージをインストールします。

make install

本パッケージの詳細は 10.18.2.「ISL の構成」を参照してください。

5.11. クロス Binutils-2.28

Binutils パッケージは、リンカーやアセンブラーなどのようにオブジェクトファイルを取り扱うツール類を提供します。

5.11.1. クロス Binutils のインストール

Binutils は Glibc や GCC よりも前にビルドすることが重要です。 Glibc や GCC では各種機能の確認テストにおいてリンカーやアセンブラーを利用するためです。

Binutils のドキュメントによると Binutils のビルドにあたっては、ソースディレクトリ以外の専用のビルドディレクトリを作成してビルドすることが推奨されています。

mkdir -v ../binutils-build
cd ../binutils-build

Binutils をコンパイルするための準備をします。

AR=ar AS=as \
../binutils-2.28/configure \
    --prefix=/cross-tools \
    --host=${CLFS_HOST} \
    --target=${CLFS_TARGET} \
    --with-sysroot=${CLFS} \
    --with-lib-path=/tools/lib:/tools/lib64 \
    --disable-nls \
    --disable-static \
    --enable-64-bit-bfd \
    --enable-gold=yes \
    --enable-plugins \
    --enable-threads \
    --disable-werror

configure オプションの意味

AR=ar AS=as

これは Binutils のビルドにあたって ${CLFS_HOST}-ar と ${CLFS_HOST}-as によるビルドが行われるようにします。 これらは本パッケージがビルドするものであって、まだインストールされていません。

--host=${CLFS_HOST}

--target の指定と合わせることで、クロスアーキテクチャー用実行モジュールを生成します。 実行モジュールは ${CLFS_TARGET} に生成し ${CLFS_HOST} 上にて実行するモジュールとなります。

--target=${CLFS_TARGET}

--host の指定と合わせることで、クロスアーキテクチャー用実行モジュールを生成します。 実行モジュールは ${CLFS_TARGET} に生成し ${CLFS_HOST} 上にて実行するモジュールとなります。

--with-sysroot=${CLFS}

リンカーの検索パスのルートディレクトリを ${CLFS} とすることを指定します。

--with-lib-path=/tools/lib

Binutils のビルド中に探索するライブラリのパスを configure スクリプトに対して指定します。 リンカーへはディレクトリ /tools/lib が指定されます。 これによってリンカーは、ホスト上のライブラリディレクトリを探索しないようになります。

--disable-nls

これは i18n 国際化を無効とします。 クロスコンパイルツールの生成においては不要だからです。

--enable-64-bit-bfd

Binutils に対して 64 ビットサポートを追加します。

--disable-werror

ホストのコンパイラーにより警告メッセージが発生してもビルドが中断しないようにします。

--enable-gold=yes

ゴールドリンカー (gold linker) をビルドすることを指示します。

--enable-plugins

プラグインサポートを有効にします。

--enable-threads

ゴールドリンカー (gold linker) に対するマルチスレッドリンクを有効にします。

パッケージをコンパイルします。

make

パッケージをインストールします。

make install

本パッケージの詳細は 10.25.2.「Binutils の構成」を参照してください。

5.12. クロス GCC-7.1.0 - スタティック

GCC パッケージは C コンパイラーや C++ コンパイラーなどの GNU コンパイラーコレクションを提供します。

5.12.1. クロス GCC コンパイラー (スタティック libgcc、Threads なし) のインストール

ターゲットアーキテクチャーの実行モジュールを生成する、クロスコンパイラーとしての GCC をビルドします。 スタティックに生成するので Glibc のスタートファイルを参照することはありません。 そもそもこのスタートファイルは /tools ディレクトリに存在していません。 このクロスコンパイラーと Binutils にてインストールしたクロスリンカーを使って、この後に Glibc をビルドします。 そして Glibc を /tools ディレクトリにインストールした後に GCC を再ビルドします。 こうすることで /tools ディレクトリ内にあるライブラリをリンクする実行モジュールのビルドが可能となります。

GCC のスペックに対して必要な調整を行い、GCC が当環境内で稼動できるようにします。

patch -Np1 -i ../gcc-7.1.0-specs-1.patch

StartFile Spec ファイルを変更して GCC が /tools を参照するようにします。

echo -en '\n#undef STANDARD_STARTFILE_PREFIX_1\n#define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/"\n' >> gcc/config/linux.h
echo -en '\n#undef STANDARD_STARTFILE_PREFIX_2\n#define STANDARD_STARTFILE_PREFIX_2 ""\n' >> gcc/config/linux.h

ダミーの limits.h ファイルを生成します。 これはビルド時にホストシステムにある同ファイルを利用しないようにするためです。

touch /tools/include/limits.h

GCC のドキュメントによると GCC のビルドにあたっては、ソースディレクトリ以外の専用のビルドディレクトリを作成することが推奨されています。

mkdir -v ../gcc-build
cd ../gcc-build

GCC をコンパイルするための準備をします。

AR=ar \
LDFLAGS="-Wl,-rpath,/cross-tools/lib" \
../gcc-7.1.0/configure \
    --prefix=/cross-tools \
    --build=${CLFS_HOST} \
    --host=${CLFS_HOST} \
    --target=${CLFS_TARGET} \
    --with-sysroot=${CLFS} \
    --with-local-prefix=/tools \
    --with-native-system-header-dir=/tools/include \
    --disable-shared \
    --with-mpfr=/cross-tools \
    --with-gmp=/cross-tools \
    --with-mpc=/cross-tools \
    --without-headers \
    --with-newlib \
    --disable-decimal-float \
    --disable-libgomp \
    --disable-libssp \
    --disable-libatomic \
    --disable-libitm \
    --disable-libsanitizer \
    --disable-libquadmath \
    --disable-libvtv \
    --disable-libcilkrts \
    --disable-libstdc++-v3 \
    --disable-threads \
    --with-isl=/cross-tools \
    --enable-languages=c \
    --with-glibc-version=2.25

configure オプションの意味

--build=${CLFS_HOST}

クロスコンパイラーをビルドするシステムを指定します。

--with-local-prefix=/tools

このスイッチは gcc のインクルード探索パスから /usr/local/include を取り除くのが目的です。 これは絶対に必要なものではなく、ホストシステムの影響を最小にするためのものです。

--with-native-system-headers-dir=/tools/include

このスイッチはシステムヘッダーファイルを /tools/include ディレクトリから探索するようにするものであり、ホストシステムのヘッダーファイルを探さないようにします。

--disable-shared

共有ライブラリは生成しないようにします。

--without-headers

クロスコンパイル時なのでターゲットの Libc ヘッダーは用いないようにします。

--with-newlib

inhibit_libc フラグを有効にします。 これは libgcc のビルドにおいて libc をサポートするコードは生成しないようにします。

--disable-decimal-float

C の 10進浮動小数点制御を無効にします。

--disable-lib*

これらのオプションはこの時点では必要ない多くのライブラリを生成しないようにします。

--disable-threads

マルチスレッドのインクルードファイルを探索しないようにします。 この時点においてそのアーキテクチャーのファイルが生成されていないためです。 GCC がマルチスレッドの情報を利用できるようになるには、この後に Glibc のヘッダーファイルが生成されてからです。

--with-system-zlib

システムに既にインストールされている Zlib ライブラリをリンクすることを指示するものであり、ソースツリー内に同梱されているものを用いないようにします。

--enable-languages=c

C コンパイラーのみをビルドすることを指示します。

--with-glibc-version=2.25

クロスツールチェーンをブートストラップするために必要で、初期のブートストラップコンパイラーを構築するために必要なヘッダーファイルがなくても実現できるようにします。

パッケージをコンパイルします。

make all-gcc all-target-libgcc

make オプションの意味

all-gcc all-target-libgcc

GCC はこの段階において一部分が必要なのであって、パッケージすべてを必要としていません。

パッケージをインストールします。

make install-gcc install-target-libgcc

本パッケージの詳細は 10.26.2.「GCC の構成」を参照してください。

5.13. Glibc-2.25 32ビット

Glibc パッケージは主要な C ライブラリを提供します。 このライブラリは基本的な処理ルーチンを含むもので、メモリ割り当て、ディレクトリ走査、ファイルのオープン、クローズや入出力、文字列操作、パターンマッチング、算術処理、等々があります。

5.13.1. Glibc のインストール

Glibc のビルドを本書とは異なる方法で行った場合には、システムの安定性を損なう可能性がありますから注意してください。

Glibc のドキュメントではソースディレクトリ以外の専用のビルドディレクトリを作成することが推奨されています。

mkdir -v ../glibc-build
cd ../glibc-build

Glibc をコンパイルするための準備をします。

BUILD_CC="gcc" CC="${CLFS_TARGET}-gcc ${BUILD32}" \
AR="${CLFS_TARGET}-ar" RANLIB="${CLFS_TARGET}-ranlib" \
../glibc-2.25/configure \
    --prefix=/tools \
    --host=${CLFS_TARGET32} \
    --build=${CLFS_HOST} \
    --enable-kernel=3.12.0 \
    --with-binutils=/cross-tools/bin \
    --with-headers=/tools/include \
    --enable-obsolete-rpc

configure オプションの意味

BUILD_CC="gcc"

Glibc に対して現時点でのコンパイラーを用いることを指示します。 Glibc 構築においてそのコンパイラーを使ったツールビルドを行います。

CC="${CLFS_TARGET}-gcc ${BUILD32}"

32 ビットフラグを使ってターゲットアーキテクチャーの GCC を用いる指示をします。

AR="${CLFS_TARGET}-ar"

Glibc が利用する ar ユーティリティーは、ターゲットアーキテクチャー用に生成してきたものとすることを指示します。

RANLIB="${CLFS_TARGET}-ranlib"

Glibc が利用する ranlib ユーティリティーは、ターゲットアーキテクチャー用に生成してきたものとすることを指示します。

--enable-kernel=3.12.0

Linux カーネル 3.12.0 以上のサポートを行うよう指示します。

--with-binutils=/cross-tools/bin

目的のアーキテクチャー用に作り出した Binutils を Glibc において利用することを指示します。

--with-headers=/tools/include

これまでに /tools にインストールしたヘッダーファイルを用いて Glibc をビルドすることを指示します。 こうすればカーネルにどのような機能があるか、どのようにして処理効率化を図れるかなどの情報を Glibc が得られることになります。

--enable-obsolete-rpc

rpc ヘッダーファイルをインストールすることを指示します。 これはデフォルトではインストールされませんが、一部のパッケージがこれを必要としています。

ビルド中には以下のようなメッセージが出力されるかもしれません。

configure: WARNING:
*** These auxiliary programs are missing or
*** incompatible versions: msgfmt
*** some features will be disabled.
*** Check the INSTALL file for required versions.

msgfmt プログラムがない場合 (missing) や互換性がない場合 (incompatible) でも特に問題はありません。 msgfmt プログラムは Gettext パッケージが提供するもので、ホストシステムに含まれているかもしれません。 同様の (問題がない) メッセージは autoconf がインストールされていない場合も発生します。

パッケージをコンパイルします。

make

パッケージをインストールします。

make install

本パッケージの詳細は 10.8.5.「Glibc の構成」を参照してください。

5.14. Glibc-2.25 64-ビット

Glibc パッケージは主要な C ライブラリを提供します。 このライブラリは基本的な処理ルーチンを含むもので、メモリ割り当て、ディレクトリ走査、ファイルのオープン、クローズや入出力、文字列操作、パターンマッチング、算術処理、等々があります。

5.14.1. Glibc のインストール

Glibc のビルドを本書とは異なる方法で行った場合には、システムの安定性を損なう可能性がありますから注意してください。

Glibc のドキュメントではソースディレクトリ以外の専用のビルドディレクトリを作成することが推奨されています。

mkdir -v ../glibc-build
cd ../glibc-build

64ビットライブラリを /tools/lib64 ディレクトリにインストールすることを指示します。

echo "libc_cv_slibdir=/tools/lib64" >> config.cache

Glibc をコンパイルするための準備をします。

BUILD_CC="gcc" CC="${CLFS_TARGET}-gcc ${BUILD64}" \
AR="${CLFS_TARGET}-ar" RANLIB="${CLFS_TARGET}-ranlib" \
../glibc-2.25/configure \
    --prefix=/tools \
    --host=${CLFS_TARGET} \
    --build=${CLFS_HOST} \
    --libdir=/tools/lib64 \
    --enable-kernel=3.12.0 \
    --with-binutils=/cross-tools/bin \
    --with-headers=/tools/include \
    --enable-obsolete-rpc \
    --cache-file=config.cache

configure オプションの意味

CC="${CLFS_TARGET}-gcc ${BUILD64}"

64 ビットフラグを使ってターゲットアーキテクチャーの GCC を用いる指示をします。

--libdir=/tools/lib64

Glibc を /tools/lib でなく /tools/lib64 にインストールします。

ビルド中には以下のようなメッセージが出力されるかもしれません。

configure: WARNING:
*** These auxiliary programs are missing or
*** incompatible versions: msgfmt
*** some features will be disabled.
*** Check the INSTALL file for required versions.

msgfmt プログラムがない場合 (missing) や互換性がない場合 (incompatible) でも特に問題はありません。 msgfmt プログラムは Gettext パッケージが提供するもので、ホストシステムに含まれているかもしれません。 同様の (問題がない) メッセージは autoconf がインストールされていない場合も発生します。

パッケージをコンパイルします。

make

パッケージをインストールします。

make install

本パッケージの詳細は 10.8.5.「Glibc の構成」を参照してください。

5.15. クロス GCC-7.1.0 - 最終

GCC パッケージは C コンパイラーや C++ コンパイラーなどの GNU コンパイラーコレクションを提供します。

5.15.1. GCC クロスコンパイラーのインストール

GCC のスペックに対して必要な調整を行い、GCC が当環境内で稼動できるようにします。

patch -Np1 -i ../gcc-7.1.0-specs-1.patch

StartFile Spec ファイルを変更して GCC が /tools を参照するようにします。

echo -en '\n#undef STANDARD_STARTFILE_PREFIX_1\n#define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/"\n' >> gcc/config/linux.h
echo -en '\n#undef STANDARD_STARTFILE_PREFIX_2\n#define STANDARD_STARTFILE_PREFIX_2 ""\n' >> gcc/config/linux.h

GCC のドキュメントによると GCC のビルドにあたっては、ソースディレクトリ以外の専用のビルドディレクトリを作成することが推奨されています。

mkdir -v ../gcc-build
cd ../gcc-build

GCC をコンパイルするための準備をします。

AR=ar \
LDFLAGS="-Wl,-rpath,/cross-tools/lib" \
../gcc-7.1.0/configure \
    --prefix=/cross-tools \
    --build=${CLFS_HOST} \
    --target=${CLFS_TARGET} \
    --host=${CLFS_HOST} \
    --with-sysroot=${CLFS} \
    --with-local-prefix=/tools \
    --with-native-system-header-dir=/tools/include \
    --disable-static \
    --enable-languages=c,c++ \
    --with-mpc=/cross-tools \
    --with-mpfr=/cross-tools \
    --with-gmp=/cross-tools \
    --with-isl=/cross-tools

configure オプションの意味

--enable-languages=c,c++

このオプションは C コンパイラーおよび C++ コンパイラーのみビルドすることを指示します。

パッケージをコンパイルします。

make AS_FOR_TARGET="${CLFS_TARGET}-as" \
    LD_FOR_TARGET="${CLFS_TARGET}-ld"

パッケージをインストールします。

make install

本パッケージの詳細は 10.26.2.「GCC の構成」を参照してください。

第IV部 基本的なツールの構築

第6章 一時システムの構築

6.1. はじめに

この章では最小限の Linux システムを構築していく方法を示します。 このシステムは最終的に基本的なシステムソフトウェアのインストールにて CLFS を構築するためのもので、そのために必要なツール類をすべて含んでいます。 最小限とは言いつつも、取り扱いやすい実行環境を提供します。

この章におけるツール類はクロスコンパイルされたものであり、/cross-tools にインストールされたツールチェーンを利用します。 またそれらは ${CLFS}/tools ディレクトリにインストールされます。 これらのツール類は 基本的なシステムソフトウェアのインストール にインストールされるものや、元からホスト環境にあるものとは区分けされます。 ここで構築するパッケージ類はあくまで一時的なものであるため、この後に構築する CLFS システムを汚さないように、このようにします。

もう一度、環境変数 CLFS が正しく設定されているかを確認します。

echo ${CLFS}

上の出力結果が CLFS パーティションのマウントポイントであることを確認してください。 本書に示す例に従っている場合は /mnt/clfs が表示されるはずです。

本章でのビルド作業においては、以下に示すような警告 (WARNING) が何度か出力されるかもしれません。 この出力は無視して構いません。

configure: WARNING: result yes guessed because of cross compilation
configure: WARNING: cannot check WCONTINUED if cross compiling -- defaulting to no

6.2. ビルド変数

コンパイラーやリンカーに対してのターゲット固有の環境変数を設定します。

export CC="${CLFS_TARGET}-gcc ${BUILD64}"
export CXX="${CLFS_TARGET}-g++ ${BUILD64}"
export AR="${CLFS_TARGET}-ar"
export AS="${CLFS_TARGET}-as"
export RANLIB="${CLFS_TARGET}-ranlib"
export LD="${CLFS_TARGET}-ld"
export STRIP="${CLFS_TARGET}-strip"

configure オプションの意味

CXX="${CXX} ${BUILD64}"

C++ コンパイラーが 64 ビット用のフラグを利用するようにします。

上のビルド変数を ~/.bashrc に加えておきます。 こうすることで、再ログインした場合などに設定し忘れることがないようにします。

echo export CC=\""${CC}\"" >> ~/.bashrc
echo export CXX=\""${CXX}\"" >> ~/.bashrc
echo export AR=\""${AR}\"" >> ~/.bashrc
echo export AS=\""${AS}\"" >> ~/.bashrc
echo export RANLIB=\""${RANLIB}\"" >> ~/.bashrc
echo export LD=\""${LD}\"" >> ~/.bashrc
echo export STRIP=\""${STRIP}\"" >> ~/.bashrc

6.3. GMP-6.1.2

GMP は、任意精度、有理数、浮動小数点などの演算処理を行うライブラリを提供します。

6.3.1. GMP のインストール

クロスツールと同様に、これから GMP, MPFR, MPC, ISL をビルドしていき、GCC が利用できるようにします。 クロスコンパイルによりビルドし、インストール先は /tools とします。

GMP をコンパイルするための準備をします。

CC_FOR_BUILD=gcc \
./configure \
    --prefix=/tools \
    --build=${CLFS_HOST} \
    --host=${CLFS_TARGET} \
    --libdir=/tools/lib64 \
    --enable-cxx

configure オプションの意味

CC_FOR_BUILD=gcc

configure に対して、ビルドしたクロスコンパイラーではなくホストの gcc を利用することを指示します。 コンパイル中に必要となるネイティブツールをビルドするためです。

パッケージをコンパイルします。

make

パッケージをインストールします。

make install

本パッケージの詳細は 10.12.2.「GMP の構成」を参照してください。

6.4. MPFR-3.1.5

MPFR ライブラリは、倍精度演算 (multiple precision) の浮動小数計算と適切な丸みを実現する C ライブラリです。

6.4.1. MPFR のインストール

アップストリームによるパッチを適用します。

patch -Np1 -i ../mpfr-3.1.5-fixes-1.patch

MPFR をコンパイルするための準備をします。

./configure \
    --prefix=/tools \
    --build=${CLFS_HOST} \
    --host=${CLFS_TARGET} \
    --libdir=/tools/lib64

パッケージをコンパイルします。

make

パッケージをインストールします。

make install

本パッケージの詳細は 10.14.2.「MPFR の構成」を参照してください。

6.5. MPC-1.0.3

MPC パッケージは複素数演算を行うライブラリを提供するものです。 高い精度と適切な丸め (rounding) を実現します。

6.5.1. MPC のインストール

MPC をコンパイルするための準備をします。

./configure \
    --prefix=/tools \
    --build=${CLFS_HOST} \
    --host=${CLFS_TARGET} \
    --libdir=/tools/lib64

パッケージをコンパイルします。

make

パッケージをインストールします。

make install

本パッケージの詳細は 10.16.2.「MPC の構成」を参照してください。

6.6. ISL-0.17.1

ISL は、線形制約条件に該当する整数ポイントやその関連を操作するためのライブラリを提供します。

6.6.1. ISL のインストール

ISL をコンパイルするための準備をします。

./configure \
    --prefix=/tools \
    --build=${CLFS_HOST} \
    --host=${CLFS_TARGET} \
    --libdir=/tools/lib64

パッケージをコンパイルします。

make

パッケージをインストールします。

make install

本パッケージの詳細は 10.18.2.「ISL の構成」を参照してください。

6.7. Zlib-1.2.11

Zlib パッケージは、各種プログラムから呼び出される、圧縮、伸張 (解凍) を行う関数を提供します。

6.7.1. Zlib のインストール

一時システムの中で Binutils, GCC, Util-linux などのパッケージが Zlib を利用しています。 そこで Zlib は /tools ディレクトリにインストールします。

Zlib をコンパイルするための準備をします。

./configure \
    --prefix=/tools \
    --libdir=/tools/lib64

パッケージをコンパイルします。

make

パッケージをインストールします。

make install

本パッケージの詳細は 10.20.2.「Zlib の構成」を参照してください。

6.8. Binutils-2.28

Binutils パッケージは、リンカーやアセンブラーなどのようにオブジェクトファイルを取り扱うツール類を提供します。

6.8.1. Binutils のインストール

Binutils のドキュメントによると Binutils のビルドにあたっては、ソースディレクトリ以外の専用のビルドディレクトリを作成してビルドすることが推奨されています。

mkdir -v ../binutils-build
cd ../binutils-build

Binutils をコンパイルするための準備をします。

../binutils-2.28/configure \
    --prefix=/tools \
    --libdir=/tools/lib64 \
    --with-lib-path=/tools/lib64:/tools/lib \
    --build=${CLFS_HOST} \
    --host=${CLFS_TARGET} \
    --target=${CLFS_TARGET} \
    --disable-nls \
    --enable-shared \
    --enable-64-bit-bfd \
    --enable-gold=yes \
    --enable-plugins \
    --with-system-zlib \
    --enable-threads

configure オプションの意味

--enable-shared

これを指定することにより Binutils の共有ライブラリ libbfd を生成し、各種プログラムをこれにリンクします。

パッケージをコンパイルします。

make

パッケージをインストールします。

make install

本パッケージの詳細は 10.25.2.「Binutils の構成」を参照してください。

6.9. GCC-7.1.0

GCC パッケージは C コンパイラーや C++ コンパイラーなどの GNU コンパイラーコレクションを提供します。

6.9.1. GCC のインストール

GCC のスペックに対して必要な調整を行い、GCC が当環境内で稼動できるようにします。

patch -Np1 -i ../gcc-7.1.0-specs-1.patch

StartFile Spec ファイルを変更して GCC が /tools を参照するようにします。

echo -en '\n#undef STANDARD_STARTFILE_PREFIX_1\n#define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/"\n' >> gcc/config/linux.h
echo -en '\n#undef STANDARD_STARTFILE_PREFIX_2\n#define STANDARD_STARTFILE_PREFIX_2 ""\n' >> gcc/config/linux.h

以下の sed コマンド置換によって、fixincludes スクリプトを実行しないようにします。

cp -v gcc/Makefile.in{,.orig}
sed 's@\./fixinc\.sh@-c true@' gcc/Makefile.in.orig > gcc/Makefile.in

GCC のドキュメントによると GCC のビルドにあたっては、ソースディレクトリ以外の専用のビルドディレクトリを作成することが推奨されています。

mkdir -v ../gcc-build
cd ../gcc-build

GCC をビルドするにあたっては、デフォルトの最適化フラグを上書きするような環境変数は、必ずすべてリセットしてください。

GCC をコンパイルするための準備をします。

../gcc-7.1.0/configure \
    --prefix=/tools \
    --libdir=/tools/lib64 \
    --build=${CLFS_HOST} \
    --host=${CLFS_TARGET} \
    --target=${CLFS_TARGET} \
    --with-local-prefix=/tools \
    --enable-languages=c,c++ \
    --with-system-zlib \
    --with-native-system-header-dir=/tools/include \
    --disable-libssp \
    --enable-install-libiberty

configure オプションの意味

--enable-install-libiberty

libiberty.a と関連ヘッダーをビルドしインストールすることを指示します。 このライブラリは他のパッケージのビルドに必要です。

パッケージをコンパイルします。

make AS_FOR_TARGET="${AS}" \
    LD_FOR_TARGET="${LD}"

パッケージをインストールします。

make install

本パッケージの詳細は 10.26.2.「GCC の構成」を参照してください。

6.10. Ncurses-6.0

Ncurses パッケージは、端末に依存しない、文字ベースのスクリーン制御を行うライブラリを提供します。

6.10.1. Ncurses のインストール

一時システムの中で Binutils, Util-linux, Vim などのパッケージが Ncurses を必要とします。

Ncurses をコンパイルするための準備をします。

./configure \
    --prefix=/tools \
    --with-shared \
    --build=${CLFS_HOST} \
    --host=${CLFS_TARGET} \
    --without-debug \
    --without-ada \
    --enable-overwrite \
    --with-build-cc=gcc \
    --libdir=/tools/lib64

configure オプションの意味

--with-shared

共有ライブラリを生成することを指示します。

--without-ada

このオプションは Ada コンパイラーのサポート機能をビルドしないよう指示します。 この機能はホストシステムでは提供されているかもしれませんが、最終的なビルド環境においては利用できなくなります。

--enable-overwrite

このオプションは Ncurses のヘッダーファイルを /tools/include/ncurses ではなく /tools/include にインストールすることを指示します。 これは他のパッケージが Ncurses のヘッダーファイルを正しく見つけ出せるようにするためです。

--with-build-cc=gcc

クロスコンパイル用の一時的なツールを構築するために、コンパイラーとして何を用いるかを指示します。

パッケージをコンパイルします。

make

パッケージをインストールします。

make install

本パッケージの詳細は 10.37.2.「Ncurses の構成」を参照してください。

6.11. Bash-4.4

Bash パッケージは Bourne-Again SHell を提供します。

6.11.1. Bash のインストール

以下のパッチは開発者によるアップデートです。 開発者は重大な不具合に関してのみこのようなパッチを提供しています。

patch -Np1 -i ../bash-4.4-branch_update-1.patch

Bash をクロスコンパイルする場合、名前付きパイプ (named pipes) などが利用されていることをテストすることができません。 su を使って一般ユーザーになっているとき、Bash のビルド結果には プロセス置換 (process substitution) が含まれなくなります。 そうなると glibc での C++ テストスクリプトが不具合を起こします。 以下を設定することによって、名前付きパイプなどのチェックをスキップしこの後に引き起こされる不具合を回避します。 こうすることでクロスコンパイル時にテストできなかったり正常動作しなかったりすることがなくなります。

cat > config.cache << "EOF"
ac_cv_func_mmap_fixed_mapped=yes
ac_cv_func_strcoll_works=yes
ac_cv_func_working_mktime=yes
bash_cv_func_sigsetjmp=present
bash_cv_getcwd_malloc=yes
bash_cv_job_control_missing=present
bash_cv_printf_a_format=yes
bash_cv_sys_named_pipes=present
bash_cv_ulimit_maxfds=yes
bash_cv_under_sys_siglist=yes
bash_cv_unusable_rtsigs=no
gt_cv_int_divbyzero_sigfpe=yes
EOF

Bash をコンパイルするための準備をします。

./configure \
    --prefix=/tools \
    --build=${CLFS_HOST} \
    --host=${CLFS_TARGET} \
    --without-bash-malloc \
    --cache-file=config.cache

configure オプションの意味

--without-bash-malloc

このオプションは Bash のメモリ割り当て (memory allocation; malloc) 関数の利用を停止します。 この機能はセグメンテーションフォールトを発生させることがあります。 利用を停止することで Bash は Glibc の malloc 関数を用いるようになり、こちらの方が安定しています。

パッケージをコンパイルします。

make

パッケージをインストールします。

make install

本パッケージの詳細は 10.60.2.「Bash の構成」を参照してください。

6.12. Bzip2-1.0.6

Bzip2 パッケージはファイル圧縮、伸長 (解凍) を行うプログラムを提供します。 これまでよく用いられてきた gzip に比べて bzip2 の方が圧縮率の高いファイルを生成できます。

6.12.1. Bzip2 のインストール

Bzip2 のデフォルトの Makefile はビルドと同時にテストスイートも実行します。 マルチアーキテクチャーでのビルド時にはテストが正常処理されないため、これを無効化する必要があります。 またデフォルトのライブラリパスを lib64 とします。

cp -v Makefile{,.orig}
sed -e 's@^\(all:.*\) test@\1@g' \
    -e 's@/lib\(/\| \|$\)@/lib64\1@g' Makefile.orig > Makefile

Bzip2 パッケージに configure スクリプトはありません。 ビルドは以下のようにします。

make CC="${CC}" AR="${AR}" RANLIB="${RANLIB}"

パッケージをインストールします。

make PREFIX=/tools install

本パッケージの詳細は 10.51.2.「Bzip2 の構成」を参照してください。

6.13. Check-0.11.0

Check パッケージは C 言語に対してのユニットテストのフレームワークです。

6.13.1. Check のインストール

Check は /tools ディレクトリにインストールします。 最終システムにおける Kbd と Libpipeline の依存関係を満たすためです。

Check をコンパイルするための準備をします。

./configure \
    --prefix=/tools \
    --build=${CLFS_HOST} \
    --host=${CLFS_TARGET} \
    --libdir=/tools/lib64

パッケージをビルドします。

make

パッケージをインストールします。

make install

6.13.2. Check の構成

インストールプログラム: checkmk
インストールライブラリ: libcheck.{a,so}

概略説明

checkmk

Check ユニットテストフレームワークにて利用される、C 言語ユニットテストを生成するための Awk スクリプト。

libcheck.{a,so}

テストプログラムから Check を呼び出すための関数を提供します。

6.14. Coreutils-8.27

Coreutils パッケージはシステムの基本的な特性を表示したり設定したりするためのユーティリティを提供します。

6.14.1. Coreutils のインストール

Coreutils をコンパイルするための準備をします。

./configure \
    --prefix=/tools \
    --build=${CLFS_HOST} \
    --host=${CLFS_TARGET} \
    --enable-install-program=hostname \
    --cache-file=config.cache

configure オプションの意味

--enable-install-program=hostname

hostname コマンドが Perl のテストスイートにて必要であるため、これをインストールすることを指示します。

Makefile を修正して man ページは生成しないようにします。

sed -i -e 's/^man1_MANS/#man1_MANS/' Makefile

パッケージをコンパイルします。

make

パッケージをインストールします。

make install

本パッケージの詳細は 10.45.2.「Coreutils の構成」を参照してください。

6.15. Diffutils-3.6

Diffutils パッケージはファイルやディレクトリの差分を表示するプログラムを提供します。

6.15.1. Diffutils のインストール

Diffutils をコンパイルするための準備をします。

./configure \
    --prefix=/tools \
    --build=${CLFS_HOST} \
    --host=${CLFS_TARGET}

パッケージをコンパイルします。

make

パッケージをインストールします。

make install

本パッケージの詳細は 10.62.2.「Diffutils の構成」を参照してください。

6.16. File-5.31

File パッケージは指定されたファイルの種類を決定するユーティリティを提供します。

6.16.1. File のインストール

File をコンパイルするための準備をします。

./configure \
    --prefix=/tools \
    --libdir=/tools/lib64 \
    --build=${CLFS_HOST} \
    --host=${CLFS_TARGET}

パッケージをコンパイルします。

make

パッケージをインストールします。

make install

本パッケージの詳細は 10.64.2.「File の構成」を参照してください。

6.17. Findutils-4.6.0

Findutils パッケージはファイル検索を行うプログラムを提供します。 このプログラムはディレクトリツリーを再帰的に検索したり、データベースの生成、保守、検索を行います。 (データベースによる検索は再帰的検索に比べて処理速度は速いものですが、データベースが最新のものに更新されていない場合は信頼できない結果となります。)

6.17.1. Findutils のインストール

以下のキャッシュ項目はテストに関する設定であり、クロスコンパイル時にはテストを実行しない設定とします。

echo "gl_cv_func_wcwidth_works=yes" > config.cache
echo "ac_cv_func_fnmatch_gnu=yes" >> config.cache

Findutils をコンパイルするための準備をします。

./configure \
    --prefix=/tools \
    --build=${CLFS_HOST} \
    --host=${CLFS_TARGET} \
    --cache-file=config.cache

パッケージをコンパイルします。

make

パッケージをインストールします。

make install

本パッケージの詳細は 10.66.2.「Findutils の構成」を参照してください。

6.18. Gawk-4.1.4

Gawk パッケージはテキストファイルを操作するプログラムを提供します。

6.18.1. Gawk のインストール

Gawk をコンパイルするための準備をします。

./configure \
    --prefix=/tools \
    --build=${CLFS_HOST} \
    --host=${CLFS_TARGET}

パッケージをコンパイルします。

make

パッケージをインストールします。

make install

本パッケージの詳細は 10.65.2.「Gawk の構成」を参照してください。

6.19. Gettext-0.19.8.1

Gettext パッケージは国際化を行うユーティリティを提供します。 各種プログラムに対して NLS (Native Language Support) を含めてコンパイルすることができます。 つまり各言語による出力メッセージが得られることになります。

6.19.1. Gettext のインストール

パッケージのインストール作業では i18n サポートのために msgfmt プログラムを用いるものが多くなっています。 そこでこのプログラムをビルドし /tools へインストールします。 また Attr には msgmergexgettext が必要であるため同じようにインストールします。

一時的なシステムにおいては gettext-tools ディレクトリ内にあるプログラムのみを必要とします。

cd gettext-tools

Gettext をコンパイルするための準備をします。

EMACS="no" \
./configure \
    --prefix=/tools \
    --build=${CLFS_HOST} \
    --host=${CLFS_TARGET} \
    --disable-shared

configure オプションの意味

EMACS="no"

Emacs Lisp ファイルをインストールしないようにします。 これがあることで特定のホスト上でのテストがハングするためです。

必要となるプログラムとライブラリをコンパイルします。

make -C gnulib-lib
make -C intl pluralx.c
make -C src msgfmt msgmerge xgettext

実行モジュール msgfmt をインストールします。

cp -v src/{msgfmt,msgmerge,xgettext} /tools/bin

本パッケージの詳細は 10.68.2.「Gettext の構成」を参照してください。

6.20. Grep-3.0

Grep パッケージはファイル内の検索を行うプログラムを提供します。

6.20.1. Grep のインストール

Grep をコンパイルするための準備をします。

./configure \
    --prefix=/tools \
    --build=${CLFS_HOST} \
    --host=${CLFS_TARGET} \
    --without-included-regex

configure オプションの意味

--without-included-regex

クロスコンパイル時に Grep の configure は、利用可能な regex.h がインストールされていないとみなします。 そしてそれに代わるものとして Grep に含まれるものを利用しようとします。 本スイッチは正規表現 (regex) 関数を Glibc から利用することを指定します。

パッケージをコンパイルします。

make

パッケージをインストールします。

make install

本パッケージの詳細は 10.69.2.「Grep の構成」を参照してください。

6.21. Gzip-1.8

Gzip パッケージはファイルの圧縮、伸長 (解凍) を行うプログラムを提供します。

6.21.1. Gzip のインストール

Gzip をコンパイルするための準備をします。

./configure \
    --prefix=/tools \
    --build=${CLFS_HOST} \
    --host=${CLFS_TARGET}

パッケージをコンパイルします。

make

パッケージをインストールします。

make install

本パッケージの詳細は 10.72.2.「Gzip の構成」を参照してください。

6.22. Make-4.2.1

Make パッケージは、パッケージ類をコンパイルするためのプログラムを提供します。

6.22.1. Make のインストール

Make をコンパイルするための準備をします。

./configure \
    --prefix=/tools \
    --build=${CLFS_HOST} \
    --host=${CLFS_TARGET}

パッケージをコンパイルします。

make

パッケージをインストールします。

make install

本パッケージの詳細は 10.78.2.「Make の構成」を参照してください。

6.23. Patch-2.7.5

Patch パッケージは「パッチ」ファイルを適用することにより、ファイルの修正、生成を行うプログラムを提供します。 「パッチ」ファイルは diff プログラムにより生成されます。

6.23.1. Patch のインストール

Patch をコンパイルするための準備をします。

./configure \
    --prefix=/tools \
    --build=${CLFS_HOST} \
    --host=${CLFS_TARGET}

パッケージをコンパイルします。

make

パッケージをインストールします。

make install

本パッケージの詳細は 10.83.2.「Patch の構成」を参照してください。

6.24. Sed-4.4

Sed パッケージはストリームエディターを提供します。

6.24.1. Sed のインストール

Sed をコンパイルするための準備をします。

./configure \
    --prefix=/tools \
    --build=${CLFS_HOST} \
    --host=${CLFS_TARGET}

パッケージをコンパイルします。

make

パッケージをインストールします。

make install

本パッケージの詳細は 10.34.2.「Sed の構成」を参照してください。

6.25. Tar-1.29

Tar パッケージはアーカイバープログラムを提供します。

6.25.1. Tar のインストール

configure スクリプトが適切にテスト結果を取得できないものが出てくるため、手動で設定します。

cat > config.cache << EOF
gl_cv_func_wcwidth_works=yes
gl_cv_func_btowc_eof=yes
ac_cv_func_malloc_0_nonnull=yes
gl_cv_func_mbrtowc_incomplete_state=yes
gl_cv_func_mbrtowc_nul_retval=yes
gl_cv_func_mbrtowc_null_arg1=yes
gl_cv_func_mbrtowc_null_arg2=yes
gl_cv_func_mbrtowc_retval=yes
gl_cv_func_wcrtomb_retval=yes
EOF

Tar をコンパイルするための準備をします。

./configure \
    --prefix=/tools \
    --build=${CLFS_HOST} \
    --host=${CLFS_TARGET} \
    --cache-file=config.cache

パッケージをコンパイルします。

make

パッケージをインストールします。

make install

本パッケージの詳細は 10.91.2.「Tar の構成」を参照してください。

6.26. Texinfo-6.3

Texinfo パッケージは info ページへの読み書き、変換を行うプログラムを提供します。

6.26.1. Texinfo のインストール

Texinfo をコンパイルするための準備をします。

PERL=/usr/bin/perl \
./configure \
    --prefix=/tools \
    --build=${CLFS_HOST} \
    --host=${CLFS_TARGET}

configure オプションの意味

PERL=/usr/bin/perl

システムによっては perl/bin にある場合もありますが、これは Texinfo が /usr/bin ディレクトリにある perl を利用するようにします。

パッケージをコンパイルします。

make

パッケージをインストールします。

make install

本パッケージの詳細は 10.92.2.「Texinfo の構成」を参照してください。

6.27. Util-linux-2.29.2

Util-linux パッケージはさまざまなユーティリティプログラムを提供します。 ファイルシステム、コンソール、パーティション、カーネルメッセージなどを取り扱うユーティリティです。

6.27.1. Util-linux のインストール

Util-linux をコンパイルするための準備をします。

NCURSESW6_CONFIG=" " \
NCURSES6_CONFIG=" " \
NCURSESW5_CONFIG=" " \
NCURSES5_CONFIG=" " \
    ./configure \
    --prefix=/tools \
    --build=${CLFS_HOST} \
    --host=${CLFS_TARGET} \
    --libdir='${prefix}'/lib64 \
    --disable-makeinstall-chown \
    --disable-makeinstall-setuid \
    --disable-nologin \
    --without-python

configure オプションの意味

--disable-makeinstall-chown

インストールされた chown コマンドが処理実行しないようにします。

--disable-makeinstall-setuid

インストールされたプログラムに対して setuid ビットを有効にしないようにします。

--disable-nologin

nologin をインストールしないようにします。

--without-python

Python がホストシステムにインストールされていると、不要な Python バインディングがビルドされてしまいます。 そこでこれが行われないようにします。

パッケージをコンパイルします。

make

パッケージをインストールします。

make install

本パッケージの詳細は 10.95.3.「Util-linux の構成」を参照してください。

6.28. Vim-8.0

Vim パッケージは強力なテキストエディターを提供します。

6.28.1. VIM のインストール

Vim をクロスコンパイルします。 このテキストエディターを /tools ディレクトリにインストールします。 技術的に言えば Vim は一時システムには不要です。 一時システムになかったとしても、最終システムにおけるパッケージの依存関係には何ら影響しません。 しかしテキストエディターというものは極めて有用なツールであることからビルドしておくことにします。

以下のパッチは Vim 開発者が提供する 8.0 ブランチ以降のアップデートを集めたものです。

patch -Np1 -i ../vim-8.0-branch_update-1.patch

configure スクリプトには、クロスコンパイルであることが検出された時点で処理中断する箇所がいくつもあります。 これを回避するために数種のテストに対応するキャッシュ値を以下のコマンドにより設定します。

cat > src/auto/config.cache << "EOF"
vim_cv_getcwd_broken=no
vim_cv_memmove_handles_overlap=yes
vim_cv_stat_ignores_slash=no
vim_cv_terminfo=yes
vim_cv_toupper_broken=no
vim_cv_tty_group=world
vim_cv_tgent=zero
EOF

設定ファイル vimrc のインストール先を、デフォルトのものでなく /tools/etc にします。

echo '#define SYS_VIMRC_FILE "/tools/etc/vimrc"' >> src/feature.h

Vim をコンパイルするための準備をします。

./configure \
    --build=${CLFS_HOST} \
    --host=${CLFS_TARGET} \
    --prefix=/tools \
    --enable-gui=no \
    --disable-gtktest \
    --disable-xim \
    --disable-gpm \
    --without-x \
    --disable-netbeans \
    --with-tlib=ncurses

configure オプションの意味

--enable-gui=no --disable-gtktest --disable-xim --disable-gpm --without-x --disable-netbeans

これらのオプションは、一時システム内に存在していないライブラリであるにも関わらず、ホストシステムに存在するために Vim がリンクしてしまうことを回避します。

--with-tlib=ncurses

端末ライブラリとして Ncurses を用いることを指示します。

パッケージをコンパイルします。

make

パッケージをインストールします。

make -j1 install

ユーザーにとっては vim よりも vi というコマンドを使い慣れているかもしれません。 vigrvipw というプログラムは vi を使っています。 そこでシンボリックリンクを生成し vi と入力しても vim が実行されるようにし、また vi を使っている各種プログラムも正常動作するようにします。

ln -sv vim /tools/bin/vi

vimrc ファイルを一時的に生成し各種機能を実現します。 これに関しては最終システムの手順において詳しく説明します。

cat > /tools/etc/vimrc << "EOF"
" Begin /tools/etc/vimrc

set nocompatible
set backspace=2
set ruler
syntax on

" End /tools/etc/vimrc
EOF

本パッケージの詳細は 10.96.3.「Vim の構成」を参照してください。

6.29. XZ Utils-5.2.3

XZ Utils パッケージは、ファイルの圧縮、伸張 (解凍) を行うプログラムを提供します。 XZ Utils によりテキストファイルを圧縮すると、従来の gzip に比べて高い圧縮率を実現できます。

6.29.1. XZ Utils のインストール

XZ Utils をコンパイルするための準備をします。

./configure \
    --prefix=/tools \
    --build=${CLFS_HOST} \
    --host=${CLFS_TARGET} \
    --libdir=/tools/lib64

パッケージをコンパイルします。

make

パッケージをインストールします。

make install

本パッケージの詳細は 10.80.2.「XZ Utils の構成」を参照してください。

6.30. 再起動か chroot か?

最終的なシステム構築にあたり、ここから先に進む方法が二通りあります。 一つはカーネル、ブートローダー、ユーティリティーのビルドを行い、一時システムを再起動 (ブート) した上で、残るプログラム類をビルドしていく方法です。 もう一つは、必要な仮想ファイルシステムをマウントして chroot により一時システムに入って作業を進めるものです。

chroot (チェンジルート; change root) プログラムは仮想的な環境に入って新たなシェルを起動するものです。 このときのルートディレクトリは CLFS パーティションに設定します。 このことは、システムを再起動してカーネルに対し CLFS パーティションをルートパーティションとする処理と極めて似ています。 ただ「chrootする」ことの最大のメリットは、ホスト環境を利用して引き続き CLFS ビルド作業を行える点にあります。 この方法であればパッケージのビルド途中であっても他の仮想端末 (virtual console; vc) や X デスクトップに切り替えて、普段どおりにコンピューター作業を行うこともできます。

chrootする方法にも欠点があり、利用は限定的にならざるをえません。 再起動する方法はどのような CLFS ビルドであっても採用できますが、chrootする方法は同一のアーキテクチャーのものしか構築できません。 例えば x86 システム上に x86 システムを構築しようとするなら単純に chrootする方法で構いません。 再起動する方法は異なるアーキテクチャー、例えば x86 システムから PowerPC システムをビルドする場合などに用います。 さらに大雑把に言えば、同一アーキテクチャーであり同一シリーズのカーネル (特に 3.12.0 以上 の Linux カーネル) であるなら chrootする方法を選びます。 同一シリーズのカーネルではなく、あるいは異なる ABI であるなら再起動する方法を選びます。

上の説明に不安を感じるようであれば、以下のコマンドを実行してみてください。 このコマンドにより chroot できるかどうかが分かります。

/tools/lib/libc.so.6
/tools/lib64/libc.so.6
/tools/bin/gcc -v

上のコマンドが一つでも失敗したら、再起動する方法を取らなければなりません。

再起動する方法は再起動する場合に進んでください。

chroot する方法はchroot する場合に進んでください。

第7章 再起動する場合

7.1. はじめに

本章では最小システムを構築するために、一時的ツールを完成する方法を説明します。 最小システムは対象PC上にて稼動させ、最終的なシステムを構築するためのものです。

7.2. Bc-1.07.1

Bc パッケージは、任意精度 (arbitrary precision) の演算処理言語を提供します。

7.2.1. Bc のインストール

ここでインストールする bc プログラムはホストシステム上で動作するようにします。 これはカーネルをコンパイルするのに必要となるためです。

Bc をコンパイルするための準備をします。

CC=gcc \
./configure \
    --prefix=/cross-tools

configure オプションの意味

CC=gcc

ホストのコンパイラーを使って Bc をビルドするようにします。 ホストシステム上にて動作させることが必要であるためです。

パッケージをコンパイルします。

make

パッケージをインストールします。

make install

本パッケージの詳細は 10.61.2.「Bc の構成」を参照してください。

7.3. CLFS 3.0-20140710 用の Bootscripts

Bootscripts パッケージは CLFS システムの起動、終了とともに実行する一連のスクリプトを提供します。

7.3.1. Bootscripts のインストール

以下のパッチを適用して各スクリプトを /tools 内で用いるようにします。

patch -Np1 -i ../bootscripts-cross-lfs-3.0-20140710-tools_updates-2.patch

パッケージをインストールします。

make DESTDIR=/tools install-minimal

setclock スクリプトはハードウェアクロックから時刻を読み取ります。 ハードウェアクロックは BIOS クロック、あるいは CMOS (Complementary Metal Oxide Semiconductor) クロックとしても知られているものです。 ハードウェアクロックが UTC に設定されていると setclock スクリプトは /etc/localtime ファイルを参照して、ハードウェアクロックの示す時刻をローカル時刻に変換します。 /etc/localtime ファイルは hwclock プログラムに対して、ユーザーがどのタイムゾーンに位置するかを伝えます。 ハードウェアクロックが UTC に設定されているかどうかを知る方法はないので、手動で設定を行う必要があります。

ハードウェアクロックが UTC に設定されているかどうか分からない場合は、新たなシステムの起動後に hwclock --localtime --show を実行すれば確認できます。 必要なら /tools/etc/sysconfig/clock ファイルを編集してください。 ここで設定した内容に誤りがあれば表示される時刻表示が誤ったものとなります。

ハードウェアクロックが UTC 時刻として設定されていない場合は、以下に示す変数 UTC の値を 0 (ゼロ) にしてください。

cat > /tools/etc/sysconfig/clock << "EOF"
# Begin /tools/etc/sysconfig/clock

UTC=1

# End /tools/etc/sysconfig/clock
EOF

本パッケージの詳細は 11.2.2.「Bootscripts の構成」を参照してください。

7.4. E2fsprogs-1.43.4

E2fsprogs パッケージは ext2 ファイルシステムを取り扱うユーティリティーを提供します。 さらにジャーナリングファイルシステム ext3ext4 もサポートします。

7.4.1. E2fsprogs のインストール

ライブラリを /tools/lib64 へインストールするようにします。

cp -v configure{,.orig}
sed -e "/libdir=.*\/lib/s@/lib@/lib64@g" configure.orig > configure

E2fsprogs ドキュメントは、ソースディレクトリ内にサブディレクトリを作ってビルドすることを推奨しています。

mkdir -v build
cd build

E2fsprogs をコンパイルするための準備をします。

../configure \
    --prefix=/tools \
    --enable-elf-shlibs \
    --build=${CLFS_HOST} \
    --host=${CLFS_TARGET} \
    --disable-libblkid \
    --disable-libuuid \
    --disable-fsck \
    --disable-uuidd

configure オプションの意味

--enable-elf-shlibs

このオプションは、本パッケージ内のプログラムが利用する共有ライブラリを生成します。

--disable-*

libuuid ライブラリ、libblkid ライブラリ、uuidd デーモン、fsck ラッパーをインストールしないようにします。 いずれも Util-Linux にてインストール済だからです。

パッケージをコンパイルします。

make

実行モジュール、ドキュメント、共有ライブラリをインストールします。

make install

スタティックライブラリとヘッダーファイルをインストールします。

make install-libs

本パッケージの詳細は 10.44.2.「E2fsprogs の構成」を参照してください。

7.5. Kmod-24

Kmod パッケージは Linux におけるカーネルモジュールのロード、挿入、削除を行うプログラムを提供します。 Kmod は Module-Init-tools パッケージに代わるものです。

7.5.1. Kmod のインストール

モジュールを探すディレクトリを /tools/lib/modules に変更します。

cp -v libkmod/libkmod.c{,.orig}
sed '/dirname_default_prefix /s@/lib/modules@/tools&@' \
    libkmod/libkmod.c.orig > libkmod/libkmod.c

Kmod をコンパイルするための準備をします。

./configure \
    --prefix=/tools \
    --build=${CLFS_HOST} \
    --host=${CLFS_TARGET} \
    --libdir=/tools/lib64 \
    --with-xz \
    --with-zlib

configure オプションの意味

--with-zlib --with-xz

zlib や XZ による圧縮カーネルモジュールを取り扱えるようにします。

パッケージをコンパイルします。

make

パッケージをインストールします。

make install

Module-Init-Tools が想定しているプログラムへのシンボリックリンクを生成します。

ln -sfv kmod /tools/bin/lsmod
for tool in depmod insmod modprobe modinfo rmmod; do
    ln -sv ../bin/kmod /tools/sbin/${tool}
done

本パッケージの詳細は 10.82.2.「Kmod の構成」を参照してください。

7.6. Shadow-4.5

Shadow パッケージはセキュアなパスワード管理を行うプログラムを提供します。

7.6.1. Shadow のインストール

groups と man ページをインストールしないようにします。 これよりも良いプログラムが Coreutils、Util-linux、Man-pages の各パッケージにより提供されるためです。 また Shadow がインストールするプログラムが suid ビットを設定しないようにします。

cp -v src/Makefile.in{,.orig}
sed -e 's/groups$(EXEEXT) //' \
    -e 's/\(^suidu*bins = \).*/\1\\/' \
    src/Makefile.in.orig > src/Makefile.in

/tools/bin ディレクトリにある passwd を用いるようにします。

cat > config.cache << "EOF"
shadow_cv_passwd_dir=/tools/bin
EOF

Shadow をコンパイルするための準備をします。

./configure \
    --prefix=/tools \
    --build=${CLFS_HOST} \
    --host=${CLFS_TARGET} \
    --cache-file=config.cache

パッケージをコンパイルします。

make

パッケージをインストールします。

make install

本パッケージの詳細は 10.38.4.「Shadow の構成」を参照してください。

7.7. Sysvinit-2.88dsf

Sysvinit パッケージは、システムの起動、実行、シャットダウンを制御するプログラムを提供します。

7.7.1. Sysvinit のインストール

以下のパッチを適用して不要なプログラムはインストールしないようにします。 また Sysvinit を /tools へインストールするようにします。

patch -Np1 -i ../sysvinit-2.88dsf-tools_updates-1.patch

パッケージをコンパイルします。

make -C src clobber
make -C src CC="${CC}"

パッケージをインストールします。

make -C src ROOT=/tools install

7.7.2. Sysvinit の設定

以下のコマンドを実行して /tools/etc/inittab を新たに生成します。

cat > /tools/etc/inittab << "EOF"
# Begin /tools/etc/inittab

id:3:initdefault:

si::sysinit:/tools/etc/rc.d/init.d/rc sysinit

l0:0:wait:/tools/etc/rc.d/init.d/rc 0
l1:S1:wait:/tools/etc/rc.d/init.d/rc 1
l2:2:wait:/tools/etc/rc.d/init.d/rc 2
l3:3:wait:/tools/etc/rc.d/init.d/rc 3
l4:4:wait:/tools/etc/rc.d/init.d/rc 4
l5:5:wait:/tools/etc/rc.d/init.d/rc 5
l6:6:wait:/tools/etc/rc.d/init.d/rc 6

ca:12345:ctrlaltdel:/tools/sbin/shutdown -t1 -a -r now

su:S016:once:/tools/sbin/sulogin

EOF

以下のコマンドは /tools/etc/inittab に対して標準的な仮想端末を追加します。 もしシリアルコンソールしか有していないシステムの場合は、このコマンド実行は省略してください。

cat >> /tools/etc/inittab << "EOF"
1:2345:respawn:/tools/sbin/agetty --noclear -I '\033(K' tty1 9600
2:2345:respawn:/tools/sbin/agetty --noclear -I '\033(K' tty2 9600
3:2345:respawn:/tools/sbin/agetty --noclear -I '\033(K' tty3 9600
4:2345:respawn:/tools/sbin/agetty --noclear -I '\033(K' tty4 9600
5:2345:respawn:/tools/sbin/agetty --noclear -I '\033(K' tty5 9600
6:2345:respawn:/tools/sbin/agetty --noclear -I '\033(K' tty6 9600

EOF

シリアルコンソールを有している場合は、以下のコマンドを実行して /tools/etc/inittab へ項目追加します。

cat >> /tools/etc/inittab << "EOF"
c0:12345:respawn:/tools/sbin/agetty --noclear 115200 ttyS0 vt100

EOF

/tools/etc/inittab に最終行を加えます。

cat >> /tools/etc/inittab << "EOF"
# End /tools/etc/inittab
EOF

-I '\033(K' オプションは agetty が端末に対してまず初めにこのエスケープシーケンスを送るものです。 これによって端末のキャラクターセットがユーザー指定のものに切り替わります。 setfont プログラムを用いればキャラクターセットは変更できます。 ISO 8859-1 以外のスクリーンフォントを利用するユーザーにとって、このエスケープシーケンスの送信は重要なものです。 英語圏ユーザーにとっては不要なものです。

本パッケージの詳細は 10.90.3.「Sysvinit の構成」を参照してください。

7.8. Eudev-1.7

Eudev パッケージはデバイスノードを動的生成するプログラムを提供します。

7.8.1. Eudev のインストール

Eudev をコンパイルするための準備をします。

./configure \
    --prefix=/tools \
    --build=${CLFS_HOST} \
    --host=${CLFS_TARGET} \
    --libdir=/tools/lib64 \
    --with-rootlibdir=/tools/lib64 \
    --disable-introspection \
    --disable-gtk-doc-html \
    --disable-gudev \
    --disable-keymap \
    --with-firmware-path=/lib/firmware \
    --enable-libkmod

configure オプションの意味

--disable-introspection --disable-gtk-doc-html --disable-gudev --disable-keymap

このスイッチは一時システムには必要のない機能、不要な追加依存関係をを無効にします。

--with-firmware-path=/tools/lib/firmware

ファームウェア情報をロードするディレクトリを、デフォルトの /lib/firmware ではなく /tools/lib/firmware とすることを指示します。

--enable-libkmod

Eudev に対して libkmod を利用して直接モジュールをロードすることを指示します。

パッケージをコンパイルします。

make

パッケージをインストールします。

make install

ダミーのルールを生成します。 こうすることで Eudev がイーサネットデバイスを適切に命名できるようにします。

echo "# dummy, so that network is once again on eth*" > \
    /tools/etc/udev/rules.d/80-net-name-slot.rules

本パッケージの詳細は 10.94.2.「Eudev の構成」を参照してください。

7.9. Linux-4.9.21

Linux パッケージは Linux カーネルを提供します。

7.9.1. カーネルのインストール

警告

ここではクロスコンパイル用の一時的なカーネルを生成します。 したがってカーネル設定においては必要最小限のオプションを選択するようにしてください。 ターゲットマシンが起動でき最終システムを構築できるだけで十分だからです。 つまり例えばサウンド、印刷機能といったものは必要になりません。

同様にモジュールの生成は極力避けてください。 またここで生成されるカーネルイメージを最終システムにおいて利用しないでください。

カーネルの構築は、カーネルの設定、コンパイル、インストールの順に行っていきます。 本書が行っているカーネル設定の方法以外については、カーネルソースツリー内にある README ファイルを参照してください。

システム再起動後に 32ビットと 64ビットの実行モジュールを適切に実行できるようにするため、ELF サポート (support for ELF) と 32ビット ELF エミュレーション (emulations for 32bit ELF) が有効となるようにカーネルをビルドしてください。

最新のサブレベルのパッチを適用します。

xzcat ../patch-4.9.21.xz | patch -Np1 -i -

コンパイルするための準備として以下のコマンドを実行します。

make mrproper

これによりカーネルソースが完全にクリーンなものになります。 カーネル開発チームは、カーネルコンパイルするなら、そのたびにこれを実行することを推奨しています。 tar コマンドにより伸張しただけのソースではクリーンなものにはなりません。

メニュー方式のインターフェースによりカーネルを設定します。

make ARCH=x86_64 CROSS_COMPILE=${CLFS_TARGET}- menuconfig

カーネルイメージとモジュールをコンパイルします。

make ARCH=x86_64 CROSS_COMPILE=${CLFS_TARGET}-

やむなくカーネルモジュールを利用する場合は /etc/modprobe.d ファイルが必要になります。 モジュールやカーネル設定に関する情報はカーネルソースの Documentation ディレクトリにあるカーネルドキュメントを参照してください。 また modprobe.d も有用です。

カーネル設定にてモジュールを利用している場合はこれをインストールします。

make ARCH=x86_64 CROSS_COMPILE=${CLFS_TARGET}- \
   INSTALL_MOD_PATH=/tools modules_install

カーネル設定にてファームウェアを利用している場合はこれをインストールします。

make ARCH=x86_64 CROSS_COMPILE=${CLFS_TARGET}- \
   INSTALL_MOD_PATH=/tools firmware_install

カーネルのコンパイルが終わったら、インストールの完了に向けてあと少し作業を行います。 /tools/boot ディレクトリにいくつかのファイルをコピーします。

以下のコマンドを実行してカーネルをインストールします。

mkdir -pv /tools/boot
cp -v arch/x86_64/boot/bzImage /tools/boot/vmlinuz-clfs-4.9.21

System.map はカーネルに対するシンボルファイルです。 このファイルはカーネル API の各関数のエントリポイントをマッピングしています。 同様に実行中のカーネルのデータ構成のアドレスを保持します。 マップファイルをインストールするには以下を実行します。

cp -v System.map /tools/boot/System.map-4.9.21

カーネル設定ファイル .config は、上で実行した make menuconfig によって生成されます。 このファイル内には、今コンパイルしたカーネルの設定項目の情報がすべて保持されています。 将来このファイルを参照する必要が出てくるかもしれないため、このファイルを保存しておきます。

cp -v .config /tools/boot/config-4.9.21

本パッケージの詳細は 13.2.2.「Linux の構成」を参照してください。

7.10. GRUB-2.00

GRUB パッケージは GRand Unified Bootloader を提供します。

7.10.1. GRUB のインストール

注記

GRUB とは別のブートローダーを利用したい場合は、以下のリンクを参照しその手順に従ってください。 http://trac.clfs.org/wiki/bootloaders

Glibc-2.25 では gets() が宣言されていません。

cp -v grub-core/gnulib/stdio.in.h{,.orig}
sed -e '/gets is a/d' grub-core/gnulib/stdio.in.h.orig > grub-core/gnulib/stdio.in.h

GRUB をコンパイルするための準備をします。

./configure \
    --prefix=/tools \
    --build=${CLFS_HOST} \
    --host=${CLFS_TARGET} \
    --libdir=/tools/lib64 \
    --disable-werror \
    --enable-grub-mkfont=no \
    --with-bootdir=tools/boot

configure オプションの意味

--enable-grub-mkfont=no

grub-mkfont をビルドしないようにします。 このコマンドは Freetype を必要としているためです。

--with-bootdir=tools/boot

カーネルイメージを検索するデフォルトディレクトリを修正し、そこにブートローダーファイルをインストールするようにします。

パッケージをコンパイルします。

make

パッケージをインストールします。

make install

本パッケージの詳細は 10.97.3.「GRUBの構成」を参照してください。

7.11. ディレクトリの生成

注記

本書のこれ以降で実行するコマンドはすべて root ユーザーでログインして実行します。 root ユーザーの環境にて環境変数 ${CLFS} がセットされていることを今一度確認してください。

CLFS ファイルシステムにおけるディレクトリ構成を作り出していきます。 以下のコマンドを実行して標準的なディレクトリを生成します。

mkdir -pv ${CLFS}/{bin,boot,dev,{etc/,}opt,home,lib{,64},mnt}
mkdir -pv ${CLFS}/{proc,media/{floppy,cdrom},run/{,shm},sbin,srv,sys}
mkdir -pv ${CLFS}/var/{lock,log,mail,spool}
mkdir -pv ${CLFS}/var/{opt,cache,lib{,64}/{misc,locate},local}
install -dv ${CLFS}/root -m 0750
install -dv ${CLFS}{/var,}/tmp -m 1777
ln -sv ../run ${CLFS}/var/run
mkdir -pv ${CLFS}/usr/{,local/}{bin,include,lib{,64},sbin,src}
mkdir -pv ${CLFS}/usr/{,local/}share/{doc,info,locale,man}
mkdir -pv ${CLFS}/usr/{,local/}share/{misc,terminfo,zoneinfo}
mkdir -pv ${CLFS}/usr/{,local/}share/man/man{1,2,3,4,5,6,7,8}
install -dv ${CLFS}/usr/lib/locale
ln -sv ../lib/locale ${CLFS}/usr/lib64

ディレクトリは標準ではパーミッションモード 755 で生成されますが、すべてのディレクトリをこのままとするのは適当ではありません。 上のコマンド実行ではパーミッションを変更している箇所が二つあります。 一つは root ユーザーのホームディレクトリに対してであり、もう一つはテンポラリディレクトリに対してです。

パーミッションモードを変更している一つめは /root ディレクトリに対して、他のユーザーによるアクセスを制限するためです。 通常のユーザーが持つ、自分自身のホームディレクトリへのアクセス権設定と同じことを行ないます。 二つめのモード変更は /tmp/var/tmp ディレクトリに対して、どのユーザーも書き込み可能とし、ただし他のユーザーが作成したファイルは削除できないようにします。 ビットマスク 1777 の最上位ビット、いわゆる「スティッキービット (sticky bit)」を用いて実現します。

7.11.1. FHS コンプライアンス情報

ディレクトリツリーは 標準ファイルシステム構成 (Filesystem Hierarchy Standard; FHS) に基づいています。 (その情報は https://wiki.linuxfoundation.org/en/FHS に示されています。) 上で生成したディレクトリに加えて、FHS では /usr/local/games/usr/share/games を規定していますが、一方で /usr/local/share については明確にしていません。 したがって本書では必要なディレクトリのみを作成していくことにします。 もっとも FHS に準拠した構成を望むなら、どうぞ自由に作成してください。

7.12. 重要なシンボリックリンクの生成

プログラムの中には固定的に他のファイルへのパスを保持しているものがあります。 そのパスは今の時点ではまだ存在していません。 このようなプログラムを正しく動作させるため、シンボリックリンクをいくつか作成します。 このリンクは次章の作業を通じて各種ソフトウェアをインストールしていくことで、その実体であるファイルに置き換えられていきます。

ln -sv /tools/bin/{bash,cat,echo,grep,login,pwd,stty} ${CLFS}/bin
ln -sv /tools/bin/file ${CLFS}/usr/bin
ln -sv /tools/lib/libgcc_s.so{,.1} ${CLFS}/usr/lib
ln -sv /tools/lib64/libgcc_s.so{,.1} ${CLFS}/usr/lib64
ln -sv /tools/lib/libstdc++.so{.6,} ${CLFS}/usr/lib
ln -sv /tools/lib64/libstdc++.so{.6,} ${CLFS}/usr/lib64
sed -e 's/tools/usr/' /tools/lib/libstdc++.la > ${CLFS}/usr/lib/libstdc++.la
ln -sv bash ${CLFS}/bin/sh
ln -sv /tools/sbin/init ${CLFS}/sbin
ln -sv /tools/etc/{login.{access,defs},limits} ${CLFS}/etc

各リンクの目的:

/bin/bash

bash スクリプトはたいていが /bin/bash を指定しています。

/bin/cat

このパス名は Glibc の configure スクリプトにおいてハードコーディングされています。

/bin/echo

Glibc のテストスイート内における1つのテストが /bin/echo を用いているためです。

/bin/grep

Libtool においてハードコーディングされた /tools を無効にするためです。

/bin/login

agetty プログラムが login/bin ディレクトリ内にあるものとしているからです。

/bin/pwd

configure スクリプト、特に Glibc におけるものがこのパス名をハードコーディングしているためです。

/bin/stty

Expect においてこのパス名がハードコーディングされています。 したがって Binutils や GCC のテストスィートを成功させるために必要となります。

/usr/bin/file

Binutils の configure スクリプトがこのコマンドパスを用いています。

/usr/lib/libgcc_s.so{,.1}

Glibc では pthreads ライブラリを動作させるためにこれが必要となります。

/usr/lib/libstdc++{,.6}

Glibc のテストスイート内のテストにてこれを必要とするものがあります。 また GMP の C++ サポートにおいても必要とするものがあります。

/usr/lib/libstdc++.la

GCC をインストールした後は /tools への参照は無くして /usr/lib/libstdc++.la とする必要があります。

/bin/sh

シェルスクリプトは多くが /bin/sh を指定しています。

/sbin/init

カーネルは init がこのパス名であることを前提としています。

/etc/{login.{access,defs},limits}

このファイルは Shadow が利用する設定ファイルであり /etc ディレクトリにある必要があります。 例えば loginsu といったプログラムがこのことを必要としています。

Linux のこれまでの経緯として、マウントされているファイルシステムの情報は /etc/mtab ファイルに保持されています。 最新の Linux であれば、内部的にこのファイルを管理し、ユーザーに対しては /proc ファイルシステムを通じて情報提示しています。 /etc/mtab ファイルの存在を前提としているプログラムが正常動作するように、以下のシンボリックリンクを作成します。

ln -sv /proc/self/mounts ${CLFS}/etc/mtab

7.13. /dev の設定

7.13.1. 初期デバイスノードの生成

カーネルがシステムを起動する際にはデバイスノードがいくつか必要です。 特に consolenull です。 これらのデバイスノードはハードディスク上に生成されます。 udev が起動し、また Linux がシングルユーザーモードで起動されれば利用可能となります。 (シングルユーザーモードであるということは console に限定的なパーミッションが与えられています。) そこで以下のコマンドによりそのようなデバイスノードを生成します。

mknod -m 0600 ${CLFS}/dev/console c 5 1
mknod -m 0666 ${CLFS}/dev/null c 1 3

7.14. passwd, group, ログの各ファイル生成

root ユーザーが「root」として認識されログインできるようにするために /etc/passwd ファイルと /etc/group ファイルに関連する項目を追加する必要があります。

以下のコマンドを実行して ${CLFS}/etc/passwd ファイルを生成します。

cat > ${CLFS}/etc/passwd << "EOF"
root::0:0:root:/root:/bin/bash
bin:x:1:1:/bin:/bin/false
daemon:x:2:6:/sbin:/bin/false
nobody:x:65534:65533:Unprivileged User:/dev/null:/bin/false
EOF

root ユーザーに対する本当のパスワードは後に定めます。 (「::」は単に場所を設けるために設定しているものです。)

上記以外で追加するユーザー候補

adm:x:3:16:adm:/var/adm:/bin/false

管理タスクを実行するプログラムが利用します。

lp:x:10:9:lp:/var/spool/lp:/bin/false

印刷するプログラムが利用します。

mail:x:30:30:mail:/var/mail:/bin/false

email プログラムが利用することがあります。

messagebus:x:27:27:D-Bus Message Daemon User:/dev/null:/bin/false

システム全般のメッセージバスである D-Bus 用のユーザー。

news:x:31:31:news:/var/spool/news:/bin/false

ネットワークニュースサーバーが利用することがあります。

operator:x:50:0:operator:/root:/bin/bash

システムオペレーターがシステムにアクセスすることを許可するために利用されます。

postmaster:x:51:30:postmaster:/var/spool/mail:/bin/false

一般にメールサーバーにおいて発生する障害情報を受信するアカウントとして利用されます。

以下のコマンドを実行して ${CLFS}/etc/group ファイルを生成します。

cat > ${CLFS}/etc/group << "EOF"
root:x:0:
bin:x:1:
sys:x:2:
kmem:x:3:
tty:x:5:
tape:x:4:
daemon:x:6:
floppy:x:7:
disk:x:8:
lp:x:9:
dialout:x:10:
audio:x:11:
video:x:12:
utmp:x:13:
usb:x:14:
cdrom:x:15:
adm:x:16:
mail:x:30:
wheel:x:39:
nogroup:x:65533:
EOF

上記以外で追加するグループ候補:

console:x:17:

コンソールに直接アクセスするグループです。

cdrw:x:18:

CDRW ドライブの利用を許可するグループです。

messagebus:x:27:

D-Bus 用ユーザー。

news:x:31:news

ネットワークニュースサーバーが利用します。

users:x:1000:

shadow が利用する新ユーザーに割り当てられるデフォルトのGIDです。

nobody:x:65533:

NFS において利用されます。

作成するグループは何かの標準に基づいたものではありません。 一部は本章の Systemd の設定に必要となるものですし、一部は既存の Linux ディストリビューションが採用している慣用的なものです。 Linux Standard Base (http://www.linuxfoundation.org/collaborate/workgroups/lsb 参照) では 「root」 グループのグループID (GID) は 0、 「bin」 グループの GID は 1 を定めているにすぎません。 他のグループとその GID はシステム管理者が自由に取り決めることができます。 というのも通常のプログラムであれば GID の値に依存することはなく、あくまでグループ名を用いてプログラミングされているからです。

loginagettyinit といったプログラム (あるいは他のプログラム) は、システムに誰がいつログインしたかといった情報を多くのログファイルに記録します。 しかしログファイルがあらかじめ存在していない場合は、ログファイルの出力が行われません。 そこでそのようなログファイルを作成し、適切なパーミッションを与えます。

touch ${CLFS}/var/log/{btmp,faillog,lastlog,wtmp}
chgrp -v 13 ${CLFS}/var/log/{faillog,lastlog}
chmod -v 664 ${CLFS}/var/log/{faillog,lastlog}
chmod -v 600 ${CLFS}/var/log/btmp

/var/log/wtmp ファイルはすべてのログイン、ログアウトの情報を保持します。 /var/log/lastlog ファイルは各ユーザーが最後にログインした情報を保持します。 /var/log/btmp ファイルは不正なログイン情報を保持します。

7.15. /etc/fstab ファイルの生成

/etc/fstab ファイルは種々のプログラムがファイルシステムのマウント状況を確認するために利用するファイルです。 ファイルシステムがデフォルトでどこにマウントされ、それがどういう順序であるか、マウント前に (整合性エラーなどの) チェックを行うかどうかという設定が行われます。 新しいファイルシステムに対する設定は以下のようにして生成します。

cat > ${CLFS}/etc/fstab << "EOF"
# Begin /etc/fstab

# file system  mount-point  type   options          dump  fsck
#                                                         order

/dev/[xxx]     /            [fff]  defaults         1     1
/dev/[yyy]     swap         swap   pri=1            0     0
devpts         /dev/pts     devpts gid=5,mode=620   0     0
shm            /dev/shm     tmpfs  defaults         0     0

# End /etc/fstab
EOF

[xxx][yyy][fff] の部分はシステムに合わせて正しい記述に書き換えてください。 例えば sda2sda5ext2 といったものです。 上のファイルの6項目の記述内容の詳細は man 5 fstab により確認してください。

tmpfs に対してはマウントポイント /dev/shm を設けています。 これは POSIX 共有メモリ (POSIX-shared memory) を有効にするためです。 カーネルのビルドにあたっては所定のサポートを有効にしなければなりません。 (詳しくは次節にて示します。) ただし最近はこの共有メモリを利用しているソフトウェアはさほど多くありません。 ですからマウントポイント /dev/shm を設けるかどうかは任意です。 詳しくはカーネルソースツリー内の Documentation/filesystems/tmpfs.txt を参照してください。

7.16. 環境設定

システム起動時に新しく起動するシェルはログイン シェルです。 このシェルは .bash_profile ファイルを読み込みます。 そこで .bash_profile ファイルを生成します。

cat > ${CLFS}/root/.bash_profile << "EOF"
set +h
PS1='\u:\w\$ '
LC_ALL=POSIX
PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin:/tools/sbin
export LC_ALL PATH PS1
EOF

LC_ALL 変数は特定のプログラムが扱う国情報を制御します。 そのプログラムが出力するメッセージを、指定された国情報に基づいて構成します。 LC_ALL 変数は「POSIX」か「C」にセットしてください。 (両者は同じです。) そのようにセットしておけば一時システム内での作業が問題なく進められます。

/tools/bin ディレクトリと /tools/sbin ディレクトリを PATH 変数の終わりに設定します。 一時システムの構築にてインストールしたプログラムは、ターゲットシステム内にビルドされていない場合に限って実行されます。 このように設定するのは、一時システムを通してビルドした最終システムの実行モジュールを優先して利用するのが目的です。 そして最終システムのプログラムが一時システムに依存してビルドされることを極力避けるものでもあります。

7.17. ビルドフラグ

ビルド変数をコピーして新たなシステム用とします。

cat >> ${CLFS}/root/.bash_profile << EOF
export BUILD32="${BUILD32}"
export BUILD64="${BUILD64}"
export CLFS_TARGET32="${CLFS_TARGET32}"
EOF

7.18. 所有者の変更

/tools ディレクトリと /cross-tools の所有者は今は clfs ユーザーであり、これはホストシステム上にのみ存在するユーザーです。 CLFS システムの構築を終えたら /tools ディレクトリと /cross-tools ディレクトリは削除することができます。 一方でこれを残しておけば別の CLFS システム作りに利用することもできます。 ただしこの /tools ディレクトリと /cross-tools をこのままにしておくということは、そこにあるファイル群が、存在しないユーザーによって所有される形を生み出すことになります。 これは危険なことです。 後にユーザーアカウントが生成され同一のユーザーIDを持ったとすると これらのディレクトリの所有者となってしまい、そこにあるファイルすべてを所有することになって、悪意のある操作に利用されてしまいます。

この問題を解消するには、新たな CLFS システム 上に /etc/passwd を生成した後にそのシステム上のユーザーとして clfs ユーザーを作ります。 このときには同一のユーザーID、グループIDとなるように作ることが必要です。 別の方法もあります。 /tools ディレクトリと /cross-tools ディレクトリの所有者を root ユーザーにすることです。 以下のコマンドによりこれを実現します。

chown -Rv 0:0 ${CLFS}/tools
chown -Rv 0:0 ${CLFS}/cross-tools

7.19. 本書を読み続けるために

ここまで皆さんは、たぶんウェブブラウザーか PDF ビューワーを利用して本書を読んできたはずです。 しかし /tools にある一時システムにそれらは存在しません。 つまり一時システムを起動してビルド環境に入った後でも、本書を読み進める方法を確保しておかなければなりません。 その解決策は以下です。

  • 単純に他のコンピューターで本書を見るか、本書を印刷して読むかです。 ただこの方法だと、コマンドのコピーペーストが出来なくなる欠点があります。

  • CLFS ブックをプレーンテキスト化しておく方法です。 moreview を使って読む形にしておくことが必要です。 これを実現するためには以下のようなコマンドを実行します。

    lynx -dump /path/to/clfs/book.html > ${CLFS}/root/CLFS-book.txt
    
  • さらに追加でプログラムをクロスコンパイルしインストールすることです。 本書を読むために Lynx や Links を利用する、あるいはリモートログインするために Dropbear を利用するなどです。 CLFS ヒントのサイト http://hints.clfs.org/index.php/ があり、そこでは多くのユーザーがいろいろな方法を示してくれていますので参考にしてください。

7.20. 次にすべきこと

さあここで ${CLFS} ディレクトリをターゲットマシンにコピーします。 ごく単純な方法は tar コマンドによりまとめ上げてファイルコピーすることです。

tar -jcvf ${CLFS}.tar.bz2 ${CLFS}

第8章 chroot する場合

8.1. はじめに

本章では chroot コマンドにより最終システムをビルドする方法について示します。

8.2. 仮想カーネルファイルシステムのマウント

注記

本書のこれ以降のコマンドはすべて root ユーザーにより実行してください。 また作業を進めるにあたり root ユーザーの環境変数 ${CLFS} が設定されていることを確認してください。

カーネルが取り扱うさまざまなファイルシステムは、カーネルとの間でやり取りが行われます。 これらのファイルシステムは仮想的なものであり、ディスクを消費するものではありません。 ファイルシステムの内容はメモリ上に保持されます。

ファイルシステムをマウントするディレクトリを以下のようにして生成します。

mkdir -pv ${CLFS}/{dev,proc,run,sys}

/dev/console/dev/null という2つのデバイスノードはハードディスク上に生成されていなければなりません。 これらはカーネルに対して必要となるもので、システム起動時の Udev 起動よりもさらに前段階で必要となります。 そこで以下のようにしてこれらを生成します。

mknod -m 600 ${CLFS}/dev/console c 5 1
mknod -m 666 ${CLFS}/dev/null c 1 3

システムが完成し起動の段階になると、カーネルの devtmpfs によって多くのデバイスノードが生成されます。 しかしここでは mount コマンドの 「bind」 オプションを利用して、ホストシステムの /dev 構造を CLFS ファイルシステムとして見せるようにします。

mount -v -o bind /dev ${CLFS}/dev

これ以外にさらに以下のファイルシステムをマウントします。

mount -vt devpts -o gid=5,mode=620 devpts ${CLFS}/dev/pts
mount -vt proc proc ${CLFS}/proc
mount -vt tmpfs tmpfs ${CLFS}/run
mount -vt sysfs sysfs ${CLFS}/sys

ホストシステムによっては /dev/shm/run/shm へのシンボリックリンクになっているものがあります。 そのようなシステムでは /run 配下にディレクトリを生成します。

[ -h ${CLFS}/dev/shm ] && mkdir -pv ${CLFS}/$(readlink ${CLFS}/dev/shm)

何かの理由によって CLFS システム作業を中断しその後に再開することになった場合は、chroot 環境に入る前に上のファイルシステムがマウントされていることを確認してください。

8.3. chroot 環境への移行

chroot 環境に入って最終的な CLFS システムの構築、インストールを行っていきます。 root ユーザーになって以下のコマンドを実行します。 chroot 環境内は、この時点では一時的なツール類のみが利用可能な状態です。

chroot "${CLFS}" /tools/bin/env -i \
    HOME=/root TERM="${TERM}" PS1='\u:\w\$ ' \
    PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin \
    /tools/bin/bash --login +h

env コマンドの -i パラメーターは、chroot 環境での変数定義をすべてクリアするものです。 そして HOME, TERM, PS1, PATH という変数だけここで定義し直します。 TERM=$TERM は chroot 環境に入る前と同じ値を TERM 変数に与えます。 この設定は vimless のようなプログラムの処理が適切に行われるために必要となります。 これ以外の変数として CFLAGSCXXFLAGS などが必要であれば、ここで定義しておくと良いでしょう。

ここから先は CLFS 変数は不要となります。 すべての作業は CLFS ファイルシステム内で行っていくことになるからです。 起動される Bash シェルは ${CLFS} ディレクトリがルート (/ ディレクトリ) となって動作します。

/tools/binPATH 変数内の最後に加わっています。 一時的なツール類は、それぞれの正式版がインストールされていくに従って使われなくなります。 これがうまく動作するのは bash+h オプションを用いることによってハッシュ機能をオフにしているからであり、実行モジュールの場所を覚えておく機能を無効にしているからです。

本章のこれ以降と次章では、すべてのコマンドを chroot 環境内にて実行することが必要です。 例えばシステムを再起動する場合のように chroot 環境からいったん抜け出した場合には、procdevpts ファイルシステム (前節にて説明) がマウントされていることを確認してください。 そして chroot 環境に入り直してからインストール作業を再開してください。

bash のプロンプトに I have no name! と表示されますがこれは正常です。 この時点ではまだ /etc/passwd を生成していないからです。

8.4. 所有者の変更

/tools ディレクトリと /cross-tools の所有者は今は clfs ユーザーであり、これはホストシステム上にのみ存在するユーザーです。 CLFS システムの構築を終えたら /tools ディレクトリと /cross-tools ディレクトリは削除することができます。 一方でこれを残しておけば別の CLFS システム作りに利用することもできます。 ただしこの /tools ディレクトリと /cross-tools をこのままにしておくということは、そこにあるファイル群が、存在しないユーザーによって所有される形を生み出すことになります。 これは危険なことです。 後にユーザーアカウントが生成され同一のユーザーIDを持ったとすると これらのディレクトリの所有者となってしまい、そこにあるファイルすべてを所有することになって、悪意のある操作に利用されてしまいます。

この問題を解消するには、新たな CLFS システム 上に /etc/passwd を生成した後にそのシステム上のユーザーとして clfs ユーザーを作ります。 このときには同一のユーザーID、グループIDとなるように作ることが必要です。 別の方法もあります。 /tools ディレクトリと /cross-tools ディレクトリの所有者を root ユーザーにすることです。 以下のコマンドによりこれを実現します。

chown -Rv 0:0 /tools
chown -Rv 0:0 /cross-tools

このコマンドでは root:root を指定せずに 0:0 としています。 これは chown コマンドが今は 「root」 というユーザー名を認識できないからであり、それができるのは passwd ファイルを作った後であるからです。

8.5. ディレクトリの生成

CLFS ファイルシステムにおけるディレクトリ構成を作り出していきます。 以下のコマンドを実行して標準的なディレクトリを生成します。

mkdir -pv /{bin,boot,dev,{etc/,}opt,home,lib{,64},mnt}
mkdir -pv /{proc,media/{floppy,cdrom},run/{,shm},sbin,srv,sys}
mkdir -pv /var/{lock,log,mail,spool}
mkdir -pv /var/{opt,cache,lib{,64}/{misc,locate},local}
install -dv /root -m 0750
install -dv {/var,}/tmp -m 1777
ln -sv ../run /var/run
mkdir -pv /usr/{,local/}{bin,include,lib{,64},sbin,src}
mkdir -pv /usr/{,local/}share/{doc,info,locale,man}
mkdir -pv /usr/{,local/}share/{misc,terminfo,zoneinfo}
mkdir -pv /usr/{,local/}share/man/man{1..8}
install -dv /usr/lib/locale
ln -sv ../lib/locale /usr/lib64

ディレクトリは標準ではパーミッションモード 755 で生成されますが、すべてのディレクトリをこのままとするのは適当ではありません。 上のコマンド実行ではパーミッションを変更している箇所が二つあります。 一つは root ユーザーのホームディレクトリに対してであり、もう一つはテンポラリディレクトリに対してです。

パーミッションモードを変更している一つめは /root ディレクトリに対して、他のユーザーによるアクセスを制限するためです。 通常のユーザーが持つ、自分自身のホームディレクトリへのアクセス権設定と同じことを行ないます。 二つめのモード変更は /tmp/var/tmp ディレクトリに対して、どのユーザーも書き込み可能とし、ただし他のユーザーが作成したファイルは削除できないようにします。 ビットマスク 1777 の最上位ビット、いわゆる「スティッキービット (sticky bit)」を用いて実現します。

8.5.1. FHS コンプライアンス情報

ディレクトリツリーは 標準ファイルシステム構成 (Filesystem Hierarchy Standard; FHS) に基づいています。 (その情報は https://wiki.linuxfoundation.org/en/FHS に示されています。) 上で生成したディレクトリに加えて、FHS では /usr/local/games/usr/share/games を規定していますが、一方で /usr/local/share については明確にしていません。 したがって本書では必要なディレクトリのみを作成していくことにします。 もっとも FHS に準拠した構成を望むなら、どうぞ自由に作成してください。

8.6. 重要なシンボリックリンクの生成

プログラムの中には固定的に他のファイルへのパスを保持しているものがあります。 そのパスは今の時点ではまだ存在していません。 このようなプログラムを正しく動作させるため、シンボリックリンクをいくつか作成します。 このリンクは次章の作業を通じて各種ソフトウェアをインストールしていくことで、その実体であるファイルに置き換えられていきます。

ln -sv /tools/bin/{bash,cat,echo,grep,pwd,stty} /bin
ln -sv /tools/bin/file /usr/bin
ln -sv /tools/lib/libgcc_s.so{,.1} /usr/lib
ln -sv /tools/lib64/libgcc_s.so{,.1} /usr/lib64
ln -sv /tools/lib/libstd* /usr/lib
ln -sv /tools/lib64/libstd* /usr/lib64
ln -sv bash /bin/sh

各リンクの目的:

/bin/bash

bash スクリプトはたいていが /bin/bash を指定しています。

/bin/cat

このパス名は Glibc の configure スクリプトにおいてハードコーディングされています。

/bin/echo

Glibc のテストスイート内における1つのテストが /bin/echo を用いているためです。

/bin/grep

Libtool においてハードコーディングされた /tools を無効にするためです。

/bin/login

agetty プログラムが login/bin ディレクトリ内にあるものとしているからです。

/bin/pwd

configure スクリプト、特に Glibc におけるものがこのパス名をハードコーディングしているためです。

/bin/stty

Expect においてこのパス名がハードコーディングされています。 したがって Binutils や GCC のテストスィートを成功させるために必要となります。

/usr/bin/file

Binutils の configure スクリプトがこのコマンドパスを用いています。

/usr/lib/libgcc_s.so{,.1}

Glibc では pthreads ライブラリを動作させるためにこれが必要となります。

/usr/lib/libstdc++{,.6}

Glibc のテストスイート内のテストにてこれを必要とするものがあります。 また GMP の C++ サポートにおいても必要とするものがあります。

/usr/lib/libstdc++.la

GCC をインストールした後は /tools への参照は無くして /usr/lib/libstdc++.la とする必要があります。

/bin/sh

シェルスクリプトは多くが /bin/sh を指定しています。

/sbin/init

カーネルは init がこのパス名であることを前提としています。

/etc/{login.{access,defs},limits}

このファイルは Shadow が利用する設定ファイルであり /etc ディレクトリにある必要があります。 例えば loginsu といったプログラムがこのことを必要としています。

Linux のこれまでの経緯として、マウントされているファイルシステムの情報は /etc/mtab ファイルに保持されています。 最新の Linux であれば、内部的にこのファイルを管理し、ユーザーに対しては /proc ファイルシステムを通じて情報提示しています。 /etc/mtab ファイルの存在を前提としているプログラムが正常動作するように、以下のシンボリックリンクを作成します。

8.7. ビルドフラグ

コンパイラーおよびリンカーに対してのターゲット固有のフラグを設定します。

export BUILD32="-m32"
export BUILD64="-m64"

ホストシステムの32ビット用のターゲット三つ組 (target triplet) を設定します。

export CLFS_TARGET32="i686-pc-linux-gnu"

ビルド環境から一度離れてから戻ってきたときにエラーを引き起こすことになりかねません。 そこで上記変数をエクスポートし、ビルド時に障害が発生しないようにします。

cat >> ${CLFS}/root/.bash_profile << EOF
export BUILD32="${BUILD32}"
export BUILD64="${BUILD64}"
export CLFS_TARGET32="${CLFS_TARGET32}"
EOF

8.8. passwd, group, ログの各ファイル生成

root ユーザーが「root」として認識されログインできるようにするために /etc/passwd ファイルと /etc/group ファイルに関連する項目を追加する必要があります。

以下のコマンドを実行して /etc/passwd ファイルを生成します。

cat > /etc/passwd << "EOF"
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:/bin:/bin/false
daemon:x:2:6:/sbin:/bin/false
messagebus:x:27:27:D-Bus Message Daemon User:/dev/null:/bin/false
nobody:x:65534:65533:Unprivileged User:/dev/null:/bin/false
EOF

root ユーザーに対する本当のパスワードは後に定めます。 (「x」は単に場所を設けるために設定しているものです。)

上記以外で追加するユーザー候補

adm:x:3:16:adm:/var/adm:/bin/false

管理タスクを実行するプログラムが利用します。

lp:x:10:9:lp:/var/spool/lp:/bin/false

印刷するプログラムが利用します。

mail:x:30:30:mail:/var/mail:/bin/false

email プログラムが利用することがあります。

messagebus:x:27:27:D-Bus Message Daemon User:/dev/null:/bin/false

システム全般のメッセージバスである D-Bus 用のユーザー。

news:x:31:31:news:/var/spool/news:/bin/false

ネットワークニュースサーバーが利用することがあります。

operator:x:50:0:operator:/root:/bin/bash

システムオペレーターがシステムにアクセスすることを許可するために利用されます。

postmaster:x:51:30:postmaster:/var/spool/mail:/bin/false

一般にメールサーバーにおいて発生する障害情報を受信するアカウントとして利用されます。

以下のコマンドを実行して /etc/group ファイルを生成します。

cat > /etc/group << "EOF"
root:x:0:
bin:x:1:
sys:x:2:
kmem:x:3:
tty:x:5:
tape:x:4:
daemon:x:6:
floppy:x:7:
disk:x:8:
lp:x:9:
dialout:x:10:
audio:x:11:
video:x:12:
utmp:x:13:
usb:x:14:
cdrom:x:15:
adm:x:16:
messagebus:x:27:
mail:x:30:
wheel:x:39:
nogroup:x:65533:
EOF

上記以外で追加するグループ候補:

console:x:17:

コンソールに直接アクセスするグループです。

cdrw:x:18:

CDRW ドライブの利用を許可するグループです。

messagebus:x:27:

D-Bus 用ユーザー。

news:x:31:news

ネットワークニュースサーバーが利用します。

users:x:1000:

shadow が利用する新ユーザーに割り当てられるデフォルトのGIDです。

nobody:x:65533:

NFS において利用されます。

作成するグループは何かの標準に基づいたものではありません。 一部は本章の Systemd の設定に必要となるものですし、一部は既存の Linux ディストリビューションが採用している慣用的なものです。 Linux Standard Base (http://www.linuxfoundation.org/collaborate/workgroups/lsb 参照) では 「root」 グループのグループID (GID) は 0、 「bin」 グループの GID は 1 を定めているにすぎません。 他のグループとその GID はシステム管理者が自由に取り決めることができます。 というのも通常のプログラムであれば GID の値に依存することはなく、あくまでグループ名を用いてプログラミングされているからです。

loginagettyinit といったプログラム (あるいは他のプログラム) は、システムに誰がいつログインしたかといった情報を多くのログファイルに記録します。 しかしログファイルがあらかじめ存在していない場合は、ログファイルの出力が行われません。 そこでそのようなログファイルを作成し、適切なパーミッションを与えます。

touch /var/log/{btmp,faillog,lastlog,wtmp}
chgrp -v utmp /var/log/{faillog,lastlog}
chmod -v 664 /var/log/{faillog,lastlog}
chmod -v 600 /var/log/btmp

/var/log/wtmp ファイルはすべてのログイン、ログアウトの情報を保持します。 /var/log/lastlog ファイルは各ユーザーが最後にログインした情報を保持します。 /var/log/btmp ファイルは不正なログイン情報を保持します。

プロンプトの「I have no name!」を取り除くために新たなシェルを起動します。 クロスコンパイルツールの構築にて完全に Glibc をインストールし /etc/passwd ファイルと /etc/group ファイルを作ったので、ユーザー名とグループ名の名前解決が適切に動作します。

exec /tools/bin/bash --login +h

ディレクティブ +h について触れておきます。 これは bash に対して実行パスの内部ハッシュ機能を利用しないよう指示するものです。 もしこのディレクティブを指定しなかった場合 bash は一度実行したファイルのパスを記憶します。 コンパイルしてインストールした実行ファイルはすぐに利用していくために、次章の作業では +h ディレクティブを常に使っていくことにします。

第V部 CLFS システムの構築

第9章 テストスイートツールの構築

9.1. はじめに

本章ではテストスイートツールをビルドします。 これは各種パッケージにて make check などのコマンドを通じて実行されるテストスイートを処理するためのものです。 GCC や Binutils、Findutils のテストスイートに対しては Tcl, Expect, DejaGNU が利用されます。 テスト目的のためにこれら三つのパッケージをインストールするというのは、少々大げさなことかもしれません。 ただ本質的ではないことであっても、重要なツール類が正常に動作するという確認が得られれば安心できます。

9.2. Tcl-8.6.4

Tcl パッケージはツールコマンド言語 (Tool Command Language) を提供します。

9.2.1. Tcl のインストール

Tcl をコンパイルするための準備をします。

cd unix
CC="gcc ${BUILD64}" ./configure \
    --prefix=/tools \
    --libdir=/tools/lib64

パッケージをコンパイルします。

make

パッケージをインストールします。

make install

Tcl のプライベートヘッダーファイルは次パッケージ Expect が必要としています。 そこでヘッダーファイルを /tools にインストールします。

make install-private-headers

必要となるシンボリックリンクを生成します。

ln -sv tclsh8.6 /tools/bin/tclsh

9.2.2. Tcl の構成

インストールプログラム: tclsh (tclsh8.6 へのリンク), tclsh8.6
インストールライブラリ: libtcl8.6.so, libtclstub8.6.a

概略説明

tclsh8.6

Tcl コマンドシェル

tclsh

tclsh8.6 へのリンク

libtcl8.6.so

Tcl ライブラリ

libtclstub8.6.a

Tcl スタブライブラリ

9.3. Expect-5.45

Expect パッケージは、他のプログラムと対話的に処理を行うプログラムを提供します。

9.3.1. Expect のインストール

Expect をコンパイルするための準備をします。

CC="gcc ${BUILD64}" \
./configure \
    --prefix=/tools \
    --with-tcl=/tools/lib64 \
    --with-tclinclude=/tools/include \
    --libdir=/tools/lib64

configure オプションの意味

--with-tcl=/tools/lib64

configure スクリプトが、一時ツールのインストールディレクトリより Tcl を探し出せるようにします。

--with-tclinclude=/tools/include

Tcl の内部ヘッダーファイルを探し出す場所を指定します。 configure は自動的には Tcl ソースディレクトリの場所を探し出さないため、これを明示します。

パッケージをコンパイルします。

make

パッケージをインストールします。

make SCRIPTS="" install

make パラメーターの意味

SCRIPTS=""

Expect の補助的なスクリプトはインストールしないことを指示します。 これらは必要ありません。

9.3.2. Expect の構成

インストールプログラム: expect
インストールライブラリ: libexpect-5.43.a

概略説明

expect

スクリプトを通じて他の対話的なプログラムとの処理を行います。

libexpect-5.43.a

Tcl 拡張機能を通じて、あるいは (Tcl がない場合に) C や C++ から直接、Expect とのやりとりを行う関数を提供します。

9.4. DejaGNU-1.6

DejaGNU パッケージは、他のプログラムをテストするフレームワークを提供します。

9.4.1. DejaGNU のインストール

DejaGNU をコンパイルするための準備をします。

./configure \
    --prefix=/tools

パッケージをコンパイルします。

make install

9.4.2. DejaGNU の構成

インストールプログラム: runtest

概略説明

runtest

expect シェルの適正な場所を特定し DejaGNU を実行するためのラッパースクリプト。

第10章 基本的なシステムソフトウェアのインストール

10.1. はじめに

この章ではビルド環境に入って正式な CLFS システムの構築作業を始めます。 パッケージ類のインストール作業は簡単なものです。 インストール手順の説明は、たいていは手短に一般的なものだけで済ますこともできます。 ただ誤りの可能性を極力減らすために、個々のインストール手順の説明は十分に行うことにします。 Linux システムがどのようにして動作しているかを学ぶには、個々のパッケージが何のために用いられていて、なぜユーザー (あるいはシステム) がそれを必要としているのかを知ることが重要になります。 各パッケージのインストール手順においてはパッケージ構成の概要を示します。 そしてそのパッケージがインストールするプログラムやライブラリについての細かな説明を示します。

コンパイラーの最適化オプションを利用する場合は、最適化に関するヒントを示した http://hints.clfs.org/index.php/Optimization を確認してみてください。 コンパイラーの最適化を用いればプログラムが若干速くなる場合もありますが、そもそもコンパイルが出来なかったり、プログラムの実行時に問題が発生したりする場合があります。 もしコンパイラーの最適化によってパッケージビルドが出来なかったら、最適化をなしにしてもう一度コンパイルすることで解決するかどうかを確認してください。 最適化を行ってパッケージがコンパイル出来たとしても、コードとビルドツールの複雑な関連に起因してコンパイルが適切に行われないリスクをはらんでいます。 また -march オプションや -mtune オプションは、ツールチェーン (Binutils, GCC, Glibc) において問題が発生するかもしれません。 最適化オプションを用いることによって得られるものがあったとしても、それ以上にリスクを伴うことがしばしばです。 初めて CLFS 構築を手がける方は、最適化オプションをなしにすることをお勧めします。 これ以降にビルドしていくツール類は、それでも十分に速く安定して動作するはずです。

本章にてインストールしていくパッケージ類のビルド順は、必ず本書どおりに行ってください。 プログラムはすべて /tools ディレクトリを直接参照するような形でビルドしてはなりません。 また同じ理由でパッケージ類を同時並行でビルドしないでください。 特にデュアル CPU マシンにおいて同時にビルドしていくと時間の節約を図ることができますが /tools ディレクトリを直接参照するプログラムが出来上がってしまい、このディレクトリが存在しなくなった時にはプログラムが動作しないことになります。

各パッケージがどのようなファイルをインストールするのかを管理するには、パッケージマネージャーの利用も必要でしょう。 パッケージマネージャーにはさまざまな特徴があります。 全般的な概要については次ページを参照してください。

10.2. パッケージ管理

パッケージ管理についての説明を CLFS ブックに加えて欲しいとの要望をよく頂きます。 パッケージ管理ツールがあれば、インストールされるファイル類を管理し、パッケージの削除やアップグレードを容易に実現できます。 パッケージ管理ツールをどうしたら・・・ いえいえ本節は特定のパッケージ管理ツールを説明するわけでなく、その利用を勧めるものでもありません。 もっと広い意味で、管理手法にはどういったものがあり、どのように動作するかを説明します。 あなたにとって最適なパッケージ管理がこの中にあるかもしれません。 あるいはそれらをいくつか組み合わせて実施することになるかもしれません。 本節ではパッケージのアップグレードを行う際に発生する問題についても触れます。

CLFS や CBLFS においてパッケージ管理ツールに触れていない理由には以下のものがあります。

  • 本書の目的は Linux システムがいかに構築されているかを学ぶことです。 パッケージ管理はその目的からはずれてしまいます。

  • パッケージ管理についてはいくつもの方法があり、それらには一長一短があります。 ユーザーに対して満足のいくものを選び出すのは困難です。

ヒントサブプロジェクト (Hints subproject) ページにパッケージ管理についての情報が示されています。 望むものがあるかどうか確認してみてください。

10.2.1. アップグレードに関する問題

パッケージ管理ツールがあれば、各種ソフトウェアの最新版がリリースされた際に容易にアップグレードができます。 全般に CLFS ブックや CBLFS ブックに示されている作業手順に従えば、新しいバージョンへのアップグレードを行っていくことはできます。 以下ではパッケージをアップグレードする際に注意すべき点、特に稼動中のシステムに対して実施するポイントについて説明します。

  • ツールチェーンを構成するパッケージ (Glibc, GCC, Binutils) のどれかにアップグレードする必要が出てきてマイナーバージョンを上げるとします。 この場合は CLFS 全体を再構築するのが適切です。 そのパッケージ類だけを、依存関係を正しく考えてビルドすればうまくいくかも しれませんがこれはお勧めできません。 例えば glibc-2.2.x を glibc-2.3.x にアップグレードするような場合、システム全体の再構築をお勧めします。 マイクロバージョンのアップデートである場合は単に再インストールするだけでうまくいけるかもしれません。 つまり glibc-2.3.4 を glibc-2.3.5 にアップデートする場合ならば、問題が発生することは少ないでしょう。

  • 共有ライブラリを提供しているパッケージをアップデートする場合で、ライブラリの名前が変更になった場合は、そのライブラリを動的にリンクしているすべてのパッケージは、新しいライブラリにリンクされるように再コンパイルを行う必要があります。 (パッケージのバージョンとライブラリ名との間に相関関係はありません。) 例えば foo-1.2.3 というパッケージが共有ライブラリ libfoo.so.1 をインストールするものであるとします。 そして今、新しいバージョン foo-1.2.4 にアップグレードし、共有ライブラリ libfoo.so.2 をインストールするとします。 この例では libfoo.so.1 を動的にリンクいるパッケージがあったとすると、それらはすべて libfoo.so.2 に対してリンクするよう再コンパイルしなければなりません。 古いライブラリに依存しているパッケージすべてを再コンパイルするまでは、そのライブラリを削除するべきではありません。

  • 稼働中のシステムをアップグレードする場合、パッケージがインストール処理に install を用いているなら cp を用いるものに変えてください。 install コマンドは、実行モジュールやライブラリが既にメモリにロードされていれば通常は安全に利用することができます。

10.2.2. パッケージ管理手法

以下に一般的なパッケージ管理手法について示します。 パッケージ管理マネージャーを用いる前に、さまざまな方法を検討し特にそれぞれの欠点も確認してください。

10.2.2.1. すべては頭の中で

そうです。 これもパッケージ管理のやり方の一つです。 いろいろなパッケージに精通していて、どんなファイルがインストールされるか分かっている人もいます。 そんな人はパッケージ管理ツールを必要としません。 あるいはパッケージが更新された際にシステム全体を再構築しようと考えている人なら、やはりパッケージ管理ツールを必要としません。

10.2.2.2. 異なるディレクトリへのインストール

これは最も単純なパッケージ管理のやり方であり、パッケージ管理のためのツールを用いる必要はありません。 個々のパッケージを個別のディレクトリにインストールする方法です。 例えば foo-1.1 というパッケージを /usr/pkg/foo-1.1 ディレクトリにインストールし、この /usr/pkg/foo-1.1 に対するシンボリックリンク /usr/pkg/foo を作成します。 このパッケージの新しいバージョン foo-1.2 をインストールする際には /usr/pkg/foo-1.2 ディレクトリにインストールした上で、先ほどのシンボリックリンクをこのディレクトリを指し示すように置き換えます。

PATHLD_LIBRARY_PATHMANPATHINFOPATHCPPFLAGS といった環境変数に対しては /usr/pkg/foo ディレクトリを加える必要があるかもしれません。 もっともパッケージによっては、このやり方では管理できないものもあります。

10.2.2.3. シンボリックリンク方式による管理

これは一つ前に示したパッケージ管理テクニックの応用です。 各パッケージは同様にインストールします。 ただし先ほどのようなシンボリックリンクを生成するのではなく /usr ディレクトリ階層の中に各ファイルのシンボリックリンクを生成します。 この方法であれば環境変数を追加設定する必要がなくなります。 シンボリックリンクを自動生成することもできますが、パッケージ管理ツールの中にはこの手法を使って構築されているものもあります。 よく知られているものとして Stow、Epkg、Graft、Depot があります。

インストール時には意図的な指示が必要です。 パッケージにとっては /usr にインストールすることが指定されたものとなりますが、実際には /usr/pkg 配下にインストールされるわけです。 このインストール方法は単純なものではありません。 例えば今 libfoo-1.1 というパッケージをインストールするものとします。 以下のようなコマンドでは、このパッケージを正しくインストールできません。

./configure \
    --prefix=/usr/pkg/libfoo/1.1
make
make install

インストール自体は動作しますが、このパッケージに依存している他のパッケージは期待どおりには libfoo を正しくリンクしません。 例えば libfoo をリンクするパッケージをコンパイルする際には /usr/lib/libfoo.so.1 がリンクされると思うかもしれませんが、実際には /usr/pkg/libfoo/1.1/lib/libfoo.so.1 がリンクされることになります。 正しくリンクするためには DESTDIR 変数を使って、パッケージのインストールをうまく仕組む必要があります。 この方法は以下のようにして行います。

./configure \
    --prefix=/usr
make
make DESTDIR=/usr/pkg/libfoo/1.1 install

この手法をサポートするパッケージは数多く存在しますが、そうでないものもあります。 この手法を取り入れていないパッケージに対しては、手作業でインストールすることが必要になります。 またはそういった問題を抱えるパッケージであれば /opt ディレクトリにインストールする方が簡単かもしれません。

10.2.2.4. タイムスタンプによる管理方法

この方法ではパッケージをインストールするにあたって、あるファイルにタイムスタンプが記されます。 インストールの直後に find コマンドを適当なオプション指定により用いることで、インストールされるすべてのファイルのログが生成されます。 これはタイムスタンプファイルの生成の後に行われます。 この方法を用いたパッケージ管理ツールとして install-log があります。

この方法はシンプルであるという利点がありますが、以下の二つの欠点があります。 インストールの際に、いずれかのファイルのタイムスタンプが現在時刻でなかった場合、そういったファイルはパッケージ管理ツールが正しく制御できません。 またこの方法は一つのパッケージだけが、その時にインストールされることを前提とします。 例えば二つのパッケージが二つの異なる端末から同時にインストールされるような場合は、ログファイルが適切に生成されません。

10.2.2.5. LD_PRELOAD による管理方法

この方法ではライブラリがまず事前にロードされ (preload され) それからインストールされます。 パッケージのインストール中には cpinstallmv など、さまざまな実行モジュールにそのライブラリをリンクさせ、ファイルシステムを変更するようなシステムコールを監視することで、そのライブラリがパッケージを追跡管理できるようにします。 この方法を実現するためには、動的リンクする実行モジュールはすべて suid ビット、sgid ビットがオフでなければなりません。 事前にライブラリをロードしておくと、インストール中に予期しない副作用が発生するかもしれません。 したがって、ある程度のテスト確認を行って、パッケージ管理ツールが不具合を引き起こさないこと、しかるべきファイルの記録を取っておくことが必要とされます。

10.2.2.6. パッケージのアーカイブを生成する方法

この方法では、シンボリックリンク方式によるパッケージ管理にて説明したのと同じように、パッケージが個別のディレクトリにインストールされます。 インストールの後は、インストールされたファイルのアーカイブが生成されます。 このアーカイブはローカルPCへのインストールに用いられたり、他のPCへのインストールに利用されたりします。

商用ディストリビューションが採用しているパッケージ管理ツールは、ほとんどがこの方法によるものです。 この方法に従ったパッケージ管理ツールの例に RPM があります。 (これは Linux Standard Base Specification が規定しています。) また pkg-utils、Debian の apt、Gentoo の Portage システムがあります。 このパッケージ管理手法を CLFS システムに適用するヒント情報が http://hints.clfs.org/index.php/Fakeroot にあります。

10.3. 再びテストスイートについて

最終システムのビルドではもうクロスコンパイルは行いません。 そこでようやくテストスイートの実行が出来るようになります。 新たに構築したパッケージに対してはテストスイートを実行しておくのがよいでしょう。 テストスイートは「健全性検査 (sanity check)」を行い、パッケージのコンパイルが正しく行われたことを確認します。 テストスイートの実行によりいくつかのチェックが行われ、開発者の意図したとおりにパッケージが正しく動作することを確認していきます。 ただこれは、パッケージにバグがないことを保証するものではありません。

テストスイートの中には他のものにも増して重要なものがあります。 例えば、ツールチェーンの要である GCC、Binutils、Glibc に対してのテストスイートです。 これらのパッケージはシステム機能を確実なものとする重要な役割を担うものであるためです。 GCC と Glibc におけるテストスイートはかなりの時間を要します。 それが低い性能のマシンであればなおさらです。 でもそれらを実行しておくことを強く推奨します。

Binutils と GCC におけるテストスイートの実行では、擬似端末 (pseudo terminals; PTY) を使い尽くす問題が発生します。 これにより相当数のテストが失敗します。 これが発生する理由はいくつかありますが、もっともありがちな理由として (chroot 時には) ホストシステムの devpts ファイルシステムが正しく構成されていないことがあげられます。 この点については http://trac.clfs.org/wiki/faq#no-ptys においてかなり詳しく説明しています。

パッケージの中にはテストスイートに失敗するものがあります。 しかしこれらは開発元が認識しているもので致命的なものではありません。 以下の http://clfs.org/testsuite-logs/sysvinit/ に示すログを参照して、失敗したテストが実は予期されているものであるかどうかを確認してください。 このサイトは本書におけるすべてのテストスイートの正常な処理結果を示すものです。

10.4. 一時的な Perl-5.26.0

Perl パッケージは Perl 言語 (Practical Extraction and Report Language) を提供します。

10.4.1. Perl のインストール

注記

本節にて一時システム内の /tools ディレクトリに Perl をインストールします。 このパッケージのインストールは 一時システムの構築 の一部分ではありますが、クロスコンパイルする Perl はよく問題を引き起こします。 そこで Perl は最終のビルド環境において再度コンパイルおよびインストールを行います。

ハードコーディングされた /usr/include へのパスを /tools/include に変更します。

sed -i 's@/usr/include@/tools/include@g' ext/Errno/Errno_pm.PL

一時的な Perl をコンパイルするための準備をします。

./configure.gnu \
    --prefix=/tools \
    -Dcc="gcc ${BUILD32}"

configure オプションの意味

-Dcc="gcc"

Perl に対して、デフォルトの cc ではなく gcc を用いることを指示します。

パッケージをコンパイルします。

make

Perl にはテストスイートがありますが、この時点にて実行することはお奨めしません。 ここでの Perl のインストールは一時的なものであるからです。 もしテストスイートを実行したい場合は、本章の中でそのうち実行できるようになります。

パッケージをインストールします。

make install

最後に、必要となるシンボリックリンクを生成します。

ln -sfv /tools/bin/perl /usr/bin

本パッケージの詳細は 10.55.2.「Perl の構成」を参照してください。

10.5. Linux-4.9.21 ヘッダー

Linux カーネルには 「健全化された (sanitized)」カーネルヘッダーをインストールするための make ターゲットがあります。

10.5.1. Linux ヘッダーのインストール

注記

カーネルの tarball (linux-4.9.tar.xz) を伸張 (解凍) し、ソースディレクトリに cd で移動します。 その後に本ページに示す各コマンドを実行していきます。

最新のサブレベルのパッチを適用します。

xzcat ../patch-4.9.21.xz | patch -Np1 -i -

カーネルのヘッダーファイルをインストールします。

make mrproper
make headers_check
make INSTALL_HDR_PATH=/usr headers_install
find /usr/include -name .install -or -name ..install.cmd | xargs rm -fv

make コマンドの意味

make mrproper

カーネルソースディレクトリをクリーンなものにします。

make headers_check

ユーザー空間のプログラムが利用できるように、生のカーネルヘッダーを健全化 (sanitizing) します。

make INSTALL_HDR_PATH=/usr headers_install

カーネルヘッダーのインストール先を /usr/include とします。

find /usr/include -name .install -or -name ..install.cmd | xargs rm -fv

インストールされたファイルのうち、不要なデバッグファイルを削除します。

10.5.2. Linux ヘッダーの構成

インストールヘッダー: /usr/include/{asm,asm-generic,drm,linux,misc,mtd,rdma,scsi,sound,video,xen}/*.h
インストールディレクトリ: /usr/include/asm, /usr/include/asm-generic, /usr/include/drm, /usr/include/linux, /usr/include/misc, /usr/include/mtd, /usr/include/rdma, /usr/include/scsi, /usr/include/sound, /usr/include/uapi, /usr/include/video, /usr/include/xen

概略説明

/usr/include/{asm,asm-generic,drm,linux,mtd,rdma,sound,video}/*.h

Linux API ヘッダー

10.6. Man-pages-4.09

Man-pages パッケージは 2,200 以上の man ページを提供します。

10.6.1. Man-pages のインストール

以下を実行して Man-pages をインストールします。

make install

10.6.2. Man-pages の構成

インストールファイル: 数々の man ページ

概略説明

man ページ

本パッケージは、以下に示すような man ページを提供します。 POSIX ヘッダー (セクション 0p), POSIX ユーティリティー (セクション 1p), POSIX 関数 (セクション 3p), ユーザーコマンド (section 1), システムコール (セクション 2), libc コール (section 3), デバイス情報 (セクション 4), ファイルフォーマット (section 5), ゲーム (セクション 6), 慣用的/マクロパッケージ (セクション 7), システム管理 (セクション 8), カーネル (セクション 9).

10.7. Glibc-2.25 32ビット ライブラリ

Glibc パッケージは主要な C ライブラリを提供します。 このライブラリは基本的な処理ルーチンを含むもので、メモリ割り当て、ディレクトリ走査、ファイルのオープン、クローズや入出力、文字列操作、パターンマッチング、算術処理、等々があります。

10.7.1. Glibc のインストール

注記

CLFS が取り扱っていないパッケージの中には GNU libiconv の導入を推奨しているものがあります。 これは文字データのエンコーディングを変換する機能を持ちます。 プロジェクトのホームページ (http://www.gnu.org/software/libiconv/) には以下のような説明があります。 「このライブラリは iconv() 関数を提供します。 この関数を持たないシステムや、Unicode を取り扱うことができないシステムにて、この関数を利用することができます。」 Glibc が iconv() 関数を用意しており Unicode の変換を実現しているため CLFS では libiconv は用いないことにします。

インストール作業の最後には健全性テスト (sanity test) を実行し、すべてが適切にインストールされているかを確認します。 このスクリプトは所定のライブラリを用いてテストプログラムをコンパイルします。 しかしこのとき ld.so へのパスが指定されないため、ツールチェーンの一部が /tools にあるまま利用されてしまいます。 以下の一連のコマンドを実行することで、インストールしたばかりの新しい ld.so を利用するように変更します。

LINKER=$(readelf -l /tools/bin/bash | sed -n 's@.*interpret.*/tools\(.*\)]$@\1@p')
sed -i "s|libs -o|libs -L/usr/lib -Wl,-dynamic-linker=${LINKER} -o|" \
  scripts/test-installation.pl
unset LINKER

Glibc ビルドシステムは自らによってビルドされるものであり、コンパイラースペックファイルがたとえ /tools を指し示していたままであっても完璧にビルドされます。 スペックやリンカーは Glibc のインストール後でないと調整できません。 これは Glibc の Autoconf テストが失敗するからであり、クリーンビルドを成功させるという目標が達成できないためです。

Glibc のドキュメントではソースディレクトリ以外の専用のビルドディレクトリを作成することが推奨されています。

mkdir -v ../glibc-build
cd ../glibc-build

Glibc をコンパイルするための準備をします。

CC="gcc ${BUILD32}" CXX="g++ ${BUILD32}" \
../glibc-2.25/configure \
    --prefix=/usr \
    --enable-kernel=3.12.0 \
    --libexecdir=/usr/lib/glibc \
    --host=${CLFS_TARGET32} \
    --enable-stack-protector=strong \
    --enable-obsolete-rpc

configure オプションの意味

--libexecdir=/usr/lib/glibc

getconf ユーティリティーへのハードリンクのインストールディレクトリを、デフォルトの /usr/libexec でなく /usr/lib/glibc に変更します。

パッケージをコンパイルします。

make

重要項目

Glibc にはシステムを適切に動作させるための重要な役割があります。 CLFS 開発者はテストスイートを実行することを強く勧めます。

マルチライブラリのシステムをビルドしている際には ${CLFS_TARGET32} に対するコンパイルがついついクロスコンパイルでない と思いがちです。 しかし異なるホストシステムに対してビルド作業を行っているのであれば Glibc はクロスコンパイルを行っていると扱います。 そのときにはテストを実行しないからというので、ロケールファイルを生成する必要がないと思うかもしれません。 テスト実施の際はロケールファイルが存在しないとテストが数多く失敗します。 そこで以下の sed コマンドを実行してテストを成功させるようにします。

sed -i '/cross-compiling/s@ifeq@ifneq@g' ../glibc-2.25/localedata/Makefile

以下のコマンドによりテストスイートを実行します。 テストに失敗すると画面出力されます。

make check

Glibc のテストスイートはホストシステムの特定の機能、特にカーネルに大きく依存しています。 posix/annexcconform/run-conformtest はおそらく失敗し Error 1 (ignored) と出力されます。 これを除くと Glibc のテストスイートは成功するのが通常です。 しかし特定の環境下において失敗するものがあり回避できません。 テストが失敗する理由としてプログラムが存在していなかったり (シンボリックリンクがなかったり) セグメンテーションフォールトが発生したりする場合はログファイルを見ると分かります。 ログファイルには 128 以上のエラーコードとエラー詳細が出力されています。 さらに Error 2 のエラーが発生する場合は .out ファイルの内容、例えば posix/annexc.out に詳しい情報が示されているはずです。 発生しがちな問題を以下に示します。

  • nptl/tst-clock2, nptl/tst-attr3, tst/tst-cputimer1, rt/tst-cpuclock2 のテストは失敗することが知られています。 失敗の理由は明確ではありません。 ただ処理速度が原因してそれらが発生すると思われます。

  • math テストにて失敗するものがあります。 特定の最適化設定が原因であると思われます。

  • CLFS パーティションを noatime オプションを用いてマウントしている場合 atime テストが失敗します。 2.5.「新しいパーティションのマウント」 で説明しているように、CLFS のビルド中は noatime オプションを使わないようにしてください。

  • 旧式のハードウェアや性能の低いハードウェア、あるいは負荷の高いシステムにおいてテストを行うと、処理時間をオーバーしてタイムアウトが発生しテストが失敗します。 make check コマンドにて TIMEOUTFACTOR をセットするものに修正すれば、それらのエラーは回避できると報告されています。 (例: TIMEOUTFACTOR=16 make -k check)

  • posix/tst-getaddrinfo4 は、テスト実行時にネットワークに接続されていないため失敗します。

支障が出る話ではありませんが Glibc のインストール時には /etc/ld.so.conf ファイルが存在していないとして警告メッセージが出力されます。 これをなくすために以下を実行します。

touch /etc/ld.so.conf

パッケージをインストールします。 また /usr/include/rpcsvc にある不要なファイルを削除します。

make install &&
rm -v /usr/include/rpcsvc/*.x

本パッケージの詳細は 10.8.5.「Glibc の構成」を参照してください。

10.8. Glibc-2.25 64ビット

Glibc パッケージは主要な C ライブラリを提供します。 このライブラリは基本的な処理ルーチンを含むもので、メモリ割り当て、ディレクトリ走査、ファイルのオープン、クローズや入出力、文字列操作、パターンマッチング、算術処理、等々があります。

10.8.1. Glibcのインストール

インストール作業の最後には健全性テスト (sanity test) を実行し、すべてが適切にインストールされているかを確認します。 このスクリプトは所定のライブラリを用いてテストプログラムをコンパイルします。 しかしこのとき ld.so へのパスが指定されないため、ツールチェーンの一部が /tools にあるまま利用されてしまいます。 以下の一連のコマンドを実行することで、インストールしたばかりの新しい ld.so を利用するように変更します。

LINKER=$(readelf -l /tools/bin/bash | sed -n 's@.*interpret.*/tools\(.*\)]$@\1@p')
sed -i "s|libs -o|libs -L/usr/lib64 -Wl,-dynamic-linker=${LINKER} -o|" \
  scripts/test-installation.pl
unset LINKER

Glibc ビルドシステムは自らによってビルドされるものであり、コンパイラースペックファイルがたとえ /tools を指し示していたままであっても完璧にビルドされます。 スペックやリンカーは Glibc のインストール後でないと調整できません。 これは Glibc の Autoconf テストが失敗するからであり、クリーンビルドを成功させるという目標が達成できないためです。

Glibc のドキュメントではソースディレクトリ以外の専用のビルドディレクトリを作成することが推奨されています。

mkdir -v ../glibc-build
cd ../glibc-build

64 ビットライブラリを /lib64 にインストールするようにします。

echo "libc_cv_slibdir=/lib64" >> config.cache

Glibc をコンパイルするための準備をします。

CC="gcc ${BUILD64}" CXX="g++ ${BUILD64}" \
../glibc-2.25/configure \
    --prefix=/usr \
    --enable-kernel=3.12.0 \
    --libexecdir=/usr/lib64/glibc \
    --libdir=/usr/lib64 \
    --enable-obsolete-rpc \
    --enable-stack-protector=strong \
    --cache-file=config.cache

configure オプションの意味

--libexecdir=/usr/lib64/glibc

getconf ユーティリティーへのハードリンクのインストールディレクトリを、デフォルトの /usr/libexec でなく /usr/lib64/glibc に変更します。

パッケージをコンパイルします。

make

重要項目

Glibc にはシステムを適切に動作させるための重要な役割があります。 CLFS 開発者はテストスイートを実行することを強く勧めます。

以下のコマンドによりテストスイートを実行します。 テストに失敗すると画面出力されます。

make check

Glibc のテストスイートはホストシステムの特定の機能、特にカーネルに大きく依存しています。 posix/annexcconform/run-conformtest はおそらく失敗し Error 1 (ignored) と出力されます。 これを除くと Glibc のテストスイートは成功するのが通常です。 しかし特定の環境下において失敗するものがあり回避できません。 テストが失敗する理由としてプログラムが存在していなかったり (シンボリックリンクがなかったり) セグメンテーションフォールトが発生したりする場合はログファイルを見ると分かります。 ログファイルには 128 以上のエラーコードとエラー詳細が出力されています。 さらに Error 2 のエラーが発生する場合は .out ファイルの内容、例えば posix/annexc.out に詳しい情報が示されているはずです。 発生しがちな問題を以下に示します。

  • nptl/tst-clock2, nptl/tst-attr3, tst/tst-cputimer1, rt/tst-cpuclock2 のテストは失敗することが知られています。 失敗の理由は明確ではありません。 ただ処理速度が原因してそれらが発生すると思われます。

  • math テストにて失敗するものがあります。 特定の最適化設定が原因であると思われます。

  • CLFS パーティションを noatime オプションを用いてマウントしている場合 atime テストが失敗します。 2.5.「新しいパーティションのマウント」 で説明しているように、CLFS のビルド中は noatime オプションを使わないようにしてください。

  • 旧式のハードウェアや性能の低いハードウェア、あるいは負荷の高いシステムにおいてテストを行うと、処理時間をオーバーしてタイムアウトが発生しテストが失敗します。 make check コマンドにて TIMEOUTFACTOR をセットするものに修正すれば、それらのエラーは回避できると報告されています。 (例: TIMEOUTFACTOR=16 make -k check)

  • posix/tst-getaddrinfo4 は、テスト実行時にネットワークに接続されていないため失敗します。

パッケージをインストールします。 また /usr/include/rpcsvc にある不要なファイルを削除します。

make install &&
rm -v /usr/include/rpcsvc/*.x

設定ファイルをインストールします。 また nscd の実行時に利用されるディレクトリを生成します。

cp -v ../glibc-2.25/nscd/nscd.conf /etc/nscd.conf
mkdir -pv /var/cache/nscd

10.8.2. 国際化

システムを各種の言語に対応させるためのロケールは、今までのコマンドではインストールされません。 以下によりこれをインストールします。

make localedata/install-locales

上のコマンドは glibc-2.25/localedata/SUPPORTED ファイルに示された全ロケールを生成しインストールします。 そうするのではなく時間節約のために必要なロケールのみをインストールすることもできます。 localedef コマンドを利用します。 このコマンドの利用方法は Glibc ソース内の INSTALL ファイルに示されています。 もっとも今後のパッケージビルド時のテストにおいては数多くのロケールを生成しておかないとテストが成功しません。 特に GCC の libstdc++ テストなどです。 上で示した install-locales ターゲットによるビルドではなく以下に示すコマンドを実行すれば、 テストを成功させるために必要となる最低限のロケールをインストールすることができます。

mkdir -pv /usr/lib/locale
localedef -i cs_CZ -f UTF-8 cs_CZ.UTF-8
localedef -i de_DE -f ISO-8859-1 de_DE
localedef -i de_DE@euro -f ISO-8859-15 de_DE@euro
localedef -i en_HK -f ISO-8859-1 en_HK
localedef -i en_PH -f ISO-8859-1 en_PH
localedef -i en_US -f ISO-8859-1 en_US
localedef -i es_MX -f ISO-8859-1 es_MX
localedef -i fa_IR -f UTF-8 fa_IR
localedef -i fr_FR -f ISO-8859-1 fr_FR
localedef -i fr_FR@euro -f ISO-8859-15 fr_FR@euro
localedef -i it_IT -f ISO-8859-1 it_IT
localedef -i ja_JP -f EUC-JP ja_JP

上の make localedata/install-locales コマンドによってインストールされるロケールの中には CLFS や CBLFS の取り扱うアプリケーションが適切にサポートできないものがあります。 これはさまざまなアプリケーションの開発者がロケールに対して間違った扱いをしているために起きます。 したがって CLFS ではマルチバイトキャラクターセット (UTF-8 など) や、左から右へ記述する言語ロケールは使用するべきではありません。 この問題を解決するにはパッチを適用しなければならず、多くの非公式なもの不安定なものを用いることになります。 CLFS 開発者は今のところ、こういった複雑なロケールのサポートは見送ることにしています。 サポートしないと言えば ja_JP や fa_IR といったロケールも同様です。 このロケールは GCC と Gettext のテストを成功させるためにインストールしました。 ただし watch プログラム (Procps-ng パッケージ) はそのロケールにおいては適切に動作しません。 こういった複雑な状況を何とか解決しようと、国際化関連のヒントとしてまとめられています。

10.8.3. Glibc の設定

/etc/nsswitch.conf ファイルを作成しておく必要があります。 Glibc はこのファイルがなかったり壊れていたりしてもデフォルト値を採用します。 しかしそのデフォルト値ではネットワーク環境下にて Glibc が正しく動作しません。 タイムゾーンデータも設定おく必要があります。

以下のコマンドを実行して /etc/nsswitch.conf ファイルを生成します。

cat > /etc/nsswitch.conf << "EOF"
# Begin /etc/nsswitch.conf

passwd: files
group: files
shadow: files

hosts: files dns
networks: files

protocols: files
services: files
ethers: files
rpc: files

# End /etc/nsswitch.conf
EOF

タイムゾーンデータをインストールします。

tar -xf ../tzdata2017b.tar.gz

ZONEINFO=/usr/share/zoneinfo
mkdir -pv $ZONEINFO/{posix,right}

for tz in etcetera southamerica northamerica europe africa antarctica \
          asia australasia backward pacificnew systemv; do
    zic -L /dev/null   -d $ZONEINFO       -y "sh yearistype.sh" ${tz}
    zic -L /dev/null   -d $ZONEINFO/posix -y "sh yearistype.sh" ${tz}
    zic -L leapseconds -d $ZONEINFO/right -y "sh yearistype.sh" ${tz}
done

cp -v zone.tab zone1970.tab iso3166.tab $ZONEINFO
zic -d $ZONEINFO -p America/New_York
unset ZONEINFO

zic コマンドの意味

zic -L /dev/null ...

うるう秒を含まない posix タイムゾーンデータを生成します。 これらは zoneinfozoneinfo/posix に収容するものとして適切なものです。 zoneinfo へは POSIX 準拠のタイムゾーンデータを含めることが必要であり、こうしておかないと数々のテストスイートにてエラーが発生してしまいます。 組み込みシステムなどでは容量の制約が厳しいため、タイムゾーンデータはあまり更新したくない場合があり、posix ディレクトリを設けなければ 1.9 MB もの容量を節約できます。 ただしアプリケーションやテストスイートによっては、エラーが発生するかもしれません。

zic -L leapseconds ...

うるう秒を含んだ正しいタイムゾーンデータを生成します。 組み込みシステムなどでは容量の制約が厳しいため、タイムゾーンデータはあまり更新したくない場合や、さほど気にかけない場合もあります。 right ディレクトリを省略することにすれば 1.9MB の容量を節約することができます。

zic ... -p ...

posixrules ファイルを生成します。 ここでは New York を用います。 POSIX では、日中の保存時刻として US ルールに従うことを規程しているためです。

ローカルのタイムゾーンを確認するには以下のスクリプトを実行します。

tzselect

地域情報を設定するためにいくつか尋ねられるのでそれに答えます。 このスクリプトはタイムゾーン名を表示します。 (例えば EST5EDTCanada/Eastern などです。) 以下のコマンドにより /etc/localtime ファイルを生成します。

cp -v /usr/share/zoneinfo/[xxx] \
    /etc/localtime

[xxx] の部分は tzselect により得られたタイムゾーンの名前 (例えば Canada/Eastern など) に置き換えてください。

10.8.4. ダイナミックローダーの設定

ダイナミックリンカー (32ビット用が /lib/ld-linux.so.2、64ビット用が /lib64/ld-linux-x86-64.so.2) がダイナミックライブラリを検索するデフォルトのディレクトリは /lib ディレクトリ、 /lib64 ディレクトリ、/usr/lib ディレクトリ、/usr/lib64 ディレクトリです。 もしこれら以外のディレクトリにライブラリファイルがあるなら /etc/ld.so.conf ファイルに記述を追加して、ダイナミックローダーが探し出せるようにしておくことが必要です。 追加のライブラリが配置されるディレクトリとしては /usr/local/lib ディレクトリ、/usr/local/lib64 ディレクトリ、/opt/lib ディレクトリ、/opt/lib64といったものがよく利用されます。 ダイナミックローダーの検索パスとしてこのようなディレクトリを追加します。

以下のコマンドを実行して /etc/ld.so.conf ファイルを新たに生成します。

cat > /etc/ld.so.conf << "EOF"
# Begin /etc/ld.so.conf

/usr/local/lib
/usr/local/lib64
/opt/lib
/opt/lib64

# End /etc/ld.so.conf
EOF

10.8.5. Glibc の構成

インストールプログラム: catchsegv, gencat, getconf, getent, iconv, iconvconfig, ldconfig, ldd, lddlibc4, locale, localedef, makedb, mtrace, nscd, pcprofiledump, pldd, rpcgen, sln, sotruss, sprof, tzselect, xtrace, zdump, zic
インストールライブラリ: ld.so, libBrokenLocale.[a,so], libSegFault.so, libanl.[a,so], libc.[a,so], libc_nonshared.a, libcidn.[a,so], libcrypt.[a,so], libdl.[a,so], libg.a, libieee.a, libm.[a,so], libmcheck.a, libmemusage.so, libnsl.a, libnss_compat.so, libnss_dns.so, libnss_files.so, libnss_hesiod.so, libnss_nis.so, libnss_nisplus.so, libpcprofile.so, libpthread.[a,so], libpthread_nonshared.a, libresolv.[a,so], librpcsvc.a, librt.[a,so], libthread_db.so, libutil.[a,so]
インストールディレクトリ: /usr/include/arpa, /usr/include/bits, /usr/include/gnu, /usr/include/net, /usr/include/netash, /usr/include/netatalk, /usr/include/netax25, /usr/include/neteconet, /usr/include/netinet, /usr/include/netipx, /usr/include/netiucv, /usr/include/netpacket, /usr/include/netrom, /usr/include/netrose, /usr/include/nfs, /usr/include/protocols, /usr/include/rpc, /usr/include/rpcsvc, /usr/include/scsi, /usr/include/sys, /usr/lib/audit, /usr/lib/gconv, /usr/lib/glibc, /usr/lib/locale, /usr/share/i18n, /usr/share/zoneinfo, /var/cache/ldconfig, /var/cache/nscd

概略説明

catchsegv

プログラムがセグメンテーションフォールトにより停止した時に、スタックトレースを生成するために利用します。

gencat

メッセージカタログを生成します。

getconf

ファイルシステムに固有の変数に設定された値を表示します。

getent

管理データベースから設定項目を取得します。

iconv

キャラクターセットを変換します。

iconvconfig

高速ロードができる iconv モジュール設定ファイルを生成します。

ldconfig

ダイナミックリンカーの実行時バインディングを設定します。

ldd

指定したプログラムまたは共有ライブラリが必要としている共有ライブラリを表示します。

lddlibc4

オブジェクトファイルを使って ldd コマンドを補助します。[訳註:意味不明]

locale

組み込み操作に対して POSIX ロケール利用の有効無効をコンパイラーに提供します。

localedef

ロケールの設定をコンパイルします。

makedb

テキストを入力として単純なデータベースを生成します。

mtrace

メモリトレースファイル (memory trace file) を読み込んで解釈します。 そして可読可能な書式で出力します。

nscd

一般的なネームサービスへの変更要求のキャッシュを提供するデーモン。

pcprofiledump

PC プロファイリングにより生成された情報をダンプします。

pldd

稼動中のプロセスにて利用されている動的共有オブジェクト (dynamic shared objects) を一覧出力します。

rpcgen

リモートプロシジャーコール (Remote Procedure Call; RPC) を実装するための C 言語コードを生成します。

sln

スタティックリンクによりシンボリックリンクを生成します。

sotruss

指定されたコマンドの共有ライブラリ内のプロシジャーコールをトレースします。

sprof

共有オブジェクトのプロファイリングデータを読み込んで表示します。

tzselect

ユーザーに対してシステムの設置地域を問合せ、対応するタイムゾーンの記述を表示します。

xtrace

プログラム内にて現在実行されている関数を表示することで、そのプログラムの実行状況を追跡します。

zdump

タイムゾーンをダンプします。

zic

タイムゾーンコンパイラー。

ld.so

共有ライブラリのためのヘルパープログラム。

libBrokenLocale

Mozilla などのように、壊れたロケールに対処するプログラムにより利用されます。

libSegFault

セグメンテーションフォールトのシグナルハンドラー。

libanl

非同期の名前解決 (asynchronous name lookup) ライブラリ。

libc

主要な C ライブラリ。

libcidn

Glibc が内部的に利用するもので getaddrinfo() 関数によって国際化ドメイン名 (internationalized domain names) を取り扱います。

libcrypt

暗号化ライブラリ。

libdl

ダイナミックリンクのインターフェースライブラリ。

libg

g++ に対するランタイムライブラリ。

libieee

IEEE (the Institute of Electrical and Electronic Engineers) の浮動小数点ライブラリ。

libm

数学ライブラリ。

libmcheck

起動時のコード実行を提供します。

libmemusage

memusage コマンドが利用するもので、プログラムのメモリ使用に関する情報を収集します。 (memusage コマンドは Glibc に含まれますが、CLFS システム内ではビルドせず、これをビルドするにはさらに依存パッケージを必要とします。)

libnsl

ネットワークサービスライブラリ。

libnss

NSS (Name Service Switch) ライブラリ。 ホスト、ユーザー名、エイリアス、サービス、プロトコルなどの名前解決を行う関数を提供します。

libpcprofile

指定されたソースコード行の処理に費やした総 CPU 時間を計測するためのプロファイリング関数を提供します。

libpthread

POSIX スレッドライブラリ。

libresolv

インターネットドメインネームサーバーに対しての、パケットの生成、送信、解析を行う関数を提供します。

librpcsvc

さまざまな RPC サービスを実現する関数を提供します。

librt

POSIX.1b リアルタイム拡張 (Realtime Extension) にて既定されているインターフェースをほぼ網羅した関数を提供します。

libthread_db

マルチスレッドプログラム用のデバッガーを構築するための有用な関数を提供します。

libutil

数多くの Unix ユーティリティにて利用される「標準」関数を提供します。

10.9. ツールチェーンの調整

GCC スペックファイルを修正し、新しいダイナミックリンカーを指し示すようにします。 以下の perl によりこれを実現します。

gcc -dumpspecs | \
perl -p -e 's@/tools/lib/ld@/lib/ld@g;' \
     -e 's@/tools/lib64/ld@/lib64/ld@g;' \
     -e 's@\*startfile_prefix_spec:\n@$_/usr/lib/ @g;' > \
     $(dirname $(gcc --print-libgcc-file-name))/specs

上記の perl コマンドは GCC のスペックファイルに二種類の修正を行うものです。 一つはダイナミックリンカーのパス名から 「/tools」 を取り除きます。 もう一つは startfile_prefix_spec に「/usr/lib/」を加えます。 実際に specs ファイルの内容を覗いてみてください。 gcc -dumpspecs の出力結果と比較して、意図した修正が行われていることを確認してください。

注意

この時点において、基本的な機能 (コンパイルやリンクなど) が正しく動作していることを確認する必要があります。 これを行うために以下の健全性検査を実行します。

32ビットABIの場合は以下です。

echo 'int main(){}' > dummy.c
gcc ${BUILD32} dummy.c
readelf -l a.out | grep ': /lib'

問題なく動作した場合はエラーがなかったということで、最後のコマンドから出力される結果は以下のようになるはずです。

[Requesting program interpreter: /lib/ld-linux.so.2]

64ビット ABI の場合は以下です。

echo 'main(){}' > dummy.c
gcc ${BUILD64} dummy.c
readelf -l a.out | grep ': /lib'

問題なく動作した場合はエラーがなかったということで、最後のコマンドから出力される結果は以下のようになるはずです。

[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]

ここでダイナミックリンカーのディレクトリが /lib または /lib64であることを確認してください。

出力結果が上と異なっていたり、出力が全く得られなかったりした場合は、何かが根本的に間違っているということです。 どこに問題があるのか調査、再試行を行って解消してください。 最もありがちな理由は、スペックファイルの修正を誤っていることです。 問題を残したままこの先には進まないでください。

すべてが正しく動作したら、テストに用いたファイルを削除します。

rm -v dummy.c a.out

10.10. M4-1.4.18

M4 パッケージはマクロプロセッサーを提供します。

10.10.1. M4 のインストール

M4 をコンパイルするための準備をします。

CC="gcc ${BUILD64}" ./configure \
    --prefix=/usr

パッケージをコンパイルします。

make

ビルド結果をテストする場合は以下を実行します。

make check

パッケージをインストールします。

make install

10.10.2. M4 の構成

インストールプログラム: m4

概略説明

m4

指定されたファイル内のマクロ定義を展開して、そのコピーを生成します。 マクロ定義には埋め込み (built-in) マクロとユーザー定義マクロがあり、いくらでも引数を定義することができます。 マクロ定義の展開だけでなく m4 には以下のような埋め込み関数があります。 指定ファイルの読み込み、Unix コマンド実行、整数演算処理、テキスト操作、再帰処理などです。 m4 プログラムはコンパイラーのフロントエンドとして利用することができ、それ自体でマクロプロセッサーとして用いることもできます。

10.11. GMP-6.1.2 32ビットライブラリ

GMP は、任意精度、有理数、浮動小数点などの演算処理を行うライブラリを提供します。

10.11.1. GMP のインストール

注記

CLFS システムを稼動させるつもりの CPU とは異なる CPU にて本パッケージをコンパイルしている場合は、GMP の config.guessconfig.sub を書き換える必要があります。 これは CPU を取り違えて最適化を行ってしまうことを避けるためです。 以下のコマンドによりそれを実現します。

mv -v config{fsf,}.guess
mv -v config{fsf,}.sub

GMP をコンパイルするための準備をします。

CC="gcc -isystem /usr/include ${BUILD32}" \
CXX="g++ -isystem /usr/include ${BUILD32}" \
LDFLAGS="-Wl,-rpath-link,/usr/lib:/lib ${BUILD32}" \
  ABI=32 ./configure \
    --prefix=/usr \
    --enable-cxx

パッケージをコンパイルします。

make

テストを実行します。

make check

パッケージをインストールします。

make install

GMP によりインストールされるヘッダーファイルはアークテクチャーに依存しています。 32 ビットとしてコンパイルされたプログラムには、32 ビット用のヘッダーファイルが必要になります。 このことは 64 ビットについても同じことです。 そこでヘッダーファイルを作成しておきます。 これは後にラッパースクリプトにより置き換えられます。

mv -v /usr/include/gmp{,-32}.h

本パッケージの詳細は 10.12.2.「GMP の構成」を参照してください。

10.12. GMP-6.1.2 64ビット

GMP は、任意精度、有理数、浮動小数点などの演算処理を行うライブラリを提供します。

10.12.1. GMP のインストール

注記

CLFS システムを稼動させるつもりの CPU とは異なる CPU にて本パッケージをコンパイルしている場合は、GMP の config.guessconfig.sub を書き換える必要があります。 これは CPU を取り違えて最適化を行ってしまうことを避けるためです。 以下のコマンドによりそれを実現します。

mv -v config{fsf,}.guess
mv -v config{fsf,}.sub

GMP をコンパイルするための準備をします。

CC="gcc -isystem /usr/include ${BUILD64}" \
CXX="g++ -isystem /usr/include ${BUILD64}" \
LDFLAGS="-Wl,-rpath-link,/usr/lib64:/lib64 ${BUILD64}" \
./configure \
    --prefix=/usr \
    --libdir=/usr/lib64 \
    --enable-cxx \
    --docdir=/usr/share/doc/gmp-6.1.2

パッケージをコンパイルします。

make

HTML ドキュメントを生成します。

make html

テストを実行します。

make check

パッケージをインストールします。

make install

ドキュメントをインストールします。

make install-html

64 ビットのヘッダーファイルを生成します。

mv -v /usr/include/gmp{,-64}.h

元々のヘッダーファイルの場所にスタブヘッダーを生成します。

cat > /usr/include/gmp.h << "EOF"
/* gmp.h - Stub Header  */
#ifndef __STUB__GMP_H__
#define __STUB__GMP_H__

#if defined(__x86_64__) || \
    defined(__sparc64__) || \
    defined(__arch64__) || \
    defined(__powerpc64__) || \
    defined (__s390x__)
# include "gmp-64.h"
#else
# include "gmp-32.h"
#endif

#endif /* __STUB__GMP_H__ */
EOF

10.12.2. GMP の構成

インストールライブラリ: libgmp.[a,so], libgmpxx.[a,so]
インストールディレクトリ: /usr/share/doc/gmp-6.1.2

概略説明

libgmp

GNU 倍精度関数 (multiple precision functions) の定義を提供します。

libgmpxx

GMP タイプに対する C++ クラスラッパーを提供します。

10.13. MPFR-3.1.5 32ビットライブラリ

MPFR ライブラリは、倍精度演算 (multiple precision) の浮動小数計算と適切な丸みを実現する C ライブラリです。

10.13.1. MPFR のインストール

アップストリームによるパッチを適用します。

patch -Np1 -i ../mpfr-3.1.5-fixes-1.patch

MPFR をコンパイルするための準備をします。

CC="gcc -isystem /usr/include ${BUILD32}" \
    LDFLAGS="-Wl,-rpath-link,/usr/lib:/lib ${BUILD32}" \
./configure \
    --prefix=/usr \
    --host=${CLFS_TARGET32} \
    --docdir=/usr/share/doc/mpfr-3.1.5

パッケージをコンパイルします。

make
make html

テストを実行します。

make check

パッケージをインストールします。

make install
make install-html

本パッケージの詳細は 10.14.2.「MPFR の構成」を参照してください。

10.14. MPFR-3.1.5 64ビット

MPFR ライブラリは、倍精度演算 (multiple precision) の浮動小数計算と適切な丸みを実現する C ライブラリです。

10.14.1. MPFR のインストール

アップストリームによるパッチを適用します。

patch -Np1 -i ../mpfr-3.1.5-fixes-1.patch

MPFR をコンパイルするための準備をします。

CC="gcc -isystem /usr/include ${BUILD64}" \
    LDFLAGS="-Wl,-rpath-link,/usr/lib64:/lib64 ${BUILD64}" \
./configure \
    --prefix=/usr \
    --libdir=/usr/lib64 \
    --docdir=/usr/share/doc/mpfr-3.1.5

パッケージをコンパイルします。

make
make html

テストを実行します。

make check

パッケージをインストールします。

make install
make install-html

10.14.2. MPFR の構成

インストールライブラリ: libmpfr.[a,so]
インストールディレクトリ: /usr/share/doc/mpfr-3.1.5

概略説明

libmpfr

倍精度演算 (multiple precision) の浮動小数点ライブラリ。

10.15. MPC-1.0.3 32ビットライブラリ

MPC パッケージは複素数演算を行うライブラリを提供するものです。 高い精度と適切な丸め (rounding) を実現します。

10.15.1. MPC のインストール

MPC をコンパイルするための準備をします。

CC="gcc -isystem /usr/include ${BUILD32}" \
LDFLAGS="-Wl,-rpath-link,/usr/lib:/lib ${BUILD32}" \
./configure \
    --prefix=/usr \
    --host=${CLFS_TARGET32}

パッケージをコンパイルします。

make

テストを実行します。

make check

パッケージをインストールします。

make install

本パッケージの詳細は 10.16.2.「MPC の構成」を参照してください。

10.16. MPC-1.0.3 64ビット

MPC パッケージは複素数演算を行うライブラリを提供するものです。 高い精度と適切な丸め (rounding) を実現します。

10.16.1. MPC のインストール

MPC をコンパイルするための準備をします。

CC="gcc -isystem /usr/include ${BUILD64}" \
LDFLAGS="-Wl,-rpath-link,/usr/lib64:/lib64 ${BUILD64}" \
./configure \
    --prefix=/usr \
    --libdir=/usr/lib64 \
    --docdir=/usr/share/doc/mpc-1.0.3

パッケージをコンパイルします。

make

HTML ドキュメントを生成します。

make html

テストを実行します。

make check

パッケージをインストールします。

make install

HTML ドキュメントをインストールします。

make install-html

10.16.2. MPC の構成

インストールライブラリ: libmpc.[a,so]
インストールディレクトリ: /usr/share/doc/mpc-1.0.3

概略説明

libmpc

倍精度の複素数ライブラリ。

10.17. ISL-0.17.1 32ビットライブラリ

ISL は、線形制約条件に該当する整数ポイントやその関連を操作するためのライブラリを提供します。

10.17.1. ISL のインストール

ISL をコンパイルするための準備をします。

CC="gcc -isystem /usr/include ${BUILD32}" \
LDFLAGS="-Wl,-rpath-link,/usr/lib:/lib ${BUILD32}" \
./configure \
    --prefix=/usr \
    --host=${CLFS_TARGET32}

パッケージをコンパイルします。

make

ビルド結果をテストします。

make check

パッケージをインストールします。

make install

インストール先が不適当なファイルを移動します。

mkdir -pv /usr/share/gdb/auto-load/usr/lib
mv -v /usr/lib/libisl*gdb.py /usr/share/gdb/auto-load/usr/lib

本パッケージの詳細は 10.18.2.「ISL の構成」を参照してください。

10.18. ISL-0.17.1 64ビット

ISL は、線形制約条件に該当する整数ポイントやその関連を操作するためのライブラリを提供します。

10.18.1. ISL のインストール

ISL をコンパイルするための準備をします。

CC="gcc -isystem /usr/include ${BUILD64}" \
LDFLAGS="-Wl,-rpath-link,/usr/lib64:/lib64 ${BUILD64}" \
./configure \
    --prefix=/usr \
    --libdir=/usr/lib64

パッケージをコンパイルします。

make

ビルド結果をテストします。

make check

パッケージをインストールします。

make install

インストール先が不適当なファイルを移動します。

mkdir -pv /usr/share/gdb/auto-load/usr/lib64
mv -v /usr/lib64/*gdb.py /usr/share/gdb/auto-load/usr/lib64

10.18.2. ISL の構成

インストールライブラリ: libisl.[a,so]
インストールディレクトリ: /usr/include/isl

概略説明

libisl

ISL (Integer Set Library) ライブラリ。

10.19. Zlib-1.2.11 32 ビットライブラリ

Zlib パッケージは、各種プログラムから呼び出される、圧縮、伸張 (解凍) を行う関数を提供します。

10.19.1. Zlibのインストール

Zlib をコンパイルするための準備をします。

CC="gcc -isystem /usr/include ${BUILD32}" \
CXX="g++ -isystem /usr/include ${BUILD32}" \
LDFLAGS="-Wl,-rpath-link,/usr/lib:/lib ${BUILD32}" \
./configure \
    --prefix=/usr

パッケージをコンパイルします。

make

ビルド結果をテストする場合は以下を実行します。

make check

パッケージをインストールします。

make install

上のコマンド実行により、2つの .so ファイルを /usr/lib ディレクトリにインストールします。 ここでそれらを /lib ディレクトリに移動させ、/usr/lib へのリンクを再生成します。

mv -v /usr/lib/libz.so.* /lib
ln -sfv ../../lib/$(readlink /usr/lib/libz.so) /usr/lib/libz.so

本パッケージの詳細は 10.20.2.「Zlib の構成」を参照してください。

10.20. Zlib-1.2.11 64 ビット

Zlib パッケージは、各種プログラムから呼び出される、圧縮、伸張 (解凍) を行う関数を提供します。

10.20.1. Zlib のインストール

Zlib をコンパイルするための準備をします。

CC="gcc -isystem /usr/include ${BUILD64}" \
CXX="g++ -isystem /usr/include ${BUILD64}" \
LDFLAGS="-Wl,-rpath-link,/usr/lib64:/lib64 ${BUILD64}" \
./configure \
    --prefix=/usr \
    --libdir=/usr/lib64

パッケージをコンパイルします。

make

ビルド結果をテストする場合は以下を実行します。

make check

パッケージをインストールします。

make install

上のコマンドにより二つの .so ファイルが /usr/lib64 ディレクトリにインストールされます。 ここでそれらを /lib64 ディレクトリに移動させ /usr/lib64 へのリンクを張ります。

mv -v /usr/lib64/libz.so.* /lib64
ln -sfv ../../lib64/$(readlink /usr/lib64/libz.so) /usr/lib64/libz.so

ドキュメントをインストールします。

mkdir -pv /usr/share/doc/zlib-1.2.11
cp -rv doc/* examples /usr/share/doc/zlib-1.2.11

10.20.2. Zlib の構成

インストールライブラリ: libz.[a,so]
インストールディレクトリ: /usr/share/doc/zlib-1.2.11

概略説明

libz

各種プログラムが利用する、圧縮、伸張 (解凍) 関数を提供します。

10.21. Flex-2.6.4 32ビット ライブラリ

Flex パッケージは、字句パターンを認識するプログラムを生成するユーティリティを提供します。

10.21.1. Flex のインストール

Flex をコンパイルするための準備をします。

CC="gcc ${BUILD32}" ./configure \
    --prefix=/usr \
    --docdir=/usr/share/doc/flex-2.6.4

パッケージをコンパイルします。

make

パッケージをインストールします。

make install

本パッケージの詳細は 10.22.2.「Flex の構成」を参照してください。

10.22. Flex-2.6.4 64ビット

Flex パッケージは、字句パターンを認識するプログラムを生成するユーティリティを提供します。

10.22.1. Flex のインストール

Flex をコンパイルするための準備をします。

CC="gcc ${BUILD64}" ./configure \
    --prefix=/usr \
    --libdir=/usr/lib64 \
    --docdir=/usr/share/doc/flex-2.6.4

パッケージをコンパイルします。

make

ビルド結果をテストする場合は以下を実行します。

make check

テストスイートでは bison を利用しているテストが3つ失敗します。 そもそもこの時点では bison がインストールされていないためです。 テストを成功させるためには Bison をインストールした後にもう一度 Flex のテストスイートを実行することになります。

パッケージをインストールします。

make install

プログラムの中には flex コマンドが用いられず、その前身である lex コマンドを実行しようとするものがあります。 そういったプログラムへ対応するためにシンボリックリンク lex を生成します。 これにより lex のエミュレーションモードとして flex を実行します。

ln -sv flex /usr/bin/lex

10.22.2. Flex の構成

インストールプログラム: flex, flex++ (flex へのリンク), lex
インストールライブラリ: libfl.[a,so], libfl_pic.[a,so]
インストールディレクトリ: /usr/share/doc/flex-2.6.4

概略説明

flex

テキスト内のパターンを認識するためのプログラムを生成するツール。 これは多彩なパターン検索の規則構築を可能とします。 これを利用することで特別なプログラムの生成が不要となります。

flex++

flex へのリンクであり、C++ のスキャナークラスを生成します。

lex

lex のエミュレーションモードとして flex を実行するスクリプト。

libfl

flex ライブラリ。

libfl_pic

flex ライブラリ。

10.23. Bison-3.0.4 32ビットライブラリ

Bison パッケージは構文解析ツールを提供します。

10.23.1. Bison のインストール

Bison をコンパイルするための準備をします。

CC="gcc ${BUILD32}" CXX="g++ ${BUILD32}" \
./configure \
    --prefix=/usr \
    --docdir=/usr/share/doc/bison-3.0.4

パッケージをコンパイルします。

make

ビルド結果をテストする場合は以下を実行します。

make check

パッケージをインストールします。

make install

本パッケージの詳細は 10.24.2.「Bison の構成」を参照してください。

10.24. Bison-3.0.4 64ビット

Bison パッケージは構文解析ツールを提供します。

10.24.1. Bison のインストール

Bison をコンパイルするための準備をします。

CC="gcc ${BUILD64}" \
CXX="g++ ${BUILD64}" \
./configure \
    --prefix=/usr \
    --libdir=/usr/lib64 \
    --docdir=/usr/share/doc/bison-3.0.4

パッケージをコンパイルします。

make

ビルド結果をテストする場合は以下を実行します。

make check

パッケージをインストールします。

make install

10.24.2. Bison の構成

インストールプログラム: bison, yacc
インストールライブラリ: liby.a
インストールディレクトリ: /usr/share/bison, /usr/share/doc/bison-3.0.4

概略説明

bison

構文規則の記述に基づいて、テキストファイルの構造を解析するプログラムを生成します。 Bison は Yacc (Yet Another Compiler Compiler) の互換プログラムです。

yacc

bison のラッパースクリプト。 yacc プログラムがあるなら bison を呼び出さずに yacc を実行します。 -y オプションが指定された時は bison を実行します。

liby.a

Yacc 互換の関数として yyerror 関数と main 関数を含むライブラリです。 このライブラリはあまり使い勝手の良いものではありません。 ただし POSIX ではこれが必要になります。

10.25. Binutils-2.28

Binutils パッケージは、リンカーやアセンブラーなどのようにオブジェクトファイルを取り扱うツール類を提供します。

10.25.1. Binutils のインストール

PTY がビルド環境内にて正しく作動しているかどうかを確認します。 すべてが適正であるかどうかを、以下の簡単なテストの実行によりチェックします。

expect -c "spawn ls"

上のコマンドは以下を出力するはずです。

spawn ls

上のような出力ではなく、PTY の生成が必要であるとするメッセージが出力されたら、PTY の動作が適切に構築できていないことを示しています。 Binutils や GCC のテストスイートを実行する前に、この症状は解消しておく必要があります。

Binutils のドキュメントによると Binutils のビルドにあたっては、ソースディレクトリ以外の専用のビルドディレクトリを作成してビルドすることが推奨されています。

mkdir -v ../binutils-build
cd ../binutils-build

Binutils をコンパイルするための準備をします。

CC="gcc -isystem /usr/include ${BUILD64}" \
LDFLAGS="-Wl,-rpath-link,/usr/lib64:/lib64:/usr/lib:/lib ${BUILD64}" \
../binutils-2.28/configure \
    --prefix=/usr \
    --enable-shared \
    --enable-64-bit-bfd \
    --libdir=/usr/lib64 \
    --enable-gold=yes \
    --enable-plugins \
    --with-system-zlib \
    --enable-threads

パッケージをコンパイルします。

make tooldir=/usr

make パラメーターの意味

tooldir=/usr

tooldir は実行モジュール類が最終的にインストールされるディレクトリを表わすものであり、通常は $(exec_prefix)/$(target_alias) に設定されています。 ここで行っているのはカスタムシステム作りであるわけですから /usr の下にターゲット指定のディレクトリを生成する必要はありません。

重要項目

Binutils にはシステムを適切に動作させるための重要な役割があります。 CLFS 開発者はテストスイートを実行することを強く勧めます。

ビルド結果をテストします。

make check

パッケージをインストールします。

make tooldir=/usr install

10.25.2. Binutils の構成

インストールプログラム: addr2line, ar, as, c++filt, elfedit, gprof, ld, ld.bfd, ld.gold, nm, objcopy, objdump, ranlib, readelf, size, strings, strip
インストールライブラリ: libbfd.[a,so], libopcodes.[a,so]
インストールディレクトリ: /usr/lib/ldscripts

概略説明

addr2line

指定された実行モジュール名とアドレスに基づいて、プログラム内のアドレスをファイル名と行番号に変換します。 これは実行モジュール内のデバッグ情報を利用します。 特定のアドレスがどのソースファイルと行番号に該当するかを確認するものです。

ar

アーカイブの生成、修正、抽出を行います。

as

gcc の出力結果をアセンブルして、オブジェクトファイルとして生成するアセンブラー。

c++filt

リンカーから呼び出されるもので C++ と Java のシンボルを複合 (demangle) し、オーバーロード関数が破壊されることを回避します。

elfedit

ELF ファイルの ELF ヘッダーを更新します。

gprof

コールグラフ (call graph) のプロファイルデータを表示します。

ld

複数のオブジェクトファイルやアーカイブファイルから、一つのファイルを生成するリンカー。 データの再配置やシンボル参照情報の結合を行います。

ld.bfd

ld へのハードリンク。

ld.gold

ld よりも高速に処理できるリンカー。 特に大規模な C++ アプリケーションに有用です。

nm

指定されたオブジェクトファイル内のシンボル情報を一覧表示します。

objcopy

オブジェクトファイルの変換を行います。

objdump

指定されたオブジェクトファイルの各種情報を表示します。 さまざまなオプションを用いることで特定の情報表示が可能です。 表示される情報は、コンパイル関連ツールを開発する際に有用なものです。

ranlib

アーカイブの内容を索引として生成し、それをアーカイブに保存します。 索引は、アーカイブのメンバーによって定義されるすべてのシンボルの一覧により構成されます。 アーカイブのメンバーとは再配置可能なオブジェクトファイルのことです。

readelf

ELF フォーマットのバイナリファイルの情報を表示します。

size

指定されたオブジェクトファイルのセクションサイズと合計サイズを一覧表示します。

strings

指定されたファイルに対して、印字可能な文字の並びを出力します。 文字は所定の長さ (デフォルトでは 4文字) 以上のものが対象となります。 オブジェクトファイルの場合デフォルトでは、初期化セクションとロードされるセクションからのみ文字列を抽出し出力します。 これ以外の種類のファイルの場合は、ファイル全体が走査されます。

strip

オブジェクトファイルからデバッグシンボルを取り除きます。

libbfd

バイナリファイルディスクリプター (Binary File Descriptor) ライブラリ。

libopcodes

opcodes (オペレーションコード; プロセッサー命令を「認識可能なテキスト」として表現したもの) を取り扱うライブラリ。 このライブラリは objdump のような、ビルド作業に用いるユーティリティプログラムが利用しています。

10.26. GCC-7.1.0

GCC パッケージは C コンパイラーや C++ コンパイラーなどの GNU コンパイラーコレクションを提供します。

10.26.1. GCC のインストール

以下の sed コマンド置換によって、fixincludes スクリプトを実行しないようにします。

sed -i 's@\./fixinc\.sh@-c true@' gcc/Makefile.in

GCC のドキュメントによると GCC のビルドにあたっては、ソースディレクトリ以外の専用のビルドディレクトリを作成することが推奨されています。

mkdir -v ../gcc-build
cd ../gcc-build

GCC をコンパイルするための準備をします。

SED=sed CC="gcc -isystem /usr/include ${BUILD64}" \
CXX="g++ -isystem /usr/include ${BUILD64}" \
LDFLAGS="-Wl,-rpath-link,/usr/lib64:/lib64:/usr/lib:/lib" \
../gcc-7.1.0/configure \
    --prefix=/usr \
    --libdir=/usr/lib64 \
    --libexecdir=/usr/lib64 \
    --enable-languages=c,c++ \
    --with-system-zlib \
    --enable-install-libiberty \
    --disable-bootstrap

configure オプションの意味

SED=sed

fixincl プログラムにおいて /tools/bin/sed へのパスがハードコーディングされないようにします。

--disable-bootstrap

ネイティブビルドにおいて GCC はデフォルトでは3ステージめの "ブートストラップ" コンパイラーを用います。 これにより GCC は計3回コンパイルされるわけです。 1回めのコンパイルの後、このコンパイラーを用いて2回めが処理され、2回めのコンパイラーを使って再度コンパイルします。 そして2回めと3回めのコンパイラーが比較検証されて初めて、GCC が自分自身を生み出すことができることになります。 しかし CLFS のビルド手順においてこのようなことは不要です。 ここでそれを無効とします。

パッケージをコンパイルします。

make

重要項目

GCC はシステムを適切に動作させるための重要な役割を持っています。 したがって CLFS 開発者としてはテストスイートの実行を強く勧めます。

テスト実施にあたり、スタックサイズを増やします。

ulimit -s 32768

ビルド結果をテストします。 エラーが発生しても停止しないようにします。

make -k check

-k フラグをつけるのは最後までテストスイートを実行させるためです。 失敗があってもすぐ止まることがないようにします。 GCC のテストスイートは広範囲に行われるもので、たいていは正常実行されますが失敗するものも多少はあります。 テスト結果を確認するために以下を実行します。

../gcc-7.1.0/contrib/test_summary

テスト結果の概略のみ確認したい場合は、出力結果をパイプ出力して grep -A7 Summ を実行してください。

テストに失敗することがありますが、これを回避することはできません。 GCC の開発者はこの問題を認識していますが、まだ解決していない状況です。

パッケージをインストールします。

make install

FHS に準拠するためリンクを作成します。

ln -sv ../usr/bin/cpp /lib

最後に誤ったディレクトリにあるファイルを移動します。

mv -v /usr/lib/libstdc++*gdb.py /usr/share/gdb/auto-load/usr/lib
mv -v /usr/lib64/libstdc++*gdb.py /usr/share/gdb/auto-load/usr/lib64

10.26.2. GCC の構成

インストールプログラム: c++, cc (gcc へのリンク), cpp, g++, gcc, gcov, gcov-tool
インストールライブラリ: libasan.[a,so], libatomic.[a,so], libcc1.so, libcilkrts.[a,so], libgcc.a, libgcc_eh.a, libgcc_s.so, libgcov.a, libgomp.[a,so], libiberty.a, libitm.[a,so], liblsan.[a,so], liblto_plugin.so, libquadmath.[a,so], libssp.[a,so], libssp_nonshared.a, libstdc++.[a,so], libsupc++.a, libtsan.[a,so], libubsan.[a,so], libvtv.[a,so]
インストールディレクトリ: /usr/include/[c++,libiberty], /usr/lib/gcc, /usr/share/gcc-7.1.0

概略説明

cc

C コンパイラー

cpp

C プリプロセッサー。 コンパイラーがこれを利用して、ソース内に記述された #include、#define や同じようなステートメントを展開します。

c++

C++ コンパイラー

g++

C++ コンパイラー

gcc

C コンパイラー

gcov

カバレッジテストツール。 プログラムを解析して、最適化が最も効果的となるのはどこかを特定します。

gcov-tool

gcda カウントを取り扱うオフラインツール。

libasan

アドレスサニタイザー (Address Sanitizer) のランタイムライブラリ。

libatomic

ハードウェアではサポートされないアトミック操作 (atomic operations) のために GCC がサポートするランタイムライブラリ。

libcc1

API を RPC コールに変換します。

libcilkrts

Intel® Cilk™ Plus ランタイムライブラリ。

libgcc

gcc のランタイムサポートを提供します。

libgcov

gcc のプロファイリングを有効にした場合にこのライブラリがリンクされます。

libgomp

C/C++ や Fortran においてマルチプラットフォームでの共有メモリ並行プログラミング (multi-platform shared-memory parallel programming) を行うための GNU による OpenMP API インプリメンテーションです。

libiberty

以下に示すような数多くの GNU プログラムが利用する処理ルーチンを提供します。 getoptobstackstrerrorstrtolstrtoul

libitm

GNU トランザクショナルメモリ (GNU Transactional Memory) ライブラリ。 これはプロセスのメモリ上へのトランザクションを考慮したサポートを行います。

liblsan

Leak Sanitizer ランタイムライブラリ。

liblto_plugin

GCC のリンク時における最適化プラグインのためのランタイムライブラリ。

libquadmath

GCC の4倍精度数値演算 (Quad Precision Math) ライブラリ API

libssp

GCC のスタック破壊を防止する (stack-smashing protection) 機能をサポートするルーチンを提供します。

libstdc++

標準 C++ ライブラリ

libsupc++

C++ プログラミング言語のためのサポートルーチンを提供します。

libtsan

スレッドサニタイザー (Thread Sanitizer) のランタイムライブラリ。

libubsan

Undefined Behavior Sanitizer ランタイムライブラリ。

libvtv

Virtual Table Verification ランタイムライブラリ。

10.27. Multiarch Wrapper の生成

Multiarch Wrapper は、ライブラリへのパス名がハードコーディングされていたりアーキテクチャー固有であるなど特定の実行モジュールをラップ (wrap) するためのものです。

10.27.1. Multiarch Wrapper のインストール

ソースファイルを生成します。

cat > multiarch_wrapper.c << "EOF"
#define _GNU_SOURCE

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

#ifndef DEF_SUFFIX
#  define DEF_SUFFIX "64"
#endif

int main(int argc, char **argv)
{
  char *filename;
  char *suffix;

  if(!(suffix = getenv("USE_ARCH")))
    if(!(suffix = getenv("BUILDENV")))
      suffix = DEF_SUFFIX;

  if (asprintf(&filename, "%s-%s", argv[0], suffix) < 0) {
    perror(argv[0]);
    return -1;
  }

  int status = EXIT_FAILURE;
  pid_t pid = fork();

  if (pid == 0) {
    execvp(filename, argv);
    perror(filename);
  } else if (pid < 0) {
    perror(argv[0]);
  } else {
    if (waitpid(pid, &status, 0) != pid) {
      status = EXIT_FAILURE;
      perror(argv[0]);
    } else {
      status = WEXITSTATUS(status);
    }
  }

  free(filename);

  return status;
}

EOF

Multiarch Wrapper をコンパイルしインストールします。

gcc ${BUILD64} multiarch_wrapper.c -o /usr/bin/multiarch_wrapper

Multiarch Wrapper はこの後、本書内の Perl の手順において利用していくことになります。 またこれは CLFS システム以外であっても便利なものです。

テストケースを作成します。

echo 'echo "32bit Version"' > test-32
echo 'echo "64bit Version"' > test-64
chmod -v 755 test-32 test-64
ln -sv /usr/bin/multiarch_wrapper test

Wrapper のテストを行います。

USE_ARCH=32 ./test
USE_ARCH=64 ./test

上記コマンドの出力結果は以下となるはずです。

32bit Version
64bit Version

テストケースのソース、実行モジュール、リンクを削除します。

rm -v multiarch_wrapper.c test{,-32,-64}

10.27.2. Multiarch Wrapper の構成

インストールプログラム: multiarch_wrapper

概略説明

multiarch_wrapper

環境変数 USE_ARCH に基づいて異なるプログラムを実行するものです。 USE_ARCH 変数は実行するプログラムのサフィックスとして利用されます。

10.28. Attr-2.4.47 32ビットライブラリ

Attr は POSIX.1e (旧 POSIX 6) draft 15 の機能を取得設定するライブラリです。

10.28.1. Attr のインストール

以下のように sed コマンドを実行します。 10.6.「Man-pages-4.09」 パッケージによりインストール済の man ページをインストールしないようにするものです。

sed -i -e "/SUBDIRS/s|man[25]||g" man/Makefile

以下の sed コマンドを実行して、ドキュメントをバージョンつきのディレクトリにインストールするようにします。

sed -i -e 's|/@pkg_name@|&-@pkg_version@|' include/builddefs.in

Attr をコンパイルするための準備をします。

CC="gcc ${BUILD32}" \
./configure \
    --prefix=/usr \
    --libdir=/lib \
    --libexecdir=/usr/lib

パッケージをコンパイルします。

make

テストは拡張属性 (extended attributes) をサポートするファイルシステム上にて実行する必要があります。 テストを実施するには以下を実行します。

make -j1 tests root-tests

パッケージをインストールします。

make install install-dev install-lib

/usr/lib にあるシンボリックリンクを再生成し /lib にある共有リンクは削除します。

ln -sfv ../../lib/$(readlink /lib/libattr.so) /usr/lib/libattr.so
rm -v /lib/libattr.so

共有ライブラリに対して適切なパーミッションを設定します。

chmod 755 -v /lib/libattr.so.1.1.0

本パッケージの詳細は 10.29.2.「Attr の構成」を参照してください。

10.29. Attr-2.4.47 64ビット

Attr は POSIX.1e (旧 POSIX 6) draft 15 の機能を取得設定するライブラリです。

10.29.1. Attr のインストール

以下のように sed コマンドを実行します。 10.6.「Man-pages-4.09」 パッケージによりインストール済の man ページをインストールしないようにするものです。

sed -i -e "/SUBDIRS/s|man[25]||g" man/Makefile

以下の sed コマンドを実行して、ドキュメントをバージョンつきのディレクトリにインストールするようにします。

sed -i -e 's|/@pkg_name@|&-@pkg_version@|' include/builddefs.in

Attr をコンパイルするための準備をします。

CC="gcc ${BUILD64}" \
./configure \
    --prefix=/usr \
    --libdir=/lib64 \
    --libexecdir=/usr/lib64

パッケージをコンパイルします。

make

テストは拡張属性 (extended attributes) をサポートするファイルシステム上にて実行する必要があります。 テストを実施するには以下を実行します。

make -j1 tests root-tests

パッケージをインストールします。

make install install-dev install-lib

/usr/lib64 にあるシンボリックリンクを再生成し /lib64 にある共有リンクは削除します。

ln -sfv ../../lib64/$(readlink /lib64/libattr.so) /usr/lib64/libattr.so
rm -v /lib64/libattr.so

共有ライブラリに対して適切なパーミッションを設定します。

chmod 755 -v /lib64/libattr.so.1.1.0

10.29.2. Attr の構成

インストールプログラム: attr, getfattr, setfattr
インストールライブラリ: libattr.[a,so]
インストールディレクトリ: /usr/include/attr, /usr/share/doc/attr-2.4.47

概略説明

attr

ファイルシステム上のオブジェクトに対して属性を拡張します。

getfattr

ファイルシステム上のオブジェクトに対して拡張属性の情報を取得します。

setfattr

ファイルシステム上のオブジェクトに対して拡張属性の情報を設定します。

libattr

拡張属性を制御するライブラリ関数を提供します。

10.30. Acl-2.2.52 32ビットライブラリ

Acl パッケージは POSIX アクセスコントロールリスト (POSIX Access Control Lists) を取得、設定するライブラリを提供します。

10.30.1. Acl のインストール

以下の sed コマンドを実行して、ドキュメントを収容するディレクトリ名にバージョンをつけるようにします。

sed -i -e 's|/@pkg_name@|&-@pkg_version@|' include/builddefs.in

以下の sed コマンドによりテストの不備を修正します。

sed -i "s:| sed.*::g" test/{sbits-restore,cp,misc}.test

Aclをコンパイルするための準備をします。

CC="gcc ${BUILD32}" \
./configure \
    --prefix=/usr \
    --libdir=/lib \
    --libexecdir=/usr/lib

パッケージをコンパイルします。

make

Acl のテストは Acl のライブラリによって Coreutils をビルドした後に、アクセス制御がサポートされたファイルシステム上にて実施する必要があります。 テストを実施する場合は Coreutils のビルドが終わってから本節に戻り以下を実行します。

make tests

パッケージをインストールします。

make install install-dev install-lib

/usr/lib にあるシンボリックリンクを再生成します。 また /lib から共有リンクを削除します。

ln -sfv ../../lib/$(readlink /lib/libacl.so) /usr/lib/libacl.so
rm -v /lib/libacl.so

共有ライブラリに対するパーミッションを適切に設定します。

chmod 755 -v /lib/libacl.so.1.1.0

本パッケージの詳細は 10.31.2.「Acl の構成」を参照してください。

10.31. Acl-2.2.52 64ビット

Acl パッケージは POSIX アクセスコントロールリスト (POSIX Access Control Lists) を取得、設定するライブラリを提供します。

10.31.1. Acl のインストール

以下の sed コマンドを実行して、ドキュメントを収容するディレクトリ名にバージョンをつけるようにします。

sed -i -e 's|/@pkg_name@|&-@pkg_version@|' include/builddefs.in

以下の sed コマンドによりテストの不備を修正します。

sed -i "s:| sed.*::g" test/{sbits-restore,cp,misc}.test

Aclをコンパイルするための準備をします。

CC="gcc ${BUILD64}" \
./configure \
    --prefix=/usr \
    --libdir=/lib64 \
    --libexecdir=/usr/lib64

パッケージをコンパイルします。

make

Acl のテストは Acl のライブラリによって Coreutils をビルドした後に、アクセス制御がサポートされたファイルシステム上にて実施する必要があります。 テストを実施する場合は Coreutils のビルドが終わってから本節に戻り以下を実行します。

make tests

パッケージをインストールします。

make install install-dev install-lib

/usr/lib64 にあるシンボリックリンクを再生成します。 また /lib64 から共有リンクを削除します。

ln -sfv ../../lib64/$(readlink /lib64/libacl.so) /usr/lib64/libacl.so
rm -v /lib64/libacl.so

共有ライブラリに対するパーミッションを適切に設定します。

chmod 755 -v /lib64/libacl.so.1.1.0

10.31.2. Acl の構成

インストールプログラム: chacl, getfacl, setfacl
インストールライブラリ: libattr.[a,so]
インストールディレクトリ: /usr/include/acl, /usr/share/doc/acl-2.2.52

概略説明

chacl

ファイルまたはディレクトリに対するアクセスコントロールリストを設定します。

getfacl

ファイルアクセスコントロールリストを取得します。

setfacl

ファイルアクセスコントロールリストを設定します。

libacl

アクセスコントロールリストを制御するライブラリを提供します。

10.32. Libcap-2.25 32ビットライブラリ

Libcap は POSIX.1e (旧 POSIX 6) draft 15 に基づく情報を取得、設定するライブラリです。

10.32.1. Libcap のインストール

パッケージをコンパイルします。

make CC="gcc ${BUILD32}"

このパッケージにテストスイートはありません。

パッケージをインストールします。

make RAISE_SETFCAP=no lib=lib install
chmod -v 755 /lib/libcap.so.2.25
ln -sfv ../../lib/$(readlink /lib/libcap.so) /usr/lib/libcap.so
rm -v /lib/libcap.so
mv -v /lib/libcap.a /usr/lib

make オプションの意味

RAISE_SETFCAP=no

このパラメーターは setcap が自分を利用しないようにします。 このことにより、カーネルやファイルシステムが拡張属性をサポートしていなくてもエラーが発生しないようにします。

本パッケージの詳細は 10.33.2.「Libcap の構成」を参照してください。

10.33. Libcap-2.25 64ビット

Libcap は POSIX.1e (旧 POSIX 6) draft 15 に基づく情報を取得、設定するライブラリです。

10.33.1. Libcap のインストール

パッケージをコンパイルします。

make CC="gcc ${BUILD64}"

このパッケージにテストスイートはありません。

パッケージをインストールします。

make lib=lib64 install
chmod -v 755 /lib64/libcap.so.2.25
ln -sfv ../../lib64/$(readlink /lib64/libcap.so) /usr/lib64/libcap.so
rm -v /lib64/libcap.so
mv -v /lib64/libcap.a /usr/lib64

10.33.2. Libcap の構成

インストールプログラム: capsh, getcap, getpcaps, setcap
インストールライブラリ: libcap.[a,so]

概略説明

capsh

ファイルの拡張属性を確認、制御します。

getcap

ファイルの拡張属性を検査します。

getpcaps

指定されたプロセスの拡張属性を表示します。

setcap

拡張属性を設定します。

libcap

POSIX 1003.1e 拡張属性を設定したりクリアしたりするライブラリを提供します。

10.34. Sed-4.4

Sed パッケージはストリームエディターを提供します。

10.34.1. Sed のインストール

Sed をコンパイルするための準備をします。

CC="gcc ${BUILD64}" ./configure \
    --prefix=/usr \
    --bindir=/bin \
    --docdir=/usr/share/doc/sed-4.4

パッケージをコンパイルします。

make

HTML ドキュメントをビルドします。

make html

ビルド結果をテストする場合は以下を実行します。

make check

パッケージをインストールします。

make install

HTML ドキュメントをインストールします。

make install-html-am

10.34.2. Sed の構成

インストールプログラム: sed
インストールディレクトリ: /usr/share/doc/sed-4.4

概略説明

sed

テキストファイルを一度の処理でフィルタリングし変換します。

10.35. Pkg-config-lite-0.28-1

Pkg-config-lite は、アプリケーションやライブラリをビルドする際のコンパイラーオプションをコマンドライン上にて提供するツールです。

10.35.1. Pkg-config-lite のインストール

Pkg-config-lite をコンパイルするための準備をします。

CC="gcc ${BUILD64}" ./configure \
    --prefix=/usr \
    --docdir=/usr/share/doc/pkg-config-0.28-1 \
    --with-pc-path=/usr/share/pkgconfig

パッケージをコンパイルします。

make

ビルド結果をテストする場合は以下を実行します。

make check

パッケージをインストールします。

make install

マルチライブラリのビルドでは pkg-config のデフォルトの検索パスからライブラリディレクトリが取り除かれます。 今後のことを考えて検索パスをセットした環境変数を設定します。

export PKG_CONFIG_PATH32="/usr/lib/pkgconfig"
export PKG_CONFIG_PATH64="/usr/lib64/pkgconfig"

今後の作業で問題を生じさせないように変数をエクスポートします。

cat >> /root/.bash_profile << EOF
export PKG_CONFIG_PATH32="${PKG_CONFIG_PATH32}"
export PKG_CONFIG_PATH64="${PKG_CONFIG_PATH64}"
EOF

10.35.2. Pkg-config-lite の構成

インストールプログラム: pkg-config
インストールディレクトリ: /usr/share/doc/pkg-config-0.28-1

概略説明

pkg-config

pkg-config プログラムは、システム内にインストールされたライブラリの情報を提供します。 特に複数のライブラリを用いてコンパイルおよびリンクを行う場合に用いられます。

10.36. Ncurses-6.0 32ビットライブラリ

Ncurses パッケージは、端末に依存しない、文字ベースのスクリーン制御を行うライブラリを提供します。

10.36.1. Ncurses のインストール

Ncurses をコンパイルするための準備をします。

CC="gcc ${BUILD32}" CXX="g++ ${BUILD32}" \
./configure \
    --prefix=/usr \
    --libdir=/usr/lib \
    --with-shared \
    --without-debug \
    --enable-widec \
    --enable-pc-files

configure オプションの意味

--enable-pc-files

pkg-config 用の .pc ファイルを生成しインストールすることを指示します。

パッケージをコンパイルします。

make

このパッケージにはテストスイートがありますが、インストールした後に実行しなければなりません。 テストスイートのためのファイル群はサブディレクトリ test/ 以下にあります。 詳しくはそのディレクトリ内にある README ファイルを参照してください。

パッケージをインストールします。

make install

ncursesw6-config を Multiarch Wrapper によってラップするための準備をします。

mv -v /usr/bin/ncursesw6-config{,-32}

共有ライブラリ libncursesw/lib に移動します。 そして /usr/lib に新たなシンボリックリンクを生成します。

mv -v /usr/lib/libncursesw.so.* /lib
ln -svf ../../lib/$(readlink /usr/lib/libncursesw.so) /usr/lib/libncursesw.so

Ncurses を利用する各種パッケージではワイド文字に対してもうまく動作するように作られています。 しかし対応するライブラリを見つけられない場合があります。 そこでリンカースクリプトとシンボリックリンクを作成して、かつての古いワイド文字非対応のプログラムでも正常にビルドができるようにします。

for lib in ncurses form panel menu ; do
        echo "INPUT(-l${lib}w)" > /usr/lib/lib${lib}.so
        ln -sfv lib${lib}w.a /usr/lib/lib${lib}.a
done
ln -sfv libncurses++w.a /usr/lib/libncurses++.a
ln -sfv ncursesw6-config-32 /usr/bin/ncurses6-config-32

本パッケージの詳細は 10.37.2.「Ncurses の構成」を参照してください。

10.37. Ncurses-6.0 64ビット

Ncurses パッケージは、端末に依存しない、文字ベースのスクリーン制御を行うライブラリを提供します。

10.37.1. Ncurses のインストール

Ncurses をコンパイルするための準備をします。

PKG_CONFIG_PATH=${PKG_CONFIG_PATH64} \
CC="gcc ${BUILD64}" CXX="g++ ${BUILD64}" ./configure \
    --prefix=/usr \
    --libdir=/usr/lib64 \
    --with-shared \
    --without-debug \
    --enable-widec \
    --enable-pc-files \
    --with-pkg-config-libdir=/usr/lib64/pkgconfig

パッケージをコンパイルします。

make

このパッケージにはテストスイートがありますが、インストールした後に実行しなければなりません。 テストスイートのためのファイル群はサブディレクトリ test/ 以下にあります。 詳しくはそのディレクトリ内にある README ファイルを参照してください。

パッケージをインストールします。

make install

Multiarch Wrapper により ncursesw6-configをラップする準備をします。

mv -v /usr/bin/ncursesw6-config{,-64}
ln -svf multiarch_wrapper /usr/bin/ncursesw6-config

共有ライブラリ libncursesw/lib64 に移動します。 そして /usr/lib64 に新たなシンボリックリンクを生成します。

mv -v /usr/lib64/libncursesw.so.* /lib64
ln -svf ../../lib64/$(readlink /usr/lib64/libncursesw.so) /usr/lib64/libncursesw.so

Ncurses を利用する各種パッケージではワイド文字に対してもうまく動作するように作られています。 しかし対応するライブラリを見つけられない場合があります。 そこでリンカースクリプトとシンボリックリンクを作成して、かつての古いワイド文字非対応のプログラムでも正常にビルドができるようにします。

for lib in ncurses form panel menu ; do
        echo "INPUT(-l${lib}w)" > /usr/lib64/lib${lib}.so
        ln -sfv lib${lib}w.a /usr/lib64/lib${lib}.a
done
ln -sfv libncurses++w.a /usr/lib64/libncurses++.a
ln -sfv ncursesw6-config-64 /usr/bin/ncurses6-config-64
ln -sfv ncursesw6-config /usr/bin/ncurses6-config

10.37.2. Ncurses の構成

インストールプログラム: captoinfo (tic へのリンク), clear, infocmp, infotocap (tic へのリンク), ncursesw6-config, reset (tset へのリンク), tabs, tic, toe, tput, tset
インストールライブラリ: libcursesw.so (libncursesw.so へのリンク), libformw.[a,so], libmenuw.[a,so], libncurses++w.a, libncursesw.[a,so], libpanelw.[a,so]
インストールディレクトリ: /usr/share/tabset, /usr/share/terminfo

概略説明

captoinfo

termcap の記述を terminfo の記述に変換します。

clear

画面消去が可能ならこれを行います。

infocmp

terminfo の記述どうしを比較したり出力したりします。

infotocap

terminfo の記述を termcap の記述に変換します。

ncursesw6-config

ncurses の設定情報を提供します。

reset

端末をデフォルト設定に初期化します。

tabs

端末上のタブストップの設定をクリアしたり設定したりします。

tic

terminfo の定義項目に対するコンパイラーです。 これはソース形式の terminfo ファイルをバイナリ形式に変換し、ncurses ライブラリ内の処理ルーチンが利用できるようにします。 terminfo ファイルは特定端末の特性に関する情報が記述されるものです。

toe

利用可能なすべての端末タイプを一覧表示します。 そこでは端末名と簡単な説明を示します。

tput

端末に依存する機能設定をシェルが利用できるようにします。 また端末のリセットや初期化、あるいは長い端末名称の表示も行います。

tset

端末の初期化に利用します。

libcursesw

libncursesw へのリンク。

libncursesw

さまざまな方法により端末画面上に文字列を表示するための関数を提供します。 これらの関数を用いた具体例として、カーネルの make menuconfig の実行によって表示されるメニューがあります。

libformw

フォームを実装するための関数を提供します。

libmenuw

メニューを実装するための関数を提供します。

libpanelw

パネルを実装するための関数を提供します。

10.38. Shadow-4.5

Shadow パッケージはセキュアなパスワード管理を行うプログラムを提供します。

10.38.1. Shadow のインストール

注記

もっと強力なパスワードを利用したい場合は http://cblfs.clfs.org/index.php/Cracklib にて示している Cracklib パッケージを参照してください。 Cracklib パッケージは Shadow パッケージよりも前にインストールします。 Cracklib をインストールしたら、Shadow のソースディレクトリに入って以下の sed を実行してください。 これは Cracklib 辞書へのパスを適切にするものです。

sed -i 's@\(DICTPATH.\).*@\1/lib/cracklib/pw_dict@' etc/login.defs

そしてこの後に実行する configure コマンドに --with-libcrack を加えてください。

groups プログラムとその man ページはインストールしないようにします。 これはより良い版が Coreutils、Util-linux、Man-pages により提供されているからです。

sed -i src/Makefile.in \
  -e 's/groups$(EXEEXT) //'
find man -name Makefile.in -exec sed -i \
  -e 's/man1\/groups\.1 //' \
  -e 's/man3\/getspnam\.3 //' \
  -e 's/man5\/passwd\.5 //' '{}' \;

Shadow をコンパイルするための準備をします。

CC="gcc ${BUILD64}" ./configure \
    --sysconfdir=/etc \
    --with-group-name-max-length=32

configure オプションの意味

--sysconfdir=/etc

Shadow の設定ファイルのインストール先を /usr/etc ではなく /etc とします。

--with-group-max-length=32

ユーザー名の最大桁数を32文字とします。 グループ名も同様とします。

パッケージをコンパイルします。

make

このパッケージにテストスイートはありません。

パッケージをインストールします。

make install

パスワード暗号化に関して、デフォルトの DES 手法ではなく、より強力な SHA512 手法を用いることにします。 こうしておくと 8文字以上のパスワード入力が可能となります。 またメールボックスを収めるディレクトリとして Shadow ではデフォルトで /var/spool/mail ディレクトリを利用していますが、これは古いものであるため /var/mail ディレクトリに変更します。 以下の sed コマンドを実行して設定ファイルへの変更を行います。

sed -i /etc/login.defs \
    -e 's@#\(ENCRYPT_METHOD \).*@\1SHA512@' \
    -e 's@/var/spool/mail@/var/mail@'

誤ったディレクトリにあるファイルを移動します。

mv -v /usr/bin/passwd /bin

The login program will write to /var/log/faillog, to record failed login attempts, and /var/log/lastlog, to record the date and time of the latest successful login for each user. These log files are not created automatically if they do not already exist, so we will create them now and give them appropriate ownership and permissions:

touch /var/log/{fail,last}log
chgrp -v utmp /var/log/{fail,last}log
chmod -v 664 /var/log/{fail,last}log

10.38.2. Shadow の設定

このパッケージには、ユーザーやグループの追加、修正、削除、そのパスワードの設定、変更、その他の管理操作を行うユーティリティが含まれます。 パスワードのシャドウイング (password shadowing) というものが何を意味するのか、その詳細についてはこのパッケージのソース内にある doc/HOWTO を参照してください。 Shadow によるサポートを利用する場合、パスワード認証を必要とするプログラム (ディスプレイマネージャー、FTP プログラム、POP3、デーモン、など) は Shadow に準拠したものでなければなりません。 つまりそれらのプログラムが、シャドウ化された (shadowed) パスワードを受け入れて動作しなければならないということです。

Shadow によるパスワードの利用を有効にするために、以下のコマンドを実行します。

pwconv

また Shadow によるグループパスワードを有効にするために、以下を実行します。

grpconv

新たに生成するユーザーアカウントに対してのデフォルト設定を確認したり変更したりする場合は /etc/default/useradd ファイルを使います。 詳しくは man useradd または http://cblfs.clfs.org/index.php/Configuring_for_Adding_Users を参照してください。

10.38.3. root パスワードの設定

以下のコマンドを実行して root ユーザーに対するパスワードを設定します。

passwd root

10.38.4. Shadow の構成

インストールプログラム: chage, chfn, chgpasswd, chpasswd, chsh, expiry, faillog, gpasswd, groupadd, groupdel, groupmems, groupmod, grpck, grpconv, grpunconv, lastlog, login, logoutd, newgrp, newusers, nologin, passwd, pwck, pwconv, pwunconv, sg (newgrp へのリンク), su, useradd, userdel, usermod, vigr (vipw へのリンク), vipw
インストールディレクトリ: /etc/default

概略説明

chage

ユーザーのパスワード変更を行うべき期間を変更します。

chfn

ユーザーのフルネームや他の情報を変更します。

chgpasswd

グループのパスワードをバッチモードにて更新します。

chpasswd

複数ユーザーのパスワードを更新します。

chsh

ユーザーのデフォルトのログインシェルを変更します。

expiry

現時点でのパスワード失効に関する設定をチェックし更新します。

faillog

ログイン失敗のログを調査します。 ログインの失敗を繰り返すことでアカウントがロックされる際の、最大の失敗回数を設定します。 またその失敗回数をリセットします。

gpasswd

グループに対してメンバーや管理者を追加、削除します。

groupadd

指定した名前でグループを生成します。

groupdel

指定された名前のグループを削除します。

groupmems

スーパーユーザー権限を持たなくても、自分自身のグループのメンバーリストを管理可能とします。

groupmod

指定されたグループの名前や GID を修正します。

grpck

グループファイル /etc/group/etc/gshadow の整合性を確認します。

grpconv

通常のグループファイルから Shadow グループファイルを生成、更新します。

grpunconv

/etc/gshadow ファイルを元に /etc/group ファイルを更新し /etc/gshadow ファイルを削除します。

lastlog

全ユーザーの中での最新ログインの情報、または指定ユーザーの最新ログインの情報を表示します。

login

ユーザーのログインを行います。

logoutd

ログオン時間とポートに対する制限を実施するためのデーモン。

newgrp

ログインセッション中に現在の GID を変更します。

newusers

複数ユーザーのアカウント情報を生成または更新します。

nologin

ユーザーアカウントが利用不能であることをメッセージ表示します。 利用不能なユーザーアカウントに対するデフォルトシェルとして利用することを意図しています。

passwd

ユーザーアカウントまたはグループアカウントに対するパスワードを変更します。

pwck

パスワードファイル /etc/passwd/etc/shadow の整合性を確認します。

pwconv

通常のパスワードファイルを元に shadow パスワードファイルを生成、更新します。

pwunconv

/etc/shadow ファイルを元に /etc/passwd ファイルを更新し /etc/shadow を削除します。

sg

ユーザーの GID を指定されたグループにセットした上で、指定されたコマンドを実行します。

su

ユーザー ID とグループ ID を変更してシェルを実行します。

useradd

指定した名前で新たなユーザーを生成します。 あるいは新規ユーザーのデフォルトの情報を更新します。

userdel

指定されたユーザーアカウントを削除します。

usermod

指定されたユーザーのログイン名、UID (User Identification)、利用シェル、初期グループ、ホームディレクトリなどを変更します。

vigr

/etc/group ファイルあるいは /etc/gshadow ファイルを編集します。

vipw

/etc/passwd ファイルあるいは /etc/shadow ファイルを編集します。

10.39. Util-linux-2.29.2 32ビット

Util-linux パッケージはさまざまなユーティリティプログラムを提供します。 ファイルシステム、コンソール、パーティション、カーネルメッセージなどを取り扱うユーティリティです。

10.39.1. Util-linux のインストール

Util-linux をコンパイルするための準備をします。

CC="gcc ${BUILD32}" ./configure \
    ADJTIME_PATH=/var/lib/hwclock/adjtime \
    --libdir=/lib \
    --enable-write \
    --disable-chfn-chsh \
    --disable-login \
    --disable-nologin \
    --disable-su \
    --disable-setpriv \
    --disable-runuser \
    --docdir=/usr/share/doc/util-linux-2.29.2

configure オプションの意味

--enable-write

本オプションは write プログラムのインストールを指示します。

--disable-*

このオプションは種々のプログラムを無効にします。

パッケージをコンパイルします。

make

ビルド結果をテストする場合は以下を実行します。

chown -Rv nobody . &&
su nobody -s /bin/bash -c "PATH=$PATH make -k check"

パッケージをインストールします。

make install

本パッケージの詳細は 10.95.3.「Util-linux の構成」を参照してください。

10.40. Util-linux-2.29.2 64ビット 1回め

Util-linux パッケージはさまざまなユーティリティプログラムを提供します。 ファイルシステム、コンソール、パーティション、カーネルメッセージなどを取り扱うユーティリティです。

10.40.1. Util-linux 64ビット のインストール 1回め

Util-linux をコンパイルするための準備をします。

./configure ADJTIME_PATH=/var/lib/hwclock/adjtime \
    --libdir=/lib64 \
    --enable-write \
    --disable-chfn-chsh \
    --disable-login \
    --disable-nologin \
    --disable-su \
    --disable-setpriv \
    --disable-runuser \
    --docdir=/usr/share/doc/util-linux-2.29.2

configure オプションの意味

--enable-write

本オプションは write プログラムのインストールを指示します。

--disable-*

このオプションは種々のプログラムを無効にします。

パッケージをコンパイルします。

make

パッケージをインストールします。

make install

本パッケージの詳細は 10.95.3.「Util-linux の構成」を参照してください。

10.41. Procps-ng-3.3.12 32ビットライブラリ

Procps-ng パッケージはプロセス監視を行うプログラムを提供します。

10.41.1. Procps-ng のインストール

procps-ng をコンパイルするための準備をします。

CC="gcc ${BUILD32}" ./configure \
    --prefix=/usr \
    --exec-prefix= \
    --libdir=/usr/lib \
    --docdir=/usr/share/doc/procps-ng-3.3.12 \
    --disable-kill

configure オプションの意味

--disable-kill

本スイッチは kill コマンドをビルドしないようにします。 これよりも適切なものが Util-linux パッケージにてインストールされるからです。

パッケージをコンパイルします。

make

注記

再起動の方法をとっている場合は、ホスト名を定めていない場合にテストが二つ失敗します。 一時システムを起動した際にテストスイートを実行したい場合は以下のコマンドを実行します。

hostname clfs

テストスイートを実行する場合、tty デバイスを利用したにスクリプトがあるためテストが一つ失敗します。 そこでこれを無効にします。

sed -i -r 's|(pmap_initname)\\\$|\1|' testsuite/pmap.test/pmap.exp
make check

パッケージをインストールします。

make install

/usr ディレクトリをマウントしていない場合は、重要なファイルが見つからなくなるためそれらを移動させます。

mv -v /usr/lib/libprocps.so.* /lib
ln -sfv ../../lib/$(readlink /usr/lib/libprocps.so) /usr/lib/libprocps.so

本パッケージの詳細は 10.42.2.「Procps-ng の構成」を参照してください。

10.42. Procps-ng-3.3.12 64ビット

Procps-ng パッケージはプロセス監視を行うプログラムを提供します。

10.42.1. Procps-ng のインストール

procps-ng をコンパイルするための準備をします。

CC="gcc ${BUILD64}" ./configure \
    --prefix=/usr \
    --exec-prefix= \
    --libdir=/usr/lib64 \
    --docdir=/usr/share/doc/procps-ng-3.3.12 \
    --disable-kill

configure オプションの意味

--disable-kill

本スイッチは kill コマンドをビルドしないようにします。 これよりも適切なものが Util-linux パッケージにてインストールされるからです。

パッケージをコンパイルします。

make

テストスイートを実行する場合、tty デバイスを利用したにスクリプトがあるためテストが一つ失敗します。 そこでこれを無効にします。

sed -i -r 's|(pmap_initname)\\\$|\1|' testsuite/pmap.test/pmap.exp
make check

パッケージをインストールします。

make install

/usr ディレクトリをマウントしていない場合は、重要なファイルが見つからなくなるためそれらを移動させます。

mv -v /usr/lib64/libprocps.so.* /lib64
ln -sfv ../../lib64/$(readlink /usr/lib64/libprocps.so) /usr/lib64/libprocps.so

10.42.2. Procps-ng の構成

インストールプログラム: free, pgrep, pidof, pkill, pmap, ps, pwdx, slabtop, sysctl, tload, top, uptime, vmstat, w, watch
インストールライブラリ: libprocps.{a,so}
インストールディレクトリ: /usr/include/proc, /usr/share/doc/procps-ng-3.3.12

概略説明

free

物理メモリ、スワップメモリの双方において、メモリの使用量、未使用量を表示します。

pgrep

プロセスの名前などの属性によりプロセスを調べます。

pidof

指定されたプログラムの PID を表示します。

pkill

プロセスの名前などの属性によりプロセスに対してシグナルを送信します。

pmap

指定されたプロセスのメモリマップを表示します。

ps

現在実行中のプロセスを一覧表示します。

pwdx

プロセスが実行されているカレントディレクトリを表示します。

slabtop

リアルタイムにカーネルのスラブキャッシュ (slab cache) 情報を詳細に示します。

sysctl

システム稼動中にカーネル設定を修正します。

tload

システムの負荷平均 (load average) をグラフ化して表示します。

top

CPU をより多く利用しているプロセスの一覧を表示します。 これはリアルタイムにプロセッサーの動作状況を逐次表示します。

uptime

システムの稼動時間、ログインユーザー数、システム負荷平均 (load average) を表示します。

vmstat

仮想メモリの統計情報を表示します。 そこではプロセス、メモリ、ページング、ブロック入出力 (Input/Output; IO)、トラップ、CPU 使用状況を表示します。

w

どのユーザーがログインしていて、どこから、そしていつからログインしているかを表示します。

watch

指定されたコマンドを繰り返し実行します。 そしてその出力結果の先頭の一画面分を表示します。 出力結果が時間の経過とともにどのように変わるかを確認することができます。

libprocps

本パッケージのほとんどのプログラムが利用している関数を提供します。

10.43. E2fsprogs-1.43.4 32ビットライブラリ

E2fsprogs パッケージは ext2 ファイルシステムを取り扱うユーティリティーを提供します。 さらにジャーナリングファイルシステム ext3ext4 もサポートします。

10.43.1. E2fsprogs のインストール

E2fsprogs ドキュメントは、ソースディレクトリ内にサブディレクトリを作ってビルドすることを推奨しています。

mkdir -v build
cd build

E2fsprogs をコンパイルするための準備をします。

PKG_CONFIG_PATH="${PKG_CONFIG_PATH32}" \
CC="gcc ${BUILD32}" \
../configure \
    --prefix=/usr \
    --bindir=/bin \
    --with-root-prefix="" \
    --enable-elf-shlibs \
    --disable-libblkid \
    --disable-libuuid \
    --disable-fsck \
    --disable-uuidd

configure オプションの意味

--with-root-prefix=""

e2fsck などのプログラムは、極めて重要なものです。 例えば /usr ディレクトリがマウントされていない時であっても、そういったプログラムは動作しなければなりません。 それらは /lib ディレクトリや /sbin ディレクトリに置かれるべきものです。 もしこのオプションの指定がなかったら、プログラムが /usr ディレクトリにインストールされてしまいます。

--enable-elf-shlibs

このオプションは、本パッケージ内のプログラムが利用する共有ライブラリを生成します。

--disable-*

libuuid ライブラリ、libblkid ライブラリ、uuidd デーモン、fsck ラッパーをインストールしないようにします。 いずれも Util-Linux にてインストール済だからです。

ライブラリをコンパイルします。

make libs

スタティックライブラリとヘッダーファイルをインストールします。

make install-libs

本パッケージの詳細は 10.44.2.「E2fsprogs の構成」を参照してください。

10.44. E2fsprogs-1.43.4 64ビット

E2fsprogs パッケージは ext2 ファイルシステムを取り扱うユーティリティーを提供します。 さらにジャーナリングファイルシステム ext3ext4 もサポートします。

10.44.1. E2fsprogs のインストール

ライブラリのディレクトリを lib64 に変更します。

sed -i '/libdir.*=.*\/lib/s@/lib@/lib64@g' configure

E2fsprogs ドキュメントは、ソースディレクトリ内にサブディレクトリを作ってビルドすることを推奨しています。

mkdir -v build
cd build

E2fsprogs をコンパイルするための準備をします。

PKG_CONFIG_PATH="${PKG_CONFIG_PATH64}" \
CC="gcc ${BUILD64}" \
../configure \
    --prefix=/usr \
    --bindir=/bin \
    --with-root-prefix="" \
    --enable-elf-shlibs \
    --disable-libblkid \
    --disable-libuuid \
    --disable-fsck \
    --disable-uuidd

configure オプションの意味

--with-root-prefix=""

e2fsck などのプログラムは、極めて重要なものです。 例えば /usr ディレクトリがマウントされていない時であっても、そういったプログラムは動作しなければなりません。 それらは /lib ディレクトリや /sbin ディレクトリに置かれるべきものです。 もしこのオプションの指定がなかったら、プログラムが /usr ディレクトリにインストールされてしまいます。

--enable-elf-shlibs

このオプションは、本パッケージ内のプログラムが利用する共有ライブラリを生成します。

--disable-*

libuuid ライブラリ、libblkid ライブラリ、uuidd デーモン、fsck ラッパーをインストールしないようにします。 いずれも Util-Linux にてインストール済だからです。

パッケージをコンパイルします。

make

ビルド結果をテストする場合は以下を実行します。

make check

実行モジュール、ドキュメント、共有ライブラリをインストールします。

make install

スタティックライブラリとヘッダーファイルをインストールします。

make install-libs

10.44.2. E2fsprogs の構成

インストールプログラム: badblocks, chattr, compile_et, debugfs, dumpe2fs, e2freefrag, e2fsck, e2image, e2initrd_helper, e2label, e2undo, e4defrag, filefrag, fsck.ext2, fsck.ext3, fsck.ext4, fsck.ext4dev, logsave, lsattr, mk_cmds, mke2fs, mkfs.ext2, mkfs.ext3, mkfs.ext4, mkfs.ext4dev, mklost+found, resize2fs, tune2fs
インストールライブラリ: libcom_err.[a,so], libe2p.[a,so], libext2fs.[a,so], libss.[a,so], libquota.a
インストールディレクトリ: /usr/include/e2p, /usr/include/et, /usr/include/ext2fs, /usr/include/quota, /usr/include/ss, /usr/share/et, /usr/share/ss

概略説明

badblocks

デバイス (通常はディスクパーティション) の不良ブロックを検索します。

chattr

Linux ファイルシステムの属性を変更します。

compile_et

エラーテーブルコンパイラー。 これはエラーコード名とメッセージの一覧を、com_err ライブラリを利用する C ソースコードとして変換するものです。

debugfs

ファイルシステムデバッガー。 これは ext2 ファイルシステムの状態を調査し変更することができます。

dumpe2fs

指定されたデバイス上にあるファイルシステムについて、スーパーブロックの情報とブロックグループの情報を表示します。

e2freefrag

フリースペースのフラグメント情報を表示します。

e2fsck

ext2ext3ext4 の各ファイルシステムをチェックし、必要なら修復を行うことができます。

e2image

ext2 ファイルシステムの重要なデータをファイルに保存します。

e2initrd_helper

指定されたファイルシステムとデバイス名あるいはラベルのFSタイプを表示します。

e2label

指定されたデバイス上にある ext2 ファイルシステムのラベルを表示または変更します。

e2undo

ext2/ext3/ext4 ファイルシステムの undo ログを再実行します。

e4defrag

ext4 ファイルシステムにたいするオンラインのデフラグプログラム。

filefrag

特定のファイルがどのようにデフラグ化しているかを表示します。

fsck.ext2

デフォルトでは ext2 ファイルシステムをチェックします。

fsck.ext3

デフォルトでは ext3 ファイルシステムをチェックします。

fsck.ext4

デフォルトでは ext4 ファイルシステムをチェックします。

fsck.ext4dev

デフォルトでは ext4 ファイルシステムの開発版をチェックします。

logsave

コマンドの出力結果をログファイルに保存します。

lsattr

ext2 ファイルシステム上のファイル属性を一覧表示します。

mk_cmds

コマンド名とヘルプメッセージの一覧を、サブシステムライブラリ libss を利用する C ソースコードとして変換するものです。

mke2fs

指定されたデバイス上に ext2ext3ext4 のいずれかのファイルシステムを生成します。

mkfs.ext2

デフォルトでは ext2 ファイルシステムを生成します。

mkfs.ext3

デフォルトでは ext3 ファイルシステムを生成します。

mkfs.ext4

デフォルトでは ext4 ファイルシステムを生成します。

mkfs.ext4dev

デフォルトでは ext4 ファイルシステム開発版を生成します。

mklost+found

ext2 ファイルシステム上に lost+found ディレクトリを作成します。 これはそのディレクトリ内にあらかじめディスクブロックを割り当てておくことにより e2fsck コマンド処理を軽減させます。

resize2fs

ext2 ファイルシステムを拡張または縮小するために利用します。

tune2fs

ext2 ファイルシステム上にて調整可能なシステムパラメーターを調整します。

libcom_err

共通的なエラー表示ルーチン。

libe2p

dumpe2fschattrlsattr の各コマンドが利用します。

libext2fs

ユーザーレベルのプログラムが ext2 ファイルシステムを操作可能とするためのルーチンを提供します。

libquota

quota ファイルや ext4 スーパーブロックフィールドを生成、更新するためのインターフェースを提供します。

libss

debugfs コマンドが利用します。

10.45. Coreutils-8.27

Coreutils パッケージはシステムの基本的な特性を表示したり設定したりするためのユーティリティを提供します。

10.45.1. Coreutils のインストール

本パッケージの uname プログラムには -p スイッチが常に unknown を返すという不具合があります。 以下のパッチを適用してアーキテクチャーによらない処理となるように修正します。

patch -Np1 -i ../coreutils-8.27-uname-1.patch

Coreutils をコンパイルするための準備をします。

FORCE_UNSAFE_CONFIGURE=1 \
CC="gcc ${BUILD64}" \
./configure \
    --prefix=/usr \
    --enable-no-install-program=kill,uptime \
    --enable-install-program=hostname

configure オプションの意味

FORCE_UNSAFE_CONFIGURE=1

この環境変数は root ユーザーによりパッケージをビルドできるようにします。

パッケージをコンパイルします。

make

ここからテストスイートを実施していきます。 まずは root ユーザーに対するテストを実行します。

make NON_ROOT_USERNAME=nobody check-root

ここからは nobody ユーザー向けのテストを実行します。 ただしテストの中には、複数のグループに属するユーザーを必要とするものがあります。 そのようなテストが確実に実施されるように、一時的なグループを作って nobody ユーザーがそれに属するようにします。

echo "dummy:x:1000:nobody" >> /etc/group

特定のファイルのパーミッションを変更して root ユーザー以外でもコンパイルとテストができるようにします。

chown -Rv nobody .

nobody ユーザーによりテストを実行します。

su nobody -s /bin/bash \
    -c "PATH=$PATH make RUN_EXPENSIVE_TESTS=yes -k check || true"

一時的に作成したグループを削除します。

sed -i '/dummy/d' /etc/group

パッケージをインストールします。

make install

FHS が規定しているディレクトリにプログラムを移します。

mv -v /usr/bin/{cat,chgrp,chmod,chown,cp,date} /bin
mv -v /usr/bin/{dd,df,echo,false,hostname,ln,ls,mkdir,mknod} /bin
mv -v /usr/bin/{mv,pwd,rm,rmdir,stty,true,uname} /bin
mv -v /usr/bin/chroot /usr/sbin

10.45.2. Coreutils の構成

インストールプログラム: [, base64, basename, cat, chcon, chgrp, chmod, chown, chroot, cksum, comm, cp, csplit, cut, date, dd, df, dir, dircolors, dirname, du, echo, env, expand, expr, factor, false, fmt, fold, groups, head, hostid, hostname, id, install, join, link, ln, logname, ls, md5sum, mkdir, mkfifo, mknod, mktemp, mv, nice, nl, nohup, nproc, numfmt, od, paste, pathchk, pinky, pr, printenv, printf, ptx, pwd, readlink, realpath, rm, rmdir, runcon, seq, sha1sum, sha224sum, sha256sum, sha384sum, sha512sum, shred, shuf, sleep, sort, split, stat, stdbuf, stty, sum, sync, tac, tail, tee, test, timeout, touch, tr, true, truncate, tsort, tty, uname, unexpand, uniq, unlink, users, vdir, wc, who, whoami, yes
インストールライブラリ: libstdbuf.so
インストールディレクトリ: /usr/lib/coreutils

概略説明

base64

Base64 のエンコード、出コードを行い標準出力へ出力します。

basename

ファイル名からパス部分と指定されたサフィックスを取り除きます。

cat

複数ファイルを連結して標準出力へ出力します。

chcon

ファイルやディレクトリに対してセキュリティコンテキスト (security context) を変更します。

chgrp

ファイルやディレクトリのグループ所有権を変更します。

chmod

指定されたファイルのパーミッションを指定されたモードに変更します。 モードは、変更内容を表す文字表現か8進数表現を用いることができます。

chown

ファイルやディレクトリの所有者またはグループを変更します。

chroot

指定したディレクトリを / ディレクトリとみなしてコマンドを実行します。

cksum

指定された複数ファイルについて、CRC (Cyclic Redundancy Check; 巡回冗長検査) チェックサム値とバイト数を表示します。

comm

ソート済の二つのファイルを比較して、一致しない固有の行と一致する行を三つのカラムに分けて出力します。

cp

ファイルをコピーします。

csplit

指定されたファイルを複数の新しいファイルに分割します。 分割は指定されたパターンか行数により行います。 そして分割後のファイルにはバイト数を出力します。

cut

指定されたフィールド位置や文字位置によってテキスト行を部分的に取り出します。

date

指定された書式により現在時刻を表示します。 またはシステム日付を設定します。

dd

指定されたブロックサイズとブロック数によりファイルをコピーします。 変換処理を行うことができます。

df

マウントされているすべてのファイルシステムに対して、ディスクの空き容量 (使用量) を表示します。 あるいは指定されたファイルを含んだファイルシステムについてのみの情報を表示します。

dir

指定されたディレクトリの内容を一覧表示します。(ls コマンドに同じ。)

dircolors

環境変数 LS_COLOR にセットするべきコマンドを出力します。 これは ls がカラー設定を行う際に利用します。

dirname

ファイル名からディレクトリ名以外のサフィックスを取り除きます。

du

カレントディレクトリ、指定ディレクトリ (サブディレクトリを含む)、指定された個々のファイルについて、それらが利用しているディスク使用量を表示します。

echo

指定された文字列を表示します。

env

環境設定を変更してコマンドを実行します。

expand

タブ文字を空白文字に変換します。

expr

表現式を評価します。

factor

指定された整数値すべてに対する素因数 (prime factor) を表示します。

false

何も行わず処理に失敗します。 これは常に失敗を意味するステータスコードを返して終了します。

fmt

指定されたファイル内にて段落を整形します。

fold

指定されたファイル内の行を折り返します。

groups

ユーザーの所属グループを表示します。

head

指定されたファイルの先頭10行 (あるいは指定された行数) を表示します。

hostid

ホスト識別番号 (16進数) を表示します。

hostname

ホスト名を表示します。

id

現在のユーザーあるいは指定されたユーザーについて、有効なユーザーID、グループID、所属グループを表示します。

install

ファイルコピーを行います。その際にパーミッションモードを設定し、可能なら所有者やグループも設定します。

join

2つのファイル内にて共通項を持つ行を結合します。

link

指定された名称によりファイルへのハードリンクを生成します。

ln

ファイルに対するハードリンク、あるいはソフトリンク (シンボリックリンク) を生成します。

logname

現在のユーザーのログイン名を表示します。

ls

指定されたディレクトリ内容を一覧表示します。

md5sum

MD5 (Message Digest 5) チェックサム値を表示、あるいはチェックします。

mkdir

指定された名前のディレクトリを生成します。

mkfifo

指定された名前の FIFO (First-In, First-Out) を生成します。 これは UNIX の用語で "名前付きパイプ (named pipe)" とも呼ばれます。

mknod

指定された名前のデバイスノードを生成します。 デバイスノードはキャラクター型特殊ファイル (character special file)、ブロック特殊ファイル (block special file)、FIFO です。

mktemp

安全に一時ファイルを生成します。 これはスクリプト内にて利用されます。

mv

ファイルあるいはディレクトリを移動、名称変更します。

nice

スケジューリング優先度を変更してプログラムを実行します。

nl

指定されたファイル内の行を数えます。

nohup

ハングアップに関係なくコマンドを実行します。 その出力はログファイルにリダイレクトされます。

nproc

プロセスが利用可能なプロセスユニット (processing unit) の数を表示します。

numfmt

記述された文字列と数値を互いに変換します。

od

ファイル内容を 8進数または他の書式でダンプします。

paste

指定された複数ファイルを結合します。 その際には各行を順に並べて結合し、その間をタブ文字で区切ります。

pathchk

ファイル名が有効で移植可能であるかをチェックします。

pinky

軽量な finger クライアント。 指定されたユーザーに関する情報を表示します。

pr

ファイルを印刷するために、ページ番号を振りカラム整形を行います。

printenv

環境変数の内容を表示します。

printf

指定された引数を指定された書式で表示します。 C 言語の printf 関数に似ています。

ptx

指定されたファイル内のキーワードに対して整列済インデックス (permuted index) を生成します。

pwd

現在の作業ディレクトリ名を表示します。

readlink

指定されたシンボリックリンクの対象を表示します。

realpath

解析されたパスを表示します。

rm

ファイルまたはディレクトリを削除します。

rmdir

ディレクトリが空である時にそのディレクトリを削除します。

runcon

指定されたセキュリティコンテキストでコマンドを実行します。

seq

指定された範囲と増分に従って数値の並びを表示します。

sha1sum

160 ビットの SHA1 (Secure Hash Algorithm 1) チェックサム値を表示またはチェックします。

sha224sum

SHA224 チェックサム値を表示またはチェックします。

sha256sum

SHA256 チェックサム値を表示またはチェックします。

sha384sum

SHA384 チェックサム値を表示またはチェックします。

sha512sum

SHA512 チェックサム値を表示またはチェックします。

shred

指定されたファイルに対して、複雑なパターンデータを繰り返し上書きすることで、データ復旧を困難なものにします。

shuf

入力行をランダムに取り出して標準出力またはファイルへ出力します。

sleep

指定時間だけ停止します。

sort

指定されたファイル内の行をソートします。

split

指定されたファイルを、バイト数または行数を指定して分割します。

stat

ファイルやファイルシステムのステータスを表示します。

stdbuf

標準ストリームのバッファリング操作を変更してコマンド実行します。

stty

端末回線の設定や表示を行います。

sum

指定されたファイルのチェックサムやブロック数を表示します。

sync

ファイルシステムのバッファを消去します。 変更のあったブロックは強制的にディスクに書き出し、スーパーブロック (super block) を更新します。

tac

指定されたファイルを逆順にして連結します。

tail

指定されたファイルの最終の10行 (あるいは指定された行数) を表示します。

tee

標準入力を読み込んで、標準出力と指定ファイルの双方に出力します。

test or [

ファイルタイプの比較やチェックを行います。

timeout

指定時間内だけコマンドを実行します。

touch

ファイルのタイムスタンプを更新します。 そのファイルに対するアクセス時刻、更新時刻を現在時刻にするものです。 そのファイルが存在しなかった場合はゼロバイトのファイルを新規生成します。

tr

標準入力から読み込んだ文字列に対して、変換、圧縮、削除を行います。

true

何も行わず処理に成功します。これは常に成功を意味するステータスコードを返して終了します。

truncate

ファイルを指定されたサイズに縮小または拡張します。

tsort

トポロジカルソート (topological sort) を行います。 指定されたファイルの部分的な順序に従って並び替えリストを出力します。

tty

標準入力に接続された端末のファイル名を表示します。

uname

システム情報を表示します。

unexpand

空白文字をタブ文字に変換します。

uniq

連続する同一行を一行のみ残して削除します。

unlink

指定されたファイルを削除します。

users

現在ログインしているユーザー名を表示します。

vdir

ls -l と同じ。

wc

指定されたファイルの行数、単語数、バイト数を表示します。 複数ファイルが指定された場合はこれに加えて合計も出力します。

who

誰がログインしているかを表示します。

whoami

現在有効なユーザーIDに関連づいているユーザー名を表示します。

yes

処理が停止されるまで繰り返して「y」または指定文字を出力します。

libstdbuf

stdbuf が利用するライブラリ。

10.46. Iana-Etc-2.30

Iana-Etc パッケージはネットワークサービスやプロトコルのためのデータを提供します。

10.46.1. Iana-Etc のインストール

以下のパッチには xml ファイルが含まれています。 これによりネットワークサービスやプロトコルファイルを更新します。

xzcat ../iana-etc-2.30-numbers_update-20140202-2.patch.xz | patch -Np1 -i -

以下のコマンドを実行します。 これは IANA が提供している生のデータを正しい書式のデータとして変換し /etc/protocols ファイルと /etc/services ファイルとして生成します。

make

このパッケージにテストスイートはありません。

パッケージをインストールします。

make install

10.46.2. Iana-Etcの構成

インストールファイル: /etc/protocols, /etc/services

概略説明

/etc/protocols

TCP/IP により利用可能なさまざまな DARPA インターネットプロトコル (DARPA Internet protocols) を記述しています。

/etc/services

インターネットサービスを分かりやすく表現した名称と、その割り当てポートおよびプロトコルの種類の対応情報を提供します。

10.47. Libtool-2.4.6 32ビットライブラリ

Libtool パッケージは GNU 汎用ライブラリをサポートするスクリプトを提供します。 これは複雑な共有ライブラリをラップして一貫した可搬性を実現します。

10.47.1. Libtool のインストール

以下のように config.cache ファイルに項目を加えてデフォルトの検索パスを設定します。 マルチライブラリを考慮しないようにするものです。

echo "lt_cv_sys_dlsearch_path='/lib /usr/lib /usr/local/lib /opt/lib'" > config.cache

Libtool をコンパイルするための準備をします。

CC="gcc ${BUILD32}" ./configure \
    --prefix=/usr \
    --cache-file=config.cache

パッケージをコンパイルします。

make

ビルド結果をテストする場合は make LDEMULATION=elf_i386 check を実行します。

make check におけるオーバーライドの意味

LDEMULATION=elf_i386

Libtool はマルチライブラリのビルド時に、特にデフォルトサイズを持たないアーキテクチャーである場合に正常処理されません。 エラーとなる原因はよく分かっていません。 エラーが出たり出なかったりして、結局は意味のない修正に向かってしまいます。 本書が今示す時点にて pdemo-make テストがリンクに失敗します。 これは32ビットモジュールを64ビットシステムのライブラリにリンクしようとするためです。 本オプションはエラーとなってしまうテストを成功させます。 その他のテストには影響を及ぼしません。 (ごく普通に行われる LD="gcc ${BUILD32}" の指定と比べてみると、この指定ではテストの成功率が格段に減ります。 あるいは LDFLAGS='-L/lib -L/usr/lib' を指定したとすると、今度は他のテストが失敗します。)

パッケージをインストールします。

make install

libtool を Multiarch Wrapper でラップするための用意をします。 Libtool 自体はマルチライブラリ対応ではありません。

mv -v /usr/bin/libtool{,-32}

本パッケージの詳細は 10.48.2.「Libtool の構成」を参照してください。

10.48. Libtool-2.4.6 64ビット

Libtool パッケージは GNU 汎用ライブラリをサポートするスクリプトを提供します。 これは複雑な共有ライブラリをラップして一貫した可搬性を実現します。

10.48.1. Libtool のインストール

以下のように config.cache ファイルに項目を加えてデフォルトの検索パスを設定します。 マルチライブラリを考慮しないようにするものです。

echo "lt_cv_sys_dlsearch_path='/lib64 /usr/lib64 /usr/local/lib64 /opt/lib64'" > config.cache

Libtool をコンパイルするための準備をします。

CC="gcc ${BUILD64}" ./configure \
    --prefix=/usr \
    --libdir=/usr/lib64 \
    --cache-file=config.cache

パッケージをコンパイルします。

make

ビルド結果をテストする場合は以下を実行します。

make check

パッケージをインストールします。

make install

libtool を Multiarch Wrapper でラップするための用意をします。 Libtool 自体はマルチライブラリ対応ではありません。

mv -v /usr/bin/libtool{,-64}
ln -sv multiarch_wrapper /usr/bin/libtool

10.48.2. Libtool の構成

インストールプログラム: libtool, libtoolize
インストールライブラリ: libltdl.[a,so]
インストールディレクトリ: /usr/include/libltdl, /usr/share/libtool

概略説明

libtool

汎用的なライブラリ構築支援サービスを提供します。

libtoolize

パッケージに対して libtool によるサポートを加える標準的手法を提供します。

libltdl

dlopen を行うライブラリの複雑さを隠蔽します。

10.49. IPRoute2-4.9.0

IPRoute2 パッケージは IPV4 ベースの基本的または応用的ネットワーク制御を行うプログラムを提供します。

10.49.1. IPRoute2 のインストール

Berkeley DB がインストールされていないため ARPD がインストールされません。 そこでインストール時での arpd プログラムへの参照を削除します。

sed -i '/ARPD/d' Makefile
sed -i 's/arpd.8//' man/man8/Makefile
sed -i '/tc-simple/s@tc-skbmod.8 @@' man/man8/Makefile
rm -v doc/arpd.sgml

パッケージをコンパイルします。

make CC="gcc ${BUILD64}" LIBDIR=/usr/lib64

このパッケージにテストスイートはありません。