ふつうのLinuxプログラミング

第3回 ファイルシステムの種類と機能

青木峰郎
2008/11/7

第2回1 2次のページ

本連載では、Linuxで行うC言語プログラミングを初歩から解説します。ただし、C言語の基礎とLinuxでエディタが使えること、cd、ls、cat、lessといった基本的なコマンドを知っていることが前提になります。C言語の入門書を読み終えた人、WindowsでCやC++を使ってプログラミングをしていた人で、これからLinuxでのプログラミングを学びたい人、プログラミングを通じてLinuxの仕組みを理解したい人、LinuxやUNIXプログラミングに関するほかの書籍を読んだが難しくて挫折した人に向け、Linuxプログラミングの仕組みを解説します。

 今回から2回に分けて、Linuxを描き出す3つの概念について解説します。第1回「Linuxカーネルの作り出す世界」で述べたとおり、Linuxには「ファイルシステム」「プロセス」「ストリーム」という3つの概念があります。今回はそれら3つの重要概念のうち、一番身近にあると思われる「ファイルシステム」を説明します。

◆今回学ぶこと
・ファイル
・広義のファイル
・ファイルの種類
・付帯情報
・広義のファイルについてのまとめ
・ファイルシステムとマウント

本連載は、ソフトバンククリエイティブ刊行の『ふつうのLinuxプログラミング』のうち第1部「Linuxの仕組み」の中から「第2章 Linuxカーネルの正解」と「第3章 Linuxを描き出す3つの概念」を、同社の許可を得て転載するものです。

本書は、LinuxにおけるC言語プログラミングの入門書です。「Linuxの世界が何でできているのか」に着目し、「ファイルシステム」「プロセス」「ストリーム」という3つの概念を紹介しています。

なお、本連載は転載を行っているため@IT自分戦略研究所の表記とは一部異なる点があります。ただし、Webで掲載するに当たり、(例えば「本書は」としている部分は「本連載は」としていること、図版などの省略など)、表現を若干変更している点がありますが、その点ご了承ください

■ファイル

 ファイルシステムとは、ファイルという概念を成立させているシステムです。ですから、ファイルシステムについて話すにはまずファイル(file)について話さなければなりません。

 しかし、このファイルという用語がなかなか難敵です。およそ世の中にあるLinux関連の書籍を見る限り、ファイルという単語はあまり意識されずに3つの意味で使われています。

1.広義のファイル
2.狭義のファイル(regular file)
3.ストリーム

 ストリームは次回で詳しく説明するので、今回はまず1.と2.の「ファイル」について話しましょう。

■広義のファイル

 まず、適当なディレクトリをlsしてみてください。

$ ls /etc
X11            hosts           ld.so.cache         rc4
a2ps-site.cfg  hosts.lpd       motd                rc6
a2ps.cfg       inetd.conf      murasaki           rcS
adjtime        init.d          named.conf         resolv.conf
apache         inittab         namedb             rmt
at.deny        ioctl.save      netgroup           rndc.conf
             :
             :

 ここにはテキストファイル(例えばhosts)もあればバイナリファイル(例えばld.so.cache)もあります。ディレクトリもシンボリックリンクもあるでしょう。普段はこれらをすべて別物だと思っているかもしれませんが、実はこれらはすべて「ファイル」です。素朴には、lsで表示された名前と同じ数だけファイルがあると考えられます。このときの「ファイル」を“広義”のファイルと呼んでおきましょう。

■ファイルの種類

 広義のファイルは、より細かく分類できます。いったいどのような種類があるのでしょうか。できるだけ網羅的に挙げてみましょう。

普通のファイル(regular file)

 最も一般的なのは、内容がそのまま記録されているファイルです。このようなファイルのことを、regular file(訳は「普通のファイル」?)あるいはnormal file(これもやっぱり「普通のファイル」?)と言います。広義のファイルに対して、普通のファイルを「狭義のファイル」と呼んでもよいでしょう。

 人間から見ると、普通のファイルは使われ方によってさらに細かく分類できます。例えば、テキストファイルや画像ファイル、動画ファイルなどです。しかし、カーネルから見れば、これらはすべて「普通のファイル」であって、区別はありません。

 Windowsではテキストファイルや画像ファイルなどがすべて区別されているように見えますが、あれは単にファイルの拡張子(ファイル名末尾の.txtなど)を見て動作を変えているにすぎません。その証拠に、テキストファイルを作って拡張子だけ.jpgに変えてみると、エクスプローラはファイルを正常に開けなくなります。

ディレクトリ(directory)

 ディレクトリは、他のファイル(広義のファイル)を複数入れることができるファイルです。UNIXでは伝統的にディレクトリのデータも単なるバイト列として読むことができたのですが、Linuxはそれを禁止しています。

シンボリックリンク(symbolic link)

 シンボリックリンクとは、他のファイルの名前を格納したファイルのことです。ソフトリンク(soft link)とも呼ばれます。何も考えずにシンボリックリンクにアクセスすると、カーネルはそれをシンボリックリンクが指す先のファイルへのアクセスへ自動的に置き換えます。

 シンボリックリンクの主な使い道は、ファイルやディレクトリに別名を付けることです。例としてディレクトリに別名を付ける場合を挙げます。

 Linux OSではログファイルを/var/logディレクトリに置くのが一般的ですが、OSによってはログファイルを/var/admディレクトリに置く場合があります。そのようなOSで作成されたプログラムの中には、ログファイルは/var/admにあると仮定しているものがあるので、そういったプログラムをLinuxで動かすには/var/admを用意する必要があります。

 そういうときこそシンボリックリンクの出番です。/var/admを/var/logへのシンボリックリンクにすれば、/var/adm以下のファイルへのアクセスを自動的に/var/logへのアクセスへすり替えられます。これで、ログファイルが/var/logにあると思っているプログラムと/var/admにあると思っているプログラムの両方が問題なく動作するようになります。

デバイスファイル(device file)

 デバイスファイルとは、デバイス(ハードウェア)をファイルとして表現したものです。

 例えば、デバイスファイル/dev/hdaは1台目のIDE(ATA)のハードディスクを表しています。「表している」とは、書籍『ふつうのLinuxプログラミング』第5章以降で紹介するAPIを使ってこのファイルにアクセスすると、ハードディスクに記録されているデータを操作できるということです。ただし、これは非常に危険ですので実際には試さないでください。

 また、デバイスファイルには、表現するハードウェアによってキャラクタデバイスファイル(character device file)とブロックデバイスファイル(block devicefile)があります。この2つの違いは、好きなときに好きなところにアクセスできるかどうかにあります。例えばハードディスクは代表的なブロックデバイスです。プリンタやモデムはキャラクタデバイスです。

 ところで、デバイスファイルと呼ばれていても対応するデバイスがないものもあります。例えばデバイスファイル/dev/nullがそうで、このファイルは読み込むと常に空、何かを書き込むとどこかに消えてしまうという不思議なファイルです。同じくデバイスの後ろ盾がないデバイスファイルには、/dev/zeroや/dev/randomなどがあります。

名前付きパイプ(named pipe)

 名前付きパイプは、後述するプロセス間通信に使うファイルです。FIFOとも呼ばれます。名前付きパイプは使用頻度が低いので本書では扱いません。

UNIXドメインソケット(UNIX domain socket)

 UNIXドメインソケットも、プロセス間通信で使うファイルです。現在ではTCPソケットで代替できるので、本書では扱いません。

付帯情報とまとめ

第2回1 2次のページ

自分戦略研究所、フォーラム化のお知らせ

@IT自分戦略研究所は2014年2月、@ITのフォーラムになりました。

現在ご覧いただいている記事は、既掲載記事をアーカイブ化したものです。新着記事は、 新しくなったトップページよりご覧ください。

これからも、@IT自分戦略研究所をよろしくお願いいたします。