これまでlsコマンドを使いながら、ファイル、ディレクトリ、ハードリンク・ファイル、シンボリックリンク・ファイルの一覧を表示させたり、その持ち主やパーミッションを表示させたりする方法を説明してきた。今回は、それら以外のファイルについて紹介したいと思う。いずれもユーザーや管理者が直接作成したり、編集したりすることはまずないファイルだが、「よくわからないので削除した」とか、「試しに適当なデータを書き込んでみた」などということをすると大変な事態になるので、モノが一体何者であるかくらいは知っておいていただきたい。

“スペシャル”なファイルを表す「c」と「b」

Linuxや*BSDには”スペシャル”なファイルが存在している。主に/dev/ディレクトリ以下にまとまっているのだが、これらに関しては周辺機器をファイルに変換したものだと思っておけばよい。そのため、このスペシャルファイルのことをデバイスファイルと呼ぶこともある。

CentOS 7ならば、/dev/ディレクトリ下を「ls -l」で調べると、次のようになっている。

/dev/ディレクトリ下のファイル一覧

各行の先頭1文字が「c」ないし「b」になっているものが、スペシャルファイルだ。実際にはデバイスは存在しないものの、ソフトウェアで模擬的に実現させているデバイスファイルも存在する。/dev/nullや/dev/zero、/dev/randomなどがよく引き合いに出されるので、どこかで字面くらいは見たことがあるのではないだろうか。擬似デバイスファイルといったところだ。

「ls -l」で出力された行の先頭文字が「c」のファイルは「キャラクタデバイス」、「b」のファイルは「ブロックデバイス」と呼ばれている。これは、データ通信の単位の違いで付けられたもので、1文字単位で通信するものをキャラクタデバイス、ある程度まとまったブロックで通信するものをブロックデバイスと呼んでいる。

しかし、最近ではFreeBSDのようにブロックデバイスが存在しないOSもある。これは、キャラクタデバイスとブロックデバイスをすべてキャラクタデバイスに統合しているからだ。

FreeBSDの/dev/ディレクトリ下のファイル

通信の単位やキャッシュを内部で統合して扱うことで、キャラクタデバイスとブロックデバイスを明示的に分ける必要がないようになっている。

FreeBSDの/dev/ディレクトリ下には、ブロックデバイスファイルは存在しない

管理者としては、/dev/以下では/dev/nullにゴミデータを捨てたり、catコマンドやddコマンドで特定のデータファイルを読みこんだりといったことはあっても、それ以外のスペシャルファイルにデータを書き込むような機会はまずないだろう。/dev/配下には、ディスクに相当するデバイスファイルもあるので、下手に書き込みを行うとディスクが壊れかねない。この辺りを認識しておいていただきたい。

名前付きパイプは「p」

ファイルの中には、FIFOと同じ動きをする特徴を持ったものがある。単にFIFOと呼ばれたり、「名前付きパイプ」と呼ばれたりするもので、「先に書き込んだものが先に出てくるファイル」だ。「ls -l」で出力すると、行の先頭文字が「p」になっている。

この名前付きパイプ(またはFIFO)ファイルは、mkfifoコマンドで作成することができる。

名前付きパイプ/FIFOはmkfifoコマンドで作成できる

このファイルの特性を理解するには、ターミナルを2つ起動/ログインして試すとわかりやすい。まず、片方のターミナルで名前付きパイプ/FIFOにデータを書き込む(ここでは、「MESSAGE」と書き込んでいる)。

echoコマンドを使って、「MESSAGE」という文字列を名前付きパイプ/FIFOファイルへ書き込む

ここで、もう一方のターミナルでファイルの中身を取り出してみると、書き込んだ文字列が出力される。

別のターミナルでcatコマンドを使うと、書き込んだ文字列を出力できる

元のターミナルに目を戻すと、書き込み処理が終了してプロンプトが表示されているはずだ。

別のターミナルでデータが出力されると書き込みが終了する

このように、2つのプロセス間でデータをやり取りする場合に使えるのが名前付きパイプ/FIFOと呼ばれるファイルの特徴だ。動作としては、パイプラインでコマンドをつないでデータを流して処理したのと同じことになるのだが、ファイルシステム上に名前(ファイル名)があるので、名前付きパイプと呼ばれているわけである。「こんな機能、使うことあるの?」と思うかもしれないが、時々使う機会はあるので、とりあえず「こういうものがある」ということを知っておいていただきたい。

ソケットファイルは「s」

名前付きパイプ/FIFOファイルとよく似ているものの、もう少し他のこともできるファイルに「ソケットファイル」がある。ソケットファイルの場合、「ls -l」による出力行の最初の1文字目は「s」だ。

ソケットファイルも名前付きパイプ/FIFOファイルと同じく、プロセス間でデータをやり取りするための方法の1つで、いくつかのソフトウェアがソケットファイルを使って通信をしている。そのため、うっかり削除したりすると関連するソフトウェアが通信できなくなってしまうので注意が必要だ。

今回のおさらい

今回のおさらいは、次のとおりだ。

  • lsコマンドで表示できるものはファイル、ディレクトリ、ハードリンク、シンボリックリンク以外にもスペシャルファイル、名前付きパイプ、ソケットファイルなどがある
  • スペシャルファイルにはキャラクタデバイス、ブロックデバイス、擬似デバイスなどがある
  • キャラクタデバイスを表す文字は「c」
  • ブロックデバイスを表す文字は「b」
  • 名前付きパイプを表す文字は「p」
  • ソケットファイルを表す文字は「s」
  • 名前付きパイプやソケットファイルは、プロセス間通信機能の1つ
  • これらのファイルを無碍に削除するといろいろ面倒が起こる

そろそろ、「ls -l」の出力からかなりのことが読み取れるようになっているはずだ。lsコマンドはlinuxサーバを運用するうえで基本中の基本となるコマンドなので、使いこなせるようになっておこう。