第2章 ファイルシステム構造
Linuxではすべてのファイルとディレクトリが、たった1つの木構造の中に配置されています。Windowsの「Cドライブ」「Dドライブ」のような複数のドライブという考え方はありません。
ルートディレクトリ「/」
この木構造のいちばん上にあるのがルートディレクトリで、記号 / で表します。USBメモリや外部ディスクを接続した場合も、新しいドライブとして表示されるのではなく、このツリーのどこかのディレクトリに「マウント」される形で組み込まれます。
なぜLinuxはこのような単一のツリー構造を採用しているのでしょうか。これはUnix(Linuxの源流となったOS)の設計思想に由来します。Unixには「すべてはファイルである」という考え方があり、ディスクの中のデータだけでなく、キーボードやプリンターのような周辺機器、さらには実行中のプログラムの情報までも、ファイルのように扱えるように設計されています。ドライブごとに世界が分かれるのではなく、あらゆるものが1つのツリーの中のパスとしてアクセスできることで、プログラムの側から見た操作方法を統一できるという利点があります。
主要なディレクトリ
| ディレクトリ | 役割 |
|---|---|
/ | ルート。すべての起点。 |
/home | 各ユーザーの個人フォルダ(例: /home/user)。 |
/etc | システムやアプリの設定ファイル置き場。 |
/var | ログなど、内容が変化していくデータ。 |
/tmp | 一時ファイル。再起動で消えることもある。 |
/bin, /usr/bin | コマンド(プログラム本体)が置かれる場所。 |
/sbin, /usr/sbin | 主にroot(管理者)が使う管理用コマンドが置かれる場所。 |
/usr | ユーザー向けアプリケーションやライブラリの大部分が置かれる。 |
/lib, /usr/lib | コマンドやアプリが実行時に読み込む共有ライブラリが置かれる。 |
/opt | ディストリビューション標準ではない、追加でインストールしたソフトウェアの置き場所。 |
/dev | ディスクやUSBメモリなど、デバイス(機器)を表すファイルが置かれる。 |
/proc | 実行中のプロセスやカーネルの情報を、仮想的なファイルとして参照できる。 |
/boot | 起動時に必要なカーネル本体やブートローダーの設定が置かれる。 |
/root | 管理者ユーザー(root)専用のホームディレクトリ。 |
/mnt, /media | 外部ディスクやUSBメモリなどを一時的にマウントするための場所。 |
/srv | Webサーバーなど、このマシンが提供するサービス用データが置かれる。 |
最初からすべてを覚える必要はありません。とりわけよく使うのは /home(自分の作業場所)と /etc(設定ファイル)で、この2つだけでもまず覚えておくと実務での理解がぐっと早くなります。
このようなディレクトリ構成は、実は各ディストリビューションが好き勝手に決めているわけではなく、FHS(Filesystem Hierarchy Standard)という業界標準にもとづいています。だからこそ、Ubuntuで覚えた「設定ファイルは/etcにある」という知識が、Rocky LinuxでもFedoraでもほぼそのまま通用します。もちろん細部の違いはありますが、大枠の構成は共通化されているという点は、Linuxを学ぶうえで安心材料になるはずです。
絶対パスと相対パス
ファイルやディレクトリの場所を示す文字列をパスと呼びます。パスには2種類あります。
- 絶対パス:
/から始まり、ルートからの完全な道順を示す。例:/home/user/memo.txt - 相対パス: 今いる場所(カレントディレクトリ)を起点にした道順。例:
notes/todo.txt
相対パスでは、次の特殊な記号もよく使います。
| 記号 | 意味 |
|---|---|
. | 今いるディレクトリ自身 |
.. | ひとつ上の親ディレクトリ |
~ | 自分のホームディレクトリ(例: /home/user) |
絶対パスと相対パスにはそれぞれ向き不向きがあります。絶対パスは「今どこにいても必ず同じ場所を指す」ため、シェルスクリプトや設定ファイルの中で場所を確実に指定したいときに向いています。一方の相対パスは、今の作業場所からすぐ近くのファイルを指すときにタイプ数を減らせるという利点があります。たとえば /home/user/notes/todo.txt というファイルを、/home/userにいる状態で操作するなら、絶対パスをすべて打つより notes/todo.txt と書くほうが速く、間違いも減らせます。
~は「ホームディレクトリを表す記号」ですが、これは$HOMEという環境変数の値をシェルが自動的に展開しているだけで、それ以上の特別な意味はありません。多くの環境では$HOMEの中身は/home/ユーザー名そのものです。つまり~・$HOME・/home/userは、多くの場合まったく同じ場所を指す3通りの書き方にすぎません。~は入力の手間を省くための記号的な省略形、$HOMEはその実体である変数、/home/userはさらにその変数の中身そのもの、という関係を押さえておきましょう。
pwd コマンドで現在地(絶対パス)を確認できます。詳しくは次の章で扱います。
cpやrmのようにファイルを変更・削除するコマンドを相対パスで実行する前には、pwdで現在地を確認する習慣をつけると安全です。
/home/user/memo.txt と書き、相対パスは現在地から辿って notes/todo.txt と書きます。隠しファイル(ドットファイル)
ファイル名が .(ドット)から始まるファイルやディレクトリは「隠しファイル」と呼ばれ、通常の ls では表示されません。設定ファイルの多くはこの形式でホームディレクトリに置かれています(例: .bashrc、.gitconfig)。隠しファイルは存在しないわけではなく、単に一覧表示から除外されているだけなので、確認したいときは ls -a を使います。
$ ls
memo.txt notes readme.txt
$ ls -a
. .. .bashrc memo.txt notes readme.txt
特殊な意味を持つ .(自分自身)と ..(親ディレクトリ)も、実はls -aを実行すると常に先頭に表示される「隠しディレクトリ」の一種です。
なぜ設定ファイルの多くがわざわざ「隠す」形式になっているのでしょうか。理由は単純で、ホームディレクトリには .bashrc(シェルの設定)、.gitconfig(Gitの設定)、.ssh(SSH関連の鍵)など、日常的にはほとんど編集しない設定ファイルが数十個単位で溜まっていきます。これらを毎回 ls の結果に表示させてしまうと、本当に見たい自分の作業ファイルが埋もれてしまいます。そこで「よく使うファイルだけを普段は表示し、設定ファイルは意図的に見に行ったときだけ表示する」という工夫として、ドットで始まるファイルを隠す仕組みが採用されています。
隠しファイルという仕組みは、削除やコピーの対象から誤って外れやすいという注意点もあります。たとえば cp -r 元ディレクトリ/* 先ディレクトリ/ のようにワイルドカードでコピーすると、隠しファイルはコピーされないことがあります(シェルの種類や設定によって挙動が変わります)。設定ファイルなど隠しファイルも含めて丸ごと複製したい場合は、隠しファイルも対象に含めることを意識しておきましょう。
Memo.txtとmemo.txtは別々のファイルとして存在できるので、大文字・小文字の違いを気にしないWindowsから移行してきた方は注意しましょう。ディレクトリ名やコマンド名についても同様です。
lsが見て、表示するかどうかを決めているだけです。試しにmv .bashrc bashrcのように先頭のドットを取り除くと、そのファイルは普通にlsの一覧に表示されるようになります(中身や機能は変わりません)。「隠す」という言葉から特殊な保護機能を連想しがちですが、実際には単なる命名規則にすぎない、という点を押さえておきましょう。
パスの中のスペースやよくある落とし穴
Linuxのファイル名にはスペース(空白)を含めることも技術的には可能ですが、コマンドライン上ではスペースが「引数の区切り」として扱われるため、そのまま入力するとファイル名が途中で分割されてしまい、意図しないエラーの原因になります。スペースを含むファイル名を扱う場合は、全体をダブルクォート(")で囲む必要があります。
$ cat "my notes.txt" # スペースを含む名前は引用符で囲む
今日の作業メモ
・サーバーのバックアップを確認する
・週次レポートを作成する
$ cat my notes.txt # 引用符を付け忘れた場合
cat: my: No such file or directory
cat: notes.txt: No such file or directory
この行のこの値に注目: 引用符で囲むと"my notes.txt"は1つのファイル名として認識され、中身がそのまま表示されます。引用符を付け忘れると、シェルはスペースを区切りとして解釈し、「my」と「notes.txt」という2つの別々の(存在しない)ファイルとして扱ってしまい、それぞれについて「No such file or directory」エラーが返ります。
このような手間を避けるため、Linux環境ではファイル名やディレクトリ名にスペースを使わず、代わりにハイフン-やアンダースコア_を使う慣習が広く浸透しています。これから自分でファイルやディレクトリを作るときも、この慣習に従っておくと後々のトラブルを減らせます。
また、長いファイル名やディレクトリ名を毎回すべて手入力するのは大変ですが、多くのシェルにはタブ補完という機能があります。ファイル名の最初の数文字を入力した状態でTabキーを押すと、残りの部分を自動的に補完してくれる機能で、入力ミスの防止とタイプ数の削減の両方に役立ちます。次章から実際にコマンドを打っていく中で、ぜひ積極的に使ってみてください。
ファイル名に使える文字・避けたほうがよい文字
Linuxのファイル名には日本語も含めてかなり自由に文字を使えますが、実務では英数字・ハイフン・アンダースコア・ドットだけで構成するのが安全とされています。理由は、*や?、&、;のようにシェルが特殊な意味を持たせている記号をファイル名に含めると、意図しない展開や実行が起きる危険があるためです。また日本語ファイル名は、SSH経由の操作やスクリプトでの自動処理時に文字コードの扱いを誤って文字化けする原因にもなりやすいため、サーバーで扱うファイルには半角英数字の名前を付ける習慣をつけておくと後々のトラブルを避けられます。
.txtや.jpgといった拡張子は、あくまで人間や一部のアプリケーションが「たぶんこの形式だろう」と判断するための目印(慣習)にすぎません。Windowsのように、拡張子そのものにOSレベルの特別な意味があるわけではないのです。極端な話、画像ファイルの中身のまま拡張子だけを.txtに変え、mv photo.jpg photo.txtとしても、Linux自体はエラーを出さずに受け入れます(ただし、それを開こうとしたアプリ側は中身と拡張子が食い違っているため正しく扱えません)。ファイルの本当の形式を厳密に判定したい場合は、拡張子ではなくファイル先頭のデータ(マジックナンバー)を見て判定するfileコマンドが使われます(上級編で扱います)。
手を動かす小課題
練習用ターミナルで、次の課題を実際に試してみましょう。答えは見出しをクリックすると表示されます。
課題1: ls -aで、ふだんは表示されない隠しファイルを確認してみましょう。
答え: ls -aと入力します。.bashrcのような、.で始まる隠しファイルや、.(自分自身)・..(親ディレクトリ)も含めて表示されます。lsだけだとこれらは表示されません。
課題2: cd notesで移動したあとpwdを実行し、絶対パスがどう変わるか確認してみましょう。
答え: cd notesのあとにpwdを実行すると、たとえば/home/userから/home/user/notesのように、現在地が1階層深くなったことが分かります。cd ..で元の場所に戻れます。
課題3: cat memo.txtと、パスを省略しないcat /home/user/memo.txtの2通りを試して、結果が同じになることを確認してみましょう。
答え: 自分が/home/userにいる状態なら、相対パスmemo.txtと絶対パス/home/user/memo.txtはまったく同じファイルを指すため、表示される中身も同じになります。相対パスと絶対パスが「同じ場所を指す2通りの書き方」であることを実感してみましょう。