Linuxのデバイスファイルとは?デバイスを扱う特別なファイルを初心者向けに解説
生徒
「Linuxのデバイスファイルって、普通のテキストファイルと何が違うんですか?」
先生
「デバイスファイルは、HDDやSSD、端末などの機器をLinuxからファイルのように扱うための特別な入口です。」
生徒
「機械なのにファイルとして見えるんですか?」
先生
「はい。Linuxではデバイスもファイルのように扱う考え方があり、多くのデバイスファイルは/devディレクトリに用意されます。基本から順番に見ていきましょう。」
Linuxを初めて学ぶ人や、 OS・プロセス・メモリ管理・仮想マシン・コンテナの仕組みを図解で理解したい人におすすめの定番書籍です。
試して理解 Linuxのしくみを見る※ Amazonアソシエイト広告リンク
1. Linuxのデバイスファイルとは?
Linuxの読み方はLinux(リナックス)です。デバイスファイルは英語でdevice file(デバイスファイル)といい、コンピュータに接続された装置やカーネルが提供する機能を、ファイルのような形で扱うための特別なファイルです。デバイスの読み方はdevice(デバイス)で、機器や装置という意味があります。
普通のテキストファイルには文章などのデータが保存されていますが、デバイスファイルは装置そのもののデータを保存しているわけではありません。プログラムがデバイスファイルを読み書きすると、その操作がLinuxカーネルやデバイスドライバへ伝わり、対応する装置や機能との入出力が行われます。
カーネルの読み方はkernel(カーネル)です。Linuxの中心部分で、CPU、メモリ、ストレージ、周辺機器などを管理します。デバイスドライバの読み方はdevice driver(デバイスドライバ)で、カーネルが個々の機器を操作するための仕組みです。
初心者の方は、デバイスファイルを「機械へ命令を届けるための窓口」と考えるとわかりやすいでしょう。プログラム側は機器ごとの細かな操作方法を直接意識せず、ファイルを開く、読む、書くといったLinuxらしい操作で装置へアクセスできます。
Linuxでは「いろいろなものをファイルとして扱う」という考え方が重要です。デバイスファイルを理解すると、/dev、HDD、SSD、端末、ブロックデバイス、キャラクタデバイスなどの仕組みも理解しやすくなります。
2. デバイスファイルが保存されるdevディレクトリ
Linuxのデバイスファイルは、主に/devディレクトリの中にあります。ディレクトリの読み方はdirectory(ディレクトリ)です。/devのdevはdevice(デバイス)に由来し、Linuxが扱うさまざまなデバイスへの入口が並ぶ場所として使われます。
たとえばストレージに関係するデバイスファイル、端末を表すデバイスファイル、データを捨てるための特殊なデバイスファイルなどがあります。ただし、すべてが実際の物理装置を表しているわけではありません。Linuxカーネルが提供する便利な仮想的な機能もデバイスファイルとして見えることがあります。
/devの中を確認すると、多数の項目が表示されます。初心者がすべての名前を暗記する必要はありません。まずは/dev/null、/dev/zero、/dev/tty、そしてストレージに関係するデバイス名があることを覚えておくとよいでしょう。
ls -l /dev/null /dev/zero /dev/tty
crw-rw-rw- 1 root root 1, 3 Aug 10 08:00 /dev/null
crw-rw-rw- 1 root root 1, 5 Aug 10 08:00 /dev/zero
crw-rw-rw- 1 root tty 5, 0 Aug 10 08:00 /dev/tty
表示の先頭が通常ファイルとは異なっていることに注目してください。この違いを見ることで、そのファイルがどの種類のデバイスファイルなのか判断できます。日時や所有者などの表示内容はLinux環境によって異なります。
3. ブロックデバイスとキャラクタデバイスの違い
Linuxのデバイスファイルには、代表的な種類としてブロックデバイスとキャラクタデバイスがあります。ブロックデバイスの読み方はblock device(ブロックデバイス)です。一定量のデータをブロック単位で扱う装置を表し、HDDやSSDなどのストレージが代表例です。
キャラクタデバイスの読み方はcharacter device(キャラクタデバイス)です。データを連続した流れとして扱う装置や機能に使われます。端末や/dev/nullなどが代表的な例です。
ls -lの表示では、ブロックデバイスは先頭にb、キャラクタデバイスは先頭にcが表示されます。通常のファイルでは先頭がハイフンになるため、最初の一文字を見るだけでもファイルの種類を判断する手掛かりになります。
ブロックデバイスだから必ず物理的なHDDというわけではありません。仮想ディスクや論理的に作られたストレージもブロックデバイスとして扱われることがあります。Linuxでは物理装置と仮想装置の両方を共通した仕組みで扱える点が特徴です。
4. lsblkでストレージのブロックデバイスを確認する
HDD、SSD、パーティションなどのブロックデバイスを確認するときは、lsblkコマンドが便利です。lsblkの読み方はlsblk(エルエスブロック)です。現在のLinuxが認識しているブロックデバイスを階層的に表示できます。
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 120G 0 disk
sda1 8:1 0 1G 0 part /boot
sda2 8:2 0 119G 0 part /
この例ではsdaがストレージ本体を表し、その中にsda1とsda2というパーティションがあります。実際の環境では、NVMe SSDならnvme0n1のような名前になることもあります。デバイス名は環境によって変わるため、決めつけずにlsblkで確認することが大切です。
パーティションの読み方はpartition(パーティション)です。一台のストレージを複数の領域に分けて利用する仕組みで、Linuxではそれぞれが個別のブロックデバイスとして扱われます。ファイルシステムを作成してマウントすると、通常のディレクトリからデータを保存できるようになります。
5. メジャー番号とマイナー番号とは?
デバイスファイルをls -lで見ると、通常のファイルサイズが表示される位置に二つの数字が見えることがあります。これがメジャー番号とマイナー番号です。メジャー番号の読み方はmajor number(メジャーナンバー)、マイナー番号の読み方はminor number(マイナーナンバー)です。
メジャー番号は、どの種類のデバイスドライバや処理系へ操作を渡すかを識別するために使われます。マイナー番号は、同じ種類の中で個々のデバイスなどを区別するために使われます。初心者の方は、メジャー番号を大きな分類、マイナー番号をその分類の中の個別番号と考えると理解しやすいでしょう。
stat -c '%F %t:%T %n' /dev/null
character special file 1:3 /dev/null
この例では/dev/nullがキャラクタ型の特殊ファイルであり、デバイスを識別する番号が表示されています。statの読み方はstat(スタット)です。ファイルの種類や属性などを詳しく確認するときに利用できます。
普段Linuxを利用するだけなら、メジャー番号やマイナー番号を毎回意識する必要はありません。ただし、デバイスファイルの仕組みやドライバについて学習するときには重要な基礎知識です。
6. dev nullとdev zeroはどんなデバイスファイル?
Linux初心者がデバイスファイルを学ぶときによく登場するのが/dev/nullです。nullの読み方はnull(ヌル)です。/dev/nullへ書き込んだデータは、そのまま破棄されます。そのため、不要なコマンド出力を捨てたいときなどに利用されます。
echo "test data" > /dev/null
echo $?
0
この例では文字列を/dev/nullへ書き込んでいますが、通常のファイルのように内容が保存されるわけではありません。終了状態が正常なら、データは受け取られたあとに破棄されます。シェルスクリプトなどでは、画面に表示する必要がない出力を捨てる用途でも利用されます。
/dev/zeroも特殊なデバイスファイルです。zeroの読み方はzero(ゼロ)です。読み込むとゼロで埋められたデータを返します。テスト用データを用意する場面などで使われることがあります。
これらは実際のHDDやキーボードを表す物理デバイスではありません。Linuxカーネルが提供する特別な機能を、通常のファイルと似た操作方法で利用できるようにした例です。デバイスファイルが単なる機器一覧ではないことがよくわかります。
7. dev ttyと端末の関係
Linuxでターミナルを利用していると、/dev/ttyや/dev/ptsという名前を見ることがあります。ttyの読み方はTTY(ティーティーワイ)です。歴史的にはteletypewriter(テレタイプライター)に由来する名称で、現在のLinuxでは端末に関係する仕組みで使われています。
端末の読み方は端末(タンマツ)です。ターミナルからコマンドを入力すると、キーボード入力や画面への文字出力などが端末の仕組みを通して処理されます。Linuxでは、その端末もデバイスファイルとして表されます。
現在のターミナルがどの端末デバイスを利用しているかは、ttyコマンドで確認できます。
tty
/dev/pts/0
この例では、現在のシェルが/dev/pts/0という疑似端末を利用しています。疑似端末の読み方は疑似端末(ギジタンマツ)です。実際の表示番号は環境や開いているターミナルによって異なります。
昔のLinuxやUNIXでは物理的な端末装置との関係が強く意識されていましたが、現在ではデスクトップのターミナルアプリやSSH接続などでも疑似端末が使われます。こうした歴史的な名前が現在のLinuxにも残っている点は、デバイスファイルを学ぶときの興味深い特徴です。
8. デバイスファイルはどのように作られる?
現在の一般的なLinuxでは、接続された機器をカーネルが認識すると、その情報をもとにデバイスファイルが自動的に用意される仕組みが使われています。そこで重要になるのがudevです。udevの読み方はudev(ユーデブ)です。
udevは、Linuxでデバイスの追加や削除に応じて/dev内のデバイスノードを管理する仕組みに関係します。デバイスノードの読み方はdevice node(デバイスノード)です。USB機器やストレージなどが認識されたときに、必要なデバイスファイルが適切な名前で利用できるようにします。
昔のUNIX系システムでは、管理者がデバイスファイルを手動で作る場面もありました。Linuxにもmknodというコマンドがありますが、現在の一般的な利用では、通常のユーザーがデバイスファイルを手作業で作る機会は多くありません。
初心者は「機器を接続すると、Linuxカーネルが認識し、必要なデバイスファイルが/devに現れる」という流れを理解しておけば十分です。さらに学習を進めると、カーネル、デバイスドライバ、sysfs、udevなどが連携していることがわかります。
9. デバイスファイルを扱うときの注意点
デバイスファイルは普通のファイルと似た方法で読み書きできますが、実際の装置へ直接つながる入口になる場合があります。そのため、不用意な書き込みには注意が必要です。特にHDDやSSDを表すブロックデバイスへ直接データを書き込むと、保存されているファイルシステムやデータを壊す可能性があります。
たとえばインターネットの記事にあるコマンドを意味を理解せずにコピーし、ストレージのデバイスファイルへ書き込むことは避けましょう。Linuxでは強力な操作をコマンドから実行できるため、対象のデバイス名を確認する習慣が重要です。
また、デバイスファイルにはアクセス権限が設定されています。一般ユーザーが自由に操作できるものもあれば、管理者や特定のグループだけが利用できるものもあります。アクセス権限の読み方はアクセス権限(アクセスケンゲン)です。Linuxでは安全性を保つため、利用できるユーザーを制限しています。
Linux初心者がデバイスファイルを学ぶ場合は、最初にls -l /dev/null、lsblk、ttyなどの読み取り中心のコマンドから試すと安全です。実際のストレージへ直接書き込む操作は、パーティションやファイルシステムの仕組みを理解してから行うようにしましょう。
Linuxのデバイスファイルは、HDDやSSD、端末、カーネルが提供する特殊な機能などをファイルのように扱うための入口です。/dev、ブロックデバイス、キャラクタデバイス、メジャー番号、マイナー番号、/dev/null、/dev/ttyなどを一緒に覚えると、Linuxのファイルシステムとデバイス管理の仕組みを理解しやすくなります。