ハードリンクとシンボリックリンク

f:id:monozukuri-bu:20190816184235j:plain

shadowです。
今回はWindouwsを使っている人ならお馴染みのショートカットについて、
Linuxにはそのショートカットが2種類あるので、詳しく説明したいと思います。

ハードリンクとシンボリックリンクの違い

Linuxにはショートカットの種類として、ハードリンクとシンボリックリンクが存在します。
この2つのリンクの違いについて説明する前にまずは、ファイルのinode番号について書いていきます。

inode番号

Linuxでファイルを作成するとinode番号という一意の番号が割り当てられます。
また、inodeにはファイルの属性情報が格納されています。
・ファイル種別
・ファイルサイズ
・アクセス権
・所有者情報
・リンク
・ブロック番号

$ ls -li sample.txt
7454 -rw-r--r--    1 user     user             0 Aug  9  2019 sample.txt

一番左の7454がinode番号です。

ハードリンク

ハードリンクはファイルに別名をつけるようなものです。

ファイル名A -> ファイルの実体 <- ファイル名B

このようにファイル名は違えど同じファイルの実体(inode)を指しています。
また、ファイルのinodeにアクセスしているため、ファイルが移動しても問題ありません。
そして、異なるファイルシステム上や、ディレクトリにはリンクを作成することが出来ません。

シンボリックリンク

シンボリックリンクWindowsのショートカットに近い概念です。
シンボリックリンクはハードリンクと違い、ファイルの実体ではなくファイルパスを指します。

シンボリックリンクファイル -> ファイル名 -> ファイルの実体

シンボリックリンクはinodeに依存せず、パスで参照しているので、
ハードリンクと違い、異なるファイルシステム上のファイルや、ディレクトリに対してもリンクを作成することができます。
ただし、パスでアクセスしているため、ファイルが移動するとアクセス不能なデットリンクになってしまいます。

lnコマンド

リンクを作成するにはlnコマンドを使います。
オプションを指定せずにlnコマンドを実行した場合、ハードリンクが作成されます。
-sオプションをつけることで、シンボリックリンクが作成されます。

動かしてみる

ハードリンク

実際に動かしてみます。

$ mkdir -p testdir/sampledir

$ touch testdir/sampledir/file.txt

$ echo Test > testdir/sampledir/file.txt

$ cd sampledir

$ ln sampledir/file.txt ./sample_hard

$ cat sample_hard
Test

sample_hardの中を見てみるとfile.txtと同じ内容になっています。

次はinode番号をチェックしてみます。

$ ls -li sample_hard sampledir/file.txt                               
   7461 -rw-r--r--    1 root     root             5 Aug  9  2019 sample_hard    
   7461 -rw-r--r--    1 user     user             5 Aug  9  2019 sampledir/file.
txt

どちらも同じになっています。
ファイルの移動もしてみたいと思います。

$ mv sampledir/file.txt .

$ cat sample_hard
Test

移動しても同じ内容を表示しました。

シンボリックリンク

$ mkdir sampledir2

$ touch sampledir2/file2.txt

$ echo Test2 > sampledir2/file2.txt

$ cat sampledir2/file2.txt                            
Test2

$ ln -s sampledir2/file2.txt ./sample_symbolic

$ cat sample_symbolic
Test2

シンボリックリンクの中身も同じでした。
こちらもファイルの移動をします。

$ mv sampledir2/file2.txt .

$ cat sample_symbolic
cat: sample_symbolic: そのようなファイルやディレクトリはありません

こちらはファイルが移動すると参照出来ませんでした。

まとめ

最後にハードリンクとシンボリックリンクの特徴を、ざっくりまとめると以下のようになります。

特徴 ハードリンク シンボリックリンク
参照 inode パス
異なるファイルシステム できない できる
元ファイルの移動 移動しても消えない 移動すると参照できない
元ファイルの削除 削除しても消えない 削除すると消える

以上です。お疲れ様でした。