
今回は、Linuxでよく使う
「ハードリンク」と「シンボリックリンク(ソフトリンク)」の違いをわかりやすく解説します。
何が違うの?
どっちを使えばいいの?
Windowsのショートカットと何が違うの?
このあたり、最初はかなり混乱しやすいポイントです。
特に
「リンク=ショートカット」
というイメージのままだと、ハードリンクの挙動はほぼ意味不明に感じます。
この記事では、
ファイルの実体はどこに保存されているのか
ハードリンクは何を共有しているのか
シンボリックリンクは何を参照しているのか
を図とイメージベースで直感的に理解できる形で整理していきます。
まずは、ファイル作成時の状態から順番に見ていきましょう。
ファイル作成時の状態
リンクを作成する元となるファイルですが、今回は「私はファイル1です」という文字を記載した「file1.txt」というテキストファイルを例にします。このfile1.txtを作成すると、以下のような状態になります。

少しわかりにくいかもしれませんが、「私はファイル1です」という内容はハードディスクなどのデータ領域に格納されます。そして、格納する場所には番地がついていて、今回の例では104番地に保存されたことにします。(メモリ管理はもっと複雑ですが、わかりやすくするためこうしております)
このとき、file1.txtは「おれの中身は104番地だな」と自分に書かれているデータがどこに保存されているかわかるようになっています。なので、「おれを見たいというやつがいれば104番地のデータを見せてやればいいんだな」となり、file1.txtにアクセスがあると、104番地のデータを見せることになります。
参考
ファイルの内容が実際に書かれているデータ領域の場所を示す番地をポインタと言います。この他にもファイルのアクセス権限やサイズなどをまとめて管理していて、これらの情報を「メタ情報」と言います。Linuxではこの情報をiノード番号という番号を用いて実際のデータ(テキストファイルに書かれた内容など)とは分けて管理しています。
ハードリンク
それではまずハードリンクからなのですが、言ってしまうとこいつがややこしくしている元凶なのです。どういうことかというと、「リンク」という名前がついているくせに元のファイルをまったく参照しないのです。リンク詐欺です笑
「リンク」って、あたかも元のファイルを参照するようなイメージを持たせるのですが、それを見事に裏切ってくれるのがこのハードリンクなのです。
では、実際にハードリンクを作成したときに何が起こっているかというと、ハードリンクに元ファイルの内容が格納されているデータ領域の番地情報が渡されるのです。今回の例では「ファイルの中身は104番地だよ」という情報が渡されます。つまり、「file1.txtへのハードリンク」にアクセスすると、直接データ領域の104番地を見に行ってしまうのです。イメージ的にはこんな感じです。

ほんとにリンクっぽくないのですが、これがハードリンクとなります。ちなみに、この状態でfile1.txtを削除しても、「file1.txtへのハードリンク」からファイルの中身が見えてしまうのです。なぜなら、こんな状態になっているから。

file1.txtを削除しても104番地の「私はファイル1です」というデータは消えないのです。これは「参照される箇所が残っている番地のデータは消さない」というLinuxの仕様によるものです。今回の例だと「file1.txtは消えたけど、file1.txtのハードリンクが104番地を参照してるので104番地のデータは消さないよ」ということになります。
元のデータが消えているのにリンクだけで生き残れる。ハードリンクってほんとにほんとにリンクっぽくないやつなのです。。。
参考
先ほど、メタ情報はiノード番号で管理すると言いましたが、「file1.txt」と「file1.txtへのハードリンク」が使うiノード番号はまったく同じです。なので、「file1.txt」と「file1.txtへのハードリンク」はまったく同じふるまいをするわけです。
シンボリックリンク
次に、シンボリックリンクです。こいつは先ほどのハードリンクとはうってかわり、リンクっぽいやつになります。Windowsのショートカットのイメージそのままで大丈夫です。
実際にリンクと聞いてイメージする通りの動きになるのですが、シンボリックリンクを作成すると、「file1.txt」を見に行きます。そして、「file1.txt」が「おれの中身は104番地だよ」と教えてくれるので、その後に104番地を見に行くわけです。こんな感じです。

リンク元をしっかりと参照する。まさにリンクと聞いてイメージするそのままの動きをしてくれるわけです。当然ですが、リンク元の「file1.txt」を削除するとシンボリックリンクからも見れなくなります。ちなみに、このときは「file1.txt」を削除した時点で104番地を削除しているファイルやリンクもなくなるので、104番地のデータも消えることになります。

以上、今回はハードリンクとシンボリックリンクの違いについて説明してみました。
まとめ
同じ「リンク」という名がついていますが、ハードリンクとシンボリックリンクでのふるまいの違いを理解いただけましたでしょうか。
どっちがどっちだっけ?
ともし迷うことがあれば「ハードリンクはもはやリンクではない」と思い出していただければと思います笑
あと、説明はしなかったのですがハードリンクとシンボリックリンクの違いとして以下もあります。
ハードリンク:同じファイルシステムにしか作成できない
シンボリックリンク:異なるファイルシステムでも作成できる。
この記事はエンジニア経験の浅い方、もしくはこれからエンジニアを目指す方向けに書いてますのでこの違いについて触れませんでしたが、またファイルシステムについても書こうと思います。(ふるまいの違いを理解するだけならファイルシステムわかっていなくても大丈夫です)
また、Windowsではなじみのないハードリンクですが実はWindowsでも作成できます。ただ、作成する機会は滅多にないと思いますので特に説明はしませんでした。僕も作ったことないですし^^;
なので、Linuxを使用する上でこの違いを理解してもらっていれば大丈夫だと思います。
✅ ITキャリアを育てるコミュニティ「ITキャリアラボ」
「独学だと続かない…」
「相談できる人がいない…」
「同じ目標の仲間がほしい…」
そんな方向けに、
無料のLINEコミュニティ『ITキャリアラボ』を運営しています。
エンジニア歴20年・講師の僕が、
・資格学習のコツ
・勉強法アドバイス
・キャリア相談
・IT業界のリアル情報
などを発信&質問対応しています。
📌 参加無料・匿名OK・LINEだけで完結
📌 まずは「話を聞くだけ」でも大歓迎
独学で悩む時間を減らしたい人は、気軽に頼ってください。
👇お気軽にどうぞ
ITキャリアラボ
-

【無料】ITの悩みを気軽に相談できるコミュニティ・ITキャリアラボ
IT業界を目指すあなたへ|「ITキャリアラボ」無料コミュニティのご案内 「IT業界に転職したいけど、何から始めればいいかわからない…」「資格の勉強が続かない…」「相談できる人がいない…」 そんな不安、 ...
続きを見る