Linuxのハードリンクとは?同一inodeを共有するリンクの仕組みを初心者向けに解説
生徒
「Linuxのハードリンクって、ファイルをコピーするのと同じなんですか?」
先生
「コピーとは違います。ハードリンクは、同じinodeを持つファイル名を増やして、一つのデータを複数の名前から参照する仕組みです。」
生徒
「同じinodeというのは、どういう意味なんでしょうか?」
先生
「Linuxのファイルシステムでは、ファイル名とは別にinodeという管理情報があります。ハードリンクとシンボリックリンクの違いも含めて、初心者向けに順番に見ていきましょう。」
Linuxを初めて学ぶ人や、 OS・プロセス・メモリ管理・仮想マシン・コンテナの仕組みを図解で理解したい人におすすめの定番書籍です。
試して理解 Linuxのしくみを見る※ Amazonアソシエイト広告リンク
1. Linuxのハードリンクとは?
Linuxの読み方はLinux(リナックス)です。ハードリンクは英語でhard link(ハードリンク)といい、一つのファイルの実体を複数のファイル名から参照できるようにするLinuxのファイルシステムの仕組みです。
初心者の方は、一人の人に複数の呼び名が付いている状態をイメージするとわかりやすいでしょう。名前は違っていても、指している本人は同じです。Linuxのハードリンクも同じように、ファイル名は別でも、ファイルシステム上では同じ実体を参照します。
たとえばoriginal.txtというファイルに対してbackup.txtというハードリンクを作ると、二つの名前が同じファイルのデータを参照します。どちらか一方から内容を書き換えると、もう一方から見ても同じ変更内容が確認できます。
ただし、ハードリンクはファイルを丸ごと複製するコピーとは異なります。コピーした場合は別の実体が作られますが、ハードリンクでは同じinodeとデータを共有します。そのため、Linuxのハードリンクを理解するときは、ファイル名とファイルの実体を分けて考えることが重要です。
ハードリンクは、同じファイルシステム上にある一つのファイルへ複数の名前を付けるような仕組みです。ファイルのコピーやシンボリックリンクとは動作が異なります。
2. inodeとは?Linuxがファイルを管理する重要な情報
ハードリンクを理解するときに重要なのがinodeです。inodeの読み方はinode(アイノード)です。inodeは、Linuxのファイルシステムでファイルやディレクトリを管理するために使われる情報です。
inodeには、ファイルの種類、アクセス権限、所有者、ファイルサイズ、更新日時、データの保存場所に関係する情報などが記録されます。一方で、通常のファイル名そのものはinodeの中へ直接保存されるのではなく、ディレクトリ側でファイル名とinode番号の対応が管理されます。
初心者の方は、inodeをファイルの管理番号のように考えると理解しやすいでしょう。Linuxではファイル名だけを見て管理しているのではなく、それぞれのファイルの実体に対応するinode番号を利用しています。
ハードリンクを作ると、新しいファイル名が同じinode番号を参照します。そのため、元のファイル名とハードリンクの名前が異なっていても、同じinodeを持つことになります。これが「ハードリンクは同一inodeを共有するリンク」と説明される理由です。
inodeの仕組みを知ると、なぜ元のファイル名を削除してもハードリンクからデータを利用できるのか、なぜ別のファイルシステムへハードリンクを作れないのかといった疑問も理解しやすくなります。
3. lnコマンドでハードリンクを作成する方法
Linuxでハードリンクを作成するときは、lnコマンドを使います。lnの読み方はln(エルエヌ)です。link(リンク)を作成するためのLinux基本コマンドで、-sオプションを付けずに実行するとハードリンクを作成できます。
基本的な書き方は、最初に元のファイルを指定し、そのあとに新しく作成するハードリンクの名前を指定します。
echo "Linux hard link" > original.txt
ln original.txt hardlink.txt
cat hardlink.txt
Linux hard link
この例では、original.txtというファイルを作り、hardlink.txtというハードリンクを追加しています。cat hardlink.txtを実行すると、元のファイルと同じ内容が表示されます。
ここで重要なのは、hardlink.txtの中へoriginal.txtのデータがコピーされたわけではないということです。二つのファイル名が同じinodeを参照しているため、同じデータへアクセスしています。
シンボリックリンクを作るときはln -sを使いますが、ハードリンクでは-sを付けません。この違いはLinux初心者がよく間違えるポイントなので、ハードリンクはln、シンボリックリンクはln -sと区別して覚えておきましょう。
4. ls -liでinode番号が同じか確認する方法
作成したハードリンクが本当に同じinodeを共有しているか確認するときは、ls -liコマンドが便利です。lsの読み方はls(エルエス)です。-iを指定するとinode番号を表示でき、-lを付けるとファイルの詳細情報も確認できます。
ls -li original.txt hardlink.txt
123456 -rw-r--r-- 2 user user 16 Aug 10 08:20 hardlink.txt
123456 -rw-r--r-- 2 user user 16 Aug 10 08:20 original.txt
この例では、二つのファイルの左端に表示されているinode番号がどちらも同じです。実際のinode番号はLinux環境によって異なりますが、同じ番号になっていることがハードリンクを確認する大切なポイントです。
また、アクセス権限の後ろに表示されている数字にも注目してください。この例では二となっています。この数字はリンク数を表しており、同じinodeを指すディレクトリエントリが二つ存在することを示しています。
ハードリンクを追加すると、このリンク数が増えます。反対にハードリンクの名前を削除するとリンク数が減ります。Linuxのファイルシステムでは、このリンク数がデータを削除するタイミングにも関係します。
5. ハードリンクの片方を変更するとどうなる?
ハードリンクでは、複数のファイル名が同じファイルの実体を参照しています。そのため、どちらか一方の名前からファイル内容を書き換えると、もう一方から見える内容も変わります。
次の例では、ハードリンク側から文字列を追加し、そのあと元のファイル名から内容を確認しています。
echo "second line" >> hardlink.txt
cat original.txt
Linux hard link
second line
hardlink.txtへ追加した内容が、original.txtから確認しても表示されています。これは二つが別々のファイルデータを持っているのではなく、同じinodeとデータを共有しているためです。
この性質から、ハードリンクをコピーの代わりに考えてしまうと混乱することがあります。コピーした二つのファイルなら、一方を編集しても通常はもう一方へ変更は反映されません。しかしハードリンクの場合は同じ実体なので、一方から行った内容変更は、もう一方から見ても同じ結果になります。
Linux初心者は「ファイル名は二つでも中身は一つ」と覚えると、ハードリンクの特徴を理解しやすくなります。
6. 元のファイル名を削除してもデータが残る理由
ハードリンクで特に重要な特徴は、最初に作ったファイル名を削除しても、別のハードリンクが残っていればデータへアクセスできることです。これはLinuxでは、最初に作った名前だけが特別な元ファイルとして扱われているわけではないためです。
ハードリンクを作成したあとは、複数のファイル名が同じinodeを参照します。そのうち一つの名前を削除しても、ほかの名前から同じinodeへ到達できるため、ファイルの実体は残ります。
rm original.txt
cat hardlink.txt
Linux hard link
second line
この例ではoriginal.txtを削除していますが、hardlink.txtからは引き続き内容を読み取れます。初心者の方は、最初に作成したoriginal.txtが本体で、hardlink.txtは単なる別名だと思いやすいですが、ファイルシステムの仕組みとしては、どちらも同じinodeを参照する名前です。
同じinodeを参照するリンクがすべてなくなり、さらにそのファイルを利用しているプロセスもなくなると、ファイルのデータ領域が解放される対象になります。この仕組みはLinuxやUNIX系のファイル管理を理解するときに重要です。
7. ハードリンクとシンボリックリンクの違い
Linuxのリンクには、ハードリンクのほかにシンボリックリンクがあります。シンボリックリンクの読み方はsymbolic link(シンボリックリンク)です。短くシムリンクと呼ばれることもあります。
ハードリンクは、複数のファイル名が同じinodeを直接参照します。一方、シンボリックリンクは参照先となるファイルやディレクトリへのパスを保存する特別なファイルです。そのため、内部の仕組みは大きく異なります。
シンボリックリンクでは、参照先のファイルを削除するとリンクだけが残り、リンク切れになることがあります。ハードリンクでは、一つのファイル名を削除しても、別のハードリンクが残っている限り同じファイルの実体へアクセスできます。
また、シンボリックリンクはディレクトリにも一般的に作成でき、別のファイルシステムにあるファイルも参照できます。一方、通常のハードリンクは同じファイルシステム内で作成する必要があります。また一般ユーザーがディレクトリへハードリンクを作る操作は、ファイルシステムの整合性を守るため通常は制限されています。
ハードリンクは同じinodeを共有し、シンボリックリンクは参照先のパスを持つという違いを覚えておくと、Linuxのリンク機能を整理しやすくなります。
8. ハードリンクが別のファイルシステムをまたげない理由
ハードリンクには、異なるファイルシステムをまたいで作成できないという重要な制限があります。ファイルシステムの読み方はfile system(ファイルシステム)です。Linuxではext4やXFSなど、ストレージ上のファイルやディレクトリを管理するための仕組みが利用されます。
inode番号は、そのファイルシステムの中で管理される番号です。別のファイルシステムへ移ると、inodeを管理する仕組みも別になります。そのため、あるファイルシステムに存在するinodeを、別のファイルシステム側のファイル名から直接参照するハードリンクは作れません。
たとえば一台のストレージ内でも、異なるパーティションに別々のファイルシステムが作られている場合は、その境界をまたいでハードリンクを作ることはできません。別のHDDやSSDにあるファイルへハードリンクを作ることも、通常はできません。
別のファイルシステムにあるファイルをリンクしたい場合は、シンボリックリンクが利用できます。シンボリックリンクはinodeを直接共有するのではなく、参照先のパスを記録する仕組みだからです。
この違いを理解すると、Linuxでlnを実行したときに異なるデバイス間のリンクに関するエラーが表示される理由もわかるようになります。
9. findコマンドで同じinodeのハードリンクを探す方法
Linuxでは、inode番号を利用して同じファイルの実体を参照しているハードリンクを探すこともできます。そのときに利用できるのがfindコマンドの-inumです。
まずls -iなどでinode番号を確認します。その番号を指定して検索すると、同じinodeを持つファイル名を探せます。
ls -i hardlink.txt
123456 hardlink.txt
find . -inum 123456
./hardlink.txt
./another-link.txt
この例ではinode番号が同じ二つのファイル名が表示されています。実際のinode番号は環境によって異なります。大量のファイルがあるLinux環境で、同じ実体を参照しているハードリンクがどこにあるか確認したい場合に便利です。
findの読み方はfind(ファインド)です。ファイルやディレクトリを条件に応じて検索するLinuxの基本コマンドです。ファイル名だけでなくinode番号を条件として検索できるため、ハードリンクの調査にも利用できます。
Linuxのファイルシステムを詳しく調査するときは、ファイル名だけでなくinode番号を見ることで、表面上は別の名前に見えるファイル同士の関係を確認できます。
10. Linux初心者がハードリンクで覚えておきたいポイント
Linuxのハードリンクを理解するときは、まず「ファイル名とファイルの実体は同じものではない」という考え方を覚えることが重要です。Linuxのファイルシステムでは、ディレクトリ内のファイル名からinodeを参照し、そのinodeを通して実際のデータへアクセスします。
ハードリンクを作成すると、新しいファイル名が同じinodeを参照するようになります。そのため、元の名前と新しい名前のどちらから編集しても同じ内容が変化し、一方の名前を削除しても、別のハードリンクが残っていればデータへアクセスできます。
ハードリンクを作る基本コマンドはln 元ファイル リンク名です。作成したあとにls -liを使えば、inode番号が同じことを確認できます。さらにfind -inumを利用すれば、同じinodeを参照する別のファイル名を検索することもできます。
一方で、ハードリンクには同じファイルシステムの中でしか作れないという制限があります。また通常はディレクトリへのハードリンク作成も制限されています。異なるファイルシステムをまたぎたい場合やディレクトリへのリンクを作りたい場合には、シンボリックリンクを利用するのが一般的です。
LinuxやUNIXでは、ハードリンクとinodeの仕組みは昔からファイルシステムの基本として利用されてきました。普段のファイル操作ではinodeを意識する機会は少ないかもしれませんが、ハードリンク、リンク数、ファイル削除、ファイルシステムの仕組みを理解するときには欠かせない知識です。
Linux初心者は、実際に小さなテキストファイルを作成し、lnでハードリンクを作り、ls -liでinode番号を確認し、片方を編集したり削除したりして動きを確かめると理解しやすくなります。自分で操作することで、単なるショートカットではなく、同じinodeとデータを共有する仕組みであることを体験できます。