どーも!marusukeです!
リンクを作成するLinuxコマンド「ln」について説明します!
そもそもリンクとは?
Linux(Unix系も含む)におけるリンクとは、ファイルの実体に対して、ファイル名を紐づけることをリンクと呼びます
リンクには以下の2種類があります
- ハードリンク:ファイル実体を直接参照するリンク
- シンボリックリンク:リンク元のファイルを参照するリンク(Windowsでいうショートカットリンク、macOSでいうエイリアスのこと)
もう少しそれぞれのリンクの特徴を見ていきます
ハードリンクの特徴
ハードリンクの特徴は、3つの特徴があります
- ハードリンクはファイル実体を直接参照する(iノード番号がリンク元ファイルと同じになる)
- リンク元ファイルが存在するファイルシステムと別のファイルシステム上にハードリンクを作ることができない
- ディレクトリのハードリンクは作成できない(ファイルのハードリンクのみ作成可能)
特徴1「ハードリンクはファイル実体を直接参照する」の解説として、ハードリンクは、ファイル実体を上記の画像のように直接参照します。
iノード番号(一意な番号で1つのファイルシステム上でファイルを管理する仕組み)が同じであるため、リンク元ファイルと同じファイル実体を参照します。
特徴2「リンク元ファイルが存在するファイルシステムと別のファイルシステム上にハードリンクを作ることができない」の解説として、同じファイルシステム上ではiノード番号が一意に割り振られてファイルが管理されます
そのため、ハードリンクはiノード番号をたどってファイル実体を参照できますが、別のファイルシステムの場合は、iノード番号の管理が別になり、iノード番号が重複するなどの状況が生まれるため、このファイル実体を参照するハードリンクを作ることが出来ません
そのほかの特徴として、リンク元ファイルを削除しても、ハードリンクが残っている限り、ファイル実体は削除されず、このハードリンクからファイル実体を参照することが出来ます
また、リンク元ファイルとハードリンクが全て削除され、ファイル実体を参照するファイルがなくなると、ファイル実体もディスクから削除されます
シンボリックリンクの特徴
シンボリックリンクの特徴は2つあります
- リンク元ファイルが移動や削除されると、リンク元のファイル実体を参照できない
- 別のファイルシステム上のファイルやディレクトリに対して、リンクを作成できる
特徴1「リンク元ファイルが移動や削除されると、リンク元のファイル実体を参照できない」の解説として、シンボリックリンクはリンク元ファイルを経由してファイル実体を参照します(Windowsでいうショートカットです。macOSでいうエイリアスです)
したがって、リンク元ファイルが移動されたり削除されると、シンボリックリンクからリンク先ファイルを参照することが出来なくなり、ファイル実体を参照できなくなります
特徴2「別のファイルシステム上のファイルやディレクトリに対して、リンクを作成できる」の解説として、特徴1と同じ理由で、リンク元ファイルを参照するため、別のファイルシステム上のファイルやディレクトリにもシンボリックリンクを作成することが出来ます。
また、シンボリックリンクは、ファイルだけではなく、ディレクトリにも作成できます。
lnコマンドの使い方
ハードリンクの場合
ハードリンクの作成コマンドは、以下のようになります
ln リンク元ファイル名 ハードリンク名
実際にtouchコマンドで、test-hard-linkファイルを作成し、ハードリンクを作成すると、以下のようになります
このハードリンクをiノード番号をリンク元ファイル(test-hard-linkファイル)と比較すると、iノード番号は同じであることがわかります
「ls -i」コマンドで、iノード番号を表示させることが出来ます
シンボリックリンクの場合
シンボリックリンクの作成コマンドは、以下です
ln -s リンク元ファイル名またはディレクトリ名 シンボリックリンク名
実際にtouchコマンドでtest-sym-linkファイルを作成し、シンボリックリンクを作成すると、以下のようになります
iノード番号を確認すると、異なることがわかります。またシンボリックリンクファイルのアクセス権限は「lrwxrwxrwx」となりますが、実際のアクセス権限はリンク元ファイルと同じになります
lnコマンドのオプション
オプションは以下のようになります
- -s, –symbolic シンボリックリンクを作成(ハードリンクではなく)
- -b, –backup 既存のファイルを削除する前にバックアップを作成
- -d, –directory スーパーユーザがディレクトリをハードリンクしようとするのを許可
- -f, –force 既存の宛先ファイルを削除
- -i, –interactive 宛先の削除についてプロンプト表示
- -n, –no-dereference 宛先がディレクトリへのシンボリックリンクの場合、通常のファイルのように扱う
- -r, –relative 相対パスでシンボリックリンクを作成
- -t, –target-directory=DIRECTORY リンクを作成するディレクトリを指定
- -T, –no-target-directory 各 SOURCE 引数から末尾のスラッシュを削除
- -v, –verbose 各リンクされたファイルの名前を表示
- -S, –suffix=SUFFIX 通常のバックアップ接尾辞をオーバーライド
以上です!
ここまで読んでいただきありがとうございました!
コメント