今回はLinuxにあるlnコマンド及びリンクの考え方について説明しようと思います。
lnコマンドというのはファイルのハードリンクやシンボリックリンクを作成するために使用されるコマンドです。
ハードリンク及びシンボリックリンクの説明を下記に示します。
◎ハードリンク
→基本的にファイルに対してのみ作成可能。(ただしスーパーユーザーのみディレクトリのハードリンクを作成することはできる)
ストレージ上にあるファイルデータ本体を参照するためのリンクを複製するイメージ。
iノード番号はリンク元ファイルとリンク先ファイルで同じ番号になっている。
例えばAというファイルとAから作成したBというハードリンクが有った場合、Aだけを削除してもハードリンクのBからファイルデータへアクセスすることができるため、ファイルデータ本体は削除されない。
しかし、AとB両方を削除した場合はファイルデータへアクセスするためのリンクがすべて削除されたため、ファイルデータ自体も削除されることになる。
なお、ファイルシステムが異なるストレージへハードリンクは作成できない。
◎シンボリックリンク
→ファイル及びディレクトリ両方作成可能
iノード番号はリンク元ファイルとリンク先ファイルで別の番号になっている。
シンボリックリンクの内容はリンク元ファイルへのリンク情報のみとなっている。
リンク元ファイルを削除すればストレージ上のファイルデータは削除されるが、シンボリックリンクを削除してもファイルデータ削除されない。
ハードリンクはストレージ上にあるデータ本体のリンク、シンボリックリンクはWindowsでいう「ショートカットファイル」みたいなイメージです。
それではハードリンクとコピーはどのように異なっているのかについてですが、下記にイメージ画像を示します。
上記画像のようにハードリンクと元ファイルは同じデータ「A」を参照するのですが、コピーファイルはデータ内容が同じだとしても別のデータ「A’」を参照しているという形になります。
大きな違いとしてはハードリンクを作成してもストレージの空き容量は減りませんが、コピーを作成するとストレージの空き容量が減ります。
以上がハードリンク及びシンボリックリンクについての説明です。
次にlnコマンドの書式及びオプションを下記に示します。(「-s」オプションをつけない場合はハードリンクを作成します)
ln [オプション] リンク元ファイル名 リンク先ファイル名
オプション一覧
-s・・・シンボリックリンク作成
-d・・・ディレクトリに対してハードリンクを作成する(スーパーユーザーのみ)
-f・・・対象ファイルが存在する時に削除する
-v・・・リンク作成時にファイル名を表示する
-P・・・シンボリックリンク先のディレクトリを表示する
元ファイル名は「test-original」として、下記画像のコマンドを入力し、各ファイルを作成します。
そして、「ls -li」コマンドにて各ファイルの詳細情報を表示します。(-iオプションでiノード番号を表示)
上記画像を見ると、元ファイルとハードリンクは同じiノード番号になっていますが、コピーファイルは別のiノード番号になっています。
そして、「test-symlink」ファイルは左から2番目にあるパーミッション情報の先頭が「l」になっていて、シンボリックリンクであることが分かります。
また、どこがリンク元なのかも表示されています。