はじめに
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の操作もこれを機にもっと勉強していきたいです。
また、弊社ではエンジニアを募集しております。
ぜひカジュアル面談でお話ししましょう!
ご興味ありましたら、ご応募ください!