Linux From Scratch

Version 6.6

製作： Gerard Beekmans

編集： Matthew Burgess 、Bruce Dubbs

日本語訳： 松山道夫 (20100302 版)

製作著作 (C) 1999-2010 Gerard Beekmans

Copyright (C) 1999-2010, Gerard Beekmans

All rights reserved.

本書は クリエイティブコモンズライセンス に従います。

本書のインストール手順のコマンドを抜き出したものは MIT ライセンス に従
ってください。

Linux (R) は Linus Torvalds の登録商標です。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

目次

 ・ 序文

     □ はしがき
     □ 対象読者
     □ LFS が対象とする CPU アーキテクチャ
     □ LFS と各種標準
     □ 各パッケージを用いる理由
     □ 必要な知識
     □ ホストシステム要件
     □ 本書の表記
     □ 本書の構成
     □ 正誤情報
     □ 日本語訳について
 ・ I. はじめに

     □ 1. はじめに

         ☆ LFS をどうやって作るか
         ☆ 前版からの変更点
         ☆ 変更履歴
         ☆ 変更履歴 (日本語版)
         ☆ 情報源
         ☆ ヘルプ
 ・ II. ビルド作業のための準備

     □ 2. 新しいパーティションの準備

         ☆ はじめに
         ☆ 新しいパーティションの生成
         ☆ ファイルシステムの生成
         ☆ 新しいパーティションのマウント
     □ 3. パッケージとパッチ

         ☆ はじめに
         ☆ 全パッケージ
         ☆ 必要なパッチ
     □ 4. 準備作業の仕上げ

         ☆ $LFSについて
         ☆ $LFS/tools ディレクトリの生成
         ☆ LFS ユーザーの追加
         ☆ 環境設定
         ☆ SBU 値について
         ☆ テストスイートについて
     □ 5. 一時的環境の構築

         ☆ はじめに
         ☆ ツールチェーンの技術的情報
         ☆ 全般的なコンパイル手順
         ☆ Binutils-2.20 - 1回め
         ☆ GCC-4.4.3 - 1回め
         ☆ Linux-2.6.32.8 API ヘッダ
         ☆ Glibc-2.11.1
         ☆ ツールチェーンの調整
         ☆ Binutils-2.20 - 2回め
         ☆ GCC-4.4.3 - 2回め
         ☆ Tcl-8.5.8
         ☆ Expect-5.43.0
         ☆ DejaGNU-1.4.4
         ☆ Ncurses-5.7
         ☆ Bash-4.1
         ☆ Bzip2-1.0.5
         ☆ Coreutils-8.4
         ☆ Diffutils-2.8.1
         ☆ Findutils-4.4.2
         ☆ Gawk-3.1.7
         ☆ Gettext-0.17
         ☆ Grep-2.5.4
         ☆ Gzip-1.4
         ☆ M4-1.4.13
         ☆ Make-3.81
         ☆ Patch-2.6.1
         ☆ Perl-5.10.1
         ☆ Sed-4.2.1
         ☆ Tar-1.22
         ☆ Texinfo-4.13a
         ☆ ストリップ
         ☆ 所有者の変更
 ・ III. LFSシステムの構築

     □ 6. 基本的なソフトウェアのインストール

         ☆ はじめに
         ☆ 仮想カーネルファイルシステムの準備
         ☆ パッケージ管理
         ☆ Chroot 環境への移行
         ☆ ディレクトリの生成
         ☆ 基本的なファイルとリンクの生成
         ☆ Linux-2.6.32.8 API ヘッダ
         ☆ Man-pages-3.23
         ☆ Glibc-2.11.1
         ☆ ツールチェーンの再調整
         ☆ Zlib-1.2.3
         ☆ Binutils-2.20
         ☆ GMP-5.0.0
         ☆ MPFR-2.4.2
         ☆ File-5.04
         ☆ GCC-4.4.3
         ☆ Sed-4.2.1
         ☆ Pkg-config-0.23
         ☆ Ncurses-5.7
         ☆ Util-linux-ng-2.17
         ☆ E2fsprogs-1.41.10
         ☆ Coreutils-8.4
         ☆ Iana-Etc-2.30
         ☆ M4-1.4.13
         ☆ Bison-2.4.1
         ☆ Procps-3.2.8
         ☆ Grep-2.5.4
         ☆ Readline-6.1
         ☆ Bash-4.1
         ☆ Libtool-2.2.6b
         ☆ GDBM-1.8.3
         ☆ Inetutils-1.7
         ☆ Perl-5.10.1
         ☆ Autoconf-2.65
         ☆ Automake-1.11.1
         ☆ Bzip2-1.0.5
         ☆ Diffutils-2.8.1
         ☆ Gawk-3.1.7
         ☆ Findutils-4.4.2
         ☆ Flex-2.5.35
         ☆ Gettext-0.17
         ☆ Groff-1.20.1
         ☆ GRUB-1.97.2
         ☆ Gzip-1.4
         ☆ IPRoute2-2.6.31
         ☆ Kbd-1.15.1
         ☆ Less-436
         ☆ Make-3.81
         ☆ Man-DB-2.5.6
         ☆ Module-Init-Tools-3.11.1
         ☆ Patch-2.6.1
         ☆ Psmisc-22.10
         ☆ Shadow-4.1.4.2
         ☆ Sysklogd-1.5
         ☆ Sysvinit-2.86
         ☆ Tar-1.22
         ☆ Texinfo-4.13a
         ☆ Udev-151
         ☆ Vim-7.2
         ☆ デバッグシンボルについて
         ☆ 再度のストリップ
         ☆ 仕切り直し
     □ 7. ブートスクリプトの設定

         ☆ はじめに
         ☆ LFS-ブートスクリプト-20100124
         ☆ ブートスクリプトはどのようにして動くのか
         ☆ Setclock スクリプトの設定
         ☆ Linux コンソールの設定
         ☆ Sysklogd スクリプトの設定
         ☆ /etc/inputrc ファイルの生成
         ☆ Bash シェルの初期起動ファイル
         ☆ LFS システムにおけるデバイスとモジュールの扱い
         ☆ デバイスへのシンボリックリンクの生成
         ☆ localnet スクリプトの設定
         ☆ /etc/hosts ファイルの設定
         ☆ ネットワークスクリプトの設定
     □ 8. LFS システムのブート設定

         ☆ はじめに
         ☆ /etc/fstab ファイルの生成
         ☆ Linux-2.6.32.8
         ☆ GRUB を用いたブートプロセスの設定
     □ 9. 作業終了

         ☆ 作業終了
         ☆ ユーザー登録
         ☆ システムの再起動
         ☆ 今度は何?
 ・ IV. 付録

     □ A. 略語と用語
     □ B. 謝辞
     □ C. パッケージの依存関係
     □ D. ブートスクリプトと sysconfig スクリプト version-20100124
         ☆ /etc/rc.d/init.d/rc
         ☆ /etc/rc.d/init.d/functions
         ☆ /etc/rc.d/init.d/mountkernfs
         ☆ /etc/rc.d/init.d/consolelog
         ☆ /etc/rc.d/init.d/modules
         ☆ /etc/rc.d/init.d/udev
         ☆ /etc/rc.d/init.d/swap
         ☆ /etc/rc.d/init.d/setclock
         ☆ /etc/rc.d/init.d/checkfs
         ☆ /etc/rc.d/init.d/mountfs
         ☆ /etc/rc.d/init.d/udev_retry
         ☆ /etc/rc.d/init.d/cleanfs
         ☆ /etc/rc.d/init.d/console
         ☆ /etc/rc.d/init.d/localnet
         ☆ /etc/rc.d/init.d/sysctl
         ☆ /etc/rc.d/init.d/sysklogd
         ☆ /etc/rc.d/init.d/network
         ☆ /etc/rc.d/init.d/sendsignals
         ☆ /etc/rc.d/init.d/reboot
         ☆ /etc/rc.d/init.d/halt
         ☆ /etc/rc.d/init.d/template
         ☆ /etc/sysconfig/rc
         ☆ /etc/sysconfig/modules
         ☆ /etc/sysconfig/createfiles
         ☆ /etc/sysconfig/network-devices/ifup
         ☆ /etc/sysconfig/network-devices/ifdown
         ☆ /etc/sysconfig/network-devices/services/ipv4-static
         ☆ /etc/sysconfig/network-devices/services/ipv4-static-route
     □ E. Udev 設定ルール
         ☆ 55-lfs.rules
     □ F. LFS ライセンス
         ☆ クリエイティブコモンズライセンス
         ☆ MIT ライセンス (The MIT License)
 ・ 項目別もくじ

序文

はしがき

私が Linux の学習と理解を深め始めたのは 1998年頃からです。 Linux ディス
トリビューションのインストールを行ったのはその時が初めてです。 そして即
座に Linux 全般の考え方や原理について興味を抱くようになったのです。

何かの作業を完成させるには多くの方法があるものです。 同じことは Linux
ディストリビューションについても言えます。 この数年の間に数多くのディス
トリビューションが登場しました。 あるものは今も存在し、あるものは他のも
のへと形を変え、そしてあるものは記憶の彼方へ追いやられたりもしました。
それぞれが利用者の求めに応じて、様々に異なる形でシステムを実現してきた
わけです。 最終ゴールが同じものなのに、それを実現する方法がたくさんある
ため、私は一つのディストリビューションにとらわれることが不要だと思い始
めました。 Linux が登場する以前であれば、オペレーティングシステムに何か
問題があったとしても、他に選択肢はなくそのオペレーティングシステムで満
足する以外にありませんでした。 それはそういうものであって、好むと好まざ
るは関係がなかったのです。 それが Linux になって "選ぶ" という考え方が
出てきたわけです。 何かが気に入らなかったら、いくらでも変えたら良いし、
そうすることがむしろ当たり前なのです。

数多くのディストリビューションを試してみましたが、これという1つに決定で
きるものがありませんでした。 個々のディストリビューションは優れたもので
、それぞれを見てみれば正しいものです。 ただこれは正しいとか間違っている
とかの問題ではなく、個人的な趣味の問題へと変化しているのです。 こうした
さまざまな状況を通じて明らかになってきたのは、私にとって完璧なシステム
は1つもないということです。 そこで私は自分自身の Linux を作り出して、自
分の好みを満足させるものを目指したのです。

本当に自分自身のシステムを作り出すため、私はすべてをソースコードからコ
ンパイルすることを目指し、コンパイル済のバイナリパッケージは使わないこ
とにしました。 この 「完璧な」 Linux システムは、他のシステムが持つ弱点
を克服し、逆にすべての強力さを合わせ持つものです。 当初は気の遠くなる思
いがしていましたが、そのアイデアは今も持ち続けています。

パッケージが相互に依存している状況やコンパイル時にエラーが発生するなど
を順に整理していく中で、私はカスタムメイドの Linux を作り出したのです。
この Linux は今日ある他の Linux と比べても、十分な機能を有し十分に扱い
やすいものとなっています。 これは私自身が作り出したものです。 いろいろ
なものを自分で組み立てていくのは楽しいものです。 後は個々のソフトウェア
までも自分で作り出せれば、もっと楽しいものになるのでしょうが、それは次
の目標とします。

私の求める目標や作業経験を他の Linux コミュニティの方々とも共有する中で
、私の Linux への挑戦は絶えることなく続いていくことを実感しています。
このようなカスタムメイドの Linux システムを作り出せば、独自の仕様や要求
を満たすことができるのはもちろんですが、さらにはプログラマーやシステム
管理者の Linux 知識を引き伸ばす絶好の機会となります。 壮大なこの意欲こ
そが Linux From Scratch プロジェクト 誕生の理由なのです。

Linux From Scratch ブックは関連プロジェクトの中心に位置するものです。
皆さんご自身のシステムを構築するために必要となる基礎的な手順を提供しま
す。 本書が示すのは正常動作するシステム作りのための雛形となる手順ですの
で、皆さんが望んでいる形を作り出すために手順を変えていくことは自由です
。 それこそ、本プロジェクトの重要な特徴でもあります。 そうしたとしても
手順を踏み外すものではありません。我々は皆さんが挑戦する旅を応援します
。

あなたの LFS システム作りが素晴らしいひとときとなりますように。 そして
あなた自身のシステムを持つ楽しみとなりますように。

--
Gerard Beekmans
gerard AT linuxfromscratch D0T org

対象読者

本書を読む理由は様々にあると思いますが、よく挙がってくる質問として以下
があります。 「既にある Linux をダウンロードしてインストールすれば良い
のに、 どうして苦労してまで手作業で Linux を構築しようとするのか。」

本プロジェクトを提供する最大の理由は Linux システムがどのようにして動作
しているのか、これを学ぶための手助けをすることです。 LFS システムを構築
してみれば、様々なものが関連しあって依存しながら動作している様子を知る
ことができます。 そうした経験をすれば Linux システムを自分が望む形に作
りかえる手法も身につけることができます。

LFS の重要な利点として、他の Linux システムに依存することなく、システム
をより適切に制御できる点が挙げられます。 LFS システムではあなたが運転台
に立って、システムのあらゆる側面への指示を下していきます。

さらに非常にコンパクトな Linux システムを作る方法も身につけられます。
通常の Linux ディストリビューションを用いる場合、多くのプログラムをイン
ストールすることになりますが、たいていのプログラムは使わないものですし
、その内容もよく分からないものです。 それらのプログラムはハードウェアリ
ソースを無駄に占有することになります。 今日のハードドライブや CPU のこ
とを考えたら、リソース消費は大したことはないと思うかもしれません。 しか
し問題がなくなったとしても、サイズの制限だけは気にかける必要があること
でしょう。 例えばブータブル CD、USB スティック、組み込みシステムなどの
ことを思い浮かべてください。 そういったものに対して LFS は有用なものと
なるでしょう。

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

Linux From Scratch の最終目標は、実用的で完全で、基盤となるシステムを構
築することです。 Linux システムを一から作り出すつもりのない方は、本書か
ら得られるものはないかもしれません。

LFS を構築する理由は様々ですから、すべてを列記することはできません。 学
習こそ、理由を突き詰める最大最良の手段です。 LFS 構築作業の経験を積むこ
とによって、情報や知識を通じてもたらされる意義が十二分に理解できるはず
です。

LFS が対象とする CPU アーキテクチャ

LFS が対象としている CPU アーキテクチャは 32ビットインテル CPU が主とな
ります。 LFS システムの構築に初めて取りかかる方は、おそらくこのアーキテ
クチャを用いることでしょう。 32ビットアーキテクチャは Linux システムが
最も広くサポートしているもので、このアーキテクチャなら、オープンソース
も製品ソフトウェアも互換性があります。

本書の作業手順は、多少の変更を加えれば Power PC や 64ビット AMD/インテ
ル CPU でも動作することは検証されています。 その CPU を使ったシステムを
ビルドするには、これ以降の数ページで説明している条件以外に必要となるこ
とがあります。 LFS システムそのものや Ubuntu、Red Hat/Fedora、SuSE など
のディストリビューションをホストとするわけですが、それは 64ビットシステ
ムである必要があるということです。 ホストが 64ビット AMD/インテルによる
システムであったとしても 32ビットシステムは問題なくインストールできます
。

64ビットシステムにて明らかなことをここに記しておきます。 32ビットシステ
ムに比べると、実行プログラムのサイズは多少大きくなり、実行速度は若干速
くなります。 例えば Core2Duo CPU をベースとするシステム上に、LFS 6.5 を
ビルドしてみたところ、以下のような情報が得られました。

アーキテクチャ ビルド時間     ビルドサイズ
32ビット       198.5 分       648 MB
64ビット       190.6 分       709 MB

ご存知かと思いますが 64ビットによってビルドを行っても、 32ビットのとき
のビルドに比べて 4% 早くなるだけで 9% は大きなものになります。 つまり
64ビットシステムによって得られることは比較的小さいということです。 もち
ろん 4GB 以上のRAM を利用していたり、4GB を超えるデータを取り扱いたいな
らば、 64ビットシステムを用いるメリットは大きいのは間違いありません。

LFS の手順に従って作り出す 64ビットシステムは、"純粋な" 64ビットシステ
ムと言えます。 つまりそのシステムは 64ビット実行モジュールのみをサポー
トするということです。 "複数のライブラリ" によるシステムをビルドするの
なら、多くのアプリケーションを二度ビルドしなければなりません。 一度は
32ビット用であり、一度は 64ビット用です。 現時点にて本書はこの点をサポ
ートしませんが、後々のリリースに向けて検討中です。 さしあたりそのような
応用的なトピックに関しては Cross Linux From Scratch プロジェクトを参照
してください。

最後に 64ビットシステムについてもう一つ述べておきます。 パッケージの中
には現時点にて "純粋な" 64ビットシステム上でビルドできないものがあり、
あるいは特別なビルド手順を必要とするものがあります。 一般的に言えば、そ
のようなパッケージには 32ビット固有のアセンブリ言語の命令が含まれるから
であり、 だから 64ビットシステムでのビルドに失敗するということです。 例
としては Beyond Linux From Scratch (BLFS) にある Xorg ドライバの一部分
などです。 このような問題はたいていは解消していくことができますが、中に
は特別なビルド手順やパッチを要するものとなるかもしれません。

LFS と各種標準

LFS の構成は出来る限り Linux の各種標準に従うようにしています。 主な標
準は以下のものです。

 ・ The Single UNIX Specification Version 3 (POSIX). (登録操作が必要で
    す。無料。)

 ・ Filesystem Hierarcy Standard (FHS)

 ・ Linux Standard Base (LSB) Core Specification 4.0

    LSB はさらに以下の５つの標準から構成されます。 コア (Core)、C++、デ
    スクトップ (Desktop)、ランタイム言語 (Runtime Languages)、印刷
    (Printing) です。 また一般的な要求事項に加えて、アーキテクチャに固
    有の要求事項もあります。 LFS では前節にて示したように、各アーキテク
    チャに適合することを目指します。

    注記

    LSB の要求に対しては異論のある方も多いでしょう。 LSB を定義するのは
    、私有ソフトウェア (proprietary software) をインストールした場合に
    、要求事項を満たしたシステム上にて問題なく動作することを目指すため
    です。 LFS はソースコードから構築するシステムですから、どのパッケー
    ジを利用するかをユーザー自身が完全に制御できます。 また LSB にて要
    求されているパッケージであっても、インストールしない選択をとること
    もできます。

LFS の構築にあたっては LSB に適合していることを確認するテスト
(certifications tests) をクリアするように構築することも可能です。 ただ
し LFS の範囲外にあるパッケージ類を追加しなければ実現できません。 その
ような追加パッケージ類については BLFS にて導入手順を説明しています。

LFS 提供のパッケージで LSB 要求に従うもの

          Bash, Binutils, Coreutils, Diffutils, File, Findutils, Gawk,
LSB コア: Grep, Gzip, M4, Man-DB, Ncurses, Procps, Psmisc, Sed, Shadow,
          Tar, Util-linux-ng, Zlib

LSB C++:  Gcc

LSB デス  なし
クトップ:

LSB ラン
タイム言  Perl
語:

LSB 印刷: なし

LSB マル
チメディ  なし
ア:

BLFS 提供のパッケージで LSB 要求に従うもの

LSB コア: Bc, Cpio, Ed, Fcrontab, PAM, Sendmail (あるいは Postfix また
          は Exim)

LSB C++:  なし

LSB デス  ATK, Cairo, Desktop-file-utils, Freetype, Fontconfig, Glib2,
クトップ: GTK+2, Icon-naming-utils, Libjpeg, Libpng, Libxml2, MesaLib,
          Pango, Qt3, Qt4, Xorg

LSB ラン
タイム言  Python
語:

LSB 印刷: CUPS

LSB マル
チメディ  Alsa 関連ライブラリ, NSPR, NSS, OpenSSL, Java
ア:

LFS, BLFS で提供しないパッケージで LSB 要求に従うもの

LSB コア:         At, Batch, Install_initd, Lsb_release, Remove_initd,
                  Test

LSB C++:          なし

LSB デスクトップ: なし

LSB ランタイム言  なし
語:

LSB 印刷:         なし

LSB マルチメディ  Xdg-utils
ア:

各パッケージを用いる理由

既に説明しているように LFS が目指すのは、完成した形での実用可能な基盤シ
ステムを構築することです。 LFS に含まれるパッケージ群は、パッケージの個
々を構築していくために必要となるものばかりです。 そこからは最小限の基盤
となるシステムを作り出します。 そしてユーザーの望みに応じて、より完璧な
システムへと拡張していくものとなります。 LFS は極小システムを意味するわ
けではありません。 厳密には必要のないパッケージであっても、重要なものと
して含んでいるものもあります。 以下に示す一覧は、本書内の各パッケージの
採用根拠について説明するものです。

 ・ Autoconf

    このパッケージは、以下に示すようなシェルスクリプトを生成するプログ
    ラムを提供します。 つまり開発者が意図しているテンプレートに基づいて
    、ソースコードを自動的に設定する (configure する) ためのシェルスク
    リプトです。 特定のパッケージのビルド方法に変更があった場合は、パッ
    ケージ再構築を行うことになるため、その場合に本パッケージが必要とな
    ります。

 ・ Automake

    このパッケージは、テンプレートとなるファイルから Makefile を生成す
    るためのプログラムを提供します。 特定のパッケージのビルド方法に変更
    があった場合は、パッケージ再構築を行うことになるため、その場合に本
    パッケージが必要となります。

 ・ Bash

    このパッケージは、システムとのインターフェースを実現する Bourne シ
    ェルを提供し、LSB コア要件を満たします。 他のシェルを選ばずにこれを
    選ぶのは、一般的に多用されていることと、基本的なシェル関数において
    の拡張性が高いからです。

 ・ Binutils

    このパッケージは、リンカ、アセンブラのような、オブジェクトファイル
    を取り扱うプログラムを提供します。

 ・ Bison

    このパッケージは yacc (Yet Another Compiler Compiler) の GNU バージ
    ョンを提供します。 LFS において利用するプログラムの中に、これを必要
    とするものがあります。

 ・ Bzip2

    このパッケージは、ファイルの圧縮、伸張 (解凍) を行うプログラムを提
    供します。 これは LFS パッケージの多くを伸張 (解凍) するために必要
    です。

 ・ Coreutils

    このパッケージは、ファイルやディレクトリを参照あるいは操作するため
    の数多くの基本的なプログラムを提供します。

 ・ DejaGNU

    このパッケージは、他のプログラムをテストするフレームワークを提供し
    ます。 これは一時的なツールチェーンプログラムをインストールする際に
    だけ必要となります。

 ・ Diffutils

    このパッケージは、ファイルやディレクトリ間の差異を表示するプログラ
    ムを提供します。

 ・ Expect

    このパッケージは、スクリプトで作られた対話型プログラムを通じて、他
    のプログラムとのやりとりを行うプログラムを提供します。 通常は他のパ
    ッケージをテストするために利用します。 本書では一時的なツールチェー
    ンの構築時にしかインストールしません。

 ・ E2fsprogs

    このパッケージは ext2, ext3, ext4 の各ファイルシステムを取り扱うユ
    ーティリティを提供します。 各ファイルシステムは Linux がサポートす
    る一般的なものであり、十分なテストが実施されているものです。

 ・ File

    このパッケージは、指定されたファイルの種類を判別するユーティリティ
    プログラムを提供します。

 ・ Findutils

    このパッケージは、ファイルシステム上のファイルを検索するプログラム
    を提供します。

 ・ Flex

    このパッケージは、テキスト内の特定パターンの認識プログラムを生成す
    るユーティリティを提供します。 これは lex (字句解析; lexical
    analyzer) プログラムの GNU 版です。 LFS 内の他のパッケージの中にこ
    れを必要としているものがあります。

 ・ Gawk

    このパッケージはテキストファイルを操作するプログラムを提供します。
    プログラムは GNU 版の awk (Aho-Weinberg-Kernighan) です。

 ・ Gcc

    これは GNU コンパイラコレクションパッケージです。 C コンパイラと
    C++ コンパイラを含みます。また LFS ではビルドしないコンパイラも含ま
    れています。

 ・ GDBM

    このパッケージは GNU データベースマネージャライブラリを提供します。
    LFS が扱う Man-DB パッケージがこれを利用しています。

 ・ Gettext

    このパッケージは、各種パッケージが国際化を行うために利用するユーテ
    ィリティやライブラリを提供します。

 ・ Glibc

    このパッケージは C ライブラリです。Linux 上のプログラムはこれがなけ
    れば動作させることができません。

 ・ GMP

    このパッケージは数値演算ライブラリを提供するもので、任意精度演算
    (arbitrary precision arithmetic) 関数を含みます。 これは GCC をビル
    ドするために必要です。

 ・ Grep

    このパッケージはファイル内を検索するプログラムを提供します。

 ・ Groff

    このパッケージは、テキストを処理し整形するプログラムをいくつか提供
    します。 重要なものプログラムとして man ページを生成するものを含み
    ます。

 ・ GRUB

    これは Grand Unified Boot Loader です。 ブートローダーとして利用可
    能なものの中でも、これが最も柔軟性に富むものです。

 ・ Gzip

    このパッケージは、ファイルの圧縮と伸張 (解凍) を行うプログラムを提
    供します。

 ・ Iana-etc

    このパッケージは、ネットワークサービスやプロトコルに関するデータを
    提供します。 ネットワーク機能を適切に有効なものとするために、これが
    必要です。

 ・ Inetutils

    このパッケージは、ネットワーク管理を行う基本的なプログラム類を提供
    します。

 ・ IProute2

    このパッケージは、IPv4、IPv6 による基本的な、あるいは拡張したネット
    ワーク制御を行うプログラムを提供します。 IPv6 への対応があることか
    ら、よく使われてきたネットワークツールパッケージ (net-tools) に変わ
    って採用されました。

 ・ Kbd

    このパッケージは、米国以外のキーボードに対してのキーテーブルファイ
    ルやキーボードユーティリティを提供します。

 ・ Less

    このパッケージはテキストファイルを表示する機能を提供するものであり
    、表示中にスクロールを可能とします。

 ・ Libtool

    このパッケージは GNU の汎用的なライブラリに対してのサポートスクリプ
    トを提供します。 これは、複雑な共有ライブラリの取り扱いを単純なもの
    とし、移植性に優れた一貫した方法を提供します。 LFS パッケージのテス
    トスイートにおいて必要となります。

 ・ Linux Kernel

    このパッケージは "オペレーティングシステム" であり GNU/Linux 環境に
    おける Linux です。

 ・ M4

    このパッケージは汎用的なテキストマクロプロセッサであり、他のプログ
    ラムを構築するツールとして利用することができます。

 ・ Make

    このパッケージは、パッケージ構築を指示するプログラムを提供します。
    LFS におけるパッケージでは、ほぼすべてにおいて必要となります。

 ・ Man-DB

    このパッケージは man ページを検索し表示するプログラムを提供します。
    man パッケージではなく本パッケージを採用しているのは、その方が国際
    化機能が優れているためです。 このパッケージは man プログラムを提供
    しています。

 ・ Man-pages

    このパッケージは Linux の基本的な man ページを提供します。

 ・ Module-Init-Tools

    このパッケージは Linux カーネルモジュールを管理するのに必要なプログ
    ラムを提供します。

 ・ MPFR

    このパッケージは倍精度演算 (multiple precision) の関数を提供します
    。 GCC パッケージがこれを必要としています。

 ・ Ncurses

    このパッケージは、端末に依存せず文字キャラクタを取り扱うライブラリ
    を提供します。 メニュー表示時のカーソル制御を実現する際に利用されま
    す。

 ・ Patch

    このパッケージは、パッチ ファイルの適用により、特定のファイルを修正
    したり新規生成したりするためのプログラムを提供します。 パッチファイ
    ルは diff プログラムにより生成されます。 LFS パッケージの中には、構
    築時にこれを必要とするものがあります。

 ・ Perl

    このパッケージは、ランタイムに利用されるインタープリタ言語 PERL を
    提供します。

 ・ Pkg-config

    このパッケージは、configure や make を行う際に、ビルドツールに対し
    てインクルードパスやライブラリパスを受け渡すツールプログラムを提供
    します。 LFS パッケージでは、ほとんどがこれを必要としています。

 ・ Procps

    このパッケージは、プロセスの監視を行うプログラムを提供します。

 ・ Psmisc

    このパッケージは、実行中のプロセスに関する情報を表示するプログラム
    を提供します。

 ・ Readline

    このパッケージは、コマンドライン上での入力編集や履歴管理を行うライ
    ブラリを提供します。 これは Bash が利用しています。

 ・ Sed

    このパッケージは、テキストの編集を、テキストエディタを用いることな
    く可能とします。 LFS パッケージにおける configure スクリプトは、た
    いていこれを必要としています。

 ・ Shadow

    このパッケージは、セキュアな手法によりパスワード制御を行うプログラ
    ムを提供します。

 ・ Sysklogd

    このパッケージは、システムメッセージログを扱うプログラムを提供しま
    す。 例えばカーネルが出力するログや、デーモンプロセスが異常発生時に
    出力するログなどです。

 ・ Sysvinit

    このパッケージは init プログラムを提供します。 これは Linux システ
    ム上のすべてのプロセスの基点となるものです。

 ・ Tar

    このパッケージは、アーカイブや圧縮機能を提供するもので LFS が扱うす
    べてのパッケージにて利用されています。

 ・ Tcl

    このパッケージはツールコマンド言語 (Tool Command Language) を提供し
    ます。 LFS が扱うパッケージにてテストスイートの実行に必要となります
    。 これは一時的なツールチェーンの構築時にのみインストールします。

 ・ Texinfo

    このパッケージは Info ページに関しての入出力や変換を行うプログラム
    を提供します。 LFS が扱うパッケージのインストール時には、たいてい利
    用されます。

 ・ Udev

    このパッケージはデバイスノードの動的生成を行うプログラムを提供しま
    す。 /dev ディレクトリに、デバイスを静的にいくつも作り出す方法を取
    らないためのものです。

 ・ Util-linux-ng

    このパッケージは数多くのユーティリティプログラムを提供します。 その
    中には、ファイルシステムやコンソール、パーティション、メッセージな
    どを取り扱うユーティリティがあります。

 ・ Vim

    このパッケージはテキストエディタを提供します。 これを採用しているの
    は、従来の vi エディタとの互換性があり、しかも数々の有用な機能を提
    供するものだからです。 テキストエディタは個人により好みはさまざまで
    すから、もし別のエディタを利用したいなら、そちらを用いても構いませ
    ん。

 ・ Zlib

    このパッケージは、圧縮や解凍の機能を提供するもので、他のプログラム
    がこれを利用しています。

必要な知識

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

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

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

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

    これは Linux 上において 「一般的な」 Unix ソフトウェアを構築してイ
    ンストールする方法を総合的に説明しています。 だいぶ前に書かれたもの
    ですが、ソフトウェアのビルドとインストールを行うために必要となる基
    本的な方法が程よくまとめられています。

 ・ Linux ユーザーガイド (The Linux Users's Guide) http://
    www.linuxhq.com/guides/LUG/guide.html

    このガイドには Linux ソフトウェアの利用方法が分類され説明されていま
    す。 若干古いものですが内容に間違いはありません。

 ・ 基本的な事前ヒント情報 (The Essential Pre-Reading Hint) http://
    www.linuxfromscratch.org/hints/downloads/files/
    essential_prereading.txt

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

ホストシステム要件

ホストシステムには以下に示すソフトウェアが必要であり、それぞれに示され
ているバージョン以降である必要があります。 最近の Linux ディストリビュ
ーションを利用するなら、あまり問題にはならないはずです。 ディストリビュ
ーションによっては、ソフトウェアのヘッダファイル群を別パッケージとして
提供しているものが多々あります。 例えば 「<パッケージ名>-devel」 であっ
たり 「<パッケージ名>-dev」 といった具合です。 お使いのディストリビュー
ションがそのような提供の仕方をしている場合は、それらもインストールして
ください。

 ・ Bash-2.05a (/bin/sh が bash に対するシンボリックリンクまたはハード
    リンクである必要があります。)

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

 ・ Bison-1.875 (/usr/bin/yacc が bison へのリンクか、bison を実行する
    ためのスクリプトである必要があります。)

 ・ Bzip2-1.0.2

 ・ Coreutils-5.0 (または Sh-Utils-2.0 と Textutils-2.0 と
    Fileutils-4.1)

 ・ Diffutils-2.8

 ・ Findutils-4.1.20

 ・ Gawk-3.0 (/usr/bin/awk が gawk へのリンクである必要があります。)

 ・ Gcc-3.0.1 (4.4.3 以上のバージョンは、テストしていないためお勧めしま
    せん。)

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

 ・ Grep-2.5

 ・ Gzip-1.2.4

 ・ Linux Kernel-2.6.18 (GCC-3.0 以上でコンパイルされたもの)

    カーネルのバージョンを指定しているのは、第6章にて glibc をビルドす
    る際にバージョンを指定するからであり、開発者の勧めに従うためです。
    指定されたバージョンにきっちり従う必要はありませんが、少なくともバ
    ージョン 2.6.0 以上である必要があります。 カーネルのバージョンが
    2.6.0 以上でなく、さらにカーネルをビルドした際の GCC のバージョンが
    3.0 以上ではない場合、Binutils のスレッドローカル格納領域
    (thread-local storage) へのサポートが適切に構築されず、ネイティブ
    POSIX スレッド・ライブラリ (NPTL) のテストスイートがセグメンテーシ
    ョンフォールトを起こしてしまいます。

    ホストシステムのカーネルバージョンが 2.6.0 以前であったり、カーネル
    をビルドした際の GCC のバージョンが 3.0 以前であった場合は、ここに
    示した条件に合致するカーネルに置き換えることが必要です。 これを実施
    するには２つの方法があります。 お使いの Linux システムのベンダーが
    カーネル 2.6.18 を提供しているかを調べることです。 もしそれがあるな
    ら、これを利用することができます。 もしそれがない場合、あるいはあっ
    たとしてもそれをインストールしたくない場合、カーネルをご自身でコン
    パイルする必要があります。 カーネルのコンパイルと (ホストシステムが
    GRUB を利用しているとして) ブートローダーの設定方法については 第8章
    が参考になります。

 ・ M4-1.4

 ・ Make-3.79.1

 ・ Patch-2.5.4

 ・ Perl-5.6.0

 ・ Sed-3.0.2

 ・ Tar-1.14

 ・ Texinfo-4.8

上で示しているシンボリックリンクは、本書の説明を通じて LFS を構築するた
めに必要となるものです。 シンボリックリンクが別のソフトウェア (例えば
dash や mawk) を指し示している場合でもうまく動作するかもしれません。 し
かしそれらに対して LFS 開発チームはテストを行っていませんしサポート対象
としていません。 そのような状況に対しては作業手順の変更が必要となり、特
定のパッケージに対しては追加のパッチを要するかもしれません。

ホストシステムに、上のソフトウェアの適切なバージョンがインストールされ
ているかどうか、またコンパイルが適切に行えるかどうかは、以下のスクリプ
トを実行して確認することができます。

cat > version-check.sh << "EOF"
#!/bin/bash
export LC_ALL=C

# Simple script to list version numbers of critical development tools

bash --version | head -n1 | cut -d" " -f2-4
echo "/bin/sh -> `readlink -f /bin/sh`"
echo -n "Binutils: "; ld --version | head -n1 | cut -d" " -f3-
bison --version | head -n1
if [ -e /usr/bin/yacc ];
  then echo "/usr/bin/yacc -> `readlink -f /usr/bin/yacc`";
  else echo "yacc not found"; fi
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
if [ -e /usr/bin/awk ];
  then echo "/usr/bin/awk -> `readlink -f /usr/bin/awk`";
  else echo "awk not found"; fi
gcc --version | head -n1
/lib/libc.so.6 | head -n1 | cut -d"," -f1
grep --version | head -n1
gzip --version | head -n1
cat /proc/version
m4 --version | head -n1
make --version | head -n1
patch --version | head -n1
echo Perl `perl -V:version`
sed --version | head -n1
tar --version | head -n1
echo "Texinfo: `makeinfo --version | head -n1`"
echo 'main(){}' > dummy.c && gcc -o dummy dummy.c
if [ -x dummy ]; then echo "Compilation OK";
  else echo "Compilation failed"; fi
rm -f dummy.c dummy

EOF

bash version-check.sh

本書の表記

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

./configure --prefix=/usr

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

場合によっては、1行で表現される内容を複数行に分けているものがあります。
その場合は各行の終わりにバックスラッシュ (あるいは円記号) を表記してい
ます。

CC="gcc -B/usr/bin/" ../binutils-2.18/configure \
  --prefix=/tools --disable-nls --disable-werror

バックスラッシュ (または円記号) のすぐ後ろには改行文字がきます。 そこに
余計な空白文字やタブ文字があると、おかしな結果となるかもしれないため注
意してください。

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

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

Emphasis

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

http://www.linuxfromscratch.org/

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

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

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

<REPLACED TEXT>

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

[OPTIONAL TEXT]

上の表記は入力しなくてもよいオプションを示しています。

passwd(5)

上の表記はマニュアルページ (man ページ) を参照するものです。 カッコ内の
数字は man の内部で定められている特定のセクションを表しています。 例え
ば passwd コマンドには2つのマニュアルページがあります。 LFS のインスト
ールに従った場合、2つのマニュアルページは /usr/share/man/man1/passwd.1
と /usr/share/man/man5/passwd.5 に配置されます。 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部では、パーティションの生成、パッケージのダウンロード、一時的なツ
ールのコンパイルといった、システム構築の準備作業について説明します。

第 III 部 - LFSシステムの構築

第III部では LFS システムの構築作業を順に説明していきます。 そこでは全パ
ッケージのコンパイルとインストール、ブートスクリプトの設定、カーネルの
インストールを行います。 出来上がる Linux システムをベースとして、他の
ソフトウェアを必要に応じて導入し、このシステムを拡張していくことができ
ます。 本書の終わりには、インストール対象のプログラム、ライブラリ、ある
いは重要なファイル類についてのさくいんも示します。

正誤情報

LFS システムを構築するためのソフトウェアは日々拡張され更新されています
。 LFS ブックがリリースされた後に、セキュリティフィックスやバグフィック
スが公開されているかもしれません。 本版にて説明するパッケージや作業手順
に対して、セキュリティフィックスやバグフィックス等が必要かどうか、ビル
ド作業を行う前に http://www.linuxfromscratch.org/lfs/errata/6.6/ を確認
してください。 そして LFS ビルド作業を進めながら、対応する節においての
変更を確認し適用してください。

日本語訳について

日本語訳情報

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

はじめに

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

日本語版の提供について

日本語版 LFS ブックは SourceForge.jp 内に開発の場を設け http://
sourceforge.jp/projects/lfsbookja/ にて 「LFSブック日本語版」 のプロジ
ェクト名で提供するものです。

HTML ファイル類や日本語化のために構築しているソース類について、あるいは
それらの取り扱い (ライセンス) については上記サイトを参照してください。

日本語版の生成について

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

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

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

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

日本語版における注意点

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

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

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

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

Last updated on

第I部 はじめに

第1章 はじめに

1.1. LFS をどうやって作るか

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

コンピュータ内にインストールされているディストリビューションを利用する
のではなく、 Linux From Scratch LiveCD、あるいは他の提供されている
LiveCD を利用することもできます。 LFS LiveCD はホストシステムとして利用
することができます。 この LiveCD には本書に示す手順を実施するために必要
なツール類がすべて含まれます。 ただし LiveCD の開発が順調に進まず、そこ
に含まれるソースパッケージやパッチ (「-nosrc」 や 「-min」 という名称が
含まれていない版) や本書自身も古い可能性があります。 LFS LiveCD の詳細
や LiveCD ダウンロード方法については http://www.linuxfromscratch.org/
livecd/ を参照してください。

注記

LFS LiveCD は最近のハードウェア環境において、うまく動作しないかもしれま
せん。 ブートに失敗したり SATA ハードドライブのようなデバイス検出に失敗
したりすることがあります。

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

第5章 では数多くのパッケージをインストールします。 これらは基本的な開発
ツール (ツールチェーン) を構成するものであり 第6章 において最終的なシス
テムを構築するために利用します。 パッケージの中には自分自身を循環的に必
要とするような依存関係を持つものがあります。 例えばコンパイラをコンパイ
ルするためにはコンパイラが必要となります。

第5章 ではツールチェーンの第1回めの構築方法を示します。 そこではまず
Binutils と GCC を構築します。 (第1回めと表現しているということは、つま
りこれら2つのパッケージは後に再構築します。) 次に C ライブラリである
Glibc を構築します。 Glibc は第1回めのツールチェーンを用いてコンパイル
されます。 そして第2回めのツールチェーン構築を行います。 この時のツール
チェーンは新たに構築した Glibc をリンクします。 それ以降の 第5章 に示す
パッケージは第2回めのツールチェーンプログラムを用いて構築します。 上の
作業をすべて終えたら LFS のインストール作業はもはやホストディストリビュ
ーションに依存しません。 ただし作動させるカーネルだけは使い続けます。

ホストシステムのツール類から新しいシステムを切り離していくこの手順は、
やり過ぎのように見えるかもしれません。 5.2. 「ツールチェーンの技術的情
報」 にて詳細に説明しているので参照してください。

第6章 にて LFS システムが出来上がります。 chroot (ルートをチェンジする)
プログラムを使って仮想的な環境に入り LFS パーティション内のディレクトリ
をルートディレクトリとしてシェルを起動します。 これは LFS パーティショ
ンをルートパーティションとするシステム再起動と同じことです。 ただ実際に
はシステムを再起動はしません。 再起動できるシステムとするためにはもう少
し作業を必要としますし、この時点ではまだそれが必要ではないので chroot
を行う方法を取ります。 chroot を使うメリットは、LFS 構築作業にあたって
引き続きホストシステムを利用できることです。 パッケージをコンパイルして
いる最中には、通常どおり別の作業を行うことができます。

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

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

1.2. 前版からの変更点

以下に示すのは前版から変更されているパッケージです。

アップグレード:

 ・ Autoconf 2.65

 ・ Automake 1.11.1

 ・ Bash 4.1

 ・ Binutils 2.20

 ・ Coreutils 8.4

 ・ E2fsprogs 1.41.10

 ・ File 5.04

 ・ GCC 4.4.3

 ・ Glibc 2.11.1

 ・ GMP 5.0.0

 ・ GRUB 1.97.2

 ・ Gzip 1.4

 ・ Inetutils 1.7

 ・ IPRoute2 2.6.31

 ・ Less 436

 ・ Libtool 2.2.6b

 ・ Linux 2.6.32.8

 ・ Man-DB 2.5.6

 ・ Man-pages 3.23

 ・ Module-Init-Tools 3.11.1

 ・ MPFR 2.4.2

 ・ Patch 2.6.1

 ・ Perl 5.10.1

 ・ Psmisc 22.10

 ・ Readline 6.1

 ・ TCL 8.5.8

 ・ Udev 151

 ・ Util-Linux-NG 2.17

追加:

 ・ coreutils-8.4-i18n-1.patch

 ・ coreutils-8.4-uname-1.patch

 ・ make-3.81-upstream_fixes-1.patch

 ・ patch-2.6.1-test_fix-1.patch

 ・ perl-5.10.1-utf8-1.patch

削除:

 ・ bash-4.0-fixes-3.patch

 ・ coreutils-7.5-i18n-1.patch

 ・ coreutils-7.1-uname-1.patch

 ・ inetutils-1.6-no_server_man_pages-1.patch

 ・ patch-2.5.9-fixes-1.patch

 ・ readline-6.0-fixes-1.patch

1.3. 変更履歴

本書は Linux From Scratch ブック、バージョン 6.6 です。 本書が 6ヶ月以
上更新されていなければ、より新しい版が公開されているはずです。以下のミ
ラーサイトを確認してください。 http://www.linuxfromscratch.org/
mirrors.html

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

変更履歴：

 ・ 2010-02-28

     □ [bdubbs] Bison にて config.h の場所変更に伴い修正。 #2595 を
        Fix に。

 ・ 2010-02-26

     □ [bdubbs] make-3.81-upstream_fixes-1.patch を追加。 #2588 を Fix
        に。

     □ [bdubbs] perl-5.10.1-utf8-1.patch を追加。 #2589 を Fix に。

 ・ 2010-02-22

     □ [matthew] Readline パッケージのドキュメントバージョンを正しくす
        る。 これはアップストリームの 002 patch に対応するもの。

     □ [bdubbs] e2fsprogs-1.41.10 へのアップグレード。 #2576 を Fix に
        。 これに伴って #2586 によって変更した内容は元に戻すことに。

     □ [bdubbs] Glibc に対するバージョンチェックの出力結果を、より確実
        なものに。

 ・ 2010-02-21

     □ [bdubbs] e2fsprogs におけるエラーを修正。 #2586 を Fix に。

     □ [matthew] lfs-6.6-rc2 に対するタグ追加。

 ・ 2010-02-19

     □ [bdubbs] Linux-2.6.32.8 へのアップグレード。 #2575 を Fix に。

 ・ 2010-02-17

     □ [bdubbs] ディスクパーティションに関する議論について加筆。 #2582
        を Fix に。

     □ [bdubbs] GDBM における 'dir' ファイルを確実に追加するように変更
        。 変更修正にあたっては Randy McMurchy に感謝する。 #2574 を
        Fix に。

     □ [bdubbs] 第6章にて File パッケージを GCC の前に置く。 テストの
        成功率を上げるため。 #2568 を Fix に。

     □ [bdubbs] Glibc にて知られているテスト失敗の情報を追記。 #2569
        を Fix に。

 ・ 2010-02-11

     □ [bdubbs] 本書の属性情報の更新。

 ・ 2010-02-01

     □ [matthew] Module-Init-tools にて Zlib のスタティックライブラリ
        利用でなく、ダイナミックライブラリに。 #2562 を Fix に。

     □ [matthew] Linux-2.6.32.7 へのアップグレード。 #2563 を Fix に。

 ・ 2010-01-31

     □ [bdubbs] '対象アーキテクチャ' の説明において、マルチライブラリ
        システムにおける説明を削除。

 ・ 2010-01-28

     □ [matthew] Udev-151 へのアップグレード。 #2561 を Fix に。

     □ [matthew] Linux-2.6.32.6 へのアップグレード。 #2559 を Fix に。

 ・ 2010-01-26

     □ [matthew] 無用な Udev ルールを大幅に削除し、アップストリームに
        よるルールを利用。 #2527 を Fix に。

     □ [bryan] 単一の /etc/modprobe.conf ファイルではなく、/etc/
        modprobe.d/*.conf ファイルを利用するように変更。最近の
        module-init-tools が警告を出すため。 #2560 を Fix に。

 ・ 2010-01-24

     □ [bdubbs] GRUB-1.97.2 へのアップグレード。 #2556 を Fix に。

     □ [matthew] lfs-bootscripts-20100124 へのアップグレード。 /dev が
        マウントされていない場合のチェックを行う。 #2550 を Fix に。

     □ [matthew] Udev >= 142 の場合は /lib/udev/devices/kmsg を自動生
        成するため、生成しないように。 #2552 を Fix に。

     □ [matthew] File-5.04. へのアップグレード。 #2555 を Fix に。

     □ [matthew] GCC-4.4.3 へのアップグレード。 #2553 を Fix に。

     □ [matthew] Gzip-1.4 へのアップグレード。 #2551 を Fix に。

     □ [matthew] Udev-150 へのアップグレード。 #2547 を Fix に。

     □ [matthew] GMP-5.0.0 へのアップグレード。 #2546 を Fix に。

     □ [matthew] Coreutils-8.4 へのアップグレード。 #2545 を Fix に。

     □ [matthew] Util-Linux-NG-2.17 へのアップグレード。 #2544.

     □ [matthew] Linux-2.6.32.5 へのアップグレード。 #2542 を Fix に。

     □ [matthew] Psmisc-22.10 へのアップグレード。 #2541 を Fix に。

 ・ 2010-01-09

     □ [bdubbs] Chris Staub による文法とスペルの更新。 #2548 を Fix に
        。

 ・ 2010-01-03

     □ [matthew] GCC のテストスイート実行にあたり、Glibc の getline 関
        数との不整合によるテスト失敗を解消。

     □ [matthew] Readline-6.1 へのアップグレード。 #2540 を Fix に。

     □ [matthew] Bash-4.1 へのアップグレード。 #2539 を Fix に。

     □ [matthew] Patch-2.6.1 へのアップグレード。 #2538 を Fix に。

     □ [matthew] Glibc-2.11.1 へのアップグレード。 #2537 を Fix に。

     □ [matthew] Psmisc-22.9 へのアップグレード。 #2536 を Fix に。

     □ [matthew] IPRoute2-2.6.31 へのアップグレード。 #2535 を Fix に
        。

 ・ 2009-12-21

     □ [matthew] Linux-2.6.32.2 へのアップグレード。 #2534 を Fix に。

     □ [matthew] Inetutils-1.7 へのアップグレード。 #2533 を Fix に。

 ・ 2009-12-16

     □ [matthew] Linux-2.6.32.1 へのアップグレード。 #2532 を Fix に。

     □ [matthew] Automake-1.11.1 へのアップグレード。 #2529 を Fix に
        。

     □ [matthew] Coreutils-8.2 へのアップグレード。 #2524 を Fix に。

 ・ 2009-12-06

     □ [matthew] inetutils のプログラムのいくつかを FHS に従うように移
        動。 #2524 を Fix に。

     □ [matthew] Linux-2.6.32 へのアップグレード。 #2526 を Fix に。

     □ [matthew] Udev-149 へのアップグレード。 #2525 を Fix に。

 ・ 2009-12-02

     □ [matthew] Util-Linux-NG-2.16.2 へのアップグレード。 #2523 を
        Fix に。

     □ [matthew] MPFR-2.4.2. Fixes #2522 を Fix に。

     □ [matthew] Autoconf-2.65 へのアップグレード。 #2520 を Fix に。

 ・ 2009-11-29

     □ [bdubbs] Grub の設定に関して詳細情報を追加。

 ・ 2009-11-24

     □ [bdubbs] LFS と各種標準のページを分割し、各パッケージを用いる理
        由のページを設ける。 各種パッケージが LSB 要求を満足するかどう
        かの詳細情報を追加。

 ・ 2009-11-23

     □ [bdubbs] LFS と各種標準のページを追加しその内容を説明。 #1673
        と #2196 を Fix に。

 ・ 2009-11-22

     □ [bdubbs] ホスト要件を確認するスクリプトにて Texinfo パッケージ
        のバージョンを確認する makeinfo にてコメント出力を更新。

     □ [bdubbs] 各パッケージの依存関係を示す付録において、外部の (LFS
        内にはない) 依存関係を示す項を追加。 #1682 を Fix に。

 ・ 2009-11-21

     □ [matthew] Linux ヘッダによってインストールされるファイルのうち
        、不要な .install ファイルと ..install.cmd ファイルを削除。

     □ [matthew] Coreutils-8.1 へのアップグレード。 #2518 を Fix に。

     □ [matthew] Tcl-8.4.8 へのアップグレード。 #2517 を Fix に。

     □ [matthew] Libtool-2.2.6b へのアップグレード。 #2514 を Fix に。

 ・ 2009-11-16

     □ [bdubbs] 「LFS が対象とする CPU アーキテクチャ」にて、64 ビット
        のローダーがビルドできないと説明していた段落を削除。

 ・ 2009-11-16

     □ [bdubbs] ツールチェーンの技術的情報において、なぜクロスコンパイ
        ラを用いた手法を採用するのかについて明確な説明とする。 #2412 を
        Fix に。

 ・ 2009-11-15

     □ [matthew] Patch-2.6 へのアップグレード。 #2513 を Fix に。

     □ [matthew] Udev-147 へのアップグレード。 #2512 を Fix に。

     □ [matthew] Linux-2.6.31.6 へのアップグレード。 #2511 を Fix に。

 ・ 2009-11-14

     □ [bdubbs] ホストシステム要件の説明より、古くなった記述を削除。

 ・ 2009-11-12

     □ [bdubbs] 「SBU 値について」において並行的な処理についての注記を
        追加。 そして SBU 値にどのように影響するかを説明。

     □ [bdubbs] GRUB-1.97.1 での説明手順の若干の変更。

 ・ 2009-11-09

     □ [bdubbs] GRUB-1.97.1 へのアップグレード。 #2510 を Fix に。

 ・ 2009-11-06

     □ [matthew] Glibc-2.11 へのアップグレード。 #2509 を Fix に。

     □ [matthew] Bash のアップストリームが提供する最新のパッチを利用。

     □ [matthew] Linux-2.6.31.5 へのアップグレード。 #2508 を Fix に。

     □ [matthew] Module-Init-Tools-3.11.1 へのアップグレード。 #2507
        を Fix に。

 ・ 2009-10-29

     □ [bdubbs] GRUB-1.97 へのアップデート。 /boot や MBR の設定の説明
        から、ビルドとインストールに関する記述を分離させ、ビルドの説明
        を第6章に。 また /boot や MBR に関する説明を充足させ第8章に。 #
        2093 を Fix に。 これは #2033 で指摘されている initramfs が不要
        とすることでもある。

 ・ 2009-10-20

     □ [matthew] Linux-2.6.31.4 へのアップグレード。 #2503 を Fix に。

     □ [matthew] GCC-4.4.2 へのアップグレード。 #2504 を Fix に。

     □ [matthew] Binutils-2.20 へのアップグレード。 #2505 を Fix に。

 ・ 2009-10-12

     □ [matthew] Kbd-1.15.1 へのアップグレード。 #2501 を Fix に。

     □ [matthew] Man-Pages-3.23 へのアップグレード。 #2498 を Fix に。

     □ [matthew] Linux-2.6.31.3 へのアップグレード。 #2499 を Fix に。

     □ [matthew] Gzip-1.3.13 へのアップグレード。 #2500 を Fix に。

 ・ 2009-09-29

     □ [matthew] Linux-2.6.31.1 へのアップグレード。 #2496 を Fix に。

     □ [matthew] psmisc の実行モジュールのインストール先を /bin から /
        usr/bin に変更。 これは /usr がマウントされている時に実行される
        ものであるため。 #2469 を Fix に。

 ・ 2009-09-25

     □ [bryan] udev-config-20090925 へのアップグレード。 #2497 を Fix
        に。

 ・ 2009-09-24

     □ [matthew] Linux のインストールヘッダ一覧の更新。 Chris Staub に
        よりパッチ提供。 #2495 を Fix に。

     □ [matthew] さまざまなパッケージにおけるインストールプログラム一
        覧の更新。 Chris Staub によりパッチ提供。 #2494 を Fix に。

 ・ 2009-09-17

     □ [matthew] Bash-4.0-fixes-4.patch のアップグレード。 #2484 を
        Fix に。

     □ [matthew] Linux-2.6.31 へのアップグレード。 #2485 を Fix に。

     □ [matthew] Util-Linux-NG-2.16.1 へのアップグレード。 #2483 を
        Fix に。

     □ [matthew] Coreutils-7.6 へのアップグレード。 #2487 を Fix に。

     □ [matthew] Man-DB-2.5.6 へのアップグレード。 #2481 を Fix に。

 ・ 2009-09-11

     □ [bdubbs] - コンパイル最適化のヒントが古くなって役立たないため削
        除。

 ・ 2009-09-10

     □ [bdubbs] - 序文 (preface) の章に LFS がサポートする CPU アーキ
        テクチャの説明を追加。

 ・ 2009-09-02

     □ [bdubbs] - 第5章のストリップにてドキュメント削除の量を是正。

 ・ 2009-08-26

     □ [matthew] Udev-146へのアップグレード。 #2473 を Fix に。

     □ [matthew] Perl-5.10.1 へのアップグレード。 #2479 を Fix に。

     □ [matthew] Linux-2.6.30.5 へのアップグレード。 #2475 を Fix に。

     □ [matthew] - Less-436 へのアップグレード。 2471 を Fix に。

     □ [matthew] - E2fsprogs-1.41.9 へのアップグレード。 2478 を Fix
        に。

     □ [matthew] - Coreutils-7.5 へのアップグレード。 #2477 を Fix に
        。

 ・ 2009-08-19

     □ [bdubbs] - 全般的なコンパイル手順 (General Compilation
        Instruction) における記述改訂と Binutils において全般的なコンパ
        イル手順を読むべきことを記したメモを追加。

LFS 6.5 は 2009年8月16日にリリースされました。

1.4. 変更履歴 (日本語版)

ここに示すのは LFS ブック 6.6 日本語版 (バージョン 20100302) の変更履歴
です。

日本語訳情報

本節はオリジナルの LFS ブックにはないものです。 LFS ブック日本語版の変
更履歴を示すために設けています。

変更履歴：

 ・ 2010-03-02

     □ [matsuand] - 6.6 対応。初出。

1.5. 情報源

1.5.1. FAQ

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

1.5.2. メーリングリスト

linuxfromscratch.org サーバーでは、LFS 開発プロジェクトのために多くのメ
ーリングリストを立ち上げています。 このメーリングリストは主となる開発用
とは別に、サポート用のものもあります。 FAQ だけでは問題解決に至らなかっ
た場合に、次の手としてメーリングリストを検索する以下のサイトを参照して
ください。 http://www.linuxfromscratch.org/search.html

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

1.5.3. IRC

LFS コミュニティのメンバーの中には、インターネットリレーチャット
(Internet Relay Chat; IRC) によるサポートを行っている者もいます。 ここ
に対して質問を挙げる場合は、FAQ やメーリングリストに同様の質問や答えが
ないかどうかを必ず確認してください。 IRC は irc.linuxfromscratch.org に
おいて、チャネル名 #LFS-support により提供しています。

1.5.4. ミラーサイト

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

1.5.5. 連絡先

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

1.6. ヘルプ

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

FAQ では問題解決ができない場合、メーリングリスト http://
www.linuxfromscratch.org/search.html を検索してください。

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

1.6.1. 特記事項

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

 ・ お使いの LFS ブックのバージョン。 (本書の場合 6.6)

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

 ・ vii. 「ホストシステム要件」 の出力結果。

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

 ・ 問題となったエラーメッセージや状況に対する詳細な情報。

 ・ 本書どおりに作業しているか、逸脱していないかの情報。

注記

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

1.6.2. Configure スクリプトの問題

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

1.6.3. コンパイル時の問題

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

gcc -DALIASPATH=\"/mnt/lfs/usr/share/locale:.\"
-DLOCALEDIR=\"/mnt/lfs/usr/share/locale\"
-DLIBDIR=\"/mnt/lfs/usr/lib\"
-DINCLUDEDIR=\"/mnt/lfs/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':
/lfs/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 `/lfs/tmp/make-3.79.1'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/lfs/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. はじめに

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

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

どのようなオペレーティングシステムでも同じことが言えますが、 本システム
でもインストール先は専用のパーティションを用いることにします。 LFS シス
テムを構築していくには、利用可能な空のパーティションか、 あるいはパーテ
ィション化していないものをパーティションとして生成して利用することにし
ます。

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

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

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

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

2.2.1. パーティションに関するその他の問題

LFS メーリングリストにてパーティションに関する有用情報を望む声をよく聞
きます。 これは個人の趣味にもよる極めて主観的なものです。 既存ディスト
リビューションが採用しているデフォルトのパーティションサイズと言えば、
たいていはスワップパーティションを小容量で配置した上で、そのドライブ内
の残容量すべてのサイズを割り当てています。 このようなサイズ設定は LFS
では最適ではありません。その理由はいくつかあります。 そのようにしてしま
うと、複数のディストリビューションの導入時や LFS 構築時に、柔軟さを欠き
、構築がしにくくなります。 バックアップを取る際にも無用な時間を要し、フ
ァイルシステム上にて不適当なファイル配置を生み出すため、余計なディスク
消費を発生させます。

2.2.1.1. ルートパーティション

ルートパーティション (これを /root ディレクトリと混同しないでください)
は 10 GB もあれば、どんなシステムであっても妥当なところでしょう。 それ
だけあれば LFS 構築も、また BLFS においてもおそらく十分なはずです。 実
験的に複数パーティションを設けるとしても、これだけのサイズは必要です。

2.2.1.2. スワップパーティション

既存のディストリビューションは、たいていはスワップパーティションを自動
的に生成します。 一般にスワップパーティションのサイズは、物理 RAM サイ
ズの二倍の容量とすることが推奨されています。 しかしそれだけの容量はほと
んど必要ありません。 ディスク容量が限られているなら、スワップパーティシ
ョンの容量を 2GB 程度に抑えておいて、ディスクスワップがどれだけ発生する
かを確認してみてください。

スワップは好ましいことではありません。 一般にスワップが発生しているかど
うかは、ディスクアクセスの様子やコマンド実行時にシステムがどのように反
応するかを見てみれば分かります。 例えば 5GB くらいのファイルを編集する
といった極端なコマンド実行を行ってみて、スワップが起きるかどうかを確認
することが重要です。 スワップがごく普通に発生するようであれば、RAMを増
設するのが適切です。

2.2.1.3. 有用なパーティション

この他にも、必要のないパーティションというものがいくつかあります。 しか
しディスクレイアウトを取り決めるには考えておく必要があります。 以下に示
すのは十分な説明ではありませんが、一つの目安として示すものです。

 ・ /boot - 作成することが強く推奨されます。 カーネルやブート情報を収納
    するために利用するパーティションです。 容量の大きなディスクの場合、
    ブート時に問題が発生することがあるので、これを回避するには、一つ目
    のディスクドライブの物理的に一番最初のパーティションを選びます。 パ
    ーティションサイズを 100MB とすればそれで十分です。

 ・ /home - 作成することが強く推奨されます。 複数のディストリビューショ
    ンや LFS の間で、ホームディレクトリおよびユーザー固有の設定を共有す
    ることができます。 パーティションサイズは、ある程度大きく取ることに
    なりますが、利用可能なディスク残容量に依存します。

 ・ /usr - /usr ディレクトリを別パーティションとして設けるのは、一般に
    はシンクライアント (thin client) 向けサーバーやディスクレスワークス
    テーションにおいて行われます。 普通 LFS では必要ありません。 5 GB
    くらいの容量があれば、たいていのアプリケーションをインストールする
    のに十分なものでしょう。

 ・ /opt - このディレクトリは BLFS などにおいて、Gnome や KDE といった
    巨大なパッケージをいくつもインストールする際に活用されます。 /usr
    ディレクトリ以外にインストールする場合です。 これを別パーティション
    とするなら、一般的には 5 〜 10 GB 程度が適当でしょう。

 ・ /tmp - /tmp ディレクトリを別パーティションとするのは普通は行いませ
    ん。 ただしシンクライアント (thin client) では有効です。 別パーティ
    ションとする場合であっても、数GB程度あれば十分です。

 ・ /usr/src - このパーティションは LFS のパッケージソースを収容し LFS
    ビルド工程にて共用するものとして有効に利用することができます。 さら
    に BLFS パッケージソースを収容しビルドする場所としても利用可能です
    。 30〜50GBくらいの容量があれば、十分なものです。

ブート時に自動的にパーティションをマウントしたい場合は /etc/fstab ファ
イルにて設定します。 パーティションの設定方法については 8.2. 「/etc/
fstab ファイルの生成」 で説明しています。

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

空のパーティションが準備できましたのでファイルシステムを作ります。
Linux において広く用いられるファイルシステムは ext2 (second extended
file system) です。 より新しく大容量のハードディスクに対しては、ジャー
ナリングファイルシステムが一般的となりつつあります。 ext3 (third
extended file system) は ext2 の拡張として広く利用されるようになってい
ます。 ext3 ではジャーナリング機能が追加され E2fsprogs ユーティリティと
の互換性を持ちます。 本書では ext3 ファイルシステムを生成することにしま
す。 他のファイルシステムの生成方法については http://
www.linuxfromscratch.org/blfs/view/svn/postlfs/filesystems.html を参照
してください。

LFS 用のパーティションに対して ext3 ファイルシステムを生成するために以
下のコマンドを実行します。

mke2fs -jv /dev/<xxx>

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

注記

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

debugfs -R feature /dev/<xxx>

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

cd /tmp
tar -xzvf /path/to/sources/e2fsprogs-1.41.10.tar.gz
cd e2fsprogs-1.41.10
mkdir -v build
cd build
../configure
make #note that we intentionally don't 'make install' here!
./misc/mke2fs -jv /dev/<xxx>
cd /tmp
rm -rfv e2fsprogs-1.41.10

既に存在している swap パーティションを用いることにした場合は、初期化操
作を行う必要はありません。 新しい swap パーティションを作成した場合は、
以下のコマンドを実行して初期化を行う必要があります。

mkswap /dev/<yyy>

<yyy> の部分は swap パーティションの名に合わせて置き換えてください。

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

ファイルシステムが生成できたら、パーティションをアクセスできるようにし
ます。 これを行うためにはマウントポイントを定める必要があります。 本書
ではファイルシステムを /mnt/lfs にマウントすることにします。このディレ
クトリは各自で取り決めて変えることもできます。

マウントポイントを定めたら、そのディレクトリを指し示すような環境変数
LFS を以下のようにして設定します。

export LFS=/mnt/lfs

次にマウントポイントを生成し、LFS ファイルシステムをマウントします。

mkdir -pv $LFS
mount -v -t ext3 /dev/<xxx> $LFS

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

LFS に対して複数のパーティションを用いる場合 (例えば / と /usr が別パー
ティションである場合) は、以下を実行してそれぞれをマウントします。

mkdir -pv $LFS
mount -v -t ext3 /dev/<xxx> $LFS
mkdir -v $LFS/usr
mount -v -t ext3 /dev/<yyy> $LFS/usr

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

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

swap パーティションを用いる場合は、swapon コマンドを使って利用可能にし
てください。

/sbin/swapon -v /dev/<zzz>

<zzz> の部分は swap パーティション名に置き換えてください。

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

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

3.1. はじめに

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

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

ダウンロードしたパッケージやパッチは、ビルド作業を通じて常に利用可能な
場所を選んで保存しておく必要があります。 またソース類を伸張してビルドを
行うための作業ディレクトリも必要です。 そこで本書では $LFS/sources ディ
レクトリを用意し、ソースやパッチの保存場所とし、そこでビルドを行う作業
ディレクトリとします。 このディレクトリにしておけば LFS パーティション
に位置することから LFS ビルドを行う全工程において常に利用することが出来
ます。

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

mkdir -v $LFS/sources

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

chmod -v a+wt $LFS/sources

パッケージとパッチのダウンロードを簡単に行う方法として wget-list を利用
する方法があります。 これは wget の入力引数に指定し利用します。

日本語訳情報

本節にて wget-list のハイパーリンクが出てきますが、これは本来、拡張子を
持たないファイル wget-list へのリンクです。 本書を Web サイト上に搭載し
た場合に MIME 設定 (その制約) によりアクセスが出来ないファイルとなって
しまう可能性があります。 (実際に訳者がオンライン公開しているサイトでは
、拡張子を持たないファイルを表示・ダウンロードできません。) そこで本書
では wget-list.txt のように拡張子 .txt をつけるようにしました。 なお別
途公開している本書の tarball では wget-list と wget-list.txt を共に含め
ています。両者は全く同一内容です。

日本語訳情報

上の wget-list は、次節に示されているパッケージやパッチのダウンロード
URL を一覧列記しています。 これを wget とともに用いれば、必要なパッケー
ジソースやパッチの一括取得ができるため大変便利です。 ちなみに LFS ブッ
ク原版では wget の具体的な使い方が示されていませんが、単純には以下のよ
うなコマンド実行になるでしょう。 (wget-list ファイルを $LFS/sources デ
ィレクトリにコピーして実行します。)

cd $LFS/sources
wget -N -i wget-list

LFS ブック原版では、それらの URL が主に米国サイトの URL となっています
。 一方、日本に在住する日本の方であれば、例えば GNU のパッケージ類は国
内に数多くのミラーサイトが存在するため、そちらから取得するのが適切でし
ょう。 これはネットワークリソースを利用する際のマナーとも言えるものです
。 堅苦しい話をするつもりはありません。 国内サイトから入手することにす
ればダウンロード速度が断然早くなります。 メリットは大きいと思いますので
お勧めします。

国内から入手可能なものは国内から入手することを目指し、訳者は以下の手順
により wget-list を書き換えて利用しています。 一例として国内には理化学
研究所 (ftp.riken.jp) があります。 そこでは GNU パッケージ類がミラー提
供されています。 そこで wget-list にて ftp.gnu.org を指し示している URL
を ftp.riken.jp に置き換えます。 また Linux カーネルの入手先
(www.kernel.org) についても理化学研究所より入手可能ですので、これも置き
換えます。

cp -pv wget-list wget-list.orig
sed -e 's|http://ftp\.gnu\.org/gnu/|http://ftp.riken.jp/GNU/ftp/gnu/|g' \
    -e 's|http://www\.kernel\.org/pub/linux/|http://ftp.riken.jp/Linux/kernel.org/linux/|g' \
       wget-list.orig > wget-list

注意する点として各パッケージが更新されたばかりの日付では、国内ミラーサ
イトへの同期・反映が間に合わず、ソース類が存在しないことが考えられます
。 その場合には上の方法はすんなりとは実現できません。オリジナルの URL
を用いるしかありません。

上記はあくまで一例です。 国内のミラーサイトは、ネットワーク的に "より近
い" ものを選んでください。 またミラーサイトのディレクトリ構成はサイトに
よって変わります。必要に応じてコマンドを書き換えてください。 さらに上記
の sed による一括置換は、パッケージやソースの今後の更新状況によっては提
供 URL が変わり、 wget-list のすべての URL が正しいものにはならない可能
性がありますから十分注意してください。 ダウンロードできなかった場合は、
上記の sed コマンドを工夫するか、手作業にて wget-list を書き換えてくだ
さい。

3.2. 全パッケージ

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

Autoconf (2.65) - 1,301 KB:

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

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

    MD5 sum: a6de1cc6434cd64038b0a0ae4e252b33

Automake (1.11.1) - 1,042 KB:

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

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

    MD5 sum: c2972c4d9b3e29c03d5f2af86249876f

Bash (4.1) - 6,444 KB:

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

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

    MD5 sum: 9800d8724815fd84994d9be65ab5e7b8

Binutils (2.20) - 17,096 KB:

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

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

    MD5 sum: ee2d3e996e9a2d669808713360fa96f8

Bison (2.4.1) - 1,433 KB:

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

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

    MD5 sum: 84e80a2a192c1a4c02d43fbf2bcc4ca4

Bzip2 (1.0.5) - 822 KB:

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

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

    MD5 sum: 3c15a0c8d1d3ee1c46a1634d00617b1a

Coreutils (8.4) - 10,273 KB:

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

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

    MD5 sum: 56f549854d723d9dcebb77919019df55

DejaGNU (1.4.4) - 1,055 KB:

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

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

    MD5 sum: 053f18fd5d00873de365413cab17a666

Diffutils (2.8.1) - 762 KB:

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

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

    MD5 sum: 71f9c5ae19b60608f6c7f162da86a428

E2fsprogs (1.41.10) - 4,363 KB:

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

    ダウンロード: http://prdownloads.sourceforge.net/e2fsprogs/
    e2fsprogs-1.41.10.tar.gz

    MD5 sum: f9c7bb5c036a119453ce02fa871038da

Expect (5.43.0) - 513 KB:

    ホームページ: http://expect.nist.gov/

    ダウンロード: http://expect.nist.gov/src/expect-5.43.0.tar.gz

    MD5 sum: 43e1dc0e0bc9492cf2e1a6f59f276bc3

File (5.04) - 607 KB:

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

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

    MD5 sum: accade81ff1cc774904b47c72c8aeea0

    注記

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

Findutils (4.4.2) - 2,100 KB:

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

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

    MD5 sum: 351cc4adb07d54877fa15f75fb77d39f

Flex (2.5.35) - 1,227 KB:

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

    ダウンロード: http://prdownloads.sourceforge.net/flex/
    flex-2.5.35.tar.bz2

    MD5 sum: 10714e50cea54dc7a227e3eddcd44d57

Gawk (3.1.7) - 2,310 KB:

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

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

    MD5 sum: 674cc5875714315c490b26293d36dfcf

GCC (4.4.3) - 61,470 KB:

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

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

    MD5 sum: fe1ca818fc6d2caeffc9051fe67ff103

GDBM (1.8.3) - 223 KB:

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

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

    MD5 sum: 1d1b1d5c0245b1c00aff92da751e9aa1

Gettext (0.17) - 11,368 KB:

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

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

    MD5 sum: 58a2bc6d39c0ba57823034d55d65d606

Glibc (2.11.1) - 15,302 KB:

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

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

    MD5 sum: 6856d5d8b1239556687f0d1217f3f266

GMP (5.0.0) - 1,907 KB:

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

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

    MD5 sum: 46fc3a85a3fecc98a4bbd498a83ee459

Grep (2.5.4) - 706 KB:

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

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

    MD5 sum: 5650ee2ae6ea4b39e9459d7d0585b315

Groff (1.20.1) - 3,510 KB:

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

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

    MD5 sum: 48fa768dd6fdeb7968041dd5ae8e2b02

GRUB (1.97.2) - 1,219 KB:

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

    ダウンロード: ftp://alpha.gnu.org/gnu/grub/grub-1.97.2.tar.gz

    MD5 sum: db4d23fb8897523a7e484e974ae3d1c9

Gzip (1.4) - 886 KB:

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

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

    MD5 sum: e381b8506210c794278f5527cba0e765

Iana-Etc (2.30) - 201 KB:

    ホームページ: http://sethwklein.net/iana-etc

    ダウンロード: http://sethwklein.net/iana-etc-2.30.tar.bz2

    MD5 sum: 3ba3afb1d1b261383d247f46cb135ee8

Inetutils (1.7) - 1,861 KB:

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

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

    MD5 sum: a1d5a01b0ab8a7e596ac4cff0cce7129

IPRoute2 (2.6.31) - 364 KB:

    ホームページ: http://linux-net.osdl.org/index.php/Iproute2

    ダウンロード: http://developer.osdl.org/dev/iproute2/download/
    iproute2-2.6.31.tar.bz2

    MD5 sum: 230f35282a95451622f3e8394f9cd80a

Kbd (1.15.1) - 1,081 KB:

    ダウンロード: http://ftp.altlinux.com/pub/people/legion/kbd/
    kbd-1.15.1.tar.gz

    MD5 sum: f997c490fe5ede839aacf31da6c4eb06

Less (436) - 297 KB:

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

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

    MD5 sum: 817bf051953ad2dea825a1cdf460caa4

LFS-Bootscripts (20100124) - 42 KB:

    ダウンロード: http://www.linuxfromscratch.org/lfs/downloads/6.6/
    lfs-bootscripts-20100124.tar.bz2

    MD5 sum: d10f768206badbd9b50bc5507a18a94e

Libtool (2.2.6b) - 2,292 KB:

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

    ダウンロード: http://ftp.gnu.org/gnu/libtool/libtool-2.2.6b.tar.gz

    MD5 sum: 07da460450490148c6d2df0f21481a25

Linux (2.6.32.8) - 62,864 KB:

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

    ダウンロード: http://www.kernel.org/pub/linux/kernel/v2.6/
    linux-2.6.32.8.tar.bz2

    MD5 sum: 82023ede52f067fcc55c5e70b02e48ae

    注記

    Linux カーネルはわりと頻繁に更新されます。 多くの場合はセキュリティ
    脆弱性の発見によるものです。 特に正誤情報 (errata) のページにて説明
    がない限りは、入手可能な最新の 2.6.32.x カーネルを用いてください。

    低速度のネットワークや高負荷の帯域幅を利用するユーザーが Linux カー
    ネルをアップデートしようとする場合は、同一バージョンのカーネルパッ
    ケージとそのパッチを個別にダウンロードする方法もあります。 その場合
    、時間の節約を図ることができ、あるいはマイナーバージョンが同一であ
    れば複数パッチを当ててアップグレードする作業時間の短縮が図れます。

M4 (1.4.13) - 985 KB:

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

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

    MD5 sum: 28f9ccd3ac4da45409251008b911d677

Make (3.81) - 1,125 KB:

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

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

    MD5 sum: 354853e0b2da90c527e35aabb8d6f1e6

Man-DB (2.5.6) - 2,045 KB:

    ホームページ: http://www.nongnu.org/man-db/

    ダウンロード: http://download.savannah.gnu.org/releases/man-db/
    man-db-2.5.6.tar.gz

    MD5 sum: 69585b19c5600a863f1a0d7b7f283975

Man-pages (3.23) - 1,066 KB:

    ホームページ: http://www.kernel.org/doc/man-pages/

    ダウンロード: http://www.kernel.org/pub/linux/docs/manpages/Archive
    /man-pages-3.23.tar.bz2

    MD5 sum: 153704ffa27160d708e0e8c56c1da58f

Module-Init-Tools (3.11.1) - 196 KB:

    ホームページ: http://www.kerneltools.org/KernelTools.org

    ダウンロード: http://www.kernel.org/pub/linux/utils/kernel/
    module-init-tools/module-init-tools-3.11.1.tar.bz2

    MD5 sum: 28dfcb9e24cdbeb12b99ac1eb8af7dea

MPFR (2.4.2) - 1,053 KB:

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

    ダウンロード: http://www.mpfr.org/mpfr-2.4.2/mpfr-2.4.2.tar.bz2

    MD5 sum: 89e59fe665e2b3ad44a6789f40b059a0

Ncurses (5.7) - 2,388 KB:

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

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

    MD5 sum: cce05daf61a64501ef6cd8da1f727ec6

Patch (2.6.1) - 248 KB:

    ホームページ: http://directory.fsf.org/project/patch/

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

    MD5 sum: 0818d1763ae0c4281bcdc63cdac0b2c0

Perl (5.10.1) - 11,336 KB:

    ホームページ: http://cpan.org/

    ダウンロード: http://cpan.org/src/5.0/perl-5.10.1.tar.bz2

    MD5 sum: 82400c6d34f7b7b43d0196c76cd2bbb1

Pkg-config (0.23) - 1,009 KB:

    ホームページ: http://pkg-config.freedesktop.org/

    ダウンロード: http://pkgconfig.freedesktop.org/releases/
    pkg-config-0.23.tar.gz

    MD5 sum: d922a88782b64441d06547632fd85744

Procps (3.2.8) - 279 KB:

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

    ダウンロード: http://procps.sourceforge.net/procps-3.2.8.tar.gz

    MD5 sum: 9532714b6846013ca9898984ba4cd7e0

Psmisc (22.10) - 307 KB:

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

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

    MD5 sum: e881383e7f399121cd0ce744f97d91a5

Readline (6.1) - 2,209 KB:

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

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

    MD5 sum: fc2f7e714fe792db1ce6ddc4c9fb4ef3

Sed (4.2.1) - 878 KB:

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

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

    MD5 sum: 7d310fbd76e01a01115075c1fd3f455a

Shadow (4.1.4.2) - 1,748 KB:

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

    ダウンロード: ftp://pkg-shadow.alioth.debian.org/pub/pkg-shadow/
    shadow-4.1.4.2.tar.bz2

    MD5 sum: d593a9cab93c48ee0a6ba056db8c1997

Sysklogd (1.5) - 85 KB:

    ホームページ: http://www.infodrom.org/projects/sysklogd/

    ダウンロード: http://www.infodrom.org/projects/sysklogd/download/
    sysklogd-1.5.tar.gz

    MD5 sum: e053094e8103165f98ddafe828f6ae4b

Sysvinit (2.86) - 97 KB:

    ダウンロード: ftp://ftp.cistron.nl/pub/people/miquels/sysvinit/
    sysvinit-2.86.tar.gz

    MD5 sum: 7d5d61c026122ab791ac04c8a84db967

Tar (1.22) - 2,046 KB:

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

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

    MD5 sum: 07fa517027f426bb80f5f5ff91b63585

Tcl (8.5.8) - 4,348 KB:

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

    ダウンロード: http://prdownloads.sourceforge.net/tcl/
    tcl8.5.8-src.tar.gz

    MD5 sum: 7f123e53b3daaaba2478d3af5a0752e3

Texinfo (4.13a) - 2,687 KB:

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

    ダウンロード: http://ftp.gnu.org/gnu/texinfo/texinfo-4.13a.tar.gz

    MD5 sum: 71ba711519209b5fb583fed2b3d86fcb

Udev (151) - 498 KB:

    ホームページ: http://www.kernel.org/pub/linux/utils/kernel/hotplug/
    udev.html

    ダウンロード: http://www.kernel.org/pub/linux/utils/kernel/hotplug/
    udev-151.tar.bz2

    MD5 sum: aeae0e6273dcbec246c3c1b9868ebed1

Udev Configuration Tarball - 11 KB:

    ダウンロード: http://www.linuxfromscratch.org/lfs/downloads/6.6/
    udev-config-20100128.tar.bz2

    MD5 sum: 6936d036a00714fe9d062627f5496278

Util-linux-ng (2.17) - 3,680 KB:

    ホームページ: http://userweb.kernel.org/~kzak/util-linux-ng/

    ダウンロード: http://www.kernel.org/pub/linux/utils/util-linux-ng/
    v2.17/util-linux-ng-2.17.tar.bz2

    MD5 sum: 11cc8a0138019e7060dd275d47dbc096

Vim (7.2) - 7,035 KB:

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

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

    MD5 sum: f0901284b338e448bfd79ccca0041254

Vim (7.2) language files (optional) - 1,365 KB:

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

    ダウンロード: ftp://ftp.vim.org/pub/vim/extra/vim-7.2-lang.tar.gz

    MD5 sum: d8884786979e0e520c112faf2e176f05

Zlib (1.2.3) - 415 KB:

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

    ダウンロード: http://www.zlib.net/zlib-1.2.3.tar.bz2

    MD5 sum: dee233bf288ee795ac96a98cc2e369b6

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

3.3. 必要なパッチ

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

日本語訳情報

各パッチには簡略な名称がつけられていますが、 これを日本語に訳してしまう
と、パッチの特定ができなくなることが考えられるため、 訳出せずそのまま表
記することにします。

Bzip2 Documentation Patch - 1.6 KB:

    ダウンロード: http://www.linuxfromscratch.org/patches/lfs/6.6/
    bzip2-1.0.5-install_docs-1.patch

    MD5 sum: 6a5ac7e89b791aae556de0f745916f7f

Coreutils Internationalization Fixes Patch - 118 KB:

    ダウンロード: http://www.linuxfromscratch.org/patches/lfs/6.6/
    coreutils-8.4-i18n-1.patch

    MD5 sum: 13699e7e1c2ab2165dbe9f35c047e804

Coreutils Uname Patch - 4.4 KB:

    ダウンロード: http://www.linuxfromscratch.org/patches/lfs/6.6/
    coreutils-8.4-uname-1.patch

    MD5 sum: 510a730e7bc8fd92daaf47aad4dc1200

Diffutils Internationalization Fixes Patch - 18 KB:

    ダウンロード: http://www.linuxfromscratch.org/patches/lfs/6.6/
    diffutils-2.8.1-i18n-1.patch

    MD5 sum: c8d481223db274a33b121fb8c25af9f7

Expect Spawn Patch - 6.8 KB:

    ダウンロード: http://www.linuxfromscratch.org/patches/lfs/6.6/
    expect-5.43.0-spawn-1.patch

    MD5 sum: ef6d0d0221c571fb420afb7033b3bbba

Expect Tcl Patch - 4.1 KB:

    ダウンロード: http://www.linuxfromscratch.org/patches/lfs/6.6/
    expect-5.43.0-tcl_8.5.5_fix-1.patch

    MD5 sum: 6904a384960ce0e8f0d0b32f7903d7a1

Flex GCC-4.4.x Patch - 1 KB:

    ダウンロード: http://www.linuxfromscratch.org/patches/lfs/6.6/
    flex-2.5.35-gcc44-1.patch

    MD5 sum: ad9109820534278c6dd0898178c0788f

GCC Startfiles Fix Patch - 1.5 KB:

    ダウンロード: http://www.linuxfromscratch.org/patches/lfs/6.6/
    gcc-4.4.3-startfiles_fix-1.patch

    MD5 sum: 799ef1971350d2e3c794f2123f247cc6

Gettext Upstream Fix Patch - 2.9 KB:

    ダウンロード: http://www.linuxfromscratch.org/patches/lfs/6.6/
    gettext-0.17-upstream_fixes-2.patch

    MD5 sum: ae64b6399ed6536e148e8386bcb91689

Grep Debian Patch - 27 KB:

    ダウンロード: http://www.linuxfromscratch.org/patches/lfs/6.6/
    grep-2.5.4-debian_fixes-1.patch

    MD5 sum: 337d017202d7e3b08d428a89da3ee572

Kbd Backspace/Delete Fix Patch - 12 KB:

    ダウンロード: http://www.linuxfromscratch.org/patches/lfs/6.6/
    kbd-1.15.1-backspace-1.patch

    MD5 sum: f75cca16a38da6caa7d52151f7136895

Make Upstream Fixes Patch - 5 KB:

    ダウンロード: http://www.linuxfromscratch.org/patches/lfs/6.6/
    make-3.81-upstream_fixes-1.patch

    MD5 sum: 8b1e478d8e733dc2d72e31bc7af1defa

Patch Testsuite Fix Patch - 1 KB:

    ダウンロード: http://www.linuxfromscratch.org/patches/lfs/6.6/
    patch-2.6.1-test_fix-1.patch

    MD5 sum: c51e1a95bfc5310635d05081472c3534

Perl Libc Patch - 1 KB:

    ダウンロード: http://www.linuxfromscratch.org/patches/lfs/6.6/
    perl-5.10.1-libc-1.patch

    MD5 sum: 800dfd3c9618731ee5cf57f77a7942b4

Perl UTF8 Patch - 8 KB:

    ダウンロード: http://www.linuxfromscratch.org/patches/lfs/6.6/
    perl-5.10.1-utf8-1.patch

    MD5 sum: f0c8a66598708bd7def8e85eed82bb95

Procps Watch Patch - 3.5 KB:

    ダウンロード: http://www.linuxfromscratch.org/patches/lfs/6.6/
    procps-3.2.8-watch_unicode-1.patch

    MD5 sum: cd1a757e532d93662a7ed71da80e6b58

Vim Fixes Patch - 826 KB:

    ダウンロード: http://www.linuxfromscratch.org/patches/lfs/6.6/
    vim-7.2-fixes-5.patch

    MD5 sum: 3af30a47fbf94d141c4317bf87d28e25

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

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

第4章 準備作業の仕上げ

4.1. $LFSについて

本書の中では環境変数 LFS を利用していきます。 この変数は常に定義してお
くことが必要です。 これはLFSパーティションとして選んだマウントポイント
を定義します。 変数 LFS が適切に定義できているかどうかは、以下を実行す
れば確認できます。

echo $LFS

上の出力結果が、LFSパーティションのマウントポイントであることを確認して
ください。 本書に示す例に従っている場合は /mnt/lfs が表示されるはずです
。出力が正しくない場合は、以下のようにして変数をセットします。

export LFS=/mnt/lfs

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

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

4.2. $LFS/tools ディレクトリの生成

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

$LFS/tools ディレクトリは root ユーザーになって以下のコマンドを実行して
生成します。

mkdir -v $LFS/tools

次にホストシステム上に /tools のシンボリックリンクを作成します。 これは
LFS パーティションに生成されたディレクトリを指し示すものです。 root ユ
ーザーのままで以下を実行します。

ln -sv $LFS/tools /

注記

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

シンボリックリンクを作成することで、ツールチェーンをコンパイルする準備
が整いました。 これにより常に /tools ディレクトリを参照したツールチェー
ンが生成できます。 コンパイラ、アセンブラ、リンカは本章において動作し
(いくつかのツール類は依然ホストシステムのものを利用しますが)、次章にお
いても同様に動作します。 (次章では 「chroot」 によって LFS パーティショ
ンに移動して利用します。)

4.3. LFS ユーザーの追加

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

groupadd lfs
useradd -s /bin/bash -g lfs -m -k /dev/null lfs

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

-s /bin/bash

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

-g lfs

    lfs ユーザーのグループを lfs とします。

-m

    lfs ユーザーのホームディレクトリを生成します。

-k /dev/null

    このパラメータは、ディレクトリ名をヌルデバイス (null device) に指定
    しています。 こうすることでスケルトンディレクトリ (デフォルトは /
    etc/skel) からのファイル群のコピーを無効とします。

lfs

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

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

passwd lfs

$LFS/tools ディレクトリの所有者を lfs ユーザーとすることで、このディレ
クトリへのフルアクセス権を設定します。

chown -v lfs $LFS/tools

前述したような作業ディレクトリを作成している場合は、そのディレクトリに
対しても lfs ユーザーを所有者とします。

chown -v lfs $LFS/sources

lfs でログインします。 これはディスプレイマネージャを通じて仮想端末を用
いることができます。 また以下のコマンドを実行するのでも構いません。

su - lfs

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

4.4. 環境設定

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

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

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

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

cat > ~/.bashrc << "EOF"
set +h
umask 022
LFS=/mnt/lfs
LC_ALL=POSIX
LFS_TGT=$(uname -m)-lfs-linux-gnu
PATH=/tools/bin:/bin:/usr/bin
export LFS LC_ALL LFS_TGT PATH
EOF

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

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

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

LC_ALL 変数は特定のプログラムが扱う国情報を制御します。 そのプログラム
が出力するメッセージを、指定された国情報に基づいて構成します。 ホストシ
ステムの Glibc が 2.2.4 よりも古いものであって、この LC_ALL を (本章の
作業中に) 「POSIX」 でもなく 「C」 でもない値にセットしていた場合、
chroot 環境からの exit と再度の環境移行を行う際に問題が発生します。
LC_ALL 変数は 「POSIX」 か 「C」 にセットしてください。 (両者は同じです
。) そのようにセットしておけば、chroot 環境下での作業が問題なく進められ
ます。

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

/tools/bin ディレクトリを PATH 変数の先頭に設定します。 第5章 にてイン
ストールするプログラムは、インストールした直後からシェルによって実行指
示が下されます。 この設定は、ハッシュ機能をオフとしたことと連携して、古
いプログラムが実行されないようにします。 たとえホストシステムとの間で同
一の実行プログラムがあったとしても、第5章の作業環境下では適切なプログラ
ム実行が実現されます。

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

source ~/.bash_profile

4.5. SBU 値について

各パッケージをコンパイルしインストールするのにどれほどの時間を要するか
、誰しも知りたくなるところです。 しかし Linux From Scratch は数多くのシ
ステム上にて構築可能であるため、正確な処理時間を見積ることは困難です。
最も大きなパッケージ (Glibc) の場合、処理性能の高いシステムでも 20 分は
かかります。 それが性能の低いシステムとなると 3日はかかるかもしれませ
ん! 本書では処理時間を正確に示すのでなく、 標準ビルド単位 (Standard
Build Unit; SBU) を用いることにします。

SBU の測定は以下のようにします。 本書で最初にコンパイルするのは 第5章
における Binutils です。 このパッケージのコンパイルに要する時間を標準ビ
ルド時間とし、他のコンパイル時間はその時間からの相対時間として表現しま
す。

例えばあるパッケージのコンパイル時間が 4.5 SBU であったとします。 そし
て Binutils の1回目のコンパイルが 10分であったとすると、そのパッケージ
は およそ 45分かかることを意味しています。 幸いにも、たいていのパッケー
ジは Binutils よりもコンパイル時間は短いものです。

一般にコンパイル時間は、例えばホストシステムの GCC のバージョンの違いな
ど、多くの要因に左右されるため SBU 値は正確なものになりません。 SBU 値
は、インストールに要する時間の目安を示すものに過ぎず、場合によっては十
数分の誤差が出ることもあります。

特定マシンにおける実際の処理時間については、以下の LinuxFromScratch SBU
ホームページに示していますので参照してください。 http://
www.linuxfromscratch.org/~sbu/

注記

最新のシステムは複数プロセッサ (デュアルコアとも言います) であることが
多く、パッケージのビルドにあたっては「同時並行のビルド」によりビルド時
間を削減できます。 その場合プロセッサ数がいくつなのかを環境変数に指定す
るか、あるいは make プログラムの実行時に指定する方法があります。 例えば
コア2デュオであれば、以下のようにして同時並行の二つのプロセスを実行する
ことができます。

set MAKEFLAGS='-j 2'

あるいはビルド時の指定として以下のようにすることもできます。

make -j2

上のようにして複数プロセッサが利用されると、 本書に示している SBU 単位
は、通常の場合に比べて大きく変化します。 したがってビルド結果を検証する
にしても話が複雑になります。 複数のプロセスラインがインターリーブにより
多重化されるためです。 ビルド時に何らかの問題が発生したら、 単一プロセ
ッサ処理を行ってエラーメッセージを分析してください。

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

各パッケージにはたいていテストスイートがあります。 新たに構築したパッケ
ージに対しては、テストスイートを実行しておくのがよいでしょう。 テストス
イートは 「健全性検査 (sanity check)」 を行い、パッケージのコンパイルが
正しく行われたことを確認します。 テストスイートの実行によりいくつかのチ
ェックが行われ、開発者の意図したとおりにパッケージが正しく動作すること
を確認していきます。 ただこれは、パッケージにバグがないことを保証するも
のではありません。

テストスイートの中には他のものにも増して重要なものがあります。 例えば、
ツールチェーンの要である GCC、Binutils、Glibc に対してのテストスイート
です。 これらのパッケージはシステム機能を確実なものとする重要な役割を担
うものであるためです。 GCC と Glibc におけるテストスイートはかなりの時
間を要します。 それが低い性能のマシンであればなおさらです。 でもそれら
を実行しておくことを強く推奨します。

注記

作業を進めてみれば分かることですが 第5章 の作業においてテストスイートを
実行することはあまり意味がありません。 というのも、この章において実施す
るテストに対しては、ホストシステムによるある程度の影響があるためです。
時には不可解なエラーが発生することもあります。 第5章 にて生成するツール
類は一時的なものであり、その後には利用しなくなります。 したがって普通の
ユーザーであれば 第5章 においてはテストスイートを実行しないことをお勧め
します。 テストスイートを実行する手順を説明してはいますが、それはテスタ
ーの方、開発者の方のために説明しているものであって、それらは全くのオプ
ションです。

Binutils と GCC におけるテストスイートの実行では、擬似端末 (pseudo
terminals; PTY) を使い尽くす問題が発生します。 これにより相当数のテスト
が失敗します。 これが発生する理由はいくつかありますが、もっともありがち
な理由としてはホストシステムの devpts ファイルシステムが正しく構成され
ていないことがあげられます。 この点については http://
www.linuxfromscratch.org//lfs/faq.html#no-ptys においてかなり詳しく説明
しています。

パッケージの中にはテストスイートに失敗するものがあります。 しかしこれら
は開発元が認識しているもので致命的なものではありません。 以下の http://
www.linuxfromscratch.org/lfs/build-logs/6.6/ に示すログを参照して、失敗
したテストが実は予期されているものであるかどうかを確認してください。 こ
のサイトは、本書におけるすべてのテストスイートの正常な処理結果を示すも
のです。

第5章 一時的環境の構築

5.1. はじめに

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

最小限のシステムを構築するために、以下の二段階の手順を踏みます。 初めに
ホストシステムに依存しない新しいツールチェーン (コンパイラ、アセンブラ
、リンカ、ライブラリ、その他の有用なユーティリティ) を構築します。 次に
このツールチェーンを使って、他の重要なツール類を構築していきます。

この章にて生成されるファイル群は $LFS/tools ディレクトリ配下にインスト
ールされます。 これらのファイルは、次章にてインストールされるファイル群
や、ホスト環境にあるファイル群とは区分けされます。 ここで構築されるパッ
ケージ類は、あくまで一時的なものであるため、この後に構築する LFS システ
ムを汚したくないためにこのようにします。

5.2. ツールチェーンの技術的情報

本節ではシステムをビルドする原理や技術的な詳細について説明します。 この
節のすべてをすぐに理解する必要はありません。 この先、実際の作業を行って
いけば、いろいろな情報が明らかになってくるはずです。 各作業を進めながら
、いつでもこの節に戻って読み直してみてください。

第5章 の最終目標は一時的なシステム環境を構築することです。 この一時的な
システムには、システム構築のための十分なツール類を有し、ホストシステム
とは切り離されたものです。 この環境へは chroot によって移行します。この
環境は 第6章 において、クリーンでトラブルのない LFS システムの構築を行
う土台となるものです。 構築手順の説明においては、初心者の方であっても失
敗を最小限にとどめ、同時に最大限の学習材料となるように心がけています。

重要項目

これより先に進む前に、作業するプラットフォームの 「三つの組 (target
triplet)」 で表される名称を確認してください。「三つの組」 は
config.guess スクリプトを実行することで簡単に確認できます。 そのスクリ
プトは多くのパッケージのソースに含まれています。 Binutils パッケージの
ソースを伸張 (解凍) し ./config.guess スクリプトを実行してその出力を確
認してみてください。 例えば最近の 32 ビット Intel プロセッサでは
i686-pc-linux-gnu のような出力が得られます。

利用しているプラットフォームに応じたダイナミックリンカ (dynamic linker)
の名前についても確認してください。 ダイナミックローダ (dynamic loader)
とも表現されるものです。 (Binutils が提供する標準的なリンカ ld とは異な
りますので注意してください。) Glibc が提供するこのダイナミックリンカは
、プログラムが必要としている共有ライブラリを見つけ出してロードし、実行
のための準備を行った上で実際に実行します。 32 ビットマシンのダイナミッ
クリンカの名前は ld-linux.so.2 といったものになります。 確実にその名前
を調べるなら、ホストシステム内のどれでも良いので実行モジュールを選んで
readelf -l <実行モジュール名> | grep interpreter と入力します。出力され
る結果を確認してください。 あらゆるプラットフォームの情報を知りたいなら
Glibc のソースディレクトリのルートにある shlib-versions ファイルに記さ
れています。

第5章 におけるビルド手順がどのように機能するのか、その技術的な情報を以
下に示します。

 ・ 動作させているプラットフォームの名前を微妙に変えます。 三つの組の "
    ベンダー " フィールドを変更するもので、 LFS_TGT 変数に定め利用しま
    す。 こうしておいて Binutils と GCC の初回の構築を行なえば、互換性
    のあるクロスコンパイラ、クロスリンカを確実に構築できるようになりま
    す。 もう一つ別のアーキテクチャに対する実行モジュールを作らなくても
    、そのクロスコンパイラとクロスリンカを使えば、生成される実行モジュ
    ールは現在のハードウェアに適合したものとなります。

 ・ 一時的に構築するライブラリはクロスコンパイルにより生成します。 クロ
    スコンパイラというものは元来、ホストシステムへ依存するものではない
    ためです。 こうすることで、ホストシステムのヘッダやライブラリが、一
    時的なツール類を壊してしまうような危険を減らすことができ、同時に 64
    ビットマシンにて 32 ビットあるいは 64 ビットの双方のライブラリを構
    築することができるようになります。

 ・ gcc のスペック (specs) ファイルを適切に調整することで、どのダイナミ
    ックリンカを用いるのかをコンパイラに指示します。

Binutils をまず初めにインストールします。 この後の GCC や Glibc の
configure スクリプトの実行ではアセンブラやリンカに対する様々な機能テス
トが行われるためで、そこではどの機能が利用可能または利用不能であるかが
確認されます。 ただ重要なのは Binutils を一番初めにビルドするという点だ
けではありません。 Gcc や Glibc の configure が正しく処理されなかったと
すると、ツールチェーンがわずかながらも不完全な状態で生成されてしまいま
す。 この状態は、すべてのビルド作業を終えた最後になって、大きな不具合と
なって現れてくることになります。 テストスイートを実行することが欠かせま
せん。 これを実行しておけば、この先に行う多くの作業に入る前に不備がある
ことが分かるからです。

Binutils はアセンブラとリンカを二箇所にインストールします。 /tools/bin
と /tools/$LFS_TGT/bin です。 これらは一方が他方のハードリンクとなって
います。 リンカの重要なところはライブラリを検索する順番です。 ld コマン
ドに --verbose オプションをつけて実行すれば詳しい情報が得られます。 例
えば ld --verbose | grep SEARCH を実行すると、検索するライブラリのパス
とその検索順を示してくれます。 ダミープログラムをコンパイルして ld に
--verbose オプションをつけてリンクを行うと、どのファイルがリンクされた
が分かります。 例えば gcc dummy.c -Wl,--verbose 2>&1 | grep succeeded
と実行すれば、リンカの処理中にオープンに成功したファイルがすべて表示さ
れます。

次にインストールするのは GCC です。 configure の実行時には以下のような
出力が行われます。

checking what assembler to use... /tools/i686-lfs-linux-gnu/bin/as
checking what linker to use... /tools/i686-lfs-linux-gnu/bin/ld

これを示すのには重要な意味があります。 GCC の configure スクリプトは、
利用するツール類を探し出す際に PATH ディレクトリを参照していないという
ことです。 しかし gcc の実際の処理にあたっては、その検索パスが必ず使わ
れるわけでもありません。 gcc が利用する標準的なリンカを確認するには gcc
-print-prog-name=ld を実行します。

さらに詳細な情報を知りたいときは、ダミープログラムをコンパイルする際に
-v オプションをつけて実行します。 例えば gcc -v dummy.c と入力すると、
プリプロセッサ、コンパイル、アセンブルの各処理工程が示されますが、さら
に gcc がインクルードした検索パスとその読み込み順も示されます。

次のパッケージは Glibc です。 Glibc 構築の際に気にかけるべき重要なもの
は、コンパイラ、バイナリツール、カーネルヘッダです。 コンパイラについて
は、一般にはあまり問題にはなりません。 Glibc は常に configure スクリプ
トにて指定される --host パラメータに関連づけしたコンパイラを用いるから
です。 我々の作業では i686-lfs-linux-gnu-gcc になります。 バイナリツー
ルとカーネルヘッダは多少複雑です。 従って無理なことはせずに有効な
configure オプションを選択することが必要です。 configure 実行の後は
glibc-build ディレクトリにある config.make ファイルに重要な情報が示され
ているので確認してみてください。 なお CC="i686-lfs-gnu-gcc" とすれば、
どこにある実行モジュールを利用するかを制御でき -nostdinc と -isystem を
指定すれば、コンパイラに対してインクルードファイルの検索パスを制御でき
ます。 これらの指定は Glibc パッケージの重要な面を示しています。 Glibc
がビルドされるメカニズムは自己完結したビルドが行われるものであり、ツー
ルチェーンのデフォルト設定には基本的に依存しないことを示しています。

Glibc をインストールした後は、 gcc のスペックファイルにて /tools/lib デ
ィレクトリにある新しいダイナミックリンカを用いるような修正を行います。
この修正により /tools 内での検索とリンクが行われるようにします。 ダイナ
ミックリンカに対する固定的な検索パスの設定は、ここから生成されるすべて
の ELF (Executable and Link Format) 形式の実行モジュールにも埋め込まれ
ていきます。 その結果は readelf -l <実行モジュール名> | grep
interpreter を実行すれば確認できます。 gcc のスペック・ファイルを修正す
るのは、これ以降、本章の最後に至るまで、すべてのプログラムのコンパイル
時に /tools/lib にあるダイナミックリンカが利用されるよう仕向けるもので
す。

GCC の第2回目のビルドにおいても、スペックファイルを修正して新しいダイナ
ミックリンカが用いられるようにします。 これをもし誤ってしまうと、ホスト
システムの /lib ディレクトリが埋め込まれたダイナミックリンカを用いるも
のとして GCC が生成されてしまいます。 こうしてしまうと、ホストシステム
に依存しない形を目指すという目的が達成できません。

Binutils の2回めのビルドにおいては ld コマンドのライブラリ検索パスを設
定するために configure の --with-lib-path オプションを指定します。 それ
以降ツールチェーンの核となるツール類は、自分自身から作り出された
(self-contained) 自分だけで処理できる (self-hosted) 形となります。 第5
章 において構築する残りのパッケージは /tools ディレクトリの新しい Glibc
を用いてビルドされます。

第6章 での chroot による環境下では、実質的なパッケージとして Glibc を初
めにビルドします。 これは上に述べているように自己完結した性質を目指すた
めです。 /usr に Glibc をインストールしたら、ツールチェーンのデフォルト
ディレクトリの変更を行い LFS システムを構築する残りのパッケージをビルド
していきます。

5.3. 全般的なコンパイル手順

パッケージをビルドしていく際には、以下に示す内容を前提とします:

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

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

    重要項目

    各パッケージをインストールした後は、特に具体的な指示がない限りは、
    そのソースディレクトリやビルドディレクトリは削除してください。 ソー
    スディレクトリを削除するのは、後にもう一度そのパッケージをインスト
    ールする際に、構築のミスを防ぐためです。

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

    echo $LFS

    上の出力結果が LFS パーティションのマウントポイントのディレクトリで
    あることを確認してください。 本書では /mnt/lfs ディレクトリとして説
    明しています。

 ・ 最後に以下の二つの点にも注意してください。

    重要項目

    ビルド作業においては bash シェルの利用を想定しています。

    重要項目

    パッケージのビルド操作を進めるために、まずは lfs ユーザーによってパ
    ッケージファイルの伸張 (解凍) を行い、cd コマンドによりそのパッケー
    ジディレクトリに移動します。

5.4. Binutils-2.20 - 1回め

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

概算ビルド時間: 1 SBU
必要ディスク容量: 248 MB

5.4.1. クロスコンパイル版 Binutils のインストール

注記

前の節に戻って再度説明をよく読み、重要事項として説明している内容をよく
理解しておいてください。 そうすればこの後の無用なトラブルを減らすことが
できるはずです。

Binutils は一番最初にビルドするパッケージです。 ここでビルドされるリン
カやアセンブラを使って、Glibc や GCC の様々な機能が利用できるかどうかを
判別することになります。

Binutils のドキュメントでは Binutils をビルドする際に、ソースディレクト
リではなく、ビルド専用のディレクトリを使ってビルドすることを推奨してい
ます。

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

注記

本節以降で SBU値を示していきます。 これを活用していくなら、本パッケージ
の configure から初めのインストールまでの処理時間を計測しましょう。 具
体的には処理コマンドを time で囲んで time { ./configure ... && make &&
make install; } と入力すれば実現できます。

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

../binutils-2.20/configure \
    --target=$LFS_TGT --prefix=/tools \
    --disable-nls --disable-werror

configure オプションの意味：

--target=$LFS_TGT

    変数 LFS_TGT に設定しているマシン名は config.guess スクリプトが返す
    ものとは微妙に異なります。 そこでこのオプションは、Binutils のビル
    ドにあたってクロスリンカをビルドするように configure スクリプトに指
    示するものです。

--prefix=/tools

    configure スクリプトに対して Binutils プログラムを /tools ディレク
    トリ以下にインストールすることを指示します。

--disable-nls

    一時的なツール構築にあたっては i18n 国際化は行わないことを指示しま
    す。

--disable-werror

    ホストのコンパイラが警告を発した場合に、ビルドが中断することがない
    ようにします。

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

make

コンパイルが終了しました。通常ならここでテストスイートを実行します。 し
かしシステム構築初期のこの段階ではテストスイートのフレームワーク (Tcl,
Expect, DejaGNU) が準備できていません。 さらにこの時点で生成されるプロ
グラムは、すぐに次の生成作業によって置き換えられますから、 この時点でテ
ストを実行することはあまり意味がありません。

x86_64 にて作業をしている場合は、ツールチェーンの切り分けを適切に行うた
めにシンボリックリンクを作成します。

case $(uname -m) in
  x86_64) mkdir -v /tools/lib && ln -sv lib /tools/lib64 ;;
esac

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

make install

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

5.5. GCC-4.4.3 - 1回め

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

概算ビルド時間: 5.0 SBU
必要ディスク容量: 809 MB

5.5.1. クロスコンパイル版 GCC のインストール

最近の GCC は GMP パッケージと MPFR パッケージを必要とします。 これらの
パッケージはホストシステムに含まれていないかもしれないため、以下を実行
してビルドの準備をします。

tar -jxf ../mpfr-2.4.2.tar.bz2
mv -v mpfr-2.4.2 mpfr
tar -jxf ../gmp-5.0.0.tar.bz2
mv -v gmp-5.0.0 gmp

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

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

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

../gcc-4.4.3/configure \
    --target=$LFS_TGT --prefix=/tools \
    --disable-nls --disable-shared --disable-multilib \
    --disable-decimal-float --disable-threads \
    --disable-libmudflap --disable-libssp \
    --disable-libgomp --enable-languages=c

configure オプションの意味：

--disable-shared

    このオプションは内部ライブラリをスタティックライブラリとしてリンク
    することを指示します。 ホストシステムに関係しそうな問題を回避するた
    めです。

--disable-decimal-float, --disable-threads, --disable-libmudflap,
    --disable-libssp, --disable-libgomp

    これらのオプションは順に、十進浮動小数点制御、スレッド処理、
    libmudflap、libssp、libgomp のサポートをいずれも無効にすることを指
    示します。 これらの機能を含めていると、クロスコンパイラをビルドする
    際にはコンパイルに失敗します。 またクロスコンパイルによって一時的な
    libc ライブラリを構築する際には不要なものです。

--disable-multilib

    x86_64 に対して LFS は まだ multilib のサポートをしていません。 こ
    のオプション指定は x86 には無関係です。

--enable-languages=c

    このオプションは C コンパイラのみビルドすることを指示します。 この
    時点で必要なのはこの言語だけだからです。

GCC をコンパイルします。

make

コンパイルが終了しました。 この時点でもテストスイートを実行することはで
きます。 ただ前にも述べているように、テストスイートのフレームワークがま
だ準備できていません。 さらにこの時点で生成されるプログラムは、すぐに次
の生成作業によって置き換えられますから、 この時点でテストを実行すること
はあまり意味がありません。

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

make install

--disable-shared オプションを指定すると libgcc_eh.a を生成せずインスト
ールしません。 Glibc パッケージはこのライブラリに依存しており、ビルドの
際に -lgcc_eh を指定することで利用されます。依存している点は libgcc.a
へのシンボリックリンクを生成しておけば問題はありません。 libgcc_eh.a に
含まれるオブジェクトが、 最終的には libgcc.a の中にも含まれることになる
からです。

ln -vs libgcc.a `$LFS_TGT-gcc -print-libgcc-file-name | \
    sed 's/libgcc/&_eh/'`

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

5.6. Linux-2.6.32.8 API ヘッダ

Linux API ヘッダは Glibc が利用するカーネル API を提供します。

概算ビルド時間: 0.1 SBU
必要ディスク容量: 431 MB

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

Linux カーネルはアプリケーションプログラミングインターフェース
(Application Programming Interface) を、システムの C ライブラリ (LFS の
場合 Glibc) に対して提供する必要があります。 これを行うには Linux カー
ネルのソースに含まれる、さまざまな C ヘッダファイルを「健全化
(sanitizing)」して利用します。

これより前に一度処理を行っていたとしても、不適切なファイルや誤った依存
関係を残さないように、以下を処理します。

make mrproper

そしてユーザーが利用するカーネルヘッダファイルをテストし、ソースから抽
出します。 それらはいったん中間的なローカルディレクトリに置かれ、必要な
場所にコピーされます。 ターゲットディレクトリに既にあるファイルは削除さ
れてからソースからの抽出処理が行われます。

make headers_check
make INSTALL_HDR_PATH=dest headers_install
cp -rv dest/include/* /tools/include

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

5.7. Glibc-2.11.1

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

概算ビルド時間: 6.9 SBU
必要ディスク容量: 371 MB

5.7.1. Glibc のインストール

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

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

Glibc は i386 をサポートしなくなりました。開発者によると x86 マシンに対
してはコンパイラフラグとして -march=i486 を指定する必要があります。 こ
れを実際に指定する方法はいくつかあります。 もっとも試してみれば分かりま
すが、ビルド時の変数 「CFLAGS」 にて設定しておくのが一番です。 Glibc の
内部的なビルドシステムが利用する CFLAGS を上書き設定するのとは別に
configparms ファイルという特別なファイルを使って CFLAGS に対して追加設
定を行うこともできます。 -mtune=native というフラグも必要で -march を設
定した際に変更される -mtune の値を適切にリセットします。

case `uname -m` in
  i?86) echo "CFLAGS += -march=i486 -mtune=native" > configparms ;;
esac

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

../glibc-2.11.1/configure --prefix=/tools \
    --host=$LFS_TGT --build=$(../glibc-2.11.1/scripts/config.guess) \
    --disable-profile --enable-add-ons \
    --enable-kernel=2.6.18 --with-headers=/tools/include \
    libc_cv_forced_unwind=yes libc_cv_c_cleanup=yes

configure オプションの意味：

--host=$LFS_TGT, --build=$(../glibc-2.11.1/scripts/config.guess)

    このようなオプションを組み合わせることで /tools ディレクトリにある
    クロスコンパイラ、クロスリンカを使って Glibc がクロスコンパイルされ
    るようになります。

--disable-profile

    プロファイル情報を含めずにライブラリをビルドすることを指示します。
    一時的なツールにてプロファイル情報が必要な場合は、このオプションを
    取り除いてください。

--enable-add-ons

    スレッド処理のライブラリとして NPTL アドオンを利用することを指示し
    ます。

--enable-kernel=2.6.18

    Linux カーネル 2.6.18 以上のサポートを行うよう指示します。 これ以前
    のカーネルは利用することができません。

--with-headers=/tools/include

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

libc_cv_forced_unwind=yes

    5.4. 「Binutils-2.20 - 1回め」 においてインストールしたリンカは、ク
    ロスコンパイルにより生成したものです。 これは Glibc をインストール
    するまでは使えません。 これはつまり force-unwind サポートに対するテ
    ストは失敗することを意味します。 正しく動作するリンカに依存するため
    です。 libc_cv_forced_unwind=yes の変数設定は、 configure スクリプ
    トに対して テストを実行しなくても force-unwind サポート機能を利用可
    能とすることを指示します。

libc_cv_c_cleanup=yes

    上と同様に configure スクリプトに対して libc_cv_c_cleanup=yes を指
    示します。 これによりテストが省略され、C のクリーンアップハンドリン
    グ (cleanup handling) のサポートを指定します。

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

    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 パッケージが提供
するもので、ホストシステムに含まれているかもしれません。

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

make

このパッケージにテストスイートは存在しますが、ここで実行することはでき
ません。 この時点ではまだ C++ コンパイラを構築していないためです。

注記

テストスイートを正しく実行するためには、さらにロケールデータも必要にな
ります。 ロケールデータは、システム内の各種ユーティリティが、日付、時刻
、通貨などの情報を利用したり出力したりするために用いられるものです。 テ
ストスイートの実行は不要と説明していることから、これに従って実行しない
場合はロケールデータをここでインストールする必要はありません。 適切なロ
ケールデータは次章にてインストールします。 それでもここでインストールす
るなら 6.9. 「Glibc-2.11.1」 に示される手順に従ってください。

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

make install

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

5.8. ツールチェーンの調整

一時的な C ライブラリをインストールしました。 これ以降の章でコンパイル
していくツール類は、このライブラリをリンクしていきます。 リンクを行うに
はクロスコンパイラのスペックファイルを修正して /tools ディレクトリにあ
るダイナミックリンカを指し示すようにします。

具体的にはコンパイラの 「スペック (specs) 」 ファイルをダンプして、これ
が参照されるディレクトリに置きます。 以下では単純な sed コマンドによる
置換によって GCC が利用するダイナミックリンカを変更します。 ここで為す
ことは /lib ディレクトリ内 (ホストが 64 ビットなら /lib64 ディレクトリ
内) のダイナミックリンカファイルへの参照を探し出し、これを新しい /tools
への参照へと調整することです。

作業を正確に行うために、以下のコマンド実行にあたってはコピー・ペースト
によりコマンド入力を行うことをお勧めします。 そしてスペックファイルを開
いて、ダイナミックリンカの配置場所を示す記述がすべて適切に調整されてい
ることを確認してください。 必要に応じて 5.2. 「ツールチェーンの技術的情
報」 を読み直し、ダイナミックリンカのデフォルト名を確認してください。

SPECS=`dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/specs
$LFS_TGT-gcc -dumpspecs | sed \
  -e 's@/lib\(64\)\?/ld@/tools&@g' \
  -e "/^\*cpp:$/{n;s,$, -isystem /tools/include,}" > $SPECS
echo "New specs file is: $SPECS"
unset SPECS

注意

この時点において新しく構築したツールチェーンの基本的な (コンパイルやリ
ンクなどの) 機能が正しく動作していることを確認する必要があります。 健全
性検査 (sanity check) を行うために以下を実行してください。

echo 'main(){}' > dummy.c
$LFS_TGT-gcc -B/tools/lib dummy.c
readelf -l a.out | grep ': /tools'

問題なく動作した場合はエラーがなかったということで、最後のコマンドから
出力される結果は以下のようになるはずです。

[Requesting program interpreter: /tools/lib/ld-linux.so.2]

ダイナミックリンカのディレクトリは /tools/lib に、あるいは 64 ビットマ
シンであれば /tools/lib64 になります。

コマンドの出力結果が上と異なっていたり、あるいは何も出力されなかった場
合は、何かがおかしいことを意味します。 どこに問題があるのか調査・再試行
を行って解消してください。 解決せずにこの先に進まないでください。 おか
しいとすれば、上で行ったスペックファイルの修正に何か問題があったのかも
しれません。 もしそうであったなら、スペックファイルの修正を、コマンドの
コピー・ペースト作業に十分注意して再度行ってください。

すべてが終了したらテストファイルを削除します。

rm -v dummy.c a.out

注記

次節にてビルドする Binutils では、ツールチェーンが正しくビルドできてい
るかどうかを改めてチェックします。 もし Binutils のビルドが失敗したなら
、それはここまでに行ってきた Binutils、GCC、Glibc のビルドに失敗してい
ることを意味します。

5.9. Binutils-2.20 - 2回め

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

概算ビルド時間: 1.3 SBU
必要ディスク容量: 259 MB

5.9.1. Binutils のインストール

ビルドのためのディレクトリを再び生成します。

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

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

CC="$LFS_TGT-gcc -B/tools/lib/" \
   AR=$LFS_TGT-ar RANLIB=$LFS_TGT-ranlib \
   ../binutils-2.20/configure --prefix=/tools \
   --disable-nls --with-lib-path=/tools/lib

configure オプションの意味：

CC="$LFS_TGT-gcc -B/tools/lib/" AR=$LFS_TGT-ar RANLIB=$LFS_TGT-ranlib

    Binutils をネイティブにビルドすることが目的なので、ホストシステムに
    存在しているクロスコンパイラや関連ツールは使わず、ビルドしているシ
    ステム内のものを用いるように指定します。

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

    configure スクリプトに対して Binutils のコンパイル中でのライブラリ
    パスを指定します。 リンカに対して /tools/lib ディレクトリを指定する
    ものです。 こうすることでリンカがホスト上のライブラリを検索しないよ
    うにします。

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

make

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

make install

次章で行う「再調整」の作業に向けてリンカを準備します。

make -C ld clean
make -C ld LIB_PATH=/usr/lib:/lib
cp -v ld/ld-new /tools/bin

make パラメータの意味：

-C ld clean

    サブディレクトリ ld にコンパイル生成されたプログラムをすべて削除し
    ます。

-C ld LIB_PATH=/usr/lib:/lib

    サブディレクトリ ld の中に生成されるべきプログラムを再生成します。
    Makefile ファイル内の変数 LIB_PATH をコマンドラインから与えることで
    、一時的なツール類の設定を上書き指定し、適切なパスを指示します。 こ
    の変数の設定はリンカに対するデフォルトの検索パスを指定するものであ
    り、次章に向けた準備となります。

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

5.10. GCC-4.4.3 - 2回め

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

概算ビルド時間: 9.0 SBU
必要ディスク容量: 1003 MB

5.10.1. GCC のインストール

バージョン 4.3 以降の GCC を用いてここでのビルド作業を行うと、出来上が
るのは再配置可能なコンパイラ (relocated compiler) であり、--prefix パラ
メータによって指定されたディレクトリからの起動ファイル (startfiles) の
探索が行われないものになります。 しかしここで作り出すのは再配置可能なコ
ンパイラではなく、 /tools ディレクトリにある起動ファイルは /tools ディ
レクトリ内のライブラリにリンクされたコンパイラを作り出すことが必要であ
るため、以下のパッチを適用します。 このパッチは、部分的に GCC の古い機
能を復活させるものです。

patch -Np1 -i ../gcc-4.4.3-startfiles_fix-1.patch

通常の利用環境において GCC が提供する fixincludes スクリプトは、根本的
に不備のあるヘッダファイルを修正する目的で利用されます。 しかしこの時点
で GCC-4.4.3 と Glibc-2.11.1 を既にインストールしており、それぞれのヘッ
ダファイルは修正する必要がないことが分かっています。 つまり fixincludes
スクリプトを利用する必要がありません。 もし実行してしまうと、ホストシス
テムに既に存在していたヘッダファイルが修正され、それが GCC のプライベー
トなディレクトリへとインストールされることになり、ビルド環境を壊してし
まうことになります。 そこで fixincludes スクリプトの実行を無効とするた
めに以下を実行します。

cp -v gcc/Makefile.in{,.orig}
sed 's@\./fixinc\.sh@-c true@' gcc/Makefile.in.orig > gcc/Makefile.in

x86 マシンにおいてブートストラップビルドを行うと、コンパイラフラグ
-fomit-frame-pointer が設定されます。 しかしブートストラップではないビ
ルドの場合はデフォルトではこのフラグが無効化されてしまいます。 ここで実
現したいのは、ブートストラップビルドを行った場合とまったく同じコンパイ
ラをビルドすることです。 そこで以下の sed コマンドにより、強制的に上の
フラグを利用するようにします。

cp -v gcc/Makefile.in{,.tmp}
sed 's/^T_CFLAGS =$/& -fomit-frame-pointer/' gcc/Makefile.in.tmp \
  > gcc/Makefile.in

以下のコマンドは GCC が利用するダイナミックリンカの場所を変更して /
tools ディレクトリにインストールしたものを用いるようにします。 同時に
GCC が探索するインクルードファイルのパスから /usr/include を取り除きま
す。 インストールの後にスペックファイルを調整する方法もありますが、今こ
こでこのようにするのは GCC の実際のビルドにおいて新しいダイナミックリン
カを用いるようにするためです。 つまりここでのビルドを通じてすべての実行
モジュール類を新しい Glibc に対してリンクするものです。 以下のコマンド
によりそれを実現します。

for file in \
 $(find gcc/config -name linux64.h -o -name linux.h -o -name sysv4.h)
do
  cp -uv $file{,.orig}
  sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \
  -e 's@/usr@/tools@g' $file.orig > $file
  echo '
#undef STANDARD_INCLUDE_DIR
#define STANDARD_INCLUDE_DIR 0
#define STANDARD_STARTFILE_PREFIX_1 ""
#define STANDARD_STARTFILE_PREFIX_2 ""' >> $file
  touch $file.orig
done

上のコマンドがよく分からない場合は一つ一つ読み下していってください。 ま
ず gcc/config ディレクトリには linux.h、 linux64.h、 sysv4.h といったフ
ァイルのいずれかがあるはずです。 それらが存在したら、ファイル名称の末尾
に 「.orig」 をつけたファイルとしてコピーします。 そして一つめの sed コ
マンドでは、そのファイル内にある 「/lib/ld」、 「/lib64/ld」、 「/lib32
/ld」 という記述部分の頭に 「/tools」 を付与します。 また二つめの sed
コマンドによってハードコーディングされている 「/usr」 という部分を書き
換えます。 そしてここで加えるべき定義文をファイルの末尾に追加し、検索パ
スと startfile プリフィックスを変更します。 最後に touch によってコピー
したファイルのタイムスタンプを更新します。 cp -u を用いるのは、誤ってコ
マンドを二度起動したとしてもオリジナルファイルを壊さないようにするため
です。

x86_64 では GCC の multilib スペックを無効化します。 これはホスト上のラ
イブラリにリンクされないようにするためです。

case $(uname -m) in
  x86_64)
    for file in $(find gcc/config -name t-linux64) ; do \
      cp -v $file{,.orig}
      sed '/MULTILIB_OSDIRNAMES/d' $file.orig > $file
    done
  ;;
esac

GCC を初めてビルドする際には GMP パッケージと MPFR パッケージを必要とし
ます。 tarball を解凍して、所定のディレクトリ名に移動させます。

tar -jxf ../mpfr-2.4.2.tar.bz2
mv -v mpfr-2.4.2 mpfr
tar -jxf ../gmp-5.0.0.tar.bz2
mv -v gmp-5.0.0 gmp

専用のディレクトリを再度生成します。

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

GCC のビルドに入る前に、デフォルトの最適化フラグを上書きするような環境
変数の設定がないことを確認してください。

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

CC="$LFS_TGT-gcc -B/tools/lib/" \
    AR=$LFS_TGT-ar RANLIB=$LFS_TGT-ranlib \
    ../gcc-4.4.3/configure --prefix=/tools \
    --with-local-prefix=/tools --enable-clocale=gnu \
    --enable-shared --enable-threads=posix \
    --enable-__cxa_atexit --enable-languages=c,c++ \
    --disable-libstdcxx-pch --disable-multilib \
    --disable-bootstrap

configure オプションの意味：

--enable-clocale=gnu

    このオプションはあらゆる状況において C++ ライブラリに対するロケール
    モデルが正しく設定されるようにします。 configure スクリプト実行時に
    de_DE ロケールがインストール済みであることが分かれば、正しい GNU ロ
    ケールモデルが設定されます。 しかし de_DE ロケールがインストールさ
    れていなかったら、誤った汎用ロケールモデルが設定されてしまうため、
    アプリケーションバイナリインターフェース (Application Binary
    Interface; ABI) とは非互換の C++ ライブラリが生成されてしまう可能性
    があります。

--enable-threads=posix

    マルチスレッドコードを扱う C++ の例外処理を有効にします。

--enable-__cxa_atexit

    このオプションは atexit を使用せず __cxa_atexit の使用を有効にしま
    す。 これによりローカルなスタティックオブジェクトおよびグローバルオ
    ブジェクトに対する C++ デストラクタを登録します。 このオプションは
    、標準に完全準拠したデストラクタ実装のために必要です。 またこれは
    C++ ABI に影響するものであり C++ 共有ライブラリ、C++ プログラムを作
    り出し、他の Linux ディストリビューションとの互換性を実現します。

--enable-languages=c,c++

    C と C++ の両コンパイラを生成することを指示します。

--disable-libstdcxx-pch

    libstdc++ に対してプリコンパイルヘッダ (pre-compiled header; PCH)
    をビルドしないように指示します。 これを含めてしまうとサイズが増える
    ことになり、そもそも利用する必要がありません。

--disable-bootstrap

    GCC のネイティブビルドを行うには、デフォルトでは "ブートストラップ"
    ビルドを行ないます。 これは単に GCC をコンパイルするのではなく、数
    回のコンパイルを繰り返します。 つまり一回めにビルドされたプログラム
    を使って二回め、三回めのコンパイルを行うものです。 二回め、三回めと
    コンパイルを繰り返すのは、これによって自分自身を再生成して完璧なも
    のを作り出すためです。 このことによってコンパイルが正確に行われたこ
    とを暗に示すことにもなります。 しかし LFS のビルドでは、何度もブー
    トストラップを行う必要のない、手堅い(solid) コンパイラを作り出しま
    す。

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

make

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

make install

最後にシンボリックリンクを作成します。 プログラムやスクリプトの中には
gcc ではなく cc を用いるものが結構あります。 シンボリックリンクを作るこ
とで各種のプログラムを汎用的にすることができ、通常 GNU C コンパイラがイ
ンストールされていない多くの UNIX システムでも利用できるものになります
。 cc を利用することにすれば、 システム管理者がどの C コンパイラをイン
ストールすべきかを判断する必要がなくなります。

ln -vs gcc /tools/bin/cc

注意

この時点で、構築したツールチェーンの基本的な (コンパイルやリンクなどの)
機能が正しく動作していることを確認する必要があります。 健全性検査
(sanity check) を行うために以下を実行してください。

echo 'main(){}' > dummy.c
cc dummy.c
readelf -l a.out | grep ': /tools'

問題なく動作した場合はエラーがなかったということで、最後のコマンドから
出力される結果は以下のようになるはずです。

[Requesting program interpreter: /tools/lib/ld-linux.so.2]

ここでダイナミックリンカのディレクトリが /tools/lib であることを確認し
てください。 あるいは 64 ビットマシンであれば /tools/lib64 であることを
確認してください。

コマンドの出力結果が上と異なっていたり、あるいは何も出力されなかった場
合は、何かがおかしいことを意味します。 どこに問題があるのか調査・再試行
を行って解消してください。 解決せずにこの先に進まないでください。 cc で
はなく gcc を使って再度健全性検査を行ってみてください。 これで解決した
なら /tools/bin/cc のシンボリックリンクが正しくないということです。 正
しく生成し直してください。 また環境変数 PATH が正しいかどうかも確認して
ください。 echo $PATH を実行して、実行パスリストの先頭が /tools/bin で
あるかどうか確認します。 PATH が間違っていたなら、実はあなたは lfs ユー
ザーでログインしていないのかもしれませんし 4.4. 「環境設定」 での作業に
間違いがあったのかもしれません。

すべてが終了したらテストファイルを削除します。

rm -v dummy.c a.out

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

5.11. Tcl-8.5.8

Tcl パッケージはツールコマンド言語 (Tool Command Language) を提供します
。

概算ビルド時間: 0.5 SBU
必要ディスク容量: 32 MB

5.11.1. Tcl のインストール

本パッケージとこれに続く二つのパッケージ (Expect と DejaGNU) は、GCC お
よび Binutils におけるテストスイートを実行するのに必要となるためインス
トールするものです。 テスト目的のためにこれら三つのパッケージをインスト
ールするというのは、少々大げさなことかもしれません。 ただ本質的ではない
ことであっても、重要なツール類が正常に動作するという確認が得られれば安
心できます。 本章ではテストスイートを実行することは必須ではないため、実
行しないものとしていますが、それらの三つのパッケージは 第6章 で行うテス
トのために必要となるものです。

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

cd unix
./configure --prefix=/tools

パッケージをビルドします。

make

コンパイルが終了しました。 前にも述べたように、この章にて一時的ツールの
テストスイートを実行することは必須ではありません。 しかしテストスイート
を実行するなら、以下を実行します。

TZ=UTC make test

Tcl のテストスイートは、特定のホスト環境において失敗することがあります
が、その原因はよく分かっていません。 したがってテストスイートの失敗は驚
くことではなく、さして重大なことではありません。 TZ=UTC はタイムゾーン
を協定世界時間 (Coordinated Universal Time; UTC) あるいはグリニッジ標準
時間としても知られる時間に設定します。 ただしこれはテストスイートを実行
する時だけの設定です。 こうしておけば時刻に関するテストが正しく処理され
ます。 環境変数 TZ については 第7章 にて詳しく説明しています。

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

make install

インストールされたライブラリを書き込み可能にします。 こうすることで後に
デバッグシンボルを削除できるようにします。

chmod -v u+w /tools/lib/libtcl8.5.so

Tcl のヘッダファイルをインストールします。 これらは次にビルドする
Expect が必要とするファイルです。

make install-private-headers

必要となるシンボリックリンクを生成します。

ln -sv tclsh8.5 /tools/bin/tclsh

5.11.2. Tcl の構成

インストールプログラム: tclsh (tclsh8.5 へのリンク), tclsh8.5
インストールライブラリ: libtcl8.5.so, libtclstub8.5.a

概略説明

tclsh8.5        Tcl コマンドシェル

tclsh           tclsh8.5 へのリンク

libtcl8.5.so    Tcl ライブラリ

libtclstub8.5.a Tcl スタブライブラリ

5.12. Expect-5.43.0

Expect パッケージは、他のプログラムと対話的に処理を行うプログラムを提供
します。

概算ビルド時間: 0.1 SBU
必要ディスク容量: 4.1 MB

5.12.1. Expect のインストール

まずバグフィックスを行います。 これは GCC のテストスイートの失敗を回避
するものです。

patch -Np1 -i ../expect-5.43.0-spawn-1.patch

次のバグフィックスは Tcl の最近の変更に対応するものです。

patch -Np1 -i ../expect-5.43.0-tcl_8.5.5_fix-1.patch

Expect の configure スクリプトは、ホストシステムの /usr/local/bin/stty
を利用しようとしますが、/bin/stty を利用するように修正します。 これを行
うのは、ここで構築しているテストスイートのツール類を、ツールチェーンの
最終構築まで正常動作してもらうために必要となるからです。

cp -v configure{,.orig}
sed 's:/usr/local/bin:/bin:' configure.orig > configure

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

./configure --prefix=/tools --with-tcl=/tools/lib \
  --with-tclinclude=/tools/include --with-x=no

configure オプションの意味：

--with-tcl=/tools/lib

    Tcl のインストールモジュールを、ホストシステムに存在しているツール
    類の場所からではなく、一時的ツールを配置したディレクトリから探し出
    すことを指示します。

--with-tclinclude=/tools/include

    Tcl の内部ヘッダファイルを探し出す場所を指定します。 configure は自
    動的には Tcl ヘッダファイルの場所を探し出さないため、これを明示しま
    す。

--with-x=no

    Tk (Tcl の GUI コンポーネント) や X ウィンドウシステムライブラリを
    検索しないことを指示します。 いずれもホストシステムに存在するかもし
    れませんが、 今作り出す一時システムには存在しません。

パッケージをビルドします。

make

コンパイルが終了しました。 前にも述べたように、この章にて一時的ツールの
テストスイートを実行することは必須ではありません。 しかしテストスイート
を実行するなら、以下を実行します。

make test

Expect のテストスイートは、特定のホスト環境において失敗することがありま
すが、その原因はよく分かっていません。 したがってテストスイートの失敗は
驚くことではなく、さして重大なことではありません。

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

make SCRIPTS="" install

make パラメータの意味：

SCRIPTS=""

    Expect の補助的なスクリプトはインストールしないことを指示します。
    これらは必要ありません。

5.12.2. Expect の構成

インストールプログラム: expect
インストールライブラリ: libexpect-5.43.a

概略説明

expect           スクリプトを通じて他の対話的なプログラムとの処理を行い
                 ます。

                 Tcl 拡張機能を通じて、あるいは (Tcl がない場合に) C や
libexpect-5.43.a C++ から直接、Expect とのやりとりを行う関数を提供しま
                 す。

5.13. DejaGNU-1.4.4

DejaGNU パッケージは、他のプログラムをテストするフレームワークを提供し
ます。

概算ビルド時間: 0.1 SBU 以下
必要ディスク容量: 6.1 MB

5.13.1. DejaGNUのインストール

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

./configure --prefix=/tools

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

make install

コンパイル結果をテストするなら以下を実行します。

make check

5.13.2. DejaGNUの構成

インストールプログラム: runtest

概略説明

runtest expect シェルの適正な場所を特定し DejaGNU を実行するためのラッ
        パースクリプト。

5.14. Ncurses-5.7

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

概算ビルド時間: 0.7 SBU
必要ディスク容量: 30 MB

5.14.1. Ncurses のインストール

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

./configure --prefix=/tools --with-shared \
    --without-debug --without-ada --enable-overwrite

configure オプションの意味：

--without-ada

    このオプションは Ncurses に対して Ada コンパイラのサポート機能をビ
    ルドしないよう指示します。 この機能はホストシステムでは提供されてい
    るかもしれませんが、 chroot 環境に入ってしまうと利用できなくなりま
    す。

--enable-overwrite

    このオプションは Ncurses のヘッダファイルを /tools/include/ncurses
    ではなく /tools/include にインストールすることを指示します。 これは
    他のパッケージが Ncurses のヘッダファイルを正しく見つけ出せるように
    するためです。

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

make

このパッケージにはテストスイートがありますが、インストールした後に実行
しなければなりません。 テストスイートのためのファイル群はサブディレクト
リ test/ 以下に残っています。 詳しいことはそのディレクトリ内にある
README ファイルを参照してください。

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

make install

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

5.15. Bash-4.1

Bash は Bourne-Again SHell を提供します。

概算ビルド時間: 0.5 SBU
必要ディスク容量: 35 MB

5.15.1. Bash のインストール

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

./configure --prefix=/tools --without-bash-malloc

configure オプションの意味：

--without-bash-malloc

    このオプションは Bash のメモリ割り当て関数 (malloc) を利用しないこ
    とを指示します。 この関数はセグメンテーションフォールトが発生する可
    能性があるものとして知られています。 このオプションをオフにすること
    で、Bash は Glibc が提供する malloc 関数を用いるものとなり、そちら
    の方が安定しています。

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

make

コンパイルが終了しました。 前にも述べたように、この章にて一時的ツールの
テストスイートを実行することは必須ではありません。 しかしテストスイート
を実行するなら、以下を実行します。

make tests

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

make install

他のプログラム類がシェルとして sh を用いるものがあるためリンクを作りま
す。

ln -vs bash /tools/bin/sh

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

5.16. Bzip2-1.0.5

Bzip2 パッケージはファイル圧縮・伸長 (解凍) を行うプログラムを提供しま
す。 テキストファイルであれば、これまでよく用いられてきた gzip に比べて
bzip2 の方が圧縮率の高いファイルを生成できます。

概算ビルド時間: 0.1 SBU 以下
必要ディスク容量: 4.8 MB

5.16.1. Bzip2 のインストール

Bzip2 パッケージには configure がありません。 コンパイルおよびテストを
行うには以下を実行します。

make

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

make PREFIX=/tools install

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

5.17. Coreutils-8.4

Coreutils パッケージはシステムの基本的な特性を表示したり設定したりする
ためのユーティリティを提供します。

概算ビルド時間: 0.7 SBU
必要ディスク容量: 88 MB

5.17.1. Coreutils のインストール

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

./configure --prefix=/tools --enable-install-program=hostname

configure オプションの意味：

--enable-install-program=hostname

    このオプションは hostname プログラムを生成しインストールすることを
    指示します。 このプログラムはデフォルトでは生成されません。そしてこ
    れは Perl のテストスイートを実行するのに必要となります。

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

make

コンパイルが終了しました。 前にも述べたように、この章にて一時的ツールの
テストスイートを実行することは必須ではありません。 しかしテストスイート
を実行するなら、以下を実行します。

make RUN_EXPENSIVE_TESTS=yes check

パラメータ RUN_EXPENSIVE_TESTS=yes は、テストスイートの実行にあたって
(CPU パワーとメモリ使用量の観点で) 比較的負荷の高いテストを追加で実行す
ることを指示します。 特定のプラットフォームに対してのテスト確認となりま
すが、一般的に Linux 上において支障はありません。

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

make install

上のコマンド実行では su がインストールされません。 一般ユーザーではこの
プログラムを root 権限でインストールできないためです。 別名ファイルを作
り出して手動でインストールすることで、最終的に構築するシステムでもテス
トの実行を一般ユーザーにより行います。 またホストシステムにある su コマ
ンドは PATH 変数上に保持しておき可能な限り利用します。 上を行うために以
下を実行します。

cp -v src/su /tools/bin/su-tools

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

5.18. Diffutils-2.8.1

Diffutils パッケージはファイルやディレクトリの差分を表示するプログラム
を提供します。

概算ビルド時間: 0.1 SBU
必要ディスク容量: 6.1 MB

5.18.1. Diffutils のインストール

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

./configure --prefix=/tools

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

make

このパッケージにテストスイートはありません。

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

make install

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

5.19. Findutils-4.4.2

Findutils パッケージはファイル検索を行うプログラムを提供します。 このプ
ログラムはディレクトリツリーを再帰的に検索したり、データベースの生成・
保守・検索を行います。 (データベースによる検索は再帰的検索に比べて処理
速度は速いものですが、データベースが最新のものに更新されていない場合は
信頼できない結果となります。)

概算ビルド時間: 0.3 SBU
必要ディスク容量: 20 MB

5.19.1. Findutils のインストール

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

./configure --prefix=/tools

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

make

コンパイルが終了しました。 前にも述べたように、この章にて一時的ツールの
テストスイートを実行することは必須ではありません。 しかしテストスイート
を実行するなら、以下を実行します。

make check

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

make install

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

5.20. Gawk-3.1.7

Gawk パッケージはテキストファイルを操作するプログラムを提供します。

概算ビルド時間: 0.2 SBU
必要ディスク容量: 19 MB

5.20.1. Gawk のインストール

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

./configure --prefix=/tools

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

make

コンパイルが終了しました。 前にも述べたように、この章にて一時的ツールの
テストスイートを実行することは必須ではありません。 しかしテストスイート
を実行するなら、以下を実行します。

コンパイル結果をテストするなら以下を実行します。

make check

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

make install

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

5.21. Gettext-0.17

Gettext パッケージは国際化を行うユーティリティを提供します。 各種プログ
ラムに対して NLS (Native Language Support) を含めてコンパイルすることが
できます。 つまり各言語による出力メッセージが得られることになります。

概算ビルド時間: 0.8 SBU
必要ディスク容量: 82 MB

5.21.1. Gettext のインストール

ここで構築している一時的なツールに際して、Gettext パッケージからは1つの
バイナリをビルドしてインストールするだけで十分です。

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

cd gettext-tools
./configure --prefix=/tools --disable-shared

configure オプションの意味：

--disable-shared

    Gettext の共有ライブラリはこの時点では必要でないため、それらをビル
    ドしないようにします。

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

make -C gnulib-lib
make -C src msgfmt

1つのバイナリしかコンパイルしなかったため、その他のライブラリをコンパイ
ルしない限り、テストスイートを成功させることはできません。 したがってテ
ストスイートをこの段階で実行することはお勧めしません。

msgfmt プログラムをインストールします。

cp -v src/msgfmt /tools/bin

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

5.22. Grep-2.5.4

Grep パッケージはファイル内の検索を行うプログラムを提供します。

概算ビルド時間: 0.1 SBU
必要ディスク容量: 6.7 MB

5.22.1. Grep のインストール

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

./configure --prefix=/tools \
    --disable-perl-regexp \
    --without-included-regex

configure オプションの意味：

--disable-perl-regexp

    このオプションは grep プログラムに対して Perl 互換正規表現 (Perl
    Compatible Regular Expression; PCRE) ライブラリをリンクしないように
    指示します。 このライブラリはホストシステムに存在するかもしれません
    が chroot 環境に入ってしまうと利用できなくなります。

--without-included-regex

    Glibc-2.11.1 を用いている環境で本パッケージをビルドすると Glibc の
    正規表現ライブラリのチェックが適切に動作しません。 このオプションは
    Glibc の正規表現ライブラリを常時使うように指示します。

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

make

コンパイルが終了しました。 前にも述べたように、この章にて一時的ツールの
テストスイートを実行することは必須ではありません。 しかしテストスイート
を実行するなら、以下を実行します。

make check

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

make install

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

5.23. Gzip-1.4

Gzip パッケージはファイルの圧縮、伸長 (解凍) を行うプログラムを提供しま
す。

概算ビルド時間: 0.1 SBU 以下
必要ディスク容量: 3.3 MB

5.23.1. Gzip のインストール

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

./configure --prefix=/tools

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

make

コンパイルが終了しました。 前にも述べたように、この章にて一時的ツールの
テストスイートを実行することは必須ではありません。 しかしテストスイート
を実行するなら、以下を実行します。

make check

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

make install

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

5.24. M4-1.4.13

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

概算ビルド時間: 0.2 SBU
必要ディスク容量: 11.6 MB

5.24.1. M4 のインストール

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

./configure --prefix=/tools

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

make

コンパイルが終了しました。 前にも述べたように、この章にて一時的ツールの
テストスイートを実行することは必須ではありません。 しかしテストスイート
を実行するなら、以下を実行します。

make check

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

make install

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

5.25. Make-3.81

Make パッケージは、 パッケージ類をコンパイルするためのプログラムを提供
します。

概算ビルド時間: 0.1 SBU
必要ディスク容量: 9.6 MB

5.25.1. Make のインストール

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

./configure --prefix=/tools

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

make

コンパイルが終了しました。 前にも述べたように、この章にて一時的ツールの
テストスイートを実行することは必須ではありません。 しかしテストスイート
を実行するなら、以下を実行します。

make check

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

make install

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

5.26. Patch-2.6.1

Patch パッケージは「パッチ」ファイルを適用することにより、ファイルの修
正・生成を行うプログラムを提供します。 「パッチ」ファイルは diff プログ
ラムにより生成されます。

概算ビルド時間: 0.1 SBU 以下
必要ディスク容量: 1.9 MB

5.26.1. Patch のインストール

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

./configure --prefix=/tools

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

make

コンパイルが終了しました。 前にも述べたように、この章にて一時的ツールの
テストスイートを実行することは必須ではありません。 しかしテストスイート
を実行するなら、以下を実行します。

make check

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

make install

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

5.27. Perl-5.10.1

Perl パッケージは Perl 言語 (Practical Extraction and Report Language)
を提供します。

概算ビルド時間: 0.8 SBU
必要ディスク容量: 106 MB

5.27.1. Perl のインストール

以下のパッチを適用します。 これは C ライブラリに対する固定的なパスを適
用します。

patch -Np1 -i ../perl-5.10.1-libc-1.patch

Perl をコンパイルするための準備をします。 (以下のコマンドにて 'Data/
Dumper Fcntl IO POSIX' の部分は間違いなく入力してください。 それらはす
べて英字です。)

sh Configure -des -Dprefix=/tools \
                  -Dstatic_ext='Data/Dumper Fcntl IO POSIX'

configure オプションの意味：

-Dstatic_ext='Data/Dumper Fcntl IO POSIX'

    次章での Coreutils と Glibc のインストールとテストのためには、最低
    限の静的拡張モジュール (static extensions) さえあれば十分です。 そ
    こで静的拡張モジュールのビルドを指示します。

本パッケージにてビルドに必要となるのは、数個のユーティリティとライブラ
リだけです。

make perl utilities ext/Errno/pm_to_blib

Perl にはテストスイートがありますが、この時点での実行はお勧めしません。
Perl を部分的にしかビルドしていない状態で make test を実行すると、他の
実行ファイルなどもビルドすることになってしまいます。 それらは今の時点で
は必要ありません。 テストスイートを実行したい場合は次章にて行ってくださ
い。

これらのツールとライブラリをインストールします。

cp -v perl pod/pod2man /tools/bin
mkdir -pv /tools/lib/perl5/5.10.1
cp -Rv lib/* /tools/lib/perl5/5.10.1

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

5.28. Sed-4.2.1

Sed パッケージはストリームエディタを提供します。

概算ビルド時間: 0.1 SBU
必要ディスク容量: 8.0 MB

5.28.1. Sed のインストール

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

./configure --prefix=/tools

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

make

コンパイルが終了しました。 前にも述べたように、この章にて一時的ツールの
テストスイートを実行することは必須ではありません。 しかしテストスイート
を実行するなら、以下を実行します。

make check

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

make install

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

5.29. Tar-1.22

Tar パッケージはアーカイブプログラムを提供します。

概算ビルド時間: 0.3 SBU
必要ディスク容量: 20.9 MB

5.29.1. Tar のインストール

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

./configure --prefix=/tools

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

make

コンパイルが終了しました。 前にも述べたように、この章にて一時的ツールの
テストスイートを実行することは必須ではありません。 しかしテストスイート
を実行するなら、以下を実行します。

make check

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

make install

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

5.30. Texinfo-4.13a

Texinfo パッケージは info ページへの読み書き・変換を行うプログラムを提
供します。

概算ビルド時間: 0.2 SBU
必要ディスク容量: 20 MB

5.30.1. Texinfo のインストール

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

./configure --prefix=/tools

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

make

コンパイルが終了しました。 前にも述べたように、この章にて一時的ツールの
テストスイートを実行することは必須ではありません。 しかしテストスイート
を実行するなら、以下を実行します。

make check

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

make install

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

5.31. ストリップ

本節に示す作業は必須ではありません。 ただ LFS パーティションの容量が比
較的少ない場合には、不要なものは削除することを覚えておきましょう。 ここ
までにビルドしてきた実行ファイルやライブラリには、合計で 70 MB ほどの不
要なデバッグシンボル情報が含まれています。 それらを取り除くには以下を実
行します。

strip --strip-debug /tools/lib/*
strip --strip-unneeded /tools/{,s}bin/*

上のコマンド実行ではいくつものファイルがフォーマット不明となって処理が
スキップされます。 それらはたいてい、バイナリではなくスクリプトであるこ
とを示しています。

--strip-unneeded パラメータは 絶対に ライブラリに対して用いないでくださ
い。 もし用いるとスタティックライブラリが破壊され、ツールチェーンを構成
するパッケージをすべて作り直さなければならなくなります。

さらに 25 MB ほどを節約するためにドキュメント類を削除します。

rm -rf /tools/{,share}/{info,man}

この時点において環境変数 $LFS の配下には最低でも 850 MB の空き容量が必
要になります。 これは次のフェーズにて Glibc をビルドしインストールする
ためです。 Glibc のビルドとインストールができさえすれば、残りのものもす
べてビルド、インストールができます。

5.32. 所有者の変更

注記

本書のこれ以降で実行するコマンドはすべて root ユーザーでログインして実
行します。 もう lfs ユーザーは不要です。 root ユーザーの環境にて環境変
数 $LFS がセットされていることを今一度確認してください。

$LFS/tools ディレクトリの所有者は今は lfs ユーザーであり、これはホスト
システム上に存在するユーザーです。 この $LFS/tools ディレクトリをこのま
まにしておくということは、そこにあるファイル群が、存在しないアカウント
に対するユーザーIDによって所有される形を生み出すことになります。 これは
危険なことです。 後にユーザーアカウントが生成され同一のユーザーIDを持っ
たとすると $LFS/tools の所有者となってしまい、そこにあるファイルすべて
を所有することになって、悪意のある操作に利用されてしまいます。

この問題を解消するためには、新しく作り出される LFS システムに lfs ユー
ザーを作成することが考えられます。 その場合には同一のユーザーID、グルー
プIDとなるように作ります。 もっと良い方法があります。 $LFS/tools ディレ
クトリの所有者を root ユーザーにすることです。以下のコマンドによりこれ
を実現します。

chown -R root:root $LFS/tools

$LFS/tools ディレクトリは LFS システムの構築作業を終えれば削除すること
ができます。 一方これを残しておいて 本書と同一バージョンの LFS システム
を新たに構築する際に利用することもできます。 $LFS/tools ディレクトリを
どのように残すかは読者の皆さんの好みに応じて取り決めてください。

注意

この先の LFS システム構築に向けて一時的なツール類を残しておきたい場合は
この時点で バックアップを取っておくのが良いでしょう。 第6章で実施する作
業を通じて、今存在している一時的ツールは変更が加えられますので、将来、
別のビルド作業を行う際には使えないものとなります。

第III部 LFSシステムの構築

第6章 基本的なソフトウェアのインストール

6.1. はじめに

この章ではビルド環境に入って正式な LFS システムの構築作業を始めます。
chroot によって一時的なミニ Linux システムへ移行し、準備作業を行った上
でパッケージ類のインストールを行っていきます。

パッケージ類のインストール作業は簡単なものです。 インストール手順の説明
は、たいていは手短に一般的なものだけで済ますこともできます。 ただ誤りの
可能性を極力減らすために、個々のインストール手順の説明は十分に行うこと
にします。 Linux システムがどのようにして動作しているかを学ぶには、個々
のパッケージが何のために用いられていて、なぜユーザー (あるいはシステム)
がそれを必要としているのかを知ることが重要になります。

コンパイラには最適化オプションがありますが、これを利用することはお勧め
しません。 コンパイラの最適化を用いればプログラムが若干速くなる場合もあ
りますが、そもそもコンパイルが出来なかったり、プログラムの実行時に問題
が発生したりする場合があります。 もしコンパイラの最適化によってパッケー
ジビルドが出来なかったら、最適化をなしにしてもう一度コンパイルすること
で解決するかどうかを確認してください。 最適化を行ってパッケージがコンパ
イル出来たとしても、コードとビルドツールの複雑な関連に起因してコンパイ
ルが適切に行われないリスクをはらんでいます。 また -march オプションや
-mtune オプションにて指定する値は、本書には明示しておらずテストも行って
いませんので注意してください。 これらはツールチェーンパッケージ
(Binutils、GCC、Glibc) に影響を及ぼすことがあります。 最適化オプション
を用いることによって得られるものがあったとしても、それ以上にリスクを伴
うことがしばしばです。 初めて LFS 構築を手がける方は、最適化オプション
をなしにすることをお勧めします。 これ以降にビルドしていくツール類は、そ
れでも十分に速く安定して動作するはずです。

本章にてインストールしていくパッケージ類のビルド順は、必ず本書どおりに
行ってください。 プログラムはすべて /tools ディレクトリを直接参照するよ
うな形でビルドしてはなりません。 また同じ理由でパッケージ類を同時並行で
ビルドしないでください。 特にデュアル CPU マシンにおいて同時にビルドし
ていくと時間の節約を図ることができますが /tools ディレクトリを直接参照
するプログラムが出来上がってしまい、このディレクトリが存在しなくなった
時にはプログラムが動作しないことになります。

各ページではインストール手順の説明よりも前に、パッケージの内容やそこに
何が含まれているかを簡単に説明し、ビルドにどれくらいの時間を要するか、
ビルド時に必要となるディスク容量はどれくらいかを示しています。 またイン
ストール手順の最後には、パッケージがインストールするプログラムやライブ
ラリの一覧を示し、それらがどのようなものかを簡単に説明しています。

6.2. 仮想カーネルファイルシステムの準備

カーネルが取り扱う様々なファイルシステムは、カーネルとの間でやり取りが
行われます。 これらのファイルシステムは仮想的なものであり、ディスクを消
費するものではありません。 ファイルシステムの内容はメモリ上に保持されま
す。

ファイルシステムをマウントするディレクトリを以下のようにして生成します
。

mkdir -v $LFS/{dev,proc,sys}

6.2.1. 初期デバイスノードの生成

カーネルがシステムを起動する際には、いくつかのデバイスノードの存在が必
要です。 特に console と null です。 デバイスノードはハードディスク上に
生成されます。 そして udevd が起動し、また Linux が起動パラメータ init=
/bin/bash によって起動されれば利用可能となります。 以下のコマンドにより
デバイスノードを生成します。

mknod -m 600 $LFS/dev/console c 5 1
mknod -m 666 $LFS/dev/null c 1 3

6.2.2. /dev のマウントと有効化

各デバイスを /dev に設定する方法としては、/dev ディレクトリに対して
tmpfs のような仮想ファイルシステムをマウントすることが推奨されます。 こ
うすることで各デバイスが検出されアクセスされる際に、その仮想ファイルシ
ステム上にて動的にデバイスを生成する形を取ることができます。 このような
処理は一般的にはシステム起動時に Udev によって行われます。 今構築中のシ
ステムにはまだ Udev を導入していませんし、再起動も行っていませんので /
dev のマウントと有効化は手動で行ないます。 これはホストシステムの /dev
ディレクトリに対して、バインドマウントを行うことで実現します。 バインド
マウント (bind mount) は特殊なマウント方法の一つで、ディレクトリのミラ
ーを生成したり、他のディレクトリへのマウントポイントを生成したりします
。 以下のコマンドにより実現します。

mount -v --bind /dev $LFS/dev

6.2.3. 仮想カーネルファイルシステムのマウント

残りの仮想カーネルファイルシステムを以下のようにしてマウントします。

mount -vt devpts devpts $LFS/dev/pts
mount -vt tmpfs shm $LFS/dev/shm
mount -vt proc proc $LFS/proc
mount -vt sysfs sysfs $LFS/sys

6.3. パッケージ管理

パッケージ管理についての説明を LFS ブックに加えて欲しいとの要望をよく頂
きます。 パッケージ管理ツールがあれば、インストールされるファイル類を管
理し、パッケージの削除やアップグレードを容易に実現できます。 パッケージ
管理ツールでは、バイナリファイルやライブラリファイルだけでなく、設定フ
ァイル類のインストールも取り扱います。 パッケージ管理ツールをどうしたら
・・・ いえいえ本節は特定のパッケージ管理ツールを説明するわけでなく、そ
の利用を勧めるものでもありません。 もっと広い意味で、管理手法にはどうい
ったものがあり、どのように動作するかを説明します。 あなたにとって最適な
パッケージ管理がこの中にあるかもしれません。 あるいはそれらをいくつか組
み合わせて実施することになるかもしれません。 本節ではパッケージのアップ
グレードを行う際に発生する問題についても触れます。

LFS や BLFS において、パッケージ管理ツールについて触れていない理由には
以下のものがあります。

 ・ 本書の目的は Linux システムがいかに構築されているかを学ぶことです。
    パッケージ管理はその目的からはずれてしまいます。

 ・ パッケージ管理についてはいくつもの方法があり、それらには一長一短が
    あります。 ユーザーに対して満足のいくものを選び出すのは困難です。

ヒントプロジェクト (Hints Project) ページに、パッケージ管理についての情
報が示されています。 それらが望むものかどうか確認してみてください。

6.3.1. アップグレードに関する問題

パッケージ管理ツールがあれば、各種ソフトウェアの最新版がリリースされた
際に容易にアップグレードができます。 全般に LFS ブックや BLFS ブックに
示されている作業手順に従えば、新しいバージョンへのアップグレードを行っ
ていくことはできます。 以下ではパッケージをアップグレードする際に注意す
べき点、特に稼動中のシステムに対して実施するポイントについて説明します
。

 ・ ツールチェーン (Glibc、GCC、Binutils) のいずれかについて、マイナー
    バージョンをアップグレードする必要がある場合は、LFS を再構築するの
    が無難です。 この場合、すべてのパッケージの依存関係を考慮して順番に
    作り直せば実現できるはず ですが、これはあまりお勧めしません。 例え
    ば 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 に対してリンクするよう再コンパイルしなければなり
    ません。 古いライブラリに依存しているパッケージすべてを再コンパイル
    するまでは、そのライブラリを削除するべきではありません。

6.3.2. パッケージ管理手法

以下に一般的なパッケージ管理手法について示します。 パッケージ管理マネー
ジャを用いる前に、様々な方法を検討し、特にそれぞれの欠点も確認してくだ
さい。

6.3.2.1. すべては頭の中で

そうです。 これもパッケージ管理のやり方の一つです。 いろいろなパッケー
ジに精通していて、どんなファイルがインストールされるか分かっている人も
います。 そんな人はパッケージ管理ツールを必要としません。 あるいはパッ
ケージが更新された際に、システム全体を再構築しようと考えている人なら、
やはりパッケージ管理ツールを必要としません。

6.3.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 ディレクトリに
インストールした上で、先ほどのシンボリックリンクをこのディレクトリを指
し示すように置き換えます。

PATH、 LD_LIBRARY_PATH、 MANPATH、 INFOPATH、 CPPFLAGS といった環境変数
に対しては /usr/pkg/foo ディレクトリを加える必要があるかもしれません。
もっともパッケージによっては、このやり方では管理できないものもあります
。

6.3.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 ディレクトリにインストールする方が容易なこと
かもしれません。

6.3.2.4. タイムスタンプによる管理方法

この方法ではパッケージをインストールするにあたって、あるファイルにタイ
ムスタンプが記されます。 インストールの直後に find コマンドを適当なオプ
ション指定により用いることで、インストールされるすべてのファイルのログ
が生成されます。 これはタイムスタンプファイルの生成の後に行われます。
この方法を用いたパッケージ管理ツールとして install-log があります。

この方法はシンプルである利点がありますが、以下の二つの欠点があります。
インストールの際に、いずれかのファイルのタイムスタンプが現在時刻でなか
った場合、そういったファイルはパッケージ管理ツールが正しく制御できませ
ん。 またこの方法は一つのパッケージだけが、その時にインストールされるこ
とを前提とします。 例えば二つのパッケージが二つの異なる端末から同時にイ
ンストールされるような場合は、ログファイルが適切に生成されません。

6.3.2.5. インストールスクリプトの追跡管理

この方法はインストールスクリプトが実行するコマンドを記録するものです。
これには以下の二種類の手法があります。

環境変数 LD_PRELOAD を使えば、インストール前にあらかじめロードされるラ
イブラリを定めることができます。 パッケージのインストール中には cp、
install、 mv など様々な実行モジュールにそのライブラリをリンクさせ、ファ
イルシステムを変更するようなシステムコールを監視することで、そのライブ
ラリがパッケージを追跡管理できるようになります。 この方法を実現するため
には、動的リンクする実行モジュールはすべて suid ビット、sgid ビットがオ
フでなければなりません。 事前にライブラリをロードしておくと、インストー
ル中に予期しない副作用が発生するかもしれません。 したがって、ある程度の
テスト確認を行って、パッケージ管理ツールが不具合を引き起こさないこと、
しかるべきファイルの記録を取っておくことが必要とされます。

二つめの方法は strace を用いるものです。 これはインストールスクリプトの
実行中に発生するシステムコールを記録するものです。

6.3.2.6. パッケージのアーカイブを生成する方法

この方法では、シンボリックリンク方式によるパッケージ管理にて説明したの
と同じように、パッケージが個別のディレクトリにインストールされます。 イ
ンストールされた後には、インストールファイルを使ってアーカイブが生成さ
れます。 このアーカイブはこの後に、ローカルPCへのインストールに用いられ
、他のPCのインストールに利用することもできます。

商用ディストリビューションが採用しているパッケージ管理ツールは、ほとん
どがこの方法によるものです。 この方法に従ったパッケージ管理ツールの例に
RPM があります。 (これは Linux Standard Base Specification が規定してい
ます。) また pkg-utils、Debian の apt、Gentoo の Portage システムがあり
ます。 このパッケージ管理手法を LFS システムに適用するヒント情報が
http://www.linuxfromscratch.org/hints/downloads/files/fakeroot.txt にあ
ります。

パッケージファイルにその依存パッケージ情報まで含めてアーカイブ生成する
ことは、非常に複雑となり LFS の範疇を超えるものです。

Slackware は、パッケージアーカイブに対して tar ベースのシステムを利用し
ています。 他のパッケージ管理ツールはパッケージの依存性を取り扱いますが
、このシステムは意図的にこれを行っていません。 Slackware のパッケージ管
理に関する詳細は http://www.slackbook.org/html/package-management.html
を参照してください。

6.3.2.7. ユーザー情報をベースとする管理方法

この手法は LFS に固有のものであり Matthias Benkmann により考案されまし
た。 ヒントプロジェクト (Hints Project) から入手することが出来ます。 考
え方としては、各パッケージを個々のユーザーが共有ディレクトリにインスト
ールします。 パッケージに属するファイル類は、ユーザーIDを確認することで
容易に特定出来るようになります。 この手法の特徴や短所については、複雑な
話となるため本節では説明しません。 詳しくは http://
www.linuxfromscratch.org/hints/downloads/files/
more_control_and_pkg_man.txt に示されているヒントを参照してください。

6.3.3. 他システムへの LFS の配置

LFS システムの利点の一つとして、どのファイルもディスク上のどこに位置し
ていても構わないことです。 他のコンピュータに対してビルドした LFS の複
製を作ろうとするなら、それが同等のアーキテクチャであれば容易に実現でき
ます。 つまり tar コマンドを使って LFS のルートディレクトリを含むパーテ
ィション (LFS の基本的なビルドの場合、非圧縮で 250MB 程度) をまとめ、こ
れをネットワーク転送か、あるいは CD-ROM を通じて新しいシステムにコピー
し、伸張 (解凍) するだけです。 この場合でも、設定ファイルはいくらか変更
することが必要です。 変更が必要となる設定ファイルは以下のとおりです。 /
etc/hosts、 /etc/fstab、 /etc/passwd、 /etc/group、 /etc/shadow、 /etc/
ld.so.conf、 /etc/scsi_id.config、 /etc/sysconfig/network、 /etc/
sysconfig/network-devices/ifconfig.eth0/ipv4

新しいシステムのハードウェアと元のカーネルに差異があるかもしれないため
、カーネルを再ビルドする必要があるでしょう。

最後に新システムを起動可能とするために 8.4. 「GRUB を用いたブートプロセ
スの設定」 を設定する必要があります。

6.4. Chroot 環境への移行

chroot 環境に入って最終的な LFS システムの構築、インストールを行ってい
きます。 root ユーザーになって以下のコマンドを実行します。 chroot 環境
内は、この時点では一時的なツール類のみが利用可能な状態です。

chroot "$LFS" /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 変数に与えま
す。 この設定は vim や less のようなプログラムの処理が適切に行われるた
めに必要となります。 これ以外の変数として CFLAGS や CXXFLAGS などが必要
であれば、ここで定義しておくと良いでしょう。

ここから先は LFS 変数は不要となります。 すべての作業は LFS ファイル・シ
ステム内で行っていくことになるからです。 起動される Bash シェルは $LFS
ディレクトリがルート (/ ディレクトリ) となって動作します。

/tools/bin が PATH 変数内の最後に加わっています。 一時的なツール類は、
それぞれの正式版がインストールされていくに従って使われなくなります。 こ
れがうまく動作するのは bash の +h オプションを用いることによってハッシ
ュ機能をオフにしているからであり、実行モジュールの場所を覚えておく機能
を無効にしているからです。

bash のプロンプトに I have no name! と表示されますがこれは正常です。 こ
の時点ではまだ /etc/passwd を生成していないからです。

注記

本章のこれ以降と次章では、すべてのコマンドを chroot 環境内にて実行する
ことが必要です。 例えばシステムを再起動する場合のように chroot 環境から
いったん抜け出した場合には、 6.2.2. 「/dev のマウントと有効化」 と
6.2.3. 「仮想カーネルファイルシステムのマウント」 にて説明した仮想カー
ネル・ファイル・システムがマウントされていることを確認してください。 そ
して chroot 環境に入り直してからインストール作業を再開してください。

6.5. ディレクトリの生成

LFS ファイルシステムにおけるディレクトリ構成を作り出していきます。 以下
のコマンドを実行して標準的なディレクトリを生成します。

mkdir -pv /{bin,boot,etc/opt,home,lib,mnt,opt}
mkdir -pv /{media/{floppy,cdrom},sbin,srv,var}
install -dv -m 0750 /root
install -dv -m 1777 /tmp /var/tmp
mkdir -pv /usr/{,local/}{bin,include,lib,sbin,src}
mkdir -pv /usr/{,local/}share/{doc,info,locale,man}
mkdir -v  /usr/{,local/}share/{misc,terminfo,zoneinfo}
mkdir -pv /usr/{,local/}share/man/man{1..8}
for dir in /usr /usr/local; do
  ln -sv share/{man,doc,info} $dir
done
case $(uname -m) in
 x86_64) ln -sv lib /lib64 && ln -sv lib /usr/lib64 ;;
esac
mkdir -v /var/{lock,log,mail,run,spool}
mkdir -pv /var/{opt,cache,lib/{misc,locate},local}

ディレクトリは標準ではパーミッションモード 755 で生成されますが、すべて
のディレクトリをこのままとするのは適当ではありません。 上のコマンド実行
ではパーミッションを変更している箇所が二つあります。 一つは root ユーザ
ーのホームディレクトリに対してであり、もう一つはテンポラリディレクトリ
に対してです。

パーミッションモードを変更している一つめは /root ディレクトリに対して、
他のユーザーによるアクセスを制限するためです。 通常のユーザーが持つ、自
分自身のホームディレクトリへのアクセス権設定と同じことを行ないます。 二
つめのモード変更は /tmp ディレクトリや /var/tmp ディレクトリに対して、
どのユーザーも書き込み可能とし、ただし他のユーザーが作成したファイルは
削除できないようにします。 ビットマスク 1777 の最上位ビット、いわゆる
「スティッキービット (sticky bit)」 を用いて実現します。

6.5.1. FHS コンプライアンス情報

本書のディレクトリ構成は標準ファイルシステム構成 (Filesystem Hierarchy
Standard; FHS) に基づいています。 (その情報は http://www.pathname.com/
fhs/ に示されています。) FHS に加えて man、 doc、 info の各ディレクトリ
に対するシンボリックリンクも作成します。 これは多くのパッケージがドキュ
メントファイルをインストールする先として /usr/share/<ディレクトリ> や /
usr/local/share/<ディレクトリ> ではなく、いまだに /usr/<ディレクトリ>
や /usr/local/<ディレクトリ> としているためです。 また FHS では /usr/
local/games や /usr/share/games を規定していますが、一方で /usr/local/
share については明確なものがありません。 したがって本書では必要なディレ
クトリのみを作成していくことにします。 もっとも FHS に準拠した構成を望
むなら、どうぞ自由に作成してください。

6.6. 基本的なファイルとリンクの生成

プログラムの中には固定的に他のプログラムへのパスを保持しているものがあ
ります。 そのパスは今の時点ではまだ存在していません。 このようなプログ
ラムを正しく動作させるため、シンボリックリンクをいくつか作成します。 こ
のリンクは本章の作業を通じて各種ソフトウェアをインストールしていくこと
で、 その実体であるファイルに置き換えられていきます。

ln -sv /tools/bin/{bash,cat,echo,pwd,stty} /bin
ln -sv /tools/bin/perl /usr/bin
ln -sv /tools/lib/libgcc_s.so{,.1} /usr/lib
ln -sv /tools/lib/libstdc++.so{,.6} /usr/lib
ln -sv bash /bin/sh

Linux システムが適切に動作しているなら、マウントしているファイルシステ
ムの情報を /etc/mtab ファイルに保持しています。 このファイルは普通は、
新しいファイルシステムをマウントした際に生成されます。 しかし今の我々の
chroot 環境では、ファイルシステムを一つもマウントしていません。 そこで
、このファイルの存在を前提としているプログラムを正しく動作させるため、
空の /etc/mtab を作成しておきます。

touch /etc/mtab

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:/dev/null:/bin/false
nobody:x:99:99:Unprivileged User:/dev/null:/bin/false
EOF

root ユーザーに対する本当のパスワードは後に定めます。 (「x」 は単に場所
を設けるために設定しているものです。)

以下のコマンドを実行して /etc/group ファイルを生成します。

cat > /etc/group << "EOF"
root:x:0:
bin:x:1:
sys:x:2:
kmem:x:3:
tty:x:4:
tape:x:5:
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:
mail:x:34:
nogroup:x:99:
EOF

作成するグループは何かの標準に基づいたものではありません。 一部は本章の
Udev の設定に必要となるものですし、一部は既存の Linux ディストリビュー
ションが採用している慣用的なものです。 Linux Standard Base (http://
www.linuxbase.org 参照) では root グループのグループID (GID) は 0、 bin
グループの GID は 1 を定めているにすぎません。 他のグループとその GID
はシステム管理者が自由に取り決めることができます。 というのも通常のプロ
グラムであれば GID の値に依存することはなく、あくまでグループ名を用いて
プログラミングされているからです。

プロンプトに表示される 「I have no name!」 を正しくするため、新たなシェ
ルを起動します。 第5章 にて完全に Glibc をインストールし、 /etc/passwd
ファイルと /etc/group ファイルを作ったので、ユーザー名とグループ名の名
前解決が適切に動作します。

exec /tools/bin/bash --login +h

ディレクティブ +h について触れておきます。 これは bash に対して実行パス
の内部ハッシュ機能を利用しないよう指示するものです。 もしこのディレクテ
ィブを指定しなかった場合 bash は一度実行したファイルのパスを記憶します
。 コンパイルしてインストールした実行ファイルはすぐに利用していくために
、本章での作業では +h ディレクティブを常に使っていくことにします。

login、 agetty、 init といったプログラム (あるいは他のプログラム) は、
システムに誰がいつログインしたかといった情報を多くのログファイルに記録
します。 しかしログファイルがあらかじめ存在していない場合は、ログファイ
ルの出力が行われません。 そこでそのようなログファイルを作成し、適切なパ
ーミッションを与えます。

touch /var/run/utmp /var/log/{btmp,lastlog,wtmp}
chgrp -v utmp /var/run/utmp /var/log/lastlog
chmod -v 664 /var/run/utmp /var/log/lastlog

/var/run/utmp ファイルは現在ログインしているユーザーの情報を保持します
。 /var/log/wtmp ファイルはすべてのログイン・ログアウトの情報を保持しま
す。 /var/log/lastlog ファイルは各ユーザーが最後にログインした情報を保
持します。 /var/log/btmp ファイルは不正なログイン情報を保持します。

6.7. Linux-2.6.32.8 API ヘッダ

Linux API ヘッダは Glibc が利用するカーネル API を提供します。

概算ビルド時間: 0.1 SBU
必要ディスク容量: 431 MB

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

Linux カーネルはアプリケーションプログラミングインターフェース
(Application Programming Interface) を、システムの C ライブラリ (LFS の
場合 Glibc) に対して提供する必要があります。 これを行うには Linux カー
ネルのソースに含まれる、さまざまな C ヘッダファイルを「健全化
(sanitizing)」して利用します。

これより前に一度処理を行っていたとしても、不適切なファイルや誤った依存
関係を残さないように、以下を処理します。

make mrproper

そしてユーザーが利用するカーネルヘッダファイルをテストし、ソースから抽
出します。 それらはいったん中間的なローカルディレクトリに置かれ、必要な
場所にコピーされます。 ターゲットディレクトリに既にあるファイルは削除さ
れてからソースからの抽出処理が行われます。 なおファイルの中にはカーネル
開発者が隠しファイルとしているものがあります。 それらは LFS では必要な
いため、中間ディレクトリから削除します。

make headers_check
make INSTALL_HDR_PATH=dest headers_install
find dest/include \( -name .install -o -name ..install.cmd \) -delete
cp -rv dest/include/* /usr/include

6.7.2. Linux API ヘッダの構成

インストールヘッダ: /usr/include/asm/*.h, /usr/include/asm-generic/*.h,
/usr/include/drm/*.h, /usr/include/linux/*.h, /usr/include/mtd/*.h, /
usr/include/rdma/*.h, /usr/include/scsi/*.h, /usr/include/sound/*.h, /
usr/include/video/*.h, /usr/include/xen/*.h

概略説明

/usr/include/asm/*.h         The Linux API ASM ヘッダファイル

/usr/include/asm-generic/*.h The Linux API ASM の汎用的なヘッダファイル

/usr/include/drm/*.h         The Linux API DRM ヘッダファイル

/usr/include/linux/*.h       The Linux API Linux ヘッダファイル

/usr/include/mtd/*.h         The Linux API MTD ヘッダファイル

/usr/include/rdma/*.h        The Linux API RDMA ヘッダファイル

/usr/include/scsi/*.h        The Linux API SCSI ヘッダファイル

/usr/include/sound/*.h       The Linux API Sound ヘッダファイル

/usr/include/video/*.h       The Linux API Video ヘッダファイル

/usr/include/xen/*.h         The Linux API Xen ヘッダファイル

6.8. Man-pages-3.23

Man-pages パッケージは 1,900 以上のマニュアルページを提供します。

概算ビルド時間: 0.1 SBU 以下
必要ディスク容量: 21 MB

6.8.1. Man-pages のインストール

Man-pages をインストールするために以下を実行します。

make install

6.8.2. Man-pages の構成

インストールファイル: 様々な man ページ

概略説明

man ペー C 言語の関数、重要なデバイスファイル、重要な設定ファイルなどを
ジ       説明します。

6.9. Glibc-2.11.1

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

概算ビルド時間: 16.9 SBU テストスイート込み
必要ディスク容量: 637 MB テストスイート込み

6.9.1. Glibc のインストール

注記

LFS が取り扱っていないパッケージの中には GNU libiconv の導入を推奨して
いるものがあります。 これは文字データのエンコーディングを変換する機能を
持ちます。 プロジェクトのホームページ (http://www.gnu.org/software/
libiconv/) には以下のような説明があります。 「このライブラリは iconv()
関数を提供します。 この関数を持たないシステムや、Unicode を取り扱うこと
ができないシステムにて、この関数を利用することができます。 」 Glibc が
iconv() 関数を用意しており Unicode の変換を実現しているため LFS では
libiconv は用いないことにします。

Glibc は自らによってビルドされるものであり、そうして完全な形でインスト
ールされます。 ただしコンパイラのスペックファイルやリンカは、まだ /
tools ディレクトリを示したままです。 スペックファイルやリンカを再調整す
るのは Glibc をインストールした後になります。 これは Glibc の autoconf
テストが失敗するためであり、最終的にきれいなビルド結果を得るという目的
が達成できないためです。

make install を実行すると test-installation.pl というスクリプトが実行さ
れ、新たに作り出された Glibc に対しての簡単な健全性テストが実施されます
。 しかしこの時点ではツールチェーンが /tools ディレクトリを指し示してい
るため、誤った Glibc を対象としてテストが実施されてしまいます。 このス
クリプトのテスト対象が、これから作り出す Glibc となるように以下を実行し
ます。

DL=$(readelf -l /bin/sh | sed -n 's@.*interpret.*/tools\(.*\)]$@\1@p')
sed -i "s|libs -o|libs -L/usr/lib -Wl,-dynamic-linker=$DL -o|" \
        scripts/test-installation.pl
unset DL

ldd シェルスクリプトは Bash が定める文法書式により構成されています。 デ
フォルトで記述されているインタープリタを /bin/bash に変更します。 BLFS
ブックの シェル (Shells) で説明しているように、別の /bin/sh がインスト
ールされている場合もあるからです。

sed -i 's|@BASH@|/bin/bash|' elf/ldd.bash.in

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

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

第5章と同じように x86 マシンにおいては CFLAGS に対してコンパイラフラグ
の追加が必要です。 ライブラリ構築においても gcc コンパイラに対して最適
化フラグをセットすることで、コンパイル時間を向上 (-pipe) させ、パッケー
ジのパフォーマンスも向上 (-O3) させます。

case `uname -m` in
  i?86) echo "CFLAGS += -march=i486 -mtune=native -O3 -pipe" > configparms ;;
esac

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

../glibc-2.11.1/configure --prefix=/usr \
    --disable-profile --enable-add-ons \
    --enable-kernel=2.6.18 --libexecdir=/usr/lib/glibc

configure オプションの意味：

--libexecdir=/usr/lib/glibc

    このオプションは pt_chown プログラムのインストール先を、デフォルト
    の /usr/libexec から /usr/lib/glibc に変更します。

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

make

重要項目

本節における Glibc のテストスイートは極めて重要なものです。 したがって
どのような場合であっても必ず実行してください。

テストを実施する前に、ソースディレクトリからビルドディレクトリにファイ
ルを一つコピーします。 いくつかのテストが失敗してしまうことを回避するた
めです。 こうしておいてコンパイル結果をテストします。

cp -v ../glibc-2.11.1/iconvdata/gconv-modules iconvdata
make -k check 2>&1 | tee glibc-check-log
grep Error glibc-check-log

posix/annexc のテストはおそらく失敗します。 これは想定されていることで
あり無視することができます。 そもそも Glibc のテストスイートはホストシ
ステムにある程度依存します。 発生しがちな問題を以下に示します。

 ・ nptl/tst-clock2, nptl/tst-clock2, tst-attr3 の各テストは失敗するこ
    とがあります。 失敗の理由は明確ではありません。 ただ処理速度が原因
    してそれらが発生すると思われます。

 ・ math テストは、純正 Intel プロセッサや AMD プロセッサが最新のもので
    はない場合に失敗することがあります。

 ・ LFS パーティションを noatime オプションを用いてマウントしている場合
    atime テストが失敗します。 2.4. 「新しいパーティションのマウント」
    で説明しているように、LFS のビルド中は noatime オプションを使わない
    ようにしてください。

 ・ 旧式のハードウェアや性能の低いハードウェア、あるいは負荷の高いシス
    テムにおいてテストを行うと、処理時間をオーバーしてタイムアウトが発
    生しテストが失敗します。

支障が出る話ではありませんが Glibc のインストール時には /etc/ld.so.conf
ファイルが存在していないとして警告メッセージが出力されます。 これをなく
すために以下を実行します。

touch /etc/ld.so.conf

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

make install

システムを各種の言語に対応させるためのロケールは、今までのコマンドでは
インストールされませんが、テストスイートにおいてロケールは必要ではあり
ません。 ただ将来的にはロケールがないことによって、重要なテストを逃して
しまうかもしれません。

各ロケールは localedef プログラムを使ってインストールします。 例えば以
下に示す一つめの localedef では、キャラクタセットには依存しないロケール
定義 /usr/share/i18n/locales/cs_CZ とキャラクタマップ定義 /usr/share/
i18n/charmaps/UTF-8.gz とを結合させて /usr/lib/locale/locale-archive フ
ァイルにその情報を付け加えます。 以下のコマンドは、テストを成功させるた
めに必要となる最低限のロケールをインストールするものです。

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 de_DE -f UTF-8 de_DE.UTF-8
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 en_US -f UTF-8 en_US.UTF-8
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 fr_FR -f UTF-8 fr_FR.UTF-8
localedef -i it_IT -f ISO-8859-1 it_IT
localedef -i ja_JP -f EUC-JP ja_JP
localedef -i tr_TR -f UTF-8 tr_TR.UTF-8
localedef -i zh_CN -f GB18030 zh_CN.GB18030

上に加えて、あなたの国、言語、キャラクタセットを定めるためのロケールを
インストールしてください。

必要に応じて glibc-2.11.1/localedata/SUPPORTED に示されるすべてのロケー
ルを同時にインストールしてください。 (そこには上のロケールも含め、すべ
てのロケールが列記されています。) 以下のコマンドによりそれを実現します
。 ただしこれには相当な処理時間を要します。

make localedata/install-locales

さらに必要なら glibc-2.11.1/localedata/SUPPORTED ファイルに示されていな
い特殊なロケールは localedef コマンドを使って生成・インストールを行って
ください。

6.9.2. Glibc の設定

/etc/nsswitch.conf ファイルを作成しておく必要があります。 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

ローカルなタイムゾーンの設定を行うために、ここでは以下のスクリプトを実
行します。

tzselect

地域情報を設定するためにいくつか尋ねられるのでそれに答えます。 このスク
リプトはタイムゾーン名を表示します。 (例えば America/Edmonton などです
。) /usr/share/zoneinfo ディレクトリにはさらに Canada/Eastern や
EST5EDT のようなタイムゾーンもあります。 これらはこのスクリプトでは認識
されませんが、利用することは可能です。

以下のコマンドにより /etc/localtime ファイルを生成します。

cp -v --remove-destination /usr/share/zoneinfo/<xxx> \
    /etc/localtime

<xxx> の部分は設定するタイムゾーンの名前 (例えば Canada/Eastern など)
に置き換えてください。

cp オプションの意味：

--remove-destination

    このオプションは既に存在するシンボリックリンクを削除します。 ここで
    はシンボリックリンクを再生成するのではなく、ファイルのコピーを行い
    ます。 これは別パーティション内に /usr ディレクトリが存在するケース
    に対応するためです。 シングルユーザーモードでシステムを起動する際に
    はこのことが必要となります。

6.9.3. ダイナミックローダの設定

デフォルトにおいてダイナミックリンカ (/lib/ld-linux.so.2) は /lib ディ
レクトリと /usr/lib ディレクトリを検索しにいきます。 これに従って、他の
プログラムが実行される際に必要となるダイナミックライブラリがリンクされ
ます。 もし /lib や /usr/lib 以外のディレクトリにライブラリファイルがあ
るなら /etc/ld.so.conf ファイルに記述を追加して、ダイナミックローダがそ
れらを探し出せるようにしておくことが必要です。 追加のライブラリが配置さ
れるディレクトリとしては /usr/local/lib ディレクトリと /opt/lib ディレ
クトリという二つがよく利用されます。 ダイナミックローダの検索パスとして
、それらのディレクトリを追加します。

以下のコマンドを実行して /etc/ld.so.conf ファイルを新たに生成します。

cat > /etc/ld.so.conf << "EOF"
# Begin /etc/ld.so.conf

/usr/local/lib
/opt/lib

# End /etc/ld.so.conf
EOF

6.9.4. Glibc の構成

インストールプログラム: catchsegv, gencat, getconf, getent, iconv,
iconvconfig, ldconfig, ldd, lddlibc4, locale, localedef, mtrace, nscd,
pcprofiledump, pt_chown, rpcgen, rpcinfo, sln, sprof, tzselect, xtrace,
zdump, zic
インストールライブラリ: ld.so, libBrokenLocale.{a,so}, libSegFault.so,
libanl.{a,so}, libbsd-compat.a, libc.{a,so}, libc_nonshared.a,
libcidn.so, libcrypt.{a,so}, libdl.{a,so}, libg.a, libieee.a, libm.
{a,so}, libmcheck.a, libmemusage.so, libnsl.{a,so}, 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}

概略説明

catchsegv       プログラムがセグメンテーションフォールトにより停止した
                時に、スタックトレースを生成するために利用します。

gencat          メッセージカタログを生成します。

getconf         ファイルシステムに固有の変数に設定された値を表示します
                。

getent          管理データベースから設定項目を取得します。

iconv           キャラクターセットを変換します。

iconvconfig     高速ロードができる iconv モジュール設定ファイルを生成し
                ます。

ldconfig        プログラム実行時におけるダイナミックリンカのリンクを設
                定します。

ldd             指定したプログラムまたは共有ライブラリが必要としている
                共有ライブラリを表示します。

lddlibc4        オブジェクトファイルを使って ldd コマンドを補助します。
                [訳註：意味不明]

locale          現在のロケールに対する様々な情報を表示します。

localedef       ロケールの設定をコンパイルします。

mtrace          メモリトレースファイル (memory trace file) を読み込んで
                解釈します。 そして可読可能な書式で出力します。

nscd            一般的なネームサービスへの変更要求のキャッシュを提供す
                るデーモン。

pcprofiledump   PC プロファイリングによって生成される情報をダンプします
                。

                grantpt コマンドのヘルパープログラム。 所有者、グループ
pt_chown        、スレーブ擬似端末 (slave pseudo terminal) へのアクセス
                パーミッションをそれぞれ設定します。

rpcgen          リモートプロシージャコール (Remote Procedure Call; RPC)
                を実装するための C 言語コードを生成します。

rpcinfo         RPC サーバーに対しての RPC コールを行います。

sln             スタティックなリンクを行う ln プログラム。

sprof           共有オブジェクトのプロファイリングデータを読み込んで表
                示します。

tzselect        ユーザーに対してシステムの設置地域を問合せ、対応するタ
                イムゾーンの記述を表示します。

xtrace          プログラム内にて現在実行されている関数を表示することで
                、そのプログラムの実行状況を追跡します。

zdump           タイムゾーンをダンプします。

zic             タイムゾーンコンパイラ。

ld.so           共有ライブラリのためのヘルパープログラム。

                Glibc が内部で利用するもので、異常が発生しているプログ
libBrokenLocale ラムを見つけ出します。 (例えば Motif アプリケーションな
                ど) 詳しくは glibc-2.11.1/locale/broken_cur_max.c に書
                かれたコメントを参照してください。

libSegFault     セグメンテーションフォールトのシグナルハンドラ。
                catchsegv が利用します。

libanl          非同期の名前解決 (asynchronous name lookup) ライブラリ
                。

                特定の BSD (Berkeley Software Distribution) プログラム
libbsd-compat   を Linux 上で動作させるために必要な可搬ライブラリを提供
                します。

libc            主要な C ライブラリ。

                Glibc が内部的に利用するもので getaddrinfo() 関数によっ
libcidn         て国際化ドメイン名 (internationalized domain names) を
                取り扱います。

libcrypt        暗号化ライブラリ。

libdl           ダイナミックリンクのインターフェースライブラリ。

libg            関数を全く含まないダミーのライブラリ。 かつては g++ の
                ランタイムライブラリであったものです。

                このモジュールをリンクすると、数学関数におけるエラー制
libieee         御方法を IEEE (the Institute of Electrical and
                Electronic Engineers) が定義するものに従うようになりま
                す。 デフォルトは POSIX.1 エラー制御方法です。

libm            数学ライブラリ。

libmcheck       このライブラリにリンクした場合、メモリ割り当てのチェッ
                ク機能を有効にします。

libmemusage     memusage コマンドが利用するもので、プログラムのメモリ使
                用に関する情報を収集します。

libnsl          ネットワークサービスライブラリ。

                NSS (Name Service Switch) ライブラリ。 ホスト、ユーザー
libnss          名、エイリアス、サービス、プロトコルなどの名前解決を行
                う関数を提供します。

libpcprofile    プロファイリングを行う関数を提供するもので、特定のソー
                ス行に費やされる CPU 時間を追跡するために利用します。

libpthread      POSIX スレッドライブラリ。

libresolv       インターネットドメインネームサーバーに対しての、パケッ
                トの生成・送信・解析を行う関数を提供します。

librpcsvc       様々な RPC サービスを実現する関数を提供します。

                POSIX.1b リアルタイム拡張 (Realtime Extension) にて既定
librt           されている、インターフェースをほぼ網羅した関数を提供し
                ます。

libthread_db    マルチスレッドプログラム用のデバッガを構築するための有
                用な関数を提供します。

libutil         数多くの Unix ユーティリティにて利用される 「標準」 関
                数を提供します。

6.10. ツールチェーンの再調整

最終的な C ライブラリがこれまでに構築できました。 ここでツールチェーン
の調整を再度行います。 これを行うことで、新たに生成したプログラムが新た
に生成したライブラリにリンクされます。 この作業は 第5章 の冒頭にて行っ
た「調整」作業と同様のことです。 ただし調整される方向が逆になります。
第5章 では、ホストシステムの /{,usr/}lib ディレクトリを新しく作った /
tools/lib ディレクトリに仕向けていました。 今度は同じ /tools/lib ディレ
クトリを LFS の /{,usr/}lib ディレクトリに向けます。

まず /tools ディレクトリにあるリンカのバックアップをとっておき、第5章に
て作成した調整済みリンカに置き換えます。 /tools/$(gcc-dumpmachine)/bin
ディレクトリにあるリンカに対してのシンボリックリンクも正しく生成してお
きます。

mv -v /tools/bin/{ld,ld-old}
mv -v /tools/$(gcc -dumpmachine)/bin/{ld,ld-old}
mv -v /tools/bin/{ld-new,ld}
ln -sv /tools/bin/ld /tools/$(gcc -dumpmachine)/bin/ld

次に GCC スペックファイルを修正し、新しいダイナミックリンカを指し示すよ
うにします。 単純に 「/tools」 という記述を取り除けば、ダイナミックリン
カへの正しい参照となります。 またスペックファイルを修正することで GCC
がヘッダファイル、および Glibc の起動ファイルを適切に探し出せるようにな
ります。 以下の sed によりこれを実現します。

gcc -dumpspecs | sed -e 's@/tools@@g' \
    -e '/\*startfile_prefix_spec:/{n;s@.*@/usr/lib/ @}' \
    -e '/\*cpp:/{n;s@$@ -isystem /usr/include@}' > \
    `dirname $(gcc --print-libgcc-file-name)`/specs

スペックファイルの内容を実際に確認して、今変更した内容が正しく反映され
ていることを確認しておいてください。

この時点において、調整したツールチェーンの基本的な (コンパイルやリンク
などの) 機能が正しく動作していることを確認する必要があります。 これを行
うために以下の健全性検査を実行します。

echo 'main(){}' > dummy.c
cc dummy.c -v -Wl,--verbose &> dummy.log
readelf -l a.out | grep ': /lib'

問題なく動作した場合はエラーがなかったということで、最後のコマンドから
出力される結果は以下のようになるはずです。 (ダイナミックリンカの名前は
プラットフォームによって違っているかもしれません。)

[Requesting program interpreter: /lib/ld-linux.so.2]

ダイナミックリンカのディレクトリは、今度は /lib となっているはずです。

ここで起動ファイルが正しく用いられていることを確認します。

grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log

問題なく動作した場合はエラーがなかったということで、上のコマンドの出力
は以下のようになるはずです。

/usr/lib/crt1.o succeeded
/usr/lib/crti.o succeeded
/usr/lib/crtn.o succeeded

コンパイラが正しいヘッダファイルを読み取っているかどうかを検査します。

grep -B1 '^ /usr/include' dummy.log

上のコマンドは正常に終了すると、以下の出力を返します。

#include <...> search starts here:
 /usr/include

次に、新たなリンカが正しいパスを検索して用いられているかどうかを検査し
ます。

grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'

問題なく動作した場合はエラーがなかったということで、最後のコマンドの出
力は以下のようになるはずです。 (作業するプラットフォームに応じて「三つ
の組 (target triplet)」の表記は異なります。)

SEARCH_DIR("/tools/i686-pc-linux-gnu/lib")
SEARCH_DIR("/usr/lib")
SEARCH_DIR("/lib");

次に libc が正しく用いられていることを確認します。

grep "/lib.*/libc.so.6 " dummy.log

問題なく動作した場合はエラーがなかったということで、最後のコマンドの出
力は以下のようになるはずです。 (64 ビットマシンであれば lib64 ディレク
トリとなるはずです。)

attempt to open /lib/libc.so.6 succeeded

最後に GCC が正しくダイナミックリンカを用いているかを確認します。

grep found dummy.log

問題なく動作した場合はエラーがなかったということで、上のコマンドの出力
は以下のようになるはずです。 (ダイナミックリンカの名前はプラットフォー
ムによって違っているかもしれません。 また 64 ビットマシンであれば lib64
ディレクトリとなるはずです。)

found ld-linux.so.2 at /lib/ld-linux.so.2

出力結果が上と異なっていたり、出力が全く得られなかったりした場合は、何
かが根本的に間違っているということです。 どこに問題があるのか調査・再試
行を行って解消してください。 最もありがちな理由は、スペックファイルの修
正を誤っていることです。 問題を残したままこの先には進まないでください。

すべてが正しく動作したら、テストに用いたファイルを削除します。

rm -v dummy.c a.out dummy.log

6.11. Zlib-1.2.3

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

概算ビルド時間: 0.1 SBU 以下
必要ディスク容量: 2.8 MB

6.11.1. Zlib のインストール

注記

Zlib は CFLAGS が設定されているときに、共有ライブラリ (shared library)
を生成してしまうことが知られています。 したがって CFLAGS 変数を設定して
いる場合は、 以下に示す configure スクリプトを実行する際には -fPIC ディ
レクティブを追加設定してください。 そしてスタティックライブラリを生成で
きたら、そのディレクティブを取り除いて元に戻してください。

Zlib のダイナミックライブラリを生成する準備をします。

./configure --prefix=/usr --shared --libdir=/lib

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

make

コンパイル結果をテストするには以下を実行します。

make check

共有ライブラリをインストールします。

make install

上のコマンドを実行すると .so ファイルが /lib ディレクトリにインストール
されます。 これを削除して /usr/lib へのリンクを再作成します。

rm -v /lib/libz.so
ln -sfv ../../lib/libz.so.1.2.3 /usr/lib/libz.so

スタティックライブラリをビルドします。

make clean
./configure --prefix=/usr
make

コンパイル結果を再度テストするには以下を実行します。

make check

スタティックライブラリをインストールします。

make install

スタティックライブラリのパーミッションを設定します。

chmod -v 644 /usr/lib/libz.a

6.11.2. Zlib の構成

インストールライブラリ: libz.{a,so}

概略説明

libz 各種プログラムから呼び出される、圧縮・伸張 (解凍) を行う関数を提供
     します。

6.12. Binutils-2.20

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

概算ビルド時間: 2.1 SBU テストスイート込み
必要ディスク容量: 222 MB テストスイート込み

6.12.1. Binutils のインストール

PTY が chroot 環境内にて正しく作動しているかどうかを確認するために、以
下の簡単なテストを実行します。

expect -c "spawn ls"

上のコマンドは以下を出力するはずです。

spawn ls

上のような出力ではなく、以下のような出力メッセージが含まれていたら、PTY
の動作が適切に構築できていないことを示しています。 Binutils や GCC のテ
ストスイートを実行する前に、この症状は解消しておく必要があります。

The system has no more ptys.
Ask your system administrator to create more.

standards.info ファイルの日付が古いため、インストールしないことにします
。 より新しいものが Autoconf の作業を通じてインストールされます。

rm -fv etc/standards.info
sed -i.bak '/^INFO/s/standards.info //' etc/Makefile.in

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

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

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

../binutils-2.20/configure --prefix=/usr \
    --enable-shared

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

make tooldir=/usr

make パラメータの意味：

tooldir=/usr

    通常 tooldir (実行ファイルが最終的に配置されるディレクトリ) は $
    (exec_prefix)/$(target_alias) に設定されています。 x86_64 マシンで
    は /usr/x86_64-unknown-linux-gnu となります。 LFS は自分で設定を定
    めていくシステムですから /usr ディレクトリ配下に CPU ターゲットを特
    定するディレクトリを設ける必要がありません。 $(exec_prefix)/$
    (target_alias) というディレクトリ構成は、クロスコンパイル環境におい
    て必要となるものです。 (例えばパッケージをコンパイルするマシンが
    Intel であり、そこから PowerPC マシン用の実行コードを生成するような
    場合です。)

重要項目

本節における Binutils のテストスイートは極めて重要なものです。 したがっ
てどのような場合であっても必ず実行してください。

コンパイル結果をテストします。

make check

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

make tooldir=/usr install

libiberty ヘッダファイルをインストールします。 他のパッケージがこれを必
要としている場合があるためです。

cp -v ../binutils-2.20/include/libiberty.h /usr/include

6.12.2. Binutils の構成

インストールプログラム: addr2line, ar, as, c++filt, gprof, ld, nm,
objcopy, objdump, ranlib, readelf, size, strings, strip
インストールライブラリ: libiberty.a, libbfd.{a,so}, libopcodes.{a,so}

概略説明

           指定された実行モジュール名とアドレスに基づいて、プログラム内
addr2line  のアドレスをファイル名と行番号に変換します。 これは実行モジ
           ュール内のデバッグ情報を利用します。 特定のアドレスがどのソ
           ースファイルと行番号に該当するかを確認するものです。

ar         アーカイブの生成、修正、抽出を行います。

as         gcc の出力結果をアセンブルして、オブジェクトファイルとして生
           成するアセンブラ。

           リンカから呼び出されるもので C++ と Java のシンボルを複合
c++filt    (demangle) し、オーバーロード関数が破壊されることを回避しま
           す。

gprof      コールグラフ (call graph) のプロファイルデータを表示します。

           複数のオブジェクトファイルやアーカイブファイルから、一つのフ
ld         ァイルを生成するリンカ。 データの再配置やシンボル参照情報の
           結合を行います。

nm         指定されたオブジェクトファイル内のシンボル情報を一覧表示しま
           す。

objcopy    オブジェクトファイルの変換を行います。

           指定されたオブジェクトファイルの各種情報を表示します。 様々
objdump    なオプションを用いることで特定の情報表示が可能です。 表示さ
           れる情報は、コンパイル関連ツールを開発する際に有用なものです
           。

           アーカイブの内容を索引として生成し、それをアーカイブに保存し
ranlib     ます。 索引は、アーカイブのメンバによって定義されるすべての
           シンボルの一覧により構成されます。 アーカイブのメンバとは再
           配置可能なオブジェクトファイルのことです。

readelf    ELF フォーマットのバイナリファイルの情報を表示します。

size       指定されたオブジェクトファイルのセクションサイズと合計サイズ
           を一覧表示します。

           指定されたファイルに対して、印字可能な文字の並びを出力します
           。 文字は所定の長さ (デフォルトでは 4文字) 以上のものが対象
strings    となります。 オブジェクトファイルの場合デフォルトでは、初期
           化セクションとロードされるセクションからのみ文字列を抽出し出
           力します。 これ以外の種類のファイルの場合は、ファイル全体が
           走査されます。

strip      オブジェクトファイルからデバッグシンボルを取り除きます。

           以下に示すような数多くの GNU プログラムが利用する処理ルーチ
libiberty  ンを提供します。 getopt、 obstack、 strerror、 strtol、
           strtoul

libbfd     バイナリファイルディスクリプタ (Binary File Descriptor) ライ
           ブラリ。

           opcodes (オペレーションコード; プロセッサ命令を 「認識可能な
libopcodes テキスト」 として表現したもの) を取り扱うライブラリ。 このラ
           イブラリは objdump などのように、ビルド作業にて利用するユー
           ティリティプログラムが利用しています。

6.13. GMP-5.0.0

GMP パッケージは数値演算ライブラリを提供します。 このライブラリには任意
精度演算 (arbitrary precision arithmetic) を行う有用な関数が含まれます
。

概算ビルド時間: 1.7 SBU テストスイート込み
必要ディスク容量: 39 MB テストスイート込み

6.13.1. GMP のインストール

注記

64 ビットコードを扱う CPU 環境にて CFLAGS を指定していると、 本パッケー
ジの configure スクリプトは 64 ビット用の処理を行い失敗します。 これを
回避するには、本パッケージのビルド作業時にのみ、 CFLAGS 変数にパラメー
タ ABI=32 を加えて処理を行ってください。 そして作業を終えたら、そのパラ
メータを取り除いておいてください。

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

./configure --prefix=/usr --enable-cxx --enable-mpbsd

configure オプションの意味：

--enable-cxx

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

--enable-mpbsd

    Berkeley MP に対する互換ライブラリをビルドします。

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

make

重要項目

本節における GMP のテストスイートは極めて重要なものです。 したがってど
のような場合であっても必ず実行してください。

テストを実行します。

make check 2>&1 | tee gmp-check-log

162個のテストが完了することを確認してください。 テスト結果は以下のコマ
ンドにより確認することができます。

awk '/tests passed/{total+=$2} ; END{print total}' gmp-check-log

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

make install

必要ならドキュメントをインストールします。

mkdir -v /usr/share/doc/gmp-5.0.0
cp    -v doc/{isa_abi_headache,configuration} doc/*.html \
         /usr/share/doc/gmp-5.0.0

6.13.2. GMP の構成

インストールライブラリ: libgmp.{a,so}, libgmpxx.{a,so}, libmp.{a,so}

概略説明

libgmp   精度演算関数 (precision math functions) を提供します。

libgmpxx C++ 用の精度演算関数を提供します。

libmp    Berkley MP 演算関数を提供します。

6.14. MPFR-2.4.2

MPFR パッケージは倍精度演算 (multiple precision) の関数を提供します。

概算ビルド時間: 1.1 SBU テストスイート込み
必要ディスク容量: 27.1 MB テストスイート込み

6.14.1. MPFR のインストール

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

./configure --prefix=/usr --enable-thread-safe

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

make

重要項目

本節における MPFR のテストスイートは極めて重要なものです。 したがってど
のような場合であっても必ず実行してください。

148 個のテストが完了していることを確認してください。

make check

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

make install

ドキュメントをインストールします。

make html
mkdir -pv /usr/share/doc/mpfr-2.4.2
find . -name \*.html -type f -exec cp -v \{} /usr/share/doc/mpfr-2.4.2 \;

6.14.2. MPFR の構成

インストールライブラリ: libmpfr.{a,so}

概略説明

libmpfr 倍精度演算の関数を提供します。

6.15. File-5.04

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

概算ビルド時間: 0.2 SBU
必要ディスク容量: 9.5 MB

6.15.1. File のインストール

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

./configure --prefix=/usr

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

make

コンパイル結果をテストするには以下を実行します。

make check

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

make install

6.15.2. File の構成

インストールプログラム: file
インストールライブラリ: libmagic.{a,so}

概略説明

         指定されたファイルの種類判別を行います。 処理にあたってはいく
file     つかのテスト、すなわちファイルシステムテスト、マジックナンバー
         テスト、言語テストを行います。

libmagic マジックナンバーによりファイル判別を行うルーチンを含みます。
         file プログラムがこれを利用しています。

6.16. GCC-4.4.3

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

概算ビルド時間: 44 SBU テストスイート込み
必要ディスク容量: 1.1 GB テストスイート込み

6.16.1. GCC のインストール

sed による置換を行って libiberty.a をインストールしないようにします。
libiberty.a は Binutils が提供するものを利用することにします。

sed -i 's/install_to_$(INSTALL_DEST) //' libiberty/Makefile.in

5.10. 「GCC-4.4.3 - 2回め」 にて行ったように sed を使って以下のようにコ
ンパイラフラグ -fomit-frame-pointer を強制的に指定し、一貫したコンパイ
ルを実現します。

case `uname -m` in
  i?86) sed -i 's/^T_CFLAGS =$/& -fomit-frame-pointer/' \
        gcc/Makefile.in ;;
esac

fixincludes スクリプトは、たまにエラーを引き起こし、それまでにインスト
ールされているシステムヘッダーファイルを修正してしまうことがあります。
ここまでにインストールしてきたヘッダファイルは修正する必要がないので、
以下のコマンドを実行して fixincludes スクリプトを実行しないようにします
。

sed -i 's@\./fixinc\.sh@-c true@' gcc/Makefile.in

sed による置換を実行して、テストスイートのエラーを回避します。

sed -i 's/getline/get_line/' libiberty/testsuite/test-demangle.c

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

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

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

../gcc-4.4.3/configure --prefix=/usr \
    --libexecdir=/usr/lib --enable-shared \
    --enable-threads=posix --enable-__cxa_atexit \
    --enable-clocale=gnu --enable-languages=c,c++ \
    --disable-multilib --disable-bootstrap

他のプログラミング言語は、また別の依存パッケージなどを要しますが、現時
点では準備できていません。 GCC がサポートする他のプログラム言語の構築方
法については BLFS ブックの説明を参照してください。

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

make

重要項目

本節における GCC のテストスイートは極めて重要なものです。 したがってど
のような場合であっても必ず実行してください。

コンパイル結果をテストします。 エラーが発生しても停止しないようにします
。

make -k check

テスト結果を確認するために以下を実行します。

../gcc-4.4.3/contrib/test_summary

テスト結果の概略のみ確認したい場合は、 出力結果をパイプ出力して grep
-A7 Summ を実行してください。

テスト結果については http://www.linuxfromscratch.org/lfs/build-logs/6.6
/ と http://gcc.gnu.org/ml/gcc-testresults/ にある情報と比較することが
できます。

テストに失敗することがありますが、これを回避することはできません。 GCC
の開発者はこの問題を認識していますが、まだ解決していない状況です。 特に
libmudflap のテストは大いに問題があり GCC のバグとして知られています。
(http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20003) この URL に示されて
いる結果と大きく異なっていなかったら、 問題はありませんので先に進んでく
ださい。

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

make install

パッケージの中には C プリプロセッサが /lib ディレクトリにあることを前提
にしているものがあります。 そのようなものに対応するため、以下のシンボリ
ックリンクを作成します。

ln -sv ../usr/bin/cpp /lib

パッケージの多くは C コンパイラとして cc を呼び出しています。 これに対
応するため、以下のシンボリックリンクを作成します。

ln -sv gcc /usr/bin/cc

最終的なツールチェーンが出来上がりました。 ここで再びコンパイルとリンク
が正しく動作することを確認することが必要です。 そこで本節の初めの方で実
施した健全性テストをここでも実施します。

echo 'main(){}' > dummy.c
cc dummy.c -v -Wl,--verbose &> dummy.log
readelf -l a.out | grep ': /lib'

問題なく動作した場合はエラーがなかったということで、最後のコマンドから
出力される結果は以下のようになるはずです。 (ダイナミックリンカの名前は
プラットフォームによって違っているかもしれません。)

[Requesting program interpreter: /lib/ld-linux.so.2]

ここで起動ファイルが正しく用いられていることを確認します。

grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log

問題なく動作した場合はエラーがなかったということで、上のコマンドの出力
は以下のようになるはずです。

/usr/lib/gcc/i686-pc-linux-gnu/4.4.3/../../../crt1.o succeeded
/usr/lib/gcc/i686-pc-linux-gnu/4.4.3/../../../crti.o succeeded
/usr/lib/gcc/i686-pc-linux-gnu/4.4.3/../../../crtn.o succeeded

作業しているマシンアーキテクチャによっては、上の結果が微妙に異なるかも
しれません。 その違いは、たいていは /usr/lib/gcc の次のディレクトリ名に
あります。 作業マシンが 64 ビット機である場合、ディレクトリ名の後ろの方
に lib64 という名が出てくることになります。 ここで確認すべき重要なポイ
ントは gcc が /usr/lib ディレクトリ配下に三つのファイル crt*.o を見つけ
出しているかどうかです。

コンパイラが正しいヘッダファイルを読み取っているかどうかを検査します。

grep -B4 '^ /usr/include' dummy.log

上のコマンドは正常に終了すると、以下の出力を返します。

#include <...> search starts here:
 /usr/local/include
 /usr/lib/gcc/x86_64-unknown-linux-gnu/4.4.3/include
 /usr/lib/gcc/i686-pc-linux-gnu/4.4.3/include-fixed
 /usr/include

もう一度触れておきますが、プラットフォームの 「三つの組 (target
triplet)」 の次にくるディレクトリ名は CPU アーキテクチャにより異なる点
に注意してください。

注記

GCC のバージョン 4.3.0 では limits.h ファイルを無条件に include-fixed
ディレクトリにインストールします。 したがってそのディレクトリは存在して
いなければなりません。

次に、新たなリンカが正しいパスを検索して用いられているかどうかを検査し
ます。

grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'

問題なく動作した場合はエラーがなかったということで、最後のコマンドの出
力は以下のようになるはずです。 (作業するプラットフォームに応じて「三つ
の組 (target triplet)」の表記は異なります。)

SEARCH_DIR("/usr/i686-pc-linux-gnu/lib")
SEARCH_DIR("/usr/local/lib")
SEARCH_DIR("/lib")
SEARCH_DIR("/usr/lib");

64 ビットシステムではさらにいくつかのディレクトリが出力されます。 例え
ば x86_64 マシンであれば、その出力は以下のようになります。

SEARCH_DIR("/usr/x86_64-unknown-linux-gnu/lib64")
SEARCH_DIR("/usr/local/lib64")
SEARCH_DIR("/lib64")
SEARCH_DIR("/usr/lib64")
SEARCH_DIR("/usr/x86_64-unknown-linux-gnu/lib")
SEARCH_DIR("/usr/local/lib")
SEARCH_DIR("/lib")
SEARCH_DIR("/usr/lib");

次に libc が正しく用いられていることを確認します。

grep "/lib.*/libc.so.6 " dummy.log

問題なく動作した場合はエラーがなかったということで、最後のコマンドの出
力は以下のようになるはずです。 (64 ビットマシンであれば lib64 ディレク
トリとなるはずです。)

attempt to open /lib/libc.so.6 succeeded

最後に GCC が正しくダイナミックリンカを用いているかを確認します。

grep found dummy.log

問題なく動作した場合はエラーがなかったということで、上のコマンドの出力
は以下のようになるはずです。 (ダイナミックリンカの名前はプラットフォー
ムによって違っているかもしれません。 また 64 ビットマシンであれば lib64
ディレクトリとなるはずです。)

found ld-linux.so.2 at /lib/ld-linux.so.2

出力結果が上と異なっていたり、出力が全く得られなかったりした場合は、何
かが根本的に間違っているということです。 どこに問題があるのか調査・再試
行を行って解消してください。 最もありがちな理由は、スペックファイルの修
正を誤っていることです。 問題を残したままこの先には進まないでください。

すべてが正しく動作したら、テストに用いたファイルを削除します。

rm -v dummy.c a.out dummy.log

6.16.2. GCC の構成

インストールプログラム: c++, cc (gcc へのリンク), cpp, g++, gcc,
gccbug, gcov
インストールライブラリ: libgcc.a, libgcc_eh.a, libgcc_s.so, libgcov.a,
libgomp.{a,so}, libmudflap.{a,so}, libmudflapth.{a,so}, libssp.{a,so},
libssp_nonshared.a, libstdc++.{a,so} libsupc++.a

概略説明

c++        C++ コンパイラ

cc         C コンパイラ

           C プリプロセッサ。 コンパイラがこれを利用して、ソース内に記
cpp        述された #include、#define や同じようなステートメントを展開
           します。

g++        C++ コンパイラ

gcc        C コンパイラ

gccbug     有用なバグ報告の生成を手助けするスクリプト。

gcov       カバレッジテストツール。 プログラムを解析して、最適化が最も
           効果的となるのはどこかを特定します。

libgcc     gcc のランタイムサポートを提供します。

libgcov    GCC のプロファイリングを有効にした場合にこのライブラリがリン
           クされます。

           C/C++ や Fortran において、マルチプラットフォームでの共有メ
libgomp    モリ並行プログラミング (multi-platform shared-memory
           parallel programming) を行うための、GNU による OpenMP API イ
           ンプリメンテーションです。

libmudflap GCC の配列境界チェック (bounds checking) 機能をサポートする
           ルーチンを提供します。

libssp     GCC のスタック破壊を防止する (stack-smashing protection) 機
           能をサポートするルーチンを提供します。

libstdc++  標準 C++ ライブラリ

libsupc++  C++ プログラミング言語のためのサポートルーチンを提供します。

6.17. Sed-4.2.1

Sed パッケージはストリームエディタを提供します。

概算ビルド時間: 0.2 SBU
必要ディスク容量: 8.3 MB

6.17.1. Sed のインストール

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

./configure --prefix=/usr --bindir=/bin --htmldir=/usr/share/doc/sed-4.2.1

configure オプションの意味：

--htmldir

    HTML ドキュメントをインストールするディレクトリを指定します。

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

make

HTML ドキュメントを生成します。

make html

コンパイル結果をテストするには以下を実行します。

make check

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

make install

HTML ドキュメントをインストールします。

make -C doc install-html

6.17.2. Sed の構成

インストールプログラム: sed

概略説明

sed テキストファイルを一度の処理でフィルタリングし変換します。

6.18. Pkg-config-0.23

pkg-config パッケージは、他のパッケージ類の configure やメイクを行う際
に、インクルードパスやライブラリパスの情報を伝えるためのツールを提供し
ます。

概算ビルド時間: 0.3 SBU
必要ディスク容量: 11.5 MB

6.18.1. Pkg-config のインストール

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

./configure --prefix=/usr

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

make

コンパイル結果をテストするには以下を実行します。

make check

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

make install

6.18.2. Pkg-config の構成

インストールプログラム: pkg-config

概略説明

pkg-config 指定されたライブラリやパッケージの全般的な情報を返します。

6.19. Ncurses-5.7

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

概算ビルド時間: 0.8 SBU
必要ディスク容量: 35 MB

6.19.1. Ncurses のインストール

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

./configure --prefix=/usr --with-shared --without-debug --enable-widec

configure オプションの意味：

--enable-widec

    このオプションは通常のライブラリ (libncurses.so.5.7) ではなくワイド
    文字対応のライブラリ (libncursesw.so.5.7) をビルドすることを指示し
    ます。 ワイド文字対応のライブラリは、マルチバイトロケールと従来の 8
    ビットロケールの双方に対して利用可能です。 通常のライブラリでは 8ビ
    ットロケールに対してしか動作しません。 ワイド文字対応と通常のものと
    では、ソース互換があるもののバイナリ互換がありません。

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

make

このパッケージにテストスイートはありますが、パッケージをインストールし
た後でないと実行できません。 テストスイートのためのファイル群はサブディ
レクトリ test/ 以下に残っています。 詳しいことはそのディレクトリ内にあ
る README ファイルを参照してください。

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

make install

ライブラリを /lib ディレクトリに移動します。 これらはここにあるべきもの
です。

mv -v /usr/lib/libncursesw.so.5* /lib

ライブラリを移動させたので、シンボリックリンク先が存在しないことになり
ます。 そこでリンクを再生成します。

ln -sfv ../../lib/libncursesw.so.5 /usr/lib/libncursesw.so

アプリケーションによっては、ワイド文字対応ではないライブラリをリンカが
探し出すよう求めるものが多くあります。 そのようなアプリケーションに対し
ては、以下のようなシンボリックリンクやリンカスクリプトを作り出して、ワ
イド文字対応のライブラリにリンクさせるよう仕向けます。

for lib in ncurses form panel menu ; do \
    rm -vf /usr/lib/lib${lib}.so ; \
    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

最後に古いアプリケーションにおいて、ビルド時に -lcurses を指定するもの
があるため、これもビルド可能なものにします。

rm -vf /usr/lib/libcursesw.so
echo "INPUT(-lncursesw)" >/usr/lib/libcursesw.so
ln -sfv libncurses.so /usr/lib/libcurses.so
ln -sfv libncursesw.a /usr/lib/libcursesw.a
ln -sfv libncurses.a /usr/lib/libcurses.a

必要なら Ncurses のドキュメントをインストールします。

mkdir -v       /usr/share/doc/ncurses-5.7
cp -v -R doc/* /usr/share/doc/ncurses-5.7

注記

ここまでの作業手順では、ワイド文字対応ではない Ncurses ライブラリは生成
しませんでした。 ソースからコンパイルして構築するパッケージなら、実行時
にそのようなライブラリにリンクするものはないからです。 バイナリコードし
かないアプリケーションを取り扱う場合、あるいは LSB 対応を要する場合で、
それがワイド文字対応ではないライブラリを必要とするなら、以下のコマンド
によりそのようなライブラリを生成してください。

make distclean
./configure --prefix=/usr --with-shared --without-normal \
  --without-debug --without-cxx-binding
make sources libs
cp -av lib/lib*.so.5* /usr/lib

6.19.2. Ncurses の構成

インストールプログラム: captoinfo (tic へのリンク), clear, infocmp,
infotocap (tic へのリンク), ncursesw5-config, reset (tset へのリンク),
tic, toe, tput, tset
インストールライブラリ: libcursesw.{a,so} (libncursesw.{a,so} へのシン
ボリックリンクおよびリンカスクリプト), libformw.{a,so}, libmenuw.
{a,so}, libncurses++w.a, libncursesw.{a,so}, libpanelw.{a,so} これらに
加えてワイド文字対応ではない通常のライブラリで、その名称から "w" を取り
除いたもの。

概略説明

captoinfo        termcap の記述を terminfo の記述に変換します。

clear            画面消去が可能ならこれを行います。

infocmp          terminfo の記述どうしを比較したり出力したりします。

infotocap        terminfo の記述を termcap の記述に変換します。

ncursesw5-config ncurses の設定情報を提供します。

reset            端末をデフォルト設定に初期化します。

                 terminfo の定義項目に対するコンパイラです。 これはソー
                 ス形式の terminfo ファイルをバイナリ形式に変換し、
tic              ncurses ライブラリ内の処理ルーチンが利用できるようにし
                 ます。 terminfo ファイルは特定端末の特性に関する情報が
                 記述されるものです。

toe              利用可能なすべての端末タイプを一覧表示します。 そこで
                 は端末名と簡単な説明を示します。

                 端末に依存する機能設定をシェルが利用できるようにします
tput             。 また端末のリセットや初期化、あるいは長い端末名称の
                 表示も行います。

tset             端末の初期化に利用します。

libcurses        libncurses へのリンク。

                 様々な方法により端末画面上に文字列を表示するための関数
libncurses       を提供します。 これらの関数を用いた具体例として、カー
                 ネルの make menuconfig の実行によって表示されるメニュ
                 ーがあります。

libform          フォームを実装するための関数を提供します。

libmenu          メニューを実装するための関数を提供します。

libpanel         パネルを実装するための関数を提供します。

6.20. Util-linux-ng-2.17

Util-linux パッケージは様々なユーティリティプログラムを提供します。 フ
ァイルシステム、コンソール、パーティション、カーネルメッセージなどを取
り扱うユーティリティです。

概算ビルド時間: 0.6 SBU
必要ディスク容量: 40 MB

6.20.1. FHS コンプライアンス情報

FHS では adjtime ファイルの配置場所として /etc ディレクトリではなく /
var/lib/hwclock ディレクトリを推奨しています。hwclock プログラムを FHS
準拠とするために以下を実行します。

sed -e 's@etc/adjtime@var/lib/hwclock/adjtime@g' \
    -i $(grep -rl '/etc/adjtime' .)
mkdir -pv /var/lib/hwclock

6.20.2. Util-linux-ng のインストール

./configure --enable-arch --enable-partx --enable-write

configure オプションの意味：

--enable-arch

    arch プログラムをビルドします。

--enable-partx

    addpart、delpart、partx プログラムをビルドします。

--enable-write

    write プログラムをビルドします。

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

make

このパッケージにテストスイートはありません。

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

make install

6.20.3. Util-linux-ng の構成

インストールプログラム: addpart, agetty, arch, blkid, blockdev, cal,
cfdisk, chkdupexe, chrt, col, colcrt, colrm, column, ctrlaltdel,
cytune, ddate, delpart, dmesg, fdformat, fdisk, findfs, flock, fsck,
fsck.cramfs, fsck.minix, getopt, hexdump, hwclock, i386, ionice, ipcmk,
ipcrm, ipcs, isosize, ldattach, line, linux32, linux64, logger, look,
losetup, lscpu, mcookie, mkfs, mkfs.bfs, mkfs.cramfs, mkfs.minix,
mkswap, more, mount, namei, partx, pg, pivot_root, readprofile, rename,
renice, rev, rtcwake, script, scriptreplay, setarch, setsid, setterm,
sfdisk, swapoff (swapon へのリンク), swapon, switch_root, tailf,
taskset, tunelp, ul, umount, uuidd, uuidgen, wall, whereis, write
インストールライブラリ: libblkid.{a,so}, libuuid.{a,so}

概略説明

addpart      Linux カーネルに対して新しいパーティションの情報を通知しま
             す。

agetty       tty ポートを開いてログイン名の入力を受け付けます。 そして
             login プログラムを起動します。

arch         マシンアーキテクチャを表示します。

blkid        ブロックデバイスの属性を見つけて表示するためのコマンドライ
             ンユーティリティー。

blockdev     コマンドラインからブロックデバイスの ioctl の呼び出しを行
             います。

cal          簡単なカレンダーを表示します。

cfdisk       指定されたデバイスのパーティションテーブルを操作します。

chkdupexe    重複している実行モジュールを探します。

chrt         リアルタイムプロセスの属性を操作します。

col          逆改行 (resverse line feeds) を取り除きます。

colcrt       性能が不十分な端末のために nroff の出力結果から重ね書き
             (overstriking) や半改行 (half-lines) を取り除きます。

colrm        指定されたカラムを取り除きます。

column       指定されたファイルの内容を複数カラムに整形します。

ctrlaltdel   ハードリセットまたはソフトリセットを行うために
             Ctrl+Alt+Del キー押下時の機能を設定します。

cytune       Cyclades カード用のシリアルラインドライバのパラメータを設
             定します。

             ディスコルディア暦 (Discordian) の日付を表示します。 また
ddate        は指定されたグレゴリオ暦 (Gregorian) の日付をディスコルデ
             ィア暦の日付に変換します。

delpart      Linux カーネルに対してパーティションが削除されているかどう
             かを確認します。

dmesg        カーネルのブートメッセージをダンプします。

fdformat     フロッピーディスクの低レベル (low-level) フォーマットを行
             います。

fdisk        指定されたデバイスのパーティションテーブルを操作します。

findfs       ファイルシステムに対するラベルまたは UUID (Universally
             Unique Identifier) を使ってファイルシステムを検索します。

flock        ファイルロックを取得して、ロックしたままコマンドを実行しま
             す。

fsck         ファイルシステムのチェックを行い、必要に応じて修復を行いま
             す。

fsck.cramfs  指定されたデバイス上の Cramfs ファイルシステムに対して一貫
             性検査 (consistency check) を行います。

fsck.minix   指定されたデバイス上の Minix ファイルシステムに対して一貫
             性検査 (consistency check) を行います。

getopt       指定されたコマンドラインのオプション引数を解析します。

hexdump      指定されたファイルを 16進数書式または他の指定された書式で
             ダンプします。

             システムのハードウェアクロックを読み取ったり設定したりしま
hwclock      す。 このハードウェアクロックはリアルタイムクリック
             (Real-Time Clock; RTC) または BIOS (Basic Input-Output
             System) クロックとも呼ばれます。

i386         setarch へのシンボリックリンク。

ionice       プログラムに対する I/O スケジュールクラスとスケジュール優
             先度を取得または設定します。

ipcmk        様々な IPC リソースを生成します。

ipcrm        指定された IPC (Inter-Process Communication) リソースを削
             除します。

ipcs         IPC のステータス情報を提供します。

isosize      iso9660 ファイルシステムのサイズを表示します。

ldattach     シリアル回線 (serial line) に対して回線規則 (line
             discipline) を割り当てます。

line         単一行をコピーします。

linux32      setarch へのシンボリックリンク。

linux64      setarch へのシンボリックリンク。

logger       指定したメッセージをシステムログに出力します。

look         指定された文字列で始まる行を表示します。

losetup      ループデバイス (loop device) の設定と制御を行います。

lscpu        CPU アーキテクチャの情報を表示します。

mcookie      xauth のためのマジッククッキー (128ビットのランダムな16進
             数値) を生成します。

mkfs         デバイス上にファイルシステムを構築します。 (通常はハードデ
             ィスクパーティションに対して行います。)

mkfs.bfs     SCO (Santa Cruz Operations) の bfs ファイルシステムを生成
             します。

mkfs.cramfs  cramfs ファイルシステムを生成します。

mkfs.minix   Minix ファイルシステムを生成します。

mkswap       指定されたデバイスまたはファイルをスワップ領域として初期化
             します。

more         テキストを一度に一画面分だけ表示するフィルタプログラム。

mount        ファイルシステムツリー内の特定のディレクトリを、指定された
             デバイス上のファイルシステムに割り当てます。

namei        指定されたパスに存在するシンボリックリンクを表示します。

partx        カーネルに対して、ディスク上にパーティションが存在するか、
             何番が存在するかを伝えます。

pg           テキストファイルを一度に一画面分表示します。

pivot_root   指定されたファイルシステムを、現在のプロセスに対する新しい
             ルートファイルシステムにします。

readprofile  カーネルのプロファイリング情報を読み込みます。

rename       指定されたファイルの名称を変更します。

renice       実行中のプロセスの優先度を変更します。

rev          指定されたファイル内の行の並びを入れ替えます。

rtcwake      指定された起動時刻までの間、システムをスリープ状態とするモ
             ードを指定します。

script       端末セッション上での出力結果の写し (typescript) を生成しま
             す。

scriptreplay タイミング情報 (timing information) を利用して、出力結果の
             写し (typescript) を再生します。

             新しいプログラム環境にて、表示されるアーキテクチャを変更し
setarch      ます。 また設定フラグ (personality flag) の設定も行います
             。

setsid       新しいセッションで指定されたプログラムを実行します。

setterm      端末の属性を設定します。

sfdisk       ディスクパーティションテーブルを操作します。

swapoff      ページングまたはスワッピングに利用しているデバイスまたはフ
             ァイルを無効にします。

             ページングまたはスワッピングに利用しているデバイスまたはフ
swapon       ァイルを有効にします。 また現在利用されているデバイスまた
             はファイルを一覧表示します。

switch_root  別のファイルシステムを、マウントツリーのルートとして変更し
             ます。

             ログファイルの更新を監視します。 ログファイルの最終の10行
tailf        が表示され、ログファイルに新たに書き込みが行われると表示更
             新します。

taskset      プロセスの CPU 親和性 (affinity) を表示または設定します。

tunelp       ラインプリンタのパラメータを設定します。

ul           使用中の端末にて、アンダースコア文字を、エスケープシーケン
             スを用いた下線文字に変換するためのフィルタ。

umount       システムのファイルツリーからファイルシステムを切断します。

uuidd        UUID ライブラリから利用されるデーモン。 時刻情報に基づく
             UUID を、安全にそして一意性を確保して生成します。

             新しい UUID を生成します。 生成される UUID は当然、他に生
uuidgen      成されている UUID とは異なり、自他システムでも過去現在にわ
             たってもユニークなものです。

             ファイルの内容、あるいはデフォルトでは標準入力から入力され
wall         た内容を、現在ログインしている全ユーザーの端末上に表示しま
             す。

whereis      指定されたコマンドの実行モジュール・ソース・man ページの場
             所を表示します。

write        指定されたユーザーに対してメッセージを送信します。 ただし 
             そのユーザーがメッセージ受信が可能である場合に限ります。

libblkid     デバイスの識別やトークンの抽出を行う処理ルーチンを提供しま
             す。

             ローカルシステム内だけに限らずアクセスされるオブジェクトに
libuuid      対して、一意性が保証された識別子を生成する処理ルーチンを提
             供します。

6.21. E2fsprogs-1.41.10

E2fsprogs パッケージは ext2 ファイルシステムを扱うユーティリティを提供
します。これは同時に ext3、ext4 ジャーナリングファイルシステムもサポー
トします。

概算ビルド時間: 0.5 SBU テストスイート込み
必要ディスク容量: 45 MB テストスイート込み

6.21.1. E2fsprogs のインストール

E2fsprogs パッケージは、ソースディレクトリ内にサブディレクトリを作って
ビルドすることが推奨されています。

mkdir -v build
cd build

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

../configure --prefix=/usr --with-root-prefix="" \
    --enable-elf-shlibs --disable-libblkid --disable-libuuid \
    --disable-uuidd --disable-fsck

configure オプションの意味：

--with-root-prefix=""

    e2fsck などのプログラムは、極めて重要なものです。 例えば /usr ディ
    レクトリがマウントされていない時であっても、そういったプログラムは
    動作しなければなりません。 それらは /lib ディレクトリや /sbin ディ
    レクトリに置かれるべきものです。 もしこのオプションの指定がなかった
    ら、プログラムが /usr ディレクトリにインストールされてしまいます。

--enable-elf-shlibs

    このオプションは、本パッケージ内のプログラムが利用する共有ライブラ
    リを生成します。

--disable-*

    このオプションは libuuid ライブラリ、 libblkid ライブラリ、 uuidd
    デーモン、 fsck ラッパーをいずれもビルドせずインストールしないよう
    にします。 これらは Util-Linux-NG パッケージによって既にインストー
    ルされています。

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

make

コンパイル結果をテストするには以下を実行します。

make check

E2fsprogs にて行われるテストの中には 256 MB のメモリ割り当てを行うもの
があります。 この容量を確保できるだけの RAM がない場合は、十分なスワッ
プ領域を確保することが推奨されています。 スワップ領域の生成と有効化につ
いては 2.3. 「ファイルシステムの生成」 と 2.4. 「新しいパーティションの
マウント」 を参照してください。

実行モジュール、ドキュメント、共有ライブラリをインストールします。

make install

スタティックライブラリとヘッダファイルをインストールします。

make install-libs

スタティックライブラリへの書き込みを可能とします。 これは後にデバッグシ
ンボルを取り除くために必要となります。

chmod -v u+w /usr/lib/{libcom_err,libe2p,libext2fs,libss}.a

本パッケージは gzip 圧縮された.info ファイルをインストールしますが、共
通的な dir を更新しません。 そこで以下のコマンドにより gzip ファイルを
解凍した上で dir ファイルを更新します。

gunzip -v /usr/share/info/libext2fs.info.gz
install-info --dir-file=/usr/share/info/dir \
             /usr/share/info/libext2fs.info

必要なら、以下のコマンドを実行して追加のドキュメントをインストールしま
す。

makeinfo -o      doc/com_err.info ../lib/et/com_err.texinfo
install -v -m644 doc/com_err.info /usr/share/info
install-info --dir-file=/usr/share/info/dir \
             /usr/share/info/com_err.info

6.21.2. E2fsprogs の構成

インストールプログラム: badblocks, chattr, compile_et, debugfs,
dumpe2fs, e2freefrag, e2fsck, e2image, e2initrd_helper, e2label,
e2undo, 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}

概略説明

badblocks       デバイス (通常はディスクパーティション) の不良ブロック
                を検索します。

                ext2 ファイルシステム上のファイル属性を変更します。
chattr          ext2 ファイルシステムのジャーナリング版である ext3 ファ
                イルシステムにおいても変更を行います。

                エラーテーブルコンパイラ。 これはエラーコード名とメッセ
compile_et      ージの一覧を、 com_err ライブラリを利用する C ソースコ
                ードとして変換するものです。

debugfs         ファイルシステムデバッガ。 これは ext2 ファイルシステム
                の状態を調査し変更することができます。

                指定されたデバイス上にあるファイルシステムについて、 ス
dumpe2fs        ーパーブロックの情報とブロックグループの情報を表示しま
                す。

e2freefrag      空きディスク部分のフラグメンテーションに関する情報を表
                示します。

e2fsck          ext2 ファイルシステムと ext3 ファイルシステムをチェック
                し、必要なら修復を行うことができます。

e2image         ext2 ファイルシステムの重要なデータをファイルに保存しま
                す。

e2initrd_helper 指定されたファイルシステムの FS タイプを表示します。 デ
                バイス名やラベルを指定することもできます。

e2label         指定されたデバイス上にある ext2 ファイルシステムのラベ
                ルを表示または変更します。

                デバイス上にある ext2/ext3/ext4 ファイルシステムの undo
e2undo          ログを再実行します。 これは e2fsprogs プログラムが処理
                に失敗した際に undo を行うこともできます。

filefrag        特定のファイルのフラグメンテーション化がどれほど進んで
                いるかを表示します。

fsck.ext2       デフォルトでは ext2 ファイルシステムをチェックします。
                これは e2fsck へのハードリンクです。

fsck.ext3       デフォルトでは ext3 ファイルシステムをチェックします。
                これは e2fsck へのハードリンクです。

fsck.ext4       デフォルトでは ext4 ファイルシステムをチェックします。
                これは e2fsck へのハードリンクです。

fsck.ext4dev    デフォルトでは ext4 ファイルシステムの開発版をチェック
                します。 これは e2fsck へのハードリンクです。

logsave         コマンドの出力結果をログファイルに保存します。

lsattr          ext2 ファイルシステム上のファイル属性を一覧表示します。

                コマンド名とヘルプメッセージの一覧を、 サブシステムライ
mk_cmds         ブラリ libss を利用する C ソースコードとして変換するも
                のです。

mke2fs          指定されたデバイス上に ext2 ファイルシステム、または
                ext3 ファイルシステムを生成します。

mkfs.ext2       デフォルトでは ext2 ファイルシステムを生成します。 これ
                は mke2fs へのハードリンクです。

mkfs.ext3       デフォルトでは ext3 ファイルシステムを生成します。 これ
                は mke2fs へのハードリンクです。

mkfs.ext4       デフォルトでは ext4 ファイルシステムを生成します。 これ
                は mke2fs へのハードリンクです。

mkfs.ext4dev    デフォルトでは ext4 ファイルシステム開発版を生成します
                。 これは mke2fs へのハードリンクです。

                ext2 ファイルシステム上に lost+found ディレクトリを生成
mklost+found    するために利用します。 このコマンドはそのディレクトリに
                対してあらかじめディスクブロックの情報を割り当てておく
                ことで、 e2fsck コマンドの負荷を軽減します。

resize2fs       ext2 ファイルシステムを拡張または縮小するために利用しま
                す。

tune2fs         ext2 ファイルシステム上にて調整可能なシステムパラメータ
                を調整します。

libcom_err      共通的なエラー表示ルーチン。

libe2p          以下のコマンド dumpe2fs、 chattr、 lsattr が利用します
                。

libext2fs       ユーザーレベルのプログラムが ext2 ファイルシステムを操
                作可能とするためのルーチンを提供します。

libss           debugfs コマンドが利用します。

6.22. Coreutils-8.4

Coreutils パッケージはシステムの基本的な特性を表示したり設定したりする
ためのユーティリティを提供します。

概算ビルド時間: 3.2 SBU テストスイート込み
必要ディスク容量: 98 MB テストスイート込み

6.22.1. Coreutils のインストール

このパッケージが提供するプログラムとして uname があります。 このプログ
ラムは -p オプションを指定したとき、常に unknown を返すという問題があり
ます。 インテルアーキテクチャの CPU に対して、以下のパッチによりこれを
修正します。

case `uname -m` in
 i?86 | x86_64) patch -Np1 -i ../coreutils-8.4-uname-1.patch ;;
esac

POSIX では Coreutils により生成されるプログラムは、マルチバイトロケール
であっても、文字データを正しく取り扱うことを求めています。 以下のパッチ
は標準に準拠することと、国際化処理に関連するバグを解消することを行いま
す。

patch -Np1 -i ../coreutils-8.4-i18n-1.patch

注記

このパッチには以前は多くのバグがありました。 新たなバグを発見したら、
Coreutils の開発者に報告する前に、このパッチを適用せずにバグが再現する
かどうかを確認してください。

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

./configure --prefix=/usr \
    --enable-no-install-program=kill,uptime

configure オプションの意味：

--enable-no-install-program=kill,uptime

    指定のプログラムは、後に他のパッケージからインストールするため
    Coreutils からはインストールしないことを指示します。

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

make

テストスイートを実行しない場合は 「パッケージをインストールします。」
と書かれたところまで読み飛ばしてください。

テストスイートを実行します。 まずは root ユーザーに対するテストを実行し
ます。

make NON_ROOT_USERNAME=nobody check-root

ここからのテストは nobody ユーザーにより実行します。 ただしいくつかのテ
ストでは、複数のグループに属するユーザーを必要とします。 そのようなテス
トを確実に実施するために、一時的なグループを作って nobody ユーザーがそ
れに属するようにします。

echo "dummy:x:1000:nobody" >> /etc/group

特定のファイルのパーミッションを変更して root ユーザー以外でもコンパイ
ルとテストができるようにします。

chown -Rv nobody .

テストを実行します。

su-tools nobody -s /bin/bash -c "make RUN_EXPENSIVE_TESTS=yes check"

一時的に作成したグループを削除します。

sed -i '/dummy/d' /etc/group

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

make install

FHS が規定しているディレクトリにプログラムを移します。

mv -v /usr/bin/{cat,chgrp,chmod,chown,cp,date,dd,df,echo} /bin
mv -v /usr/bin/{false,ln,ls,mkdir,mknod,mv,pwd,rm} /bin
mv -v /usr/bin/{rmdir,stty,sync,true,uname} /bin
mv -v /usr/bin/chroot /usr/sbin

LFS-ブートスクリプトパッケージにあるスクリプトでは、 head、 sleep、
nice に依存しているものがあります。 ブート処理の初期段階においては /usr
ディレクトリは認識されないため、上のプログラムはルートパーティションに
移す必要があります。

mv -v /usr/bin/{head,sleep,nice} /bin

6.22.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, id, install, join, link, ln, logname, ls,
md5sum, mkdir, mkfifo, mknod, mktemp, mv, nice, nl, nohup, nproc, od,
paste, pathchk, pinky, pr, printenv, printf, ptx, pwd, readlink, 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

概略説明

base64    base64 (RFC 3548) 規格に従ってデータのエンコード、デコードを
          行います。

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進数) を表示します。

id        現在のユーザーあるいは指定されたユーザーについて、有効なユー
          ザーID、グループID、所属グループを表示します。

install   ファイルコピーを行います。その際にパーミッションモードを設定
          し、可能なら所有者やグループも設定します。

join      2つのファイル内にて共通項を持つ行を結合します。

link      指定された名称により、ファイルへのハードリンクを生成します。

ln        ファイルに対するハードリンク、あるいはソフトリンク (シンボリ
          ックリンク) を生成します。

logname   現在のユーザーのログイン名を表示します。

ls        指定されたディレクトリ内容を一覧表示します。

md5sum    MD5 (Message Digest 5) チェックサム値を表示、あるいはチェック
          します。

mkdir     指定された名前のディレクトリを生成します。

          指定された名前の FIFO (First-In, First-Out) を生成します。 こ
mkfifo    れは UNIX の用語で 「名前付きパイプ (named pipe)」 とも呼ばれ
          ます。

          指定された名前のデバイスノードを生成します。 デバイスノードは
mknod     キャラクタ型特殊ファイル (character special file)、ブロック特
          殊ファイル (block special file)、FIFO です。

mktemp    安全に一時ファイルを生成します。 これはスクリプト内にて利用さ
          れます。

mv        ファイルあるいはディレクトリを移動、名称変更します。

nice      スケジューリング優先度を変更してプログラムを実行します。

nl        指定されたファイル内の行を数えます。

nohup     ハングアップに関係なくコマンドを実行します。 その出力はログフ
          ァイルにリダイレクトされます。

nproc     プロセスが利用可能なプロセスユニット (processing unit) の数を
          表示します。

od        ファイル内容を 8進数または他の書式でダンプします。

paste     指定された複数ファイルを結合します。 その際には各行を順に並べ
          て結合し、その間をタブ文字で区切ります。

pathchk   ファイル名が有効で移植可能であるかをチェックします。

pinky     軽量な finger クライアント。 指定されたユーザーに関する情報を
          表示します。

pr        ファイルを印刷するために、ページ番号を振りカラム整形を行いま
          す。

printenv  環境変数の内容を表示します。

printf    指定された引数を指定された書式で表示します。 C 言語の printf
          関数に似ています。

ptx       指定されたファイル内のキーワードに対して整列済インデックス
          (permuted index) を生成します。

pwd       現在の作業ディレクトリ名を表示します。

readlink  指定されたシンボリックリンクの対象を表示します。

rm        ファイルまたはディレクトリを削除します。

rmdir     ディレクトリが空である時にそのディレクトリを削除します。

runcon    指定されたセキュリティコンテキストでコマンドを実行します。

seq       指定された範囲と増分に従って数値の並びを表示します。

sha1sum   160 ビットの SHA1 (Secure Hash Algorithm 1) チェックサム値を
          表示またはチェックします。

sha224sum 224 ビットの SHA1 チェックサム値を表示またはチェックします。

sha256sum 256 ビットの SHA1 チェックサム値を表示またはチェックします。

sha384sum 384 ビットの SHA1 チェックサム値を表示またはチェックします。

sha512sum 512 ビットの SHA1 チェックサム値を表示またはチェックします。

shred     指定されたファイルに対して、複雑なパターンデータを繰り返し上
          書きすることで、データ復旧を困難なものにします。

shuf      テキスト行を入れ替えます。

sleep     指定時間だけ停止します。

sort      指定されたファイル内の行をソートします。

split     指定されたファイルを、バイト数または行数を指定して分割します
          。

stat      ファイルやファイルシステムのステータスを表示します。

stdbuf    本コマンド実行により、標準ストリームに対するバッファリング操
          作を変更します。

stty      端末回線の設定や表示を行います。

sum       指定されたファイルのチェックサムやブロック数を表示します。

          ファイルシステムのバッファを消去します。 変更のあったブロック
sync      は強制的にディスクに書き出し、スーパーブロック (super block)
          を更新します。

tac       指定されたファイルを逆順にして連結します。

tail      指定されたファイルの最終の10行 (あるいは指定された行数) を表
          示します。

tee       標準入力を読み込んで、標準出力と指定ファイルの双方に出力しま
          す。

test      ファイルタイプの比較やチェックを行います。

timeout   指定時間内だけコマンドを実行します。

          ファイルのタイムスタンプを更新します。 そのファイルに対するア
touch     クセス時刻、更新時刻を現在時刻にするものです。 そのファイルが
          存在しなかった場合はゼロバイトのファイルを新規生成します。

tr        標準入力から読み込んだ文字列に対して、変換・圧縮・削除を行い
          ます。

true      何も行わず処理に成功します。これは常に成功を意味するステータ
          スコードを返して終了します。

truncate  ファイルを指定されたサイズに縮小または拡張します。

tsort     トポロジカルソート (topological sort) を行います。 指定された
          ファイルの部分的な順序に従って並び替えリストを出力します。

tty       標準入力に接続された端末のファイル名を表示します。

uname     システム情報を表示します。

unexpand  空白文字をタブ文字に変換します。

uniq      連続する同一行を一行のみ残して削除します。

unlink    指定されたファイルを削除します。

users     現在ログインしているユーザー名を表示します。

vdir      ls -l と同じ。

wc        指定されたファイルの行数、単語数、バイト数を表示します。 複数
          ファイルが指定された場合はこれに加えて合計も出力します。

who       誰がログインしているかを表示します。

whoami    現在有効なユーザーIDに関連づいているユーザー名を表示します。

yes       処理が停止されるまで繰り返して 「y」 または指定文字を出力しま
          す。

6.23. Iana-Etc-2.30

Iana-Etc パッケージはネットワークサービスやプロトコルのためのデータを提
供します。

概算ビルド時間: 0.1 SBU 以下
必要ディスク容量: 2.3 MB

6.23.1. Iana-Etc のインストール

以下のコマンドを実行します。 これは IANA が提供している生のデータを正し
い書式のデータとして変換し /etc/protocols ファイルと /etc/services ファ
イルとして生成します。

make

このパッケージにはテストスイートはありません。

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

make install

6.23.2. Iana-Etc の構成

インストールファイル: /etc/protocols, /etc/services

概略説明

/etc/     TCP/IP により利用可能な様々な DARPA インターネットプロトコル
protocols (DARPA Internet protocols) を記述しています。

/etc/     インターネットサービスを分かりやすく表現した名称と、その割り
services  当てポートおよびプロトコルの種類の対応情報を提供します。

6.24. M4-1.4.13

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

概算ビルド時間: 0.4 SBU テストスイート込み
必要ディスク容量: 14.2 MB

6.24.1. M4 のインストール

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

./configure --prefix=/usr

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

make

コンパイル結果をテストするために以下を実行します。

make check

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

make install

6.24.2. M4 の構成

インストールプログラム: m4

概略説明

   指定されたファイル内のマクロ定義を展開して、そのコピーを生成します。
   マクロ定義には埋め込み (built-in) マクロとユーザー定義マクロがあり、
   いくらでも引数を定義することができます。 マクロ定義の展開だけでなく
m4 m4 には以下のような埋め込み関数があります。 指定ファイルの読み込み、
   Unix コマンド実行、整数演算処理、テキスト操作、再帰処理などです。 m4
   プログラムはコンパイラのフロントエンドとして利用することができ、それ
   自体でマクロプロセッサとして用いることもできます。

6.25. Bison-2.4.1

Bison パッケージは構文解析ツールを提供します。

概算ビルド時間: 1.1 SBU
必要ディスク容量: 19.2 MB

6.25.1. Bison のインストール

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

./configure --prefix=/usr

bison プログラムが $PATH 上にない場合に、この Bison の configure を行っ
てビルドすると、国際化されたエラーメッセージのサポートがないままビルド
されてしまいます。 これを正すために以下の設定を追加します。

echo '#define YYENABLE_NLS 1' >> lib/config.h

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

make

コンパイル結果をテストするなら以下を実行します。(約 0.5 SBU)

make check

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

make install

6.25.2. Bison の構成

インストールプログラム: bison, yacc
インストールライブラリ: liby.a

概略説明

       構文規則の記述に基づいて、テキストファイルの構造を解析するプログ
bison  ラムを生成します。 Bison は Yacc (Yet Another Compiler Compiler)
       の互換プログラムです。

       bison のラッパースクリプト。 yacc プログラムがあるなら bison を
yacc   呼び出さずに yacc を実行します。 -y オプションが指定された時は
       bison を実行します。

       Yacc 互換の関数として yyerror 関数と main 関数を含むライブラリで
liby.a す。 このライブラリはあまり使い勝手の良いものではありません。 た
       だし POSIX ではこれが必要になります。

6.26. Procps-3.2.8

Procps パッケージはプロセス監視を行うプログラムを提供します。

概算ビルド時間: 0.1 SBU
必要ディスク容量: 2.3 MB

6.26.1. Procps のインストール

watch コマンドにおいて、ユニコードに関する問題を修正するためにパッチを
適用します。

patch -Np1 -i ../procps-3.2.8-watch_unicode-1.patch

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

make

このパッケージにテストスイートはありません。

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

make install

6.26.2. Procps の構成

インストールプログラム: free, kill, pgrep, pkill, pmap, ps, pwdx,
skill, slabtop, snice, sysctl, tload, top, uptime, vmstat, w, watch
インストールライブラリ: libproc.so

概略説明

free    物理メモリ、スワップメモリの双方において、メモリの使用量、未使
        用量を表示します。

kill    プロセスに対してシグナルを送信します。

pgrep   プロセスの名前などの属性によりプロセスを調べます。

pkill   プロセスの名前などの属性によりプロセスに対してシグナルを送信し
        ます。

pmap    指定されたプロセスのメモリマップを表示します。

ps      現在実行中のプロセスを一覧表示します。

pwdx    プロセスが実行されているカレントディレクトリを表示します。

skill   指定された条件に合致するプロセスに対してシグナルを送信します。

slabtop リアルタイムにカーネルのスラブキャッシュ (slab cache) 情報を詳
        細に示します。

snice   指定された条件に合致するプロセスのスケジュール優先度
        (scheduleing priority) を表示します。

sysctl  システム稼動中にカーネル設定を修正します。

tload   システムの負荷平均 (load average) をグラフ化して表示します。

top     CPU をより多く利用しているプロセスの一覧を表示します。 これはリ
        アルタイムにプロセッサの動作状況を逐次表示します。

uptime  システムの稼動時間、ログインユーザー数、システム負荷平均 (load
        average) を表示します。

        仮想メモリの統計情報を表示します。 そこではプロセス、メモリ、ペ
vmstat  ージング、ブロック入出力 (Input/Output; IO) トラップ、CPU 使用
        状況を表示します。

w       どのユーザーがログインしていて、どこから、そしていつからログイ
        ンしているかを表示します。

        指定されたコマンドを繰り返し実行します。 そしてその出力結果の先
watch   頭の一画面分を表示します。 出力結果が時間の経過とともにどのよう
        に変わるかを確認することができます。

libproc 本パッケージのほとんどのプログラムが利用している関数を提供しま
        す。

6.27. Grep-2.5.4

Grep パッケージはファイル内の検索を行うプログラムを提供します。

概算ビルド時間: 0.1 SBU
必要ディスク容量: 7.3 MB

6.27.1. Grep のインストール

現時点の Grep パッケージには、特にマルチバイトロケールに関する処理にお
いて多くのバグがあります。 以下のパッチは Debian プロジェクトによるもの
であり、いくつかのバグを修正します。 またいくつかのテストが成功するよう
になり、UTF-8 ロケールでの処理性能が改善されます。

patch -Np1 -i ../grep-2.5.4-debian_fixes-1.patch

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

./configure --prefix=/usr \
    --bindir=/bin \
    --without-included-regex

configure オプションの意味：

--without-included-regex

    Glibc-2.11.1 において本パッケージをビルドした場合、configure による
    Glibc の正規表現ライブラリのチェックが正しく機能しません。 本オプシ
    ョンは Glibc の正規表現ライブラリを強制的に利用するよう指定します。

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

make

コンパイル結果をテストするには以下を実行します。

make check || true

fmbtest.sh に対するテストは失敗します。 "|| true" という入力は、自動的
にビルドを行うようなスクリプトを用いた場合に、テストが失敗しても処理続
行するようにするものです。 正常に処理されれば 14つのテストのうち 1つの
テスト失敗だけとなりますが、サブテストが 2つ失敗します。

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

make install

6.27.2. Grep の構成

インストールプログラム: egrep, fgrep, grep

概略説明

egrep 拡張正規表現 (extended regular expression) にマッチした行を表示し
      ます。

fgrep 固定文字列の一覧にマッチした行を表示します。

grep  基本的な正規表現に合致した行を出力します。

6.28. Readline-6.1

Readline パッケージは、コマンドラインの編集や履歴管理を行うライブラリを
提供します。

概算ビルド時間: 0.2 SBU
必要ディスク容量: 13.8 MB

6.28.1. Readline のインストール

Readline を再インストールすると、それまでの古いライブラリは <ライブラリ
名>.old というファイル名でコピーされます。 これは普通は問題ないことです
が ldconfig によるリンクに際してエラーを引き起こすことがあります。 これ
を避けるため以下の二つの sed コマンドを実行します。

sed -i '/MV.*old/d' Makefile.in
sed -i '/{OLDSUFF}/c:' support/shlib-install

Readline のドキュメントに示されるバージョン番号を適切なものにします。

sed -i -e 's/0x0600/0x0601/' \
       -e 's/6\.0/6.1/' \
       -e 's/RL_VERSION_MINOR\t0/RL_VERSION_MINOR\t1/' readline.h

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

./configure --prefix=/usr --libdir=/lib

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

make SHLIB_LIBS=-lncurses

make オプションの意味：

SHLIB_LIBS=-lncurses

    このオプションにより Readline を libncurses ライブラリ (その実体は
    libncursesw ライブラリ) にリンクします。

このパッケージにテストスイートはありません。

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

make install

スタティックライブラリを適切なディレクトリに移動します。

mv -v /lib/lib{readline,history}.a /usr/lib

次に /lib ディレクトリにある .so ファイルを削除して、それらを /usr/lib
にリンクし直します。

rm -v /lib/lib{readline,history}.so
ln -sfv ../../lib/libreadline.so.6 /usr/lib/libreadline.so
ln -sfv ../../lib/libhistory.so.6 /usr/lib/libhistory.so

必要ならドキュメントをインストールします。

mkdir   -v       /usr/share/doc/readline-6.1
install -v -m644 doc/*.{ps,pdf,html,dvi} \
                 /usr/share/doc/readline-6.1

6.28.2. Readline の構成

インストールライブラリ: libhistory.{a,so}, libreadline.{a,so}

概略説明

libhistory  入力履歴を適切に再現するためのユーザーインターフェースを提
            供します。

libreadline コマンドラインインターフェースを提供している様々なコマンド
            において、適切なインターフェースを提供します。

6.29. Bash-4.1

Bash は Bourne-Again SHell を提供します。

概算ビルド時間: 1.4 SBU
必要ディスク容量: 35 MB

6.29.1. Bash のインストール

Bash をコンパイルするための準備を行います。

./configure --prefix=/usr --bindir=/bin \
    --htmldir=/usr/share/doc/bash-4.1 --without-bash-malloc \
    --with-installed-readline

configure オプションの意味：

--htmldir

    このオプションは HTML ドキュメントをインストールするディレクトリを
    指定します。

--with-installed-readline

    このオプションは Bash が持つ独自の readline ライブラリではなく、既
    にインストールした readline ライブラリを用いることを指示します。

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

make

テストスィートを実行しない場合は 「パッケージをインストールします。」
と書かれた箇所まで読み飛ばしてください。

テストを実施するにあたっては、既に設定しているロケールが用いられるよう
に変更します。 また nobody ユーザーに対して標準入力からの読み込みを可能
とし、ソースツリーへの書き込みを可能とします。

sed -i 's/LANG/LC_ALL/' tests/intl.tests
sed -i 's@tests@& </dev/tty@' tests/run-test
chown -Rv nobody ./

nobody ユーザーでテストを実行します。

su-tools nobody -s /bin/bash -c "make tests"

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

make install

新たにコンパイルした bash プログラムを実行します。 (この時点までに実行
されていたものが置き換えられます。)

exec /bin/bash --login +h

注記

ここで指定しているパラメータは、対話形式のログインシェルとして、またハ
ッシュ機能を無効にして bash プロセスを起動します。 これにより新たに構築
するプログラム類は構築後すぐに利用できることになります。

6.29.2. Bash の構成

インストールプログラム: bash, bashbug, sh (bash へのリンク)

概略説明

        広く活用されているコマンドインタープリタ。 処理実行前には、指示
bash    されたコマンドラインを様々に展開したり置換したりします。 この機
        能があるからこそ、インタープリタ機能を強力なものにしています。

bashbug bash に関連したバグ報告を、標準書式で生成しメール送信することを
        補助するシェルスクリプトです。

        bash プログラムへのシンボリックリンク。 sh として起動された際に
sh      は、かつてのバージョンである sh の起動時の動作と、出来るだけ同
        じになるように振舞います。 同時に POSIX 標準に適合するよう動作
        します。

6.30. Libtool-2.2.6b

Libtool パッケージは GNU 汎用ライブラリをサポートするスクリプトを提供し
ます。 これは複雑な共有ライブラリをラップして一貫した可搬性を実現します
。

概算ビルド時間: 3.7 SBU テストスイート込み
必要ディスク容量: 35 MB テストスイート込み

6.30.1. Libtool のインストール

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

./configure --prefix=/usr

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

make

コンパイル結果をテストするには以下を実行します。(約 3.0 SBU)

make check

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

make install

6.30.2. Libtool の構成

インストールプログラム: libtool,libtoolize
インストールライブラリ: libltdl.{a,so}

概略説明

libtool    汎用的なライブラリ構築支援サービスを提供します。

libtoolize パッケージに対して libtool によるサポートを加える標準的手法
           を提供します。

libltdl    dlopen を行うライブラリの複雑さを隠蔽します。

6.31. GDBM-1.8.3

GDBM パッケージは GNU データベースマネージャを提供します。 このデータベ
ースはディスクファイル形式 (disk file format) のデータベースで、キーと
データのペア情報を一つのファイルに保持します。 各レコードのデータはユニ
ークキーによりインデックスづけされます。 テキストファイルに保存された状
態に比べて、より早く情報を抽出することができます。

概算ビルド時間: 0.1 SBU
必要ディスク容量: 2.7 MB

6.31.1. GDBM のインストール

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

./configure --prefix=/usr

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

make

このパッケージにはテストスイートはありません。

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

make install

さらに DBM、NDBM との互換性のあるヘッダファイルをインストールします。
LFS では取り扱っていないパッケージの中には、そのような dbm の古い処理ル
ーチンを使っているものがあるためです。

make install-compat

インストール時に多少の問題があるため直します。 info ファイルの目次に
GDBM を追加するものです。

install-info --dir-file=/usr/info/dir /usr/info/gdbm.info

6.31.2. GDBM の構成

インストールライブラリ: libgdbm.{so,a}, libgdbm_compat.{so,a}

概略説明

libgdbm ハッシュデータベースを取り扱う関数を提供します。

6.32. Inetutils-1.7

Inetutils パッケージはネットワーク制御を行う基本的なプログラムを提供し
ます。

概算ビルド時間: 0.4 SBU
必要ディスク容量: 17 MB

6.32.1. Inetutils のインストール

./configure --prefix=/usr --libexecdir=/usr/sbin \
    --localstatedir=/var --disable-ifconfig \
    --disable-logger --disable-syslogd --disable-whois \
    --disable-servers

configure オプションの意味：

--disable-ifconfig

    このオプションは ifconfig プログラムをインストールしないようにしま
    す。 このプログラムはネットワークインターフェースを設定するために利
    用するものです。 LFS では IPRoute2 パッケージが提供する ip コマンド
    を使うことにしています。

--disable-logger

    このオプションは logger プログラムをインストールしないようにします
    。 このプログラムはシステムログデーモンに対してメッセージ出力を行う
    スクリプトにて利用されます。 ここでこれをインストールしないのは、後
    に Util-linux パッケージにおいて、以前のバージョンをインストールす
    るためです。

--disable-syslogd

    このオプションは Inetutils がシステムログデーモンをインストールしな
    いようにします。 これらは Sysklogd パッケージにおいてインストールし
    ます。

--disable-whois

    このオプションは whois のクライアントプログラムをインストールしない
    ようにします。 このプログラムはもはや古いものです。 より良い whois
    プログラムのインストール手順については BLFS ブックにて説明していま
    す。

--disable-servers

    このオプションは Inetutils パッケージに含まれる様々なネットワークサ
    ーバーをインストールしないようにします。 これらのサーバーは基本的な
    LFS システムには不要なものと考えられます。 サーバーの中には本質的に
    セキュアでないものがあり、信頼のあるネットワーク内でのみしか安全に
    扱うことができないものもあります。 より詳細な情報は http://
    www.linuxfromscratch.org/blfs/view/svn/basicnet/inetutils.html を参
    照してください。 サーバーの多くは、これに代わる他の適切なものが存在
    します。

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

make

このパッケージにテストスイートはありません。

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

make install

プログラムのいくつかを FHS コンプライアントが定めるディレクトリに移動さ
せます。

mv -v /usr/bin/{hostname,ping,ping6} /bin
mv -v /usr/bin/traceroute /sbin

6.32.2. Inetutils の構成

インストールプログラム: ftp, hostname, ping, ping6, rcp, rexec, rlogin,
rsh, talk, telnet, tftp, traceroute

概略説明

ftp        ファイル転送プロトコル (file transfer protocol) に基づくプロ
           グラム。

hostname   ホスト名の表示または設定を行います。

ping       エコーリクエスト (echo-request) パケットを送信し、返信にどれ
           だけ要したかを表示します。

ping6      IPv6 ネットワーク向けの ping

rcp        リモートファイルコピーを行います。

rexec      リモートホスト上にてコマンドを実行します。

rlogin     リモートログインを行います。

rsh        リモートシェルを起動します。

talk       他ユーザーとのチャットに利用します。

telnet     TELNET プロトコルインターフェース。

tftp       軽量なファイル転送プログラム。 (trivial file transfer
           program)

           処理起動したホストからネットワーク上の他のホストまで、送出し
traceroute たパケットの経由ルートを追跡します。 その合間に検出されたす
           べての hops (= ゲートウェイ) も表示します。

6.33. Perl-5.10.1

Perl パッケージは Perl 言語 (Practical Extraction and Report Language)
を提供します。

概算ビルド時間: 5.5 SBU
必要ディスク容量: 171 MB テストスイート込み

6.33.1. Perl のインストール

Perl の設定ファイルが /etc/hosts ファイルを参照するので、まずはこのファ
イルを生成します。 このファイルはテストスイートを実行する際にも利用され
ます。

echo "127.0.0.1 localhost $(hostname)" > /etc/hosts

不正な utf-8 エンコーディングの文字があるとセグメンテーションフォールト
を起こすため、これを修正します。

patch -Np1 -i ../perl-5.10.1-utf8-1.patch

ここでビルドするバージョンの Perl は Compress::Raw::Zlib モジュールをビ
ルドします。 デフォルトではビルドの際に Zlib のソースを内部的にコピーし
ます。 以下のコマンドは、既にインストールされている Zlib ライブラリを用
いるようにします。

sed -i -e "s|BUILD_ZLIB\s*= True|BUILD_ZLIB = False|"           \
       -e "s|INCLUDE\s*= ./zlib-src|INCLUDE    = /usr/include|" \
       -e "s|LIB\s*= ./zlib-src|LIB        = /usr/lib|"         \
    ext/Compress-Raw-Zlib/config.in

Perl のビルド設定を完全に制御したい場合は 対話的な Configure スクリプト
を用いて手作業により行います。 Perl がデフォルトで定める設定でも構わな
い場合は、以下のコマンドにより Perl をコンパイルするための準備をします
。

sh Configure -des -Dprefix=/usr \
                  -Dvendorprefix=/usr           \
                  -Dman1dir=/usr/share/man/man1 \
                  -Dman3dir=/usr/share/man/man3 \
                  -Dpager="/usr/bin/less -isR"

configure オプションの意味：

-Dvendorprefix=/usr

    このオプションは各種の perl モジュールをどこにインストールするかを
    指定します。

-Dpager="/usr/bin/less -isR"

    このオプションは perldoc プログラムが less プログラムを呼び出す際の
    エラーを正します。

-Dman1dir=/usr/share/man/man1 -Dman3dir=/usr/share/man/man3

    まだ Groff をインストールしていないので Configure スクリプトが Perl
    の man ページを必要としないと判断してしまいます。 このオプションを
    指定することによりその判断を正します。

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

make

コンパイル結果をテストするには以下を実行します。(約 2.5 SBU)

make test

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

make install

6.33.2. Perl の構成

インストールプログラム: a2p, c2ph, config_data, corelist, cpan,
cpan2dist, cpanp, cpanp-run-perl, dprofpp, enc2xs, find2perl, h2ph,
h2xs, instmodsh, libnetcfg, perl, perl5.10.1 (perl へのリンク),
perlbug, perldoc, perlivp, piconv, pl2pm, pod2html, pod2latex, pod2man,
pod2text, pod2usage, podchecker, podselect, prove, psed (s2p へのリン
ク), pstruct (c2ph へのリンク), ptar, ptardiff, s2p, shasum, splain,
xsubpp
インストールライブラリ: ここでは列記できないほどの数多くのライブラリ

概略説明

a2p            awk スクリプトを Perl スクリプトに変換します。

c2ph           cc -g -S によって生成されるような C 言語構造体をダンプし
               ます。

config_data    Perl モジュールの設定を検索または変更します。

corelist       Module::CoreList に対するコマンドラインフロントエンド。

cpan           コマンドラインから CPAN (Comprehensive Perl Archive
               Network) との通信を行います。

cpan2dist      CPANPLUS の配布物生成ツール。

cpanp          CPANPLUS ランチャー。

cpanp-run-perl Perl スクリプト。(説明要。)

dprofpp        Perl プロファイルデータを表示します。

               Unicode キャラクターマッピングまたは Tcl エンコーディン
enc2xs         グファイルから、 Perl の Encode 拡張モジュールを構築しま
               す。

find2perl      find コマンドを Perl に変換します。

h2ph           C 言語のヘッダーファイル .h を Perl のヘッダーファイル
               .ph に変換します。

h2xs           C 言語のヘッダーファイル .h を Perl 拡張 (Perl
               extension) に変換します。

               インストールされている Perl モジュールを調査するシェルス
instmodsh      クリプト。 インストールされたモジュールから tarball を作
               ることもできます。

libnetcfg      libnet ライブラリの設定に利用します。

perl           C 言語、 sed、 awk、 sh の持つ機能を寄せ集めて出来上がっ
               た言語。

perl5.10.1     perl へのハードリンク。

perlbug        Perl およびそのモジュールに関するバグ報告を生成して、電
               子メールを送信します。

               pod フォーマットのドキュメントを表示します。 pod フォー
perldoc        マットは Perl のインストールツリーあるいは Perl スクリプ
               ト内に埋め込まれています。

               Perl Installation Verification Procedure のこと。 Perl
perlivp        とライブラリが正しくインストールできているかを調べるもの
               です。

piconv         キャラクターエンコーディングを変換する iconv の Perl バ
               ージョン。

pl2pm          Perl4 の .pl ファイルを Perl5 の .pm モジュールファイル
               への変換を行うツール。

pod2html       pod フォーマットから HTML フォーマットに変換します。

pod2latex      pod フォーマットから LaTeX フォーマットへ変換します。

pod2man        pod データを *roff の入力ファイル形式に変換します。

pod2text       pod データをアスキーテキスト形式に変換します。

pod2usage      ファイル内に埋め込まれた pod ドキュメントから使用方法の
               記述部分を表示します。

podchecker     pod 形式の文書ファイルに対して文法をチェックします。

podselect      pod ドキュメントに対して指定したセクションを表示します。

prove          Test::Harness モジュールのテストを行うコマンドラインツー
               ル。

psed           ストリームエディタ sed の Perl バージョン。

pstruct        cc -g -S によって生成されるような C 言語構造体をダンプし
               ます。

ptar           Perl で書かれた tar 相当のプログラム。

ptardiff       アーカイブの抽出前後を比較する Perl プログラム。

s2p            sed スクリプトを Perl スクリプトに変換します。

shasum         SHA チェックサム値を表示またはチェックします。

splain         Perl スクリプトの警告エラーの診断結果を詳細 (verbose) に
               出力するために利用します。

xsubpp         Perl の XS コードを C 言語コードに変換します。

6.34. Autoconf-2.65

Autoconf パッケージは、ソースコードを自動的に設定するシェルスクリプトの
生成を行うプログラムを提供します。

概算ビルド時間: 4.8 SBU テストスイート込み
必要ディスク容量: 12.4 MB テストスイート込み

6.34.1. Autoconf のインストール

Autoconf をコンパイルするための準備を行います。

./configure --prefix=/usr

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

make

コンパイル結果をテストするには以下を実行します。

make check

このテストはおよそ 4.7 SBU ほど要します。そのうちの 6つのテストは
Automake を利用するものであるためスキップされます。 すべてのテストを網
羅したいなら、Automake をインストールした後に、再度テストを実行すること
が必要です。

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

make install

6.34.2. Autoconf の構成

インストールプログラム: autoconf, autoheader, autom4te, autoreconf,
autoscan, autoupdate, ifnames

概略説明

           ソースコードを提供するソフトウェアパッケージを自動的に設定す
           る (configure する) シェルスクリプトを生成します。 これによ
autoconf   り数多くの Unix 互換システムへの適用を可能とします。 生成さ
           れる設定 (configure) スクリプトは独立して動作します。 つまり
           これを実行するにあたっては autoconf プログラムを必要としませ
           ん。

autoheader C言語の #define 文を configure が利用するためのテンプレート
           ファイルを生成するツール。

autom4te   M4 マクロプロセッサに対するラッパー。

           autoconf と automake のテンプレートファイルが変更された時に
autoreconf 、自動的に autoconf、 autoheader、 aclocal、 automake、
           gettextize、 libtoolize を無駄なく適正な順で実行します。

           ソフトウェアパッケージに対する configure.in ファイルの生成を
           サポートします。 ディレクトリツリー内のソースファイルを調査
autoscan   して、共通的な可搬性に関わる問題を見出します。 そして
           configure.scan ファイルを生成して、そのパッケージの
           configure.in ファイルの雛形として提供します。

autoupdate configure.in ファイルにおいて、かつての古い autoconf マクロ
           が利用されている場合に、それを新しいマクロに変更します。

           ソフトウェアパッケージにおける configure.in ファイルの記述作
           成をサポートします。 これはそのパッケージが利用する C プリプ
           ロセッサの条件ディレクティブの識別子を出力します。 可搬性を
ifnames    考慮した構築ができている場合は、本プログラムが configure ス
           クリプトにおいて何をチェックするべきかを決定してくれます。
           また autoscan によって生成された configure.in ファイルでの過
           不足を調整する働きもします。

6.35. Automake-1.11.1

Automake パッケージは Autoconf が利用する Makefile などを生成するプログ
ラムを提供します。

概算ビルド時間: 18.3 SBU テストスイート込み
必要ディスク容量: 28.8 MB テストスイート込み

6.35.1. Automake のインストール

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

./configure --prefix=/usr --docdir=/usr/share/doc/automake-1.11.1

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

make

ビルド結果をテストするには、以下を実行します。

make check

このテストには 10 SBU ほど要します。

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

make install

6.35.2. Automake の構成

インストールプログラム: acinstall, aclocal, aclocal-1.11.1, automake,
automake-1.11.1, compile, config.guess, config.sub, depcomp,
elisp-comp, install-sh, mdate-sh, missing, mkinstalldirs, py-compile,
symlink-tree, ylwrap

概略説明

acinstall       aclocal 風の M4 ファイルをインストールするスクリプト。

aclocal         configure.in ファイルの内容に基づいて aclocal.m4 ファイ
                ルを生成します。

aclocal-1.11.1  aclocal へのハードリンク。

                Makefile.am ファイルから Makefile.in ファイルを自動生成
                するツール。 パッケージ内のすべての Makefile.in ファイ
automake        ルを作るには、このプログラムをトップディレクトリから実
                行します。 configure.in ファイルを調べて、適切な
                Makefile.am ファイルを検索します。そして対応する
                Makefile.in ファイルを生成します。

automake-1.11.1 automake へのハードリンク。

compile         コンパイラのラッパースクリプト。

config.guess    指定されたビルドタイプ、ホストタイプ、ターゲットタイプ
                に対しての正規化した「三つ組」を推定するスクリプト。

config.sub      設定を検証するサブルーチンスクリプト。

depcomp         プログラムをコンパイルするためのスクリプトで、コンパイ
                ル結果を得ると同時に依存情報も生成します。

elisp-comp      Emacs Lisp コードをバイトコンパイルします。

install-sh      プログラムやスクリプトやデータファイルをインストールす
                るスクリプト。

mdate-sh        ファイルやディレクトリの更新時刻を表示するスクリプト。

                インストール中に GNU プログラムが存在しなかった場合に、
missing         共通のスタブ (stub) プログラムとして動作するスクリプト
                。

mkinstalldirs   ディレクトリツリーを生成するスクリプト。

py-compile      Python プログラムをコンパイルします。

symlink-tree    ディレクトリツリーに対するシンボリックリンクのツリーを
                生成するスクリプト。

ylwrap          lex と yacc に対するラッパースクリプト。

6.36. Bzip2-1.0.5

Bzip2 パッケージはファイル圧縮・伸長 (解凍) を行うプログラムを提供しま
す。 テキストファイルであれば、これまでよく用いられてきた gzip に比べて
bzip2 の方が圧縮率の高いファイルを生成できます。

概算ビルド時間: 0.1 SBU 以下
必要ディスク容量: 6.4 MB

6.36.1. Bzip2 のインストール

本パッケージのドキュメントをインストールするためにパッチを当てます。

patch -Np1 -i ../bzip2-1.0.5-install_docs-1.patch

以下のコマンドによりシンボリックリンクを相対的なものとしてインストール
します。

sed -i 's@\(ln -s -f \)$(PREFIX)/bin/@\1@' Makefile

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

make -f Makefile-libbz2_so
make clean

make パラメータの意味：

-f Makefile-libbz2_so

    このパラメータは Bzip2 のビルドにあたって通常の Makefile ファイルで
    はなく Makefile-libbz2_so ファイルを利用することを指示します。 これ
    はダイナミックライブラリ libbz2.so ライブラリをビルドし、Bzip2 の各
    種プログラムをこれにリンクします。

パッケージのコンパイルとテストを行います。

make

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

make PREFIX=/usr install

共有化された bzip2 実行モジュールを /bin ディレクトリにインストールしま
す。 また必要となるシンボリックリンクを生成し不要なものを削除します。

cp -v bzip2-shared /bin/bzip2
cp -av libbz2.so* /lib
ln -sv ../../lib/libbz2.so.1.0 /usr/lib/libbz2.so
rm -v /usr/bin/{bunzip2,bzcat,bzip2}
ln -sv bzip2 /bin/bunzip2
ln -sv bzip2 /bin/bzcat

6.36.2. Bzip2 の構成

インストールプログラム: bunzip2 (bzip2 へのリンク), bzcat (bzip2 へのリ
ンク), bzcmp (bzdiff へのリンク), bzdiff, bzegrep (bzgrep へのリンク),
bzfgrep (bzgrep へのリンク), bzgrep, bzip2, bzip2recover, bzless
(bzmore へのリンク), bzmore
インストールライブラリ: libbz2.{a,so}

概略説明

bunzip2      bzip2 で圧縮されたファイルを解凍します。

bzcat        解凍結果を標準出力に出力します。

bzcmp        bzip2 で圧縮されたファイルに対して cmp を実行します。

bzdiff       bzip2 で圧縮されたファイルに対して diff を実行します。

bzegrep      bzip2 で圧縮されたファイルに対して egrep を実行します。

bzfgrep      bzip2 で圧縮されたファイルに対して fgrep を実行します。

bzgrep       bzip2 で圧縮されたファイルに対して grep を実行します。

             ブロックソート法 (バロウズ-ホイラー変換) とハフマン符号化
bzip2        法を用いてファイル圧縮を行います。 圧縮率は、従来用いられ
             てきた 「Lempel-Ziv」 アルゴリズムによるもの、例えば gzip
             コマンドによるものに比べて高いものです。

bzip2recover 壊れた bzip2 ファイルの復旧を試みます。

bzless       bzip2 で圧縮されたファイルに対して less を実行します。

bzmore       bzip2 で圧縮されたファイルに対して more を実行します。

libbz2*      ブロックソート法 (バロウズ-ホイラー変換) による可逆的なデ
             ータ圧縮を提供するライブラリ。

6.37. Diffutils-2.8.1

Diffutils パッケージはファイルやディレクトリの差分を表示するプログラム
を提供します。

概算ビルド時間: 0.1 SBU
必要ディスク容量: 6.3 MB

6.37.1. Diffutils のインストール

POSIX によると diff コマンドは、設定されているロケールに従って空白文字
を適切に取り扱うことが必要になります。 以下のパッチは、標準に対応してい
ない問題を修正します。

patch -Np1 -i ../diffutils-2.8.1-i18n-1.patch

上のパッチを適用すると Diffutils は man ページ diff.1 を再生成しようと
しますが、その際には現時点で存在しない help2man プログラムを呼び出そう
とします。 その結果として diff コマンドの man ページが読めなくなってし
まいます。 そこでこれを解消するために man/diff.1 ファイルのタイムスタン
プを更新します。

touch man/diff.1

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

./configure --prefix=/usr

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

make

このパッケージにテストスイートはありません。

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

make install

6.37.2. Diffutils の構成

インストールプログラム: cmp, diff, diff3, sdiff

概略説明

cmp   二つのファイルを比較して、どこが異なるか、あるいは何バイト異なる
      かを示します。

diff  二つのファイルまたは二つのディレクトリを比較して、ファイル内のど
      の行に違いがあるかを示します。

diff3 三つのファイルの各行を比較します。

sdiff 二つのファイルを結合して対話的に結果を出力します。

6.38. Gawk-3.1.7

Gawk パッケージはテキストファイルを操作するプログラムを提供します。

概算ビルド時間: 0.2 SBU
必要ディスク容量: 19 MB

6.38.1. Gawk のインストール

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

./configure --prefix=/usr --libexecdir=/usr/lib

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

make

コンパイル結果をテストするには以下を実行します。

make check

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

make install

必要ならドキュメントをインストールします。

mkdir -v /usr/share/doc/gawk-3.1.7
cp    -v doc/{awkforai.txt,*.{eps,pdf,jpg}} \
         /usr/share/doc/gawk-3.1.7

6.38.2. Gawk の構成

インストールプログラム: awk (gawk へのリンク), gawk, gawk-3.1.7, grcat,
igawk, pgawk, pgawk-3.1.7, pwcat

概略説明

awk         gawk へのリンク。

gawk        テキストファイルを操作するプログラム。 これは awk の GNU イ
            ンプリメンテーションです。

gawk-3.1.7  gawk へのハードリンク。

grcat       グループデータベースファイル /etc/group をダンプします。

igawk       gawk に対してファイルをインクルードする機能を付与します。

pgawk       gawk のプロファイル版。

pgawk-3.1.7 pgawk へのハードリンク。

pwcat       パスワードデータベースファイル /etc/passwd をダンプします。

6.39. Findutils-4.4.2

Findutils パッケージはファイル検索を行うプログラムを提供します。 このプ
ログラムはディレクトリツリーを再帰的に検索したり、データベースの生成・
保守・検索を行います。 (データベースによる検索は再帰的検索に比べて処理
速度は速いものですが、データベースが最新のものに更新されていない場合は
信頼できない結果となります。)

概算ビルド時間: 0.5 SBU
必要ディスク容量: 22 MB

6.39.1. Findutils のインストール

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

./configure --prefix=/usr --libexecdir=/usr/lib/findutils \
    --localstatedir=/var/lib/locate

configure オプションの意味：

--localstatedir

    locate データベースの場所を FHS コンプライアンスが定めているディレ
    クトリ /var/lib/locate に変更します。

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

make

コンパイル結果をテストするなら以下を実行します。

make check

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

make install

LFS ブートスクリプトパッケージでは、いくつかのスクリプトが find を利用
しています。 /usr ディレクトリはブート処理の初めでは認識できないため、
このプログラムはルートパーティションに置く必要があります。 同じく
updatedb スクリプトは明示的なパスを修正する必要があります。

mv -v /usr/bin/find /bin
sed -i 's/find:=${BINDIR}/find:=\/bin/' /usr/bin/updatedb

6.39.2. Findutils の構成

インストールプログラム: bigram, code, find, frcode, locate, oldfind,
updatedb, xargs

概略説明

bigram   かつて利用されていたコマンドで locate データベースを生成します
         。

code     かつて利用されていたコマンドで locate データベースを生成します
         。 これは frcode の前身です。

find     指定された条件に合致するファイルを、指定されたディレクトリツリ
         ー内から検索します。

         updatedb コマンドから呼び出され、ファイル名の一覧を圧縮します
frcode   。 これは前置圧縮 (front-compression) を行うもので、データベー
         スサイズを 1/4 から 1/5 に減らします。

locate   ファイル名データベースを検索して、指定された文字列を含むもの、
         または検索パターンに合致するものを表示します。

oldfind  find の古い版であり、find とは異なるアルゴリズムを用いています
         。

         locate データベースを更新します。 これはすべてのファイルシステ
updatedb ムを検索します。 (検索非対象とする設定がない限りは、マウントさ
         れているすべてのファイルシステムを対象とします。) そして検索さ
         れたファイル名をデータベースに追加します。

xargs    指定されたコマンドに対してファイル名の一覧を受け渡して実行しま
         す。

6.40. Flex-2.5.35

Flex パッケージは、字句パターンを認識するプログラムを生成するユーティリ
ティを提供します。

概算ビルド時間: 0.7 SBU テストスイート込み
必要ディスク容量: 28 MB テストスイート込み

6.40.1. Flex のインストール

C++ のスキャナ生成に含まれるバグを修正するためのパッチを適用します。 こ
れがないと GCC-4.4.3 を用いた時にスキャナに関するコンパイルに失敗します
。

patch -Np1 -i ../flex-2.5.35-gcc44-1.patch

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

./configure --prefix=/usr

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

make

コンパイル結果をテストするために以下を実行します。(約 0.5 SBU)

make check

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

make install

他のパッケージの中には lex ライブラリが /usr/lib ディレクトリにあるもの
として動作しています。 これに対応するためシンボリックリンクを作成します
。

ln -sv libfl.a /usr/lib/libl.a

プログラムの中には flex コマンドが用いられず、その前身である lex コマン
ドを実行しようとするものがあります。 そういったプログラムへ対応するため
に lex という名のラッパースクリプトを生成します。 このスクリプトは lex
のエミュレーションモードとして flex を実行します。

cat > /usr/bin/lex << "EOF"
#!/bin/sh
# Begin /usr/bin/lex

exec /usr/bin/flex -l "$@"

# End /usr/bin/lex
EOF
chmod -v 755 /usr/bin/lex

必要ならドキュメントファイル flex.pdf をインストールします。

mkdir -v /usr/share/doc/flex-2.5.35
cp    -v doc/flex.pdf \
         /usr/share/doc/flex-2.5.35

6.40.2. Flex の構成

インストールプログラム: flex, lex
インストールライブラリ: libfl.a, libfl_pic.a

概略説明

        テキスト内のパターンを認識するためのプログラムを生成するツール
flex    。 これは多彩なパターン検索の規則構築を可能とします。 これを利
        用することで特別なプログラムの生成が不要となります。

lex     lex のエミュレーションモードとして flex を実行するスクリプト。

libfl.a flex ライブラリ。

6.41. Gettext-0.17

Gettext パッケージは国際化を行うユーティリティを提供します。 各種プログ
ラムに対して NLS (Native Language Support) を含めてコンパイルすることが
できます。 つまり各言語による出力メッセージが得られることになります。

概算ビルド時間: 5.8 SBU
必要ディスク容量: 125 MB

6.41.1. Gettext のインストール

以下のパッチを適用して、ファイルのパーミッションと所有者を設定し、内部
バグを訂正します。

patch -Np1 -i ../gettext-0.17-upstream_fixes-2.patch

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

./configure --prefix=/usr \
            --docdir=/usr/share/doc/gettext-0.17

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

make

コンパイル結果をテストするなら (3 SBU 程度の処理時間を要しますが) 以下
を実行します。

make check

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

make install

6.41.2. Gettext の構成

インストールプログラム: autopoint, config.charset, config.rpath,
envsubst, gettext, gettext.sh, gettextize, hostname, msgattrib, msgcat,
msgcmp, msgcomm, msgconv, msgen, msgexec, msgfilter, msgfmt, msggrep,
msginit, msgmerge, msgunfmt, msguniq, ngettext, recode-sr-latin,
xgettext
インストールライブラリ: libasprintf.{a,so}, libgettextlib.so,
libgettextpo.{a,so}, libgettextsrc.so, preloadable_libintl.so

概略説明

                    Gettext 標準のインフラストラクチャーファイル
autopoint           (infrastructure file) をソースパッケージ内にコピー
                    します。

config.charset      システム依存の、キャラクターエンコーディングのエイ
                    リアス対応表を出力します。

                    システムに依存する変数一覧を出力します。 その変数と
config.rpath        は、実行モジュールにおける共有ライブラリの検索パス
                    をどのように設定するかを示すものです。

envsubst            環境変数をシェル書式の文字列として変換します。

gettext             メッセージカタログ内の翻訳文を参照し、メッセージを
                    ユーザーの利用言語に変換します。

gettext.sh          主に gettext におけるシェル関数ライブラリとして機能
                    します。

                    パッケージの国際化対応を始めるにあたり、標準的な
gettextize          Gettext 関連ファイルを、指定されたパッケージのトッ
                    プディレクトリにコピーします。

hostname            様々な書式のネットワークホスト名を表示します。

                    翻訳カタログ内のメッセージの属性に応じて、そのメッ
msgattrib           セージを抽出します。 またメッセージの属性を操作しま
                    す。

msgcat              指定された .po ファイルを連結します。

                    二つの .po ファイルを比較して、同一の msgid による
msgcmp              文字定義が両者に含まれているかどうかをチェックしま
                    す。

msgcomm             指定された .po ファイルにて共通のメッセージを検索し
                    ます。

msgconv             翻訳カタログを別のキャラクターエンコーディングに変
                    換します。

msgen               英語用の翻訳カタログを生成します。

msgexec             翻訳カタログ内の翻訳文すべてに対してコマンドを適用
                    します。

msgfilter           翻訳カタログ内の翻訳文すべてに対してフィルター処理
                    を適用します。

msgfmt              翻訳カタログからバイナリメッセージカタログを生成し
                    ます。

                    指定された検索パターンに合致する、あるいは指定され
msggrep             たソースファイルに属する翻訳カタログの全メッセージ
                    を出力します。

msginit             新規に .po ファイルを生成します。 その時にはユーザ
                    ーの環境設定に基づいてメタ情報を初期化します。

msgmerge            二つの翻訳ファイルを一つにまとめます。

msgunfmt            バイナリメッセージカタログを翻訳テキストに逆コンパ
                    イルします。

msguniq             翻訳カタログ中に重複した翻訳がある場合にこれを統一
                    します。

ngettext            出力メッセージをユーザーの利用言語に変換します。 特
                    に複数形のメッセージを取り扱います。

recode-sr-latin     セルビア語のテキストに対し、キリル文字からラテン文
                    字にコード変換します。

                    指定されたソースファイルから、翻訳対象となるメッセ
xgettext            ージ行を抽出して、翻訳テンプレートとして生成します
                    。

                    autosprintf クラスを定義します。 これは C++ プログ
libasprintf         ラムにて利用できる C 言語書式の出力ルーチンを生成す
                    るものです。 <string> 文字列と <iostream> ストリー
                    ムを利用します。

                    様々な Gettext プログラムが利用している共通的ルーチ
libgettextlib       ンを提供するプライベートライブラリです。 これは一般
                    的な利用を想定したものではありません。

                    .po ファイルの出力に特化したプログラムを構築する際
                    に利用します。 Gettext が提供する標準的なアプリケー
libgettextpo        ション (msgcomm、 msgcmp、 msgattrib、 msgen) など
                    では処理出来ないものがある場合に、このライブラリを
                    利用します。

                    様々な Gettext プログラムが利用している共通的ルーチ
libgettextsrc       ンを提供するプライベートライブラリです。 これは一般
                    的な利用を想定したものではありません。

                    LD_PRELOAD が利用するライブラリ。 翻訳されていない
preloadable_libintl メッセージを収集 (log) する libintl をサポートしま
                    す。

6.42. Groff-1.20.1

Groff パッケージはテキストを処理して整形するプログラムを提供します。

概算ビルド時間: 0.7 SBU
必要ディスク容量: 66 MB

6.42.1. Groff のインストール

Groff はデフォルトの用紙サイズを設定する環境変数 PAGE を参照します。 米
国のユーザーであれば PAGE=letter と設定するのが適当です。 その他のユー
ザーなら PAGE=A4 とするのが良いかもしれません。 このデフォルト用紙サイ
ズはコンパイルにあたって設定されます。 「A4」 なり 「letter」 なりの値
は /etc/papersize ファイルにて設定することも可能です。

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

PAGE=<paper_size> ./configure --prefix=/usr

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

make

このパッケージにテストスイートはありません。

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

make docdir=/usr/share/doc/groff-1.20.1 install

xman のようなドキュメント関連プログラムが正しく動作するように、以下のよ
うなシンボリックリンクを作成します。

ln -sv eqn /usr/bin/geqn
ln -sv tbl /usr/bin/gtbl

6.42.2. Groff の構成

インストールプログラム: addftinfo, afmtodit, chem, eqn, eqn2graph,
gdiffmk, geqn (eqn へのリンク), grap2graph, grn, grodvi, groff,
groffer, grog, grolbp, grolj4, grops, grotty, gtbl (tbl へのリンク),
hpftodit, indxbib, lkbib, lookbib, mmroff, neqn, nroff, pdfroff,
pfbtops, pic, pic2graph, post-grohtml, preconv, pre-grohtml, refer,
roff2dvi, roff2html, roff2pdf, roff2ps, roff2text, roff2x, soelim, tbl,
tfmtodit, troff

概略説明

addftinfo    troff のフォントファイルを読み込んで groff システムが利用
             する付加的なフォントメトリック情報を追加します。

afmtodit     groff と grops が利用するフォントファイルを生成します。

chem         化学構造図 (chemical structure diagrams) を生成するための
             Groff プロセッサ。

eqn          troff の入力ファイル内に埋め込まれている記述式をコンパイル
             して troff が解釈できるコマンドとして変換します。

eqn2graph    troff の EQN (数式) を、刈り込んだ (crop した) イメージに
             変換します。

gdiffmk      groff、nroff、troff の入力ファイルを比較して、その差異を出
             力します。

geqn         eqn へのリンク。

grap2graph   grap ダイアグラムを、刈り込んだ (crop した) ビットマップイ
             メージに変換します。

grn          gremlin 図を表すファイルを処理するための groff プリプロセ
             ッサ。

grodvi       TeX の dvi フォーマットを生成するための groff ドライバプロ
             グラム。

             groff 文書整形システムのためのフロントエンド。 通常は
groff        troff プログラムを起動し、指定されたデバイスに適合したポス
             トプロセッサを呼び出します。

groffer      groff ファイルや man ページを X 上や TTY 端末上に表示しま
             す。

             入力ファイルを読み込んで、印刷時には groff コマンドオプシ
grog         ョンのどれが必要かを推定します。 コマンドオプションは -e、
             -man、 -me、 -mm、 -ms、 -p、 -s のいずれかです。 そしてそ
             のオプションを含んだ groff コマンドを表示します。

grolbp       Canon CAPSL プリンタ (LBP-4 または LBP-8 シリーズのレーザ
             ープリンタ) に対する groff ドライバプログラム。

grolj4       HP LaserJet 4 プリンタにて利用される PCL5 フォーマットの出
             力を生成する groff のドライバプログラム。

grops        GNU troff の出力を PostScript に変換します。

grotty       GNU troff の出力を、タイプライタ風のデバイスに適した形式に
             変換します。

gtbl         tbl へのリンク。

             HP のタグ付けが行われたフォントメトリックファイルから、
hpftodit     groff -Tlj4 コマンドにて利用されるフォントファイルを生成し
             ます。

             指定されたファイル内に示される参考文献データベース
indxbib      (bibliographic database) に対しての逆引きインデックス
             (inverted index) を生成します。 これは refer、 lookbib、
             lkbib といったコマンドが利用します。

lkbib        指定されたキーを用いて参考文献データベースを検索し、合致し
             たすべての情報を表示します。

             (標準入力が端末であれば) 標準エラー出力にプロンプトを表示
             して、標準入力から複数のキーワードを含んだ一行を読み込みま
lookbib      す。 そして指定されたファイルにて示される参考文献データベ
             ース内に、そのキーワードが含まれるかどうかを検索します。
             キーワードが含まれるものを標準出力に出力します。入力がなく
             なるまでこれを繰り返します。

mmroff       groff 用の単純なプリプロセッサ。

neqn         数式を ASCII (American Standard Code for Information
             Interchange) 形式で出力します。

nroff        groff を利用して nroff コマンドをエミュレートするスクリプ
             ト。

pdfroff      groff を利用して pdf 文書ファイルを生成します。

pfbtops      .pfb フォーマットの PostScript フォントを ASCII フォーマッ
             トに変換します。

             troff または TeX の入力ファイル内に埋め込まれた図の記述を
pic          、 troff または TeX が処理できるコマンドの形式に変換します
             。

pic2graph    PIC ダイアグラムを、刈り込んだ (crop した) イメージに変換
             します。

post-grohtml GNU troff の出力を HTML に変換します。

preconv      入力ファイルのエンコーディングを GNU troff が取り扱うもの
             に変換します。

pre-grohtml  GNU troff の出力を HTML に変換します。

             ファイル内容を読み込んで、そのコピーを標準出力へ出力します
refer        。 ただし引用文を表す .[ と .] で囲まれた行、および引用文
             をどのように処理するかを示したコマンドを意味する .R1 と
             .R2 で囲まれた行は、コピーの対象としません。

roff2dvi     roff ファイルを DVI フォーマットに変換します。

roff2html    roff ファイルを HTML フォーマットに変換します。

roff2pdf     roff ファイルを PDF フォーマットに変換します。

roff2ps      roff ファイルを ps ファイルに変換します。

roff2text    roff ファイルをテキストファイルに変換します。

roff2x       roff ファイルを他のフォーマットに変換します。

soelim       入力ファイルを読み込んで .so ファイル の形式で記述されてい
             る行を、記述されている ファイル だけに置き換えます。

tbl          troff 入力ファイル内に埋め込まれた表の記述を troff が処理
             できるコマンドの形式に変換します。

tfmtodit     コマンド groff -Tdvi を使ってフォントファイルを生成します
             。

             Unix の troff コマンドと高い互換性を持ちます。 通常は
troff        groff コマンドを用いて本コマンドが起動されます。 groff コ
             マンドは、プリプロセッサ、ポストプロセッサを、適切な順で適
             切なオプションをつけて起動します。

6.43. GRUB-1.97.2

GRUB パッケージは GRand Unified Bootloader を提供します。

概算ビルド時間: 0.4 SBU
必要ディスク容量: 27.6 MB

6.43.1. GRUB のインストール

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

mkdir build
cd build
../configure --prefix=/usr           \
             --sysconfdir=/etc       \
             --disable-grub-emu      \
             --disable-grub-emu-usb  \
             --disable-grub-fstest   \
             --disable-efiemu

ビルドの際には専用のディレクトリを設けます。 生成ファイルが 2,400 個も
あるため、それらをソースディレクトリの外で生成します。 これは開発者が推
奨していることです。 --disable オプションは、LFS で本当に必要となる機能
やテストプログラムだけを生成するもので、ビルド結果を最小限に抑えます。

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

make

このパッケージにテストスイートはありません。

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

make install

GRUB を使ってシステムのブート起動設定を行う方法については 8.4. 「GRUB
を用いたブートプロセスの設定」 で説明しています。

6.43.2. GRUB の構成

インストールプログラム: grub-editenv, grub-mkelfimage, grub-mkfont,
grub-mkimage, grub-mkrescue, grub-dumpbios, grub-install,
grub-mkconfig, grub-mkdevicemap, grub-probe, grub-setup
インストールディレクトリ: /usr/lib/grub, /etc/grub.d, /usr/share/grub,
/usr/inclue/grub

概略説明

grub-editenv     環境ブロック (environment block) を編集するツール。

grub-mkelfimage  GRUB のブートイメージ (bootable image) を生成します。

grub-mkfont      GRUB にて利用するフォントを更新します。

grub-mkimage     GRUB のブートイメージを生成します。

grub-mkrescue    フロッピーディスク用の GRUB のブートイメージを生成しま
                 す。

grub-dumpbios    vbios と int10 ダンプを生成します。

grub-install     指定したドライブに GRUB をインストールします。

grub-mkconfig    GRUB の設定ファイルを生成します。

grub-mkdevicemap デバイスマップファイルを自動的に生成します。

grub-probe       指定されたパスやデバイスに対するデバイス情報を検証
                 (probe) します。

grub-setup       デバイスからのブートを行うためにイメージファイルをセッ
                 トアップします。

6.44. Gzip-1.4

Gzip パッケージはファイルの圧縮、伸長 (解凍) を行うプログラムを提供しま
す。

概算ビルド時間: 0.1 SBU 以下
必要ディスク容量: 3.3 MB

6.44.1. Gzip のインストール

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

./configure --prefix=/usr --bindir=/bin

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

make

コンパイル結果をテストするには以下を実行します。

make check

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

make install

ルートファイルシステム上に置く必要のないプログラムを移動させます。

mv -v /bin/{gzexe,uncompress,zcmp,zdiff,zegrep} /usr/bin
mv -v /bin/{zfgrep,zforce,zgrep,zless,zmore,znew} /usr/bin

6.44.2. Gzip の構成

インストールプログラム: gunzip, gzexe, gzip, uncompress, zcat, zcmp,
zdiff, zegrep, zfgrep, zforce, zgrep, zless, zmore, znew

概略説明

gunzip     gzip により圧縮されたファイルを解凍します。

gzexe      自動解凍形式の実行ファイルを生成します。

gzip       Lempel-Ziv (LZ77) 方式により指定されたファイルを圧縮します。

uncompress 圧縮されたファイルを解凍します。

zcat       gzip により圧縮されたファイルを解凍して標準出力へ出力します
           。

zcmp       gzip により圧縮されたファイルに対して cmp を実行します。

zdiff      gzip により圧縮されたファイルに対して diff を実行します。

zegrep     gzip により圧縮されたファイルに対して egrep を実行します。

zfgrep     gzip により圧縮されたファイルに対して fgrep を実行します。

           指定されたファイルが gzip により圧縮されている場合に、強制的
zforce     に拡張子 .gz を付与します。 こうすることで gzip は再度の圧縮
           を行わないようになります。 これはファイル転送によってファイ
           ル名が切り詰められてしまった場合に活用することができます。

zgrep      gzip により圧縮されたファイルに対して grep を実行します。

zless      gzip により圧縮されたファイルに対して less を実行します。

zmore      gzip により圧縮されたファイルに対して more を実行します。

           compress フォーマットの圧縮ファイルを gzip フォーマットのフ
znew       ァイルとして再圧縮します。 つまり .Z から .gz への変換を行い
           ます。

6.45. IPRoute2-2.6.31

IPRoute2 パッケージは IPV4 ベースの基本的または応用的ネットワーク制御を
行うプログラムを提供します。

概算ビルド時間: 0.2 SBU
必要ディスク容量: 5.7 MB

6.45.1. IPRoute2 のインストール

本パッケージにて提供している arpd プログラムは Berkeley DB に依存してい
ます。 arpd はベースとする Linux システムにとって普通は必要となりません
。 そこで Berkeley DB への依存を取り除くために、以下の sed コマンドを実
行します。 arpd プログラムを必要とする場合は BLFS ブックの http://
www.linuxfromscratch.org/blfs/view/svn/server/databases.html#db に示さ
れる Berkeley DB の構築手順に従ってください。

sed -i '/^TARGETS/s@arpd@@g' misc/Makefile

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

make DESTDIR=

make オプションの意味：

DESTDIR=

    このオプションにより IPRoute2 の実行モジュール類を適切なディレクト
    リにインストールします。 デフォルトでは DESTDIR は /usr ディレクト
    リに設定されています。

このパッケージにテストスイートはありますが、このテストの前提条件からす
ると chroot 環境のもとでは信頼のあるテスト結果を得ることには無理があり
ます。 もし LFS システムを構築した後にテストスイートを実施したいなら、
カーネル設定において /proc/config.gz CONFIG_IKCONFIG_PROC ("General
setup" -> "Enable access to .config through /proc/config.gz") のサポー
トを有効にしてカーネルをビルドしてください。 そしてサブディレクトリ
testsuite/ にて 'make alltests' を実行してください。

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

make DESTDIR= SBINDIR=/sbin MANDIR=/usr/share/man \
     DOCDIR=/usr/share/doc/iproute2-2.6.31 install

6.45.2. IPRoute2 の構成

インストールプログラム: ctstat (lnstat へのリンク), genl, ifcfg,
ifstat, ip, lnstat, nstat, routef, routel, rtacct, rtmon, rtpr, rtstat
(lnstat へのリンク), ss, tc

概略説明

ctstat 接続ステータスの表示ユーティリティ。

genl

       ip コマンドに対するシェルスクリプトラッパー。 http://
ifcfg  www.skbuff.net/iputils/ にて提供されている iputils パッケージの
       arping プログラムと rdisk プログラムを利用します。

ifstat インターフェースの統計情報を表示します。 インターフェースによっ
       て送受信されたパケット量が示されます。

       主となる実行モジュールで、複数の機能性を持ちます。

       ip link <デバイス名> はデバイスのステータスを参照し、またステー
       タスの変更を行います。

       ip addr はアドレスとその属性を参照し、新しいアドレスの追加、古い
       アドレスの削除を行います。

       ip neighbor は、隣接ルーター (neighbor) の割り当てや属性を参照し
       、隣接ルーターの項目追加や古いものの削除を行います。

       ip rule は、ルーティングポリシー (routing policy) を参照し、変更
       を行います。
ip
       ip route は、ルーティングテーブル (routing table) を参照し、ルー
       ティングルール (routing table rule) を変更します。

       ip tunnel は、IP トンネル (IP tunnel) やその属性を参照し、変更を
       行います。

       ip maddr は、マルチキャストアドレス (multicast address) やその属
       性を参照し、変更を行います。

       ip mroute は、マルチキャストルーティング (multicast routing) の
       設定、変更、削除を行います。

       ip monitor は、デバイスの状態、アドレス、ルートを継続的に監視し
       ます。

lnstat Linux のネットワーク統計情報を提供します。 これはかつての rtstat
       プログラムを汎用的に機能充足を図ったプログラムです。

nstat  ネットワーク統計情報を表示します。

routef ip route のコンポーネント。 これはルーティングテーブルをクリアし
       ます。

routel ip route のコンポーネント。 これはルーティングテーブルの一覧を表
       示します。

rtacct /proc/net/rt_acct の内容を表示します。

rtmon  ルート監視ユーティリティー。

rtpr   ip -o コマンドにより出力される内容を読みやすい形に戻します。

rtstat ルートステータスの表示ユーティリティー。

ss     netstat コマンドと同じ。 アクティブな接続を表示します。

       トラフィック制御プログラム (Traffic Controlling Executable)。 こ
       れは QOS (Quality Of Service) と COS (Class Of Service) を実装す
       るプログラムです。

       tc qdisc は、キューイング規則 (queueing discipline) の設定を行い
       ます。

tc     tc class は、キューイング規則スケジューリング (queueing
       discipline scheduling) に基づくクラスの設定を行います。

       tc estimator は、ネットワークフローを見積もります。

       tc filter は、QOS/COS パケットのフィルタリング設定を行います。

       tc policy は、QOS/COS ポリシーの設定を行います。

6.46. Kbd-1.15.1

Kbd パッケージは、キーテーブル (key-table) ファイルとキーボードユーティ
リティを提供します。

概算ビルド時間: 0.1 SBU 以下
必要ディスク容量: 16.0 MB

6.46.1. Kbd のインストール

Kbd パッケージには標準的な configure スクリプトが用意されていません。
そこで以下のようにして生成します。

autoreconf

バックスペース (backspace) キーとデリート (delete) キーは Kbd パッケー
ジのキーマップ内では一貫した定義にはなっていません。 以下のパッチは
i386 用のキーマップについてその問題を解消します。

patch -Np1 -i ../kbd-1.15.1-backspace-1.patch

パッチを当てればバックスペースキーの文字コードは 127 となり、デリートキ
ーはよく知られたエスケープコードを生成することになります。

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

./configure --prefix=/usr --datadir=/lib/kbd

configure オプションの意味：

--datadir=/lib/kbd

    このオプションによりキーボードレイアウトのデータを /usr/share/kbd
    ディレクトリではなく、ルートパーティションとなるようにします。

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

make

このパッケージにテストスイートはありません。

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

make install

注記

ベラルーシ語のような言語において Kbd パッケージは正しいキーマップを提供
せず、 ISO-8859-5 エンコーディングで CP1251 キーマップであるものとして
扱われます。 そのような言語ユーザーは個別に正しいキーマップをダウンロー
ドして設定する必要があります。

LFS-ブートスクリプトパッケージの中には kbd_mode、 loadkeys、 openvt、
setfont に依存しているものがあります。 システム起動時の初期段階において
/usr ディレクトリは参照不能であるため、上の実行モジュールはルートパーテ
ィションに置く必要があります。

mv -v /usr/bin/{kbd_mode,loadkeys,openvt,setfont} /bin

必要ならドキュメントをインストールします。

mkdir -v /usr/share/doc/kbd-1.15.1
cp -R -v doc/* \
         /usr/share/doc/kbd-1.15.1

6.46.2. Kbd の構成

インストールプログラム: chvt, deallocvt, dumpkeys, fgconsole,
getkeycodes, kbd_mode, kbdrate, loadkeys, loadunimap, mapscrn, openvt,
psfaddtable (psfxtable へのリンク), psfgettable (psfxtable へのリンク),
psfstriptable (psfxtable へのリンク), psfxtable, resizecons, setfont,
setkeycodes, setleds, setmetamode, showconsolefont, showkey,
unicode_start, unicode_stop

概略説明

chvt            現在表示されている仮想端末を切り替えます。

deallocvt       未使用の仮想端末への割り当てを開放します。

dumpkeys        キーボード変換テーブル (keyboard translation table) の
                情報をダンプします。

fgconsole       アクティブな仮想端末数を表示します。

getkeycodes     カーネルのスキャンコード-キーコード
                (scancode-to-keycode) マッピングテーブルを表示します。

kbd_mode        キーボードモードの表示または設定を行います。

kbdrate         キーボードのリピート速度 (repeat rate) と遅延時間
                (delay rate) を設定します。

loadkeys        キーボード変換テーブル (keyboard translation tables) を
                ロードします。

loadunimap      カーネルのユニコード-フォント (unicode-to-font) マッピ
                ングテーブルをロードします。

                かつてのプログラムです。 これはユーザー定義の文字マッピ
mapscrn         ングテーブルをコンソールドライバーにロードするために利
                用します。 現在では setfont を利用します。

openvt          新しい仮想端末 (virtual terminal; VT) 上でプログラムを
                起動します。

psfaddtable     psfxtable へのリンク。

psfgettable     psfxtable へのリンク。

psfstriptable   psfxtable へのリンク。

psfxtable       コンソールフォント用のユニコード文字テーブルを取り扱い
                ます。

resizecons      カーネルが認識しているコンソールサイズを変更します。

setfont         EGA (Enhanced Graphic Adapter) フォントや VGA (Video
                Graphics Array) フォントを変更します。

                カーネルのスキャンコード-キーコード
setkeycodes     (scancode-to-keycode) マッピングテーブルの項目をロード
                します。 キーボード上に特殊キーがある場合に利用します。

setleds         キーボードフラグや LED (Light Emitting Diode) を設定し
                ます。

setmetamode     キーボードのメタキー (meta-key) 設定を定義します。

showconsolefont 現在設定されている EGA/VGA コンソールスクリーンフォント
                を表示します。

showkey         キーボード上にて押下されたキーのスキャンコード、キーコ
                ード、ASCII コードを表示します。

                キーボードとコンソールをユニコードモードにします。 キー
                マップファイルが ISO-8859-1 エンコーディングで書かれて
unicode_start   いる場合にのみこれを利用します。 他のエンコーディングの
                場合、このプログラムの出力結果は正しいものになりません
                。

unicode_stop    キーボードとコンソールをユニコードモードから戻します。

6.47. Less-436

Less パッケージはテキストファイルビューアを提供します。

概算ビルド時間: 0.1 SBU 以下
必要ディスク容量: 2.9 MB

6.47.1. Less のインストール

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

./configure --prefix=/usr --sysconfdir=/etc

configure オプションの意味：

--sysconfdir=/etc

    本パッケージによって作成されるプログラムが /etc ディレクトリにある
    設定ファイルを参照するように指示します。

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

make

このパッケージにテストスイートはありません。

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

make install

6.47.2. Less の構成

インストールプログラム: less, lessecho, lesskey

概略説明

less     ファイルビューアまたはページャ。 指示されたファイルの内容を表
         示します。 表示中にはスクロール、文字検索、移動が可能です。

lessecho Unix システム上のファイル名において * や ? といったメタ文字
         (meta-characters) を展開するために必要となります。

lesskey  less におけるキー割り当てを設定するために利用します。

6.48. Make-3.81

Make パッケージは、 パッケージ類をコンパイルするためのプログラムを提供
します。

概算ビルド時間: 0.3 SBU
必要ディスク容量: 9.7 MB

6.48.1. Make のインストール

最新のパッケージリリース以降に判明した不備を修正します。

patch -Np1 -i ../make-3.81-upstream_fixes-1.patch

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

./configure --prefix=/usr

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

make

コンパイル結果をテストするには以下を実行します。

make check

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

make install

6.48.2. Make の構成

インストールプログラム: make

概略説明

make パッケージの構成要素に対して、どれを(再)コンパイルするかを自動判別
     し、対応するコマンドを実行します。

6.49. Man-DB-2.5.6

Man-DB パッケージは man ページを検索したり表示したりするプログラムを提
供します。

概算ビルド時間: 0.4 SBU
必要ディスク容量: 22 MB

6.49.1. Man-DB のインストール

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

./configure --prefix=/usr --libexecdir=/usr/lib \
    --sysconfdir=/etc --disable-setuid \
    --with-browser=/usr/bin/lynx --with-vgrind=/usr/bin/vgrind \
    --with-grap=/usr/bin/grap

configure オプションの意味

--disable-setuid

    これは man プログラムが man ユーザーに対して setuid を実行しないよ
    うにします。

--with-...

    この三つのオプションはデフォルトで利用するプログラムを指定します。
    lynx はテキストベースの Web ブラウザです。 (BLFS でのインストール手
    順を参照してください。) vgrind はプログラムソースを Groff の入力形
    式に変換します。 grap は Groff 文書においてグラフを組版するために利
    用します。 vgrind と grap は man ページを見るだけであれば必要ありま
    せん。 これらは LFS や BLFS には含まれません。 もし利用したい場合は
    LFS の構築を終えた後に自分でインストールしてください。

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

make

コンパイル結果をテストするには、以下を実行します。

make check

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

make install

6.49.2. LFS における英語以外のマニュアルページ

以下に示す表は /usr/share/man/<ll> 配下にインストールされる man ページ
とそのエンコーディングを示します。 Man-DB は man ページが UTF-8 エンコ
ーディングかどうかを正しく認識します。

表 6.1. 8 ビット man ページのキャラクタエンコーディング

┌─────────┬─────┬──────────┬──────┐
│  言語 (コード)   │エンコーデ│   言語 (コード)    │エンコーディ│
│                  │  ィング  │                    │    ング    │
├─────────┼─────┼──────────┼──────┤
│デンマーク語 (da) │ISO-8859-1│クロアチア語 (hr)   │ISO-8859-1  │
├─────────┼─────┼──────────┼──────┤
│ドイツ語 (de)     │ISO-8859-1│ハンガリー語 (hu)   │ISO-8859-2  │
├─────────┼─────┼──────────┼──────┤
│英語 (en)         │ISO-8859-1│日本語 (ja)         │EUC-JP      │
├─────────┼─────┼──────────┼──────┤
│スペイン語 (es)   │ISO-8859-1│韓国語 (ko)         │EUC-KR      │
├─────────┼─────┼──────────┼──────┤
│エストニア語 (et) │ISO-8859-1│リトアニア語 (lt)   │ISO-8859-13 │
├─────────┼─────┼──────────┼──────┤
│フィンランド語    │ISO-8859-1│ラトビア語 (lv)     │ISO-8859-13 │
│(fi)              │          │                    │            │
├─────────┼─────┼──────────┼──────┤
│フランス語 (fr)   │ISO-8859-1│マケドニア語 (mk)   │ISO-8859-5  │
├─────────┼─────┼──────────┼──────┤
│アイルランド語    │ISO-8859-1│ポーランド語 (pl)   │ISO-8859-2  │
│(ga)              │          │                    │            │
├─────────┼─────┼──────────┼──────┤
│ガリシア語 (gl)   │ISO-8859-1│ルーマニア語 (ro)   │ISO-8859-2  │
├─────────┼─────┼──────────┼──────┤
│インドネシア語    │ISO-8859-1│ロシア語 (ru)       │KOI8-R      │
│(id)              │          │                    │            │
├─────────┼─────┼──────────┼──────┤
│アイスランド語    │ISO-8859-1│スロバキア語 (sk)   │ISO-8859-2  │
│(is)              │          │                    │            │
├─────────┼─────┼──────────┼──────┤
│イタリア語 (it)   │ISO-8859-1│スロベニア語 (sl)   │ISO-8859-2  │
├─────────┼─────┼──────────┼──────┤
│ノルウェー語 ブー │          │                    │            │
│クモール          │ISO-8859-1│セルビア Latin      │ISO-8859-2  │
│(Norwegian Bokmal;│          │(sr@latin)          │            │
│nb)               │          │                    │            │
├─────────┼─────┼──────────┼──────┤
│オランダ語 (nl)   │ISO-8859-1│セルビア語 (sr)     │ISO-8859-5  │
├─────────┼─────┼──────────┼──────┤
│ノルウェー語 ニー │          │                    │            │
│ノシュク          │ISO-8859-1│トルコ語 (tr)       │ISO-8859-9  │
│(Norwegian        │          │                    │            │
│Nynorsk; nn)      │          │                    │            │
├─────────┼─────┼──────────┼──────┤
│ノルウェー語 (no) │ISO-8859-1│ウクライナ語 (uk)   │KOI8-U      │
├─────────┼─────┼──────────┼──────┤
│ポルトガル語 (pt) │ISO-8859-1│ベトナム語 (vi)     │TCVN5712-1  │
├─────────┼─────┼──────────┼──────┤
│スウェーデン語    │          │中国語 簡体字       │            │
│(sv)              │ISO-8859-1│(Simplified Chinese)│GBK         │
│                  │          │(zh_CN)             │            │
├─────────┼─────┼──────────┼──────┤
│                  │          │中国語 簡体字       │            │
│ベラルーシ語 (be) │CP1251    │(Simplified         │GBK         │
│                  │          │Chinese), シンガポー│            │
│                  │          │ル (zh_SG)          │            │
├─────────┼─────┼──────────┼──────┤
│                  │          │中国語 繁体字       │            │
│ブルガリア語 (bg) │CP1251    │(Traditional        │BIG5HKSCS   │
│                  │          │Chinese), 香港      │            │
│                  │          │(zh_HK)             │            │
├─────────┼─────┼──────────┼──────┤
│                  │          │中国語 繁体字       │            │
│チェコ語 (cs)     │ISO-8859-2│(Traditional        │BIG5        │
│                  │          │Chinese) (zh_TW)    │            │
├─────────┼─────┼──────────┼──────┤
│ギリシア語 (el)   │ISO-8859-7│                    │            │
└─────────┴─────┴──────────┴──────┘


注記

上に示されていない言語によるマニュアルページはサポートされません。

6.49.3. Man-DB の構成

インストールプログラム: accessdb, apropos (whatis へのリンク), catman,
lexgrog, man, mandb, manpath, whatis, zsoelim

概略説明

accessdb whatis データベースの内容をダンプして読みやすい形で出力します
         。

apropos  whatis データベースを検索して、指定した文字列を含むシステムコ
         マンドの概略説明を表示します。

catman   フォーマット済マニュアルページを生成、更新します。

lexgrog  指定されたマニュアルページについて、一行のサマリー情報を表示し
         ます。

man      指定されたマニュアルページを整形して表示します。

mandb    whatis データベースを生成、更新します。

         $MANPATH の内容を表示します。 あるいは ($MANPATH が設定されて
manpath  いない場合は) man.conf 内の設定とユーザー設定に基づいて適切な
         検索パスを表示します。

whatis   whatis データベースを検索して、指定されたキーワードを含むシス
         テムコマンドの概略説明を表示します。

zsoelim  ファイルの内容を読み込んで、 .so file の形で書かれている記述行
         を、その file の内容に置き換えます。

6.50. Module-Init-Tools-3.11.1

Module-Init-Tools パッケージは、Linux カーネル 2.5.47 以上においてカー
ネルモジュールを扱うプログラムを提供します。

概算ビルド時間: 0.1 SBU
必要ディスク容量: 8.7 MB

6.50.1. Module-Init-Tools のインストール

本パッケージのテストスイートは開発者の必要を満たす目的で構築されていま
す。 make check を実行すると、特別な形で modprobe プログラムがビルドさ
れます。 しかしこれは普通に用いるには無意味なものです。 テストスイート
を実行するなら (約 0.2 SBU) 以下のコマンドを実行します。 (make clean コ
マンドはソースツリーをきれいなものとするために必要で、次に再コンパイル
して通常利用するプログラムをビルドします。)

./configure
make check
./tests/runtests
make clean

Module-Init-Tools をコンパイルするための準備をします。

./configure --prefix=/ --enable-zlib-dynamic --mandir=/usr/share/man

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

make

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

make INSTALL=install install

make パラメータの意味：

INSTALL=install

    インストールする実行ファイル類が既に存在している場合、普通 make
    install を実行しただけではそれらをインストールしません。 このオプシ
    ョンを指定することでその動作を変更します。 つまりデフォルトのインス
    トールラッパースクリプトを用いるのではなく install コマンドを用いる
    ようにします。

6.50.2. Module-Init-Tools の構成

インストールプログラム: depmod, insmod, insmod.static, lsmod, modinfo,
modprobe, rmmod

概略説明

              存在しているモジュール内に含まれるシンボル名に基づいて、
depmod        モジュールの依存関係を記述したファイル (dependency file)
              を生成します。 これは modprobe が、必要なモジュールを自動
              的にロードするために利用します。

insmod        稼動中のカーネルに対してロード可能なモジュールをインスト
              ールします。

insmod.static スタティックライブラリによってコンパイルされた insmod コ
              マンド。

lsmod         その時点でロードされているモジュールを一覧表示します。

modinfo       カーネルモジュールに関連付いたオブジェクトファイルを調べ
              て、出来る限りの情報を表示します。

              depmod によってモジュールの依存関係を記述したファイル
modprobe      (dependency file) が生成されます。 これを使って関連するモ
              ジュールを自動的にロードします。

rmmod         稼動中のカーネルからモジュールをアンロードします。

6.51. Patch-2.6.1

Patch パッケージは「パッチ」ファイルを適用することにより、ファイルの修
正・生成を行うプログラムを提供します。 「パッチ」ファイルは diff プログ
ラムにより生成されます。

概算ビルド時間: 0.1 SBU 以下
必要ディスク容量: 1.9 MB

6.51.1. Patch のインストール

ed プログラムを必要とするテストの実行を行わないよう、パッチを適用します
。

patch -Np1 -i ../patch-2.6.1-test_fix-1.patch

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

./configure --prefix=/usr

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

make

コンパイル結果をテストするには以下を実行します。

make check

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

make install

6.51.2. Patch の構成

インストールプログラム: patch

概略説明

      パッチファイルに従って対象ファイルを修正します。 パッチファイルは
patch 通常 diff コマンドによって修正前後の違いが列記されているものです
      。 そのような違いを対象ファイルに適用することで patch はパッチを
      適用したファイルを生成します。

6.52. Psmisc-22.10

Psmisc パッケージは稼動中プロセスの情報表示を行うプログラムを提供します
。

概算ビルド時間: 0.1 SBU 以下
必要ディスク容量: 2.5 MB

6.52.1. Psmisc のインストール

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

./configure --prefix=/usr

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

make

このパッケージにテストスイートはありません。

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

make install

Psmisc の pidof プログラムはデフォルトではインストールされませんが、通
常これは問題にはなりません。 それはこの後に Sysvinit パッケージによって
インストールされるからです。 Sysvinit の pidof プログラムはより適切なプ
ログラムです。 しかし特定のシステムにおいて Sysvinit を利用しないなら、
以下のシンボリックリックを生成して Psmisc のインストールを完了させます
。

ln -sv killall /bin/pidof

6.52.2. Psmisc の構成

インストールプログラム: fuser, killall, peekfd, pstree, pstree.x11
(pstree へのリンク)

概略説明

fuser      指定されたファイルまたはファイルシステムを利用しているプロセ
           スのプロセス ID (PID) を表示します。

           プロセス名を用いてそのプロセスを終了 (kill) させます。 指定
killall    されたコマンドを起動しているすべてのプロセスに対してシグナル
           が送信されます。

peekfd     PID を指定することによって、稼動中のそのプロセスのファイルデ
           ィスクリプタを調べます。

pstree     稼働中のプロセスをツリー形式で表示します。

pstree.x11 pstree と同じです。 ただし終了時には確認画面が表示されます。

6.53. Shadow-4.1.4.2

Shadow パッケージはセキュアなパスワード管理を行うプログラムを提供します
。

概算ビルド時間: 0.3 SBU
必要ディスク容量: 30 MB

6.53.1. Shadow のインストール

注記

もっと強力なパスワードを利用したい場合は http://
www.linuxfromscratch.org/blfs/view/svn/postlfs/cracklib.html にて示して
いる Cracklib パッケージを参照してください。 Cracklib パッケージは
Shadow パッケージよりも前にインストールします。 その場合 Shadow パッケ
ージの configure スクリプトでは --with-libcrack パラメータをつけて実行
する必要があります。

groups コマンドとその man ページをインストールしないようにします。 これ
は Coreutils パッケージにて、より良いバージョンが提供されているからです
。

sed -i 's/groups$(EXEEXT) //' src/Makefile.in
find man -name Makefile.in -exec sed -i 's/groups\.1 / /' {} \;

中国語と韓国語の man ページはインストールしません。 Man-DB がそれらを正
しく扱うことができないためです。

sed -i -e 's/ ko//' -e 's/ zh_CN zh_TW//' man/Makefile.in

パスワード暗号化に関して、デフォルトの crypt 手法ではなく、より強力な
MD5 手法を用いることにします。 こうしておくと 8文字以上のパスワード入力
が可能となります。 またメールボックスを収めるディレクトリとして Shadow
ではデフォルトで /var/spool/mail ディレクトリを利用していますが、これは
古いものであるため /var/mail ディレクトリに変更します。

sed -i -e 's@#ENCRYPT_METHOD DES@ENCRYPT_METHOD MD5@' \
       -e 's@/var/spool/mail@/var/mail@' etc/login.defs

注記

Cracklib のサポートを含めて Shadow をビルドする場合は以下を実行します。

sed -i 's@DICTPATH.*@DICTPATH\t/lib/cracklib/pw_dict@' \
    etc/login.defs

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

./configure --sysconfdir=/etc

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

make

このパッケージにテストスイートはありません。

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

make install

不適切なディレクトリにインストールされるプログラムを移動させます。

mv -v /usr/bin/passwd /bin

6.53.2. Shadow の構成

このパッケージには、ユーザーやグループの追加・修正・削除、そのパスワー
ドの設定・変更、その他の管理操作を行うユーティリティが含まれます。 パス
ワードのシャドウイング (password shadowing) というものが何を意味するの
か、その詳細についてはこのパッケージのソース内にある doc/HOWTO を参照し
てください。 Shadow によるサポートを利用する場合、パスワード認証を必要
とするプログラム (ディスプレイマネージャ、FTP プログラム、POP3、デーモ
ン、など) は Shadow に準拠したものでなければなりません。 つまりそれらの
プログラムが、シャドウ化された (shadowed) パスワードを受け入れて動作し
なければならないということです。

Shadow によるパスワードの利用を有効にするために、以下のコマンドを実行し
ます。

pwconv

また Shadow によるグループパスワードを有効にするために、以下を実行しま
す。

grpconv

Shadow の useradd コマンドに対する通常の設定には、注意すべき点がありま
す。 まず useradd コマンドによりユーザーを生成する場合のデフォルトの動
作では、ユーザー名と同じグループを自動生成します。 ユーザーID (UID) と
グループID (GID) は 1000 以上が割り当てられます。 useradd コマンドの利
用時に特にパラメータを与えなければ、追加するユーザーのグループは新たな
固有グループが生成されることになります。 この動作が不適当であれば
useradd コマンドの実行時に -g パラメータを利用することが必要です。 デフ
ォルトで適用されるパラメータは /etc/default/useradd ファイルに定義され
ています。 このファイルのパラメータ定義を必要に応じて書き換えてください
。

/etc/default/useradd のパラメータ説明

GROUP=1000

    このパラメータは /etc/group ファイルにて設定されるグループIDの先頭
    番号を指定します。 必要なら任意の数値に設定することもできます。
    useradd コマンドは既存の UID 値、GID 値を再利用することはありません
    。 このパラメータによって定義された数値が実際に指定された場合、この
    値以降で利用可能な値が利用されます。 また useradd コマンドの実行時
    に、パラメータ -g を利用せず、かつグループID 1000 のグループが存在
    していなかった場合は、以下のようなメッセージが出力されます。
    useradd: unknown GID 1000 ("GID 1000 が不明です") このメッセージは
    無視することができます。 この場合グループIDには 1000 が利用されます
    。

CREATE_MAIL_SPOOL=yes

    このパラメータは useradd コマンドの実行によって、追加されるユーザー
    用のメールボックスに関するファイルが生成されます。 useradd コマンド
    は、このファイルのグループ所有者を mail (グループID 0660) に設定し
    ます。 メールボックスに関するファイルを生成したくない場合は、以下の
    コマンドを実行します。

    sed -i 's/yes/no/' /etc/default/useradd

6.53.3. root パスワードの設定

root ユーザーのパスワードを設定します。

passwd root

6.53.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

概略説明

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 ファイルを編集しま
          す。

6.54. Sysklogd-1.5

Sysklogd パッケージは、例えばカーネルが異常発生時に出力するログのような
、システムログメッセージを取り扱うプログラムを提供します。

概算ビルド時間: 0.1 SBU 以下
必要ディスク容量: 0.5 MB

6.54.1. Sysklogd のインストール

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

make

このパッケージにテストスイートはありません。

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

make BINDIR=/sbin install

6.54.2. Sysklogd の設定

以下を実行して /etc/syslog.conf ファイルを生成します。

cat > /etc/syslog.conf << "EOF"
# Begin /etc/syslog.conf

auth,authpriv.* -/var/log/auth.log
*.*;auth,authpriv.none -/var/log/sys.log
daemon.* -/var/log/daemon.log
kern.* -/var/log/kern.log
mail.* -/var/log/mail.log
user.* -/var/log/user.log
*.emerg *

# End /etc/syslog.conf
EOF

6.54.3. Sysklogd の構成

インストールプログラム: klogd, syslogd

概略説明

klogd   カーネルメッセージを受け取り出力するシステムデーモン。

        システムプログラムが出力するログ情報を出力します。 出力されるロ
syslogd グ情報には少なくとも処理日付、ホスト名が出力されます。 また通常
        はプログラム名も出力されます。 ただこれはログ出力デーモンがどれ
        だけ信頼のおけるものであるかに依存する情報です。

6.55. Sysvinit-2.86

Sysvinit パッケージは、システムの起動、実行、シャットダウンを制御するプ
ログラムを提供します。

概算ビルド時間: 0.1 SBU 以下
必要ディスク容量: 1 MB

6.55.1. Sysvinit のインストール

ランレベルが変更される時 (例えばシステムが停止する時) init コマンドは各
種のプロセスに対して停止シグナル (termination signals) を送信します。
ただしその対象は init プログラム自身が起動したプロセスであり、新たなラ
ンレベルでは起動しないプロセスです。 一方で init コマンドが出力するメッ
セージは 「Sending processes the TERM signal」 (プロセスに対して TERM
シグナルを送信します) というものです。 このメッセージは、その時点にて稼
動中の全プロセスに対してシグナルを送信しているかのように誤解してしまい
ます。 これを正すためにソースを修正して 「Sending processes configured
via /etc/inittab the TERM signal」 (/etc/inittab で設定されているプロセ
スに対して TERM シグナルを送信します) というメッセージに置き換えます。

sed -i 's@Sending processes@& configured via /etc/inittab@g' \
    src/init.c

wall コマンドは Util-linux-ng パッケージにおいてメンテナンスされており
、既にインストールが出来ています。 そこで Sysvinit が提供する wall コマ
ンドはインストールせず、その man ページもインストールしないようにします
。

sed -i -e 's/utmpdump wall/utmpdump/' \
       -e 's/mountpoint.1 wall.1/mountpoint.1/' src/Makefile

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

make -C src

本パッケージにテストスイートはありません。

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

make -C src install

6.55.2. Sysvinit の設定

以下のコマンドを実行して新しい /etc/inittab ファイルを生成します。

cat > /etc/inittab << "EOF"
# Begin /etc/inittab

id:3:initdefault:

si::sysinit:/etc/rc.d/init.d/rc sysinit

l0:0:wait:/etc/rc.d/init.d/rc 0
l1:S1:wait:/etc/rc.d/init.d/rc 1
l2:2:wait:/etc/rc.d/init.d/rc 2
l3:3:wait:/etc/rc.d/init.d/rc 3
l4:4:wait:/etc/rc.d/init.d/rc 4
l5:5:wait:/etc/rc.d/init.d/rc 5
l6:6:wait:/etc/rc.d/init.d/rc 6

ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now

su:S016:once:/sbin/sulogin

1:2345:respawn:/sbin/agetty tty1 9600
2:2345:respawn:/sbin/agetty tty2 9600
3:2345:respawn:/sbin/agetty tty3 9600
4:2345:respawn:/sbin/agetty tty4 9600
5:2345:respawn:/sbin/agetty tty5 9600
6:2345:respawn:/sbin/agetty tty6 9600

# End /etc/inittab
EOF

6.55.3. Sysvinit の構成

インストールプログラム: bootlogd, halt, init, killall5, last, lastb
(last へのリンク), mesg, mountpoint, pidof (killall5 へのリンク),
poweroff (halt へのリンク), reboot (halt へのリンク), runlevel,
shutdown, sulogin, telinit (init へのリンク), utmpdump

概略説明

bootlogd   ブート時のメッセージをログファイルに出力します。

           ランレベルが既に 0 ではない通常の起動状態の場合に shutdown
halt       をオプション -h をつけて実行します。 そしてカーネルに対して
           システム停止を指示します。 システムが停止される状況は /var/
           log/wtmp ファイルに記録されます。

           カーネルがハードウェアを初期化した後に、最初に起動するプロセ
init       スです。 ブート処理がこのプロセスに引き継がれ、指示されたプ
           ロセスをすべて起動していきます。

           プロセスすべてに対してシグナルを送信します。 ただし自分のセ
killall5   ッション内の起動プロセスは除きます。 つまり本コマンドを実行
           したスクリプトは停止されません。

           ユーザーの最新のログイン (ログアウト) の情報を表示します。
last       これは /var/log/wtmp ファイルの終わりから調べているものです
           。 またシステムブート、シャットダウン、ランレベルの変更時の
           情報も示します。

lastb      ログインに失敗した情報を表示します。 これは /var/log/btmp に
           記録されています。

mesg       現在のユーザーの端末に対して、他のユーザーがメッセージ送信で
           きるかどうかを制御します。

mountpoint 指定されたディレクトリがマウントポイントであるかどうかをチェ
           ックします。

pidof      指定されたプログラムの PID を表示します。

poweroff   カーネルに対してシステムの停止を指示し、コンピュータの電源を
           切ります。 (halt を参照してください。)

reboot     カーネルに対してシステムの再起動を指示します。 (halt を参照
           してください。)

runlevel   現在のランレベルと直前のランレベルを表示します。 最新のラン
           レベルは /var/run/utmp ファイルに記録されています。

shutdown   システムの終了を安全に行います。 その際にはプロセスすべてへ
           のシグナル送信を行い、ログインユーザーへの通知も行います。

           root ユーザーでのログインを行います。 通常は init が起動する
sulogin    もので、システムがシングルユーザーモードで起動する際に利用さ
           れます。

telinit    init に対してランレベルの変更を指示します。

utmpdump   指定されたログファイル内の情報を分かりやすく表示します。

6.56. Tar-1.22

Tar パッケージはアーカイブプログラムを提供します。

概算ビルド時間: 1.9 SBU テストスイート込み
必要ディスク容量: 21.2 MB

6.56.1. Tar のインストール

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

./configure --prefix=/usr --bindir=/bin --libexecdir=/usr/sbin

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

make

コンパイル結果をテストするために以下を実行します。(約 1 SBU)

make check

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

make install

6.56.2. Tar の構成

インストールプログラム: rmt, tar

概略説明

rmt プロセス間通信のコネクションを通じて磁気テープドライブを遠隔操作し
    ます。

tar アーカイブの生成、アーカイブからのファイル抽出、アーカイブの内容一
    覧表示を行います。 アーカイブは tarball とも呼ばれます。

6.57. Texinfo-4.13a

Texinfo パッケージは info ページへの読み書き・変換を行うプログラムを提
供します。

概算ビルド時間: 0.3 SBU
必要ディスク容量: 21 MB

6.57.1. Texinfo のインストール

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

./configure --prefix=/usr

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

make

コンパイル結果をテストするには以下を実行します。

make check

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

make install

必要なら TeX システムに属するコンポーネント類をインストールします。

make TEXMF=/usr/share/texmf install-tex

make パラメータの意味：

TEXMF=/usr/share/texmf

    Makefile 変数である TEXMF に TeX ツリーのルートディレクトリを設定し
    ます。 これは後に TeX パッケージをインストールするための準備です。

ドキュメントシステム Info は、 メニュー項目の一覧を単純なテキストファイ
ルに保持しています。 そのファイルは /usr/share/info/dir にあります。 残
念ながら数々のパッケージの Makefile は、既にインストールされている info
ページとの同期を取る処理を行わない場合があります。 /usr/share/info/dir
の再生成を必要とするなら、以下のコマンドを実行してこれを実現します。

cd /usr/share/info
rm -v dir
for f in *
do install-info $f dir 2>/dev/null
done

6.57.2. Texinfo の構成

インストールプログラム: info, infokey, install-info, makeinfo,
pdftexi2dvi, texi2dvi, texi2pdf, texindex

概略説明

             info ページを見るために利用します。 これは man ページに似
info         ていますが、単に利用可能なコマンドラインオプションを説明す
             るだけのものではなく、おそらくはもっと充実しています。 例
             えば man bison と info bison を比較してみてください。

infokey      Info のカスタマイズ情報を設定したソースファイルをバイナリ
             形式にコンパイルします。

install-info info ページをインストールします。 info 索引ファイルにある
             索引項目も更新します。

makeinfo     指定された Texinfo ソースファイルを Info ページ、プレーン
             テキスト、HTML ファイルに変換します。

pdftexi2dvi  指定された Texinfo ドキュメントファイルを PDF (Portable
             Document Format) ファイルに変換します。

texi2dvi     指定された Texinfo ドキュメントファイルを、デバイスに依存
             しない印刷可能なファイルに変換します。

texi2pdf     指定された Texinfo ドキュメントファイルを PDF (Portable
             Document Format) ファイルに変換します。

texindex     Texinfo 索引ファイルの並び替えを行います。

6.58. Udev-151

Udev パッケージはデバイスノードを動的に生成するプログラムを提供します。

概算ビルド時間: 0.2 SBU
必要ディスク容量: 11.6 MB

6.58.1. Udev のインストール

udev-config という Tar アーカイブファイルには Udev パッケージをビルドす
る際の LFS 独自のファイルが含まれています。 以下のようにしてこのファイ
ルを Udev ソースディレクトリに展開します。

tar -xvf ../udev-config-20100128.tar.bz2

デバイスやディレクトリのいくつかはシステム起動時に必要になりますが、起
動処理の初期段階であるために Udev はそれらを認識できません。 そこでそれ
らのデバイスまたはディレクトリを生成します。

install -dv /lib/{firmware,udev/devices/{pts,shm}}
mknod -m0666 /lib/udev/devices/null c 1 3
ln -sv /proc/self/fd /lib/udev/devices/fd
ln -sv /proc/self/fd/0 /lib/udev/devices/stdin
ln -sv /proc/self/fd/1 /lib/udev/devices/stdout
ln -sv /proc/self/fd/2 /lib/udev/devices/stderr
ln -sv /proc/kcore /lib/udev/devices/core

パッケージをコンパイルするための準備をします。

./configure --prefix=/usr \
    --sysconfdir=/etc --sbindir=/sbin \
    --with-rootlibdir=/lib --libexecdir=/lib/udev \
    --docdir=/usr/share/doc/udev-151 \
    --disable-extras --disable-introspection

configure オプションの意味：

--with-rootlibdir=/lib

    このオプションは libudev ライブラリのインストール先を指定します。
    このライブラリは /lib ディレクトリにインストールする必要があります
    。 デフォルトでは --rootlibdir は /usr/lib ディレクトリとなっていま
    すが、/usr ディレクトリが認識できるようになる前の、ブート起動時に
    Udev が認識できなければならないためです。

--libexecdir=/lib/udev

    このオプションは Udev の内部ルールやヘルパープログラムのインストー
    ル先を指定します。

--docdir=/usr/share/doc/udev-151

    このオプションは、Udev のドキュメントをインストールします。 インス
    トールにあたっては、他のパッケージとの整合を保った名称が用いられま
    す。

--disable-extras

    このオプションは、特定のヘルパープログラムや他のプログラム類
    (extras) をインストールしないようにします。 他のプログラム類は、さ
    らに外部ライブラリを必要としており、それらは LFS システムには含まれ
    ていません。 詳しくは Udev が提供する README ファイルを参照してくだ
    さい。

--disable-introspection

    このオプションは Udev のイントロスペクション (introspection) 機能を
    無効にします。 この機能は、LFS システムにてインストールするパッケー
    ジではなく、別のパッケージにて必要となるものです。 詳しくは Udev の
    README ファイルを参照してください。

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

make

このパッケージにテストスイートはありません。

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

make install

Udev を正しく作動させるためには正しい設定が必要です。 しかしデフォルト
の設定ではすべてのデバイスを網羅できていません。 まずは Udev が提供する
以下の特別な2つのルールをインストールします。 これらはデバイスマッパー
(device-mapper) と RAID の設定をサポートします。

install -m644 -v rules/packages/64-*.rules \
    /lib/udev/rules.d/

特定のハンドヘルド (hand-held) デバイスへのシンボリックリンクを生成する
ファイルをインストールします。

install -m644 -v rules/packages/40-pilot-links.rules \
    /lib/udev/rules.d/

ISDN デバイスを取り扱うファイルをインストールします。

install -m644 -v rules/packages/40-isdn.rules \
    /lib/udev/rules.d/

LFS 固有のカスタムルールファイルをインストールします。

cd udev-config-20100128
make install

LFS 固有のカスタムルールファイルについて説明しているドキュメントをイン
ストールします。

make install-doc

6.58.2. Udev の構成

インストールプログラム: ata_id, cdrom_id, collect,
create_floppy_devices, edd_id, firmware.sh, fstab_import, path_id,
scsi_id, udevadm, udevd, usb_id, write_cd_rules, write_net_rules
インストールライブラリ: libudev.{a,so}
インストールディレクトリ: /etc/udev

概略説明

ata_id                ATA ドライブに対するユニークな文字列と追加情報
                      (uuid、ラベル) を Udev に提供します。

cdrom_id              CD-ROM ドライブや DVD-ROM ドライブの情報を Udev
                      に提供します。

                      現在の uevent の ID と (すべての対象 uevent に対
collect               する) ID のリストを与えることで、現在の ID を登録
                      し、すべての対象 ID が既に登録済みであるかどうか
                      を示します。

create_floppy_devices CMOS タイプに基づく、すべてのフロッピーデバイスを
                      生成します。

edd_id                BIOS ディスクドライブに対する EDD ID を Udev に提
                      供する。

firmware.sh           ファームウェアをデバイスにアップロードします。

                      /etc/fstab に記述された項目の中から現在のデバイス
fstab_import          に合致するものを探し出し、その情報を Udev に提供
                      します。

path_id               デバイスへのパスとして、可能な限り最も短くユニー
                      クなハードウェアパスを提供します。

                      特定のデバイスに対する SCSI INQUIRY コマンド送信
scsi_id               の結果として得られるデータに基づく、ユニークな
                      SCSI 識別子を Udev に対して提供します。

                      汎用的な Udev 管理ツール。 udevd デーモンの制御、
                      Udev データベースデータの提供、uevent の監視、
udevadm               uevent の完了までの待機、Udev 設定のテスト、指定
                      デバイスに対する uevent の起動、といったことを行
                      います。

                      ネットワークソケット上の uevent を待ち受けるデー
udevd                 モン。 デバイスを生成し、その uevent に対応する外
                      部プログラムを起動します。

usb_id                USB デバイスに関する情報を Udev に対して提供しま
                      す。

                      光学ドライブに対する固定的な名称を定めた Udev ル
write_cd_rules        ールを生成するためのスクリプト。 (7.10. 「デバイ
                      スへのシンボリックリンクの生成」 も参照のこと。)

                      ネットワークインターフェースに対する固定的な名称
write_net_rules       を定めた Udev ルールを生成するためのスクリプト。
                      (7.13. 「ネットワークスクリプトの設定」 も参照の
                      こと。)

libudev               Udev デバイス情報のインターフェースライブラリ。

/etc/udev             Udev 設定ファイル、デバイスのパーミッション、デバ
                      イス命名規則を定めます。

6.59. Vim-7.2

Vim パッケージは強力なテキストエディタを提供します。

概算ビルド時間: 1.0 SBU
必要ディスク容量: 79 MB

Vim の代替ソフトウェア

もし Emacs、Joe、Nano など他のエディタを用いたい場合は http://
www.linuxfromscratch.org/blfs/view/svn/postlfs/editors.html に示される
手順に従ってインストールしてください。

6.59.1. Vim のインストール

まず２つのアーカイブ vim-7.2.tar.bz2、 vim-7.2-lang.tar.gz を同一ディレ
クトリに解凍します。 (２つめのアーカイブを用いるのは任意です。)

Vim-7.2 の初期版リリース以降に開発者によって発見された種々の問題を解消
するために、以下のパッチを適用します。

patch -Np1 -i ../vim-7.2-fixes-5.patch

設定ファイル vimrc がインストールされるデフォルトディレクトリを /etc に
変更します。

echo '#define SYS_VIMRC_FILE "/etc/vimrc"' >> src/feature.h

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

./configure --prefix=/usr --enable-multibyte

configure オプションの意味：

--enable-multibyte

    このオプションは、マルチバイトエンコーディングによるファイルの編集
    をサポートする指示を行います。 マルチバイト文字を用いるロケールにと
    ってはこれが必要です。 例えば Fedora Core のようにデフォルトで
    UTF-8 を採用している Linux ディストリビューションにおいては、新規に
    生成するテキストファイルを編集できるようにするために、このオプショ
    ンを指定することが有用です。

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

make

コンパイル結果をテストするには以下を実行します。

make test

このテストスイートは数多くのバイナリデータを端末画面上に出力します。 こ
れは端末画面の設定によっては問題を引き起こします。 これを避けるには出力
をリダイレクトしてログファイルに出力するようにしてください。

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

make install

たいていのユーザーは vim ではなく vi を使うようです。 vi を入力しても
vim が実行されるように、実行モジュールに対するシンボリックリンクを作成
します。 さらに指定された言語による man ページへのシンボリックリンクも
作成します。

ln -sv vim /usr/bin/vi
for L in  /usr/share/man/{,*/}man1/vim.1; do
    ln -sv vim.1 $(dirname $L)/vi.1
done

デフォルトでは Vim のドキュメントが /usr/share/vim にインストールされま
す。 以下のようなシンボリックリンクを生成することで /usr/share/doc/
vim-7.2 へアクセスしてもドキュメントが参照できるようにし、他のパッケー
ジが配置するドキュメントの場所と整合を取ります。

ln -sv ../vim/vim72/doc /usr/share/doc/vim-7.2

LFS システムに対して X ウィンドウシステムをインストールする場合 X のイ
ンストールの後で Vim を再コンパイルする必要があります。 Vim には GUI 版
があり X や他のライブラリがインストールされていて 初めて構築できるため
です。 この作業の詳細については Vim のドキュメントと BLFS ブックの
http://www.linuxfromscratch.org/blfs/view/svn/postlfs/editors.html#
postlfs-editors-vim に示されている Vim のインストール説明のページを参照
してください。

6.59.2. Vim の設定

デフォルトで vim は Vi 非互換モード (vi-incompatible mode) で起動します
。 他のエディタを使ってきたユーザーにとっては、よく分からないものかもし
れません。 以下の設定における 「nocompatible」 (非互換) は、Vi の新しい
機能を利用することを意味しています。 もし 「compatible」 (互換) モード
に変更したい場合は、この設定ファイルの冒頭にて行っておくことが必要です
。 このモード設定は他の設定を置き換えるものとなることから、まず初めに行
っておかなければならないものだからです。 以下のコマンドを実行して vim
の設定ファイルを生成します。

cat > /etc/vimrc << "EOF"
" Begin /etc/vimrc

set nocompatible
set backspace=2
syntax on
if (&term == "iterm") || (&term == "putty")
  set background=dark
endif

" End /etc/vimrc
EOF

set nocompatible と設定しておくと vi 互換モードでの動作に比べて有用な動
作となります。 (これがデフォルトになっています。) その設定の記述から 「
no」 の文字を取り除けば、旧来の vi コマンドの動作となります。 set
backspace=2 を設定しておくと、行を超えてもバックスペースキーによる編集
が可能となります。 またインデントが自動的に行われ、コマンド起動時には自
動的に挿入モードとなります。 syntax on パラメータを指定すれば vim の文
法ハイライト (syntax highlighting) 機能が有効になります。 最後にある if
文は、set background=dark を指定した場合に、特定の端末エミュレータ上に
おいて vim が背景色を誤って認識しないようにするためのものです。 エミュ
レータの背景色が黒色であった場合に、より適切なハイライトが実現できます
。

この他に利用できるオプションについては、以下のコマンドを実行することで
出力される説明を参照してください。

vim -c ':options'

注記

Vim がインストールするスペルファイル (spell files) はデフォルトでは英語
に対するものだけです。 必要とする言語のスペルファイルをインストールする
なら ftp://ftp.vim.org/pub/vim/runtime/spell/ から、特定の言語、エンコ
ーディングによる *.spl ファイル、またオプションとして *.sug ファイルを
ダウンロードしてください。 そしてそれらのファイルを /usr/share/vim/
vim72/spell/ ディレクトリに保存してください。

スペルファイルを利用するには /etc/vimrc ファイルにて、例えば以下のよう
な設定が必要になります。

set spelllang=en,ru
set spell

詳しくは、上で説明した URL にて提供されている README ファイルを参照して
ください。

6.59.3. Vim の構成

インストールプログラム: ex (vim へのリンク), rview (vim へのリンク),
rvim (vim へのリンク), vi (vim へのリンク), view (vim へのリンク), vim,
vimdiff (vim へのリンク), vimtutor, xxd

概略説明

ex       vim を ex モードで起動します。

rview    view の機能限定版。 シェルは起動できず、サスペンドも行うことは
         できません。

rvim     vim の機能限定版。 シェルは起動できず、サスペンドも行うことは
         できません。

vi       vim へのリンク。

view     vim を読み込み専用モード (read-only mode) で起動します。

vim      エディタ。

vimdiff  vim により、同一ファイルにおける２つまたは３つの版を同時に編集
         し、差異を表示します。

vimtutor vim の基本的なキー操作とコマンドについて教えてくれます。

xxd      指定されたファイルの内容を 16進数ダンプとして変換します。 逆の
         変換も行うことができるため、バイナリパッチにも利用されます。

6.60. デバッグシンボルについて

プログラムやライブラリの多くは、デフォルトではデバッグシンボルを含めて
コンパイルされています。 (gcc の -g オプションが用いられています。) デ
バッグ情報を含めてコンパイルされたプログラムやライブラリは、デバッグ時
にメモリアドレスが参照できるだけでなく、処理ルーチンや変数の名称も知る
ことができます。

しかしそういったデバッグ情報は、プログラムやライブラリのファイルサイズ
を極端に大きくします。 以下にデバッグシンボルが占める割合の例を示します
。

 ・ デバッグシンボルを含んだ bash の実行ファイル： 1200 KB

 ・ デバッグシンボルを含まない bash の実行ファイル： 480 KB

 ・ デバッグシンボルを含んだ Glibc と GCC の関連ファイル (/lib と /usr/
    lib): 87 MB

 ・ デバッグシンボルを含まない Glibc と GCC の関連ファイル: 16MB

利用するコンパイラや C ライブラリの違いによって、生成されるファイルのサ
イズは異なります。 デバッグシンボルを含む、あるいは含まないサイズを比較
した場合、その差は 2倍から 5倍の違いがあります。

プログラムをデバッグするユーザーはそう多くはありません。 デバッグシンボ
ルを削除すればディスク容量はかなり節減できます。 次節ではプログラムやラ
イブラリからデバッグシンボルを取り除く (strip する) 方法を示します。

6.61. 再度のストリップ

対象ユーザーがプログラマではなく、プログラム類をデバッグするような使い
方をしないのであれば、実行ファイルやライブラリに含まれるデバッグシンボ
ルを削除しても構いません。 そうすれば 90 MB ものサイズ削減を図ることが
できます。 たとえデバッグできなくなっても困らないはずです。

以下に示すコマンドは、いとも簡単なものです。 ただし入力つづりは簡単に間
違いやすいので、もし誤った入力をするとシステムを利用不能にしてしまいま
す。 したがって strip コマンドを実行する前に、現時点の LFS システムのバ
ックアップを取っておくことをお勧めします。

ストリップを実行する前には、ストリップしようとしている実行ファイルが実
行中でないことを十分確認してください。 また 6.4. 「Chroot 環境への移行
」 に示したコマンドにより chroot 環境に入っているかどうか定かでない場合
は、 いったんログアウトしてください。

logout

再度 chroot 環境に入ります。

chroot $LFS /tools/bin/env -i \
    HOME=/root TERM=$TERM PS1='\u:\w\$ ' \
    PATH=/bin:/usr/bin:/sbin:/usr/sbin \
    /tools/bin/bash --login

以下により実行バイナリやライブラリを安全にストリップします。

/tools/bin/find /{,usr/}{bin,lib,sbin} -type f \
  -exec /tools/bin/strip --strip-debug '{}' ';'

ファイルフォーマットが認識できないファイルがいくつも警告表示されますが
、無視して構いません。 この警告は、処理したファイルが実行モジュールでは
なくスクリプトファイルであることを示しています。

ディスク容量が極端に少ない場合は /{,usr/}{bin,sbin} ディレクトリにある
実行モジュールに対して --strip-all オプションを用いることもできます。
この場合さらに数 MB の容量を節約できます。 ただしこれをライブラリに対し
て用いてはなりません。 これを用いてしまうとライブラリが破壊されてしまい
ます。

6.62. 仕切り直し

それまで入っていた chroot 環境からいったん抜け出て、以下の chroot コマ
ンドにより入り直します。

chroot "$LFS" /usr/bin/env -i \
    HOME=/root TERM="$TERM" PS1='\u:\w\$ ' \
    PATH=/bin:/usr/bin:/sbin:/usr/sbin \
    /bin/bash --login

上を実行するのは /tools ディレクトリがもう必要ないからです。 ですから /
tools ディレクトリが一切無くてよいなら削除しても構いません。

注記

/tools ディレクトリを削除すると、ツールチェーンのテストに用いていた Tcl
、Expect、DejaGNU も削除することになります。 後々これらのプログラムを用
いるなら、再度コンパイルとインストールを行う必要があります。 BLFS ブッ
クにてその手順を説明しているので http://www.linuxfromscratch.org/blfs/
を参照してください。

仮想カーネルファイルシステムを、手動により、あるいはリブートによりアン
マウントした場合は chroot 環境に入る前にそれらがマウントされていること
を確認してください。 その作業手順は 6.2.2. 「/dev のマウントと有効化」
と 6.2.3. 「仮想カーネルファイルシステムのマウント」 で説明しています。

第7章 ブートスクリプトの設定

7.1. はじめに

この章では LFS ブートスクリプトパッケージのインストールと設定について説
明します。 スクリプトのほとんどは修正する必要がありませんが、 中にはハ
ードウェアに依存する情報を取り扱うため追加設定を要するものもあります。

System V系のスクリプトが広く用いられていることから、本書でもこれを利用
します。 これとは別の方法として BSD 系の初期化スクリプトがあり http://
www.linuxfromscratch.org/hints/downloads/files/bsd-init.txt にて説明さ
れています。また LFS メーリングリストで 「depinit」 という語を検索して
みれば、さらに別の方法が示されていますので確認してください。

初期化スクリプトに関して別の方法をとるのであれば、本章は読み飛ばして 第
8章 に進んでください。

7.2. LFS-ブートスクリプト-20100124

LFS-ブートスクリプトパッケージは LFS システムの起動、終了時に利用するス
クリプトを提供します。

概算ビルド時間: 0.1 SBU 以下
必要ディスク容量: 980 KB

7.2.1. LFS ブートスクリプトのインストール

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

make install

7.2.2. LFS ブートスクリプトの構成

インストールスクリプト: checkfs, cleanfs, console, consolelog,
functions, halt, ifdown, ifup, localnet, modules, mountfs, mountkernfs,
network, rc, reboot, sendsignals, setclock, static, swap, sysctl,
sysklogd, template, udev, udev_retry

概略説明

            ファイルシステムがマウントされる前にその整合性をチェックし
checkfs     ます。 (ただしジャーナルファイルシステムとネットワークベー
            スのファイルシステムは除きます。)

            リブートの際に不要となるファイルを削除します。 例えば /var/
            run/ ディレクトリや /var/lock/ ディレクトリの配下にあるファ
cleanfs     イルです。 /var/run/utmp ファイルは再生成されます。 また /
            etc/nologin、 /fastboot、 /forcefsck がおそらく存在しており
            、これらは削除されます。

            必要となるキーボードレイアウトに対しての正しいキーマップテ
console     ーブルをロードします。 同時にスクリーンフォントもセットしま
            す。

consolelog  カーネルのログレベルを設定して、コンソールに出力されるメッ
            セージを制御します。

functions   共通的な関数を提供します。 例えばエラーやステータスのチェッ
            クなどであり、これはブートスクリプトの多くが利用します。

halt        システムを停止します。

ifdown      ネットワークデバイスを停止するネットワークスクリプトをサポ
            ートします。

ifup        ネットワークデバイスを起動するネットワークスクリプトをサポ
            ートします。

localnet    システムのホスト名とローカルループバックデバイスを設定しま
            す。

modules     /etc/sysconfig/modules にて一覧設定されているカーネルモジュ
            ールをロードします。 その際には引数が指定され利用されます。

            ファイルシステムをすべてマウントします。 ただし noauto が設
mountfs     定されているものやネットワークベースのファイルシステムは除
            きます。

mountkernfs 仮想カーネルファイルシステムをマウントします。 例えば proc
            などです。

            ネットワークカードなどのネットワークインターフェースを設定
network     します。 そして (可能であれば) デフォルトゲートウェイを設定
            します。

            ランレベルを制御するマスタースクリプト。 他のブートスクリプ
rc          トを一つずつ実行します。 その際には実行されるシンボリックの
            名前によって実行順序を決定します。

reboot      システムを再起動します。

sendsignals システムが再起動または停止する前に、プロセスすべてが停止し
            ていることを確認します。

setclock    ハードウェアクロックが UTC 時刻に設定されていなければ、カー
            ネルクロックをローカル時刻としてリセットします。

            ネットワークインターフェースに対して固定 IP (Internet
static      Protocol) アドレスを割り当てるために必要となる機能を提供し
            ます。

swap        スワップファイルやスワップパーティションを有効または無効に
            します。

sysctl      /etc/sysctl.conf ファイルが存在している場合、実行中のカーネ
            ルに対してシステム設定値をロードします。

sysklogd    システムログデーモンおよびカーネルログデーモンの起動と停止
            を行います。

template    他のデーモン用としてブートスクリプトを生成するためのテンプ
            レート。

udev        /dev ディレクトリを準備して Udev を起動します。

            Udev の uevent が失敗した場合にこれを再実行します。 そして
udev_retry  必要に応じて、生成されたルールファイルを /dev/.udev から /
            etc/udev/rules.d へコピーします。

7.3. ブートスクリプトはどのようにして動くのか

Linux では SysVinit という特別なブート機能があり ランレベル
(run-levels) という考え方に基づいています。 ランレベルの扱いはシステム
によって異なりますので、ある Linux において動作しているからといって LFS
においても全く同じように動くわけではありません。 LFS では独自の方法でこ
れを取り入れることにします。 ただし標準として受け入れられるような方法を
取ります。

SysVinit (これ以降は 「init」 と表現します) はランレベルという仕組みに
より動作します。 ランレベルには7つのレベル (0 から 6) があります。 (実
際にはランレベルはそれ以上あるのですが、特殊な場合であって普通は利用さ
れません。 詳しくは init(8) を参照してください。) 各レベルは、コンピュ
ータの起動時における処理動作に対応づいており、デフォルトのランレベルは
3 となっています。 ランレベルの詳細を以下に説明します。

0: コンピュータの停止
1: シングルユーザーモード
2: マルチユーザーモード、ネットワークなし
3: マルチユーザーモード、ネットワークあり
4: 将来の拡張用として予約されています。 3 と同じものとして扱われます。
5: 4 と同様。通常 (X の xdm や KDE の kdm のような) GUI ログインに用い
られます。
6: コンピュータの再起動

ランレベルを変更するには init <runlevel> を実行します。 <runlevel> はラ
ンレベルを示す数字です。 例えばコンピュータを再起動するには init 6 コマ
ンドを実行します。 これは reboot コマンドのエイリアスとなっています。
同様に init 0 は halt のエイリアスです。

/etc/rc.d ディレクトリの配下には複数のサブディレクトリがあります。 その
ディレクトリ名は rc?.d のようになっています。 (? はランレベルの数字を表
します。) また rcsysinit.d というサブディレクトリもあります。 それらサ
ブディレクトリ内には数多くのシンボリックリンクがあります。 シンボリック
リンクの先頭一文字には K や S が用いられ、続いて二桁の数値文字がつけら
れています。 K はサービスの停止 (kill)、S はサービスの起動 (start) を意
味します。 二桁の数字はスクリプトの起動順を定めるもので、00 から 99 ま
でが割振られ、小さな数字から順に実行されます。 init コマンドによってラ
ンレベルが変更される時は、そのランレベルに応じて必要なサービスが起動す
るか停止することになります。

スクリプトファイルは /etc/rc.d/init.d ディレクトリにあります。 実際の処
理はここにあるファイルが用いられます。 これらに対してはシンボリックリン
クが用意されています。 サービスの起動と停止を行うシンボリックリンクは /
etc/rc.d/init.d ディレクトリにあるスクリプトを指し示しています。 このよ
うにしているのは、各スクリプトが start、 stop、 restart、 reload、
status といった様々なパラメータにより呼び出されるためです。 K の名前を
持つシンボリックリンクが起動されるということは stop パラメータをつけて
該当するスクリプトが実行されるということです。 同様に S の名前を持つシ
ンボリックリンクが起動されるということは start パラメータをつけて呼び出
されるということになります。

上の説明には例外があります。 rc0.d ディレクトリと rc6.d ディレクトリに
ある、S で始まるシンボリックリンクはサービスを何も起動させません。 stop
パラメータが与えられ、何らかのサービスを停止します。 ユーザーがシステム
を再起動したり停止したりする際には、サービスを起動させる必要はないわけ
で、システムを停止するだけで済むからです。

スクリプトに対するパラメータは以下のとおりです。

start

    サービスを起動します。

stop

    サービスを停止します。

restart

    サービスをいったん停止し再起動します。

reload

    サービスの設定ファイルを更新します。 設定ファイルが変更されたものの
    、サービスの再起動は必要ではない場合に利用します。

status

    サービスがどの PID 値で動いているかを表示します。

ブート機能を動作させる方法は自由に取り決めて設定して構いません。 このシ
ステムはつまるところあなた自身のシステムだからです。 上に示したファイル
類はブート機能を定めた一例に過ぎません。

7.4. Setclock スクリプトの設定

setclock スクリプトはハードウェアクロックから時刻を読み取ります。 ハー
ドウェアクロックは BIOS クロック、あるいは CMOS (Complementary Metal
Oxide Semiconductor) クロックとしても知られているものです。 ハードウェ
アクロックが UTC に設定されていると setclock スクリプトは /etc/
localtime ファイルを参照して、ハードウェアクロックの示す時刻をローカル
時刻に変換します。 /etc/localtime ファイルは hwclock プログラムに対して
、ユーザーがどのタイムゾーンに位置するかを伝えます。 ハードウェアクロッ
クが UTC に設定されているかどうかを知る方法はないので、手動で設定を行う
必要があります。

setclock スクリプトは udev によって起動されます。この時というのはブート
時であり、カーネルがハードウェアを検出する時です。 停止パラメータを与え
て手動でこのスクリプトを実行することもできます。 その場合 CMOS クロック
に対してシステム時刻が保存されます。

ハードウェアクロックが UTC に設定されているかどうか忘れた場合は hwclock
--localtime --show を実行すれば確認できます。 このコマンドにより、ハー
ドウェアクロックに基づいた現在時刻が表示されます。 その時刻が手元の時計
と同じ時刻であれば、ローカル時刻として設定されているわけです。 一方それ
がローカル時刻でなかった場合は、おそらくは UTC に設定されているからでし
ょう。 hwclock によって示された時刻からタイムゾーンに応じた一定時間を加
減してみてください。 例えばタイムゾーンが MST であった場合、これは GMT
-0700 なので、7時間を加えればローカル時刻となります。

ハードウェアクロックが UTC 時刻として設定されていない 場合は、以下に示
す変数 UTC の値を 0 (ゼロ) にしてください。

以下のコマンドを実行して /etc/sysconfig/clock ファイルを新規に作成しま
す。

cat > /etc/sysconfig/clock << "EOF"
# Begin /etc/sysconfig/clock

UTC=1

# Set this to any options you might need to give to hwclock,
# such as machine hardware clock type for Alphas.
CLOCKPARAMS=

# End /etc/sysconfig/clock
EOF

LFS において時刻の取り扱い方を示した分かりやすいヒントが http://
www.linuxfromscratch.org/hints/downloads/files/time.txt にあります。 そ
こではタイムゾーン、UTC、環境変数 TZ などについて説明しています。

7.5. Linux コンソールの設定

この節ではブートスクリプト console、 consolelog の設定方法について説明
します。 このスクリプトはキーボードマップ、コンソールフォント、カーネル
ログレベルを設定します。 非アスキー文字 (例えば著作権、ポンド記号、ユー
ロ記号など) を使わず、キーボードが US 配列であるなら、本節は読み飛ばし
てください。 console ブートスクリプトの設定ファイルが存在しない場合は、
このスクリプトは何も行いません。

console スクリプトと consolelog スクリプトは、設定情報を /etc/sysconfig
/console ファイルから読み込みます。 まずは利用するキーボードマップとス
クリーンフォントを定めます。 様々な言語に応じた設定方法については http:
//www.tldp.org/HOWTO/HOWTO-INDEX/other-lang.html を参照してください。
よく分からない場合は /lib/kbd ディレクトリを見て、正しいキーマップとス
クリーンフォントを探してください。 マニュアルページ loadkeys(1) と
setfont(8) を見て、これらのプログラムに対する適切な引数を決定してくださ
い。

/etc/sysconfig/console ファイルの各行には、変数 = "値" という記述を行い
ます。 そして変数には以下に示すものが利用可能です。

LOGLEVEL

    この変数は、コンソールに出力されるカーネルメッセージのログレベルを
    指定するもので dmesg コマンドにより設定されます。 有効な設定値は
    "1" (メッセージ出力なし) から "8" まであり、デフォルトは "7" です。

KEYMAP

    この変数は loadkeys プログラムに対する引数を指定します。 このプログ
    ラムは 「es」 などのキーマップをロードします。 この変数がセットされ
    ていない場合、ブートスクリプトは loadkeys プログラムを実行せず、デ
    フォルトのカーネルキーマップが用いられます。

KEYMAP_CORRECTIONS

    この変数は (あまり利用されませんが) loadkeys プログラムを二度目に呼
    び出す際の引数を指定します。 普通のキーマップでは十分な設定にならな
    い時の微調整を行うために利用します。 例えばユーロ記号がキーマップの
    中に含まれておらずこれを付け加える場合には、この変数に対して 「
    euro2」 を設定します。

FONT

    この変数は setfont プログラムへの引数を指定します。 一般にこの変数
    にはフォント名、「-m」、アプリケーションキャラクタマップ
    (application character map) を順に指定します。 例えばフォントとして
    「lat1-16」、アプリケーションキャラクタマップとして 「8859-1」 を指
    定する場合、この変数には 「lat1-16 -m 8859-1」 を設定します。 (これ
    は米国にて適当な設定となります。) UTF-8 モードの場合、カーネルは
    UTF-8 キーマップ内の 8 ビットキーコードを変換するためにアプリケーシ
    ョンキャラクタマップを利用します。 したがって "-m" パラメータには、
    キーマップ内キーコードのエンコーディングを指定する必要があります。

UNICODE

    コンソールを UTF-8 モードにするには、この変数を 「1」、 「yes」、
    「true」 のいずれかに指定します。 UTF-8 ベースのロケールであればこ
    の設定を行います。 そうでないロケールにおいて設定するのは不適切です
    。

LEGACY_CHARSET

    キーボードレイアウトの多くに対して、Kbd パッケージは標準的な
    Unicode キーマップを提供していません。 この変数にて UTF-8 ではない
    キーマップのエンコーディングが指定されていたら console ブートスクリ
    プトは利用可能な UTF-8 キーマップに変換します。

以下はいくつかの設定例です。

 ・ Unicode を用いない設定では、普通は KEYMAP 変数と FONT 変数のみを定
    めます。 例えばポーランド語の設定であれば以下のようになります。

    cat > /etc/sysconfig/console << "EOF"
    # Begin /etc/sysconfig/console

    KEYMAP="pl2"
    FONT="lat2a-16 -m 8859-2"

    # End /etc/sysconfig/console
    EOF

 ・ 上で述べたように、普通のキーマップの設定に対して多少の修正を必要と
    する場合もあります。 以下の例はドイツ語のキーマップにユーロ記号を加
    える例です。

    cat > /etc/sysconfig/console << "EOF"
    # Begin /etc/sysconfig/console

    KEYMAP="de-latin1"
    KEYMAP_CORRECTIONS="euro2"
    FONT="lat0-16 -m 8859-15"

    # End /etc/sysconfig/console
    EOF

 ・ 以下は Unicode を用いたブルガリア語の設定例です。 通常のキーマップ
    が存在しているものと仮定しています。

    cat > /etc/sysconfig/console << "EOF"
    # Begin /etc/sysconfig/console

    UNICODE="1"
    KEYMAP="bg_bds-utf8"
    FONT="LatArCyrHeb-16"

    # End /etc/sysconfig/console
    EOF

 ・ 上の例においては 512 個のグリフを持つ LatArCyrHeb-16 フォントを利用
    しています。 この場合、フレームバッファを利用していなければ Linux
    コンソール上に鮮やかな色づけを行うことは出来なくなります。 フレーム
    バッファがない状態で文字フォントを変更することなく色づけを適切に行
    いたい場合は、以下に示すように 256 個のグリフを持った、この言語に固
    有のフォントを用いる方法もあります。

    cat > /etc/sysconfig/console << "EOF"
    # Begin /etc/sysconfig/console

    UNICODE="1"
    KEYMAP="bg_bds-utf8"
    FONT="cyr-sun16"

    # End /etc/sysconfig/console
    EOF

 ・ 以下の例では ISO-8859-15 から UTF-8 へのキーマップ変換の自動化
    (keymap autoconversion) を指定し、Unicode におけるデッドキー (dead
    keys) を有効にするものです。

    cat > /etc/sysconfig/console << "EOF"
    # Begin /etc/sysconfig/console

    UNICODE="1"
    KEYMAP="de-latin1"
    KEYMAP_CORRECTIONS="euro2"
    LEGACY_CHARSET="iso-8859-15"
    FONT="LatArCyrHeb-16 -m 8859-15"

    # End /etc/sysconfig/console
    EOF

 ・ キーマップにデッドキー (dead keys) を持つものがあります。 そのキー
    自身は文字を意味するものではなく、次のキー入力による文字に対するア
    クセント記号をつける目的のものなどです。 または複合的な入力規則を定
    義するもの、例えば 「Ctrl+.、A、E を入力することで ? を得るもの」
    があります。 Linux-2.6.32.8 ではキーマップに応じてデッドキーや複合
    的な入力規則を解釈します。 ただしこれが正しく動作するのは、元の文字
    がマルチバイトではない場合に限ります。 このような欠点は西欧のキーマ
    ップでは問題にはなりません。 アクセント記号なら、アクセント記号がつ
    いていない ASCII 文字を使ったり、ASCII 文字を二つ使って工夫したりす
    るからです。 しかし UTF-8 モードでは問題になります。 例えばギリシャ
    語にて 「alpha」 の文字の上にアクセント記号を付けたい場合が問題です
    。 これを解決するには、一つには UTF-8 の利用を諦めることであり、も
    う一つは X ウィンドウシステムを使うことで、そのような入力処理の制約
    を解消することです。

 ・ 中国語、日本語、韓国語などを利用する場合 Linux コンソールにはそれら
    の文字を表示できません。 この言語を利用するユーザーは X ウィンドウ
    システムを使ってください。 そこで用いるフォントは、必要となるコード
    範囲の文字を有しており、入力メソッドも用意されています。 (例えば
    SCIM は数多くの言語入力をサポートしています。)

注記

/etc/sysconfig/console ファイルは Linux のテキストコンソール上の言語設
定を行うだけです。 X ウィンドウシステム、SSH セッション、シリアルコンソ
ールでのキーボードレイアウトや端末フォントの設定とは無関係です。 それら
に対しては、上に列記した最後の二項目における制約は適用されません。

日本語訳情報

日本の方であれば 「日本語106キーボード」 をほぼ間違いなくお使いかと思い
ますので KEYMAP 変数には 「jp106」 を設定することになるでしょう。 FONT
変数について訳者は十分な知識がありません。 ここに何を設定すべきか分から
ない (調べていない) ため、何も設定しないでいる状態です。 訳者は LFS シ
ステム構築後は SSH 接続によりシステムアクセスしており、その場合ここでの
フォントの設定がどうであろうと (おそらく) 無関係であるため、あまり気に
せずにいます。 何か情報を頂けるようであればご教示よろしくお願いいたしま
す。

訳者が行っている設定は以下のとおりです。

cat > /etc/sysconfig/console << "EOF"
# Begin /etc/sysconfig/console

KEYMAP="jp106"

# End /etc/sysconfig/console
EOF

7.6. Sysklogd スクリプトの設定

sysklogd スクリプトは syslogd プログラムをパラメータ -m 0 で実行します
。 このオプションは syslogd がデフォルトで 20分おきにログファイルに対し
て周期的にタイムスタンプを書き込む機能を無効にします。 この機能を有効に
したい場合は sysklogd スクリプトを書き換えてください。詳しくは man
syslogd を入力して man ページを参照してください。

7.7. /etc/inputrc ファイルの生成

inputrc ファイルはキーボードに応じたキーボードマップを定めます。 このフ
ァイルは入力に関連するライブラリ Readline が利用するもので、このライブ
ラリは Bash などのシェルから呼び出されます。

ユーザー固有のキーボードマップを必要となるのはまれなので、以下の /etc/
inputrc ファイルによって、ログインユーザーすべてに共通するグローバルな
定義を生成します。 各ユーザーごとにこのデフォルト定義を上書きする必要が
出てきた場合は、ユーザーのホームディレクトリに .inputrc ファイルを生成
して、修正マップを定義することもできます。

inputrc ファイルの設定方法については info bash により表示される
Readline Init File の節に詳しい説明があります。 info readline にも有用
な情報があります。

以下はグローバルな inputrc ファイルの一般的な定義例です。 コメントをつ
けて各オプションを説明しています。 コメントはコマンドと同一行に記述する
ことはできません。 以下のコマンドを実行してこのファイルを生成します。

cat > /etc/inputrc << "EOF"
# Begin /etc/inputrc
# Modified by Chris Lynn <roryo@roryo.dynup.net>

# Allow the command prompt to wrap to the next line
set horizontal-scroll-mode Off

# Enable 8bit input
set meta-flag On
set input-meta On

# Turns off 8th bit stripping
set convert-meta Off

# Keep the 8th bit for display
set output-meta On

# none, visible or audible
set bell-style none

# All of the following map the escape sequence of the value
# contained in the 1st argument to the readline specific functions
"\eOd": backward-word
"\eOc": forward-word

# for linux console
"\e[1~": beginning-of-line
"\e[4~": end-of-line
"\e[5~": beginning-of-history
"\e[6~": end-of-history
"\e[3~": delete-char
"\e[2~": quoted-insert

# for xterm
"\eOH": beginning-of-line
"\eOF": end-of-line

# for Konsole
"\e[H": beginning-of-line
"\e[F": end-of-line

# End /etc/inputrc
EOF

7.8. Bash シェルの初期起動ファイル

シェルプログラムである /bin/bash (これ以降は単に 「シェル」 と表現しま
す) は、初期起動ファイルをいくつも利用して環境設定を行います。 個々のフ
ァイルにはそれぞれに目的があり、ログインや対話環境を様々に制御します。
/etc ディレクトリにあるファイルは一般にグローバルな設定を行います。 こ
れに対応づいたファイルがユーザーのホームディレクトリにある場合は、グロ
ーバルな設定を上書きします。

対話型ログインシェルは /bin/login プログラムを利用して /etc/passwd ファ
イルを読み込み、ログインが成功することで起動します。 同じ対話型でも非ロ
グインシェルの場合は [prompt]$/bin/bash のようなコマンドラインからの入
力を経て起動します。 非対話型のシェルはシェルスクリプト動作中に実行され
ます。 非対話型であるのは、スクリプトの実行の最中にユーザーからの入力を
待つことがないためです。

より詳しい情報は info bash の Bash Startup Files and Interactive Shells
の節を参照してください。

/etc/profile ファイルと ~/.bash_profile ファイルは、対話型のログインシ
ェルとして起動した時に読み込まれます。

本節の終わりに示す /etc/profile ファイルは言語を設定するために必要とな
る環境変数を定義します。 これを設定することによって以下の内容が定められ
ます。

 ・ プログラムの出力結果を指定した言語で得ることができます。

 ・ キャラクタを英字、数字、その他のクラスに分類します。 この設定は、英
    語以外のロケールにおいて、コマンドラインに非アスキー文字が入力され
    た場合に bash が正しく入力を受け付けるために必要となります。

 ・ 各国ごとに正しくアルファベット順が並ぶようにします。

 ・ 適切なデフォルト用紙サイズを設定します。

 ・ 通貨、日付、時刻を正しい書式で出力するように設定します。

以下において <ll> と示しているものは、言語を表す２文字の英字 (例えば 「
en」) に、また <CC> は、国を表す２文字の英字 (例えば 「GB」) にそれぞれ
置き換えてください。 <charmap> は、選択したロケールに対応したキャラクタ
マップ (charmap) に置き換えてください。 オプションの修飾子として 「
@euro」 といった記述もあります。

以下のコマンドを実行すれば Glibc が取り扱うロケールを一覧で見ることがで
きます。

locale -a

キャラクタマップにはエイリアスがいくつもあります。 例えば 「ISO-8859-1
」 は 「iso8859-1」 や 「iso88591」 として記述することもできます。 ただ
しアプリケーションによってはエイリアスを正しく取り扱うことができないも
のがあります。 (「UTF-8」 の場合、「UTF-8」 と書かなければならず、これ
を 「utf8」 としてはならない場合があります。) そこでロケールに対する正
規の名称を選ぶのが最も無難です。 正規の名称は以下のコマンドを実行すれば
分かります。 ここで <locale name> は locale -a コマンドの出力から得られ
たロケールを指定します。 (本書の例では 「en_GB.iso88591」 としています
。)

LC_ALL=<locale name> locale charmap

「en_GB.iso88591」 ロケールの場合、上のコマンドの出力は以下となります。

ISO-8859-1

出力された結果が 「en_GB.ISO-8859-1」 に対するロケール設定として用いる
べきものです。 こうして探し出したロケールは動作確認しておくことが重要で
す。 Bash の起動ファイルに記述するのはその後です。

LC_ALL=<locale name> locale language
LC_ALL=<locale name> locale charmap
LC_ALL=<locale name> locale int_curr_symbol
LC_ALL=<locale name> locale int_prefix

上のコマンドを実行すると、言語名やロケールに応じたキャラクタエンコーデ
ィングが出力されます。 また通貨や各国ごとの国際電話番号プレフィックスも
出力されます。 コマンドを実行した際に以下のようなメッセージが表示された
ら、第6章にてロケールをインストールしていないか、あるいはそのロケールが
Glibc のデフォルトのインストールではサポートされていないかのいずれかで
す。

locale: Cannot set LC_* to default locale: No such file or directory

このエラーが発生したら localedef コマンドを使って、目的とするロケールを
インストールするか、別のロケールを選ぶ必要があります。 これ以降の説明で
は Glibc がこのようなエラーを生成していないことを前提に話を進めます。

LFS には含まれない他のパッケージにて、指定したロケールをサポートしてい
ないものがあります。 例えば X ライブラリ (X ウィンドウシステムの一部)
では、内部ファイルに指定されたキャラクタマップ名に合致しないロケールを
利用した場合に、以下のようなメッセージを出力します。

Warning: locale not supported by Xlib, locale set to C

Xlib ではキャラクタマップはたいてい、英大文字とダッシュ記号を用いて表現
されます。 例えば "iso88591" ではなく "ISO-8859-1" となります。 ロケー
ル設定におけるキャラクタマップ部分を取り除いてみれば、適切なロケール設
定を見出すことができます。 これはまた locale charmap コマンドを使って、
設定を変えてみてロケールを指定してみれば確認できます。 例えば
"de_DE.ISO-8859-15@euro" という設定を "de_DE@euro" に変えてみて Xlib が
そのロケールを認識するかどうか確認してみてください。

これ以外のパッケージでも、パッケージが求めるものとは異なるロケール設定
がなされた場合に、適切に処理されないケースがあります。 (そして必ずしも
エラーメッセージが表示されない場合もあります。) そういったケースでは、
利用している Linux ディストリビューションがどのようにロケール設定をサポ
ートしているかを調べてみると、有用な情報が得られるかもしれません。

適切なロケール設定が決まったら /etc/profile ファイルを生成します。

cat > /etc/profile << "EOF"
# Begin /etc/profile

export LANG=<ll>_<CC>.<charmap><@modifiers>

# End /etc/profile
EOF

ロケール設定の 「C」 (デフォルト) と 「en_US」 (米国の英語利用ユーザー
に推奨) は異なります。 「C」 は US-ASCII 7 ビットキャラクタセットを用い
ます。 もし最上位ビットがセットされたキャラクタがあれば不適当なものとし
て取り扱います。 例えば ls コマンドにおいてクエスチョン記号が表示される
ことがあるのはこのためです。 また Mutt や Pine などにより電子メールが送
信される際に、そういった文字は RFC には適合しないメールとして送信されま
す。 送信された文字は 「不明な 8ビット (unknown 8-bit)」 として示されま
す。 そこで 8ビット文字を必要としない場合には 「C」 ロケールを指定して
ください。

UTF-8 ベースのロケールは多くのプログラムにおいてサポートされていません
。 この問題については http://www.linuxfromscratch.org/blfs/view/svn/
introduction/locale-issues.html にて説明しており、可能なものは解決を図
っていこうとしているところです。

7.9. LFS システムにおけるデバイスとモジュールの扱い

第6章にて Udev パッケージをインストールしました。 このパッケージがどの
ように動作するかの詳細を説明する前に、デバイスを取り扱うかつての方法に
ついて順を追って説明していきます。

Linux システムは一般に、スタティックなデバイス生成方法を採用していまし
た。 この方法では /dev のもとに膨大な量の (場合によっては何千にもおよ
ぶ) デバイスノードが生成されます。 現実に存在するハードウェアデバイスが
存在するかどうかに関わらずです。 これは MAKEDEV スクリプトを通じて生成
されます。 このスクリプトからは mknod プログラムが呼び出されますが、そ
の呼び出しは、この世に存在するありとあらゆるデバイスのメジャー/マイナー
番号を用いて行われます。

Udev による方法では、カーネルが検知したデバイスだけがデバイスノードとな
ります。 デバイスノードはシステムが起動するたびに生成されることになるの
で、 tmpfs ファイルシステム上に保存されます。 (tmpfs は仮想ファイルシス
テムであり、メモリ上に置かれます。) デバイスノードの情報はさほど多くな
いので、消費するメモリ容量は無視できるほど少ないものです。

7.9.1. 開発経緯

2000年2月に新しいファイルシステム devfs がカーネル 2.3.46 に導入され、
2.4系の安定版カーネルにて利用できるようになりました。 このファイルシス
テムはカーネルのソース内に含まれ実現されていましたが、デバイスを動的に
生成するこの手法は、主要なカーネル開発者の十分な支援は得られませんでし
た。

devfs が採用した手法で問題になるのは、主にデバイスの検出・生成・命名の
方法です。 特にデバイスの命名方法がおそらく最も重大な問題です。 一般的
に言えることとして、デバイス名が変更可能であるならデバイス命名の規則は
システム管理者が考えることであって、特定の開発者に委ねるべきことではあ
りません。 また devfs にはその設計に起因した競合の問題があるため、根本
的にカーネルを修正しなければ解消できる問題ではありません。 そこで長い間
、保守されることがなかったために非推奨 (deprecated) として位置づけられ
、最終的に 2006年6月にはカーネルから取り除かれました。

開発版の 2.5 系カーネルと、後にリリースされた安定版のカーネル 2.6 系を
経て、新しい仮想ファイルシステム sysfs が登場しました。 sysfs が実現し
たのは、システムのハードウェア設定をユーザー空間のプロセスとして表に出
したことです。 ユーザー空間での設定を可視化したことによって devfs が為
していたことを、ユーザー空間にて現実に見ることが可能になったわけです。

7.9.2. Udev の実装

7.9.2.1. Sysfs ファイルシステム

sysfs ファイルシステムについては上で簡単に触れました。 sysfs はどのよう
にしてシステム上に存在するデバイスを知るのか、そしてどのデバイス番号が
利用されるのか。 そこが知りたいところです。 カーネルに直接組み込まれて
構築されたドライバでは、対象のオブジェクトがカーネルによって検出された
ものとしてそのオブジェクトを sysfs に登録します。 モジュールとしてコン
パイルされたドライバでは、その登録がモジュールのロード時に行われます。
sysfs ファイルシステムが (/sys に) マウントされると、組み込みのドライバ
によって sysfs に登録されたデータは、ユーザー空間のプロセスとデバイスノ
ード生成を行う udevd にて利用可能となります。

7.9.2.2. Udev ブートスクリプト

初期起動スクリプト S10udev は、Linux のブート時にデバイスノード生成を受
け持ちます。 このスクリプトは /sbin/hotplug のデフォルトから uevent ハ
ンドラを取り除きます。 この時点でカーネルは、他の実行モジュールを呼び出
す必要がないからです。 そのかわりに、カーネルが起動する uevent をネット
リンクソケット (netlink socket) 上で待ち受けます。 そしてブートスクリプ
トが /lib/udev/devices 内にある静的なデバイスノードをすべて /dev にコピ
ーします。 デバイスやディレクトリ、シンボリックリンクがこの時点で利用可
能になっていないと、システム起動の初期段階において動的デバイスを扱う処
理が動作しないためです。 あるいは udevd 自身がそれを必要とするからでも
あります。 /lib/udev/devices 内に静的なデバイスノードを生成することで、
動的デバイスを取り扱うことができないデバイスも動作させることができます
。 こうしてブートスクリプトは Udev デーモン、つまり udevd を起動し、そ
れがどのような uevent であっても対応できるものとなります。 最後にブート
スクリプトはカーネルに対して、すべてのデバイスにおいて既に登録されてい
る uevent を再起動させ、 udevd がそれを待ち受けるものとなります。

7.9.2.3. デバイスノードの生成

Udev はデバイスのメジャー番号、マイナー番号を認識するために /sys ディレ
クトリ内の sysfs の情報を参照します。 例えば /sys/class/tty/vcs/dev に
は 「7:0」 という文字があります。 この文字は udevd が利用するもので、メ
ジャー番号が 7、マイナー番号が 0 のデバイスノードを生成します。 /dev デ
ィレクトリ配下に生成されるノードの名称とパーミッションは、 /etc/udev/
rules.d/ ディレクトリにある各種ファイルが指定する規則に従って決まります
。 それらのファイルは番号付けがされています。 LFS-ブートスクリプトパッ
ケージにおける方法に似ています。 Udev がデバイスを生成しようとしてその
生成規則が見つけられなかった場合は、デフォルトのパーミッションは 660、
デフォルトの所有者は root:root となります。 Udev におけるデバイス生成規
則を設定するファイルについて、その文法を示したドキュメントが /usr/share
/doc/udev-151/writing_udev_rules/index.html にあります。

7.9.2.4. モジュールのロード

モジュールとしてコンパイルされたデバイスドライバの場合、デバイス名の別
名が作り出されています。 その別名は modinfo プログラムを使えば確認する
ことができます。 そしてこの別名は、モジュールがサポートするバス固有の識
別子に関連づけられます。 例えば snd-fm801 ドライバは、ベンダーID 0x1319
とデバイスID 0x0801 の PCI ドライバをサポートします。 そして 「
pci:v00001319d00000801sv*sd*bc04sc01i*」 というエイリアスがあります。
たいていのデバイスでは、sysfs を通じてドライバがデバイスを扱うものであ
り、ドライバのエイリアスをバスドライバが提供します。 /sys/bus/pci/
devices/0000:00:0d.0/modalias ファイルならば 「
pci:v00001319d00000801sv00001319sd00001319bc04sc01i00」 という文字列を
含んでいるはずです。 Udev が提供するデフォルトの生成規則によって udevd
から /sbin/modprobe が呼び出されることになり、その際には uevent に関す
る環境変数 MODALIAS の設定内容が利用されます。 (この環境変数の内容は
sysfs 内の modalias ファイルの内容と同じはずです。) そしてワイルドカー
ドが指定されているならそれが展開された上で、エイリアス文字列に合致する
モジュールがすべてロードされることになります。

上の例で forte ドライバがあったとすると、snd-fm801 の他にそれもロードさ
れてしまいます。 これは古いものでありロードされて欲しくないものです。
不要なドライバのロードを防ぐ方法については後述しているので参照してくだ
さい。

カーネルは、ネットワークプロトコル、ファイルシステム、NLS サポートとい
った各種モジュールも、要求に応じてロードすることもできます。

7.9.2.5. ホットプラグ可能な/ダイナミックなデバイスの扱い

USB (Universal Serial Bus) で MP3 プレイヤーを接続しているような場合、
カーネルは現在そのデバイスが接続されているということを認識しており、
uevent が生成済の状態にあります。 その uevent は上で述べたように udevd
が取り扱うことになります。

7.9.3. モジュールロードとデバイス生成の問題

自動的にデバイスが生成される際には、いくつか問題が発生します。

7.9.3.1. カーネルモジュールが自動的にロードされない問題

Udev がモジュールをロードできるためには、バス固有のエイリアスがあって、
バスドライバが sysfs に対して適切なエイリアスを提供していることが必要で
す。 そうでない場合は、別の手段を通じてモジュールのロードを仕組まなけれ
ばなりません。 Linux-2.6.32.8 においての Udev は、 INPUT、IDE、PCI、USB
、SCSI、SERIO、FireWire の各デバイスに対するドライバをロードします。 そ
れらのデバイスドライバが適切に構築されているからです。

目的のデバイスドライバが Udev に対応しているかどうかは、 modinfo コマン
ドに引数としてモジュール名を与えて実行します。 /sys/bus ディレクトリ配
下にあるそのデバイス用のディレクトリを見つけ出して、 modalias ファイル
が存在しているかどうかを見ることで分かります。

sysfs に modalias ファイルが存在しているなら、そのドライバはデバイスを
サポートし、デバイスとの直接のやり取りが可能であることを表します。 ただ
しエイリアスを持っていなければ、それはドライバのバグです。 その場合は
Udev に頼ることなくドライバをロードするしかありません。 そしてそのバグ
が解消されるのを待つしかありません。

/sys/bus ディレクトリ配下の対応するディレクトリ内に modalias ファイルが
なかったら、これはカーネル開発者がそのバス形式に対する modalias のサポ
ートをまだ行っていないことを意味します。 Linux-2.6.32.8 では ISA バスが
これに該当します。 最新のカーネルにて解消されることを願うしかありません
。

Udev は snd-pcm-oss のような 「ラッパー (wrapper)」 ドライバや loop の
ような、現実のハードウェアに対するものではないドライバは、ロードするこ
とができません。

7.9.3.2. カーネルモジュールが自動的にロードされず Udev もロードしようと
しない問題

「ラッパー (wrapper)」 モジュールが単に他のモジュールの機能を拡張するだ
けのものであるなら (例えば snd-pcm-oss は snd-pcm の機能拡張を行うもの
で、 OSS アプリケーションに対してサウンドカードを利用可能なものにするだ
けのものであるため) modprobe の設定によってラッパーモジュールを先にロー
ドし、その後でラップされるモジュールがロードされるようにします。 これは
以下のように /etc/modprobe.d/<filename>.conf ファイル内にて 「install」
の記述行を加えることで実現します。

install snd-pcm /sbin/modprobe -i snd-pcm ; \
    /sbin/modprobe snd-pcm-oss ; true

問題のモジュールがラッパーモジュールではなく、単独で利用できるものであ
れば、 S05modules ブートスクリプトを編集して、システム起動時にこのモジ
ュールがロードされるようにします。 これは /etc/sysconfig/modules ファイ
ルにて、そのモジュール名を単独の行に記述することで実現します。 この方法
はラッパーモジュールに対しても動作しますが、この場合は次善策となります
。

7.9.3.3. Udev が不必要なモジュールをロードする問題

不必要なモジュールはこれをビルドしないことにするか、あるいは /etc/
modprobe.d/blacklist.conf ファイルにブラックリスト (blacklist) として登
録してください。 例えば forte モジュールをブラックリストに登録するには
以下のようにします。

blacklist forte

ブラックリストに登録されたモジュールは modprobe コマンドを使えば手動で
ロードすることもできます。

7.9.3.4. Udev が不正なデバイスを生成する、または誤ったシンボリックリン
クを生成する問題

デバイス生成規則が意図したデバイスに合致していないと、この状況が往々に
して起こります。 例えば生成規則の記述が不十分であった場合、SCSI ディス
ク (本来望んでいるデバイス) と、それに対応づいたものとしてベンダーが提
供する SCSI ジェネリックデバイス (これは誤ったデバイス) の両方に生成規
則が合致してしまいます。 記述されている生成規則を探し出して正確に記述し
てください。 その際には udevadm info コマンドを使って情報を確認してくだ
さい。

7.9.3.5. Udev 規則が不審な動きをする問題

この問題は、一つ前に示したものが別の症状となって現れたものかもしれませ
ん。 そのような理由でなく、生成規則が正しく sysfs の属性を利用している
のであれば、それはカーネルの処理タイミングに関わる問題であって、カーネ
ルを修正すべきものです。 今の時点では、該当する sysfs の属性の利用を待
ち受けるような生成規則を生成し、 /etc/udev/rules.d/
10-wait_for_sysfs.rules ファイルにそれを追加することで対処できます。 (/
etc/udev/rules.d/10-wait_for_sysfs.rules ファイルがなければ新規に生成し
ます。) もしこれを実施してうまくいった場合は LFS 開発メーリングリストに
お知らせください。

7.9.3.6. Udev がデバイスを生成しない問題

ここでは以下のことを前提としています。 まずドライバがカーネル内に静的に
組み入れられて構築されているか、あるいは既にモジュールとしてロードされ
ていること。 そして Udev が異なった名前のデバイスを生成していないことで
す。

Udev がデバイスノード生成のために必要となる情報を知るためには、カーネル
ドライバが sysfs に対して属性データを提供していなければなりません。 こ
れはカーネルツリーの外に配置されるサードパーティ製のドライバであれば当
たり前のことです。 したがって /lib/udev/devices において、適切なメジャ
ー・マイナー番号を用いた静的なデバイスノードを生成してください。 (カー
ネルのドキュメント devices.txt またはサードパーティベンダーが提供するド
キュメントを参照してください。) この静的デバイスノードは、S10udev ブー
トスクリプトによって /dev にコピーされます。

7.9.3.7. 再起動後にデバイスの命名順がランダムに変わってしまう問題

これは Udev の設計仕様に従って発生するもので、uevent の扱いとモジュール
のロードが平行して行われるためです。 このために命名順が予期できないもの
になります。 これを 「固定的に」 することはできません。 ですからカーネ
ルがデバイス名を固定的に定めるようなことを求めるのではなく、シンボリッ
クリンクを用いた独自の生成規則を作り出して、そのデバイスの固定的な属性
を用いた固定的な名前を用いる方法を取ります。 固定的な属性とは例えば、
Udev によってインストールされる様々な *_id という名のユーティリティが出
力するシリアル番号などです。 設定例については 7.10. 「デバイスへのシン
ボリックリンクの生成」 や 7.13. 「ネットワークスクリプトの設定」 を参照
してください。

7.9.4. 参考情報

さらに参考になるドキュメントが以下のサイトにあります：

 ・ devfs のユーザー空間での実装方法 http://www.kroah.com/linux/talks/
    ols_2003_udev_paper/Reprint-Kroah-Hartman-OLS2003.pdf

 ・ sysfs ファイルシステム http://www.kernel.org/pub/linux/kernel/
    people/mochel/doc/papers/ols-2005/mochel.pdf

 ・ より詳細なドキュメントへのリンク http://www.kernel.org/pub/linux/
    utils/kernel/hotplug/udev.html

7.10. デバイスへのシンボリックリンクの生成

7.10.1. CD-ROM のシンボリックリンク

後にインストールしていくソフトウェア (例えばメディアプレーヤーなど) で
は、/dev/cdrom や /dev/dvd といったシンボリックリンクを必要とするものが
あります。 これらはそれぞれ CD-ROM、DVD-ROM を指し示しています。 こうい
ったシンボリックリンクは /etc/fstab ファイルに設定しておくのが便利です
。 Udev が提供するスクリプトファイルで、ルールファイル (rules files) を
生成するものがあります。 そのルールファイルは、各デバイスの性能に応じて
シンボリックファイルを構成します。 もっともこのスクリプトファイルを利用
する際には、二つ存在する動作モードのいずれを用いるかを決めなければなり
ません。

一つは 「パス (by-path)」 モードです。 これは USB デバイスやファームウ
ェアデバイスに対してデフォルトで利用されます。 これによって作り出される
ルールは CD や DVD デバイスに対して物理パスが用いられます。 二つめは 「
ID (by-id)」 モードです。 デフォルトで IDE や SCSI デバイスに利用されま
す。 このモードで作り出されるルールは CD や DVD デバイス自身が持つ識別
文字列が用いられます。 パスは Udev の path_id スクリプトによって決定し
ます。 一方、識別文字列は ata_id プログラムまたは scsi_id プログラムに
よってハードウェアから読み出されます。 ata_id、 scsi_id のいずれである
かは、そのデバイスによって決まります。

二つの方法にはそれぞれに利点があります。 どちらの方法が適切であるかは、
デバイスがどのように変更されるかによります。 デバイスに対する物理パス
(そのデバイスが接続しているポートやスロット) を変更したい場合、例えば
IDE ポートや USB コネクタを切り替えたいような場合、 「ID (by-id)」 モー
ドを使うべきです。 一方、デバイスの識別文字列を変えたい場合、つまりデバ
イスが故障したために、同等の性能の新しいデバイスを同一コネクタに接続し
ようとする場合は、 「パス (by-path)」 モードを使うべきです。

いずれの変更の可能性もあるならば、より変更の可能性の高いケースに従って
モードを選ぶべきです。

重要項目

外部接続のデバイス (例えば USB 接続の CD ドライブなど) はパス (by-path)
モードを用いるべきではありません。 そのようなデバイスは接続するたびに外
部ポートが新しくなり、物理パスが変わってしまうためです。 こういった外部
接続のデバイスを物理パスで認識させ Udev ルールを構成した場合は、あらゆ
るデバイスがこの問題を抱えることになります。 これは CD や DVD ドライブ
だけに限った話ではありません。

Udev スクリプトが利用しているキーの値を確認したい場合は /sys ディレクト
リ配下を確認します。 例えば CD-ROM デバイスについては /sys/block/hdd を
確認します。 そして以下のようなコマンドを実行します。

udevadm test /sys/block/hdd

出力結果には *_id というプログラム名を示した行がたくさん表示されます。
「ID (by-id)」 モードは ID_SERIAL 値が存在して空でなければこれを利用し
ます。 そうでない時は ID_MODEL と ID_REVISION を利用します。 「パス
(by-path)」 モードは ID_PATH の値を利用します。

デフォルトモードが利用状況に合わない場合は、 /lib/udev/rules.d/
75-cd-aliases-generator.rules ファイルに対して以下のように修正を行いま
す。 mode の部分は 「by-id」 か 「by-path」 に置き換えます。

sed -i -e 's/write_cd_rules/& mode/' \
    /lib/udev/rules.d/75-cd-aliases-generator.rules

ここでルールファイルやシンボリックリンクを作成する必要はありません。 こ
の時点ではホストの /dev ディレクトリに対して LFS システムに向けてのバイ
ンドマウント (bind-mounted) を行っており、ホスト上にシンボリックリンク
が存在していると仮定しているからです。 ルールファイルとシンボリックリン
クは LFS システムを初めてブートした時に生成されます。

もっとも CD-ROM デバイスが複数あると、ブート時に生成されるシンボリック
リンクが、ホスト利用時に指し示されていたものとは異なる場合が発生します
。 デバイスの検出順は予測できないものだからです。 LFS システムを初めて
起動した時の割り当ては、たぶん固定的に行われるはずです。 つまりこのこと
は、ホストシステムと LFS システムの双方で、シンボリックリンクが同じデバ
イスを指し示すことが必要である場合にのみ問題となります。 これが必要であ
るなら、生成されている /etc/udev/rules.d/70-persistent-cd.rules ファイ
ルを起動後に調査して (おそらくは編集して) 割り当てられたシンボリックリ
ンクが望むものになっているかどうかを確認してください。

7.10.2. 重複するデバイスの取り扱い方

7.9. 「LFS システムにおけるデバイスとモジュールの扱い」 で説明したよう
に、 /dev 内に同一機能を有するデバイスがあったとすると、その検出順は本
質的にランダムです。 例えば USB 接続のウェブカメラと TV チューナーがあ
ったとして、 /dev/video0 がウェブカメラを、また /dev/video1 がチューナ
ーをそれぞれ参照していたとしても、システム起動後はその順が逆になること
があります。 サウンドカードやネットワークカードを除いた他のハードウェア
であれば、 Udev ルールを適切に記述することで、固定的なシンボリックリン
クを作り出すことができます。 ネットワークカードについては、別途 7.13.
「ネットワークスクリプトの設定」 にて説明しています。 またサウンドカー
ドの設定方法は BLFS にて説明しています。

利用しているデバイスに上の問題の可能性がある場合 (お使いの Linux ディス
トリビューションではそのような問題がなかったとしても) /sys/class ディレ
クトリや /sys/block ディレクトリ配下にある対応ディレクトリを探してくだ
さい。 ビデオデバイスであれば /sys/class/video4linux/videoX といったデ
ィレクトリです。 そしてそのデバイスを一意に特定する識別情報を確認してく
ださい。 (通常はベンダー名、プロダクトID、シリアル番号などです。)

udevadm info -a -p /sys/class/video4linux/video0

シンボリックリンクを生成するルールを作ります。

cat > /etc/udev/rules.d/83-duplicate_devs.rules << "EOF"

# Persistent symlinks for webcam and tuner
KERNEL=="video*", ATTRS{idProduct}=="1910", ATTRS{idVendor}=="0d81", \
    SYMLINK+="webcam"
KERNEL=="video*", ATTRS{device}=="0x036f", ATTRS{vendor}=="0x109e", \
    SYMLINK+="tvtuner"

EOF

こうしたとしても /dev/video0 と /dev/video1 はチューナーとウェブカメラ
のいずれかをランダムに指し示すことに変わりありません。 (したがって直接
このデバイス名を使ってはなりません。) しかしシンボリックリンク /dev/
tvtuner と /dev/webcam は常に正しいデバイスを指し示すようになります。

7.11. localnet スクリプトの設定

localnet スクリプトの行う作業の１つが、システムのホスト名を定めることで
す。 この設定は /etc/sysconfig/network ファイルにて行います。

以下のコマンドにより /etc/sysconfig/network ファイルを生成しホスト名を
定めます。

echo "HOSTNAME=<lfs>" > /etc/sysconfig/network

<lfs> の部分はコンピュータに与える名称に置き換えてください。 ここには完
全修飾ドメイン名 (Fully Qualified Domain Name; FQDN) を記述しないでくだ
さい。 それは次節に示す /etc/hosts ファイルにて設定します。

7.12. /etc/hosts ファイルの設定

ネットワークカードの準備ができたら完全修飾ドメイン名 (fully-qualified
domain name; FQDN) とそのエイリアス名を決定して /etc/hosts ファイルに記
述します。 記述書式は以下のとおりです。

IP_address myhost.example.org aliases

インターネットに公開されていないコンピュータである場合 (つまり登録ドメ
インであったり、あらかじめ IP アドレスが割り当てられていたりする場合。
普通のユーザーはこれを持ちません。) IP アドレスはプライベートネットワー
ク IP アドレスの範囲で指定します。 以下がそのアドレス範囲です。

Private Network Address Range      Normal Prefix
10.0.0.1 - 10.255.255.254           8
172.x.0.1 - 172.x.255.254           16
192.168.y.1 - 192.168.y.254         24

x は 16 から 31、y は 0 から 255 の範囲の数値です。

IP アドレスの例は 192.168.11.1 となります。 また FQDN の例としては
lfs.example.org となります。

ネットワークカードを用いない場合でも FQDN の記述は行ってください。 特定
のプログラムが動作する際に必要となることがあるからです。

以下のようにして /etc/hosts ファイルを生成します。

cat > /etc/hosts << "EOF"
# Begin /etc/hosts (network card version)

127.0.0.1 localhost
<192.168.1.1> <HOSTNAME.example.org> [alias1] [alias2 ...]

# End /etc/hosts (network card version)
EOF

<192.168.1.1> や <HOSTNAME.example.org> の部分は利用状況に応じて書き換
えてください。 (ネットワーク管理者から IP アドレスを指定されている場合
や、既存のネットワーク環境に接続する場合など。) エイリアスの記述 (
alias1, alias2 ) は省略しても構いません。

ネットワークカードを設定しない場合は、以下のようにして /etc/hosts ファ
イルを生成します。

cat > /etc/hosts << "EOF"
# Begin /etc/hosts (no network card version)

127.0.0.1 <HOSTNAME.example.org> <HOSTNAME> localhost

# End /etc/hosts (no network card version)
EOF

7.13. ネットワークスクリプトの設定

本節はネットワークカードを設定する場合にのみ作業を行っていきます。

ネットワークカードを利用しない場合は、ネットワークカードに関連する設定
ファイルを生成する必要はありません。 その場合は、ランレベルに対するすべ
てのディレクトリ (/etc/rc.d/rc*.d) から network シンボリックリンクを削
除してください。

7.13.1. ネットワークインターフェースに対する固定名称の作成

Udev やモジュラー化されたネットワークドライバにおいて、ネットワークイン
ターフェースの番号の割振りは再起動により変更されます。 ドライバモジュー
ルの読み込みが並列で行われるためランダムになるからです。 例えば Intel
製と Realtek 製の二つのネットワークカードを持つコンピュータにおいて、
Intel 製が eth0、 Realtek 製が eth1 となったとします。 しかし時にはシス
テムの再起動によって番号割り振りが逆転することもあります。 これを避ける
には Udev ルールを生成して、ネットワークカードの MAC アドレスに基づいて
固定的に名称を定める方法があります。

ブートを繰り返しても特定のデバイスには同一の名前が割り当たるようなルー
ル記述を試しに生成します。 まずは以下を実行します。

for NIC in /sys/class/net/* ; do
    INTERFACE=${NIC##*/} udevadm test --action=add $NIC
done

そして /etc/udev/rules.d/70-persistent-net.rules ファイルを見て、どのネ
ットワークデバイスにどんな名前が割り当てられているかを確認します。

cat /etc/udev/rules.d/70-persistent-net.rules

このファイルの先頭にはコメントが数行あり、続いてそれぞれの NIC に対する
行があります。 NIC ごとの記述では一行めがコメントで、そのハードウェア
ID が記されています。 (PCI カードである場合、PCI ベンダとデバイス ID が
記述されます。) またドライバが検出できている場合には、カッコ書きでドラ
イバ名も示されます。 ハードウェア ID もドライバ名も、インターフェースに
対して与えられる名称とは無関係で、単に分かりやすくするために記されてい
るにすぎません。 二行めは Udev ルールであり、その NIC を定め、名称を割
り当てている記述です。

Udev ルールはいくつかのキー項目で構成され、それぞれがカンマで区切られる
か、場合によっては空白文字で区切られています。 このキー項目とその内容は
以下のようになります。

 ・ SUBSYSTEM=="net" - ネットワークカードではないデバイスは無視すること
    を指示します。

 ・ ACTION=="add" - uevent の add イベントではないものは無視することを
    指示します。 (uevent の "remove" イベントや "change" イベントも発生
    しますが、これらはネットワークインターフェースの名前を変更するもの
    ではありません。)

 ・ DRIVERS=="?*" - Udev に対して VLAN やブリッジサブインターフェース
    (bridge sub-interfaces) を無視することを指示します。 (サブインター
    フェースにはドライバがないためです。) サブインターフェースに名前が
    割り当てられたとすると、親デバイスの名前と衝突してしまうため、サブ
    インターフェースの名前割り当てはスキップされます。

 ・ ATTR{address} - このキーの値は NIC の MAC アドレスを表します。

 ・ ATTR{type}=="1" - 特定のワイヤレスドライバでは複数の仮想インターフ
    ェースが生成されますが、そのうちの主となるインターフェースにのみル
    ールが合致するようにします。 二つめ以降のインターフェースに対する処
    理は、VLAN やブリッジサブインターフェースがスキップされるのと同じく
    スキップされます。 名前割り当てが行われてしまうと名前衝突を起こすた
    めです。

 ・ KERNEL=="eth*" - 複数のネットワークインターフェースを有するマシンを
    取り扱うためのルールを加えます。 このルールでは全インターフェースに
    同一の MAC アドレスが用いられます。 (PS3 などがそういったマシンにな
    ります。) 各インターフェースに対して個別の命名が行われたとすると
    Udev はそれぞれを別のものとして取り扱います。 これはたいていの
    Linux From Scratch ユーザーにとって必要ありません。 ただそうなった
    としても問題はありません。

 ・ NAME - Udev がインターフェースに対して割り当てる名前をキーの値とし
    て指定します。

NAME に定義される値が重要です。 どのネットワークカードにどんな名前が割
り当てられているかをよく確認してください。 そして以下において設定ファイ
ルを生成する際には NAME に定義されている名称を利用してください。

7.13.2. ネットワークインターフェースに対する設定ファイルの生成

どのネットワークインターフェースを起動させるかは /etc/sysconfig/
network-devices ディレクトリ配下のネットワークスクリプトにより設定しま
す。 そのディレクトリには、設定を行ないたい各ネットワークインターフェー
スに対するサブディレクトリを準備します。 例えばネットワークインターフェ
ースの名が 「xyz」 である場合 ifconfig.xyz というサブディレクトリとしま
す。 このサブディレクトリ内にはネットワークインターフェースの属性、つま
り IP アドレスやサブネットマスクなどを定義したファイルを置きます。

以下のコマンドは、例として eth0 デバイスに対しての ipv4 ファイルを生成
するものです。

cd /etc/sysconfig/network-devices
mkdir -v ifconfig.eth0
cat > ifconfig.eth0/ipv4 << "EOF"
ONBOOT=yes
SERVICE=ipv4-static
IP=192.168.1.1
GATEWAY=192.168.1.2
PREFIX=24
BROADCAST=192.168.1.255
EOF

各変数の値は各ファイルごとに適切なものに設定してください。 ONBOOT 変数
を 「yes」 に設定している場合、システム起動時にネットワークスクリプトが
実行され、ネットワークインターフェースカード (network interface card;
NIC) を有効にします。 「yes」 以外に設定している場合、ネットワークスク
リプトは NIC に対して何も行わないため NIC は有効にはなりません。

SERVICE 変数はIP アドレスの取得方法を指定します。 LFS-ブートスクリプト
は IP アドレス割り当て方法をモジュール化しています。 そして /etc/
sysconfig/network-devices/services ディレクトリに追加でファイルを生成す
れば、他の IP アドレス割り当て方法をとることもできます。 通常は DHCP
(Dynamic Host Configuration Protocol) において利用されるものです。 これ
については BLFS ブックにて説明しています。

GATEWAY 変数は、デフォルトゲートウェイが存在するならその IP アドレスを
指定します。 存在しない場合は、の変数設定を行っている一行をコメントにし
ます。

PREFIX 変数はサブネットマスクにて用いられるビット数を指定します。 IP ア
ドレスの各オクテット (octet) は 8 ビットで構成されます。 例えばサブネッ
トマスクが 255.255.255.0 である場合、ネットワーク番号 (network number)
を特定するには最初の三つのオクテット (24ビット) が用いられることを意味
します。 もし 255.255.255.240 であるなら、最初の 28 ビットということに
なります。 24 ビットを超えるプレフィックスは、通常は DSL やケーブルを用
いたインターネットサービスプロバイダー (Internet Service Provider; ISP)
がよく利用しています。 上の例 (PREFIX=24) では、サブネットマスクは
255.255.255.0 となります。 PREFIX 変数の値は、ネットワーク環境に応じて
変更してください。

7.13.3. /etc/resolv.conf ファイルの生成

インターネットへの接続を行う場合には、ドメイン名サービス (domain name
service; DNS) による名前解決を必要とします。 これによりインターネットド
メイン名を IP アドレスに、あるいはその逆の変換を行います。 これを行うに
は ISP やネットワーク管理者が指定する DNS サーバーの割り振り IP アドレ
スを /etc/resolv.conf ファイルに設定します。 以下のコマンドによりこのフ
ァイルを生成します。

cat > /etc/resolv.conf << "EOF"
# Begin /etc/resolv.conf

domain <Your Domain Name>
nameserver <IP address of your primary nameserver>
nameserver <IP address of your secondary nameserver>

# End /etc/resolv.conf
EOF

<IP address of the nameserver> (ネームサーバーの IP アドレス) の部分に
は、 DNS が割り振る適切な IP アドレスを記述します。 IP アドレスの設定は
複数行う場合もあります。 (代替構成を必要とするなら二次サーバーを設ける
ことでしょう。) 一つのサーバーのみで十分な場合は、二つめの nameserver
の行は削除します。 ローカルネットワークにおいてはルーターの IP アドレス
を設定することになるでしょう。

第8章 LFS システムのブート設定

8.1. はじめに

ここからは LFS システムをブート可能にしていきます。 この章では fstab フ
ァイルを作成し、LFS システムのカーネルを構築します。 また GRUB のブート
ローダをインストールして LFS システムの起動時にブートローダを選択できる
ようにします。

8.2. /etc/fstab ファイルの生成

/etc/fstab ファイルは、種々のプログラムがファイルシステムのマウント状況
を確認するために利用するファイルです。 ファイルシステムがデフォルトでど
こにマウントされ、それがどういう順序であるか、マウント前に (整合性エラ
ーなどの) チェックを行うかどうか、という設定が行われます。 新しいファイ
ルシステムに対する設定は以下のようにして生成します。

cat > /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
proc           /proc        proc   defaults        0     0
sysfs          /sys         sysfs  defaults        0     0
devpts         /dev/pts     devpts gid=4,mode=620  0     0
tmpfs          /dev/shm     tmpfs  defaults        0     0
# End /etc/fstab
EOF

<xxx>、 <yyy>、 <fff> の部分はシステムに合わせて正しい記述に書き換えて
ください。 例えば hda2、 hda5、 ext3 といったものです。 上のファイルの6
行分の記述内容の詳細は man 5 fstab により確認してください。

マウントポイント /dev/shm は tmpfs ファイルシステムを指し示すもので
POSIX 共有メモリ (POSIX-shared memory) を利用するためのものです。 この
共有メモリを正しく動作させるためには、これをサポートする機能をカーネル
に組み入れておく必要があります。 (詳しくは次節にて説明します。) POSIX
共有ライブラリを利用するソフトウェアは、今のところは非常に少ないことを
覚えておいてください。 したがってマウントポイント /dev/shm は設定しなく
ても構いません。 詳細については、カーネルのソース内にある Documentation
/filesystems/tmpfs.txt を参照してください。

MS-DOS や Windows において利用されるファイルシステム (例えば vfat、ntfs
、smbfs、cifs、iso9660、udf) では、ファイル名称内に用いられた非アスキー
文字を正しく認識させるために、マウントオプションとして 「iocharset」 を
指定することが必要となります。 オプションに設定する値は利用するロケール
とすることが必要で、カーネルが理解できる形でなければなりません。 またこ
れを動作させるために、対応するキャラクタセット定義 (File systems ->
Native Language Support にあります) をカーネルに組み入れるか、モジュー
ルとしてビルドすることが必要です。 vfat や smbfs ファイルシステムを用い
るなら、さらに 「codepage」 オプションも必要です。 このオプションには、
国情報に基づいて MS-DOS にて用いられるコードページ番号をセットします。
例えば USB フラッシュドライブをマウントし ru_RU.KOI8-R をセットするユー
ザーであれば /etc/fstab ファイルの設定は以下のようになります。

noauto,user,quiet,showexec,iocharset=koi8r,codepage=866

ru_RU.UTF-8 をセットするなら以下のように変わります。

noauto,user,quiet,showexec,iocharset=utf8,codepage=866

注記

後者の設定では、カーネルが以下のようなメッセージを出力します。

FAT: utf8 is not a recommended IO charset for FAT filesystems,
    filesystem will be case sensitive!

否定的な設定を勧めるメッセージですが、これは無視して構いません。 「
iocharset」 オプションに他の設定を行ったとしても UTF-8 ロケールでは結局
はファイル名の表示を正しく処理できないためです。

ファイルシステムによっては codepage と iocharset のデフォルト値をカーネ
ルにおいて設定することもできます。 カーネルにおいて対応する設定は 「
Default NLS Option」 (CONFIG_NLS_DEFAULT)、 「Default Remote NLS Option
」 (CONFIG_SMB_NLS_DEFAULT)、 「Default codepage for FAT」
(CONFIG_FAT_DEFAULT_CODEPAGE)、 「Default iocharset for FAT」
(CONFIG_FAT_DEFAULT_IOCHARSET) です。 なお ntfs ファイルシステムに対し
ては、カーネルのコンパイル時に設定する項目はありません。

特定のハードディスクにおいて ext3 ファイルシステムでの電源供給不足時の
信頼性を向上させることができます。 これは /etc/fstab での定義においてマ
ウントオプション barrier=1 を指定します。 ハードディスクがこのオプショ
ンをサポートしているかどうかは hdparm を実行することで確認できます。 例
えば以下のコマンドを実行します。

hdparm -I /dev/sda | grep NCQ

何かが出力されたら、このオプションがサポートされていることを意味します
。

論理ボリュームマネージャ (Logical Volume Management; LVM) に基づいたパ
ーティションでは barrier オプションは利用できません。

8.3. Linux-2.6.32.8

Linux パッケージは Linux カーネルを提供します。

概算ビルド時間: 1.5 - 5.0 SBU
必要ディスク容量: 450 - 500 MB

8.3.1. カーネルのインストール

カーネルの構築は、カーネルの設定・コンパイル・インストールの順に行って
いきます。 本書が行っているカーネル設定の方法以外については、カーネルソ
ースツリー内にある README ファイルを参照してください。

コンパイルするための準備として以下のコマンドを実行します。

make mrproper

これによりカーネルソースが完全にクリーンなものになります。 カーネル開発
チームは、カーネルコンパイルするなら、そのたびにこれを実行することを推
奨しています。 tar コマンドにより伸張しただけのソースではクリーンなもの
にはなりません。

メニュー形式のインターフェースによりカーネルを設定します。 カーネルの設
定方法に関する一般的な情報が http://www.linuxfromscratch.org/hints/
downloads/files/kernel-configuration.txt にあるので参照してください。
BLFS では LFS が取り扱わない各種パッケージに対して、必要となるカーネル
設定項目を説明しています。 http://www.linuxfromscratch.org/blfs/view/
svn/longindex.html#kernel-config-index を参照してください。

make LANG=<host_LANG_value> LC_ALL= menuconfig

make パラメータの意味：

LANG=<host_LANG_value> LC_ALL=

    これはホストのロケール設定を指示するものです。 この設定は UTF-8 で
    の表示設定がされたテキストコンソールにて、 menuconfig の ncurses に
    よる行表示を適切に行うために必要となります。

    <host_LANG_value> の部分は、ホストの $LANG 変数の値に置き換えてくだ
    さい。 ホストにてその値が設定されていない場合は $LC_ALL あるいは
    $LC_CTYPE の値を設定してください。

上のコマンドではなく、状況によっては make oldconfig を実行することが適
当な場合もあります。 詳細についてはカーネルソース内の README ファイルを
参照してください。

カーネル設定は行わずに、ホストシステムにあるカーネル設定ファイル
.config をコピーして利用することもできます。 そのファイルが存在すればの
話です。 その場合は linux-2.6.32.8 ディレクトリにそのファイルをコピーし
てください。 もっともこのやり方はお勧めしません。 設定項目をメニューか
ら探し出して、カーネル設定を一から行っていくことが望ましいことです。

カーネルイメージとモジュールをコンパイルします。

make

カーネルモジュールを利用する場合 /etc/modprobe.d ディレクトリ内での設定
を必要とします。 モジュールやカーネル設定に関する情報は 7.9. 「LFS シス
テムにおけるデバイスとモジュールの扱い」 や linux-2.6.32.8/
Documentation ディレクトリにあるカーネルドキュメントを参照してください
。 また modprobe.conf(5) も有用です。

カーネル設定においてモジュールを利用することにした場合、モジュールをイ
ンストールします。

make modules_install

カーネルのコンパイルが終わったら、インストールの完了に向けてあと少し作
業を行います。 /boot ディレクトリにいくつかのファイルをコピーします。

カーネルイメージへのパスは、利用しているプラットフォームによってさまざ
まです。 そのファイル名は、好みにより自由に変更して構いません。 ただし
vmlinux という語は必ず含めてください。 これにより、次節で説明するブート
プロセスを自動的に設定するために必要なことです。 以下のコマンドは x86
アーキテクチャの場合の例です。

cp -v arch/x86/boot/bzImage /boot/vmlinux-2.6.32.8-lfs-6.6

System.map はカーネルに対するシンボルファイルです。 このファイルはカー
ネル API の各関数のエントリポイントをマッピングしています。 同様に実行
中のカーネルのデータ構成のアドレスを保持します。 このファイルは、カーネ
ルに問題があった場合にその状況を調べる手段として利用できます。 マップフ
ァイルをインストールするには以下を実行します。

cp -v System.map /boot/System.map-2.6.32.8

カーネル設定ファイル .config は、上で実行した make menuconfig によって
生成されます。 このファイル内には、今コンパイルしたカーネルの設定項目の
情報がすべて保持されています。 将来このファイルを参照する必要が出てくる
かもしれないため、このファイルを保存しておきます。

cp -v .config /boot/config-2.6.32.8

Linux カーネルのドキュメントをインストールします。

install -d /usr/share/doc/linux-2.6.32.8
cp -r Documentation/* /usr/share/doc/linux-2.6.32.8

カーネルのソースディレクトリは所有者が root ユーザーになっていません。
我々は chroot 環境内の root ユーザーとなってパッケージを展開してきまし
たが、展開されたファイル類はパッケージ開発者が用いていたユーザー ID、グ
ループ ID が適用されています。 このことは普通はあまり問題になりません。
というのもパッケージをインストールした後のソースファイルは、たいていは
削除するからです。 一方 Linux のソースファイルは、削除せずに保持してお
くことがよく行われます。 このことがあるため開発者の用いたユーザーIDが、
インストールしたマシン内の誰かの ID に割り当たった状態となりえます。 そ
の人はカーネルソースを自由に書き換えてしまう権限を持つことになるわけで
す。

カーネルのソース・ファイルを保持しておくつもりなら linux-2.6.32.8 ディ
レクトリにおいて chown -R 0:0 を実行しておいてください。 これによりその
ディレクトリの所有者は root ユーザーとなります。

警告

カーネルを説明する書の中には、カーネルのソースディレクトリに対してシン
ボリックリンク /usr/src/linux の生成を勧めているものがあります。 これは
カーネル 2.6 系以前におけるものであり LFS システム上では生成してはなり
ません 。 ベースとなる LFS システムを構築し、そこに新たなパッケージを追
加していこうとした際に、そのことが問題となるからです。

警告

さらに include ディレクトリにあるヘッダファイルは、必ず Glibc のコンパ
イルによって得られるものでなければならず、つまりは Linux カーネルの
tarball によって提供されるものでなければなりません。 したがってカーネル
ヘッダによって上書きされてしまうのは避けなければなりません。

8.3.2. Linux モジュールのロード順の設定

USB ドライバをモジュールとして構築した場合は /etc/modprobe.d/usb.conf
ファイルを生成する必要があります。 USB ドライバには ehci_hcd、ohci_hcd
、uhci_hcd があります。 これらのロード順は正しく行う必要があります。
ehci_hcd は ohci_hcd や uhci_hcd よりも先にロードしなければなりません。
これを行わないとブート時に警告メッセージが出力されます。

以下のコマンドを実行して /etc/modprobe.d/usb.conf ファイルを生成します
。

install -v -m755 -d /etc/modprobe.d
cat > /etc/modprobe.d/usb.conf << "EOF"
# Begin /etc/modprobe.d/usb.conf

install ohci_hcd /sbin/modprobe ehci_hcd ; /sbin/modprobe -i ohci_hcd ; true
install uhci_hcd /sbin/modprobe ehci_hcd ; /sbin/modprobe -i uhci_hcd ; true

# End /etc/modprobe.d/usb.conf
EOF

8.3.3. Linux の構成

インストールファイル: config-2.6.32.8, lfskernel-2.6.32.8,
System.map-2.6.32.8

概略説明

config-2.6.32.8          カーネルの設定をすべて含みます。

                         Linux システムのエンジンです。 コンピュータを
                         起動した際には、オペレーティングシステム内にて
                         最初にロードされるものです。 カーネルはコンピ
                         ュータのハードウェアを構成するあらゆるコンポー
vmlinux-2.6.32.8-lfs-6.6 ネントを検知して初期化します。 そしてそれらの
                         コンポーネントをツリー階層のファイルとして、ソ
                         フトウェアが利用できるようにします。 ただひと
                         つの CPU からマルチタスクを処理するマシンとし
                         て、あたかも多数のプログラムが同時稼動している
                         ように仕向けます。

                         アドレスとシンボルのリストです。 カーネル内の
System.map-2.6.32.8      すべての関数とデータ構成のエントリポイントおよ
                         びアドレスを示します。

8.4. GRUB を用いたブートプロセスの設定

8.4.1. はじめに

ブートローディングというものは複雑に入り組んでいます。 そこで注意すべき
点を順に説明していきます。 ご自身が現時点で利用しているブートローダーが
何であるのか、あるいはブートを必要とする他のオペレーティングシステムが
ハードドライブに存在しているかどうかについては、よく確認しておいてくだ
さい。 またコンピュータが利用不能に (ブート不能に) なってしまうことに備
えて、コンピュータを「復旧 (resucue)」するブートディスクの生成も忘れな
いでください。

これ以降の手順にて、 GRUB に関する特別なファイル類をハードドライブ上の
所定ディレクトリに書き出します。 ここではバックアップ目的で GRUB のブー
トフロッピーディスケットを生成しておくことを強く推奨します。 空のフロッ
ピーディスケットを挿入して以下を実行してください。

cd /tmp
grub-mkrescue --image-type=floppy floppy.img
dd if=floppy.img of=/dev/fd0 bs=1440 count=1

GRUB ではドライブやパーティションに対して (hdn,m) といった書式の命名法
を採用しています。 n はドライブ番号であり m はパーティション番号です。
いずれもゼロから数え始めます。 ただしパーティションの番号は普通は1から
数え始め、拡張パーティションは5から数え始めます。 かつてのバージョンで
は共にゼロから数え始めていましたが、今はそうではないので注意してくださ
い。 例えばパーティション sda1 は (hd0,1) となり、パーティション sdb3
は (hd1,3) となります。 Linux システムでの取り扱いとは違って GRUB では
CD-ROM ドライブをハードドライブとしては扱いません。 例えば CD が hdb で
あり２番めのハードドライブが hdc であった場合、２番めのハードドライブは
(hd1) と表記されます。

ディスクデバイスを GRUB がどのような名称で取り扱うかを確認する場合は以
下を実行してください。

grub-mkdevicemap --device-map=device.map
cat device.map

ブートパーティションをどこにするかは各人に委ねられていて、それによって
設定方法が変わります。 推奨される1つの手順としては、ブートパーティショ
ンとして独立した小さな (100MB 程度のサイズの) パーティションを設けるこ
とです。 こうしておくと、この後に LFS であろうが商用ディストリビューシ
ョンであろうが、システム導入する際に同一のブートファイルを利用すること
が可能です。 つまりどのようなブートシステムからでもアクセスが可能となり
ます。 この方法をとるなら、新たなパーティションをマウントした上で、現在
/boot ディレクトリにある全ファイルを (例えば前節にてビルドした Linux カ
ーネルも) 新しいパーティションに移動させる必要があります。 そしていった
んパーティションをアンマウントし、再度 /boot としてマウントしなおすこと
になります。 これを行った後は/etc/fstab を適切に書き換えてください。

現時点での LFS パーティションでも問題なく動作します。 ただし複数システ
ムを取り扱うための設定は、より複雑になります。

8.4.2. 設定作業

ここまでの情報に基づいて、ルートパーティションの名称を (あるいはブート
パーティションを別パーティションとするならそれも含めて) 決定します。 以
下では例として、ルートパーティション (あるいは別立てのブートパーティシ
ョン) が sda2 であるとします。

以下を実行して GRUB ファイル類を /boot/grub にインストールします。

grub-install --grub-setup=/bin/true /dev/sda

ここでは --grub-setup=/bin/true を指定して、マスタブートレコード
(Master Boot Record; MBR) への書き込みを行わないようにしています。 書き
込みを行ってしまってから元に戻すのは大変な作業になります。 そこでここで
は事前にテストを行う方法をとります。

/boot/grub/grub.cfg ファイルを生成します。

grub-mkconfig -o /boot/grub/grub.cfg

grub-mkconfig コマンドは /etc/grub.d/ ディレクトリにあるファイル類を利
用して、上のファイルの内容を決定します。 上の設定ファイルは以下のような
ものです。

#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by /usr/sbin/grub-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#

### BEGIN /etc/grub.d/00_header ###
set default=0
set timeout=5
### END /etc/grub.d/00_header ###

### BEGIN /etc/grub.d/10_linux ###
menuentry "GNU/Linux, Linux 2.6.30.2-lfs65" {
        insmod ext2
        set root=(hd0,2)
        search --no-floppy --fs-uuid --set 915852a7-859e-45a6-9ff0-d3ebfdb5cea2
        linux   /boot/vmlinux-2.6.32.8-lfs-6.6 root=/dev/sda2 ro
}
menuentry "GNU/Linux, Linux 2.6.30.2-lfs65 (recovery mode)" {
        insmod ext2
        set root=(hd0,2)
        search --no-floppy --fs-uuid --set 915852a7-859e-45a6-9ff0-d3ebfdb5cea2
        linux   /boot/vmlinux-2.6.32.8-lfs-6.6 root=/dev/sda2 ro single
}
menuentry "GNU/Linux, Linux 2.6.28-11-server" {
        insmod ext2
        set root=(hd0,2)
        search --no-floppy --fs-uuid --set 6b4c0339-5501-4a85-8351-e398e5252be8
        linux   /boot/vmlinuz-2.6.28-11-server root=UUID=6b4c0339-5501-4a85-8351-e398e5252be8 ro
        initrd  /boot/initrd.img-2.6.28-11-server
}
menuentry "GNU/Linux, Linux 2.6.28-11-server (recovery mode)" {
        insmod ext2
        set root=(hd0,2)
        search --no-floppy --fs-uuid --set 6b4c0339-5501-4a85-8351-e398e5252be8
        linux   /boot/vmlinuz-2.6.28-11-server root=UUID=6b4c0339-5501-4a85-8351-e398e5252be8 ro single
        initrd  /boot/initrd.img-2.6.28-11-server
}
### END /etc/grub.d/10_linux ###

### BEGIN /etc/grub.d/30_os-prober ###
### END /etc/grub.d/30_os-prober ###

### BEGIN /etc/grub.d/40_custom ###
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.
### END /etc/grub.d/40_custom ###

このファイルを無闇に編集するのは避けるべきですが、 grub-mkconfig コマン
ドを再実行しない限りは、編集作業を行っても構いません。 search と書かれ
た行は LFS システムにとっては意味がありません。 これは initrd イメージ
を取り扱う際に必要となるコマンドであるからです。 ブートパーティションを
別のパーティションとしてインストールするのであれば、 linux や initrd と
書かれた行で、ファイル名称に含まれる /boot の記述は不要です。 このファ
イル例では、Ubuntu のカーネルファイルが /boot に同様にあるものとして示
しています。

8.4.3. 設定のテスト

GRUB のコアイメージ (core image) もマルチブートカーネル (Multiboot
kernel) です。 したがって GRUB Legacy を既にインストール済であるなら、
それまでの古いブートローダーを用いて新たな GRUB-1.97.2 をロードすること
が可能です。 具体的な方法としては、まず chroot 環境からいったん抜け出た
上で再度入り直し、本節の残りの作業を進めます。

/sbin/reboot
...
grub> root (hd0,1)
grub> kernel /boot/grub/core.img
grub> boot

上に示しているコマンドは GRUB Legacy であるものとして説明しています。
この時点で GRUB は (GRUB Legacy と非常に似た) プロンプトを表示します。
そこではさまざまな入力を行ったり、grub.cfg ファイルに定められているシス
テムを起動することもできます。

8.4.4. マスタブートレコードへの書き込み

上で示したように GRUB の設定に対するテストを終えたら、再び chroot 環境
に入ります。

警告

以下に示すコマンドを実行すると、現在のブートローダーを上書きします。 上
書きするのが不適当であるならコマンドを実行しないでください。 例えばマス
タブートレコード (Master Boot Record; MBR) を管理するサードパーティ製の
ブートマネージャソフトウェアを利用している場合などがこれに該当します。

以下により MBR を書き換えます。

grub-setup '<DEVICE>'

DEVICE の部分はブートディスクに応じて書き換えてください。 通常は '(hd0)
' あるいは /dev/sda となるはずです。 (hd0) を指定する場合は、カッコの文
字をバックスラッシュによりエスケープするか、シングルクォートで囲むよう
にしてください。 そうしておかないと、サブシェルを表わすものとして解釈さ
れてしまうからです。

このプログラムは以下に示すデフォルト値を用います。 ここまでの手順におい
て本書とは異なる方法をとっている場合は、適切に修正してください。

 ・ ブートイメージ - boot.img

 ・ コアイメージ - core.img

 ・ ディレクトリ - /boot/grub

 ・ デバイスマップ - device.map

 ・ デフォルトルート設定 - 自動推測

注記

ルート設定は grub.cfg ファイル内にて 'set root' の指定がない場合のデフ
ォルト値です。 これは、カーネルや他の関連ファイルが検出するパーティショ
ンとなり、 'linux' の設定行内にあるパラメータ 'root=' での設定内容とは
異なります。 'root=' での設定は、カーネルが '/' としてマウントしたパー
ティションを意味します。 上に示した grub.cfg のサンプルでは、どちらも /
dev/sda2 に設定していますが、ブートパーティションを別に用意している場合
は設定値が異なることとなります。

第9章 作業終了

9.1. 作業終了

できました！ LFS システムのインストール終了です。 あなたの輝かしいカス
タムメイドの Linux システムが完成したことでしょう。

/etc/lfs-release というファイルをここで作成することにします。 このファ
イルを作っておけば、どのバージョンの LFS をインストールしたのか、すぐに
判別できます。 (もしあなたが質問を投げた時には、我々もすぐに判別できる
ことになります。) 以下のコマンドによりこのファイルを生成します。

echo 6.6 > /etc/lfs-release

9.2. ユーザー登録

これにより本書の作業は終了です。 LFS ユーザー登録を行ってカウンタを取得
しますか？ 以下のページ http://www.linuxfromscratch.org/cgi-bin/
lfscounter.cgi にて氏名と LFS バージョンを登録して下さい。

それではシステムの再起動を行ないましょう。

9.3. システムの再起動

ソフトウェアのインストールがすべて完了しました。 ここでコンピュータを再
起動しますが、いくつか注意しておいて下さい。 本書を通じて構築したシステ
ムは最小限のものです。 これ以降に様々なことを繰り広げていくには、機能が
不足しているはずです。 もうしばらくは今までと同じように chroot 環境を利
用して BLFS ブックからいくつかのパッケージをインストールしていきましょ
う。 その後のリブートにより新しい LFS システムを起動すれば、より一層、
満足できる環境を得ることになるはずです。 例えば Lynx のようなテキストウ
ェブブラウザをインストールすれば、仮想端末上で BLFS ブックを参照でき、
同時にパッケージのビルドを行っていくことができます。 GPM パッケージを導
入すれば、仮想端末上にてコピー・ペースト作業を行うことができます。 また
ネットワーク接続にあたって固定 IP アドレスが不適当である場合には Dhcpcd
や PPP といったパッケージをインストールしておくのが良いでしょう。

さあよろしいですか。 新しくインストールした LFS システムの再起動を行い
ましょう。 まずは chroot 環境から抜けます。

logout

仮想ファイルシステムをアンマウントします。

umount -v $LFS/dev/pts
umount -v $LFS/dev/shm
umount -v $LFS/dev
umount -v $LFS/proc
umount -v $LFS/sys

LFS ファイルシステムもアンマウントします。

umount -v $LFS

複数のパーティションを生成していた場合は、以下のようにして複数パーティ
ションをアンマウントします。 メインのパーティションのアンマウントはその
後に行います。

umount -v $LFS/usr
umount -v $LFS/home
umount -v $LFS

以下のようにしてシステムを再起動します。

shutdown -r now

これまでの作業にて GRUB ブートローダが設定されているはずです。 そのメニ
ューには LFS 6.6 を起動するためのメニュー項目があるはずです。

再起動が無事行われ LFS システムを使うことができます。 必要に応じてさら
なるソフトウェアをインストールしていってください。

9.4. 今度は何?

本書をお読み頂き、ありがとうございます。 本書が皆さんにとって有用なもの
となり、システムの構築方法について十分に学んで頂けたものと思います。

LFS システムをインストールしたら 「次は何を？」 とお考えになるかもしれ
ません。 その質問に答えるために以下に各種の情報をまとめます。

 ・ 保守

    あらゆるソフトウェアにおいて、バグやセキュリティの情報は日々報告さ
    れています。 LFS システムはソースコードからコンパイルしていますので
    、そのような報告を見逃さずにおくことは皆さんの仕事となります。 その
    ような報告をオンラインで提供する情報の場がありますので、いくつかを
    以下に示しましょう。

     □ Freshmeat.net (http://freshmeat.net/)

        Freshmeat は、システムにインストールされているパッケージの新し
        いバージョンが提供されると、それを (電子メールで) 通知してくれ
        ます。

     □ CERT (Computer Emergency Response Team)

        CERT にはメーリングリストがあり、数々のオペレーティングシステム
        やアプリケーションにおけるセキュリティ警告を公開しています。 購
        読に関する情報は http://www.us-cert.gov/cas/signup.html を参照
        してください。

     □ バグトラック (Bugtraq)

        バグトラックは、完全公開のコンピュータセキュリティに関するメー
        リングリストです。 これは新たに発見されたセキュリティに関する問
        題を公開しています。 また時には、その問題を解消するフィックス情
        報も提供してくれます。 購読に関する情報は http://
        www.securityfocus.com/archive を参照してください。

 ・ Beyond Linux From Scratch

    Beyond Linux From Scratch ブックは、 LFS ブックが取り扱うソフトウェ
    アの範囲を超えて、数多くのソフトウェアをインストールする手順を示し
    ています。 BLFS プロジェクトは以下にあります。 http://
    www.linuxfromscratch.org/blfs/.

 ・ LFS ヒント (LFS Hints)

    LFS ヒントは有用なドキュメントを集めたものです。 LFS コミュニティの
    ボランティアによって投稿されたものです。 それらのヒントは http://
    www.linuxfromscratch.org/hints/list.html にて参照することができます
    。

 ・ メーリングリスト

    皆さんにも参加して頂ける LFS メーリングリストがあります。 何かの助
    けが必要になったり、最新の開発を行いたかったり、あるいはプロジェク
    トに貢献したいといった場合に、参加して頂くことができます。 詳しくは
    第1章 - メーリングリスト を参照してください。

 ・ Linux ドキュメントプロジェクト (The Linux Documentation Project;
    TLDP)

    Linux ドキュメントプロジェクトの目指すことは Linux のドキュメントに
    関わる問題を共同で取り組むことです。 TLDP ではハウツー (HOWTO)、ガ
    イド、man ページを数多く提供しています。 以下のサイトにあります。
    http://www.tldp.org/

第IV部 付録

付録 A. 略語と用語

日本語訳情報

本節における日本語訳は、訳語が一般的に普及していると思われるものは、そ
の訳語とカッコ書き内に原語を示します。 逆に訳語に適当なものがないと思わ
れるものは、無理に訳出せず原語だけを示すことにします。 この判断はあくま
で訳者によるものであるため、不適切・不十分な個所についてはご指摘くださ
い。

ABI    アプリケーション バイナリ インターフェース (Application Binary
       Interface)

ALFS   Automated Linux From Scratch

ALSA   Advanced Linux Sound Architecture

API    アプリケーション プログラミング インターフェース (Application
       Programming Interface)

ASCII  American Standard Code for Information Interchange

BIOS   ベーシック インプット/アウトプット システム; バイオス (Basic
       Input/Output System)

BLFS   Beyond Linux From Scratch

BSD    Berkeley Software Distribution

chroot ルートのチェンジ (change root)

CMOS   シーモス (Complementary Metal Oxide Semiconductor)

COS    Class Of Service

CPU    中央演算処理装置 (Central Processing Unit)

CRC    巡回冗長検査 (Cyclic Redundancy Check)

CVS    Concurrent Versions System

DHCP   ダイナミック ホスト コンフィギュレーション プロトコル (Dynamic
       Host Configuration Protocol)

DNS    ドメインネームサービス (Domain Name Service)

EGA    Enhanced Graphics Adapter

ELF    Executable and Linkable Format

EOF    ファイルの終端 (End of File)

EQN    式 (equation)

EVMS   Enterprise Volume Management System

ext2   second extended file system

ext3   third extended file system

ext4   fourth extended file system

FAQ    よく尋ねられる質問 (Frequently Asked Questions)

FHS    ファイルシステム階層標準 (Filesystem Hierarchy Standard)

FIFO   ファーストイン、ファーストアウト (First-In, First Out)

FQDN   完全修飾ドメイン名 (Fully Qualified Domain Name)

FTP    ファイル転送プロトコル (File Transfer Protocol)

GB     ギガバイト (gigabytes)

GCC    GNU コンパイラ コレクション (GNU Compiler Collection)

GID    グループ識別子 (Group Identifier)

GMT    グリニッジ標準時 (Greenwich Mean Time)

GPG    GNU Privacy Guard

HTML   ハイパーテキスト マークアップ ランゲージ (Hypertext Markup
       Language)

IDE    Integrated Drive Electronics

IEEE   Institute of Electrical and Electronic Engineers

IO     入出力 (Input/Output)

IP     インターネット プロトコル (Internet Protocol)

IPC    プロセス間通信 (Inter-Process Communication)

IRC    インターネット リレイ チャット (Internet Relay Chat)

ISO    国際標準化機構 (International Organization for Standardization)

ISP    インターネット サービス プロバイダ (Internet Service Provider)

KB     キロバイト (kilobytes)

LED    発光ダイオード (Light Emitting Diode)

LFS    Linux From Scratch

LSB    Linux Standard Base

MB     メガバイト (megabytes)

MBR    マスタ ブート レコード (Master Boot Record)

MD5    Message Digest 5

NIC    ネットワーク インターフェース カード (Network Interface Card)

NLS    Native Language Support

NNTP   Network News Transport Protocol

NPTL   Native POSIX Threading Library

OSS    Open Sound System

PCH    プリコンパイル済みヘッダ (Pre-Compiled Headers)

PCRE   Perl Compatible Regular Expression

PID    プロセス識別子 (Process Identifier)

PLFS   Pure Linux From Scratch

PTY    仮想端末 (pseudo terminal)

QA     品質保証 (Quality Assurance)

QOS    クオリティ オブ サービス (Quality Of Service)

RAM    ランダム アクセス メモリ (Random Access Memory)

RPC    リモート プロシージャ コール (Remote Procedure Call)

RTC    リアルタイムクロック (Real Time Clock)

SBU    標準ビルド時間 (Standard Build Unit)

SCO    サンタ クルズ オペレーション社 (The Santa Cruz Operation)

SGR    Select Graphic Rendition

SHA1   Secure-Hash Algorithm 1

SMP    対称型マルチプロセッサ (Symmetric Multi-Processor)

TLDP   The Linux Documentation Project

TFTP   Trivial File Transfer Protocol

TLS    スレッド ローカル ストレージ (Thread-Local Storage)

UID    ユーザー識別子 (User Identifier)

umask  user file-creation mask

USB    ユニバーサル シリアル バス (Universal Serial Bus)

UTC    協定世界時 (Coordinated Universal Time)

UUID   汎用一意識別子 (Universally Unique Identifier)

VC     仮想コンソール (Virtual Console)

VGA    ビデオ グラフィックス アレイ (Video Graphics Array)

VT     仮想端末 (Virtual Terminal)

付録 B. 謝辞

Linux From Scratch プロジェクトへ貢献して下さった以下の方々および組織団
体に感謝致します。

 ・ Gerard Beekmans <gerard AT linuxfromscratch D0T org> - LFS 構築者、
    LFS プロジェクトリーダー

 ・ Matthew Burgess <matthew AT linuxfromscratch D0T org> - LFS プロジ
    ェクトリーダー、LFS テクニカルライター/編集者

 ・ Bruce Dubbs <bdubbs AT linuxfromscratch D0T org> - LFS リリース管理
    者、LFS テクニカルライター/編集者

 ・ Jim Gifford <jim AT linuxfromscratch D0T org> - CLFS プロジェクト共
    同リーダー

 ・ Bryan Kadzban <bryan AT linuxfromscratch D0T org> - LFS テクニカル
    ライター

 ・ Randy McMurchy <randy AT linuxfromscratch D0T org> - BLFS プロジェ
    クトリーダー、LFS 編集者

 ・ DJ Lucas <dj AT linuxfromscratch D0T org> - LFS、BLFS 編集者

 ・ Ken Moffat <ken AT linuxfromscratch D0T org> - LFS、CLFS 編集者

 ・ Ryan Oliver <ryan AT linuxfromscratch D0T org> - CLFS プロジェクト
    共同リーダー

 ・ この他に数多くの方々にも協力頂きました。 皆さまには LFS や BLFS な
    どのメーリングリストにて、 提案、ブック内容のテスト、バグ報告、作業
    指示、パッケージインストールの経験談などを通じて、本ブック製作にご
    協力頂きました。

翻訳者

 ・ Manuel Canales Esparcia <macana AT macana-es D0T com> - スペインの
    LFS 翻訳プロジェクト

 ・ Johan Lenglet <johan AT linuxfromscratch D0T org> - フランスの LFS
    翻訳プロジェクト

 ・ Anderson Lizardo <lizardo AT linuxfromscratch D0T org> - ポルトガル
    の LFS 翻訳プロジェクト

 ・ Thomas Reitelbach <tr AT erdfunkstelle D0T de> - ドイツの LFS 翻訳
    プロジェクト

ミラー管理者

北米のミラー

 ・ Scott Kveton <scott AT osuosl D0T org> - lfs.oregonstate.edu ミラー

 ・ William Astle <lost AT l-w D0T net> - ca.linuxfromscratch.org ミラ
    ー

 ・ Eujon Sellers <jpolen@rackspace.com> - lfs.introspeed.com ミラー

 ・ Justin Knierim <tim@idge.net> - lfs-matrix.net ミラー

南米のミラー

 ・ Manuel Canales Esparcia <manuel AT linuxfromscratch D0T org> -
    lfsmirror.lfs-es.info ミラー

 ・ Luis Falcon <Luis Falcon> - torredehanoi.org ミラー

ヨーロッパのミラー

 ・ Guido Passet <guido AT primerelay D0T net> -
    nl.linuxfromscratch.org ミラー

 ・ Bastiaan Jacques <baafie AT planet D0T nl> - lfs.pagefault.net ミラ
    ー

 ・ Sven Cranshoff <sven D0T cranshoff AT lineo D0T be> - lfs.lineo.be
    ミラー

 ・ Scarlet Belgium - lfs.scarlet.be ミラー

 ・ Sebastian Faulborn <info AT aliensoft D0T org> - lfs.aliensoft.org
    ミラー

 ・ Stuart Fox <stuart AT dontuse D0T ms> - lfs.dontuse.ms ミラー

 ・ Ralf Uhlemann <admin AT realhost D0T de> - lfs.oss-mirror.org ミラ
    ー

 ・ Antonin Sprinzl <Antonin D0T Sprinzl AT tuwien D0T ac D0T at> -
    at.linuxfromscratch.org ミラー

 ・ Fredrik Danerklint <fredan-lfs AT fredan D0T org> -
    se.linuxfromscratch.org ミラー

 ・ Franck <franck AT linuxpourtous D0T com> - lfs.linuxpourtous.com ミ
    ラー

 ・ Philippe Baque <baque AT cict D0T fr> - lfs.cict.fr ミラー

 ・ Vitaly Chekasin <gyouja AT pilgrims D0T ru> - lfs.pilgrims.ru ミラ
    ー

 ・ Benjamin Heil <kontakt AT wankoo D0T org> - lfs.wankoo.org ミラー

アジアのミラー

 ・ Satit Phermsawang <satit AT wbac D0T ac D0T th> - lfs.phayoune.org
    ミラー

 ・ Shizunet Co.,Ltd. <info AT shizu-net D0T jp> -
    lfs.mirror.shizu-net.jp ミラー

 ・ Init World <http://www.initworld.com/> - lfs.initworld.com ミラー

オーストラリアのミラー

 ・ Jason Andrade <jason AT dstc D0T edu D0T au> -
    au.linuxfromscratch.org ミラー

以前のプロジェクトチームメンバー

 ・ Christine Barczak <theladyskye AT linuxfromscratch D0T org> - LFS
    ブック編集者

 ・ Archaic <archaic@linuxfromscratch.org> - LFS テクニカルライター/編
    集者、 HLFS プロジェクトリーダー、 BLFS 編集者、 ヒントプロジェクト
    とパッチプロジェクトの管理者

 ・ Nathan Coulson <nathan AT linuxfromscratch D0T org> - LFS-ブートス
    クリプトの管理者

 ・ Timothy Bauscher

 ・ Robert Briggs

 ・ Ian Chilton

 ・ Jeroen Coumans <jeroen AT linuxfromscratch D0T org> - ウェブサイト
    開発者、 FAQ 管理者

 ・ Manuel Canales Esparcia <manuel AT linuxfromscratch D0T org> - LFS/
    BLFS/HLFS の XML と XSL の管理者

 ・ Alex Groenewoud - LFS テクニカルライター

 ・ Marc Heerdink

 ・ Jeremy Huntwork <jhuntwork AT linuxfromscratch D0T org> - LFS テク
    ニカルライター、LFS LiveCD 管理者

 ・ Mark Hymers

 ・ Seth W. Klein - FAQ 管理者

 ・ Nicholas Leippe <nicholas AT linuxfromscratch D0T org> - Wiki 管理
    者

 ・ Anderson Lizardo <lizardo AT linuxfromscratch D0T org> - ウェブサイ
    トのバックエンドスクリプトの管理者

 ・ Dan Nicholson <dnicholson AT linuxfromscratch D0T org> - LFS/BLFS
    編集者

 ・ Alexander E. Patrakov <alexander AT linuxfromscratch D0T org> - LFS
    テクニカルライター、 LFS 国際化に関する編集者、 LFS Live CD 管理者

 ・ Simon Perreault

 ・ Scot Mc Pherson <scot AT linuxfromscratch D0T org> - LFS NNTP ゲー
    トウェイ管理者

 ・ Greg Schafer <gschafer AT zip D0T com D0T au> - LFS テクニカルライ
    ター、 次世代 64 ビット機での構築手法の開発者

 ・ Jesse Tie-Ten-Quee - LFS テクニカルライター

 ・ James Robertson <jwrober AT linuxfromscratch D0T org> - Bugzilla 管
    理者

 ・ Tushar Teredesai <tushar AT linuxfromscratch D0T org> - BLFS ブック
    編集者、 ヒントプロジェクト・パッチプロジェクトのリーダー

 ・ Jeremy Utley <jeremy AT linuxfromscratch D0T org> - LFS テクニカル
    ライター、 Bugzilla 管理者、 LFS-ブートスクリプト管理者

 ・ Zack Winkles <zwinkles AT gmail D0T com> - LFS テクニカルライター

付録 C. パッケージの依存関係

LFS にて構築するパッケージはすべて、他のいくつかのパッケージに依存して
いて、それらがあって初めて適切にインストールができます。 パッケージの中
には互いに依存し合っているものもあります。 つまり一つめのパッケージが二
つめのパッケージに依存しており、二つめが実は一つめのパッケージにも依存
しているような例です。 こういった依存関係があることから LFS においてパ
ッケージを構築する順番は非常に重要なものとなります。 本節は LFS にて構
築する各パッケージの依存関係を示すものです。

ビルドするパッケージの個々には、3種類あるいは4種類の依存関係を示してい
ます。 1つめは対象パッケージをコンパイルしてビルドするために必要となる
パッケージです。 2つめは一つめのものに加えて、テストスイートを実行する
ために必要となるパッケージです。 3つめは対象パッケージをビルドし、最終
的にインストールするために必要となるパッケージです。 たいていの場合、そ
れらのパッケージに含まれているスクリプトが、実行モジュールへのパスを固
定的に取り扱っています。 所定の順番どおりにパッケージのビルドを行わない
と、最終的にインストールされるシステムにおいて、スクリプトの中に /tools
/bin/[実行モジュール] といったパスが含まれてしまうことになりかねません
。 これは明らかに不適切なことです。

依存関係として4つめに示すのは任意のパッケージであり LFS では説明してい
ないものです。 しかし皆さんにとっては有用なパッケージであるはずです。
それらのパッケージは、さらに別のパッケージを必要としていたり、互いに依
存し合っていることがあります。 そういった依存関係があるため、それらをイ
ンストールする場合には、LFS をすべて仕上げた後に再度 LFS 内のパッケージ
を再構築する方法をお勧めします。 再インストールに関しては、たいていは
BLFS にて説明しています。

Autoconf

インストール依存パッケージ: Bash, Coreutils, Grep, M4, Make, Perl, Sed,
Texinfo
テストスイート依存パッケージ: Automake, Diffutils, Findutils, GCC,
Libtool
事前インストールパッケージ: Automake
任意依存パッケージ: Emacs

Automake

インストール依存パッケージ: Autoconf, Bash, Coreutils, Gettext, Grep,
M4, Make, Perl, Sed, Texinfo
テストスイート依存パッケージ: Binutils, Bison, Bzip2, DejaGNU,
Diffutils, Expect, Findutils, Flex, GCC, Gettext, Gzip, Libtool, Tar.
事前インストールパッケージ: なし
任意依存パッケージ: なし

Bash

インストール依存パッケージ: Bash, Binutils, Bison, Coreutils,
Diffutils, Gawk, GCC, Glibc, Grep, Make, Ncurses, Patch, Readline, Sed,
Texinfo
テストスイート依存パッケージ: なし
事前インストールパッケージ: なし
任意依存パッケージ: Xorg

Binutils

インストール依存パッケージ: Bash, Binutils, Coreutils, Diffutils, Gawk,
GCC, Glibc, Grep, Make, Perl, Sed, Texinfo Zlib
テストスイート依存パッケージ: DejaGNU, Expect
事前インストールパッケージ: なし
任意依存パッケージ: なし

Bison

インストール依存パッケージ: Bash, Binutils, Coreutils, GCC, Gettext,
Glibc, Grep, M4, Make, Sed
テストスイート依存パッケージ: Diffutils, Findutils
事前インストールパッケージ: Flex, Kbd, Tar
任意依存パッケージ: Doxygen (テストスイート用)

Bzip2

インストール依存パッケージ: Bash, Binutils, Coreutils, Diffutils, GCC,
Glibc, Make, Patch
テストスイート依存パッケージ: なし
事前インストールパッケージ: なし
任意依存パッケージ: なし

Coreutils

インストール依存パッケージ: Bash, Binutils, Coreutils, GCC, Gettext,
Glibc, GMP, Grep, Make, Patch, Perl, Sed, Texinfo
テストスイート依存パッケージ: Diffutils, E2fsprogs, Findutils,
Util-linux-ng
事前インストールパッケージ: Bash, Diffutils, Findutils, Man-DB, Udev
任意依存パッケージ: Perl Expect と IO:Tty モジュール (テストスイート用)

DejaGNU

インストール依存パッケージ: Bash, Coreutils, Diffutils, GCC, Grep,
Make, Sed
テストスイート依存パッケージ: テストスイートはありません
事前インストールパッケージ: なし
任意依存パッケージ: なし

Diffutils

インストール依存パッケージ: Bash, Binutils, Coreutils, Diffutils, GCC,
Gettext, Glibc, Grep, Make, Patch, Sed, Texinfo
テストスイート依存パッケージ: テストスイートはありません
事前インストールパッケージ: なし
任意依存パッケージ: なし

Expect

インストール依存パッケージ: Bash, Binutils, Coreutils, Diffutils, GCC,
Glibc, Grep, Make, Patch, Sed, Tcl
テストスイート依存パッケージ: なし
事前インストールパッケージ: なし
任意依存パッケージ: なし

E2fsprogs

インストール依存パッケージ: Bash, Binutils, Coreutils, Diffutils, Gawk,
GCC, Glibc, Grep, Gzip, Make, Pkg-config, Sed, Texinfo, Util-linux-ng
テストスイート依存パッケージ: なし
事前インストールパッケージ: なし
任意依存パッケージ: なし

File

インストール依存パッケージ: Bash, Binutils, Coreutils, Diffutils, Gawk,
GCC, Glibc, Grep, Make, Sed, Zlib
テストスイート依存パッケージ: テストスイートはありません
事前インストールパッケージ: なし
任意依存パッケージ: なし

Findutils

インストール依存パッケージ: Bash, Binutils, Coreutils, GCC, Gettext,
Glibc, Grep, Make, Sed, Texinfo
テストスイート依存パッケージ: DejaGNU, Diffutils, Expect
事前インストールパッケージ: なし
任意依存パッケージ: なし

Flex

インストール依存パッケージ: Bash, Binutils, Coreutils, GCC, Gettext,
Glibc, Grep, M4, Make, Patch, Sed, Texinfo
テストスイート依存パッケージ: Bison, Gawk
事前インストールパッケージ: IPRoute2, Kbd, Man-DB
任意依存パッケージ: なし

Gawk

インストール依存パッケージ: Bash, Binutils, Coreutils, GCC, Gettext,
Glibc, Grep, Make, Patch, Sed, Texinfo
テストスイート依存パッケージ: Diffutils
事前インストールパッケージ: なし
任意依存パッケージ: なし

Gcc

インストール依存パッケージ: Bash, Binutils, Coreutils, Diffutils,
Findutils, Gawk, GCC, Gettext, Glibc, GMP, Grep, M4, Make, MPFR, Patch,
Perl, Sed, Tar, Texinfo
テストスイート依存パッケージ: DejaGNU, Expect
事前インストールパッケージ: なし
任意依存パッケージ: CLooG-PPL, GNAT and PPL

GDBM

インストール依存パッケージ: Bash, Binutils, Coreutils, Diffutils, GCC,
Grep, Make, Sed
テストスイート依存パッケージ: なし
事前インストールパッケージ: なし
任意依存パッケージ: なし

Gettext

インストール依存パッケージ: Bash, Binutils, Coreutils, Gawk, GCC,
Glibc, Grep, Make, Sed, Texinfo
テストスイート依存パッケージ: Diffutils, Perl, Tcl
事前インストールパッケージ: Automake
任意依存パッケージ: なし

Glibc

インストール依存パッケージ: Bash, Binutils, Coreutils, Diffutils, Gawk,
GCC, Gettext, Grep, Gzip, Make, Perl, Sed, Texinfo
テストスイート依存パッケージ: File
事前インストールパッケージ: なし
任意依存パッケージ: なし

GMP

インストール依存パッケージ: Bash, Binutils, Coreutils, Diffutils, Gawk,
GCC, Glibc, Grep, M4, Make, Sed, Texinfo
テストスイート依存パッケージ: なし
事前インストールパッケージ: MPFR, GCC
任意依存パッケージ: なし

Grep

インストール依存パッケージ: Bash, Binutils, Coreutils, Diffutils, GCC,
Gettext, Glibc, Grep, Make, Patch, Sed, Texinfo
テストスイート依存パッケージ: Gawk
事前インストールパッケージ: Man-DB
任意依存パッケージ: Pcre, Xorg, CUPS

Groff

インストール依存パッケージ: Bash, Binutils, Bison, Coreutils, Gawk,
GCC, Glibc, Grep, Make, Patch, Sed, Texinfo
テストスイート依存パッケージ: テストスイートはありません
事前インストールパッケージ: Man-DB, Perl
任意依存パッケージ: GPL Ghostscript

GRUB

インストール依存パッケージ: Bash, Binutils, Coreutils, Diffutils, GCC,
Glibc, Grep, Make, Ncurses, Sed, Texinfo
テストスイート依存パッケージ: なし
事前インストールパッケージ: なし
任意依存パッケージ: なし

Gzip

インストール依存パッケージ: Bash, Binutils, Coreutils, GCC, Glibc,
Grep, Make, Sed, Texinfo
テストスイート依存パッケージ: Diffutils
事前インストールパッケージ: Man-DB
任意依存パッケージ: なし

Iana-Etc

インストール依存パッケージ: Coreutils, Gawk, Make
テストスイート依存パッケージ: テストスイートはありません
事前インストールパッケージ: Perl
任意依存パッケージ: なし

Inetutils

インストール依存パッケージ: Bash, Binutils, Coreutils, GCC, Glibc,
Grep, Make, Ncurses, Patch, Sed, Texinfo, Zlib
テストスイート依存パッケージ: テストスイートはありません
事前インストールパッケージ: Tar
任意依存パッケージ: なし

IProute2

インストール依存パッケージ: Bash, Bison, Coreutils, Flex, GCC, Glibc,
Make, Linux API ヘッダ
テストスイート依存パッケージ: テストスイートはありません
事前インストールパッケージ: なし
任意依存パッケージ: なし

Kbd

インストール依存パッケージ: Bash, Binutils, Bison, Coreutils, Flex,
GCC, Gettext, Glibc, Gzip, Make, Patch, Sed
テストスイート依存パッケージ: テストスイートはありません
事前インストールパッケージ: なし
任意依存パッケージ: なし

Less

インストール依存パッケージ: Bash, Binutils, Coreutils, Diffutils, GCC,
Glibc, Grep, Make, Ncurses, Sed
テストスイート依存パッケージ: テストスイートはありません
事前インストールパッケージ: なし
任意依存パッケージ: Pcre

Libtool

インストール依存パッケージ: Bash, Binutils, Coreutils, Diffutils, Gawk,
GCC, Glibc, Grep, Make, Sed, Texinfo
テストスイート依存パッケージ: Findutils
事前インストールパッケージ: なし
任意依存パッケージ: なし

Linux Kernel

インストール依存パッケージ: Bash, Binutils, Coreutils, Diffutils,
Findutils, GCC, Glibc, Grep, Gzip, Make, Module-Init-Tools, Ncurses,
Perl, Sed
テストスイート依存パッケージ: テストスイートはありません
事前インストールパッケージ: なし
任意依存パッケージ: なし

M4

インストール依存パッケージ: Bash, Binutils, Coreutils, GCC, Glibc,
Grep, Make, Sed, Texinfo
テストスイート依存パッケージ: Diffutils
事前インストールパッケージ: Autoconf, Bison
任意依存パッケージ: libsigsegv

Make

インストール依存パッケージ: Bash, Binutils, Coreutils, GCC, Gettext,
Glibc, Grep, Make, Sed, Texinfo
テストスイート依存パッケージ: Perl, Procps
事前インストールパッケージ: なし
任意依存パッケージ: なし

Man-DB

インストール依存パッケージ: Bash, Binutils, Bzip2, Coreutils, Flex,
GCC, GDBM, Gettext, Glibc, Grep, Groff, Gzip, Less, Make, Sed
テストスイート依存パッケージ: 動かすためには Man-DB テストスイートパッ
ケージが必要
事前インストールパッケージ: なし
任意依存パッケージ: なし

Man-Pages

インストール依存パッケージ: Bash, Coreutils, Make
テストスイート依存パッケージ: テストスイートはありません
事前インストールパッケージ: なし
任意依存パッケージ: なし

Module-Init-Tools

インストール依存パッケージ: Bash, Binutils, Coreutils, Findutils, GCC,
Glibc, Grep, Make, Patch, Sed, Zlib
テストスイート依存パッケージ: Diffutils, File, Gawk, Gzip
事前インストールパッケージ: なし
任意依存パッケージ: なし

MPFR

インストール依存パッケージ: Bash, Binutils, Coreutils, Diffutils, Gawk,
GCC, Glibc, Grep, GMP, Make, Sed, Texinfo
テストスイート依存パッケージ: なし
事前インストールパッケージ: GCC
任意依存パッケージ: なし

Ncurses

インストール依存パッケージ: Bash, Binutils, Coreutils, Diffutils, Gawk,
GCC, Glibc, Grep, Make, Patch, Sed
テストスイート依存パッケージ: テストスイートはありません
事前インストールパッケージ: Bash, GRUB, Inetutils, Less, Procps,
Psmisc, Readline, Texinfo, Util-linux-ng, Vim
任意依存パッケージ: なし

Patch

インストール依存パッケージ: Bash, Binutils, Coreutils, GCC, Glibc,
Grep, Make, Sed
テストスイート依存パッケージ: テストスイートはありません
事前インストールパッケージ: なし
任意依存パッケージ: Ed

Perl

インストール依存パッケージ: Bash, Binutils, Coreutils, Gawk, GCC, GDBM,
Glibc, Grep, Groff, Make, Sed, Zlib
テストスイート依存パッケージ: Iana-Etc, Procps
事前インストールパッケージ: Autoconf
任意依存パッケージ: なし

Pkg-config

インストール依存パッケージ: Bash, Binutils, Coreutils, Diffutils, Gawk,
GCC, Glibc, Grep, Make, Sed
テストスイート依存パッケージ: なし
事前インストールパッケージ: なし
任意依存パッケージ: なし

Procps

インストール依存パッケージ: Bash, Binutils, Coreutils, GCC, Glibc,
Make, Ncurses
テストスイート依存パッケージ: テストスイートはありません
事前インストールパッケージ: なし
任意依存パッケージ: なし

Psmisc

インストール依存パッケージ: Bash, Binutils, Coreutils, GCC, Gettext,
Glibc, Grep, Make, Ncurses, Sed
テストスイート依存パッケージ: テストスイートはありません
事前インストールパッケージ: なし
任意依存パッケージ: なし

Readline

インストール依存パッケージ: Bash, Binutils, Coreutils, Gawk, GCC,
Glibc, Grep, Make, Ncurses, Patch, Sed, Texinfo
テストスイート依存パッケージ: テストスイートはありません
事前インストールパッケージ: Bash
任意依存パッケージ: なし

Sed

インストール依存パッケージ: Bash, Binutils, Coreutils, GCC, Gettext,
Glibc, Grep, Make, Sed, Texinfo
テストスイート依存パッケージ: Diffutils, Gawk
事前インストールパッケージ: E2fsprogs, File, Libtool, Shadow
任意依存パッケージ: Cracklib

Shadow

インストール依存パッケージ: Bash, Binutils, Coreutils, Diffutils,
Findutils, Gawk, GCC, Gettext, Glibc, Grep, Make, Sed
テストスイート依存パッケージ: テストスイートはありません
事前インストールパッケージ: なし
任意依存パッケージ: なし

Sysklogd

インストール依存パッケージ: Binutils, Coreutils, GCC, Glibc, Make,
Patch
テストスイート依存パッケージ: テストスイートはありません
事前インストールパッケージ: なし
任意依存パッケージ: なし

Sysvinit

インストール依存パッケージ: Binutils, Coreutils, GCC, Glibc, Make, Sed
テストスイート依存パッケージ: テストスイートはありません
事前インストールパッケージ: なし
任意依存パッケージ: なし

Tar

インストール依存パッケージ: Bash, Binutils, Bison, Coreutils, GCC,
Gettext, Glibc, Grep, Inetutils, Make, Sed, Texinfo
テストスイート依存パッケージ: Diffutils, Findutils, Gawk, Gzip
事前インストールパッケージ: なし
任意依存パッケージ: なし

Tcl

インストール依存パッケージ: Bash, Binutils, Coreutils, Diffutils, GCC,
Glibc, Grep, Make, Sed
テストスイート依存パッケージ: なし
事前インストールパッケージ: なし
任意依存パッケージ: なし

Texinfo

インストール依存パッケージ: Bash, Binutils, Coreutils, GCC, Gettext,
Glibc, Grep, Make, Ncurses, Patch, Sed
テストスイート依存パッケージ: なし
事前インストールパッケージ: なし
任意依存パッケージ: なし

Udev

インストール依存パッケージ: Bash, Binutils, Coreutils, Diffutils, Gawk,
GCC, Glibc, Grep, Make, Sed
テストスイート依存パッケージ: テストスイートはありません
事前インストールパッケージ: なし
任意依存パッケージ: なし

Util-linux-ng

インストール依存パッケージ: Bash, Binutils, Coreutils, Diffutils,
Findutils, Gawk, GCC, Gettext, Glibc, Grep, Make, Ncurses, Sed, Zlib
テストスイート依存パッケージ: テストスイートはありません
事前インストールパッケージ: なし
任意依存パッケージ: なし

Vim

インストール依存パッケージ: Bash, Binutils, Coreutils, Diffutils, GCC,
Glibc, Grep, Make, Ncurses, Sed
テストスイート依存パッケージ: なし
事前インストールパッケージ: なし
任意依存パッケージ: Xorg, GTK+2, LessTif, Python, Tcl, Ruby, GPM

Zlib

インストール依存パッケージ: Bash, Binutils, Coreutils, GCC, Glibc,
Make, Sed
テストスイート依存パッケージ: なし
事前インストールパッケージ: File, Module-Init-Tools, Perl,
Util-linux-ng
任意依存パッケージ: なし

付録 D. ブートスクリプトと sysconfig スクリプト version-20100124

本付録に示すスクリプトは、それらが収容されているディレクトリごとに列記
します。 /etc/rc.d/init.d、 /etc/sysconfig、 /etc/sysconfig/
network-devices、 /etc/sysconfig/network-devices/services の順です。 各
ディレクトリにおいてのスクリプトは呼び出し順に説明します。

D.1. /etc/rc.d/init.d/rc

rc スクリプトは init によって呼び出される最初のスクリプトであり、ブート
処理を初期化します。

#!/bin/sh
########################################################################
# Begin $rc_base/init.d/rc
#
# Description : Main Run Level Control Script
#
# Authors     : Gerard Beekmans  - gerard AT linuxfromscratch D0T org
#
# Version     : 00.00
#
# Notes       :
#
########################################################################

. /etc/sysconfig/rc
. ${rc_functions}

# This sets a few default terminal options.
stty sane

# These 3 signals will not cause our script to exit
trap "" INT QUIT TSTP

[ "${1}" != "" ] && runlevel=${1}

if [ "${runlevel}" = "" ]; then
    echo "Usage: ${0} <runlevel>" >&2
    exit 1
fi

previous=${PREVLEVEL}
[ "${previous}" = "" ] && previous=N

if [ ! -d ${rc_base}/rc${runlevel}.d ]; then
    boot_mesg "${rc_base}/rc${runlevel}.d does not exist." ${WARNING}
    boot_mesg_flush
    exit 1
fi

# Attempt to stop all service started by previous runlevel,
# and killed in this runlevel
if [ "${previous}" != "N" ]; then
    for i in $(ls -v ${rc_base}/rc${runlevel}.d/K* 2> /dev/null)
    do
        check_script_status

        suffix=${i#$rc_base/rc$runlevel.d/K[0-9][0-9]}
        prev_start=$rc_base/rc$previous.d/S[0-9][0-9]$suffix
        sysinit_start=$rc_base/rcsysinit.d/S[0-9][0-9]$suffix

        if [ "${runlevel}" != "0" ] && [ "${runlevel}" != "6" ]; then
            if [ ! -f ${prev_start} ] && [ ! -f ${sysinit_start} ]; then
                boot_mesg -n "WARNING:\n\n${i} can't be" ${WARNING}
                boot_mesg -n " executed because it was not"
                boot_mesg -n " not started in the previous"
                boot_mesg -n " runlevel (${previous})."
                boot_mesg "" ${NORMAL}
                boot_mesg_flush
                continue
            fi
        fi
        ${i} stop
        error_value=${?}

        if [ "${error_value}" != "0" ]; then
            print_error_msg
        fi
    done
fi

#Start all functions in this runlevel
for i in $( ls -v ${rc_base}/rc${runlevel}.d/S* 2> /dev/null)
do
    if [ "${previous}" != "N" ]; then
        suffix=${i#$rc_base/rc$runlevel.d/S[0-9][0-9]}
        stop=$rc_base/rc$runlevel.d/K[0-9][0-9]$suffix
        prev_start=$rc_base/rc$previous.d/S[0-9][0-9]$suffix

        [ -f ${prev_start} ] && [ ! -f ${stop} ] && continue
    fi

    check_script_status

    case ${runlevel} in
        0|6)
            ${i} stop
            ;;
        *)
            ${i} start
            ;;
    esac
    error_value=${?}

    if [ "${error_value}" != "0" ]; then
        print_error_msg
    fi
done

# End $rc_base/init.d/rc

D.2. /etc/rc.d/init.d/functions

#!/bin/sh
########################################################################
# Begin $rc_base/init.d/functions
#
# Description : Run Level Control Functions
#
# Authors     : Gerard Beekmans - gerard AT linuxfromscratch D0T org
#
# Version     : 00.00
#
# Notes       : With code based on Matthias Benkmann's simpleinit-msb
#        http://winterdrache.de/linux/newboot/index.html
#
########################################################################

## Environmental setup
# Setup default values for environment
umask 022
export PATH="/bin:/usr/bin:/sbin:/usr/sbin"

# Signal sent to running processes to refresh their configuration
RELOADSIG="HUP"

# Number of seconds between STOPSIG and FALLBACK when stopping processes
KILLDELAY="3"

## Screen Dimensions
# Find current screen size
if [ -z "${COLUMNS}" ]; then
    COLUMNS=$(stty size)
    COLUMNS=${COLUMNS##* }
fi

# When using remote connections, such as a serial port, stty size returns 0
if [ "${COLUMNS}" = "0" ]; then
    COLUMNS=80
fi

## Measurements for positioning result messages
COL=$((${COLUMNS} - 8))
WCOL=$((${COL} - 2))

## Provide an echo that supports -e and -n
# If formatting is needed, $ECHO should be used
case "`echo -e -n test`" in
    -[en]*)
        ECHO=/bin/echo
        ;;
    *)
        ECHO=echo
        ;;
esac

## Set Cursor Position Commands, used via $ECHO
SET_COL="\\033[${COL}G"      # at the $COL char
SET_WCOL="\\033[${WCOL}G"    # at the $WCOL char
CURS_UP="\\033[1A\\033[0G"   # Up one line, at the 0'th char

## Set color commands, used via $ECHO
# Please consult `man console_codes for more information
# under the "ECMA-48 Set Graphics Rendition" section
#
# Warning: when switching from a 8bit to a 9bit font,
# the linux console will reinterpret the bold (1;) to
# the top 256 glyphs of the 9bit font.  This does
# not affect framebuffer consoles
NORMAL="\\033[0;39m"         # Standard console grey
SUCCESS="\\033[1;32m"        # Success is green
WARNING="\\033[1;33m"        # Warnings are yellow
FAILURE="\\033[1;31m"        # Failures are red
INFO="\\033[1;36m"           # Information is light cyan
BRACKET="\\033[1;34m"        # Brackets are blue

STRING_LENGTH="0"   # the length of the current message

#*******************************************************************************
# Function - boot_mesg()
#
# Purpose:      Sending information from bootup scripts to the console
#
# Inputs:       $1 is the message
#               $2 is the colorcode for the console
#
# Outputs:      Standard Output
#
# Dependencies: - sed for parsing strings.
#            - grep for counting string length.
#
# Todo:
#*******************************************************************************
boot_mesg()
{
    local ECHOPARM=""

    while true
    do
        case "${1}" in
            -n)
                ECHOPARM=" -n "
                shift 1
                ;;
            -*)
                echo "Unknown Option: ${1}"
                return 1
                ;;
            *)
                break
                ;;
        esac
    done

    ## Figure out the length of what is to be printed to be used
    ## for warning messages.
    STRING_LENGTH=$((${#1} + 1))

    # Print the message to the screen
    ${ECHO} ${ECHOPARM} -e "${2}${1}"

}

boot_mesg_flush()
{
    # Reset STRING_LENGTH for next message
    STRING_LENGTH="0"
}

boot_log()
{
    # Left in for backwards compatibility
    :
}

echo_ok()
{
    ${ECHO} -n -e "${CURS_UP}${SET_COL}${BRACKET}[${SUCCESS}  OK  ${BRACKET}]"
    ${ECHO} -e "${NORMAL}"
        boot_mesg_flush
}

echo_failure()
{
    ${ECHO} -n -e "${CURS_UP}${SET_COL}${BRACKET}[${FAILURE} FAIL ${BRACKET}]"
    ${ECHO} -e "${NORMAL}"
        boot_mesg_flush
}

echo_warning()
{
    ${ECHO} -n -e "${CURS_UP}${SET_COL}${BRACKET}[${WARNING} WARN ${BRACKET}]"
    ${ECHO} -e "${NORMAL}"
        boot_mesg_flush
}

print_error_msg()
{
    echo_failure
    # $i is inherited by the rc script
    boot_mesg -n "FAILURE:\n\nYou should not be reading this error message.\n\n" ${FAILURE}
    boot_mesg -n " It means that an unforeseen error took"
    boot_mesg -n " place in ${i}, which exited with a return value of"
    boot_mesg " ${error_value}.\n"
    boot_mesg_flush
    boot_mesg -n "If you're able to track this"
    boot_mesg -n " error down to a bug in one of the files provided by"
    boot_mesg -n " the LFS book, please be so kind to inform us at"
    boot_mesg " lfs-dev@linuxfromscratch.org.\n"
    boot_mesg_flush
    boot_mesg -n "Press Enter to continue..." ${INFO}
    boot_mesg "" ${NORMAL}
    read ENTER
}

check_script_status()
{
    # $i is inherited by the rc script
    if [ ! -f ${i} ]; then
        boot_mesg "${i} is not a valid symlink." ${WARNING}
        echo_warning
        continue
    fi

    if [ ! -x ${i} ]; then
        boot_mesg "${i} is not executable, skipping." ${WARNING}
        echo_warning
        continue
    fi
}

evaluate_retval()
{
    error_value="${?}"

    if [ ${error_value} = 0 ]; then
        echo_ok
    else
        echo_failure
    fi

    # This prevents the 'An Unexpected Error Has Occurred' from trivial
    # errors.
    return 0
}

print_status()
{
    if [ "${#}" = "0" ]; then
        echo "Usage: ${0} {success|warning|failure}"
        return 1
    fi

    case "${1}" in

        success)
            echo_ok
            ;;

        warning)
            # Leave this extra case in because old scripts
            # may call it this way.
            case "${2}" in
                running)
                    ${ECHO} -e -n "${CURS_UP}"
                    ${ECHO} -e -n "\\033[${STRING_LENGTH}G   "
                    boot_mesg "Already running." ${WARNING}
                    echo_warning
                    ;;
                not_running)
                    ${ECHO} -e -n "${CURS_UP}"
                    ${ECHO} -e -n "\\033[${STRING_LENGTH}G   "
                    boot_mesg "Not running." ${WARNING}
                    echo_warning
                    ;;
                not_available)
                    ${ECHO} -e -n "${CURS_UP}"
                    ${ECHO} -e -n "\\033[${STRING_LENGTH}G   "
                    boot_mesg "Not available." ${WARNING}
                    echo_warning
                    ;;
                *)
                    # This is how it is supposed to
                    # be called
                    echo_warning
                    ;;
            esac
        ;;

        failure)
            echo_failure
        ;;

    esac

}

reloadproc()
{
    local pidfile=""
    local failure=0

    while true
    do
        case "${1}" in
            -p)
                pidfile="${2}"
                shift 2
                ;;
            -*)
                log_failure_msg "Unknown Option: ${1}"
                return 2
                ;;
            *)
                break
                ;;
        esac
    done

    if [ "${#}" -lt "1" ]; then
        log_failure_msg "Usage: reloadproc [-p pidfile] pathname"
        return 2
    fi

    # This will ensure compatibility with previous LFS Bootscripts
    if [ -n "${PIDFILE}" ];    then
        pidfile="${PIDFILE}"
    fi

    # Is the process running?
    if [ -z "${pidfile}" ];    then
        pidofproc -s "${1}"
    else
        pidofproc -s -p "${pidfile}" "${1}"
    fi

    # Warn about stale pid file
    if [ "$?" = 1 ]; then
        boot_mesg -n "Removing stale pid file: ${pidfile}. " ${WARNING}
        rm -f "${pidfile}"
    fi

    if [ -n "${pidlist}" ];    then
        for pid in ${pidlist}
        do
            kill -"${RELOADSIG}" "${pid}" || failure="1"
        done

        (exit ${failure})
        evaluate_retval

    else
        boot_mesg "Process ${1} not running." ${WARNING}
        echo_warning
    fi
}

statusproc()
{
    local pidfile=""
    local base=""
    local ret=""

    while true
    do
        case "${1}" in
            -p)
                pidfile="${2}"
                shift 2
                ;;
            -*)
                log_failure_msg "Unknown Option: ${1}"
                return 2
                ;;
            *)
                break
                ;;
        esac
    done

    if [ "${#}" != "1" ]; then
        shift 1
        log_failure_msg "Usage: statusproc [-p pidfile] pathname"
        return 2
    fi

    # Get the process basename
    base="${1##*/}"

    # This will ensure compatibility with previous LFS Bootscripts
    if [ -n "${PIDFILE}" ];    then
        pidfile="${PIDFILE}"
    fi

    # Is the process running?
    if [ -z "${pidfile}" ];    then
        pidofproc -s "${1}"
    else
        pidofproc -s -p "${pidfile}" "${1}"
    fi

    # Store the return status
    ret=$?

    if [ -n "${pidlist}" ];    then
        ${ECHO} -e "${INFO}${base} is running with Process"\
            "ID(s) ${pidlist}.${NORMAL}"
    else
        if [ -n "${base}" -a -e "/var/run/${base}.pid" ]; then
            ${ECHO} -e "${WARNING}${1} is not running but"\
                "/var/run/${base}.pid exists.${NORMAL}"
        else
            if [ -n "${pidfile}" -a -e "${pidfile}" ]; then
                ${ECHO} -e "${WARNING}${1} is not running"\
                    "but ${pidfile} exists.${NORMAL}"
            else
                ${ECHO} -e "${INFO}${1} is not running.${NORMAL}"
            fi
        fi
    fi

    # Return the status from pidofproc
    return $ret
}

# The below functions are documented in the LSB-generic 2.1.0

#*******************************************************************************
# Function - pidofproc [-s] [-p pidfile] pathname
#
# Purpose: This function returns one or more pid(s) for a particular daemon
#
# Inputs: -p pidfile, use the specified pidfile instead of pidof
#         pathname, path to the specified program
#
# Outputs: return 0 - Success, pid's in stdout
#          return 1 - Program is dead, pidfile exists
#          return 2 - Invalid or excessive number of arguments,
#                     warning in stdout
#          return 3 - Program is not running
#
# Dependencies: pidof, echo, head
#
# Todo: Remove dependency on head
#       This replaces getpids
#       Test changes to pidof
#
#*******************************************************************************
pidofproc()
{
    local pidfile=""
    local lpids=""
    local silent=""
    pidlist=""
    while true
    do
        case "${1}" in
            -p)
                pidfile="${2}"
                shift 2
                ;;

            -s)
                # Added for legacy opperation of getpids
                # eliminates several '> /dev/null'
                silent="1"
                shift 1
                ;;
            -*)
                log_failure_msg "Unknown Option: ${1}"
                return 2
                ;;
            *)
                break
                ;;
        esac
    done

    if [ "${#}" != "1" ]; then
        shift 1
        log_failure_msg "Usage: pidofproc [-s] [-p pidfile] pathname"
        return 2
    fi

    if [ -n "${pidfile}" ]; then
        if [ ! -r "${pidfile}" ]; then
            return 3 # Program is not running
        fi

        lpids=`head -n 1 ${pidfile}`
        for pid in ${lpids}
        do
            if [ "${pid}" -ne "$$" -a "${pid}" -ne "${PPID}" ]; then
                kill -0 "${pid}" 2>/dev/null &&
                pidlist="${pidlist} ${pid}"
            fi

            if [ "${silent}" != "1" ]; then
                echo "${pidlist}"
            fi

            test -z "${pidlist}" &&
            # Program is dead, pidfile exists
            return 1
            # else
            return 0
        done

    else
        pidlist=`pidof -o $$ -o $PPID -x "$1"`
        if [ "${silent}" != "1" ]; then
            echo "${pidlist}"
        fi

        # Get provide correct running status
        if [ -n "${pidlist}" ]; then
            return 0
        else
            return 3
        fi

    fi

    if [ "$?" != "0" ]; then
        return 3 # Program is not running
    fi
}

#*******************************************************************************
# Function - loadproc [-f] [-n nicelevel] [-p pidfile] pathname [args]
#
# Purpose: This runs the specified program as a daemon
#
# Inputs: -f, run the program even if it is already running
#         -n nicelevel, specifies a nice level. See nice(1).
#         -p pidfile, uses the specified pidfile
#         pathname, pathname to the specified program
#         args, arguments to pass to specified program
#
# Outputs: return 0 - Success
#          return 2 - Invalid of excessive number of arguments,
#                     warning in stdout
#          return 4 - Program or service status is unknown
#
# Dependencies: nice, rm
#
# Todo: LSB says this should be called start_daemon
#       LSB does not say that it should call evaluate_retval
#       It checks for PIDFILE, which is deprecated.
#         Will be removed after BLFS 6.0
#       loadproc returns 0 if program is already running, not LSB compliant
#
#*******************************************************************************
loadproc()
{
    local pidfile=""
    local forcestart=""
    local nicelevel="10"

# This will ensure compatibility with previous LFS Bootscripts
    if [ -n "${PIDFILE}" ];    then
        pidfile="${PIDFILE}"
    fi

  while true
    do
        case "${1}" in
            -f)
                forcestart="1"
                shift 1
                ;;
            -n)
                nicelevel="${2}"
                shift 2
                ;;
            -p)
                pidfile="${2}"
                shift 2
                ;;
            -*)
                log_failure_msg "Unknown Option: ${1}"
                return 2 #invalid or excess argument(s)
                ;;
            *)
                break
                ;;
        esac
    done

    if [ "${#}" = "0" ]; then
        log_failure_msg "Usage: loadproc [-f] [-n nicelevel] [-p pidfile] pathname [args]"
        return 2 #invalid or excess argument(s)
    fi

    if [ -z "${forcestart}" ]; then
        if [ -z "${pidfile}" ];    then
            pidofproc -s "${1}"
        else
            pidofproc -s -p "${pidfile}" "${1}"
        fi

        case "${?}" in
            0)
                log_warning_msg "Unable to continue: ${1} is running"
                return 0 # 4
                ;;
            1)
                boot_mesg "Removing stale pid file: ${pidfile}" ${WARNING}
                rm -f "${pidfile}"
                ;;
            3)
                ;;
            *)
                log_failure_msg "Unknown error code from pidofproc: ${?}"
                return 4
                ;;
        esac
    fi

    nice -n "${nicelevel}" "${@}"
    evaluate_retval # This is "Probably" not LSB compliant,
#                         but required to be compatible with older bootscripts
    return 0
}

#*******************************************************************************
# Function - killproc  [-p pidfile] pathname [signal]
#
# Purpose:
#
# Inputs: -p pidfile, uses the specified pidfile
#         pathname, pathname to the specified program
#         signal, send this signal to pathname
#
# Outputs: return 0 - Success
#          return 2 - Invalid of excessive number of arguments,
#                     warning in stdout
#          return 4 - Unknown Status
#
# Dependencies: kill, rm
#
# Todo: LSB does not say that it should call evaluate_retval
#       It checks for PIDFILE, which is deprecated.
#         Will be removed after BLFS 6.0
#
#*******************************************************************************
killproc()
{
    local pidfile=""
    local killsig=TERM # default signal is SIGTERM
    pidlist=""

    # This will ensure compatibility with previous LFS Bootscripts
    if [ -n "${PIDFILE}" ];    then
        pidfile="${PIDFILE}"
    fi

    while true
    do
        case "${1}" in
            -p)
                pidfile="${2}"
                shift 2
                ;;
            -*)
                log_failure_msg "Unknown Option: ${1}"
                return 2
                ;;
            *)
                 break
                ;;
        esac
    done

    if [ "${#}" = "2" ]; then
        killsig="${2}"
    elif [ "${#}" != "1" ];    then
        shift 2
        log_failure_msg "Usage: killproc  [-p pidfile] pathname [signal]"
        return 2
    fi

    # Is the process running?
    if [ -z "${pidfile}" ];    then
        pidofproc -s "${1}"
    else
        pidofproc -s -p "${pidfile}" "${1}"
    fi

    # Remove stale pidfile
    if [ "$?" = 1 ]; then
        boot_mesg "Removing stale pid file: ${pidfile}." ${WARNING}
        rm -f "${pidfile}"
    fi

    # If running, send the signal
    if [ -n "${pidlist}" ]; then
    for pid in ${pidlist}
    do
        kill -${killsig} ${pid} 2>/dev/null

        # Wait up to 3 seconds, for ${pid} to terminate
        case "${killsig}" in
        TERM|SIGTERM|KILL|SIGKILL)
            # sleep in 1/10ths of seconds and
            # multiply KILLDELAY by 10
            local dtime="${KILLDELAY}0"
            while [ "${dtime}" != "0" ]
            do
                kill -0 ${pid} 2>/dev/null || break
                sleep 0.1
                dtime=$(( ${dtime} - 1))
            done
            # If ${pid} is still running, kill it
            kill -0 ${pid} 2>/dev/null && kill -KILL ${pid} 2>/dev/null
            ;;
        esac
    done

    # Check if the process is still running if we tried to stop it
    case "${killsig}" in
    TERM|SIGTERM|KILL|SIGKILL)
        if [ -z "${pidfile}" ];    then
            pidofproc -s "${1}"
        else
            pidofproc -s -p "${pidfile}" "${1}"
        fi

        # Program was terminated
        if [ "$?" != "0" ]; then
            # Remove the pidfile if necessary
            if [ -f "${pidfile}" ];    then
                rm -f "${pidfile}"
            fi
            echo_ok
            return 0
        else # Program is still running
            echo_failure
            return 4 # Unknown Status
        fi
        ;;
    *)
        # Just see if the kill returned successfully
        evaluate_retval
        ;;
    esac
    else # process not running
    print_status warning not_running
    fi
}


#*******************************************************************************
# Function - log_success_msg "message"
#
# Purpose: Print a success message
#
# Inputs: $@ - Message
#
# Outputs: Text output to screen
#
# Dependencies: echo
#
# Todo: logging
#
#*******************************************************************************
log_success_msg()
{
    ${ECHO} -n -e "${BOOTMESG_PREFIX}${@}"
    ${ECHO} -e "${SET_COL}""${BRACKET}""[""${SUCCESS}""  OK  ""${BRACKET}""]""${NORMAL}"
    return 0
}

#*******************************************************************************
# Function - log_failure_msg "message"
#
# Purpose: Print a failure message
#
# Inputs: $@ - Message
#
# Outputs: Text output to screen
#
# Dependencies: echo
#
# Todo: logging
#
#*******************************************************************************
log_failure_msg() {
    ${ECHO} -n -e "${BOOTMESG_PREFIX}${@}"
    ${ECHO} -e "${SET_COL}""${BRACKET}""[""${FAILURE}"" FAIL ""${BRACKET}""]""${NORMAL}"
    return 0
}

#*******************************************************************************
# Function - log_warning_msg "message"
#
# Purpose: print a warning message
#
# Inputs: $@ - Message
#
# Outputs: Text output to screen
#
# Dependencies: echo
#
# Todo: logging
#
#*******************************************************************************
log_warning_msg() {
    ${ECHO} -n -e "${BOOTMESG_PREFIX}${@}"
    ${ECHO} -e "${SET_COL}""${BRACKET}""[""${WARNING}"" WARN ""${BRACKET}""]""${NORMAL}"
    return 0
}

# End $rc_base/init.d/functions

D.3. /etc/rc.d/init.d/mountkernfs

#!/bin/sh
########################################################################
# Begin $rc_base/init.d/mountkernfs
#
# Description : Mount proc and sysfs
#
# Authors     : Gerard Beekmans - gerard AT linuxfromscratch D0T org
#
# Version     : 00.00
#
# Notes       :
#
########################################################################

. /etc/sysconfig/rc
. ${rc_functions}

case "${1}" in
    start)
        boot_mesg -n "Mounting kernel-based file systems:" ${INFO}

        if ! mountpoint /proc >/dev/null; then
            boot_mesg -n " /proc" ${NORMAL}
            mount -n /proc || failed=1
        fi

        if ! mountpoint /sys >/dev/null; then
            boot_mesg -n " /sys" ${NORMAL}
            mount -n /sys || failed=1
        fi

        boot_mesg "" ${NORMAL}

        (exit ${failed})
        evaluate_retval
        ;;

    *)
        echo "Usage: ${0} {start}"
        exit 1
        ;;
esac

# End $rc_base/init.d/mountkernfs

D.4. /etc/rc.d/init.d/consolelog

#!/bin/sh
# Begin $rc_base/init.d/consolelog

########################################################################
#
# Description : Set the kernel log level for the console
#
# Authors     : Dan Nicholson - dnicholson AT linuxfromscratch D0T org
#
# Version     : 00.00
#
# Notes       : /proc must be mounted before this can run
#
########################################################################

. /etc/sysconfig/rc
. ${rc_functions}

# set the default loglevel
LOGLEVEL=7
if [ -r /etc/sysconfig/console ]; then
    . /etc/sysconfig/console
fi

case "${1}" in
    start)
        case "$LOGLEVEL" in
        [1-8])
            boot_mesg "Setting the console log level to ${LOGLEVEL}..."
            dmesg -n $LOGLEVEL
            evaluate_retval
            ;;
        *)
            boot_mesg "Console log level '${LOGLEVEL}' is invalid" ${FAILURE}
            echo_failure
            ;;
        esac
        ;;
    status)
        # Read the current value if possible
        if [ -r /proc/sys/kernel/printk ]; then
            read level line < /proc/sys/kernel/printk
        else
            boot_mesg "Can't read the current console log level" ${FAILURE}
            echo_failure
        fi

        # Print the value
        if [ -n "$level" ]; then
            ${ECHO} -e "${INFO}The current console log level" \
                "is ${level}${NORMAL}"
        fi
        ;;

    *)
        echo "Usage: ${0} {start|status}"
        exit 1
        ;;
esac

# End $rc_base/init.d/consolelog

D.5. /etc/rc.d/init.d/modules

#!/bin/sh
########################################################################
# Begin $rc_base/init.d/modules
#
# Description : Module auto-loading script
#
# Authors     : Zack Winkles
#
# Version     : 00.00
#
# Notes       :
#
########################################################################

. /etc/sysconfig/rc
. ${rc_functions}

# Assure that the kernel has module support.
[ -e /proc/ksyms -o -e /proc/modules ] || exit 0

case "${1}" in
    start)

        # Exit if there's no modules file or there are no
        # valid entries
        [ -r /etc/sysconfig/modules ] &&
            egrep -qv '^($|#)' /etc/sysconfig/modules ||
            exit 0

        boot_mesg -n "Loading modules:" ${INFO}

        # Only try to load modules if the user has actually given us
        # some modules to load.
        while read module args; do

            # Ignore comments and blank lines.
            case "$module" in
                ""|"#"*) continue ;;
            esac

            # Attempt to load the module, making
            # sure to pass any arguments provided.
            modprobe ${module} ${args} >/dev/null

            # Print the module name if successful,
            # otherwise take note.
            if [ $? -eq 0 ]; then
                boot_mesg -n " ${module}" ${NORMAL}
            else
                failedmod="${failedmod} ${module}"
            fi
        done < /etc/sysconfig/modules

        boot_mesg "" ${NORMAL}
        # Print a message about successfully loaded
        # modules on the correct line.
        echo_ok

        # Print a failure message with a list of any
        # modules that may have failed to load.
        if [ -n "${failedmod}" ]; then
            boot_mesg "Failed to load modules:${failedmod}" ${FAILURE}
            echo_failure
        fi
        ;;
    *)
        echo "Usage: ${0} {start}"
        exit 1
        ;;
esac

# End $rc_base/init.d/modules

D.6. /etc/rc.d/init.d/udev

#!/bin/sh
########################################################################
# Begin $rc_base/init.d/udev
#
# Description : Udev cold-plugging script
#
# Authors     : Zack Winkles, Alexander E. Patrakov
#
# Version     : 00.02
#
# Notes       :
#
########################################################################

. /etc/sysconfig/rc
. ${rc_functions}

case "${1}" in
    start)
        boot_mesg "Populating /dev with device nodes..."
        if ! grep -q '[[:space:]]sysfs' /proc/mounts; then
            echo_failure
            boot_mesg -n "FAILURE:\n\nUnable to create" ${FAILURE}
            boot_mesg -n " devices without a SysFS filesystem"
            boot_mesg -n "\n\nAfter you press Enter, this system"
            boot_mesg -n " will be halted and powered off."
            boot_mesg -n "\n\nPress Enter to continue..." ${INFO}
            boot_mesg "" ${NORMAL}
            read ENTER
            /etc/rc.d/init.d/halt stop
        fi

        # Mount a temporary file system over /dev, so that any devices
        # made or removed during this boot don't affect the next one.
        # The reason we don't write to mtab is because we don't ever
        # want /dev to be unavailable (such as by `umount -a').
        if ! mountpoint /dev > /dev/null; then
            mount -n -t tmpfs tmpfs /dev -o mode=755
        fi
        if [ ${?} != 0 ]; then
            echo_failure
            boot_mesg -n "FAILURE:\n\nCannot mount a tmpfs" ${FAILURE}
            boot_mesg -n " onto /dev, this system will be halted."
            boot_mesg -n "\n\nAfter you press Enter, this system"
            boot_mesg -n " will be halted and powered off."
            boot_mesg -n "\n\nPress Enter to continue..." ${INFO}
            boot_mesg "" ${NORMAL}
            read ENTER
            /etc/rc.d/init.d/halt stop
        fi

        # Udev handles uevents itself, so we don't need to have
        # the kernel call out to any binary in response to them
        echo > /proc/sys/kernel/hotplug

        # Copy static device nodes to /dev
        cp -a /lib/udev/devices/* /dev

        # Start the udev daemon to continually watch for, and act on,
        # uevents
        /sbin/udevd --daemon

        # Now traverse /sys in order to "coldplug" devices that have
        # already been discovered
        /sbin/udevadm trigger

        # Now wait for udevd to process the uevents we triggered
        /sbin/udevadm settle
        evaluate_retval

        ;;

    *)
        echo "Usage ${0} {start}"
        exit 1
        ;;
esac

# End $rc_base/init.d/udev

D.7. /etc/rc.d/init.d/swap

#!/bin/sh
########################################################################
# Begin $rc_base/init.d/swap
#
# Description : Swap Control Script
#
# Authors     : Gerard Beekmans - gerard AT linuxfromscratch D0T org
#
# Version     : 00.00
#
# Notes       :
#
########################################################################

. /etc/sysconfig/rc
. ${rc_functions}

case "${1}" in
    start)
        boot_mesg "Activating all swap files/partitions..."
        swapon -a
        evaluate_retval
        ;;

    stop)
        boot_mesg "Deactivating all swap files/partitions..."
        swapoff -a
        evaluate_retval
        ;;

    restart)
        ${0} stop
        sleep 1
        ${0} start
        ;;

    status)
        boot_mesg "Retrieving swap status." ${INFO}
        echo_ok
        echo
        swapon -s
        ;;

    *)
        echo "Usage: ${0} {start|stop|restart|status}"
        exit 1
        ;;
esac

# End $rc_base/init.d/swap

D.8. /etc/rc.d/init.d/setclock

#!/bin/sh
########################################################################
# Begin $rc_base/init.d/setclock
#
# Description : Setting Linux Clock
#
# Authors     : Gerard Beekmans - gerard AT linuxfromscratch D0T org
#
# Version     : 00.00
#
# Notes       :
#
########################################################################

. /etc/sysconfig/rc
. ${rc_functions}
. /etc/sysconfig/clock

case "${UTC}" in
    yes|true|1)
        CLOCKPARAMS="${CLOCKPARAMS} --utc"
        ;;

    no|false|0)
        CLOCKPARAMS="${CLOCKPARAMS} --localtime"
        ;;

esac

case ${1} in
    start)
        boot_mesg "Setting system clock..."
        hwclock --hctosys ${CLOCKPARAMS} >/dev/null
        evaluate_retval
        ;;

    stop)
        boot_mesg "Setting hardware clock..."
        hwclock --systohc ${CLOCKPARAMS} >/dev/null
        evaluate_retval
        ;;

    *)
        echo "Usage: ${0} {start|stop}"
        ;;

esac

D.9. /etc/rc.d/init.d/checkfs

#!/bin/sh
########################################################################
# Begin $rc_base/init.d/checkfs
#
# Description : File System Check
#
# Authors     : Gerard Beekmans - gerard AT linuxfromscratch D0T org
#               A. Luebke - luebke@users.sourceforge.net
#
# Version     : 00.00
#
# Notes       :
#
# Based on checkfs script from LFS-3.1 and earlier.
#
# From man fsck
# 0    - No errors
# 1    - File system errors corrected
# 2    - System should be rebooted
# 4    - File system errors left uncorrected
# 8    - Operational error
# 16   - Usage or syntax error
# 32   - Fsck canceled by user request
# 128  - Shared library error
#
#########################################################################

. /etc/sysconfig/rc
. ${rc_functions}

case "${1}" in
    start)
        if [ -f /fastboot ]; then
            boot_mesg -n "/fastboot found, will not perform" ${INFO}
            boot_mesg " file system checks as requested."
            echo_ok
            exit 0
        fi

        boot_mesg "Mounting root file system in read-only mode..."
        mount -n -o remount,ro / >/dev/null
        evaluate_retval

        if [ ${?} != 0 ]; then
            echo_failure
            boot_mesg -n "FAILURE:\n\nCannot check root" ${FAILURE}
            boot_mesg -n " filesystem because it could not be mounted"
            boot_mesg -n " in read-only mode.\n\nAfter you"
            boot_mesg -n " press Enter, this system will be"
            boot_mesg -n " halted and powered off."
            boot_mesg -n "\n\nPress enter to continue..." ${INFO}
            boot_mesg "" ${NORMAL}
            read ENTER
            ${rc_base}/init.d/halt stop
        fi

        if [ -f /forcefsck ]; then
            boot_mesg -n "/forcefsck found, forcing file" ${INFO}
            boot_mesg " system checks as requested."
            echo_ok
            options="-f"
        else
            options=""
        fi

        boot_mesg "Checking file systems..."
        # Note: -a option used to be -p; but this fails e.g.
        # on fsck.minix
        fsck ${options} -a -A -C -T
        error_value=${?}

        if [ "${error_value}" = 0 ]; then
            echo_ok
        fi

        if [ "${error_value}" = 1 ]; then
            echo_warning
            boot_mesg -n "WARNING:\n\nFile system errors" ${WARNING}
            boot_mesg -n " were found and have been corrected."
            boot_mesg -n "  You may want to double-check that"
            boot_mesg -n " everything was fixed properly."
            boot_mesg "" ${NORMAL}
        fi

        if [ "${error_value}" = 2 -o "${error_value}" = 3 ]; then
            echo_warning
            boot_mesg -n "WARNING:\n\nFile system errors" ${WARNING}
            boot_mesg -n " were found and have been been"
            boot_mesg -n " corrected, but the nature of the"
            boot_mesg -n " errors require this system to be"
            boot_mesg -n " rebooted.\n\nAfter you press enter,"
            boot_mesg -n " this system will be rebooted"
            boot_mesg -n "\n\nPress Enter to continue..." ${INFO}
            boot_mesg "" ${NORMAL}
            read ENTER
            reboot -f
        fi

        if [ "${error_value}" -gt 3 -a "${error_value}" -lt 16 ]; then
            echo_failure
            boot_mesg -n "FAILURE:\n\nFile system errors" ${FAILURE}
            boot_mesg -n " were encountered that could not be"
            boot_mesg -n " fixed automatically.  This system"
            boot_mesg -n " cannot continue to boot and will"
            boot_mesg -n " therefore be halted until those"
            boot_mesg -n " errors are fixed manually by a"
            boot_mesg -n " System Administrator.\n\nAfter you"
            boot_mesg -n " press Enter, this system will be"
            boot_mesg -n " halted and powered off."
            boot_mesg -n "\n\nPress Enter to continue..." ${INFO}
            boot_mesg "" ${NORMAL}
            read ENTER
          ${rc_base}/init.d/halt stop
        fi

        if [ "${error_value}" -ge 16 ]; then
            echo_failure
            boot_mesg -n "FAILURE:\n\nUnexpected Failure" ${FAILURE}
            boot_mesg -n " running fsck.  Exited with error"
            boot_mesg -n " code: ${error_value}."
            boot_mesg "" ${NORMAL}
            exit ${error_value}
        fi
        ;;
    *)
        echo "Usage: ${0} {start}"
        exit 1
        ;;
esac

# End $rc_base/init.d/checkfs

D.10. /etc/rc.d/init.d/mountfs

#!/bin/sh
########################################################################
# Begin $rc_base/init.d/mountfs
#
# Description : File System Mount Script
#
# Authors     : Gerard Beekmans - gerard AT linuxfromscratch D0T org
#
# Version     : 00.00
#
# Notes       :
#
########################################################################

. /etc/sysconfig/rc
. ${rc_functions}

case "${1}" in
    start)
        boot_mesg "Remounting root file system in read-write mode..."
        mount -n -o remount,rw / >/dev/null
        evaluate_retval

        # Remove fsck-related file system watermarks.
        rm -f /fastboot /forcefsck

        boot_mesg "Recording existing mounts in /etc/mtab..."
        > /etc/mtab
        mount -f / || failed=1
        mount -f /proc || failed=1
        mount -f /sys || failed=1
        (exit ${failed})
        evaluate_retval

        # This will mount all filesystems that do not have _netdev in
        # their option list.  _netdev denotes a network filesystem.
        boot_mesg "Mounting remaining file systems..."
        mount -a -O no_netdev >/dev/null
        evaluate_retval
        ;;

    stop)
        boot_mesg "Unmounting all other currently mounted file systems..."
        umount -a -d -r >/dev/null
        evaluate_retval
        ;;

    *)
        echo "Usage: ${0} {start|stop}"
        exit 1
        ;;
esac

# End $rc_base/init.d/mountfs

D.11. /etc/rc.d/init.d/udev_retry

#!/bin/sh
########################################################################
# Begin $rc_base/init.d/udev_retry
#
# Description : Udev cold-plugging script (retry)
#
# Authors     : Alexander E. Patrakov
#
# Version     : 00.02
#
# Notes       :
#
########################################################################

. /etc/sysconfig/rc
. ${rc_functions}

case "${1}" in
    start)
        boot_mesg "Retrying failed uevents, if any..."

        # From Debian: "copy the rules generated before / was mounted
        # read-write":
        for file in /dev/.udev/tmp-rules--*; do
            dest=${file##*tmp-rules--}
            [ "$dest" = '*' ] && break
            cat $file >> /etc/udev/rules.d/$dest
            rm -f $file
        done

        # Re-trigger the failed uevents in hope they will succeed now
        /sbin/udevadm trigger --type=failed

        # Now wait for udevd to process the uevents we triggered
        /sbin/udevadm settle
        evaluate_retval
        ;;

    *)
        echo "Usage ${0} {start}"
        exit 1
        ;;
esac

# End $rc_base/init.d/udev_retry

D.12. /etc/rc.d/init.d/cleanfs

#!/bin/sh
########################################################################
# Begin $rc_base/init.d/cleanfs
#
# Description : Clean file system
#
# Authors     : Gerard Beekmans - gerard AT linuxfromscratch D0T org
#
# Version     : 00.00
#
# Notes       :
#
########################################################################

. /etc/sysconfig/rc
. ${rc_functions}

# Function to create files/directory on boot.
create_files() {
    # Read in the configuration file.
    exec 9>&0 < /etc/sysconfig/createfiles
        while read name type perm usr grp dtype maj min junk
        do

            # Ignore comments and blank lines.
                   case "${name}" in
                ""|\#*) continue ;;
            esac

            # Ignore existing files.
            if [ ! -e "${name}" ]; then
                # Create stuff based on its type.
                case "${type}" in
                    dir)
                        mkdir "${name}"
                        ;;
                    file)
                        :> "${name}"
                        ;;
                    dev)
                        case "${dtype}" in
                            char)
                                mknod "${name}" c ${maj} ${min}
                                ;;
                            block)
                                mknod "${name}" b ${maj} ${min}
                                ;;
                            pipe)
                                mknod "${name}" p
                                ;;
                            *)
                                boot_mesg -n "\nUnknown device type: ${dtype}" ${WARNING}
                                boot_mesg "" ${NORMAL}
                                ;;
                        esac
                        ;;
                    *)
                        boot_mesg -n "\nUnknown type: ${type}" ${WARNING}
                        boot_mesg "" ${NORMAL}
                        continue
                        ;;
                esac

                # Set up the permissions, too.
                chown ${usr}:${grp} "${name}"
                chmod ${perm} "${name}"
            fi
        done
    exec 0>&9 9>&-
}

case "${1}" in
    start)
        boot_mesg -n "Cleaning file systems:" ${INFO}

        boot_mesg -n " /tmp" ${NORMAL}
        cd /tmp &&
        find . -xdev -mindepth 1 ! -name lost+found \
            -delete || failed=1

        boot_mesg -n " /var/lock" ${NORMAL}
        cd /var/lock &&
        find . -type f -exec rm -f {} \; || failed=1

        boot_mesg " /var/run" ${NORMAL}
        cd /var/run &&
        find . ! -type d ! -name utmp \
            -exec rm -f {} \; || failed=1
        > /var/run/utmp
        if grep -q '^utmp:' /etc/group ; then
            chmod 664 /var/run/utmp
            chgrp utmp /var/run/utmp
        fi

        (exit ${failed})
        evaluate_retval

        if egrep -qv '^(#|$)' /etc/sysconfig/createfiles 2>/dev/null; then
            boot_mesg "Creating files and directories..."
            create_files
            evaluate_retval
        fi
        ;;
    *)
        echo "Usage: ${0} {start}"
        exit 1
        ;;
esac

# End $rc_base/init.d/cleanfs

D.13. /etc/rc.d/init.d/console

#!/bin/sh
########################################################################
# Begin $rc_base/init.d/console
#
# Description : Sets keymap and screen font
#
# Authors     : Gerard Beekmans - gerard AT linuxfromscratch D0T org
#        Alexander E. Patrakov
#
# Version     : 00.03
#
# Notes       :
#
########################################################################

. /etc/sysconfig/rc
. ${rc_functions}

# Native English speakers probably don't have /etc/sysconfig/console at all
if [ -f /etc/sysconfig/console ]
then
    . /etc/sysconfig/console
else
        exit 0
fi

is_true() {
    [ "$1" = "1" ] || [ "$1" = "yes" ] || [ "$1" = "true" ]
}

failed=0

case "${1}" in
    start)
        boot_mesg "Setting up Linux console..."
        # There should be no bogus failures below this line!

        # Figure out if a framebuffer console is used
        [ -d /sys/class/graphics/fb0 ] && USE_FB=1 || USE_FB=0

        # Figure out the command to set the console into the
        # desired mode
        is_true "${UNICODE}" &&
            MODE_COMMAND="${ECHO} -en '\033%G' && kbd_mode -u" ||
            MODE_COMMAND="${ECHO} -en '\033%@\033(K' && kbd_mode -a"

        # On framebuffer consoles, font has to be set for each vt in
        # UTF-8 mode. This doesn't hurt in non-UTF-8 mode also.

        ! is_true "${USE_FB}" || [ -z "${FONT}" ] ||
            MODE_COMMAND="${MODE_COMMAND} && setfont ${FONT}"

        # Apply that command to all consoles mentioned in
        # /etc/inittab. Important: in the UTF-8 mode this should
        # happen before setfont, otherwise a kernel bug will
        # show up and the unicode map of the font will not be
        # used.
        # FIXME: Fedora Core also initializes two spare consoles
        # - do we want that?

        for TTY in `grep '^[^#].*respawn:/sbin/agetty' /etc/inittab |
            grep -o '\btty[[:digit:]]*\b'`
        do
            openvt -f -w -c ${TTY#tty} -- \
                /bin/sh -c "${MODE_COMMAND}" || failed=1
        done

        # Set the font (if not already set above) and the keymap
        is_true "${USE_FB}" || [ -z "${FONT}" ] ||
            setfont $FONT ||
            failed=1
        [ -z "${KEYMAP}" ] ||
            loadkeys ${KEYMAP} >/dev/null 2>&1 ||
            failed=1
        [ -z "${KEYMAP_CORRECTIONS}" ] ||
            loadkeys ${KEYMAP_CORRECTIONS} >/dev/null 2>&1 ||
            failed=1

        # Convert the keymap from $LEGACY_CHARSET to UTF-8
        [ -z "$LEGACY_CHARSET" ] ||
            dumpkeys -c "$LEGACY_CHARSET" |
            loadkeys -u >/dev/null 2>&1 ||
            failed=1

        # If any of the commands above failed, the trap at the
        # top would set $failed to 1
        ( exit $failed )
        evaluate_retval
        ;;
    *)
        echo $"Usage:" "${0} {start}"
        exit 1
        ;;
esac

# End $rc_base/init.d/console

D.14. /etc/rc.d/init.d/localnet

#!/bin/sh
########################################################################
# Begin $rc_base/init.d/localnet
#
# Description : Loopback device
#
# Authors     : Gerard Beekmans  - gerard AT linuxfromscratch D0T org
#
# Version     : 00.00
#
# Notes       :
#
########################################################################

. /etc/sysconfig/rc
. ${rc_functions}
. /etc/sysconfig/network

case "${1}" in
    start)
        boot_mesg "Bringing up the loopback interface..."
        ip addr add 127.0.0.1/8 label lo dev lo
        ip link set lo up
        evaluate_retval

        boot_mesg "Setting hostname to ${HOSTNAME}..."
        hostname ${HOSTNAME}
        evaluate_retval
        ;;

    stop)
        boot_mesg "Bringing down the loopback interface..."
        ip link set lo down
        evaluate_retval
        ;;

    restart)
        ${0} stop
        sleep 1
        ${0} start
        ;;

    status)
        echo "Hostname is: $(hostname)"
        ip link show lo
        ;;

    *)
        echo "Usage: ${0} {start|stop|restart|status}"
        exit 1
        ;;
esac

# End $rc_base/init.d/localnet

D.15. /etc/rc.d/init.d/sysctl

#!/bin/sh
########################################################################
# Begin $rc_base/init.d/sysctl
#
# Description : File uses /etc/sysctl.conf to set kernel runtime
#               parameters
#
# Authors     : Nathan Coulson (nathan AT linuxfromscratch D0T org)
#               Matthew Burgress (matthew AT linuxfromscratch D0T org)
#
# Version     : 00.00
#
# Notes       :
#
########################################################################

. /etc/sysconfig/rc
. ${rc_functions}

case "${1}" in
    start)
        if [ -f "/etc/sysctl.conf" ]; then
            boot_mesg "Setting kernel runtime parameters..."
            sysctl -q -p
            evaluate_retval
        fi
        ;;

    status)
        sysctl -a
        ;;

    *)
        echo "Usage: ${0} {start|status}"
        exit 1
        ;;
esac

# End $rc_base/init.d/sysctl

D.16. /etc/rc.d/init.d/sysklogd

#!/bin/sh
########################################################################
# Begin $rc_base/init.d/sysklogd
#
# Description : Sysklogd loader
#
# Authors     : Gerard Beekmans - gerard AT linuxfromscratch D0T org
#
# Version     : 00.00
#
# Notes       :
#
########################################################################

. /etc/sysconfig/rc
. ${rc_functions}

case "${1}" in
    start)
        boot_mesg "Starting system log daemon..."
        loadproc syslogd -m 0

        boot_mesg "Starting kernel log daemon..."
        loadproc klogd
        ;;

    stop)
        boot_mesg "Stopping kernel log daemon..."
        killproc klogd

        boot_mesg "Stopping system log daemon..."
        killproc syslogd
        ;;

    reload)
        boot_mesg "Reloading system log daemon config file..."
        reloadproc syslogd
        ;;

    restart)
        ${0} stop
        sleep 1
        ${0} start
        ;;

    status)
        statusproc syslogd
        statusproc klogd
        ;;

    *)
        echo "Usage: ${0} {start|stop|reload|restart|status}"
        exit 1
        ;;
esac

# End $rc_base/init.d/sysklogd

D.17. /etc/rc.d/init.d/network

#!/bin/sh
########################################################################
# Begin $rc_base/init.d/network
#
# Description : Network Control Script
#
# Authors     : Gerard Beekmans - gerard AT linuxfromscratch D0T org
#        Nathan Coulson - nathan AT linuxfromscratch D0T org
#        Kevin P. Fleming - kpfleming@linuxfromscratch.org
#
# Version     : 00.00
#
# Notes       :
#
########################################################################

. /etc/sysconfig/rc
. ${rc_functions}
. /etc/sysconfig/network

case "${1}" in
    start)
        # Start all network interfaces
        for file in ${network_devices}/ifconfig.*
        do
            interface=${file##*/ifconfig.}

            # skip if $file is * (because nothing was found)
            if [ "${interface}" = "*" ]
            then
                continue
            fi

            IN_BOOT=1 ${network_devices}/ifup ${interface}
        done
        ;;

    stop)
        # Reverse list
        FILES=""
        for file in ${network_devices}/ifconfig.*
        do
            FILES="${file} ${FILES}"
        done

        # Stop all network interfaces
        for file in ${FILES}
        do
            interface=${file##*/ifconfig.}

            # skip if $file is * (because nothing was found)
            if [ "${interface}" = "*" ]
            then
                continue
            fi

            IN_BOOT=1 ${network_devices}/ifdown ${interface}
        done
        ;;

    restart)
        ${0} stop
        sleep 1
        ${0} start
        ;;

    *)
        echo "Usage: ${0} {start|stop|restart}"
        exit 1
        ;;
esac

# End /etc/rc.d/init.d/network

D.18. /etc/rc.d/init.d/sendsignals

#!/bin/sh
########################################################################
# Begin $rc_base/init.d/sendsignals
#
# Description : Sendsignals Script
#
# Authors     : Gerard Beekmans - gerard AT linuxfromscratch D0T org
#
# Version     : 00.00
#
# Notes       :
#
########################################################################

. /etc/sysconfig/rc
. ${rc_functions}

case "${1}" in
    stop)
        boot_mesg "Sending all processes the TERM signal..."
        killall5 -15
        error_value=${?}

        sleep ${KILLDELAY}

        if [ "${error_value}" = 0 ]; then
            echo_ok
        else
            echo_failure
        fi

        boot_mesg "Sending all processes the KILL signal..."
        killall5 -9
        error_value=${?}

        sleep ${KILLDELAY}

        if [ "${error_value}" = 0 ]; then
            echo_ok
        else
            echo_failure
        fi
        ;;

    *)
        echo "Usage: ${0} {stop}"
        exit 1
        ;;

esac

# End $rc_base/init.d/sendsignals

D.19. /etc/rc.d/init.d/reboot

#!/bin/sh
########################################################################
# Begin $rc_base/init.d/reboot
#
# Description : Reboot Scripts
#
# Authors     : Gerard Beekmans - gerard AT linuxfromscratch D0T org
#
# Version     : 00.00
#
# Notes       :
#
########################################################################

. /etc/sysconfig/rc
. ${rc_functions}

case "${1}" in
    stop)
        boot_mesg "Restarting system..."
        reboot -d -f -i
        ;;

    *)
        echo "Usage: ${0} {stop}"
        exit 1
        ;;

esac

# End $rc_base/init.d/reboot

D.20. /etc/rc.d/init.d/halt

#!/bin/sh
########################################################################
# Begin $rc_base/init.d/halt
#
# Description : Halt Script
#
# Authors     : Gerard Beekmans - gerard AT linuxfromscratch D0T org
#
# Version     : 00.00
#
# Notes       :
#
########################################################################

. /etc/sysconfig/rc
. ${rc_functions}

case "${1}" in
    stop)
        halt -d -f -i -p
        ;;
    *)
        echo "Usage: {stop}"
        exit 1
        ;;
esac

# End $rc_base/init.d/halt

D.21. /etc/rc.d/init.d/template

#!/bin/sh
########################################################################
# Begin $rc_base/init.d/
#
# Description :
#
# Authors     :
#
# Version     : 00.00
#
# Notes       :
#
########################################################################

. /etc/sysconfig/rc
. ${rc_functions}

case "${1}" in
    start)
        boot_mesg "Starting..."
        loadproc
        ;;

    stop)
        boot_mesg "Stopping..."
        killproc
        ;;

    reload)
        boot_mesg "Reloading..."
        reloadproc
        ;;

    restart)
        ${0} stop
        sleep 1
        ${0} start
        ;;

    status)
        statusproc
        ;;

    *)
        echo "Usage: ${0} {start|stop|reload|restart|status}"
        exit 1
        ;;
esac

# End $rc_base/init.d/

D.22. /etc/sysconfig/rc

########################################################################
# Begin /etc/sysconfig/rc
#
# Description : rc script configuration
#
# Authors     :
#
# Version     : 00.00
#
# Notes       :
#
########################################################################

rc_base=/etc/rc.d
rc_functions=${rc_base}/init.d/functions
network_devices=/etc/sysconfig/network-devices

# End /etc/sysconfig/rc

D.23. /etc/sysconfig/modules

########################################################################
# Begin /etc/sysconfig/modules
#
# Description : Module auto-loading configuration
#
# Authors     :
#
# Version     : 00.00
#
# Notes       : The syntax of this file is as follows:
#          <module> [<arg1> <arg2> ...]
#
# Each module should be on it's own line, and any options that you want
# passed to the module should follow it.  The line deliminator is either
# a space or a tab.
########################################################################

# End /etc/sysconfig/modules

D.24. /etc/sysconfig/createfiles

########################################################################
# Begin /etc/sysconfig/createfiles
#
# Description : Createfiles script config file
#
# Authors     :
#
# Version     : 00.00
#
# Notes       : The syntax of this file is as follows:
#         if type is equal to "file" or "dir"
#          <filename> <type> <permissions> <user> <group>
#         if type is equal to "dev"
#          <filename> <type> <permissions> <user> <group> <devtype> <major> <minor>
#
#         <filename> is the name of the file which is to be created
#         <type> is either file, dir, or dev.
#               file creates a new file
#               dir creates a new directory
#               dev creates a new device
#         <devtype> is either block, char or pipe
#               block creates a block device
#               char creates a character deivce
#               pipe creates a pipe, this will ignore the <major> and <minor> fields
#         <major> and <minor> are the major and minor numbers used for the device.
########################################################################

# End /etc/sysconfig/createfiles

D.25. /etc/sysconfig/network-devices/ifup

#!/bin/sh
########################################################################
# Begin $network_devices/ifup
#
# Description : Interface Up
#
# Authors     : Nathan Coulson - nathan AT linuxfromscratch D0T org
#               Kevin P. Fleming - kpfleming@linuxfromscratch.org
#
# Version     : 00.00
#
# Notes       : the IFCONFIG variable is passed to the scripts found
#               in the services directory, to indicate what file the
#               service should source to get environmental variables.
#
########################################################################

. /etc/sysconfig/rc
. ${rc_functions}

# Collect a list of configuration files for our interface
if [ -n "${2}" ]; then
    for file in ${@#$1} # All parameters except $1
  do
        FILES="${FILES} ${network_devices}/ifconfig.${1}/${file}"
    done
elif [ -d "${network_devices}/ifconfig.${1}" ]; then
    FILES=`echo ${network_devices}/ifconfig.${1}/*`
else
    FILES="${network_devices}/ifconfig.${1}"
fi

boot_mesg "Bringing up the ${1} interface..."
boot_mesg_flush

# Process each configruation file
for file in ${FILES}; do
    # skip backup files
    if [ "${file}" != "${file%""~""}" ]; then
        continue
    fi

    if [ ! -f "${file}" ]; then
        boot_mesg "${file} is not a network configuration file or directory." ${WARNING}
        echo_warning
        continue
    fi

    (
        . ${file}

        # Will not process this service if started by boot, and ONBOOT
        # is not set to yes
        if [ "${IN_BOOT}" = "1" -a "${ONBOOT}" != "yes" ]; then
            continue
        fi
        # Will not process this service if started by hotplug, and
        # ONHOTPLUG is not set to yes
        if [ "${IN_HOTPLUG}" = "1" -a "${ONHOTPLUG}" != "yes" \
                    -a "${HOSTNAME}" != "(none)" ]; then continue
        fi

        if [ -n "${SERVICE}" -a -x "${network_devices}/services/${SERVICE}" ]; then
            if [ -z "${CHECK_LINK}" -o "${CHECK_LINK}" = "y" \
                            -o "${CHECK_LINK}" = "yes" -o "${CHECK_LINK}" = "1" ]; then
                if ip link show ${1} > /dev/null 2>&1; then
                    link_status=`ip link show ${1}`
                    if [ -n "${link_status}" ]; then
                        if ! echo "${link_status}" | grep -q UP; then
                            ip link set ${1} up
                        fi
                    fi
                else
                    boot_mesg "Interface ${1} doesn't exist." ${WARNING}
                    echo_warning
                    continue
                fi
            fi
            IFCONFIG=${file} ${network_devices}/services/${SERVICE} ${1} up
        else
            boot_mesg "Unable to process ${file}.  Either" ${FAILURE}
            boot_mesg " the SERVICE variable was not set,"
            boot_mesg " or the specified service cannot be executed."
            echo_failure
            continue
        fi
    )
done

# End $network_devices/ifup

D.26. /etc/sysconfig/network-devices/ifdown

#!/bin/sh
########################################################################
# Begin $network_devices/ifdown
#
# Description : Interface Down
#
# Authors     : Nathan Coulson - nathan AT linuxfromscratch D0T org
#               Kevin P. Fleming - kpfleming@linuxfromscratch.org
#
# Version     : 00.01
#
# Notes       : the IFCONFIG variable is passed to the scripts found
#               in the services directory, to indicate what file the
#               service should source to get environmental variables.
#
########################################################################

. /etc/sysconfig/rc
. ${rc_functions}

# Collect a list of configuration files for our interface
if [ -n "${2}" ]; then
    for file in ${@#$1}; do # All parameters except $1
        FILES="${FILES} ${network_devices}/ifconfig.${1}/${file}"
    done
elif [ -d "${network_devices}/ifconfig.${1}" ]; then
    FILES=`echo ${network_devices}/ifconfig.${1}/*`
else
    FILES="${network_devices}/ifconfig.${1}"
fi

# Reverse the order configuration files are processed in
for file in ${FILES}; do
    FILES2="${file} ${FILES2}"
done
FILES=${FILES2}

# Process each configuration file
for file in ${FILES}; do
    # skip backup files
    if [ "${file}" != "${file%""~""}" ]; then
        continue
    fi

    if [ ! -f "${file}" ]; then
        boot_mesg "${file} is not a network configuration file or directory." ${WARNING}
        echo_warning
        continue
    fi
    (
        . ${file}

        # Will not process this service if started by boot, and ONBOOT
        # is not set to yes
        if [ "${IN_BOOT}" = "1" -a "${ONBOOT}" != "yes" ]; then
            continue
        fi

        # Will not process this service if started by hotplug, and
        # ONHOTPLUG is not set to yes
        if [ "${IN_HOTPLUG}" = "1" -a "${ONHOTPLUG}" != "yes" ]; then
            continue
        fi

        # This will run the service script, if SERVICE is set
        if [ -n "${SERVICE}" -a -x "${network_devices}/services/${SERVICE}" ]; then
            if ip link show ${1} > /dev/null 2>&1
            then
                IFCONFIG=${file} ${network_devices}/services/${SERVICE} ${1} down
            else
                boot_mesg "Interface ${1} doesn't exist." ${WARNING}
                echo_warning
            fi
        else
            boot_mesg -n "Unable to process ${file}.  Either" ${FAILURE}
            boot_mesg -n " the SERVICE variable was not set,"
            boot_mesg " or the specified service cannot be executed."
            echo_failure
            continue
        fi
    )
done

if [ -z "${2}" ]; then
    link_status=`ip link show $1 2>/dev/null`
    if [ -n "${link_status}" ]; then
        if echo "${link_status}" | grep -q UP; then
            boot_mesg "Bringing down the ${1} interface..."
            ip link set ${1} down
            evaluate_retval
        fi
    fi
fi

# End $network_devices/ifdown

D.27. /etc/sysconfig/network-devices/services/ipv4-static

#!/bin/sh
########################################################################
# Begin $network_devices/services/ipv4-static
#
# Description : IPV4 Static Boot Script
#
# Authors     : Nathan Coulson - nathan AT linuxfromscratch D0T org
#        Kevin P. Fleming - kpfleming@linuxfromscratch.org
#
# Version     : 00.00
#
# Notes       :
#
########################################################################

. /etc/sysconfig/rc
. ${rc_functions}
. ${IFCONFIG}

if [ -z "${IP}" ]; then
    boot_mesg "IP variable missing from ${IFCONFIG}, cannot continue." ${FAILURE}
    echo_failure
    exit 1
fi

if [ -z "${PREFIX}" -a -z "${PEER}" ]; then
    boot_mesg -n "PREFIX variable missing from ${IFCONFIG}," ${WARNING}
    boot_mesg " assuming 24."
    echo_warning
    PREFIX=24
    args="${args} ${IP}/${PREFIX}"
elif [ -n "${PREFIX}" -a -n "${PEER}" ]; then
    boot_mesg "PREFIX and PEER both specified in ${IFCONFIG}, cannot continue." ${FAILURE}
    echo_failure
    exit 1
elif [ -n "${PREFIX}" ]; then
    args="${args} ${IP}/${PREFIX}"
elif [ -n "${PEER}" ]; then
    args="${args} ${IP} peer ${PEER}"
fi

if [ -n "${BROADCAST}" ]; then
    args="${args} broadcast ${BROADCAST}"
fi

case "${2}" in
    up)
        boot_mesg "Adding IPv4 address ${IP} to the ${1} interface..."
        ip addr add ${args} dev ${1}
        evaluate_retval

        if [ -n "${GATEWAY}" ]; then
            if ip route | grep -q default; then
                boot_mesg "Gateway already setup; skipping." ${WARNING}
                echo_warning
            else
                boot_mesg "Setting up default gateway..."
                ip route add default via ${GATEWAY} dev ${1}
                evaluate_retval
             fi
        fi
    ;;

    down)
        if [ -n "${GATEWAY}" ];    then
            boot_mesg "Removing default gateway..."
            ip route del default
            evaluate_retval
        fi

        boot_mesg "Removing IPv4 address ${IP} from the ${1} interface..."
        ip addr del ${args} dev ${1}
        evaluate_retval
    ;;

    *)
        echo "Usage: ${0} [interface] {up|down}"
        exit 1
    ;;
esac

# End $network_devices/services/ipv4-static

D.28. /etc/sysconfig/network-devices/services/ipv4-static-route

#!/bin/sh
########################################################################
# Begin $network_devices/services/ipv4-static-route
#
# Description : IPV4 Static Route Script
#
# Authors     : Kevin P. Fleming - kpfleming@linuxfromscratch.org
#
# Version     : 00.00
#
# Notes       :
#
########################################################################

. /etc/sysconfig/rc
. ${rc_functions}
. ${IFCONFIG}

case "${TYPE}" in
    ("" | "network")
        need_ip=1
        need_gateway=1
    ;;

    ("default")
        need_gateway=1
        args="${args} default"
        desc="default"
    ;;

    ("host")
        need_ip=1
    ;;

    ("unreachable")
        need_ip=1
        args="${args} unreachable"
        desc="unreachable "
    ;;

    (*)
        boot_mesg "Unknown route type (${TYPE}) in ${IFCONFIG}, cannot continue." ${FAILURE}
        echo_failure
        exit 1
    ;;
esac

if [ -n "${need_ip}" ]; then
    if [ -z "${IP}" ]; then
        boot_mesg "IP variable missing from ${IFCONFIG}, cannot continue." ${FAILURE}
        echo_failure
        exit 1
    fi

    if [ -z "${PREFIX}" ]; then
        boot_mesg "PREFIX variable missing from ${IFCONFIG}, cannot continue." ${FAILURE}
        echo_failure
        exit 1
    fi

    args="${args} ${IP}/${PREFIX}"
    desc="${desc}${IP}/${PREFIX}"
fi

if [ -n "${need_gateway}" ]; then
    if [ -z "${GATEWAY}" ]; then
        boot_mesg "GATEWAY variable missing from ${IFCONFIG}, cannot continue." ${FAILURE}
        echo_failure
        exit 1
    fi
    args="${args} via ${GATEWAY}"
fi

if [ -n "${SOURCE}" ]; then
        args="${args} src ${SOURCE}"
fi

case "${2}" in
    up)
        boot_mesg "Adding '${desc}' route to the ${1} interface..."
        ip route add ${args} dev ${1}
        evaluate_retval
    ;;

    down)
        boot_mesg "Removing '${desc}' route from the ${1} interface..."
        ip route del ${args} dev ${1}
        evaluate_retval
    ;;

    *)
        echo "Usage: ${0} [interface] {up|down}"
        exit 1
    ;;
esac

# End $network_devices/services/ipv4-static-route

付録 E. Udev 設定ルール

本付録にて udev-config-20100128.tar.bz2 に含まれるルールを列記します。
インストール手順は 6.58. 「Udev-151」 を参照してください。

E.1. 55-lfs.rules

# /etc/udev/rules.d/55-lfs.rules: Rule definitions for LFS.

# Core kernel devices

# This causes the system clock to be set as soon as /dev/rtc becomes available.
SUBSYSTEM=="rtc", ACTION=="add", MODE="0644", RUN+="/etc/rc.d/init.d/setclock start"
KERNEL=="rtc", ACTION=="add", MODE="0644", RUN+="/etc/rc.d/init.d/setclock start"

# Comms devices

KERNEL=="ippp[0-9]*",       GROUP="dialout"
KERNEL=="isdn[0-9]*",       GROUP="dialout"
KERNEL=="isdnctrl[0-9]*",   GROUP="dialout"
KERNEL=="dcbri[0-9]*",      GROUP="dialout"

付録 F. LFS ライセンス

本ブックはクリエイティブコモンズ (Creative Commons) の 表示-非営利-継承
(Attribution-NonCommercial-ShareAlike) 2.0 ライセンスに従います。

本書のインストール手順のコマンドを抜き出したものは MIT ライセンスに従っ
てください。

F.1. クリエイティブコモンズライセンス

日本語訳情報

以下は日本語へ訳出することなく、原文のライセンス条項をそのまま示します
。

Creative Commons Legal Code

Attribution-NonCommercial-ShareAlike 2.0

重要項目

CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN
ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES
RESULTING FROM ITS USE.

License

THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS
CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS
PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK
OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS
PROHIBITED.

BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND
AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. THE LICENSOR GRANTS YOU
THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH
TERMS AND CONDITIONS.

 1. Definitions

     1. "Collective Work" means a work, such as a periodical issue,
        anthology or encyclopedia, in which the Work in its entirety in
        unmodified form, along with a number of other contributions,
        constituting separate and independent works in themselves, are
        assembled into a collective whole. A work that constitutes a
        Collective Work will not be considered a Derivative Work (as
        defined below) for the purposes of this License.

     2. "Derivative Work" means a work based upon the Work or upon the
        Work and other pre-existing works, such as a translation,
        musical arrangement, dramatization, fictionalization, motion
        picture version, sound recording, art reproduction, abridgment,
        condensation, or any other form in which the Work may be
        recast, transformed, or adapted, except that a work that
        constitutes a Collective Work will not be considered a
        Derivative Work for the purpose of this License. For the
        avoidance of doubt, where the Work is a musical composition or
        sound recording, the synchronization of the Work in
        timed-relation with a moving image ("synching") will be
        considered a Derivative Work for the purpose of this License.

     3. "Licensor" means the individual or entity that offers the Work
        under the terms of this License.

     4. "Original Author" means the individual or entity who created
        the Work.

     5. "Work" means the copyrightable work of authorship offered under
        the terms of this License.

     6. "You" means an individual or entity exercising rights under
        this License who has not previously violated the terms of this
        License with respect to the Work, or who has received express
        permission from the Licensor to exercise rights under this
        License despite a previous violation.

     7. "License Elements" means the following high-level license
        attributes as selected by Licensor and indicated in the title
        of this License: Attribution, Noncommercial, ShareAlike.

 2. Fair Use Rights. Nothing in this license is intended to reduce,
    limit, or restrict any rights arising from fair use, first sale or
    other limitations on the exclusive rights of the copyright owner
    under copyright law or other applicable laws.

 3. License Grant. Subject to the terms and conditions of this License,
    Licensor hereby grants You a worldwide, royalty-free,
    non-exclusive, perpetual (for the duration of the applicable
    copyright) license to exercise the rights in the Work as stated
    below:

     1. to reproduce the Work, to incorporate the Work into one or more
        Collective Works, and to reproduce the Work as incorporated in
        the Collective Works;

     2. to create and reproduce Derivative Works;

     3. to distribute copies or phonorecords of, display publicly,
        perform publicly, and perform publicly by means of a digital
        audio transmission the Work including as incorporated in
        Collective Works;

     4. to distribute copies or phonorecords of, display publicly,
        perform publicly, and perform publicly by means of a digital
        audio transmission Derivative Works;

    The above rights may be exercised in all media and formats whether
    now known or hereafter devised. The above rights include the right
    to make such modifications as are technically necessary to exercise
    the rights in other media and formats. All rights not expressly
    granted by Licensor are hereby reserved, including but not limited
    to the rights set forth in Sections 4(e) and 4(f).

 4. Restrictions.The license granted in Section 3 above is expressly
    made subject to and limited by the following restrictions:

     1. You may distribute, publicly display, publicly perform, or
        publicly digitally perform the Work only under the terms of
        this License, and You must include a copy of, or the Uniform
        Resource Identifier for, this License with every copy or
        phonorecord of the Work You distribute, publicly display,
        publicly perform, or publicly digitally perform. You may not
        offer or impose any terms on the Work that alter or restrict
        the terms of this License or the recipients' exercise of the
        rights granted hereunder. You may not sublicense the Work. You
        must keep intact all notices that refer to this License and to
        the disclaimer of warranties. You may not distribute, publicly
        display, publicly perform, or publicly digitally perform the
        Work with any technological measures that control access or use
        of the Work in a manner inconsistent with the terms of this
        License Agreement. The above applies to the Work as
        incorporated in a Collective Work, but this does not require
        the Collective Work apart from the Work itself to be made
        subject to the terms of this License. If You create a
        Collective Work, upon notice from any Licensor You must, to the
        extent practicable, remove from the Collective Work any
        reference to such Licensor or the Original Author, as
        requested. If You create a Derivative Work, upon notice from
        any Licensor You must, to the extent practicable, remove from
        the Derivative Work any reference to such Licensor or the
        Original Author, as requested.

     2. You may distribute, publicly display, publicly perform, or
        publicly digitally perform a Derivative Work only under the
        terms of this License, a later version of this License with the
        same License Elements as this License, or a Creative Commons
        iCommons license that contains the same License Elements as
        this License (e.g. Attribution-NonCommercial-ShareAlike 2.0
        Japan). You must include a copy of, or the Uniform Resource
        Identifier for, this License or other license specified in the
        previous sentence with every copy or phonorecord of each
        Derivative Work You distribute, publicly display, publicly
        perform, or publicly digitally perform. You may not offer or
        impose any terms on the Derivative Works that alter or restrict
        the terms of this License or the recipients' exercise of the
        rights granted hereunder, and You must keep intact all notices
        that refer to this License and to the disclaimer of warranties.
        You may not distribute, publicly display, publicly perform, or
        publicly digitally perform the Derivative Work with any
        technological measures that control access or use of the Work
        in a manner inconsistent with the terms of this License
        Agreement. The above applies to the Derivative Work as
        incorporated in a Collective Work, but this does not require
        the Collective Work apart from the Derivative Work itself to be
        made subject to the terms of this License.

     3. You may not exercise any of the rights granted to You in
        Section 3 above in any manner that is primarily intended for or
        directed toward commercial advantage or private monetary
        compensation. The exchange of the Work for other copyrighted
        works by means of digital file-sharing or otherwise shall not
        be considered to be intended for or directed toward commercial
        advantage or private monetary compensation, provided there is
        no payment of any monetary compensation in connection with the
        exchange of copyrighted works.

     4. If you distribute, publicly display, publicly perform, or
        publicly digitally perform the Work or any Derivative Works or
        Collective Works, You must keep intact all copyright notices
        for the Work and give the Original Author credit reasonable to
        the medium or means You are utilizing by conveying the name (or
        pseudonym if applicable) of the Original Author if supplied;
        the title of the Work if supplied; to the extent reasonably
        practicable, the Uniform Resource Identifier, if any, that
        Licensor specifies to be associated with the Work, unless such
        URI does not refer to the copyright notice or licensing
        information for the Work; and in the case of a Derivative Work,
        a credit identifying the use of the Work in the Derivative Work
        (e.g., "French translation of the Work by Original Author," or
        "Screenplay based on original Work by Original Author"). Such
        credit may be implemented in any reasonable manner; provided,
        however, that in the case of a Derivative Work or Collective
        Work, at a minimum such credit will appear where any other
        comparable authorship credit appears and in a manner at least
        as prominent as such other comparable authorship credit.

     5. For the avoidance of doubt, where the Work is a musical
        composition:

         1. Performance Royalties Under Blanket Licenses. Licensor
            reserves the exclusive right to collect, whether
            individually or via a performance rights society (e.g.
            ASCAP, BMI, SESAC), royalties for the public performance or
            public digital performance (e.g. webcast) of the Work if
            that performance is primarily intended for or directed
            toward commercial advantage or private monetary
            compensation.

         2. Mechanical Rights and Statutory Royalties. Licensor
            reserves the exclusive right to collect, whether
            individually or via a music rights agency or designated
            agent (e.g. Harry Fox Agency), royalties for any
            phonorecord You create from the Work ("cover version") and
            distribute, subject to the compulsory license created by 17
            USC Section 115 of the US Copyright Act (or the equivalent
            in other jurisdictions), if Your distribution of such cover
            version is primarily intended for or directed toward
            commercial advantage or private monetary compensation. 6.
            Webcasting Rights and Statutory Royalties. For the
            avoidance of doubt, where the Work is a sound recording,
            Licensor reserves the exclusive right to collect, whether
            individually or via a performance-rights society (e.g.
            SoundExchange), royalties for the public digital
            performance (e.g. webcast) of the Work, subject to the
            compulsory license created by 17 USC Section 114 of the US
            Copyright Act (or the equivalent in other jurisdictions),
            if Your public digital performance is primarily intended
            for or directed toward commercial advantage or private
            monetary compensation.

     6. Webcasting Rights and Statutory Royalties. For the avoidance of
        doubt, where the Work is a sound recording, Licensor reserves
        the exclusive right to collect, whether individually or via a
        performance-rights society (e.g. SoundExchange), royalties for
        the public digital performance (e.g. webcast) of the Work,
        subject to the compulsory license created by 17 USC Section 114
        of the US Copyright Act (or the equivalent in other
        jurisdictions), if Your public digital performance is primarily
        intended for or directed toward commercial advantage or private
        monetary compensation.

 5. Representations, Warranties and Disclaimer

    UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING,
    LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR
    WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED,
    STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES
    OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE,
    NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS,
    ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT
    DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF
    IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.

 6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY
    APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY
    LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE
    OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE
    WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
    DAMAGES.

 7. Termination

     1. This License and the rights granted hereunder will terminate
        automatically upon any breach by You of the terms of this
        License. Individuals or entities who have received Derivative
        Works or Collective Works from You under this License, however,
        will not have their licenses terminated provided such
        individuals or entities remain in full compliance with those
        licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any
        termination of this License.

     2. Subject to the above terms and conditions, the license granted
        here is perpetual (for the duration of the applicable copyright
        in the Work). Notwithstanding the above, Licensor reserves the
        right to release the Work under different license terms or to
        stop distributing the Work at any time; provided, however that
        any such election will not serve to withdraw this License (or
        any other license that has been, or is required to be, granted
        under the terms of this License), and this License will
        continue in full force and effect unless terminated as stated
        above.

 8. Miscellaneous

     1. Each time You distribute or publicly digitally perform the Work
        or a Collective Work, the Licensor offers to the recipient a
        license to the Work on the same terms and conditions as the
        license granted to You under this License.

     2. Each time You distribute or publicly digitally perform a
        Derivative Work, Licensor offers to the recipient a license to
        the original Work on the same terms and conditions as the
        license granted to You under this License.

     3. If any provision of this License is invalid or unenforceable
        under applicable law, it shall not affect the validity or
        enforceability of the remainder of the terms of this License,
        and without further action by the parties to this agreement,
        such provision shall be reformed to the minimum extent
        necessary to make such provision valid and enforceable.

     4. No term or provision of this License shall be deemed waived and
        no breach consented to unless such waiver or consent shall be
        in writing and signed by the party to be charged with such
        waiver or consent.

     5. This License constitutes the entire agreement between the
        parties with respect to the Work licensed here. There are no
        understandings, agreements or representations with respect to
        the Work not specified here. Licensor shall not be bound by any
        additional provisions that may appear in any communication from
        You. This License may not be modified without the mutual
        written agreement of the Licensor and You.

重要項目

Creative Commons is not a party to this License, and makes no warranty
whatsoever in connection with the Work. Creative Commons will not be
liable to You or any party on any legal theory for any damages
whatsoever, including without limitation any general, special,
incidental or consequential damages arising in connection to this
license. Notwithstanding the foregoing two (2) sentences, if Creative
Commons has expressly identified itself as the Licensor hereunder, it
shall have all rights and obligations of Licensor.

Except for the limited purpose of indicating to the public that the
Work is licensed under the CCPL, neither party will use the trademark
"Creative Commons" or any related trademark or logo of Creative Commons
without the prior written consent of Creative Commons. Any permitted
use will be in compliance with Creative Commons' then-current trademark
usage guidelines, as may be published on its website or otherwise made
available upon request from time to time.

Creative Commons may be contacted at http://creativecommons.org/.

F.2. MIT ライセンス (The MIT License)

日本語訳情報

以下は日本語へ訳出することなく、原文のライセンス条項をそのまま示します
。

Copyright (C) 1999-2010 Gerard Beekmans

Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

項目別もくじ

パッケージ

 ・ Autoconf: Autoconf-2.65
 ・ Automake: Automake-1.11.1
 ・ Bash: Bash-4.1
     □ ツール: Bash-4.1
 ・ Binutils: Binutils-2.20
     □ ツール, 1回め: Binutils-2.20 - 1回め
     □ ツール, 2回め: Binutils-2.20 - 2回め
 ・ Bison: Bison-2.4.1
 ・ Bootscripts: LFS-ブートスクリプト-20100124
     □ 利用方法: ブートスクリプトはどのようにして動くのか
 ・ Bzip2: Bzip2-1.0.5
     □ ツール: Bzip2-1.0.5
 ・ Coreutils: Coreutils-8.4
     □ ツール: Coreutils-8.4
 ・ DejaGNU: DejaGNU-1.4.4
 ・ Diffutils: Diffutils-2.8.1
     □ ツール: Diffutils-2.8.1
 ・ E2fsprogs: E2fsprogs-1.41.10
 ・ Expect: Expect-5.43.0
 ・ File: File-5.04
 ・ Findutils: Findutils-4.4.2
     □ ツール: Findutils-4.4.2
 ・ Flex: Flex-2.5.35
 ・ Gawk: Gawk-3.1.7
     □ ツール: Gawk-3.1.7
 ・ GCC: GCC-4.4.3
     □ ツール, 1回め: GCC-4.4.3 - 1回め
     □ ツール, 2回め: GCC-4.4.3 - 2回め
 ・ GDBM: GDBM-1.8.3
 ・ Gettext: Gettext-0.17
     □ ツール: Gettext-0.17
 ・ Glibc: Glibc-2.11.1
     □ ツール: Glibc-2.11.1
 ・ GMP: GMP-5.0.0
 ・ Grep: Grep-2.5.4
     □ ツール: Grep-2.5.4
 ・ Groff: Groff-1.20.1
 ・ GRUB: GRUB-1.97.2
 ・ Gzip: Gzip-1.4
     □ ツール: Gzip-1.4
 ・ Iana-Etc: Iana-Etc-2.30
 ・ Inetutils: Inetutils-1.7
 ・ IPRoute2: IPRoute2-2.6.31
 ・ Kbd: Kbd-1.15.1
 ・ Less: Less-436
 ・ Libtool: Libtool-2.2.6b
 ・ Linux: Linux-2.6.32.8
     □ API ヘッダ: Linux-2.6.32.8 API ヘッダ
     □ ツール, API ヘッダ: Linux-2.6.32.8 API ヘッダ
 ・ M4: M4-1.4.13
     □ ツール: M4-1.4.13
 ・ Make: Make-3.81
     □ ツール: Make-3.81
 ・ Man-DB: Man-DB-2.5.6
 ・ Man-pages: Man-pages-3.23
 ・ Module-Init-Tools: Module-Init-Tools-3.11.1
 ・ MPFR: MPFR-2.4.2
 ・ Ncurses: Ncurses-5.7
     □ ツール: Ncurses-5.7
 ・ Patch: Patch-2.6.1
     □ ツール: Patch-2.6.1
 ・ Perl: Perl-5.10.1
     □ ツール: Perl-5.10.1
 ・ Pkg-config: Pkg-config-0.23
 ・ Procps: Procps-3.2.8
 ・ Psmisc: Psmisc-22.10
 ・ Readline: Readline-6.1
 ・ Sed: Sed-4.2.1
     □ ツール: Sed-4.2.1
 ・ Shadow: Shadow-4.1.4.2
     □ 設定: Shadow の構成
 ・ Sysklogd: Sysklogd-1.5
     □ 設定: Sysklogd の設定
 ・ Sysvinit: Sysvinit-2.86
     □ 設定: Sysvinit の設定
 ・ Tar: Tar-1.22
     □ ツール: Tar-1.22
 ・ Tcl: Tcl-8.5.8
 ・ Texinfo: Texinfo-4.13a
     □ ツール: Texinfo-4.13a
 ・ Udev: Udev-151
     □ 利用方法: LFS システムにおけるデバイスとモジュールの扱い
 ・ Util-linux-ng: Util-linux-ng-2.17
 ・ Vim: Vim-7.2
 ・ Zlib: Zlib-1.2.3

プログラム

 ・ a2p: Perl-5.10.1 -- 説明
 ・ accessdb: Man-DB-2.5.6 -- 説明
 ・ acinstall: Automake-1.11.1 -- 説明
 ・ aclocal: Automake-1.11.1 -- 説明
 ・ aclocal-1.11.1: Automake-1.11.1 -- 説明
 ・ addftinfo: Groff-1.20.1 -- 説明
 ・ addpart: Util-linux-ng-2.17 -- 説明
 ・ addr2line: Binutils-2.20 -- 説明
 ・ afmtodit: Groff-1.20.1 -- 説明
 ・ agetty: Util-linux-ng-2.17 -- 説明
 ・ apropos: Man-DB-2.5.6 -- 説明
 ・ ar: Binutils-2.20 -- 説明
 ・ arch: Util-linux-ng-2.17 -- 説明
 ・ as: Binutils-2.20 -- 説明
 ・ ata_id: Udev-151 -- 説明
 ・ autoconf: Autoconf-2.65 -- 説明
 ・ autoheader: Autoconf-2.65 -- 説明
 ・ autom4te: Autoconf-2.65 -- 説明
 ・ automake: Automake-1.11.1 -- 説明
 ・ automake-1.11.1: Automake-1.11.1 -- 説明
 ・ autopoint: Gettext-0.17 -- 説明
 ・ autoreconf: Autoconf-2.65 -- 説明
 ・ autoscan: Autoconf-2.65 -- 説明
 ・ autoupdate: Autoconf-2.65 -- 説明
 ・ awk: Gawk-3.1.7 -- 説明
 ・ badblocks: E2fsprogs-1.41.10 -- 説明
 ・ base64: Coreutils-8.4 -- 説明
 ・ basename: Coreutils-8.4 -- 説明
 ・ bash: Bash-4.1 -- 説明
 ・ bashbug: Bash-4.1 -- 説明
 ・ bigram: Findutils-4.4.2 -- 説明
 ・ bison: Bison-2.4.1 -- 説明
 ・ blkid: Util-linux-ng-2.17 -- 説明
 ・ blockdev: Util-linux-ng-2.17 -- 説明
 ・ bootlogd: Sysvinit-2.86 -- 説明
 ・ bunzip2: Bzip2-1.0.5 -- 説明
 ・ bzcat: Bzip2-1.0.5 -- 説明
 ・ bzcmp: Bzip2-1.0.5 -- 説明
 ・ bzdiff: Bzip2-1.0.5 -- 説明
 ・ bzegrep: Bzip2-1.0.5 -- 説明
 ・ bzfgrep: Bzip2-1.0.5 -- 説明
 ・ bzgrep: Bzip2-1.0.5 -- 説明
 ・ bzip2: Bzip2-1.0.5 -- 説明
 ・ bzip2recover: Bzip2-1.0.5 -- 説明
 ・ bzless: Bzip2-1.0.5 -- 説明
 ・ bzmore: Bzip2-1.0.5 -- 説明
 ・ c++: GCC-4.4.3 -- 説明
 ・ c++filt: Binutils-2.20 -- 説明
 ・ c2ph: Perl-5.10.1 -- 説明
 ・ cal: Util-linux-ng-2.17 -- 説明
 ・ captoinfo: Ncurses-5.7 -- 説明
 ・ cat: Coreutils-8.4 -- 説明
 ・ catchsegv: Glibc-2.11.1 -- 説明
 ・ catman: Man-DB-2.5.6 -- 説明
 ・ cc: GCC-4.4.3 -- 説明
 ・ cdrom_id: Udev-151 -- 説明
 ・ cfdisk: Util-linux-ng-2.17 -- 説明
 ・ chage: Shadow-4.1.4.2 -- 説明
 ・ chattr: E2fsprogs-1.41.10 -- 説明
 ・ chcon: Coreutils-8.4 -- 説明
 ・ chem: Groff-1.20.1 -- 説明
 ・ chfn: Shadow-4.1.4.2 -- 説明
 ・ chgpasswd: Shadow-4.1.4.2 -- 説明
 ・ chgrp: Coreutils-8.4 -- 説明
 ・ chkdupexe: Util-linux-ng-2.17 -- 説明
 ・ chmod: Coreutils-8.4 -- 説明
 ・ chown: Coreutils-8.4 -- 説明
 ・ chpasswd: Shadow-4.1.4.2 -- 説明
 ・ chroot: Coreutils-8.4 -- 説明
 ・ chrt: Util-linux-ng-2.17 -- 説明
 ・ chsh: Shadow-4.1.4.2 -- 説明
 ・ chvt: Kbd-1.15.1 -- 説明
 ・ cksum: Coreutils-8.4 -- 説明
 ・ clear: Ncurses-5.7 -- 説明
 ・ cmp: Diffutils-2.8.1 -- 説明
 ・ code: Findutils-4.4.2 -- 説明
 ・ col: Util-linux-ng-2.17 -- 説明
 ・ colcrt: Util-linux-ng-2.17 -- 説明
 ・ collect: Udev-151 -- 説明
 ・ colrm: Util-linux-ng-2.17 -- 説明
 ・ column: Util-linux-ng-2.17 -- 説明
 ・ comm: Coreutils-8.4 -- 説明
 ・ compile: Automake-1.11.1 -- 説明
 ・ compile_et: E2fsprogs-1.41.10 -- 説明
 ・ config.charset: Gettext-0.17 -- 説明
 ・ config.guess: Automake-1.11.1 -- 説明
 ・ config.rpath: Gettext-0.17 -- 説明
 ・ config.sub: Automake-1.11.1 -- 説明
 ・ config_data: Perl-5.10.1 -- 説明
 ・ corelist: Perl-5.10.1 -- 説明
 ・ cp: Coreutils-8.4 -- 説明
 ・ cpan: Perl-5.10.1 -- 説明
 ・ cpan2dist: Perl-5.10.1 -- 説明
 ・ cpanp: Perl-5.10.1 -- 説明
 ・ cpanp-run-perl: Perl-5.10.1 -- 説明
 ・ cpp: GCC-4.4.3 -- 説明
 ・ create_floppy_devices: Udev-151 -- 説明
 ・ csplit: Coreutils-8.4 -- 説明
 ・ ctrlaltdel: Util-linux-ng-2.17 -- 説明
 ・ ctstat: IPRoute2-2.6.31 -- 説明
 ・ cut: Coreutils-8.4 -- 説明
 ・ cytune: Util-linux-ng-2.17 -- 説明
 ・ date: Coreutils-8.4 -- 説明
 ・ dd: Coreutils-8.4 -- 説明
 ・ ddate: Util-linux-ng-2.17 -- 説明
 ・ deallocvt: Kbd-1.15.1 -- 説明
 ・ debugfs: E2fsprogs-1.41.10 -- 説明
 ・ delpart: Util-linux-ng-2.17 -- 説明
 ・ depcomp: Automake-1.11.1 -- 説明
 ・ depmod: Module-Init-Tools-3.11.1 -- 説明
 ・ df: Coreutils-8.4 -- 説明
 ・ diff: Diffutils-2.8.1 -- 説明
 ・ diff3: Diffutils-2.8.1 -- 説明
 ・ dir: Coreutils-8.4 -- 説明
 ・ dircolors: Coreutils-8.4 -- 説明
 ・ dirname: Coreutils-8.4 -- 説明
 ・ dmesg: Util-linux-ng-2.17 -- 説明
 ・ dprofpp: Perl-5.10.1 -- 説明
 ・ du: Coreutils-8.4 -- 説明
 ・ dumpe2fs: E2fsprogs-1.41.10 -- 説明
 ・ dumpkeys: Kbd-1.15.1 -- 説明
 ・ e2freefrag: E2fsprogs-1.41.10 -- 説明
 ・ e2fsck: E2fsprogs-1.41.10 -- 説明
 ・ e2image: E2fsprogs-1.41.10 -- 説明
 ・ e2initrd_helper: E2fsprogs-1.41.10 -- 説明
 ・ e2label: E2fsprogs-1.41.10 -- 説明
 ・ e2undo: E2fsprogs-1.41.10 -- 説明
 ・ echo: Coreutils-8.4 -- 説明
 ・ edd_id: Udev-151 -- 説明
 ・ egrep: Grep-2.5.4 -- 説明
 ・ elisp-comp: Automake-1.11.1 -- 説明
 ・ enc2xs: Perl-5.10.1 -- 説明
 ・ env: Coreutils-8.4 -- 説明
 ・ envsubst: Gettext-0.17 -- 説明
 ・ eqn: Groff-1.20.1 -- 説明
 ・ eqn2graph: Groff-1.20.1 -- 説明
 ・ ex: Vim-7.2 -- 説明
 ・ expand: Coreutils-8.4 -- 説明
 ・ expect: Expect-5.43.0 -- 説明
 ・ expiry: Shadow-4.1.4.2 -- 説明
 ・ expr: Coreutils-8.4 -- 説明
 ・ factor: Coreutils-8.4 -- 説明
 ・ faillog: Shadow-4.1.4.2 -- 説明
 ・ false: Coreutils-8.4 -- 説明
 ・ fdformat: Util-linux-ng-2.17 -- 説明
 ・ fdisk: Util-linux-ng-2.17 -- 説明
 ・ fgconsole: Kbd-1.15.1 -- 説明
 ・ fgrep: Grep-2.5.4 -- 説明
 ・ file: File-5.04 -- 説明
 ・ filefrag: E2fsprogs-1.41.10 -- 説明
 ・ find: Findutils-4.4.2 -- 説明
 ・ find2perl: Perl-5.10.1 -- 説明
 ・ findfs: Util-linux-ng-2.17 -- 説明
 ・ firmware.sh: Udev-151 -- 説明
 ・ flex: Flex-2.5.35 -- 説明
 ・ flock: Util-linux-ng-2.17 -- 説明
 ・ fmt: Coreutils-8.4 -- 説明
 ・ fold: Coreutils-8.4 -- 説明
 ・ frcode: Findutils-4.4.2 -- 説明
 ・ free: Procps-3.2.8 -- 説明
 ・ fsck: Util-linux-ng-2.17 -- 説明
 ・ fsck.cramfs: Util-linux-ng-2.17 -- 説明
 ・ fsck.ext2: E2fsprogs-1.41.10 -- 説明
 ・ fsck.ext3: E2fsprogs-1.41.10 -- 説明
 ・ fsck.ext4: E2fsprogs-1.41.10 -- 説明
 ・ fsck.ext4dev: E2fsprogs-1.41.10 -- 説明
 ・ fsck.minix: Util-linux-ng-2.17 -- 説明
 ・ fstab_import: Udev-151 -- 説明
 ・ ftp: Inetutils-1.7 -- 説明
 ・ fuser: Psmisc-22.10 -- 説明
 ・ g++: GCC-4.4.3 -- 説明
 ・ gawk: Gawk-3.1.7 -- 説明
 ・ gawk-3.1.7: Gawk-3.1.7 -- 説明
 ・ gcc: GCC-4.4.3 -- 説明
 ・ gccbug: GCC-4.4.3 -- 説明
 ・ gcov: GCC-4.4.3 -- 説明
 ・ gdiffmk: Groff-1.20.1 -- 説明
 ・ gencat: Glibc-2.11.1 -- 説明
 ・ genl: IPRoute2-2.6.31 -- 説明
 ・ geqn: Groff-1.20.1 -- 説明
 ・ getconf: Glibc-2.11.1 -- 説明
 ・ getent: Glibc-2.11.1 -- 説明
 ・ getkeycodes: Kbd-1.15.1 -- 説明
 ・ getopt: Util-linux-ng-2.17 -- 説明
 ・ gettext: Gettext-0.17 -- 説明
 ・ gettext.sh: Gettext-0.17 -- 説明
 ・ gettextize: Gettext-0.17 -- 説明
 ・ gpasswd: Shadow-4.1.4.2 -- 説明
 ・ gprof: Binutils-2.20 -- 説明
 ・ grap2graph: Groff-1.20.1 -- 説明
 ・ grcat: Gawk-3.1.7 -- 説明
 ・ grep: Grep-2.5.4 -- 説明
 ・ grn: Groff-1.20.1 -- 説明
 ・ grodvi: Groff-1.20.1 -- 説明
 ・ groff: Groff-1.20.1 -- 説明
 ・ groffer: Groff-1.20.1 -- 説明
 ・ grog: Groff-1.20.1 -- 説明
 ・ grolbp: Groff-1.20.1 -- 説明
 ・ grolj4: Groff-1.20.1 -- 説明
 ・ grops: Groff-1.20.1 -- 説明
 ・ grotty: Groff-1.20.1 -- 説明
 ・ groupadd: Shadow-4.1.4.2 -- 説明
 ・ groupdel: Shadow-4.1.4.2 -- 説明
 ・ groupmems: Shadow-4.1.4.2 -- 説明
 ・ groupmod: Shadow-4.1.4.2 -- 説明
 ・ groups: Coreutils-8.4 -- 説明
 ・ grpck: Shadow-4.1.4.2 -- 説明
 ・ grpconv: Shadow-4.1.4.2 -- 説明
 ・ grpunconv: Shadow-4.1.4.2 -- 説明
 ・ grub-dumpbios: GRUB-1.97.2 -- 説明
 ・ grub-editenv: GRUB-1.97.2 -- 説明
 ・ grub-install: GRUB-1.97.2 -- 説明
 ・ grub-mkconfig: GRUB-1.97.2 -- 説明
 ・ grub-mkdevicemap: GRUB-1.97.2 -- 説明
 ・ grub-mkelfimage: GRUB-1.97.2 -- 説明
 ・ grub-mkfont: GRUB-1.97.2 -- 説明
 ・ grub-mkimage: GRUB-1.97.2 -- 説明
 ・ grub-mkrescue: GRUB-1.97.2 -- 説明
 ・ grub-probe: GRUB-1.97.2 -- 説明
 ・ grub-setup: GRUB-1.97.2 -- 説明
 ・ gtbl: Groff-1.20.1 -- 説明
 ・ gunzip: Gzip-1.4 -- 説明
 ・ gzexe: Gzip-1.4 -- 説明
 ・ gzip: Gzip-1.4 -- 説明
 ・ h2ph: Perl-5.10.1 -- 説明
 ・ h2xs: Perl-5.10.1 -- 説明
 ・ halt: Sysvinit-2.86 -- 説明
 ・ head: Coreutils-8.4 -- 説明
 ・ hexdump: Util-linux-ng-2.17 -- 説明
 ・ hostid: Coreutils-8.4 -- 説明
 ・ hostname: Inetutils-1.7 -- 説明
 ・ hostname: Gettext-0.17 -- 説明
 ・ hpftodit: Groff-1.20.1 -- 説明
 ・ hwclock: Util-linux-ng-2.17 -- 説明
 ・ i386: Util-linux-ng-2.17 -- 説明
 ・ iconv: Glibc-2.11.1 -- 説明
 ・ iconvconfig: Glibc-2.11.1 -- 説明
 ・ id: Coreutils-8.4 -- 説明
 ・ ifcfg: IPRoute2-2.6.31 -- 説明
 ・ ifnames: Autoconf-2.65 -- 説明
 ・ ifstat: IPRoute2-2.6.31 -- 説明
 ・ igawk: Gawk-3.1.7 -- 説明
 ・ indxbib: Groff-1.20.1 -- 説明
 ・ info: Texinfo-4.13a -- 説明
 ・ infocmp: Ncurses-5.7 -- 説明
 ・ infokey: Texinfo-4.13a -- 説明
 ・ infotocap: Ncurses-5.7 -- 説明
 ・ init: Sysvinit-2.86 -- 説明
 ・ insmod: Module-Init-Tools-3.11.1 -- 説明
 ・ insmod.static: Module-Init-Tools-3.11.1 -- 説明
 ・ install: Coreutils-8.4 -- 説明
 ・ install-info: Texinfo-4.13a -- 説明
 ・ install-sh: Automake-1.11.1 -- 説明
 ・ instmodsh: Perl-5.10.1 -- 説明
 ・ ionice: Util-linux-ng-2.17 -- 説明
 ・ ip: IPRoute2-2.6.31 -- 説明
 ・ ipcmk: Util-linux-ng-2.17 -- 説明
 ・ ipcrm: Util-linux-ng-2.17 -- 説明
 ・ ipcs: Util-linux-ng-2.17 -- 説明
 ・ isosize: Util-linux-ng-2.17 -- 説明
 ・ join: Coreutils-8.4 -- 説明
 ・ kbdrate: Kbd-1.15.1 -- 説明
 ・ kbd_mode: Kbd-1.15.1 -- 説明
 ・ kill: Procps-3.2.8 -- 説明
 ・ killall: Psmisc-22.10 -- 説明
 ・ killall5: Sysvinit-2.86 -- 説明
 ・ klogd: Sysklogd-1.5 -- 説明
 ・ last: Sysvinit-2.86 -- 説明
 ・ lastb: Sysvinit-2.86 -- 説明
 ・ lastlog: Shadow-4.1.4.2 -- 説明
 ・ ld: Binutils-2.20 -- 説明
 ・ ldattach: Util-linux-ng-2.17 -- 説明
 ・ ldconfig: Glibc-2.11.1 -- 説明
 ・ ldd: Glibc-2.11.1 -- 説明
 ・ lddlibc4: Glibc-2.11.1 -- 説明
 ・ less: Less-436 -- 説明
 ・ lessecho: Less-436 -- 説明
 ・ lesskey: Less-436 -- 説明
 ・ lex: Flex-2.5.35 -- 説明
 ・ lexgrog: Man-DB-2.5.6 -- 説明
 ・ lfskernel-2.6.32.8: Linux-2.6.32.8 -- 説明
 ・ libnetcfg: Perl-5.10.1 -- 説明
 ・ libtool: Libtool-2.2.6b -- 説明
 ・ libtoolize: Libtool-2.2.6b -- 説明
 ・ line: Util-linux-ng-2.17 -- 説明
 ・ link: Coreutils-8.4 -- 説明
 ・ linux32: Util-linux-ng-2.17 -- 説明
 ・ linux64: Util-linux-ng-2.17 -- 説明
 ・ lkbib: Groff-1.20.1 -- 説明
 ・ ln: Coreutils-8.4 -- 説明
 ・ lnstat: IPRoute2-2.6.31 -- 説明
 ・ loadkeys: Kbd-1.15.1 -- 説明
 ・ loadunimap: Kbd-1.15.1 -- 説明
 ・ locale: Glibc-2.11.1 -- 説明
 ・ localedef: Glibc-2.11.1 -- 説明
 ・ locate: Findutils-4.4.2 -- 説明
 ・ logger: Util-linux-ng-2.17 -- 説明
 ・ login: Shadow-4.1.4.2 -- 説明
 ・ logname: Coreutils-8.4 -- 説明
 ・ logoutd: Shadow-4.1.4.2 -- 説明
 ・ logsave: E2fsprogs-1.41.10 -- 説明
 ・ look: Util-linux-ng-2.17 -- 説明
 ・ lookbib: Groff-1.20.1 -- 説明
 ・ losetup: Util-linux-ng-2.17 -- 説明
 ・ ls: Coreutils-8.4 -- 説明
 ・ lsattr: E2fsprogs-1.41.10 -- 説明
 ・ lscpu: Util-linux-ng-2.17 -- 説明
 ・ lsmod: Module-Init-Tools-3.11.1 -- 説明
 ・ m4: M4-1.4.13 -- 説明
 ・ make: Make-3.81 -- 説明
 ・ makeinfo: Texinfo-4.13a -- 説明
 ・ man: Man-DB-2.5.6 -- 説明
 ・ mandb: Man-DB-2.5.6 -- 説明
 ・ manpath: Man-DB-2.5.6 -- 説明
 ・ mapscrn: Kbd-1.15.1 -- 説明
 ・ mcookie: Util-linux-ng-2.17 -- 説明
 ・ md5sum: Coreutils-8.4 -- 説明
 ・ mdate-sh: Automake-1.11.1 -- 説明
 ・ mesg: Sysvinit-2.86 -- 説明
 ・ missing: Automake-1.11.1 -- 説明
 ・ mkdir: Coreutils-8.4 -- 説明
 ・ mke2fs: E2fsprogs-1.41.10 -- 説明
 ・ mkfifo: Coreutils-8.4 -- 説明
 ・ mkfs: Util-linux-ng-2.17 -- 説明
 ・ mkfs.bfs: Util-linux-ng-2.17 -- 説明
 ・ mkfs.cramfs: Util-linux-ng-2.17 -- 説明
 ・ mkfs.ext2: E2fsprogs-1.41.10 -- 説明
 ・ mkfs.ext3: E2fsprogs-1.41.10 -- 説明
 ・ mkfs.ext4: E2fsprogs-1.41.10 -- 説明
 ・ mkfs.ext4dev: E2fsprogs-1.41.10 -- 説明
 ・ mkfs.minix: Util-linux-ng-2.17 -- 説明
 ・ mkinstalldirs: Automake-1.11.1 -- 説明
 ・ mklost+found: E2fsprogs-1.41.10 -- 説明
 ・ mknod: Coreutils-8.4 -- 説明
 ・ mkswap: Util-linux-ng-2.17 -- 説明
 ・ mktemp: Coreutils-8.4 -- 説明
 ・ mk_cmds: E2fsprogs-1.41.10 -- 説明
 ・ mmroff: Groff-1.20.1 -- 説明
 ・ modinfo: Module-Init-Tools-3.11.1 -- 説明
 ・ modprobe: Module-Init-Tools-3.11.1 -- 説明
 ・ more: Util-linux-ng-2.17 -- 説明
 ・ mount: Util-linux-ng-2.17 -- 説明
 ・ mountpoint: Sysvinit-2.86 -- 説明
 ・ msgattrib: Gettext-0.17 -- 説明
 ・ msgcat: Gettext-0.17 -- 説明
 ・ msgcmp: Gettext-0.17 -- 説明
 ・ msgcomm: Gettext-0.17 -- 説明
 ・ msgconv: Gettext-0.17 -- 説明
 ・ msgen: Gettext-0.17 -- 説明
 ・ msgexec: Gettext-0.17 -- 説明
 ・ msgfilter: Gettext-0.17 -- 説明
 ・ msgfmt: Gettext-0.17 -- 説明
 ・ msggrep: Gettext-0.17 -- 説明
 ・ msginit: Gettext-0.17 -- 説明
 ・ msgmerge: Gettext-0.17 -- 説明
 ・ msgunfmt: Gettext-0.17 -- 説明
 ・ msguniq: Gettext-0.17 -- 説明
 ・ mtrace: Glibc-2.11.1 -- 説明
 ・ mv: Coreutils-8.4 -- 説明
 ・ namei: Util-linux-ng-2.17 -- 説明
 ・ ncursesw5-config: Ncurses-5.7 -- 説明
 ・ neqn: Groff-1.20.1 -- 説明
 ・ newgrp: Shadow-4.1.4.2 -- 説明
 ・ newusers: Shadow-4.1.4.2 -- 説明
 ・ ngettext: Gettext-0.17 -- 説明
 ・ nice: Coreutils-8.4 -- 説明
 ・ nl: Coreutils-8.4 -- 説明
 ・ nm: Binutils-2.20 -- 説明
 ・ nohup: Coreutils-8.4 -- 説明
 ・ nologin: Shadow-4.1.4.2 -- 説明
 ・ nproc: Coreutils-8.4 -- 説明
 ・ nroff: Groff-1.20.1 -- 説明
 ・ nscd: Glibc-2.11.1 -- 説明
 ・ nstat: IPRoute2-2.6.31 -- 説明
 ・ objcopy: Binutils-2.20 -- 説明
 ・ objdump: Binutils-2.20 -- 説明
 ・ od: Coreutils-8.4 -- 説明
 ・ oldfind: Findutils-4.4.2 -- 説明
 ・ openvt: Kbd-1.15.1 -- 説明
 ・ partx: Util-linux-ng-2.17 -- 説明
 ・ passwd: Shadow-4.1.4.2 -- 説明
 ・ paste: Coreutils-8.4 -- 説明
 ・ patch: Patch-2.6.1 -- 説明
 ・ pathchk: Coreutils-8.4 -- 説明
 ・ path_id: Udev-151 -- 説明
 ・ pcprofiledump: Glibc-2.11.1 -- 説明
 ・ pdfroff: Groff-1.20.1 -- 説明
 ・ pdftexi2dvi: Texinfo-4.13a -- 説明
 ・ peekfd: Psmisc-22.10 -- 説明
 ・ perl: Perl-5.10.1 -- 説明
 ・ perl5.10.1: Perl-5.10.1 -- 説明
 ・ perlbug: Perl-5.10.1 -- 説明
 ・ perldoc: Perl-5.10.1 -- 説明
 ・ perlivp: Perl-5.10.1 -- 説明
 ・ pfbtops: Groff-1.20.1 -- 説明
 ・ pg: Util-linux-ng-2.17 -- 説明
 ・ pgawk: Gawk-3.1.7 -- 説明
 ・ pgawk-3.1.7: Gawk-3.1.7 -- 説明
 ・ pgrep: Procps-3.2.8 -- 説明
 ・ pic: Groff-1.20.1 -- 説明
 ・ pic2graph: Groff-1.20.1 -- 説明
 ・ piconv: Perl-5.10.1 -- 説明
 ・ pidof: Sysvinit-2.86 -- 説明
 ・ ping: Inetutils-1.7 -- 説明
 ・ ping6: Inetutils-1.7 -- 説明
 ・ pinky: Coreutils-8.4 -- 説明
 ・ pivot_root: Util-linux-ng-2.17 -- 説明
 ・ pkg-config: Pkg-config-0.23 -- 説明
 ・ pkill: Procps-3.2.8 -- 説明
 ・ pl2pm: Perl-5.10.1 -- 説明
 ・ pmap: Procps-3.2.8 -- 説明
 ・ pod2html: Perl-5.10.1 -- 説明
 ・ pod2latex: Perl-5.10.1 -- 説明
 ・ pod2man: Perl-5.10.1 -- 説明
 ・ pod2text: Perl-5.10.1 -- 説明
 ・ pod2usage: Perl-5.10.1 -- 説明
 ・ podchecker: Perl-5.10.1 -- 説明
 ・ podselect: Perl-5.10.1 -- 説明
 ・ post-grohtml: Groff-1.20.1 -- 説明
 ・ poweroff: Sysvinit-2.86 -- 説明
 ・ pr: Coreutils-8.4 -- 説明
 ・ pre-grohtml: Groff-1.20.1 -- 説明
 ・ preconv: Groff-1.20.1 -- 説明
 ・ printenv: Coreutils-8.4 -- 説明
 ・ printf: Coreutils-8.4 -- 説明
 ・ prove: Perl-5.10.1 -- 説明
 ・ ps: Procps-3.2.8 -- 説明
 ・ psed: Perl-5.10.1 -- 説明
 ・ psfaddtable: Kbd-1.15.1 -- 説明
 ・ psfgettable: Kbd-1.15.1 -- 説明
 ・ psfstriptable: Kbd-1.15.1 -- 説明
 ・ psfxtable: Kbd-1.15.1 -- 説明
 ・ pstree: Psmisc-22.10 -- 説明
 ・ pstree.x11: Psmisc-22.10 -- 説明
 ・ pstruct: Perl-5.10.1 -- 説明
 ・ ptar: Perl-5.10.1 -- 説明
 ・ ptardiff: Perl-5.10.1 -- 説明
 ・ ptx: Coreutils-8.4 -- 説明
 ・ pt_chown: Glibc-2.11.1 -- 説明
 ・ pwcat: Gawk-3.1.7 -- 説明
 ・ pwck: Shadow-4.1.4.2 -- 説明
 ・ pwconv: Shadow-4.1.4.2 -- 説明
 ・ pwd: Coreutils-8.4 -- 説明
 ・ pwdx: Procps-3.2.8 -- 説明
 ・ pwunconv: Shadow-4.1.4.2 -- 説明
 ・ py-compile: Automake-1.11.1 -- 説明
 ・ ranlib: Binutils-2.20 -- 説明
 ・ rcp: Inetutils-1.7 -- 説明
 ・ readelf: Binutils-2.20 -- 説明
 ・ readlink: Coreutils-8.4 -- 説明
 ・ readprofile: Util-linux-ng-2.17 -- 説明
 ・ reboot: Sysvinit-2.86 -- 説明
 ・ recode-sr-latin: Gettext-0.17 -- 説明
 ・ refer: Groff-1.20.1 -- 説明
 ・ rename: Util-linux-ng-2.17 -- 説明
 ・ renice: Util-linux-ng-2.17 -- 説明
 ・ reset: Ncurses-5.7 -- 説明
 ・ resize2fs: E2fsprogs-1.41.10 -- 説明
 ・ resizecons: Kbd-1.15.1 -- 説明
 ・ rev: Util-linux-ng-2.17 -- 説明
 ・ rexec: Inetutils-1.7 -- 説明
 ・ rlogin: Inetutils-1.7 -- 説明
 ・ rm: Coreutils-8.4 -- 説明
 ・ rmdir: Coreutils-8.4 -- 説明
 ・ rmmod: Module-Init-Tools-3.11.1 -- 説明
 ・ rmt: Tar-1.22 -- 説明
 ・ roff2dvi: Groff-1.20.1 -- 説明
 ・ roff2html: Groff-1.20.1 -- 説明
 ・ roff2pdf: Groff-1.20.1 -- 説明
 ・ roff2ps: Groff-1.20.1 -- 説明
 ・ roff2text: Groff-1.20.1 -- 説明
 ・ roff2x: Groff-1.20.1 -- 説明
 ・ routef: IPRoute2-2.6.31 -- 説明
 ・ routel: IPRoute2-2.6.31 -- 説明
 ・ rpcgen: Glibc-2.11.1 -- 説明
 ・ rpcinfo: Glibc-2.11.1 -- 説明
 ・ rsh: Inetutils-1.7 -- 説明
 ・ rtacct: IPRoute2-2.6.31 -- 説明
 ・ rtcwake: Util-linux-ng-2.17 -- 説明
 ・ rtmon: IPRoute2-2.6.31 -- 説明
 ・ rtpr: IPRoute2-2.6.31 -- 説明
 ・ rtstat: IPRoute2-2.6.31 -- 説明
 ・ runcon: Coreutils-8.4 -- 説明
 ・ runlevel: Sysvinit-2.86 -- 説明
 ・ runtest: DejaGNU-1.4.4 -- 説明
 ・ rview: Vim-7.2 -- 説明
 ・ rvim: Vim-7.2 -- 説明
 ・ s2p: Perl-5.10.1 -- 説明
 ・ script: Util-linux-ng-2.17 -- 説明
 ・ scriptreplay: Util-linux-ng-2.17 -- 説明
 ・ scsi_id: Udev-151 -- 説明
 ・ sdiff: Diffutils-2.8.1 -- 説明
 ・ sed: Sed-4.2.1 -- 説明
 ・ seq: Coreutils-8.4 -- 説明
 ・ setarch: Util-linux-ng-2.17 -- 説明
 ・ setfont: Kbd-1.15.1 -- 説明
 ・ setkeycodes: Kbd-1.15.1 -- 説明
 ・ setleds: Kbd-1.15.1 -- 説明
 ・ setmetamode: Kbd-1.15.1 -- 説明
 ・ setsid: Util-linux-ng-2.17 -- 説明
 ・ setterm: Util-linux-ng-2.17 -- 説明
 ・ sfdisk: Util-linux-ng-2.17 -- 説明
 ・ sg: Shadow-4.1.4.2 -- 説明
 ・ sh: Bash-4.1 -- 説明
 ・ sha1sum: Coreutils-8.4 -- 説明
 ・ sha224sum: Coreutils-8.4 -- 説明
 ・ sha256sum: Coreutils-8.4 -- 説明
 ・ sha384sum: Coreutils-8.4 -- 説明
 ・ sha512sum: Coreutils-8.4 -- 説明
 ・ shasum: Perl-5.10.1 -- 説明
 ・ showconsolefont: Kbd-1.15.1 -- 説明
 ・ showkey: Kbd-1.15.1 -- 説明
 ・ shred: Coreutils-8.4 -- 説明
 ・ shuf: Coreutils-8.4 -- 説明
 ・ shutdown: Sysvinit-2.86 -- 説明
 ・ size: Binutils-2.20 -- 説明
 ・ skill: Procps-3.2.8 -- 説明
 ・ slabtop: Procps-3.2.8 -- 説明
 ・ sleep: Coreutils-8.4 -- 説明
 ・ sln: Glibc-2.11.1 -- 説明
 ・ snice: Procps-3.2.8 -- 説明
 ・ soelim: Groff-1.20.1 -- 説明
 ・ sort: Coreutils-8.4 -- 説明
 ・ splain: Perl-5.10.1 -- 説明
 ・ split: Coreutils-8.4 -- 説明
 ・ sprof: Glibc-2.11.1 -- 説明
 ・ ss: IPRoute2-2.6.31 -- 説明
 ・ stat: Coreutils-8.4 -- 説明
 ・ stdbuf: Coreutils-8.4 -- 説明
 ・ strings: Binutils-2.20 -- 説明
 ・ strip: Binutils-2.20 -- 説明
 ・ stty: Coreutils-8.4 -- 説明
 ・ su: Shadow-4.1.4.2 -- 説明
 ・ sulogin: Sysvinit-2.86 -- 説明
 ・ sum: Coreutils-8.4 -- 説明
 ・ swapoff: Util-linux-ng-2.17 -- 説明
 ・ swapon: Util-linux-ng-2.17 -- 説明
 ・ switch_root: Util-linux-ng-2.17 -- 説明
 ・ symlink-tree: Automake-1.11.1 -- 説明
 ・ sync: Coreutils-8.4 -- 説明
 ・ sysctl: Procps-3.2.8 -- 説明
 ・ syslogd: Sysklogd-1.5 -- 説明
 ・ tac: Coreutils-8.4 -- 説明
 ・ tail: Coreutils-8.4 -- 説明
 ・ tailf: Util-linux-ng-2.17 -- 説明
 ・ talk: Inetutils-1.7 -- 説明
 ・ tar: Tar-1.22 -- 説明
 ・ taskset: Util-linux-ng-2.17 -- 説明
 ・ tbl: Groff-1.20.1 -- 説明
 ・ tc: IPRoute2-2.6.31 -- 説明
 ・ tclsh: Tcl-8.5.8 -- 説明
 ・ tclsh8.5: Tcl-8.5.8 -- 説明
 ・ tee: Coreutils-8.4 -- 説明
 ・ telinit: Sysvinit-2.86 -- 説明
 ・ telnet: Inetutils-1.7 -- 説明
 ・ test: Coreutils-8.4 -- 説明
 ・ texi2dvi: Texinfo-4.13a -- 説明
 ・ texi2pdf: Texinfo-4.13a -- 説明
 ・ texindex: Texinfo-4.13a -- 説明
 ・ tfmtodit: Groff-1.20.1 -- 説明
 ・ tftp: Inetutils-1.7 -- 説明
 ・ tic: Ncurses-5.7 -- 説明
 ・ timeout: Coreutils-8.4 -- 説明
 ・ tload: Procps-3.2.8 -- 説明
 ・ toe: Ncurses-5.7 -- 説明
 ・ top: Procps-3.2.8 -- 説明
 ・ touch: Coreutils-8.4 -- 説明
 ・ tput: Ncurses-5.7 -- 説明
 ・ tr: Coreutils-8.4 -- 説明
 ・ traceroute: Inetutils-1.7 -- 説明
 ・ troff: Groff-1.20.1 -- 説明
 ・ true: Coreutils-8.4 -- 説明
 ・ truncate: Coreutils-8.4 -- 説明
 ・ tset: Ncurses-5.7 -- 説明
 ・ tsort: Coreutils-8.4 -- 説明
 ・ tty: Coreutils-8.4 -- 説明
 ・ tune2fs: E2fsprogs-1.41.10 -- 説明
 ・ tunelp: Util-linux-ng-2.17 -- 説明
 ・ tzselect: Glibc-2.11.1 -- 説明
 ・ udevadm: Udev-151 -- 説明
 ・ udevd: Udev-151 -- 説明
 ・ ul: Util-linux-ng-2.17 -- 説明
 ・ umount: Util-linux-ng-2.17 -- 説明
 ・ uname: Coreutils-8.4 -- 説明
 ・ uncompress: Gzip-1.4 -- 説明
 ・ unexpand: Coreutils-8.4 -- 説明
 ・ unicode_start: Kbd-1.15.1 -- 説明
 ・ unicode_stop: Kbd-1.15.1 -- 説明
 ・ uniq: Coreutils-8.4 -- 説明
 ・ unlink: Coreutils-8.4 -- 説明
 ・ updatedb: Findutils-4.4.2 -- 説明
 ・ uptime: Procps-3.2.8 -- 説明
 ・ usb_id: Udev-151 -- 説明
 ・ useradd: Shadow-4.1.4.2 -- 説明
 ・ userdel: Shadow-4.1.4.2 -- 説明
 ・ usermod: Shadow-4.1.4.2 -- 説明
 ・ users: Coreutils-8.4 -- 説明
 ・ utmpdump: Sysvinit-2.86 -- 説明
 ・ uuidd: Util-linux-ng-2.17 -- 説明
 ・ uuidgen: Util-linux-ng-2.17 -- 説明
 ・ vdir: Coreutils-8.4 -- 説明
 ・ vi: Vim-7.2 -- 説明
 ・ view: Vim-7.2 -- 説明
 ・ vigr: Shadow-4.1.4.2 -- 説明
 ・ vim: Vim-7.2 -- 説明
 ・ vimdiff: Vim-7.2 -- 説明
 ・ vimtutor: Vim-7.2 -- 説明
 ・ vipw: Shadow-4.1.4.2 -- 説明
 ・ vmstat: Procps-3.2.8 -- 説明
 ・ w: Procps-3.2.8 -- 説明
 ・ wall: Util-linux-ng-2.17 -- 説明
 ・ watch: Procps-3.2.8 -- 説明
 ・ wc: Coreutils-8.4 -- 説明
 ・ whatis: Man-DB-2.5.6 -- 説明
 ・ whereis: Util-linux-ng-2.17 -- 説明
 ・ who: Coreutils-8.4 -- 説明
 ・ whoami: Coreutils-8.4 -- 説明
 ・ write: Util-linux-ng-2.17 -- 説明
 ・ write_cd_rules: Udev-151 -- 説明
 ・ write_net_rules: Udev-151 -- 説明
 ・ xargs: Findutils-4.4.2 -- 説明
 ・ xgettext: Gettext-0.17 -- 説明
 ・ xsubpp: Perl-5.10.1 -- 説明
 ・ xtrace: Glibc-2.11.1 -- 説明
 ・ xxd: Vim-7.2 -- 説明
 ・ yacc: Bison-2.4.1 -- 説明
 ・ yes: Coreutils-8.4 -- 説明
 ・ ylwrap: Automake-1.11.1 -- 説明
 ・ zcat: Gzip-1.4 -- 説明
 ・ zcmp: Gzip-1.4 -- 説明
 ・ zdiff: Gzip-1.4 -- 説明
 ・ zdump: Glibc-2.11.1 -- 説明
 ・ zegrep: Gzip-1.4 -- 説明
 ・ zfgrep: Gzip-1.4 -- 説明
 ・ zforce: Gzip-1.4 -- 説明
 ・ zgrep: Gzip-1.4 -- 説明
 ・ zic: Glibc-2.11.1 -- 説明
 ・ zless: Gzip-1.4 -- 説明
 ・ zmore: Gzip-1.4 -- 説明
 ・ znew: Gzip-1.4 -- 説明
 ・ zsoelim: Man-DB-2.5.6 -- 説明

ライブラリ

 ・ ld.so: Glibc-2.11.1 -- 説明
 ・ libanl: Glibc-2.11.1 -- 説明
 ・ libasprintf: Gettext-0.17 -- 説明
 ・ libbfd: Binutils-2.20 -- 説明
 ・ libblkid: Util-linux-ng-2.17 -- 説明
 ・ libBrokenLocale: Glibc-2.11.1 -- 説明
 ・ libbsd-compat: Glibc-2.11.1 -- 説明
 ・ libbz2*: Bzip2-1.0.5 -- 説明
 ・ libc: Glibc-2.11.1 -- 説明
 ・ libcidn: Glibc-2.11.1 -- 説明
 ・ libcom_err: E2fsprogs-1.41.10 -- 説明
 ・ libcrypt: Glibc-2.11.1 -- 説明
 ・ libcurses: Ncurses-5.7 -- 説明
 ・ libdl: Glibc-2.11.1 -- 説明
 ・ libe2p: E2fsprogs-1.41.10 -- 説明
 ・ libexpect-5.43: Expect-5.43.0 -- 説明
 ・ libext2fs: E2fsprogs-1.41.10 -- 説明
 ・ libfl.a: Flex-2.5.35 -- 説明
 ・ libform: Ncurses-5.7 -- 説明
 ・ libg: Glibc-2.11.1 -- 説明
 ・ libgcc*: GCC-4.4.3 -- 説明
 ・ libgcov: GCC-4.4.3 -- 説明
 ・ libgdbm: GDBM-1.8.3 -- 説明
 ・ libgettextlib: Gettext-0.17 -- 説明
 ・ libgettextpo: Gettext-0.17 -- 説明
 ・ libgettextsrc: Gettext-0.17 -- 説明
 ・ libgmp: GMP-5.0.0 -- 説明
 ・ libgmpxx: GMP-5.0.0 -- 説明
 ・ libgomp: GCC-4.4.3 -- 説明
 ・ libhistory: Readline-6.1 -- 説明
 ・ libiberty: Binutils-2.20 -- 説明
 ・ libieee: Glibc-2.11.1 -- 説明
 ・ libltdl: Libtool-2.2.6b -- 説明
 ・ libm: Glibc-2.11.1 -- 説明
 ・ libmagic: File-5.04 -- 説明
 ・ libmcheck: Glibc-2.11.1 -- 説明
 ・ libmemusage: Glibc-2.11.1 -- 説明
 ・ libmenu: Ncurses-5.7 -- 説明
 ・ libmp: GMP-5.0.0 -- 説明
 ・ libmpfr: MPFR-2.4.2 -- 説明
 ・ libmudflap*: GCC-4.4.3 -- 説明
 ・ libncurses: Ncurses-5.7 -- 説明
 ・ libnsl: Glibc-2.11.1 -- 説明
 ・ libnss: Glibc-2.11.1 -- 説明
 ・ libopcodes: Binutils-2.20 -- 説明
 ・ libpanel: Ncurses-5.7 -- 説明
 ・ libpcprofile: Glibc-2.11.1 -- 説明
 ・ libproc: Procps-3.2.8 -- 説明
 ・ libpthread: Glibc-2.11.1 -- 説明
 ・ libreadline: Readline-6.1 -- 説明
 ・ libresolv: Glibc-2.11.1 -- 説明
 ・ librpcsvc: Glibc-2.11.1 -- 説明
 ・ librt: Glibc-2.11.1 -- 説明
 ・ libSegFault: Glibc-2.11.1 -- 説明
 ・ libss: E2fsprogs-1.41.10 -- 説明
 ・ libssp*: GCC-4.4.3 -- 説明
 ・ libstdc++: GCC-4.4.3 -- 説明
 ・ libsupc++: GCC-4.4.3 -- 説明
 ・ libtcl8.5.so: Tcl-8.5.8 -- 説明
 ・ libtclstub8.5.a: Tcl-8.5.8 -- 説明
 ・ libthread_db: Glibc-2.11.1 -- 説明
 ・ libudev: Udev-151 -- 説明
 ・ libutil: Glibc-2.11.1 -- 説明
 ・ libuuid: Util-linux-ng-2.17 -- 説明
 ・ liby.a: Bison-2.4.1 -- 説明
 ・ libz: Zlib-1.2.3 -- 説明
 ・ preloadable_libintl: Gettext-0.17 -- 説明

スクリプト

 ・ checkfs: LFS-ブートスクリプト-20100124 -- 説明
 ・ cleanfs: LFS-ブートスクリプト-20100124 -- 説明
 ・ console: LFS-ブートスクリプト-20100124 -- 説明
     □ 設定: Linux コンソールの設定
 ・ consolelog: LFS-ブートスクリプト-20100124 -- 説明
     □ 設定: Linux コンソールの設定
 ・ functions: LFS-ブートスクリプト-20100124 -- 説明
 ・ halt: LFS-ブートスクリプト-20100124 -- 説明
 ・ ifdown: LFS-ブートスクリプト-20100124 -- 説明
 ・ ifup: LFS-ブートスクリプト-20100124 -- 説明
 ・ localnet: LFS-ブートスクリプト-20100124 -- 説明
     □ /etc/hosts: /etc/hosts ファイルの設定
     □ 設定: localnet スクリプトの設定
 ・ modules: LFS-ブートスクリプト-20100124 -- 説明
 ・ mountfs: LFS-ブートスクリプト-20100124 -- 説明
 ・ mountkernfs: LFS-ブートスクリプト-20100124 -- 説明
 ・ network: LFS-ブートスクリプト-20100124 -- 説明
     □ /etc/hosts: /etc/hosts ファイルの設定
     □ 設定: ネットワークスクリプトの設定
 ・ rc: LFS-ブートスクリプト-20100124 -- 説明
 ・ reboot: LFS-ブートスクリプト-20100124 -- 説明
 ・ sendsignals: LFS-ブートスクリプト-20100124 -- 説明
 ・ setclock: LFS-ブートスクリプト-20100124 -- 説明
     □ 設定: Setclock スクリプトの設定
 ・ static: LFS-ブートスクリプト-20100124 -- 説明
 ・ swap: LFS-ブートスクリプト-20100124 -- 説明
 ・ sysctl: LFS-ブートスクリプト-20100124 -- 説明
 ・ sysklogd: LFS-ブートスクリプト-20100124 -- 説明
     □ 設定: Sysklogd スクリプトの設定
 ・ template: LFS-ブートスクリプト-20100124 -- 説明
 ・ udev: LFS-ブートスクリプト-20100124 -- 説明
 ・ udev_retry: LFS-ブートスクリプト-20100124 -- 説明

その他

 ・ /boot/config-2.6.32.8: Linux-2.6.32.8 -- 説明
 ・ /boot/System.map-2.6.32.8: Linux-2.6.32.8 -- 説明
 ・ /dev/*: 仮想カーネルファイルシステムの準備
 ・ /etc/fstab: /etc/fstab ファイルの生成
 ・ /etc/group: 基本的なファイルとリンクの生成
 ・ /etc/hosts: /etc/hosts ファイルの設定
 ・ /etc/inittab: Sysvinit の設定
 ・ /etc/inputrc: /etc/inputrc ファイルの生成
 ・ /etc/ld.so.conf: ダイナミックローダの設定
 ・ /etc/lfs-release: 作業終了
 ・ /etc/localtime: Glibc の設定
 ・ /etc/modprobe.d/usb.conf: Linux モジュールのロード順の設定
 ・ /etc/nsswitch.conf: Glibc の設定
 ・ /etc/passwd: 基本的なファイルとリンクの生成
 ・ /etc/profile: Bash シェルの初期起動ファイル
 ・ /etc/protocols: Iana-Etc-2.30
 ・ /etc/resolv.conf: /etc/resolv.conf ファイルの生成
 ・ /etc/services: Iana-Etc-2.30
 ・ /etc/syslog.conf: Sysklogd の設定
 ・ /etc/udev: Udev-151 -- 説明
 ・ /etc/vimrc: Vim の設定
 ・ /usr/include/asm-generic/*.h: Linux-2.6.32.8 API ヘッダ -- 説明
 ・ /usr/include/asm/*.h: Linux-2.6.32.8 API ヘッダ -- 説明
 ・ /usr/include/drm/*.h: Linux-2.6.32.8 API ヘッダ -- 説明
 ・ /usr/include/linux/*.h: Linux-2.6.32.8 API ヘッダ -- 説明
 ・ /usr/include/mtd/*.h: Linux-2.6.32.8 API ヘッダ -- 説明
 ・ /usr/include/rdma/*.h: Linux-2.6.32.8 API ヘッダ -- 説明
 ・ /usr/include/scsi/*.h: Linux-2.6.32.8 API ヘッダ -- 説明
 ・ /usr/include/sound/*.h: Linux-2.6.32.8 API ヘッダ -- 説明
 ・ /usr/include/video/*.h: Linux-2.6.32.8 API ヘッダ -- 説明
 ・ /usr/include/xen/*.h: Linux-2.6.32.8 API ヘッダ -- 説明
 ・ /var/log/btmp: 基本的なファイルとリンクの生成
 ・ /var/log/lastlog: 基本的なファイルとリンクの生成
 ・ /var/log/wtmp: 基本的なファイルとリンクの生成
 ・ /var/run/utmp: 基本的なファイルとリンクの生成
 ・ man pages: Man-pages-3.23 -- 説明

