このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

【Linux】ハードリンクの作成

ハードリンクの作成と削除

 ハードリンクは、ファイルの実体を持たず、参照先の iノードを直接参照するリンクです。複数のファイル名が同じ iノードを参照することによって、1つのファイルに複数の名前を付けることができます。これにより、ファイルの名前を変更したり移動したりしても、実際のデータは変化しません。

ハードリンクを作成するコマンド

ハードリンクを作成するためには、lnコマンドを使用します。一般的な構文は以下の通りです。

【構文】
ln [参照先のファイルパス] [作成するリンクファイル名]

ln [参照先のファイルパス] [作成するリンクファイル名]

 例えば、ファイルexample.txtに対してlink.txtという名前のハードリンクを作成する場合、次のようにします。

ln example.txt link.txt

ハードリンクを削除するコマンド

 ハードリンクを削除する際には、注意が必要です。1つのハードリンクを削除しても、実際のデータは他のハードリンクからまだ参照されている可能性があります。

ハードリンクを削除する方法は、一般的には以下のコマンドを使用します。

【構文】
rm リンクファイル名

rm リンクファイル名

 例えば、file1という名前のファイルにハードリンク link1link2 がある場合、link1 を削除するには次のようにします。

rm link1

 ただし、link2 はまだ残っているため、file1 のデータは削除されません。file1 に関連付けられた全てのハードリンクが削除されると、そのファイルの実際のデータが削除されます。

ハードリンクの削除は、データの安全性を確保しながら不要なファイル名を片付けるために重要です。

ハードリンク数について

ファイルのハードリンク数

 ハードリンクを使用すると、同じ iノードを複数のファイル名が参照することになります。iノードにリンクされたファイルの数を示す「ハードリンク数」は、ハードリンクを1つ作成するとに1つ増加します。リンクを削除して「ハードリンク数」が0になったときに、はじめてファイルの実体が削除されるようになっています。

 しかし、シンボリックリンクを作成した場合、リンク数は増加しません。これは、シンボリックリンク自体が新しい iノードを持つため、リンク数が増加しないためです。

ディレクトリのハードリンク数

 新規に作成された空のディレクトリは、通常、2つのハードリンクを持ちます。それは、自分自身を表す「.」(カレントディレクトリを表すリンク)と親ディレクトリを表す「..」(親ディレクトリを表すリンク)が自動的に2つのハードリンクが作成されるからです。

 これらのハードリンクは、ディレクトリの基本的な構造を提供します。この仕組みにより、ファイルシステム内の階層構造が維持され、ディレクトリの移動やパスの解決が可能になります。

異なるファイルシステムへのハードリンクについて

 通常、ハードリンクは同じファイルシステム内でのみ機能します。ハードリンクは、ファイルが物理的に格納されているデータブロックへの参照を共有するため、同じファイルシステム内でのみ機能します。そのため、異なるファイルシステムにまたがるハードリンクを作成することはできません。

 異なるファイルシステム間でのハードリンクの制約は、ファイルがそれぞれ独自の inode テーブルを持ち、inode テーブル内の番号がファイルを一意に識別するためです。異なるファイルシステム間では、inode テーブルが互いに関連付けられていないため、ハードリンクを機能させることができません。

 ただし、異なるファイルシステム間でファイルを共有する方法として、シンボリックリンクを使用することができます。シンボリックリンクは、ファイルやディレクトリへのパスを参照する特別なファイルであり、異なるファイルシステム間でリンクを作成することができます。しかし、シンボリックリンクは単なるパスの参照であり、実際のファイルデータには直接アクセスしません。

ハードリンクの作成と削除コマンドの使用例

「file」という名前のテキストファイルを作成します。

・「echo "Hello World" > file」コマンドを実行します。

user01@ubuntu-vm:~$ echo "Hello World" > file

 lsコマンドで詳細情報を表示する「-l」オプションとiノード番号を表示する「-i」オプションを併用して実行します。

・「ls -li」コマンドを実行します。

fileファイルのハードリンク数が1であることが確認できます。

user01@ubuntu-vm:~$ ls -li
合計 40
1311582 -rw-rw-r-- 1 user01 user01   12  5月 14 00:11 file
1310731 drwx------ 4 user01 user01 4096  5月  5 14:52 snap
1310781 drwxr-xr-x 2 user01 user01 4096  1月  1 10:51 ダウンロード
1310782 drwxr-xr-x 2 user01 user01 4096  1月  1 10:51 テンプレート
1310780 drwxr-xr-x 2 user01 user01 4096  1月  1 10:51 デスクトップ
1310784 drwxr-xr-x 2 user01 user01 4096  1月  1 10:51 ドキュメント
1310787 drwxr-xr-x 2 user01 user01 4096  1月  1 10:51 ビデオ
1310786 drwxr-xr-x 2 user01 user01 4096  1月  1 10:51 ピクチャ
1310785 drwxr-xr-x 2 user01 user01 4096  1月  1 10:51 ミュージック
1310783 drwxr-xr-x 2 user01 user01 4096  1月  1 10:51 公開

fileファイルをもとに、hardlinkという名前のハードリンクを作成します。

・「ln file hardlink」コマンドを実行します。

user01@ubuntu-vm:~$ ln file hardlink

fileファイルとhardlinkファイルの属性情報と ハードリンク数を確認します。

・「ls -li」コマンドを実行します。

 hardlinkファイルは、fileファイルの iノードを参照しているためファイルの属性情報(iノード番号、アクセス権、所有者など)が、fileファイルの属性情報と一致していることが確認できます。また、ハードリンク数はともに2であることも確認できます。

ハードリンク数:「1」→「2」と変化しています。

user01@ubuntu-vm:~$ ls -li
合計 44
1311582 -rw-rw-r-- 2 user01 user01   12  5月 14 00:11 file
1311582 -rw-rw-r-- 2 user01 user01   12  5月 14 00:11 hardlink
1310731 drwx------ 4 user01 user01 4096  5月  5 14:52 snap
1310781 drwxr-xr-x 2 user01 user01 4096  1月  1 10:51 ダウンロード
1310782 drwxr-xr-x 2 user01 user01 4096  1月  1 10:51 テンプレート
1310780 drwxr-xr-x 2 user01 user01 4096  1月  1 10:51 デスクトップ
1310784 drwxr-xr-x 2 user01 user01 4096  1月  1 10:51 ドキュメント
1310787 drwxr-xr-x 2 user01 user01 4096  1月  1 10:51 ビデオ
1310786 drwxr-xr-x 2 user01 user01 4096  1月  1 10:51 ピクチャ
1310785 drwxr-xr-x 2 user01 user01 4096  1月  1 10:51 ミュージック
1310783 drwxr-xr-x 2 user01 user01 4096  1月  1 10:51 公開

下図は、fileファイルとhardlinkファイルの関係を図にまとめたものです。

ハードリンクは参照先ファイルの iノードを参照するもので、個別の iノード番号を持ちません。

hardlinkファイルの参照先のファイルを削除します。

・「rm file」コマンドを実行します。

user01@ubuntu-vm:~$ rm file

・「ls -li」コマンドを実行します。

hardlinkファイルのハードリンク数が1に変わっていることが確認できます。

user01@ubuntu-vm:~$ ls -li
合計 40
1311582 -rw-rw-r-- 1 user01 user01   12  5月 14 00:11 hardlink
1310731 drwx------ 4 user01 user01 4096  5月  5 14:52 snap
1310781 drwxr-xr-x 2 user01 user01 4096  1月  1 10:51 ダウンロード
1310782 drwxr-xr-x 2 user01 user01 4096  1月  1 10:51 テンプレート
1310780 drwxr-xr-x 2 user01 user01 4096  1月  1 10:51 デスクトップ
1310784 drwxr-xr-x 2 user01 user01 4096  1月  1 10:51 ドキュメント
1310787 drwxr-xr-x 2 user01 user01 4096  1月  1 10:51 ビデオ
1310786 drwxr-xr-x 2 user01 user01 4096  1月  1 10:51 ピクチャ
1310785 drwxr-xr-x 2 user01 user01 4096  1月  1 10:51 ミュージック
1310783 drwxr-xr-x 2 user01 user01 4096  1月  1 10:51 公開

 hardlinkファイルのハードリンク数が1つ減って1になっていますが、まだ、 iノードへ参照が残っていることを意味します。これは、まだ、hardlinkファイルから、ファイルの実体にアクセスできることを意味します。

・「cat hardlink」コマンドを実行します。

ファイルの実体にアクセスできることが確認できます。

user01@ubuntu-vm:~$ cat hardlink 
Hello World

この状況を図にまとめたものが下図となります。

参照先のファイルが削除されても、たどれるリンクが残っていればファイルの実体にアクセスできる。

ファイルは、ハードリンク数が0になると、その ファイルの実体が削除されます。

ハードリンクの削除

 hardlinkファイルを削除します。これで、iノードが削除されるとともにファイルの実体も削除されることになります。

・「rm hardlink」コマンドを実行します。

user01@ubuntu-vm:~$ rm hardlink 
user01@ubuntu-vm:~$ ls
snap          テンプレート  ドキュメント  ピクチャ      公開
ダウンロード  デスクトップ  ビデオ        ミュージック