各ディレクトリの役割を知ろう(ルートディレクトリ編)

第2回 各ディレクトリの役割を知ろう(ルートディレクトリ編)

Windowsユーザーにとって、Linuxのディレクトリ構造は複雑怪奇で何をどうすればよいのか分からないという人も多いだろう。そこで、今回はLinuxの各ディレクトリの意味や役割、使い方を紹介する。

ディレクトリを知ればLinuxが見えてくる

 Windowsを使っている人であれば、ディレクトリごとに役割や約束事があることはご存じでしょう。

 アプリケーションをインストールする場合は、通常\Program Filesフォルダ下にサブフォルダを作ってファイルを保存します。Windows 2000であれば各ユーザー固有の設定は\Documents and Settingsフォルダ下にあり、\WINNTにはOS本体のファイルが集められています。各ユーザーが作成したデータの保存先は、ユーザー用の[マイ ドキュメント]であり、ちょっと詳しい人ならこのアイコンの実体が\Documents and Settings\ユーザー名\My Documentsであること、好きなフォルダにマッピングし直せることも知っているでしょう。

 しかし、WindowsからLinuxに移行した途端、いままでのセオリーはまったく通用しなくなります。どこに何があるのか、どこをどうすればよいのか分からなくて戸惑った人も多いはずです。

 Linuxの各ディレクトリにも、同じように固有の役目や使い方があります。そこで、今回はLinuxのディレクトリ構成について見ていくことにしましょう。各ディレクトリの意味を知ることによって、Linuxへの理解も深まることでしょう。

ディレクトリ/ファイル構成の標準規格FHS

ここがポイント
・Filesystem Hierarchy Standard
・Red HatやDebian、Solarisの構成

 UNIX系統のOSは、オリジナルであるSystem 7のディレクトリ構成をベースに、時代の要請を取り入れながら徐々に変わってきました。そのため、さまざまなシステムで似たり寄ったりの構成になっていますが、やはり細かい違いはあります。これを統一すべく策定されたのがFilesystem Hierarchy Standard(FHS)で、2001年8月時点ではバージョン2.2がリリースされています(http://www.pathname.com/fhs/)。(編注

編注:FHS 2.2の正式版がリリースされたのは2001年3月24日。ちなみに、2001年6月27日にはLSB(Linux Standard Base)のバージョン1.0がリリースされた。LSBは、Free Standards Groupを中心に主要ディストリビュータを加えて策定されたLinux標準仕様。FHSはLSBの一部であり、FHS 2.2がLSB 1.0におけるディレクトリ構成の定義を担っている。
Linux Standard Basehttp://www.linuxbase.org/

 FHSはディレクトリ構成を規定し、/binや/sbinにはどんなコマンドがあるべきかまで記述してあります。有力なディストリビュータが協力しているので、今後はFHSに基づいたディレクトリ構成がメジャーになっていくと思われます。

 それでは、FHS 2.2で規定されたディレクトリ構成を見ていきましょう(図1)。ただし、/etc、/usr、/varなどはさらに複雑な下位ディレクトリ構成を持っています。各ディレクトリ下のサブディレクトリについては、次回に解説します。

/   ルートディレクトリ
/bin 基本コマンド
/boot 起動に必要なファイル
/dev デバイスファイル
/etc 設定ファイル
/home(オプション) ユーザーのホームディレクトリ
/lib 共有ライブラリ
/lib<qual>(オプション)  
/mnt 一時的なマウントポイント
/opt 追加アプリケーション
/proc(Linux固有) プロセス情報など
/root(オプション) root用ホームディレクトリ
/sbin システム管理用コマンドなど
/tmp 一時的なファイル
/usr 各種プログラムなど
/var 変更されるデータ
図1 FHS 2.2で規定されたディレクトリ構成。特に注記のないものは「必須」に指定されている

 比較対象として、最もメジャーなディストリビューションであるRed Hat Linux 7.1(図2)とち密かつ膨大なパッケージ数を誇るDebian GNU/Linux 2.2(図3)の2つを挙げました。それぞれ、微妙に構成が異なっていることが分かります。

/   /
/bin   /bin
/boot   /boot
/dev   /cdrom
/etc   /dev
/home   /etc
/lib   /floppy
/lost+found   /home
/misc   /initrd
/mnt   /lib
/opt   ├ lock(ファイル)
/proc   /lost+found
/root   /mnt
/sbin   /proc
/tmp   /root
/usr   /sbin
/var   /tmp
    /usr
    /var
    ├ vmlinuz(ファイル)
    └ vmlinuz.old(ファイル)
図2 Red Hat Linux 7.1のルートディレクトリにあるディレクトリ   図3 Debian GNU/Linux 2.2のルートディレクトリにあるファイルとディレクトリ

 もう1つ、余談になりますがSolarisのディレクトリ構成も挙げておきます(図4)。同じUNIX系OS(Solarisはズバリ「UNIX」ですが)といっても、ディレクトリ構造はLinuxと異なる点が多いことに気付くでしょう。

/   ルートディレクトリ
/dev デバイスファイルへのリンク
/device デバイスファイル
/etc 設定ファイル
/export NFS用共有ディレクトリ
/kernel カーネルなど
/mnt 一時的なマウントポイント
/net オートマウント用マウントポイント
/opt アプリケーションインストール用
/platform アーキテクチャ依存プログラム
/proc プロセスファイルシステム
/sbin システム管理用コマンドなど
/tmp 一時的なファイル
/vol ボリュームマネージャ用
/usr 各種プログラムなど
bin/ 基本コマンド
lib/ 各種ライブラリ
/var 変更されるデータ
/xfn FNS用
図4 (参考)Solarisのディレクトリ構成。binとlibが/usr下にあるほか、各所でLinuxと異なることが分かる

ルートディレクトリ下の各ディレクトリ

ここがポイント
・各ディレクトリの役目を知ろう

 では、FHS 2.2による定義を中心に、各ディレクトリの役目やセオリーを解説していきましょう。必要に応じて、実際のディストリビューションでどのように扱われているかについても紹介します。

/bin

 ここには、システム管理者と一般ユーザーの両方が使う、極めて基本的なコマンドが入っています。ほかのファイルシステムがマウントされていない、シングルユーザーモードでも一通りの作業が行えるコマンド群です。

 FHS 2.2では、ここに収めるべきコマンドをRequirements(必須)とOptions(オプション)の2種類に分けて定義しています。定義されているコマンドは以下のとおりです。

Requirements(必須)コマンド
cat chgrp chmod chown cp date dd
df dmesg echo false hostname kill ln
login ls mkdir mknod more mount mv
ps pwd rm rmdir sed sh stty
su sync true umount uname    
Options(オプション)コマンド
csh ed tar cpio gzip gunzip zcat
netstat ping          

 実際のシステム(ディストリビューション)では、もう少しコマンドがあります。

 /binは、NFSを使ってネットワークで共有したり、ROMに収めたりすることを想定していますから、ここにユーザーが新たにコマンドをインストールするべきではありません

/boot

 ブート時に必要なファイルは、このディレクトリに配置されます。初期のLinuxには存在しなかったディレクトリで、Slackwareなどはルートディレクトリにいきなりカーネルが置かれていました。FHS 2.2では、カーネルは/(ルート)か/bootのどちらかに置くことになっています。

 最近のディストリビューションでは、だいたいにおいて/bootに配置されているようです。Debianでは、/bootにある実体に対してのシンボリックリンクが/にあります。

 このディレクトリがあると、BIOSの制限からブートできなくなるといった事態を回避するのに便利です。ディスクの先頭から100Mbytesくらいのパーティションを作り、これを/bootディレクトリに割り当てておくのです。

 /bootはカーネルの再構築を行うとき以外、触る必要のないディレクトリです。

/dev

 /devにはデバイスファイルが配置されています。コンソール画面に何かを出力するなら、/dev/consoleに書き込めばいいわけです。

 Linuxの特徴として、「各種のデバイスもファイルとして扱う」ということがよくいわれます。もっとも、これはUNIXの特徴だったのですが、現代のOSは大なり小なりUNIXの影響を受けているためか、割と一般的な機能です。

 よほどのことがない限り、/dev内のファイルを変更する必要はありません。訳の分からないうちにいじると、デバイスがグシャグシャになったりするので注意が必要です。

/etc

 さまざまな設定ファイルは、ここ/etcにあります。かなりの数のファイルがあるので、最初は戸惑うかもしれません。しかし、一度にすべてが必要になるわけではないので、1つずつ確認していっても間に合います。関連する設定ファイルが多い場合は、/etc以下にサブディレクトリを作ってその中に配置することもあります。

 /etc以下のファイルはホスト固有のデータなので、共有することは考えられていません。ディレクトリ内の細かい説明は、次回に行います。

/home

 /homeは、各ユーザーのホームディレクトリがある場所です。概して容量を必要とするので、/usrの下にシンボリックリンクが張ってあったりします。できれば、このディレクトリは独立したパーティションにしておいた方がいいでしょう(前回のパーティション分割/非分割のセオリー参照)。

 もっとも、/homeはFHS 2.2ではオプション扱いになっており、必須というわけではありません。例えば、純然たる共用ファイルサーバであれば個人用のホームディレクトリは不要でしょう。

/lib

 Linuxでは早くからシェアドライブラリを使ったダイナミックリンク機能が提供されていました。シェアドライブラリは、実行時、必要になった時点で初めてHDからメモリに読み込まれます。そのイメージを保存しておくディレクトリが/libです。カーネルのブート時に必要なものと、/ファイルシステムにあるコマンド(/binや/sbin内のコマンド)を実行するのに必要なライブラリはここにあります。

 なお、FHS 2.2では複数の実行形式バイナリをサポートするシステムのために、/lib<qual>という形式のディレクトリもオプションとして既定されています。

/lost+found

 fsckでディスクをチェックしたときに作られる、破損ファイルの断片を収めるディレクトリです。ルートディレクトリだけでなく、あちこちにあります。とはいえ、普通のユーザーには、ここに残っている情報から元のファイルを復元するのはまず無理でしょう。/lost+foundディレクトリの内容にこだわるよりも、正常なファイルのバックアップをマメに取っておく方が重要です。

 実は、このディレクトリはファイルシステムのフォーマットにも依存するので、FHS 2.2では規定されていません

/mnt

 一時的にファイルシステムをマウントするためのディレクトリです。ディストリビューションによって、/mntだけの場合と、その下にcdromやfloppyを含んでいる場合があります。一般のユーザーが使うことはなく、root専用と考えた方がいいでしょう。

/opt

 RPMやdpkgといったパッケージ管理システムでプログラムをインストールする場所です。ここにもbin、doc、include、info、libといったサブディレクトリがあるので、次回詳しく解説します。Red Hat Linux 7.1にはありますが、Debian GNU/Linuxにはまだありません。Solarisにもありますから、今後はこのディレクトリも標準的なものになっていくでしょう。

/proc

 Linux固有の性格が強い(FreeBSDやSolarisにも存在しますが)ディレクトリで、カーネル内部の情報にアクセスするためのファイル編注)が集まっています。CPUやPCIバス、そして文字どおり各種プロセスの情報を読み出せます。

 今回紹介したほかのディレクトリは、FHS 2.2で「Requirements」(必須)あるいは「Options」(オプション)として定義されています。しかし、/procはLinux固有の性格が強いため、「Operating System Specific Annex」(OS別付記事項)のLinux限定セクションで定義されています。

編注:/procの内容は「ファイル」と呼ばれるが、通常のファイルとは異なりHD容量を消費することはない。つまり、HD上にそのようなファイルは存在しないのである。

/root

 スーパーユーザーのホームディレクトリです。昔はルートディレクトリがそのままスーパーユーザーのホームディレクトリでしたが、「見通しが悪い」「セキュリティ上問題がある」といった理由で専用のディレクトリである/rootができました。/homeと別なのは、そちらが壊れてもrootだけは作業できるようにするためです。

 FHS 2.2ではオプションですが、最近のディストリビューションではもはや標準となっているようです。

/sbin

 /sbinは、ブートやシステムのリカバリーに必要なシステム標準コマンドが収められています。/binと違うのは、rootが使用するシステムメンテナンス系のコマンドが集まっていることです。一般ユーザーが使う必要はありませんし、使おうとしても権限の問題で動作しないコマンドがほとんどです。

 ここに必ず置かれるべきコマンドも、やはりFHS 2.2で以下のように規定されています。

Requirements(必須)コマンド
shutdown            
Options(オプション)コマンド
fastboot fasthalt fdisk fsck getty halt ifconfig
init mkfs mkswap reboot route swapon swapoff
update            

 /bin同様、実際のシステムではもっと多くのコマンドが入っています。

 このディレクトリにはシステム標準のコマンド群のみを収めておくべきであり、新しいコマンドをここにインストールすることは感心できません

/tmp

 その名のとおり、一時的な作業用のディレクトリです。リブート時にきれいに掃除されます。だれでも使えますが、持続性を要求されるファイルを置くべきではありません。

/usr

 ユーザー向けのディレクトリで、多くのサブディレクトリを含んでいます。サブディレクトリの1つである/usr/localは、パッケージ管理システムの管轄外となっています。自分でソースからコンパイルしたプログラムなどは、この/usr/local下に配置するのが一般的です。

 詳しいことは、次回解説します。

/var

 プリントやメール、ネットニュースのスプール、キャッシュといった作業用エリア、ログファイルなど、変化していく(variable)ファイルを配置するディレクトリです。/tmpと違って、リブートしても削除されません。

 かつては、ここに属するファイルはほかのディレクトリにあるものが多かったのですが、NFSでファイルを共有するようになってから、変化しないほかのディレクトリと、変化する/varディレクトリを明確に分けるようになりました。システム運用上の効率アップと、セキュリティ対策がその理由です。

   
共有可能
共有不可
  変化せず /usr /etc
  /opt /boot
  変化する /var/mail /var/run
  /var/spool/news /var/lock
  共有と変化から見たディレクトリの分類

いまだに残る細かい相違点

ここがポイント
・現在はFHSへの移行の過渡期

 これまで、FHSをベースにしてルートディレクトリのディレクトリ構成を紹介してきました。各ディレクトリの役割や使い方はおおむねお分かりいただけたと思います。

 しかし、すべてのディストリビューションが完全にFHS準拠になっているわけではありません。そのため、ディストリビューション間で微妙な差異が生じていることもあります。例えば、Debian GNU/Linuxには/cdrom/floppyといったデバイスマウント用のディレクトリ(Red Hatでは/mnt以下)、/initrd(Red Hatでは/bootに相当)がありますが、Red Hat Linuxにはありません。

 FHS 2.2を見た限りでは、/直下にいきなり/cdromや/mo、/floppyといったディレクトリを作るのは推奨されていないようです。今後は、Red Hat Linuxのように/mnt/cdrom、/mnt/floppyといった形になっていくのでしょう。