みんなのためのLinuxプログラミングという本で紹介されているFHS構造で構成されたLinuxシステムにおいて、各フォルダがどのような役割を担うかをまとめました。
ディレクトリ構造#
Linuxディレクトリツリーの標準規格であるFile system Hierarchy Standard(FHS)を使用しています。
/
ツリーの根であり、ルートディレクトリ。これがなければLinuxは起動すらできません。
/bin
user command binaries
実行ファイル(コマンド)が保管される場所です。起動時に必要なシステムの基本コマンドがあり、/usr/binにはそれ以外の一般ユーザー向けコマンドがあります。最近のOSバージョンではこの二つを区別しないこともあります。/binと/usr/binはディストリビューションが管理するディレクトリなので、パッケージシステムを使用しません。直接インストールするコマンドは/usr/local/binなどに保管するのが望ましいです。
/sbin
system binaries
管理者用コマンドが配置されています。起動時に必要な管理者用コマンドもあります。/usr/sbinには通常時に使用するシステム管理コマンドやサーバープログラムが配置されます。
/lib
/lib、/lib64にはC、Python、Rubyなどのライブラリがあります。
/usr
複数のコンピュータで共有できるファイルを保管する用途です。この配下に必須ファイルが含まれています。usrの語源はUser Services and Routinesですが、最近はそのままuserとして見ます。共有できないファイルは/varに保管されます。
/usr/src
システムで使用されるコマンドのソースコードやLinuxカーネルのソースコードが保管されています。自作のプログラムのソースコードはここに保管しないようにしてください。
/usr/include
システムのヘッダファイルがあります。カーネルのヘッダファイルは/usr/include/linuxに保管されます。Unix系のOSでは/usr/include/sys配下にカーネルのヘッダファイルが保管されますが、Linuxはカーネルとlibcの管理者が異なるため、少し違う構造になっています。
/usr/share
アーキテクチャ(CPUの種類)に依存しないため、異なるアーキテクチャ間でも共有できるファイルがあります。manコマンドやinfoのデータがこの配下にあります。
/usr/share/man
ディストリビューションによっては/usr/manに保管することもありますが、FHSでは/usr/share/manに保管されます。man1、man2、man3...となっており、後ろに付いている番号がセクション番号です。セクション1の場合は/usr/share/man/man1にあります。フォルダごとにページが並んでおり、ファイル名は「ドキュメント名.セクション」の形式になっています。
/usr/local
/usrと同様にbin、sbin、lib、shareなどのディレクトリがあります。違いはファイルの管理主体です。/usrはディストリビューションが管理し、/usr/localは各システムの管理者(ユーザー)に管理責任があります。
/var
variable data filesが集まる場所です。頻繁に変更されるファイルを保存するために使用します。複数のコンピュータで共有するファイルの保存には適していません。Linuxをサーバーとして使う場合、ログやメールボックスが配置されるため非常に重要です。
/var/log
サーバープロセスが書くログファイルが保存されます。ログファイルとは、プログラムで発生するイベントが記録されるファイルのことです。
/var/spool
ユーザーメール(/var/spool/mail)やプリント入力(/var/spool/cups)が一時的に保存されます。
SPOOL(Simultaneous Peripheral Operation On-Line)は、コンピュータシステムで中央処理装置と入出力装置が独立して動作するようにすることで、中央処理装置に比べて周辺装置の処理速度が遅いために発生する待ち時間を削減するために考案された技法です。
/var/run
実行中のサーバープロセスのプロセスIDが保存されます。このようなファイルをPIDファイルと呼びます。サーバーを作る際は、起動時にこのフォルダにプロセスIDを記録し、終了時には削除するのが一種のマナーです。このフォルダで.pidで終わるファイルの内容を見れば、PIDを確認できます。
/etc
etceteraで、各システムの設定ファイルが保管されます。
/dev
devicesで、すべての種類のデバイスファイルをここに置くのがUnixの伝統的な方式でした。Linux 2.4以降、システムに存在するデバイスファイルのみをその都度作成するDevice File System(devfs)が導入されました。Linux 2.6からはudevという仕組みが導入されました。
新しい仕組みが導入された理由は、カーネルがサポートするハードウェアが増えすぎたためです。devfsはカーネルの一部として実装されていますが、udevはカーネルの外に実装されています。
/proc
processで、ここには一般的にプロセスファイルシステムProcess File System(procfs)がマウントされます。プロセスファイルシステムは、文字通りプロセスをファイルシステムとして表現したものです。PIDが1のプロセスの情報を取得したい場合、フォルダ/proc/1を見ればよいです。ただし最近はpsコマンドで確認するのが一般的です。
/sys
procfsにプロセスと関係のない情報がマウントされ始めたことを受け、システム関連情報を別途提供するためにLinux 2.6からsysfsという新しいファイルシステムが追加されました。sysfsをマウントするフォルダがここです。システムに存在するデバイスやデバイスドライバの情報を取得できます。
/boot
Linuxカーネルはvmlinuzというファイルに格納されています。BSDで仮想メモリメカニズムを含んだ際にunixからvmunixに変わりました。これを圧縮する際に末尾がzになり、vmlinuzとなりました。カーネルプログラムはもともとルートフォルダに直接保管していましたが、最近はここに保管するようになりました。
/root
スーパーユーザーのホームフォルダが/rootです。以前はルートフォルダがスーパーユーザーのホームフォルダでした。
/tmp, /var/tmp
一時的にどこかにファイルを作りたい場合があります。そのときにこのフォルダを利用すればよいです。二つのフォルダは保存期間が異なります。/tmpは再起動すると削除される可能性がありますが、/var/tmpは再起動しても削除されません。例としてviのリカバリファイルが/var/tmpに保存されます。
/home
一般ユーザーのホームフォルダは環境変数$HOMEでアクセスできます。大きな組織では/home1、/home2のように後ろに数字を付けることもあります。
ホームフォルダのパスが異なる場合があるため、専用APIを使用するのが安全です。
フォルダの区分基準#
| 観点 | O | X |
|---|---|---|
| 複数のホストで共有するかどうか | /usr | /var |
| 読み取り専用で運用するかどうか | /usr | /var |
| アーキテクチャに依存するかどうか | /usr/lib | /usr/share |
| ディストリビューションが管理するかどうか | /usr | /usr/local |
| 再起動しても残るかどうか | /var/tmp | /tmp |
このほかにも重要な観点として以下のようなものがあります。
- バックアップが必要かどうか(変更されるか、復旧が必要かどうか)
- ユーザーごとに必要か、システムに一つあれば良いかどうか
- 権限を分ける必要があるかどうか
- シェルでglobパターンで指定できると便利かどうか
コマンドまとめ#
builtin(ビルトイン)はShellの組み込みコマンドです。
man#
bashやzshなどのターミナルでman manと入力すると詳細な説明を見ることができます。
manは調べたいコマンドについての説明を表示します。42Tokyoで試験を受けたり課題をしたりする際にman 調べたいコマンドと入力して情報を探すことができます。manで関数を見ていると、最後の行付近にSEE ALSOという関連関数が表示されます。関数の横に括弧で囲まれた番号がありますが、これがmanual sectionsです。
Manual sections
各実装されたコマンドが以下の内容と照らし合わせると、どのsectionに関連しているか確認できます。
- User Commands = 一般コマンド
- System Calls = システムコール
- C Library Functions = C標準ライブラリ関数
- Devices and Special Files = 特殊ファイル(通常/devで見つかるデバイスファイル)とドライバ
- File Formats and Conventions = ファイル形式と規約
- Games et. Al. = ゲームとスクリーンセーバー
- Miscellanea = その他
- System Administration tools and Daemons = システム管理コマンドとデーモン
通常よく見るのは1番で、42Tokyoで課題をするなら3番も多く参照することになります。今はGoogleで検索すれば翻訳や整理が行き届いた記事を見ることができますが、このコマンドで説明を見るのもたまには良いのではないかと思います。
manのオプション
オプションの中で非常に便利なものは見つけていません。それでも知った幾つかを書いておきます。
-wオプションを使うと 例)man -w sed そのコマンドの説明書が書かれたパスを出力します。
vimでman sedと比較して見ると、どのように作成されているか、そのドキュメント形式を確認できます。
-kオプションを使うと 例)man -k variables そのキーワードを含むマニュアルの一覧を表示します。
特定のキーワードやフレーズを覚えている必要があります。オプションにコマンドのようなものを入れると、そのコマンドを含む単語が出てくるのであまり効果がありません。例)man -k sed -> used
通常、数字を入れずにmanを使うと最初のセクションの情報を表示しますが、数字を入れてコマンドを入力すると 例)man 1 sed そのセクションにあるコマンドを検索してくれます。できるだけ重複するコマンドを避けて作成されていますが、やむを得ない場合は重複があるためオプションが提供されているようです。
To become what you are not, behave as you do not.
— T.S. Eliot