リンクとinode ― ln・ln -s
前提:4-4が完了し、~/practice(空ディレクトリ)が存在する状態から始めます。第4章の最後は、少し不思議で奥が深い「リンク」の仕組みです。Windowsのショートカットに似たものとして、Linuxにはハードリンク※2とシンボリックリンク(ソフトリンク)※3という2種類のリンクがあります。見た目は似ていても中身の仕組みはまったく別物で、この違いを理解するカギになるのがinode※1という「ファイルの実体を指す背番号」です。~/practiceの中で実際に手を動かしながら体験し、ページの最後にはすべて片付けます。
このページではSET 1〜3、合計30行のコマンドを上から順に叩きます。手打ち推奨(コピーは確認用)です。最後のSETでは、あえてリンク切れを起こしてlsの表示が赤くなる様子まで体験します。
SET 1 ― ハードリンクを作り、inode番号を見る
- $cd ~/practice
- $echo "オリジナルの中身です" > original.txt
- $cat original.txt
- $ls -li original.txt
- $ln original.txt hard.txt
- $ls -li
- 123456 -rw-rw-r-- 2 ubuntu ubuntu 32 7月 3 10:20 hard.txt
- 123456 -rw-rw-r-- 2 ubuntu ubuntu 32 7月 3 10:20 original.txt
- $cat hard.txt
- $echo "追記した内容" >> hard.txt
- $cat original.txt
- $wc -l original.txt hard.txt
1〜2行目で、練習用ディレクトリにoriginal.txtという元になるファイルを作成し、3行目のcat original.txtで中身を確認します。4行目のls -li original.txtで、リンクを作る前の状態のinode番号を先に控えておきましょう。5行目のln original.txt hard.txtが、このページの主役ln(linkの略)コマンドです。オプションなしのlnはハードリンクを作成し、original.txtとhard.txtという2つの名前を、同じ1つのファイルの実体に結びつけます。
6行目のls -liは、通常の-l(詳細表示)に-iを加えて、各ファイルの先頭にinode番号を表示するオプションです。出力例をよく見ると、hard.txtとoriginal.txtのinode番号がまったく同じ(123456)であることがわかります。これはSET 1の4行目で控えた番号とも一致するはずで、偶然ではなくハードリンクの本質そのものです。Linuxでは、ファイルの中身(実体)はinodeという番号で管理されており、ファイル名は「その実体に貼られたラベル」に過ぎません。lnで作ったハードリンクは、同じ実体に対して2枚目のラベルを追加しているだけなのです。詳細表示の3列目にある数字「2」も、このファイルの実体を指しているリンクの数(ラベルの枚数)を表しています。
7行目のcat hard.txtで、hard.txtという名前からでも同じ中身が読めることを確認します。8行目のecho "追記した内容" >> hard.txtでhard.txtに追記すると、9行目のcat original.txtで確認できるように、もう一方のoriginal.txtを読んでも追記内容が反映されています。名前は2つでも実体は1つしかない――ハードリンクの正体を数字と挙動の両方で確認できました。最後の10行目wc -l original.txt hard.txt(第1章1-4で学んだコマンドです)を実行すると、2つのファイル名それぞれに対して行数が表示されますが、数値はまったく同じになります。異なる名前でも、数えているのは同じ1つの実体だからです。
inode番号が同じなら、それは実質同じファイルです。ls -liの左端の数字を見比べる習慣をつけると、「名前は違うのに中身が同期される」という不思議な現象の正体をすぐ見抜けるようになります。

ファイル名って、実は「本棚に貼ったラベル」でしかなくて、本(実体=inode)そのものじゃないんだって知ったとき、あたしはかなり衝撃だったよ! ハードリンクは同じ本に2枚目のラベルを貼ってるだけだから、どっちのラベルから読んでも同じ本が開かれる、って考えるとしっくりくるはず!
SET 2 ― シンボリックリンクを作り、違いを確認する
- $ln -s original.txt soft.txt
- $ls -li
- 789012 lrwxrwxrwx 1 ubuntu ubuntu 12 7月 3 10:22 soft.txt -> original.txt
- $ls -l soft.txt
- $cat soft.txt
- $ln -s ~/practice soft-dir
- $ls -l soft-dir
- $readlink soft.txt
- original.txt
- $readlink -f soft.txt
- $file soft.txt
- $file hard.txt
1行目のln -s original.txt soft.txtは、-sオプションを付けてシンボリックリンク(ソフトリンク)を作成しています。2行目のls -liで確認すると、出力例のようにsoft.txtのinode番号はoriginal.txtとはまったく別の数字(789012)になっており、ファイルの種類を表す先頭文字もl(linkの意味)になっています。さらにsoft.txt -> original.txtという矢印表示で、これが「original.txtを指し示す道しるべ」であることが一目でわかります。ハードリンクが同じ実体への2枚目のラベルだったのに対し、シンボリックリンクは「ここを見に行ってください」という案内板それ自体が独立したファイルになっているという点が決定的な違いです。
3行目のls -l soft.txt、4行目のcat soft.txtでは、案内板をたどった先のoriginal.txtの中身が問題なく読めることを確認します。5行目のln -s ~/practice soft-dirは、シンボリックリンクがファイルだけでなくディレクトリに対しても作成できることを確認する一手間です(ハードリンクはディレクトリには使えないという制約があり、これも2つのリンクの違いの1つです)。6行目のls -l soft-dirで、これもsoft-dir -> /home/ubuntu/practiceのような矢印表示になっていることを確認します。
7行目のreadlink soft.txtは、そのシンボリックリンクが「どこを指しているか」を表示する専用コマンドです。出力例のように、リンク先として指定したoriginal.txtという文字列がそのまま返ってきます。8行目のreadlink -f soft.txtは、-fを付けることでリンク先を絶対パスの形に変換して表示するオプションです。
最後に9行目のfile soft.txtと10行目のfile hard.txtで、それぞれのファイルの種類を確認します。fileコマンド(第1章1-4で登場)にかけると、soft.txtは「symbolic link to original.txt」のようにリンクであることがはっきり表示されるのに対し、hard.txtは普通のテキストファイルとしか表示されません。これは、OSから見るとハードリンクは「リンク」という特別な種類ではなく、単なるファイルの別名として扱われているためです。
ハードリンク=同じ実体への2枚目のラベル、シンボリックリンク=別ファイルとして存在する「道しるべ」。この整理さえできれば、Windowsのショートカットとの違いも見えてきます。ショートカットはシンボリックリンクに近い存在ですが、Linuxのシンボリックリンクはファイルシステムの正式な機能として、コマンドからも透過的に扱える点が特徴です。
SET 3 ― リンク切れを体験し、片付ける
- $rm original.txt
- $ls -l
- $cat hard.txt
- $cat soft.txt
- cat: soft.txt: No such file or directory
- $ls --color=auto -l soft.txt
- $readlink soft.txt
- $rm soft.txt hard.txt
- $rm soft-dir
- $cd ~
- $ls practice
1行目のrm original.txtで、あえて元のファイルを削除してみます。2行目のls -lで一覧を見ると、hard.txtとsoft.txtはどちらもまだ残っていますが、ここで2つのリンクの運命がはっきり分かれます。3行目のcat hard.txtを実行すると、これまで通り問題なく中身が読めます。SET 1で確認した通り、ハードリンクは実体そのものを共有しているため、original.txtというラベルが1枚剥がされても、hard.txtというもう1枚のラベルが実体を守ってくれているのです。
ところが4行目のcat soft.txtを実行すると、出力例のようにNo such file or directory(そのようなファイルはありません)というエラーになります。これがリンク切れ※4です。シンボリックリンクは「original.txtを見に行ってください」という道しるべそのものでしかないため、指し示す先が消えてしまうと、案内板だけが残って行き場を失ってしまいます。5行目のls --color=auto -l soft.txtを実際にターミナルの画面で実行すると、リンク切れしたsoft.txtの表示が赤色で強調表示されます。これはUbuntuのlsが標準で備えている親切機能で、「この案内板は行き先を失っていますよ」という警告です。6行目のreadlink soft.txtで確認すると、リンク先の情報(original.txtという文字列)自体はまだ残っていることもわかります。案内板は健在でも、その先の建物が取り壊されてしまった、というイメージです。
7行目のrm soft.txt hard.txtで、このページで作った残りのファイルをまとめて削除します。8行目のrm soft-dirでは、SET 2で作成したディレクトリへのシンボリックリンクを削除しています。rm soft-dir/のように末尾にスラッシュを付けてしまうと「リンク先のディレクトリの中身を消そうとしている」と誤解されてエラーになることがあるため、シンボリックリンク自体を消したいときはスラッシュを付けないのがコツです(~/practiceの中身は無事に残ります)。
最後に9行目のcd ~でホームディレクトリへ戻り、10行目のls practiceで何も表示されない(空になっている)ことを確認すれば、片付けは完了です。第4章「システムを観察する」はこれで終わりです。

Windowsで、元のファイルを消したのにショートカットだけデスクトップに残って「開けません」ってなるやつ、見たことあるよね? あれとまったく同じ現象がLinuxのシンボリックリンクでも起きるんだよ! ターミナルの色が赤くなってるリンクを見つけたら、「あ、行き先がなくなってるんだな」ってすぐ気づけるようになるよ!
ファイルを移動・削除するときは、そのファイルを指しているシンボリックリンクが他にないかを一度考える癖をつけましょう。特に設定ファイルの世界(第5章で登場します)では、シンボリックリンクが意図的に活用される場面が数多くあります。
まとめ
4-5では、ハードリンクとシンボリックリンクという2種類のリンクの仕組みと、それぞれの違いを実際の挙動で体験しました。これで第4章「システムを観察する」は完了です。このページで叩けるようになったコマンドを一覧にまとめます。
| コマンド | 何をするか | 覚え方 |
|---|---|---|
ln <元> <新名前> | ハードリンクを作成する(同じ実体に別名を追加) | ln=link、オプションなしは硬い(hard)方 |
ln -s <元> <新名前> | シンボリックリンクを作成する(道しるべを作る) | -s=symbolic(象徴・案内板) |
ls -li | inode番号を含めて一覧表示する | -i=inode番号を見せて |
readlink <リンク> | シンボリックリンクの指す先を表示する | read+link=リンク先を読む |
readlink -f <リンク> | リンク先を絶対パスで表示する | -f=フルパスで |
file <ファイル> | ファイルの種類(リンクかどうか等)を調べる | これは一体何者か |
次のページからは第5章「管理者の仕事」に入ります。「5-1. apt でパッケージ管理」では、これまで紹介にとどめていたlocateやzip、treeのようなツールを、いよいよ自分の手でサーバーにインストールできるようになります。