file types in Linux.

来期の新卒向けにトレーニング資料を作っている。社外秘情報がある訳でもないので公開してみる。

Linux上では全てがファイルである

Linux上では全てがファイルだ。
ファイルではないその「何か」はプロセスであり、プロセスとして実行されている「何か」である。

Linuxを操作する = ファイルを操作する

Linuxでフルパスと呼ばれるものを見たことがあると思う。/から始まるものだ。
Linux上の全てがファイルであるという事は/でさえもファイルであるということになる。/はディレクトリでありファイルである。 Linux上ではハードウェアでさえファイルとして表現する。そしてそのファイルを使いハードウェアとコミュニケーションを行う。

これは入出力により指示を受けたり反応を返すリソースを扱う上で重要な事で、プロセス同士やネットワーク通信でさえファイルとして扱う。

全てがファイルという同じ種類のものであることは、全てのリソースに対して共通の方法でアクセス出来るという事だ。素晴らしい。
接続する、読み込む、書き込む、そういった操作を共通の方法でアクセスすることができる。

注意しなくてはならないのはファイルと一言で表すがその種類にはいくつかのタイプが存在すると言う事だ。
しかし、その意味とタイプを理解できればLinux上の全てについてあなたは理解した事になる。

本当に素晴らしい。

7種類のファイルタイプ

Linux上で表現出来るファイルタイプは3つある。

  • regular file
  • special file
  • directory file

そしてspecial fileは5つのタイプに分類出来る。

  • block file
  • character device file
  • pipe file
  • symbolic file
  • socket file

つまり、Linux上には7つのファイルタイプが存在する。

7つを覚えるだけであなたはLinuxの全てを理解できる。
難解な依存関係のアプリケーションプログラムの関係性を覚えるよりもよっぽど楽な事なのではないだろうか。
(Solarisはまた別の話だ。今回は除外して考えよう)

regular file

lsコマンドを使ったことがあるだろう。

lsコマンドがあればそのファイルがどのファイルタイプなのか理解することができる。つまり、lsコマンドでLinuxの全てを見極める事が出来る。
右手の薬指と左手の薬指でLinuxの全てを見極める事が出来るとは、なんて素晴らしい事だろうか。

regular fileはlsコマンドの実行結果行の先頭を-として表現する。

regular fileとして分類されるファイルは主に以下の4種類だ。

  1. readable file
  2. a binary file
  3. image file
  4. compressed file

他にもあるが、まずはこの4つだ。覚えよう。たった4つだ。

block file

block fileはそのほとんどが/devにあるハードウェアファイルである。

/devディレクトリでlsコマンドを使ってみよう。きっと実行結果の先頭がbであるファイルを見つけることが出来るだろう。それがblock fileだ。

/devという名前から想像できるが、ここにあるblock fileを介してデバイスドライバとの通信方法を提供する。ファイルを通してデバイスを操作する。不思議だがそういう事だ。

block fileの重要な特徴として、特定の時間に大きなブロックのデータと情報を転送できることだ。
抽象的だが、とにかく、大きなサイズのデータをやり取り出来る事を理解して欲しい。

character device file

character device fileはその名前からblock fileと似ていると感じるかもしれない。
その通り、似ているのだ。

異なるのは、1度に1文字ずつデータを転送するという事。
1文字という意味のcharacterと考えるとスッキリするかもしれない。1文字ずつという事は、バッファされていないという事も意味する。それにシリアルアクセスだという事も特徴だ。

ターミナルや端末と呼ばれるあの「黒い画面」はcharacter device fileとして存在している。

ttyという文字を見たことがあるかもしれないが、それのことだ。
つまり私達はターミナルに向かって1文字ずつ、シリアルアクセスをしているという事だ。

lsコマンドの実行結果としては、cという文字が先頭にあればそれがcharacter device fileだ。

pipe file

|を知っているだろうか。

例えばps aux | grep httpという感じで誰かがタイプしているのを見たことがあるかもしれない。
このパイプをファイルとして表現したのがpipe fileになる。

パイプはあるプロセスの出力を別のプロセスの入力に接続して、プロセス間通信を可能にする。
ps aux | grep httpとはpsの出力をgrepへ入力するということだ。

パイプの特徴はFIFOであるということ。first in, first outだ。
先入れ先出しという意味だが、先に入ったものが先に出ていくという事になる。
その間に入ってきたバイトの順序が入れ替わる事はない。

パイプをファイルとして表現した場合、「名前付きパイプ」と呼ぶ。
「名前」はファイルシステム内のファイル名を指している。つまり、ファイルとして存在するパイプである。

このファイルの入力に接続して投げ込んだバイトは、このファイルの出力に接続したファイルへ現れる。
ファイルを介してファイル同士がやりとりをする。ファイルという言葉が万能に聞こえてくる。

lsコマンドの実行結果としては先頭にpがあればそれがpipe fileだ。

symbolic file

システム上の他のファイルへの参照を示すファイルの事だ。

参照先のファイルはregular fileかdirectory fileのいずれかになる。
他のファイルを参照する事をリンクするという。リンクにはソフトリンクとハードリンクがある。

lsコマンドの実行結果としては先頭にlがあるはずだ。それがsymbolic fileということになる。

socket file

プロセス間で通信を行う場合、特に異なる環境で動作するプロセス間でのデータや情報を転送する場合はsocket fileが役に立つ。

ネットワーク上の異なるマシン上で実行されているプロセス間でのデータと情報の転送には重要な役割を果たす。

代表的なsocket fileの例は、Webサーバーに接続するWebブラウザーだろう。
Webサーバに接続するとは、Webサーバ上のプロセスとやりとりをする為に自身のマシン上のsocket fileとやりとりをするという事になる。

socket fileをもっと知りたければ、C言語で簡単なプログラムを書くと良い。
socket()というシステムコール関数を使って簡単にsocket fileを作ることが出来る。
他のfileと同じようにread()したりwrite()したり出来ると、Linuxがすべてをファイルとして表現する事のメリットを理解出来るかもしれない。

directory file

ここまでに説明してきた各種ファイルを格納する特別なファイルがdirectory fileだ。

ファイルを格納するファイルである。
Linuxの/ディレクトリから階層として表現されるファイル郡がまさにLinuxなのだ。

lsコマンドの実行結果ではdが先頭に確認できるはずだ。

そのファイルの中にはファイルが階層化されて格納されている。


ここまで理解出来たら次にはLinuxのファイルシステムについて学ぶと良いかもしれない。

Linuxのすべてがファイルであるとしたら、それを支えるファイルシステムはさらに重要なはずだ。
たくさんの種類のファイルシステムが君を待ち構えている。

Sota Takada
Sota Takada
Principal Engineer.

Software Engineer. Love Golang. Love envy(band in JP). Love Hokkaido & Okinawa(JP)

Related