  From Power Up To Bash Prompt
  Greg O'Keefe, gcokeefe@postoffice.utas.edu.au
  v0.9, November 2000
  日本語訳 千旦裕司
  v0.9j November 2000

  この文書は、電源を入れてからログインし、 bash プロンプトが表示されるま
  でに Linux システム上で何が起こっているのかを簡潔に解説したものであ
  る。この文書を理解しておけば、問題の解決やシステムの設定が必要になった
  ときに役に立つだろう。
  ______________________________________________________________________

  目次

  1. Introduction
  2. ハードウェア
     2.1 設定
     2.2 演習
     2.3 参考文献等

  3. Lilo
     3.1 設定
     3.2 演習
     3.3 参考文献等

  4. Linux カーネル
     4.1 設定
     4.2 演習
     4.3 参考文献等

  5. GNU C ライブラリ
     5.1 設定
     5.2 演習
     5.3 参考文献等

  6. Init
     6.1 設定
     6.2 演習
     6.3 参考文献等

  7. ファイルシステム
     7.1 設定
     7.2 演習
     7.3 参考文献等

  8. カーネルデーモン
     8.1 設定
     8.2 演習
     8.3 参考文献等

  9. システムのログ記録
     9.1 設定
     9.2 演習
     9.3 参考文献等

  10. Getty と login
     10.1 設定
     10.2 演習

  11. Bash
     11.1 設定
     11.2 演習
     11.3 参考文献等

  12. コマンド
  13. 結論
  14. Administrivia
     14.1 Copyright
     14.2 ホームページ
     14.3 フィードバック
     14.4 Acknowledgements
     14.5 改訂履歴
        14.5.1 0.8 -> 0.9 (November 2000)
        14.5.2 0.7 -> 0.8 (September 2000)
        14.5.3 0.6 -> 0.7
        14.5.4 0.5 -> 0.6
     14.6 TODO
     14.7 日本語訳について

  ______________________________________________________________________

  1.  Introduction

  よく分からない多くのことが自分の Linux マシンで起きていると思うと、わ
  たしはもどかしくて仕方がない。もし、わたしと同じように、単に使い方が分
  かるというだけでなく、本当にシステムを理解したいと思うなら、この文書は
  その出発点となるだろう。Linux における問題解決の権威を目指しているとし
  ても、この種の基礎知識は必要である。

  Linux の稼働するマシンを持っていることと、Unix および PC ハードウェア
  の基本を理解していることが前提になる。もしそうでない場合、それらを学ぶ
  ための入門書として、Eric Raymond の次の文献が優れている。
  The Unix and Internet Fundamentals HOWTO
  <http://www.linuxdoc.org/HOWTO/Unix-and-Internet-Fundamentals-
  HOWTO.html> (日本語訳 <http://www.linux.or.jp/JF/JFdocs/Unix-and-
  Internet-Fundamentals-HOWTO/index.html>).  これは、簡潔で読み易く、基
  本事項が網羅されている。

  この文書の主題は、Linux の起動の仕組みである。しかし、むしろ分かり易い
  学習の手引きにもなるよう意図されている。各章に演習を設けてあるので、実
  際にいくつかを実行するなら、読んだだけの時よりもいっそう多くのことを学
  べるだろう。

  わたしの知る限り、Linux を学ぶ最良の演習は、ソースコードからのシステム
  を構築することである。わたしは、それに挑戦する読者がいることを期待して
  いる。イタリアの哲学者 Giambattista Vico (1688-1744) は、"verum ipsum
  factum" と言っている。この意味は、「理解は、作ることから生まれる」とい
  うことである。この言葉を教えてくれた Alex (``Acknowledgements''を参
  照)に感謝している。

  ソースからシステムを構築したいなら、Gerard Beekmans の文書Linux From
  Scratch HOWTO <http://www.linuxfromscratch.org> (LFS) も見るべきだろ
  う。LFS はソースコードから本当に実用的なシステムをつくるための詳細な手
  引書である。LFS のウェブサイトには、そうした方法でシステムを構築しよう
  とする人向けのメーリングリストもある。これまでこの文書の一部であった簡
  単な構築方法の紹介は、現在 "Building a Minimal Linux System from
  Source Code (日本語訳 <http://www.linux.or.jp/JF/JFdocs/Building-
  Minimal-Linux.html>)" という別の文書となっていて、 From PowerUp to
  Bash Prompt home page <http://www.netspace.net.au/~gok/power2bash> で
  入手可能となっている。その文書で述べているのは、純粋な練習課題として
  「おもちゃ(toy)」のシステムを作る方法である。(訳注: LFS は翻訳時におい
  て、日本語訳作業が進行中です)

  登場するパッケージは、システムが起動する過程で現れる順番に並んでいる。
  つまり、その順序でインストールすれば、インストールするたびに再起動でき
  て、しかもシステムが毎回少しずつ bash プロンプトの表示に近づいていくの
  が分かるわけである。それによって、着実に進歩していることが実感できる。

  最初は、演習と参考文献等をとばして、各章の本文だけ読むことをお薦めす
  る。そして、どれだけ理解を深めたいか、どのくらい努力するつもりかはっき
  り決めて、もう一度初めにもどり、演習と参考文献等にあたってみてほしい。

  2.  ハードウェア

  まず、コンピュータの電源を入れると、コンピュータはすべてが稼働できる状
  態にあるかを自己診断する。これは、パワーオンセルフテスト(Power on self
  test)と呼ばれる。次に ROM BIOS に置かれたブートストラップロー
  ダ(bootstrap loader)というプログラムが、ブートセクタを探す。ブートセク
  タとはディスクの先頭のセクタで、オペレーティングシステムを(メモリに)ロ
  ードする機能を持った小さなプログラムが乗っている。ブートセクタの
  0x1FE(=510) バイト目には 0xAA55(=43605) のマジックナンバー(訳注:ファイ
  ル形式を判断するためのナンバー)がマークされている。マークされた位置は
  セクタの末尾 2 バイトに当たる。このマークの有無で、そのセクタがブート
  セクタであるかどうかをハードウェア側で識別できるわけである。

  ブートストラップローダには、ブートセクタを探すべき場所のリストが収めら
  れている。わたしの古いマシンは、プライマリフロッピードライブを探したあ
  と、プライマリハードドライブを探す。もっと新しいマシンでは CD-ROM のブ
  ートセクタを探すこともできる。ブートセクタが見つかれば、そこにあるプロ
  グラムをメモリにロードしそれに制御を任せる。そしてそのプログラムが、オ
  ペレーティングシステムをロードする。典型的な Linux システムでは、その
  プログラムとは lilo の第一ステージのブートローダのことになるだろう。し
  かしシステム起動のための設定方法は多種多様であるから、詳細について
  は、LILO User's Guide (日本語訳
  <http://www.linux.or.jp/JF/JFdocs/LILO-README/index.html>)を見てほし
  い。URL については下記を参照のこと。``LILO''

  PC のハードウェアの動作について語るべきことは確かにまだまだあるのだ
  が、ここはそれを述べるべき場所ではない。PC のハードウェアに関しては良
  書がそろっているからそのひとつを読んでほしい。

  2.1.  設定

  マシンはある種の自己情報を CMOS 内に保持している。その中には、どういう
  ディスクや RAM がシステムに存在するのかという情報も含まれる。マシンの
  BIOS にあるプログラムを使えばそうした情報の設定変更ができる。電源を入
  れたときスクリーンに表示されるメッセージに注意すれば、どうやってそのプ
  ログラムにアクセスするか分かるだろう。わたしのマシンでは、オペレーティ
  ングシステムがロードされる前に delete キーを押すようになっている。

  2.2.  演習

  中古部品を使ってマシンを組み立てることは、PC ハードウェアを知る上で良
  い方法である。最低でも 386 CPU を手に入れよう。そうすれば、簡単に
  Linux を走らせることができる。それほど費用はかからないだろう。周囲の友
  人に尋ねてみれば、必要なパーツを譲ってくれるかもしれない。

  unios <http://www.netspace.net.au/~gok/resources>をダウンロードし、コ
  ンパイルしてブートディスクを作ること。(これまでは下記にホームページが
  あったのだが、消えてしまった。 <http://www.unios.org>)
  これは、ブート機能を持った簡単な (Hello World) プログラムであり、100
  行ちょっとのアセンブラコードでできている。GNU のアセンブラである as で
  理解できるフォーマットに変換されているので、見てみるとよい。

  hex editor を使って unios のブートディスクイメージを開くこと。このイメ
  ージは 512 バイトあり、ちょうど 1 セクタ分である。マジックナンバー
  0xAA55 を探すこと。起動用フロッピーディスクやコンピュータにあるブート
  セクタでも同じことをしてほしい。dd コマンドを使えば、それをファイルに
  コピーできる。dd if=/dev/fd0 of=boot.sector
  if(input file) と of(output file) とを逆にしないように特に注意するこ
  と！

  LILO のブートローダのコードもチェックすること。

  2.3.  参考文献等

  o  The Unix and Internet Fundamentals HOWTO
     <http://www.linuxdoc.org/HOWTO/Unix-and-Internet-Fundamentals-
     HOWTO/index.html> by Eric S. Raymond, 特に第三章の「コンピュータの
     電源を入れた時に何が起こるのか?」がよい。 (日本語訳
     <http://www.linux.or.jp/JF/JFdocs/Unix-and-Internet-Fundamentals-
     HOWTO/bootup.html>)

  o  The LILO User's Guide (日本語訳
     <http://www.linux.or.jp/JF/JFdocs/LILO-README/index.html>)の第一章
     には、PC のディスクパーティションと起動に関する優れた解説があ
     る。URL については、``LILO'' の章を参照すること。

  o  The NEW Peter Norton Programmer's Guide to the IBM PC & PS/2, by
     Peter Norton and Richard Wilton, Microsoft Press 1988
     新しい Norton 本である。なかなかいいようだが、今は手が出ない。

  o  PC のアップグレードに関する多くの本のなかの一冊。

  3.  Lilo

  一般的な Linux システム上でコンピュータがブートセクタをロードすると
  き、実際にロードしているのは lilo の一部である。それは「第一ステージブ
  ートローダ(first stage boot loader)」と呼ばれる小さなプログラムで、そ
  れに割り当てられた唯一の仕事は「第二ステージブートローダ (second stage
  boot loader)」をロードして実行することである。

  第二ステージ(ブート)ローダは、(インストールされた方法にもよるのだが)プ
  ロンプトを表示し、そこで選択されたオペレーティングシステムをロードす
  る。

  システムが立ち上がった後で lilo と打った場合、実際に実行されるのは、
  「マップインストーラー(map installer)」である。このプログラムが設定
  ファイルである /etc/lilo.conf を読み込んで、ハードディスクにブートロー
  ダを書き込み、同時にロードできるオペレーティングシステムに関する情報も
  書き込む。

  システムを起動させる方法には様々な種類がある。いま説明した方法は、少な
  くとも Linux をメインとするシステムにおいては、もっとも分かり易い普通
  の方法である。 "The Lilo Users's Guide" には、ブートの概念について何通
  りかの例が説明されている。一読に値するだけでなく、そのいくつかはやって
  みる価値がある。

  3.1.  設定

  lilo の設定ファイルは /etc/lilo.conf である。マニュアルのページがある
  ので、man lilo.conf とタイプし、読んでみること。 lilo.conf ファイルで
  重要なのは、lilo を使って起動する対象ごとに個別のエントリー(entry)があ
  るということである。Linux のエントリーならば、カーネルがどこにあるか、
  ルートファイルシステムとしてどのディスクパーティションをマウントするか
  という項目が含まれる。他のオペレーティングシステムなら、どのパーティ
  ションから起動するかが重要な情報になる。

  3.2.  演習

  「危険」  この演習は注意して行うこと。何かがおかしくなって、マスターブ
  ートレコードを台無しにしてしまい、システムが使えなくなるおそれが充分に
  ある。問題なく作動するレスキューディスクがあるか、それを使って復旧する
  方法を知っているのかを確認してほしい。tomsrtbt へのリンクが下記にあ
  る。これは、わたしも使っているレスキューディスクで、読者にもお勧めした
  い。最も慎重な方法は、壊れてもかまわないマシンを使うことである。

  フロッピーディスク上に lilo をセットアップすること。それには、カーネル
  以外何も乗っていなくてよい。ただその場合、カーネルが init をロードする
  態勢に入ったとき、"kernel panic" と表示される。しかし、少なくとも lilo
  が作動していることは分かる。

  できるなら、さらに進んで、フロッピーでどこまでシステムを構築できるか試
  してみること。これはおそらく Linux をいろいろ学ぶうえで最良とは言えな
  いまでも非常に優れた方法だろう。Bootdisk HOWTO (下記の URL を参照)を見
  てほしい。また、 tomsrtbt (下記の URL) も手がかりになるだろう。

  lilo を使って unios を起動させること。(``ハードウェア 演習'' の章に
  URL がある) さらなるチャレンジとしてフロッピー上でそれができるかやって
  みるとよい。

  ブートプロセスをループさせること。マスターブートレコード上の lilo を
  使って、どれかひとつのプライマリーパーティションのブートセクタ上にある
  もうひとつの lilo を起動させる。そして、その lilo にマスターブートレコ
  ードの lilo を起動させるようにする。あるいは、マスターブートレコードと
  4 つある全てのプライマリパーティションを使って、5 点ループを作ってみ
  る。おもしろい！

  3.3.  参考文献等

  o   lilo のマニュアルページ(man lilo)

  o  lilo のパッケージ (lilo
     <ftp://lrcftp.epfl.ch/pub/linux/local/lilo/>) には、"LILO User's
     Guide" (日本語訳
     <http://www.linux.or.jp/JF/JFdocs/LILO-README/index.html>)が含まれ
     ている。この文書はもう持っているかもしれない。/usr/doc/lilo あたり
     を探すこと。テキスト版よりもポストスクリプト版のほうが図表が付いて
     いるのでよい。 (そのドキュメントには、lilo-u-21.ps.gz か、それ以後
     のバージョン名がついている。)

  o  tomsrtbt <http://www.toms.net/rb> 最もクールなシングルフロッピーの
     Linux である。すばらしいレスキューディスクになる。

  o  The Bootdisk HOWTO
     <http://www.linuxdoc.org/HOWTO/Bootdisk-HOWTO/>(日本語 訳
     <http://www.linux.or.jp/JF/JFdocs/Bootdisk-HOWTO.html>)。(訳注:
     LILO の動作について <http://www.linux.or.jp/JF/JFdocs/inside-
     lilo.html> もご覧ください。)

  4.  Linux カーネル

  カーネルは実際非常に多くの仕事をしている。それらの仕事の内容を的確に要
  約するなら、プログラムからの要求を適正かつ効率的にハードウェアに実行さ
  せることだと思われる。

  プロセッサは一度にひとつの命令しか実行できない。しかし、Linux システム
  は同時に多くの作業をこなしているように見える。カーネルは、タスクからタ
  スクへと瞬時の切り替え(switch)をすることでこれを実現しているのである。
  またカーネルは、どのプロセスが実行可能で、どのプロセスがハードディスク
  上のファイルレコードやキーボードからのインプットなどを待っているのかを
  常に監視することで、プロセッサ資源を最大限に活用している。

  プログラムがなにもしていなければ、RAM 上にある必要はない。なにかしてい
  たとしても、そのプログラムの内部には、なにもしていない部分があるかもし
  れない。プロセスごとのアドレス空間は、ページ(という単位)に分割されてい
  る。カーネルは、どのプロセスのどのページが最も使われているかを絶えず監
  視している。ほとんど使われていないページは、スワップパーティションへと
  立ち退かせることができる。再度それが必要なときは、使われていない別のペ
  ージをページアウトさせて、空間を確保することが可能である。これを仮想記
  憶操作という。

  カーネルをコンパイルしたことがあるなら、具体的なデバイスに関するオプ
  ションが大量にあることに気付いただろう。カーネルには、多種多様なハード
  ウェアと対話するために大量の具体的なコードが含まれている。そしてアプリ
  ケーションプログラムに対しては、整然と統一された方法で、それら(へのア
  クセス手段)を提供する。

  カーネルは同時に、ファイルシステム、プロセス間通信、多くのネットワーク
  プログラムなども管理している。

  いったんロードされたら、カーネルが行う最初の仕事は、init プログラムの
  探知とその実行である。

  4.1.  設定

  カーネルソースのある場所、例えば /usr/src/linux において、 make
  menuconfig か make xconfig を使いカーネルをビルドすれば、設定の大部分
  は終了する。ビデオモードやルートファイルシステム、スワップデバイス、ま
  た rdev を使えば RAM のサイズについても、デフォルトの設定を変更するこ
  とは可能である。これらのパラメータ等は、lilo からカーネルに渡すことも
  できる。 lilo.conf ファイルに書くか、lilo プロンプトから入力すれば、カ
  ーネルに渡すべき情報を lilo に取り次がせることができる。例えば、hda2
  の代わりに hda3 をルートファイルシステムとしたいのであれば、以下のよう
  にタイプすればよい。

          LILO: linux root=/dev/hda3

  ソースコードからシステムを構築している場合、モノリシック(monolithic)な
  カーネルを作れば作業を単純化できる。これは、モジュールを持たないカーネ
  ルのことである。そうすれば構築中のシステムにカーネルモジュールをコピー
  する必要がなくなる。

  原注: System.map ファイルは、カーネルのログ記録プログラム (kernel
  logger)がどのモジュール名を使ってメッセージを出すか決定する際に使用さ
  れる。top というプログラムもこのファイルの情報を使う。カーネルを目的の
  システムにコピーするときは、System.map も一緒にコピーすること。

  4.2.  演習

  以下のことについて考えること: /dev/hda3 は、ハードディスクのパーティ
  ションを表す特別な種類のファイルである。しかし、それは他の普通のファイ
  ルと全く同じようにファイルシステム上に存在する。カーネルは、まだファイ
  ルシステムを持たない段階で、どのパーテイションをルートファイルシステム
  としてマウントするか知る必要がある。では、カーネルは、どういう方法でマ
  ウントすべきパーティションを突き止めて、 /dev/hda3 を読み込むのか？

  もしまだカーネル構築をしたことがないなら、自分のカーネルをビルドするこ
  と。個々のオプションについてのヘルプ情報には全て目を通すこと。

  驚くほど小さなカーネルを作っても動作することを確認すること。間違った思
  いこみを捨てることで、多くを学べる。

  "The Linux Kernel" (URL は以下)を読むこと。読みながらそこで紹介されて
  いるソースコードの一部を実際に見つけること。(この文書の執筆時におい
  て)そこでは、バージョン 2.0.33 のカーネルが取り上げられているが、その
  バージョンはもうかなり時代遅れになっている。その旧バージョンのカーネル
  ソースをダウンロードしてから、コードに目を通したほうが、読みやすいだろ
  う。"process" や "page" と呼ばれる C のコード群を発見するのは面白いこ
  とだと思う。

  ハックせよ！ カーネルメッセージに何かを追加して、それを出力できるかど
  うか確認すること。

  4.3.  参考文献等

  o  /usr/src/linux/README と /usr/src/linux/Documentation/ の中にある文
     書(システムによっては、違う場所にあるかもしれない)

  o   The Kernel HOWTO <http://linuxdoc.org/HOWTO/Kernel-HOWTO.html> (日
     本語訳 <http://www.linux.or.jp/JF/JFdocs/Kernel-HOWTO.html>)

  o   make menuconfig や make xconfig を使ってカーネル設定をする時のヘル
     プ情報

  o   The Linux Kernel <http://www.linuxdoc.org/LDP/tlk/tlk.html> (日本
     語訳 <http://www.linux.or.jp/JF/JFdocs/The-Linux-Kernel.html>) およ
     びその他の LDP 文書 <http://www.linuxdoc.org/>。

  o  ソースコードについては、Building a Minimal Linux System from Source
     Code <http://www.netspace.net.au/~gok/power2bash> (日本語訳
     <http://www.linux.or.jp/JF/JFdocs/Building-Minimal-Linux.html>) の
     URL の項目を見ること。

  5.  GNU C ライブラリ

  コンピュータの起動において次に起こる出来事は、init プロセスがロードさ
  れ実行されるということである。しかし、init は、他のほとんどのプログラ
  ムと同様にライブラリの関数を利用している。

  以下のような C プログラムの例題をみたことがあるかもしれない。

          main() {
                  printf("Hello World!\n");
          }

  このプログラムでは、printf が定義されていないが、その定義はどこから来
  るのか？それは標準 C ライブラリから、すなわち GNU/Linux システム上であ
  れば glibc から来る。もし Visual C++ でコンパイルしたなら、同じ標準関
  数を持った Microsoft の実装から来る。このような標準関数は、計算、文字
  列、日付、メモリアロケーションなど様々な領域で、無数に存在してい
  る。Linux を含む Unix の全ては、C 言語で書かれたものと、なんとかして C
  で書かれたように見せかけようとするもののいずれかで出来ているので、すべ
  てがそうした関数を使用する。

  Linux システムの /lib を見れば、libxxx.so や libxxx.a といったファイル
  がたくさんあるのが分かるだろう。それらは、こうした関数のライブラリであ
  る。glibc は、こうした関数についての GNU の実装である。

  ライブラリ関数を使う方法には二種類ある。静的(statically) にプログラム
  にリンクすれば、そうした関数はできあがった実行ファイルにコピーされて、
  組み込まれる。動的(dynamically) にプログラムにリンクすれば(これが普通
  であるが)、プログラムが実行されてそのライブラリコードが必要になったと
  きに、libxxx.so から呼び出される。

  特定のプログラムにどのライブラリが必要なのか調べたいときは、ldd コマン
  ドが役に立つ。たとえば、以下は bash が使うライブラリである。

          [greg@Curry power2bash]$ ldd /bin/bash
                  libtermcap.so.2 => /lib/libtermcap.so.2 (0x40019000)
                  libc.so.6 => /lib/libc.so.6 (0x4001d000)
                  /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

  5.1.  設定

  ライブラリにある関数のいくつかは、あなたがどこに住んでいるかに依存して
  いる。たとえば、オーストラリアなら、日付は 日/月/年と表記するが、アメ
  リカでは、月/日/年と表記する。glibc が配布されるときには localedef と
  呼ばれるプログラムが付属し、それによってこうしたことの設定ができるよう
  になっている。

  5.2.  演習

  あなたの好きなプログラムがどんなライブラリを使っているのかを ldd で調
  べてみること。

  init がどんなライブラリを使うのか、ldd で調べること。

  ひとつかふたつだけの関数が入ったおもちゃのライブラリを作ること。それを
  作るには、ar というプログラムを使う。ar の man ページは、作り方を調べ
  る出発点になる。そして、そのライブラリを使うプログラムを書いて、コンパ
  イルして、リンクすること。
  5.3.  参考文献等

  o  ソースコードについては、Building a Minimal Linux System from Source
     Code <http://www.netspace.net.au/~gok/power2bash> (日本語訳
     <http://www.linux.or.jp/JF/JFdocs/Building-Minimal-Linux.html>) で
     URL を確認すること。

  6.  Init

  ここでは、大部分の Linux システムで使用されている "System V" スタイル
  の init についてだけ話す。違うスタイルも存在する。実際、好きなプログラ
  ムを /sbin/init として置いておけば、カーネルはロードが終わった時にそれ
  を実行する。

  全てのプログラムを的確に走らせるのが init の仕事である。ファイルシステ
  ムに問題がないか確認し、それをマウントする。デーモン(daemons)プロセス
  を起動することで、システムメッセージをログに記録し、ネットワークを監視
  し、ウェブページを提供し、マウスからの信号を受け取ったりする。また、仮
  想端末上にログインプロンプトを出力する getty プロセスの起動も行う。

  実行レベル(run-level)の変更については非常に複雑なはなしがあるが、大部
  分は飛ばして、システムの起動についてだけ説明しようと思う。

  init は、/etc/inittab というファイルを読み込む。このファイルが init に
  仕事の内容を伝える。一般的には、伝えられる最初の仕事は初期化スクリプト
  を走らせることである。このスクリプトを実行する(あるいは解釈する)プログ
  ラムが、bash であり、これは、コマンドプロンプトを出力するプログラムと
  同一のものだ。Debian のシステムでは、初期化スクリプトは
  /etc/init.d/rcS であり、Red Hat では /etc/rc.d/rc.sysinit である。この
  過程で、ファイルシステムの検証とマウント、日時の設定、スワップスペース
  の稼働、ホスト名の設定などが行われる。

  次にもうひとつのスクリプトが呼び出されて、デフォルトの実行レベルにシス
  テムを移行させる。これは一連のサブシステムが起動されるという意味であ
  る。これに関しては、ディレクトリのセットが存在する。例えば Red Hatで
  は、 /etc/rc.d/rc0.d, /etc/rc.d/rc1.d, ..., /etc/rc.d/rc6.d といったも
  のがあり、Debian では、 /etc/rc0.d, /etc/rc1.d, ..., /etc/rc6.d となっ
  ている。これらのディレクトリは、実行レベルに対応していて、Debian のシ
  ステムで実行レベル 3 に移行しようとするなら、そのスクリプトは
  /etc/rc3.d にある 'S'(start のこと) で始まる全てのスクリプト群を実行す
  る。実際には、これらのスクリプト群は、通常 init.d と呼ばれる別のディレ
  クトリにあるスクリプトへの単なるリンクである。

  これらの実行レベルに関するスクリプトは、init から呼び出され、ディレク
  トリ内にある頭文字が S のスクリプトを探す。(例えば)最初に見つけたの
  が、S10syslog であるとしよう。付けられた数字は実行レベルスクリプトにど
  ういう順番で実行していくかを伝える。このケースでは、S00 ... S09 で始ま
  るスクリプトがないので、S10syslog が最初に実行される。ただ、 S10syslog
  は実際には /etc/init.d/syslog へのリンクにすぎず、システムのログ記録プ
  ログラム(system logger)を開始したり停止したりしているのは後者のスクリ
  プトである。リンク(名)が S で始まるので、実行レベルスクリプトは syslog
  スクリプトを 'start' のパラメータを付けて実行すべきことを知る。それに
  対応する 'K'(kill のこと)で始まるリンクも存在し、それによって実行レベ
  ルの変更時に何をどういう順番で終了させるかが指定される。

  デフォルトで起動するサブシステムを変更するには、rcN.d ディレクトリにあ
  るそうしたリンクを設定し直さなければならない。ここで N とは、 inittab
  で設定した実行レベルのことである。

  init が最後に行う重要な仕事は、getty をいくつか起動することである。彼
  らは、"何度でも生き返る(respawned)" 設定になっている。つまり、もし止
  まっても init がまたそれらを再起動させるのである。大部分のディストリ
  ビューションは 6 個の仮想端末を用意する。メモリを節約するためにその数
  を少なくしたいかもしれないし、たくさん走らせておいて必要なときにすばや
  く使うため、その数を増やしたいかもしれない。また、文字端末かモデムでの
  通信用に getty をひとつだけ実行したいのかもしれない。そうした場合は、
  inittab ファイルを編集する必要が生じる。

  6.1.  設定

  /etc/inittab は、init のトップレベルの設定ファイルである。

  rcN.d ディレクトリにおいて、N には 1 から 6 までの数字が入るが、それら
  のディレクトリ(の内容)が、起動されるサブシステムを決めている。

  init から呼び出されるあるスクリプトの内部で、mount -a コマンドが実行さ
  れる。これは、マウントされるよう定められた全てのファイルシステムをマウ
  ントすることを意味する。何がマウントされるべきかは、/etc/fstab ファイ
  ルで定められている。システム起動時になにをどこにマウントするかを変更し
  たいなら、編集すべきファイルはこれである。fstab の man ページがあるの
  でみてほしい。

  6.2.  演習

  システムのデフォルト実行レベルに相当する rcN.d ディレクトリを見つけ
  て、そこで ls -l と打つことでファイルがどこにリンクされているかを理解
  すること。

  システム上で実行している getty の数を変更すること。

  不要なサブシステムをデフォルト実行レベルから取り除くこと。

  ほとんどなにもない状態からでもスタートできることを確認すること。

  フロッピーディスク上に、lilo とカーネルを構築し、さらに静的にリンクさ
  れたおもちゃのプログラム("hello world program")を置いて、それが
  /sbin/init から呼び出されるように設定しておくこと。そのディスクが起動
  して、プログラムの実行結果が表示されるのを確認すること。

  システムが起動するときの画面を注意深く観察し、起きている事柄についてメ
  モをとること。あるいは、/var/log/messages にあるシステムログの起動時か
  らの部分をプリントすること。次に、inittab ファイルを出発点にしてすべて
  のスクリプトに目を通し、どのコードが何をしているか理解すること。また、
  以下のように書き込むと、出るはずのないスタートアップメッセージを付け加
  えることができる。

          echo "Hello, I am rc.sysinit"

  これは bash を使ったシェルスクリプトのよい練習にもなる。スクリプトのい
  くつかは非常に複雑である。良くできたハンディな bash のリファレンスブッ
  クを手元に置いておこう。

  6.3.  参考文献等

  o  inittab と fstab ファイルにはマニュアルページがある。シェル画面で
     man inittab とタイプして、それを見ること。

  o  "The Linux System Administrators Guide" の init に関する章はよく書
     かれている。ここ <http://www.linuxdoc.org/LDP/sag/index.html>で読め
     る。

  o  ソースコードについては、Building Minimal Linux System from Source
     Code <http://www.netspace.net.au/~gok/power2bash> (日本語訳
     <http://www.linux.or.jp/JF/JFdocs/Building-Minimal-Linux.html>)で
     URL を確認すること。

  o  (訳注)JF 文書に 「コメントから読む Linux カーネル」
     <http://www.linux.or.jp/JF/JFdocs/readkernel.html>があります。Linux
     の起動に関し、詳細に解説されています。

  7.  ファイルシステム

  この章では、「ファイルシステム」という言葉をふたつの違った意味で使用す
  る。ディスクパーティションやその他のデバイス上のファイルシステムがひと
  つ、 Linux システムを走らせることで提示されるファイルシステムがひとつ
  である。 Linux では、ディスクのファイルシステムをシステムのファイルシ
  ステム上にマウント(mount)している。

  前章では、init スクリプトがファイルシステムをチェックしてマウントする
  と述べた。これを実行するコマンドは、それぞれ fsck と mount である。

  ハードディスクは 1 と 0 を書き込める巨大な空間にすぎない。ファイルシス
  テムがそれにかたち(structure)を与え、ディレクトリ構造をもったファイル
  群に見えるようにしている。個々のファイルは、i-node によって表わされ
  る。i-node は、誰のファイルか、いつ作られたのか、ファイルの中身はどこ
  にあるのかといった情報を伝える。ディレクトリも i-node で表現されている
  が、その i-node は、当該ディレクトリにあるファイルの i-node がどこにあ
  るかという情報しか伝えない。システムが /home/greg/bigboobs.jpg という
  ファイルを読み込もうとすると、まず最初にルートディレクトリである / の
  i-node を「スーパーブロック(super block)」から探しだす。次にディレクト
  リ home の i-node を / の内容のなかから探す。そして、ディレクトリ greg
  を /home の内容から見つけだして、さらに bigboobs.jpg の i-node を見つ
  ける。そうして、その i-node がシステムにどのディスクブロックを読めばい
  いかを教えるわけである。

  ファイルの末尾にデータを付け加えた場合、新しいブロックがそのファイルの
  一部であると伝達できる状態にするため、i-node の更新がなされる。しか
  し、その更新がなされる前に、データが書き込まれてしまうことがあるし、そ
  の逆もある。もしその時点で電源が落ちると、ファイルシステムは整合性を失
  う。fsck が検出し補修しようとするのは、この種の事柄である。

  マウントコマンドはデバイス上のファイルシステムを把握し、システムを利用
  する時に目にするようなファイルの階層構造(hierarchy)にそれを付け加え
  る。カーネルは、通常ルートファイルシステムを読み込み専用(read-only)で
  マウントする。マウントコマンドは、fsck の検査で問題のないことが分かっ
  てからそれを読み書き兼用(read-write)でマウントし直す。
  Linux は他の種類のファイルシステムもサポートしている。msdos,
  vfat,minix などである。具体的なファイルシステム間での区々の相違は、仮
  想ファイルシステム(VFS)によって抽象化される。ここではその詳細について
  は触れない。それについての解説は "The Linux Kernel" の文中にあ
  る。(``Linux カーネル'' の章に URL があるのでそこで見てほしい。)

  さらに、/proc には完全に種類の異なるファイルシステムがマウントされてい
  る。これは、カーネル内の状況を忠実に表すものである。そこには、システム
  上のプロセスごとにディレクトリがあり、ディレクトリ名としてプロセス番号
  が付けられている。また、/proc には interrupts や meminfo といったファ
  イルもあり、そこにはハードウェアの利用情報が書かれている。/proc を詳し
  く調べれば、多くを学ぶことができる。

  7.1.  設定

  ext2 ファイルシステムを作る mke2fs というコマンドには複数のパラメータ
  がある。それを使えば、ブロックのサイズや i-node の数などを設定できる。
  詳細は、mke2fs のマニュアルページを調べてほしい。

  ファイルシステム上のどこに何がマウントされるかは、/etc/fstab で管理さ
  れている。このファイルのマニュアルページもある。

  7.2.  演習

  非常に小さなファイルシステムを作って、hex ビューワで見てみること。 i-
  node や スーパーブロック、ファイルの中身がどれなのか見分けること。

  ファイルシステムをグラフィカルに見ることができるツールがあるはずだと思
  う。それを見つけて試してみたら、その URL と使った感想をわたしにメール
  で教えてほしい。(訳注: xcruise <http://tanaka-
  www.cs.titech.ac.jp/%7Eeuske/prog/> というのがあります。)

  カーネルの ext2 ファイルシステムのコードをチェックすること。

  7.3.  参考文献等

  o  LDP の文書である The Linux Kernel
     <http://www.linuxdoc.org/LDP/tlk/tlk.html> の第九章 (日本語訳
     <http://www.linux.or.jp/JF/JFdocs/The-Linux-Kernel-10.html>)には、
     ファイルシステムに関する優れた記述がある。オーストラリアの LDP にそ
     の文書がある。 mirror <http://mirror.aarnet.edu.au/linux/LDP/LDP/>

  o   mount コマンドは util-linux パッケージの一部であり、これに関するリ
     ンクが Building a Minimal Linux System from Source Code
     <http://www.netspace.net.au/~gok/power2bash> (日本語訳
     <http://www.linux.or.jp/JF/JFdocs/Building-Minimal-Linux.html>)から
     たどれる。

  o  次のコマンドのマニュアルページ
     mount, fstab, fsck, mke2fs および、 proc。

  o  Linux カーネルのソースコードにある Documentation/proc.txt ファイル
     (日本語訳 <http://www.linux.or.jp/JF/JFdocs/kernel-
     docs-2.2/proc.txt.html>)に、/proc ファイルシステムについての説明が
     ある。

  o  EXT2 ファイルシステムのユーティリティに関するホームページはこちら
     <http://web.mit.edu/tytso/www/linux/e2fsprogs.html>
     オーストラリアのミラーはこちら
     <ftp://mirror.aarnet.edu.au/pub/linux/
     metalab/system/filesystems/ext2/>

     Ext2fs-overview というドキュメントもそこにあるが、情報が古く、 "The
     Linux Kernel" の第九章ほどは読みやすくない。

  o   Unix File System Standard
     <ftp://tsx-11.mit.edu/pub/linux/docs/linux-standards/fsstnd/>
     上記以外の Unix File System Standard へのリンクはここ
     <http://www.pathname.com/fhs/>
     (訳注: 14.2 での Filesystem Hierarchy Standard(FHS) という文献は上
     記にあります)

     上記では、Unix のファイルシステムで何が起こっていて、なぜそうなのか
     が述べられている。また、/bin, /sbin などに最低限度入れておくべき内
     容について書かれている。もし自分で最小だが完全なシステムを構築しよ
     うとしているなら、これはとても参考になる。

  8.  カーネルデーモン

  ps aux コマンドを実行すると、以下に示すようなものが現れる。

  USER      PID %CPU %MEM  SIZE   RSS TTY STAT START   TIME COMMAND
  root        1  0.1  8.0  1284   536   ? S    07:37   0:04 init [2]
  root        2  0.0  0.0     0     0   ? SW   07:37   0:00 (kflushd)
  root        3  0.0  0.0     0     0   ? SW   07:37   0:00 (kupdate)
  root        4  0.0  0.0     0     0   ? SW   07:37   0:00 (kpiod)
  root        5  0.0  0.0     0     0   ? SW   07:37   0:00 (kswapd)
  root       52  0.0 10.7  1552   716   ? S    07:38   0:01 syslogd -m 0
  root       54  0.0  7.1  1276   480   ? S    07:38   0:00 klogd
  root       56  0.3 17.3  2232  1156   1 S    07:38   0:13 -bash
  root       57  0.0  7.1  1272   480   2 S    07:38   0:01 /sbin/agetty 38400 tt
  root       64  0.1  7.2  1272   484  S1 S    08:16   0:01 /sbin/agetty -L ttyS1
  root       70  0.0 10.6  1472   708   1 R   Sep 11   0:01 ps aux

  上記はシステム上で動いているプロセスのリストである。これらの情報は、前
  章で説明した /proc ファイルシステムから取得される。init のプロセス ID
  が 1 であることに注意してほしい。プロセス ID の 2,3,4 と 5 は、それぞ
  れ kflushd, kupdate, kpiod, そして kswapd である。しかしこれには奇妙な
  点がある。仮想ストレージサイズ(SIZE)とリアルストレージサイズ(RSS)の行
  に注目すると、これらのプロセスのサイズはゼロとなっている。プロセスがメ
  モリを消費しないことが起こりうるだろうか？

  これらのプロセスは、カーネルデーモンである。カーネルの大部分はプロセス
  リストには現れないので、それらが消費するメモリの量を割り出すには、シス
  テムの総メモリ量から利用可能なメモリ量を引いて計算するしかない。カーネ
  ルデーモンは、 init の後で起動されるため、通常のプロセスと同様にプロセ
  ス番号を持つ。しかし、それらのコードとデータは、カーネル用のメモリ領域
  に置かれる。

  上記の表では COMMAND の行に丸カッコがついているエントリがあるが、これ
  は、/proc ファイルシステムに、それらのプロセスのコマンドライン情報が含
  まれていないからである。
  では、カーネルデーモンは何のためにあるのか？ わたしはカーネルデーモン
  についてほとんど知らなかったので、今回の改訂版を出すまで、その点に関
  し、この文書では読者からの教えを請うていた。以下の断片的な説明は、読者
  からの様々な返答をつなぎ合わせたものであり、疑問に答えてくれたひとたち
  には非常に感謝している。より詳しい手がかりや参照先、この文の訂正なども
  引き続き歓迎している。

  入力と出力は、メモリ内の buffers 経由で行われる。実行速度を上げるため
  である。プログラムの出力は一旦メモリに、つまりバッファに蓄えられ、その
  後でより安価で大容量を実現できるディスクに書き込まれる。kflushd と
  kupdate デーモンは、この処理を担当している。kupdate は、定期的に(5 秒
  ごとに？)書き込まれたバッファ(dirty buffer)がないかチェックする。そう
  したバッファがある場合、kflushd を呼び出して、それをディスクに書き込ま
  せる。

  プロセスは、何もしていない状態になることがしばしばあり、実行中のプロセ
  スといえどもそのコードとデータ全部をメモリ内に置く必要があるわけではな
  い。すなわちこれは、実行中のプロセスの使用されていない部分を、ハード
  ディスクのスワップパーティションに移すことで、メモリを有効利用できるこ
  とを意味する。必要に応じてそうしたデータをメモリから出し入れする処理
  は、kpiod と kswapd によって行われる。ほぼ毎秒、kswapd が起動し、メモ
  リの状態をチェックする。そして、ディスクに書き出された情報をメモリに戻
  す必要があったり、空きメモリの量が不足していたりする場合、kpiod が呼び
  出される。

  また、カーネルに省電力機能を組み込んでいる場合は、システム上で kapmd
  デーモンが走っているかもしれない。

  8.1.  設定

  update プログラムを使えば、kflushd と kswapd を設定することができる。
  コマンド update -h を使えば詳しい情報が表示される。

  スワップ空間は、swapon コマンドで有効になり、swapoff コマンドで無効に
  なる。初期化スクリプト(/etc/rc.sysinit もしくは
  /etc/rc.d/rc.sysinit)は、通常、システム起動時に swapon を呼び出
  す。swapoff は、ラップトップ上での消費電力節約のために有効であるそう
  だ。

  8.2.  演習

  update -d と打ち、表示された行の最後に「兄弟バッファ殺しの閾
  値(threshold for buffer fratricide)」と書かれていることに注目せよ。面
  白そうな概念である。調べてみよう！

  /proc/sys/vm ディレクトリに行き、そこにあるファイルの内容を cat で出力
  し、出力結果を見ること。

  8.3.  参考文献等

  Linux Documentation Project の "The Linux Kernel" ( URL について
  は、``ここ''を見ること。)

  勇気ある読者は、Linux カーネルのソースコードを読むこと。 kswapd のコー
  ドは、linux/mm/vmscan.c にあり、 kflushd と kupdate のコードは
  linux/fs/buffer.c にある。

  9.  システムのログ記録

  init は、syslogd と klogd をスタートさせる。それらは、メッセージをログ
  に書き取る。カーネルのメッセージは、klogd が書き取り、syslogd は、その
  他のプロセスのメッセージを扱う。主要なログは、/var/log/messages にあ
  る。システムの調子が悪いとき、このログをのぞくとよい。ここにはよく重要
  な手がかりがある。

  9.1.  設定

  /etc/syslog.conf ファイルは、ログプログラムに対して、どういうメッセー
  ジをどこに出力するかを伝える。メッセージは、どのサービスから送られたの
  か、どのプライオリティレベルにそれらがあるのかということによって識別さ
  れる。この設定ファイルは、行単位に構成されていて、そこには、サービス x
  が、プライオリティ y で、メッセージを z に出力するということが書かれて
  いる。ここでの z には、ファイルや tty やプリンタ、リモートホスト等があ
  る。

  注意：syslog は、/etc/services ファイルの存在を必要とする。この
  services というファイルにはポート(port)の割り当てのことが書かれてい
  る。syslog がポートの割り当てを知る必要があるのは、リモートログを取る
  ためなのか、それともローカルログを取るときにもポートを経由しているの
  か、あるいは、/etc/services は /etc/syslog.conf に記述されたサービス名
  をポート番号に変換するためにだけ使われるのかは、わたしにはよく分からな
  い。

  9.2.  演習

  自分のシステムのログを見ること。理解できない部分を探して、その意味を調
  べること。

  全てのログメッセージを端末に表示させること。(それが終わったら、元に戻
  すこと)

  9.3.  参考文献等

  オーストラリアの syslogd の Mirror
  <http://mirror.aarnet.edu.au/pub/linux/metalab/system/daemons/> (訳
  注:こちら <http://metalab.unc.edu/pub/Linux/system/daemons>にもありま
  す)

  10.  Getty と login

  getty とは、仮想端末やテキスト端末あるいはモデムといったシリアルデバイ
  ス経由でログインするために必要なプログラムである。それがログインプロン
  プトを表示する。ユーザ名を打ち込むと、getty はそれを login に手渡し、
  そのプログラムがパスワードを尋ね、それをチェックした上で、ユーザがシェ
  ルを使えるようにする。

  多くの getty プログラムが入手可能である。Red Hat を含むいくつかのディ
  ストリビューションは、仮想端末だけで動作する mingetty と呼ばれる非常に
  小さなプログラムを使っている。

  login プログラムは、util-linux パッケージの一部で、そのパッケージに
  はagetty と呼ばれる快適に動く getty の一種が含まれている。そのパッケー
  ジには、また mkswap, fdisk, passwd, kill, setterm, mount, swapon,
  rdev, renice, more などなどが含まれている。

  10.1.  設定

  ログインプロンプトと一緒に画面上部に表示されるメッセージは、/etc/issue
  から来ている。getty は、通常 /etc/inittab から起動される。login
  は、/etc/passwd でユーザの詳細をチェックするが、シャドーパスワードを
  使っている場合は、/etc/shadow をチェックする。

  10.2.  演習

  /etc/passwd ファイルを自分の手で作ること。パスワード部分は無し(null)
  にしておいて、ログオンしてから passwd プログラムで書き換えてもよい。そ
  のマニュアルページを見ること。その際、passwd プログラムのマニュアルペ
  ージではなく、そのファイルについてのマニュアルである man 5 passwd を使
  うこと。

  11.  Bash

  login に有効なユーザ名とパスワードの組み合わせを送る
  と、loginは、/etc/passwd をチェックし、どのシェルを起動すべきか確認す
  る。 Linux システムではほとんどの場合、それは bash である。bash の仕事
  はユーザのコマンドを読み込んで、自分のプロセス上でそのコマンドが実行さ
  れるのを確認することである。bash は、ユーザインターフェイスであると同
  時にプログラミング言語のインタープリタでもある。

  ユーザインターフェイスとして見た場合、bash は、まずコマンドを読み込
  み、次に、もしそのコマンドが cd のような「内部コマンド (internal
  command)」であるなら、自分でそれを実行し、cp や startx のような「外部
  コマンド(external command)」であるならそのプログラムを探し出して実行す
  る。また bash は、コマンドヒストリーの記憶やファイル名の補完などの優れ
  た機能も持っている。

  bash がプログラム言語のインタープリタとして働いていることは既に見た。
  init がシステム起動のために実行するスクリプトは通常シェルスクリプトで
  あり、それらのスクリプトは bash によって実行されている。適切なプログラ
  ム言語とコマンドラインで利用できる普通のシステムユーティリティがあり、
  それを使って自分のしていることを自覚できる程度の知識があれば、その組み
  合わせから大きな力を引き出せる。例えば、(これは自己満足にすぎないかも
  しれないのだが、) わたしは先日ソースコードのディレクトリに大量のパッチ
  を当てる必要が生じた。しかし、わたしはそれを以下のような一行のコマンド
  で解決した。

  for f in /home/greg/sh-utils-1.16*.patch; do patch -p0 < $f; done;

  このコマンドは、わたしのホームディレクトリにあるファイルのうち、ファイ
  ル名が sh-utils-1.16 で始まり .patch で終わるものすべてを対象として認
  識する。そして、それらをひとつずつ順番に取り上げて、変数 f をセット
  し、do と done の間にあるコマンドを実行する。このケースでは、11 のパッ
  チファイルであったが、たとえそれが 3000 個あったとしても同じように簡単
  に処理されていたはずである。

  11.1.  設定

  /etc/profile というファイルが、システム全体における bash の振る舞いを
  コントロールしている。そこに何かを加えたとすると、それはシステム上で
  bash を使う全員に影響を及ぼす。そのファイルでは、(環境変数) PATH への
  ディレクトリの追加や、MAIL ディレクトリの変数の設定などがなされる。

  キーボードのデフォルト設定は、しばしば満足のいくものになっていないこと
  が多い。それを実際に解決するのが、readline である。readline は、コマン
  ドラインのインターフェイスを担当する(bash とは)別のパッケージになって
  いるプログラムで、いくつかの先進的なライン編集機能を持つのはもちろん、
  コマンド履歴やファイル名補完といった機能を提供する。 readline は、コン
  パイル時に bash に組み込まれる。デフォルトでは、readline はホームディ
  レクトリの .inputrc ファイルを使って設定するようになっている。bash の
  変数である INPUTRC を使って bash 用にこの設定ファイルを上書きすること
  もできる。例えば Red Hat 6 では、/etc/profile において INPUTRC は
  /etc/inputrc を上書きするよう設定されている。これは、バックスペースや
  デリート、あるいはホームキーやエンドキーが誰にとっても上手く働くように
  するためである。

  bash はシステム全体の設定ファイルを読み終わると、今度は個人用設定ファ
  イルを探し、ホームディレクトリにある .bash_profile,
  .bash_login,.profile をチェックする。そしてこの順番で最初に見つけた
  ファイルを実行する。もし他人の bash の振る舞いを変更せずに自分のものだ
  けを変えたいのであれば、ここを編集すればよい。例えば、多くのアプリケー
  ションは動作方法をコントロールするのに環境変数を使っている。わたしは
  Midnight Commander(優れたコンソールベースのファイルマネージャ)で組み込
  みのエディタではなく vi を使えるようにするために、変数 EDITOR を vi に
  セットしている。

  11.2.  演習

  bash の基礎は簡単に学べる。しかし、そこで終わらないこと。それは信じら
  れないくらい奥が深いからである。より良いやり方がないか調べる癖をつける
  こと。

  シェルスクリプトを読んで、理解できない部分を調べること。

  11.3.  参考文献等

  o  ソースには "Bash Reference Manual" が添付されている。これは分かり易
     いが、全部読むのは大変である。

  o  O'Reilly から bash に関する本が出ているが、いい本かどうかは知らな
     い。

  o  他にも bash に関するフリーで新しい入門書があるかどうか知らない。御
     存知なら、メールで URL を教えてほしい。

  o  ソースコードについては、Building a Minimal Linux System from Source
     Code <http://www.netspace.net.au/~gok/power2bash> (日本語訳
     <http://www.linux.or.jp/JF/JFdocs/Building-Minimal-Linux.html>)で
     URL を確認すること。

  12.  コマンド

  bash から cp のようなコマンドを実行することで、大部分の作業は済んでし
  まう。cd のようにシェルに組み込まれたいくつかのコマンドを除くと、それ
  らのコマンドのほとんどは、小さなプログラムである。

  コマンドはパッケージで配布されるが、これらのほとんどは Free Software
  Fundation (あるいは、GNU) からのものである。ここでそのパッケージを数え
  上げるよりも、わたしは Linux From Scratch  HOWTO
  <http://www.linuxfromscratch.org> を見ることをお薦めしたい。このサイト
  では、Linux システムに組み入れられるパッケージの完全で最新のリストがあ
  り、同時にその構築の仕方も説明されている。

  13.  結論

  Linux の最大の長所は、私見では、内部を覗いて、全体がどう動いているか調
  べられることだ。わたしと同じくらい、読者もそれを楽しんでくれればと思
  う。そして、この文書が、それをする読者の一助となることを願う。

  14.  Administrivia

  14.1.  Copyright

  この文書の著作権： Copyright (c) 1999, 2000 Greg O'Keefe.

  この文書の利用、配布、修正は、次のライセンスの条項に従う限り無料です。
  GNU General Public Licence <http://www.gnu.org/copyleft/gpl.html>
  他の文書においてこの文書の全体もしくは部分を利用するときは、著者まで連
  絡願います。

  14.2.  ホームページ

  この文書の最新バージョンは、こちらにです。 From Powerup To Bash Prompt
  <http://www.netspace.net.au/~gok/power2bash>
  なお、付属文書として、"Building a Minimal Linux System from Source
  Code" も同じ場所にあります。

  Dominique van den Broeck によるフランス語訳が、以下にあります。
  From Powerup To Bash Prompt
  <http://www.freenix.fr/unix/linux/HOWTO/From-PowerUp-To-Bash-Prompt-
  HOWTO.html>

  Yuji Senda による日本語版が、Japanese Documentation and FAQ Project
  <http://www.linux.or.jp/JF> にあります。ない場合は、もうすぐ登場です。

  14.3.  フィードバック

  読者のコメント、批判、改善ついての提案など何なりと聞かせてください。

  Greg O'Keefe gcokeefe@postoffice.utas.edu.au

  14.4.  Acknowledgements

  製品名はそれぞれの権利者の登録商標です。

  この文書をつくるにあたって、お世話になった何人もの方がいるので、ここに
  感謝のことばを述べたいと思います。

     Michael Emery
        unios のことを思い出させてくれた。

     Tim Little
        /etc/passwd に関するいくつかのよい手がかりを与えてくれた。

     sPaKr on #linux in efnet
        syslogd が /etc/services を必要とすることを指摘し、同時に
        "rolling your own" という言葉がソースからシステムを作ることを指
        すのだと教えてくれた。

     Alex Aitkin
        Vico と "verum ipsum factum" が「理解はつくることから生まれる」
        という意味であることを知らせてくれた。

     Dennis Scott
        わたしの 16 進数の計算の間違いを指摘してくれた。

     jdd
        誤植を指摘してくれた。

     David Leadbeater
        カーネルデーモンについての「冗長な記述」を送ってくれた。

     Dominique van den Broeck
        この文書をフランス語に翻訳してくれた。

     Matthieu Peeters
        カーネルデーモンに関する貴重な情報を提供してくれた。

     John Fremlin
        カーネルデーモンに関する貴重な情報を提供してくれた。

     Yuji Senda
        日本語への翻訳。

     Antonius de Rozari
        UNIOS の GNU アセンブラバージョンを提供してくれた。 (詳細は、わ
        たしのホームページの resources セクションを見て欲しい。)

  14.5.  改訂履歴

  14.5.1.  0.8 -> 0.9 (November 2000)

  o  カーネルデーモンと /proc ファイルシステムに関する Matthieu Peeters
     からの情報を組み込んだ。

  14.5.2.  0.7 -> 0.8 (September 2000)

  o  システム構築に関する手引きの部分を削除して、別文書とした。いくつか
     のリンクを修正した。

  o  ホームページを learning@TasLUG
     <http://learning.taslug.org.au/power2bash> からわたし自身のページ
     <http://www.netspace.net.au/~gok/power2bash> に移動した。

  o  様々なひとから知らせてもらった、多くの情報を付け加えることには完全
     に失敗した。おそらく、次の版になると思う :(

  14.5.3.  0.6 -> 0.7

  o  システム構築法よりもシステムの説明に重点をおいた。章ごとに情報をま
     とめ、システム構築は分量を減らし、実用的な構築に関しては、Gerard
     Beekmans の "Linux From Scratch" を見てもらうようにした。

  o  David Leadbeater の冗長な寄稿を付け加えた。

  o  いくつかの URL を修正し、learning.taslug.org.au/resources から
     unios をダウンロードできるようにリンクを付け足した。

  o  URL のリンク切れを調べて、訂正した。

  o  全体的にリライトして、整頓した。

  14.5.4.  0.5 -> 0.6

  o  改訂履歴を付け加えた。

  o  TODO の項目をいくつか増やした。

  14.6.  TODO

  o  カーネルモジュール、depmod,modprobe,insmod などを説明すること。

  o  /proc ファイルシステムに言及し、できれば、演習も付けること。

  o  docbook の sgml 形式に変更すること

  o  もっと演習を増やすこと。最初のインストールからファイルをひとつずつ
     削除して最小限度のシステムをつくるといったような、もっと手の込んだ
     演習をつくって一章を割くといったようなこと。

  o  bash をビルドする際の makefile のハックの方法を付け加えること。 -
     easter notes を見て欲しい。

  14.7.  日本語訳について

  翻訳: 千旦 裕司

  校正: 山森 浩幸
        武井 伸光
        佐野 武俊
        川嶋 勤

