Linux スキルアップ プログラミング関連スキル

ハードリンクとシンボリックリンクの違いをわかりやすく説明します

エンジニア歴20年以上、フリーランスでソフトウェアエンジニア・ゲームクリエイター・シナリオライターをやっております『NaruTaku』と申します。

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を使用する上でこの違いを理解してもらっていれば大丈夫だと思います。

最後まで読んでくださりありがとうございました。

  • この記事を書いた人
  • 最新記事

NaruTaku

40代のフリーランスエンジニア・シナリオライター。 20代前半から20年間エンジニアとしてキャリアを積みフリーランスへ転身。ソフトウェア開発とゲーム開発、シナリオ執筆をメインに、プログラミング講師・Webライターとしても活動。また、フリーランスになり見た目の重要性に今さら気づき、ヒゲ脱毛を実施中。

-Linux, スキルアップ, プログラミング関連スキル