iimon TECH BLOG

iimonエンジニアが得られた経験や知識を共有して世の中をイイモンにしていくためのブログです

ハードリンクとシンボリックリンクについて

はじめに

iimonのフロントエンジニアをしてます齋藤です。

業務でシンボリックリンクを使うことがあり、今までできるだけlinuxの操作を避けてきたため、ほぼ?の状態で使用しました。

これからlinuxの操作に慣れていくため、まずはつまづいたリンクについて勉強しました。

リンク

linuxファイルシステムではファイルに別名をつけることができます。

この機能をリンクと呼び、別名をつけることをリンクを貼ると表現します。

リンクにはハードリンクシンボリックリンクの2種類が存在します。

リンクを使うと下記のようなことができます。

  • 深い階層にあるファイルへのパス名を短くすることができます。
  • 特定の場所にリンクを設置することで、あたかも実態がそこにあるかのように振る舞うことが出来ます。

例:Webページを表示させるときに公開範囲にあるディレクトリに公開範囲外の階層のディレクトリのシンボリックリンク(後ほど説明)を貼ることで、URLでのアクセスを可能にすることができたりします。

  • 複数バージョンのプログラムを共存させることができます。

$ ls -l                
-rwxr-xr-x  2 user  staff  64  3 16 17:07 v1.0
-rw-r--r--@ 1 user  staff   0  3 17 15:51 v1.1
lrwxr-xr-x  1 user  staff  11  1  1  1970 normally -> v1.1

この例ではnormallyというシンボリックリンクがv1.1に向いています。普段はnormallyというパスでプログラムを利用していて、v1.1に問題があるときはリンク先をv1.0にすればすぐにバージョンを変更することができます。

inode

ハードリンクとシンボリックリンクについて、説明する前にinodeというものを把握しましょう。inodeとは、ファイルの管理情報が格納されている部分を指します。

inodeにはファイルの「各属性情報」が収納されており、具体的には、ファイル種別、ファイルサイズ、アクセス権、所有者情報、リンク、ブロック番号などが納められている

inodeには番号が振られ区別が行われており、これをinode番号と呼びます。

inode番号は-iオプションを使用することでiノード番号の表示を行えます。

ファイルの情報について

ファイルに関する各詳細情報が何を表しているかをまとめてみます

$ls -li

結果
①39062034  ②-rw-r--r--  ③1 ④user ⑤staff  ⑥0  ⑦3 15 23:02 ⑧linux_study

①inode番号

②-rw-r--r--

→最初の一文字がファイルタイプ

- →通常ファイル、dディレクトリ、lシンボリックリンク

rw-r--r--あとの9文字がファイルモード

3文字ずつ「所有者のパーミッション」「グループのパーミッション」「その他のユーザーのパーミッション」を表します。

そして各文字がパーミッションの種類を表しています。

r →読み込み可、w →書き込み可、x→実行可

- になっていれば不可という意味です。

この例で見るならばそれぞれのパーミッションは以下になります。

所有者のパーミッションrw- 読み込み可・書き込み可・実行不可

グループのパーミッションr--  読み込み可・書き込み不可・実行不可

その他のユーザーのパーミッションr-- 読み込み可・書き込み不可・実行不可

ここで言う実行不可はディレクトリにcdで移動することができないことを指します。

③リンク数

これはハードリンクの数です。

ちなみにディレクトリを作成すると、ハードリンクの数が増えます。 a というディレクトリを作成します

$mkdir a
$ls -li

39568414 drwxr-xr-x  2 user  staff  64  3 15 00:22 a
39062034 -rw-r--r--  1 user  staff   0  3 12 23:02 linux_study

そうすると作成されたa というディレクトリにすでに2 というハードリンク数が設定されています。

ここでaディレクトリに移動してls -al すると、、

drwxr-xr-x  2 user  staff   64  3 15 00:22 .
drwxr-xr-x  4 user  staff  128  3 15 00:22 ..

. (カレントディレクトリ)

.. (カレントディレクトリの一つ上のディレクトリ)

が作成されていることがわかります。この2つのファイルがハードリンクです。

ハードリンクはディレクトリには設定できないはずだが、linuxではハードリンクができてしまうようです、、

④所有者、⑤所有グループ、⑥サイズ、⑦タイムスタンプ、⑧ファイル名もしくはディレクトリ名

ハードリンク

 ハードリンクとは、実際に存在するファイルを参照するリンクのことをいいます。 ハードリンクが作成されたファイルは、通常のファイル名とは別の名前にしたとしても、参照先のファイルが同じであるため、オリジナルのファイルと全く同じようにアクセスすることができます。

ハードリンクのイメージ

ハードリンクの特徴

  • ファイルの内容が変更されると、ハードリンク先の内容も同じになります。
  • 同じファイルシステム内でのみ作成可能です。
  • オリジナルのファイルとハードリンクはデータを共有しています。
  • リンク元のファイルが移動、削除されても、ファイルの実体にはアクセスできます。

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

linux_study.hard というハードリンクを作成する

ln linux_study linux_study.hard

$ ls
a       linux_study

$ ln linux_study linux_study.hard

$ ls
a           linux_study     linux_study.hard

inodeを確認すると、元のlinux_study と同じnode番号をもっていることを確認できます。

$ ls -li

39756766 drwxr-xr-x  2 user  staff  64  3 16 17:07 a
39062034 -rw-r--r--@ 2 user  staff   0  3 12 23:02 linux_study
39062034 -rw-r--r--@ 2 user  staff   0  3 12 23:02 linux_study.hard

ハードリンクの削除について

rmコマンドでハードリンクを作成したファイルを削除すると、指定したファイル名だけが取り除かれてファイルの実体は残ったままとなります。

$ rm linux_study

$ ls
a           linux_study.hard

$ cat linux_study.hard
linux_studyの内容が表示される

ハードリンクを持つファイルの実体はすべてのハードリンクがなくなったときに削除されます。

シンボリックリンク

シンボリックリンクとは、特定のファイルやディレクトリを指し示す別のファイルを作成し、それを通じて本体を参照できるようにする仕組みです。別名を設定したファイルを、「シンボリックリンクファイル」と言います。

元なるファイルとシンボリックリンクファイルは、別物なのでシンボリックリンクファイルを削除しても元のファイルに影響はありません。

シンボリックリンクのイメージ図

シンボリックリンクの特徴

シンボリックリンクを作成する(ln-sコマンド)

linux_study.synbolicというシンボリックリンクを作成する

ln -s linux_study linux_study.synbolic

 $ls
 a          linux_study     
 
 $ln -s linux_study linux_study.synbolic
 
 $ ls 
 a          linux_study     linux_study.synbolic

inodeを確認すると、元のlinux_study と異なるnode番号をもっていることを確認できます。

リンク先はどのファイルを指しているか矢印で表示されます。

$ ls -li                
39756766 drwxr-xr-x  2 user  staff  64  3 16 17:07 a
39907734 -rw-r--r--@ 1 user  staff   0  3 17 15:51 linux_study
39907841 lrwxr-xr-x  1 user  staff  11  1  1  1970 linux_study.synbolic -> linux_study

シンボリックリンクを削除してもリンク先のファイルに影響はありません

シンボリックリンクを残したまま、リンク先の実体ファイルを削除するとリンクが壊れた状態になります。

$ rm linux_study

$ ls
a           linux_study.synbolic

$ cat linux_study.synbolic
cat: linux_study.synbolic: No such file or directory

どちらをつかう??

基本的には、ハードリンクではなくシンボリックリンクをつかうことが多いみたいです。

ハードリンクは削除されると元のファイルが削除される恐れがあったり、デバイスをまたいでリンクを貼ることができないため、使い勝手がよくないようです。

↓使い分けなど違いがよくわかるサイトになります。

https://q.hatena.ne.jp/1265361495

最後に

リンクを使う時は適切な用途でハードリンクとシンボリックリンクを使い分けていけたらいいなと思います。linuxの操作もこれを機にもっと勉強していきたいです。

また、弊社ではエンジニアを募集しております。

ぜひカジュアル面談でお話ししましょう!

ご興味ありましたら、ご応募ください!

Wantedly / Green