シンボリックリンクとハードリンク(ファイルを別名でアクセスする)

シンボリックリンクとハードリンク(ファイルを別名でアクセスする)

ファイルを別名でアクセスするリンク

シンボリックリンクとハードリンクは、どちらも特定のファイルやディレクトリに、
別名でアクセスするために使用するためのものです。

通常、ファイルを指定するためには、ファイルが位置するディレクトリに移動した上で
ファイルを指定するか、パスを指定する必要がありますが、

毎回、同じファイルに対してディレクトリの階層構造を考えるのは、大変手間がかかるので、
シンボリックリンクやハードリンクのようなものを使用します。

(※)
例えば、/home/user01/dir1/dir11/file1ファイルをdir11_file1 という別名でアクセスできるということです。

これは、WindowsのPCに置き換えると、ショートカットをイメージしていただくとわかりやすいかもしれません。
エクスプローラーでファイルを操作する際に、対象のフォルダに毎回移動するのが手間なので、
デスクトップに、対象のフォルダのショートカットを作成することで、こういった手間を省く事ができます。

どちらのリンクもln(LiNk)コマンドを使って作成します

シンボリックリンク

ln –s [元のファイルのパス][シンボリックリンクのパス]

ハードリンク

ln  [元のファイルのパス][ハードリンクのパス]

まずは、シンボリックリンクを使ってみましょう

[user01@localhost ~]$date > today.txt

[user01@localhost ~]$ls  -l
-rw-rw-r-- 1 user01 user01 43  2月 12 17:45 today.txt
[user01@localhost ~]$ln -s today.txt  sday.txt
[user01@localhost ~]$ls -l   
lrwxrwxrwx 1 user01 user01  9  2月 12 17:47 sday.txt -> today.txt

続けて、ハードリンクを使ってみましょう

today.txtのハードリンクをhday.txtという名前で作成します

[user01@localhost ~]$ln today.txt  hday.txt
[user01@localhost ~]$ls -l
合計 28
-rw-rw-r-- 2 user01 user01  43  2月 12 17:45 hday.txt
lrwxrwxrwx 1 user01 user01   9  2月 12 17:47 sday.txt -> today.txt
-rw-rw-r-- 2 user01 user01  43  2月 12 17:45 today.txt

ハードリンクの数がどちらも「2」になっている点、元のファイルのサイズとサイズが同じことに注意してください。

ハード(シンボリック)リンクがファイルの中身を参照する仕組み

ファイルの中身にアクセスする方法

続いて、ファイルの中身がどのように参照できているのかを説明します。
まず、ファイルを作成すると、ファイル名と「iノード番号」が紐づけて保存されます。
「i ノード番号」は「i ノード」の番号であり、「iノード」は、ファイルの中身が記載された実体の場所情報を、
確認できるものです。
そして、ファイル名にアクセスすると、「iノード番号」を介して対象の「iノード」を確認できるので、
「iノード」に書かれた場所情報を元に実体にアクセスすることで、初めてファイルの中身が確認できます。

ハードリンクでファイルの中身にアクセスする方法

一方、ハードリンクを作成すると、元のファイルと同じ 「iノード番号」が割り当てられます。
つまりは、ハードリンクのファイル名にアクセスすると、元のファイルと同じように、
① iノード番号、② iノード、③実体 といった順番で、ファイルの確認できているということです。

ハード(シンボリック)リンクがファイルの中身を参照する仕組み

ハードリンクでファイルの中身にアクセスする方法

lsコマンドに「-i」オプションを加えて、ハードリンクと元のファイルの iノード番号が同じであることを
確認していきましょう。

[user01@localhost ~]$ls -il
合計 28
1205114 -rw-rw-r-- 2 user01 user01  43  2月 12 17:45 hday.txt
   3997 lrwxrwxrwx 1 user01 user01   9  2月 12 17:47 sday.txt -> today.txt
1205114 -rw-rw-r-- 2 user01 user01  43  2月 12 17:45 today.txt

シンボリックリンクでファイルの中身にアクセスする方法

反対にシンボリックリンクを作成しても、リンク先のファイルと同じ iノード番号は、割り当てられません。
シンボリックリンクにアクセスすると、リンク先のファイル名にアクセスした上で、リンク先のファイル名
を介して、i ノード番号や iノードを参照します。

iノードについて

以上の内容から、i ノードを介してファイルの中身にアクセスできることがわかりました。
iノードについてまとめると次の通りです。

  • 「iノード番号」とは、「iノード」を識別するための番号である
  • すべてのディレクトリや、ファイルは重複しない「iノード番号」で管理されている
  • 「iノード」には、ファイルの場所情報以外にも、ファイルサイズや更新日時などが記録されている

ハードリンクを削除したらどうなるの?

ここまでの内容をから、ハードリンクは元のファイルと同じi ノード番号が、割り当てられることがわかりました。
では、ハードリンクを削除したらどうなるのでしょうか。

ハードリンクを削除した場合、iノード自体が削除されるわけではないので、元のファイルに影響はありません。

ハードリンクを削除したらどうなるの?

元のファイルを削除した場合も、同様にiノードが削除されるわけではないので、
ハードリンクにアクセスすることで、ファイルの中身にアクセスすることができます。

ハードリンクを削除したらどうなるの?

元のファイルやハードリンクを含め、全てのファイル名を削除することで、本体が削除されます。

シンボリックリンクを削除したらどうなるの?

ハードリンクの削除について確認しましたが、シンボリックリンクを削除すると
どのような影響があるのでしょうか。
当然ですが、シンボリックリンクはあくまで元のファイルを参照している立場なので、
シンボリックリンクを削除しても、元のファイルやハードリンクに影響はありません。

しかしながら、シンボリックリンクは元のファイルを参照することで、対象のiノードやファイルの中身に
アクセスできているので、
元のファイルを削除することで、ファイルの中身を参照することができなくなります。

実践:元のファイルの削除

以上の内容を踏まえ、先ほど作成したファイルを使って、元のファイルを削除した場合に
シンボリックリンクやハードリンクが、どうなるのかを、実践を踏まえて、確認していきましょう。

[user01@localhost ~]$ cat today.txt
2020年  2月 12日 水曜日 17:45:31 JST
[user01@localhost ~]$ cat hday.txt
2020年  2月 12日 水曜日 17:45:31 JST
[user01@localhost ~]$ cat sday.txt
2020年  2月 12日 水曜日 17:45:31 JST

実践:元のファイルの削除

[user01@localhost ~]$ rm today.txt
[user01@localhost ~]$ cat hday.txt
2020年  2月 12日 水曜日 17:45:31 JST
[user01@localhost ~]$ cat sday.txt
cat: sday.txt: そのようなファイルやディレクトリはありません

まとめ

パーティション

1つの物理的なハードディスクを論理的に複数分けた領域をパーティションといいます。仕切りのことです。
iノードはパーテイションごとに整理されているため、ハードリンクは異なるパーテイション間で作成することはできません。
パーティションが異なると、同じiノード番号であっても、ファイルの実体は別々なのです。

パーティションが異なるケース

パーティションが異なる場合で2つのリンクを確かめてみる

[user01@localhost ~]$ln -s today.txt  /tmp/Links2.txt
[user01@localhost ~]$ls -l /tmp/Links2.txt
lrwxrwxrwx 1 user01 user01 9  2月 12 15:08 /tmp/Links2.txt -> today.txt
[user01@localhost ~]$ln today.txt  /tmp/LinksC.txt
ln: failed to access `today.txt': そのようなファイルやディレクトリはありません

これで第4章ファイルとディレクトリは終わりました!


NEXT>> 練習問題