Infra Engineer

ハードリンク
2022.08.31
Lv1

ハードリンク

 

この記事を読んでほしいひと

LPIC level1習得を目ざす、初学者のかたへ。
コマンドの基本的な使い方について、解説をします。


今回の内容

今回は、ハードリンクについて解説します。
ハードリンクとシンボリックリンクはお互い関連する内容なのであわせて読んでみてください。またリンクについて不安な方はこちらの記事をお読みください。

・ハードリンクとは
・ハードリンクの作成
・まとめ
・演習問題

ハードリンクとは

ハードリンクとは、実際のデータとファイル名の結びつきのことを表します。通常、1つのファイルには1つのファイル名がつけられますが、1つのファイルに対して複数のファイル名を結びつけることもできます。下記の図では、実際のデータに対して「sak1.txt」というファイル名をつけることができますが(ハードリンク)、さらに「sak2」というファイル名をつけることもできます(ハードリンク)。

ハードリンクの書式
ls  <リンク元ファイル名>  <ハードリンク名>

ハードリンクの作成

それではハードリンクを作成してみましょう。まずsak1.txtをDocumentsディレクトリ下に作成して、hogeとテキストを入力しておきます。そしてsak2というハードリンクを作成してみます。

[root@localhost Documents]# touch sak1.txt  #sak1.txtをDocumentsディレクトリ下に作成する
[root@localhost Documents]# vi sak1.txt  #viコマンドによりsak1.txtにhogeを入力を行う
[root@localhost Documents]# cat sak1.txt #catコマンドによりsak1.txtの内容を確認する
hoge
[root@localhost Documents]# ln sak1.txt sak2 #lnコマンドによりsak2というハードリンクを作成する
[root@localhost Documents]# ls #Documentsディレクトリ下にはsak1.txtとsak2が存在する
sak1.txt sak2
[root@localhost Documents]# cat sak2 #sak2というハードリンクを参照する
hoge

これでハードリンクの作成はできました。「sak1.txt」と「sak2」は同じファイルを表しています。なので「sak1.txt」を変更した場合は、「sak2」にもその変更内容が反映されています(演習問題参照)

次に、リンク元のファイルを削除したらどうなるでしょうか。リンク元のファイルであるsak1.txtを削除して、sak2が参照できるか確認してみましょう。

[root@localhost Documents]# rm sak1.txt  #sak1.txtを削除する
rm: remove regular file 'sak1.txt'? yes #yesと入力する
[root@localhost Documents]# cat sak2 #sak2を参照する
hoge

リンク元のファイルを削除しても、作成したハードリンクからファイルの実体を参照できることが確認できました。ただこのハードリンクにも欠点があり、異なるファイルシステム上からリンクの作成が行えません。またディレクトリをもとにリンクを作成することができません。一方シンボリックリンクでは、異なるファイルシステム上からリンクの作成が行え、またディレクトリに対してもリンクを作成することができます。

(……ここまで読まれた方お疲れさまです。次に話す内容は少し発展的な内容を含むことになります。今までの内容ちょっと難しいなぁ…と感じられた方は演習問題に挑戦してみてください。そして次読むときにぜひ読んでみてください。もちろん初めて読む方でも分かりやすいように書いてあります。では続きをはじめましょう!)

Linuxのファイルシステムで用いられいているext3やext4では、すべてのファイルの実体にiノード番号と呼ばれるものが割りふられています。このiノード番号とファイル名の結びつきををハードリンクと呼んでいたのです! ここで新たにsak3というファイルとsak4というハードリンクを作成して、iノード番号を確認してみましょう。

[root@localhost Documents]# ls #Documentsディレクトリ下にはsak3とsak4というハードリンクが存在する
sak3 sak4
[root@localhost Documents]# ls -il #lsコマンドに-ilというオプションをつけることでiノード番号を表示させる
8409177 -rw-r--r--. 2 root root 5 Aug 31 00:00 file1
8409177 -rw-r--r--. 2 root root 5 Aug 31 00:00 file2

どちらも同じiノード番号8409177であることが確認できました。これはシンボリックリンクと関連する知識なのでなので覚えておいてください。

(…というわけで以上難しい内容が終了しました! ファイルにはiノード番号が使われていて、ハードリンクでは同じiノード番号が使われているんだなぁと理解できたら大丈夫です!)

ハードリンクのまとめ
ハードリンクとは、実際のデータとファイル名の結びつきを表している。
リンク元のファイルを削除しても、ハードリンクは参照できる。

まとめ

今回は、ハードリンクの作成についてお話しました。シンボリックリンクと関連する部分が多いので、ぜひシンボリックリンクについても読んでみてください。
最後に演習問題で、今回の記事の知識を復習してみましょう。


演習問題

問題

sak1.txtの内容をfugaに変更したあと、sak2を参照してfugaに変更されていることを確認してください。

解答

答え:

[bash] [root@localhost Documents]# vi sak1.txt #fugaに変更する
[root@localhost Documents]# cat sak1.txt #fugaに変更されているのを確認する
fuga
[root@localhost Documents]# cat sak2 #ハードリンクsak2を参照する
fuga
[/bash]