Linuxのシンボリックリンクとハードリンクの概念を理解する

OS
この記事は約4分で読めます。
スポンサーリンク

この内容は色々情報がありますが、Linuxを始めて間もない人には分かりにくい部分がありますので、体系的に要点を整理します。

inode番号(アイノード番号)について

「シンボリックリンク」「ハードリンク」の内容に入る前に、Linuxがどのようにファイルやディレクトリを管理しているのかを理解する必要があります。
まずは、inode番号を表示させてみます。lsコマンドのオプションとして「-i」を指定します。

$ ls -li
合計 0
972062 -rw-r–r– 1 test test 0 3月 12 15:13 test.txt
$

この先頭の数字「972062」がinode番号になります。
Linuxはファイルやディレクトリにこのinode番号を割り当てて「どのファイルなのか」「どのディレクトリなのか」という判別をします。
コンピュータは数字で管理する方が得意なので、「ファイル名」や「ディレクトリ名」などの「文字」で管理するのではなく数字で管理します。
この番号は重複しません。

もう1つファイルを作ると別のinode番号が割り当てられます。
新しく作成したファイルには「972063」のinode番号が割り当てられました。

$ ls -li
合計 0
972062 -rw-r–r– 1 test test 0 3月 12 15:13 test.txt
972063 -rw-r–r– 1 test test 0 3月 12 15:17 test1.txt
$

Linuxでは「inode番号でファイルやディレクトリを管理し、人間が分かりやすいようにファイル名やディレクトリ名をおまけで付けている」と理解しておきましょう。

スポンサーリンク

シンボリックリンクとは

簡単に言うと、ファイルに対する「ショートカットファイルを作成する」という動作です。
実際に作ってみましょう。

シンボリックリンクを作成する場合は「ln」コマンドを使用します。
引数としては、シンボリックリンクを作成するということを明示するために「-s」を追加します。
何故「s」かというとシンボリックリンクは別名「ソフトリンク」と呼ばれるからと考えています。
ハードリンクが先に出来ていたので、あとからできたリンクの種類が「ソフト」と呼ばれているんじゃないかと勝手に考えています。

その後ろは「実際のファイル」「シンボリックリンクの名称」の順番で指定します。
ここは逆の順番で指定してしまうことが多いのですが、エラーメッセージが出るだけなので特に影響はありません。

$ ln -s test.txt test_link
$ ls -li
合計 0
972062 -rw-r–r– 1 test test 0 3月 12 15:13 test.txt
972063 lrwxrwxrwx 1 test test 8 3月 12 15:20 test_link -> test.txt
$

「test.txt」に対するシンボリックリンクとして「test_link」が作成されました。
inode番号が「972063」と異なるため、「別ファイル」として作成されています。
また、「どのファイルに対してのシンボリックリンクなのか?」が分かるように矢印表示がされています。

ハードリンクとは

簡単に言うと「inode番号に別名を追加する」という動作です。
ハードリンクの作り方はシンボリックリンクと似ています。
「-s」のオプションを省略するとハードリンクとして作成されます。

$ ln test.txt test_link
$ ls -li
合計 0
972062 -rw-r–r– 2 test test 0 3月 12 15:13 test.txt
972062 -rw-r–r– 2 test test 0 3月 12 15:13 test_link
$

まず、シンボリックリンクに合ったような「矢印」がありません。
ソフトリンクと異なり、ハードリンクは紐づけられている名称を追跡することができません。
その為、無計画に作成すると「どのファイル名が同じファイルを参照しているのか?」ということが分からない状態となります。

次に「inode番号」が「972062」と同じ値になっています。
そのためPCは「inode番号が同じためファイルは1つ。2行表示されているのはinode番号の名称が2つあるから」という認識です。

もう1点違いがあります。
パーミッションの後ろの数字を見てください。
ハードリンクを作る前は「1」と表示されていましたが、ハードリンクを作った後は「2」になっています。
これは、「inode番号に紐づけられている名前の数」を表しています。
ただし、どの名称が紐づけられているのは分かりません。
結局は、inode番号を調べていくことになります。

972062 -rw-r–r– 1 test test 0 3月 12 15:13 test.txt

972062 -rw-r–r– 2 test test 0 3月 12 15:13 test.txt
972062 -rw-r–r– 2 test test 0 3月 12 15:13 test_link

シンボリックリンクとハードリンクの使い分け

以前は使い分ける理由があったかもしれませんが、今はハードリンクを使用する場面は無いと考えています。

コメント

タイトルとURLをコピーしました