基礎技術

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

以下の不満を解消するため、会社員をやめてフリーランスになった『ユウイチ』と申します。

会社員時代の不満

・収入の限界(給料が上がらない)

・自由な時間が持てない(会社に拘束される)

・人間関係がしんどい

※フリーランスになり、これらの不満は解消されました(収入も増え、自分の時間を増やし、のびのびと働くことができております)

今回は基礎技術の紹介です。

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

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

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

ユウイチ

『人生は自由に楽しむもの』をモットーにし、自由に働く40代のフリーランスエンジニア・シナリオライター。 20代前半から20年間エンジニアとしてキャリアを積みフリーランスへ転身。ソフトウェア開発とゲーム開発、シナリオ執筆をメインに、プログラミング講師・Webライターなど、好きなことを仕事にしながら活動中。

-基礎技術