こんにちは。
最近、ふつうのLinuxプログラミング 第2版を読んでいるので知識の定着のために学んだ内容を要約したメモを書きます。
このエントリは完全な個人のメモです。
お勉強のためにこの本を読んでいるので、内容を覚えるためにSummarizing(サマライジング)を行います。
8章の内容はこちら。
第9章 Linuxのディレクトリ構造
この章で説明すること
5~8章でストリームの話題でしたが、9章からはファイルシステムの話。
この章では以下の内容を説明します。
・Linuxのディレクトリ構造
・それぞれのディレクトリの使われ方
ディレクトリツリーの標準規格
Linuxのディレクトリ構造は、ルートディレクトリを頂点にしたツリー構造になっています。
ディレクトリ構成はOSやディストリビューションごとに変わりますが、ここではディレクトリツリーの標準規格であるFHS(The Filesystem Hierarchy Standard)について説明します。
ルートディレクトリ
ディレクトリツリーの根、ディレクトリツリーの頂点をルートディレクトリという。
binディレクトリ
binと名の付くディレクトリにはコマンド(プログラム)を置きます。
/bin配下にはシステムのOSのブート時に基本コマンド、/usr/binはそれ以外の一般ユーザ向けのコマンドという使い分けがされます。これら2つのディレクトリはディストリビューションが管理するディレクトリなので、自分でインストールするコマンドは/usr/local/binに置くのが望ましいです。
※最近は/binは/usr/binへのシンボリックリンクになっていることも多く、区別しない場合もあります。
sbinディレクトリ
sbinと名の付くディレクトリには管理者用コマンドを置きます。
/sbinと/usr/sbinの棲み分けはbinディレクトリと同様です。
libディレクトリ
C言語をはじめ、PerlやPythonなどの言語のライブラリを置きます。
libとlib64の使い方はディストリビューションによって異なります。
/libと/usr/libの棲み分けはbinディレクトリと同様です。
また、上記2つのディレクトリはディストリビューションが管理するディレクトリなので、自分でライブラリをインストールする場合は/usr/local/libなどに置くのが望ましいです。
/usrディレクトリ
複数のマシンで共有可能なファイルを置きます。
たとえば、大学や企業などでみんながアクセスできるサーバを立てておき、各個人のマシンからネットワーク越しにそのサーバのディレクトリをマウントするときなどに使います。
このようにネットワーク越しにファイルシステムをマウントする仕組みをネットワークファイルシステムといいます。
代表的なものにNFSやSAMBAなどがあります。
共有できないファイルは/varに配置します。
ちなみに、usrはUser Service and Routinesの略です。
/usr/srcディレクトリ
システムで使用するコマンドのソースコードを置きます。
Linuxカーネルのソースコードなど。
自作プログラムのソースコードを置くべきではありません。
/usr/includeディレクトリ
システムのヘッダファイルを置きます。
カーネルのヘッダファイルは/usr/include/linuxなどにあります。
/usr/shareディレクトリ
アーキテクチャに依存しない、共有可能なファイルを置きます。
たとえば、manやinfoなど。
/usr/share/manディレクトリ
manページを置きます。
ディストリビューションによっては/usr/manに置かれることもありますが、FHSでは/usr/share/manに置くことになっています。
man1ディレクトリはセクション1、man2ディレクトリはセクション2のmanが置かれています。
manページはroffという形式で書かれています。
/usr/localディレクトリ
/usr配下と同じもの(bin, sbin, lib, shareなど)が置かれます。
/usrと/usr/localの違いはファイルの管理者。
/usr配下のファイルはディストリビューションが管理していますが、/usr/local配下のファイルはシステムの管理者が管理しています。
/varディレクトリ
/varには、頻繁に更新されるファイルを置きます。
複数のマシンで共有するファイルは置くべきではありません。
/var/logディレクトリ
サーバープロセスが書き込むログファイルが置かれます。
/var/spoolディレクトリ
メールやプリンタの入力が一時的に保存されます。
/var/runディレクトリ
起動中のサーバプロセスのプロセスIDが保存されます。
このようなファイルをPIDファイルといいます。
サーバを作るときは起動時にこのディレクトリにPIDを保存し、終了時に削除するのがマナーです。
最近は/var/runディレクトリは/runディレクトリへのシンボリックリンクになっていることが多いです。
/etcディレクトリ
/etc/fstabや/etc/hostsなど、各マシンの設定ファイルを置きます。
/devディレクトリ
デバイスファイルを置きます。
デバイスファイルの生成にはdevfsとudevという2つの仕組みがあります。
devfsはカーネルの一部として実装されますが、udevはカーネルの外で実装されています。
/procディレクトリ
/procにはプロセスファイルシステム(procs : Process File System)がマウントされます。
プロセスファイルシステムとは、プロセスをファイルシステム上に表現する仕組み。
PIDが1のプロセスの情報を見たければ/proc/1の中身を見る。
数字以外のファイルやディレクトリはプロセスではなく、カーネルの情報を得るために使用される。
/sysディレクトリ
Linux 2.6から追加されたsysfsというファイルシステムがマウントされます。
システムに依存するデバイスや、デバイスドライバの情報が得られます。
/bootディレクトリ
カーネルのプログラムが置かれます。
ファイルは通常vmlinuzという名前です。
/rootディレクトリ
スーパーユーザのホームディレクトリ。
/tmp, /var/tmpディレクトリ
一時的にファイルを置きたいときなどに使用します。
/tmpと/var/tmpは似たような目的で使用されますが、ファイルが破棄されるタイミングが違います。
/tmpはリブートすると削除される可能性がありますが、/var/tmpはリブートしても消えません。
ホームディレクトリ
多くの場合「/home/ユーザ名」というディレクトリ名です。
場合によって胃は/home2, /home2, /home3...と分けられることがあります。
そのため、プログラムからホームディレクトリを取得したいときなどは/homeで決め打ちせず、APIを使って取得します。
APIについては14章を参照。
ディレクトリを分ける基準
書籍の中の表がわかりやすかったので、添付します。
迷ったときは目安にしてください。
その他
無駄に階層分けしてファイルを整理すると逆に探しにくくなります。
Linux場ではfindやgrepコマンドを使えるので、適度なフォルダ階層にとどめておくべきです。
まとめ
第9章の内容はこんな感じです。
第10章の内容はこちら。
おわり。