「Linuxコマンドまとめ」カテゴリでは、Linuxのコマンドについて、基本的な実行例とオプションを分かりやすくまとめます。
「ln」はLinuxにおいてファイルやディレクトリのリンクを作成するためのコマンドです。このコマンドを使用することで、複数のファイル名で同じファイルを参照できます。
Linuxシステムではファイル間のリンクがさまざまな形で用いられています。Linuxを使いこなす上で、lnコマンドの使い方とハードリンク・シンボリックリンクの理解は欠かすことができません。しっかりと身に着けておきましょう。
lnコマンドの基本的な使い方
lnコマンドの基本的な書式は次の通りです。
ln [オプション] ターゲット [リンク名]
ハードリンクの作成
ハードリンク(Hard Link)は、ファイルに対して名前(ファイル名)をつける仕組みです。通常、ファイルを作成する際に一つのファイル名、つまりハードリンクを作成しますが、別のファイル名を追加することもできます。ハードリンクを作成するには、以下のようにlnコマンドを使用します。
ln target.txt link.txt
このコマンドを実行すると、元々存在するtarget.txt名前のファイルに、新しいファイル名link.txtが追加されます。同じデータを参照しているので、一方の名前で開いて編集・保存した後、他方で開くと編集されたデータが読み込まれます。
なお、ディレクトリに対してはハードリンクを作成することはできません。また、同じファイルシステム上にあるファイルに対してのみ、ハードリンクを作成できます。上の例では同じディレクトリにハードリンクを作成しましたが、同じファイルシステム上なら別のディレクトリに作成することもできます。
ハードリンクは「通常のファイル名」を追加する仕組みのなので、「元のファイル名」と「後で追加したファイル名」に優劣はありません。なので、上記のコマンドを実行した後、target.txtを削除しても、link.txtを削除しない限りファイルは削除されません。すべてのハードリンクが削除されるまで、ファイルデータは削除されないからです。
ハードリンクの詳細・活用例については後述します。
シンボリックリンクの作成
シンボリックリンク(Symbolic Link)を作成するには、以下のように「-s」オプションを使用します。
ln -s target.txt link.txt
このコマンドを実行すると、target.txtへのシンボリックリンクファイルとしてlink.txtが作成されます。シンボリックリンクはハードリンクと異なり、特殊なファイルとして作成され、リンク先の絶対パスもしくは相対パスをデータとして保持します。上記の例では、「同じディレクトリにあるtarget.txtという名前のファイル」をリンク先として保持することになります。アプリでlink.txtを開くと、target.txtを開いた時と同じように読み書きできます。以下のように、ls -lコマンドでシンボリックリンクの存在とリンク先を確認できます。
$ ls -l
合計 4
lrwxrwxrwx 1 lintaro lintaro 10 6月 25 04:22 link.txt -> target.txt
-rw-rw-r-- 1 lintaro lintaro 2102 6月 25 04:22 target.txt
シンボリックリンクはリンク先のパスを保持する仕組みなので、元のファイルが移動・削除されると利用できなくなります。しかし、ハードリンクと異なり、シンボリックリンクはディレクトリに対しても作成できるというメリットがあります。また、システム上からアクセス可能なら、同じファイルシステムでなくてもリンクを張ることができます。
シンボリックリンクの詳細・活用例については後述します。
lnコマンドの主なオプション
- -s
- シンボリックリンクを作成します。
- -v
- リンク作成時に、作成したリンクと、そのリンク先を出力します。
- -f
- 既存のリンクを無条件に上書きします。
ハードリンクについての追加知識
前述の通り、Linuxにおけるハードリンクは、ファイルシステム内の同じファイルに対してファイル名をリンクさせる仕組みです。複数のハードリンクを作成すると、別のファイル名が同じデータブロックを共有します。
以下に、Linuxのハードリンクに関するいくつかの重要なポイントを説明します。
- ファイルシステム内の同じiノードを共有: ハードリンクを追加すると、複数のファイル名がファイルシステム上の同じiノード(ファイルのメタデータを含むデータ構造)を共有します。したがって、ハードリンクを作成すると、元のファイル名と追加したファイル名でディスク上のデータブロックが共有されます。同じファイルに3つ以上のハードリンクを作成することもできます。
- ハードリンクの削除: ファイルを削除する場合、そのファイルに対するハードリンクの数が1つずつ減少します。あるファイル名を指定して一つのハードリンクを削除しても、他のハードリンクが残っている場合、ファイルのデータはまだディスク上に存在し続けます。したがって、他のハードリンクからアクセスできますし、ストレージの消費容量も減少しません。
- ファイル名の変更: 複数のハードリンクを持つファイルの場合、それらのうち1つのファイル名を変更しても、別のファイル名からは変わらずファイルにアクセスできます。
- ハードリンクとシンボリックリンクの違い: ハードリンクは同じファイルシステム上でのみ機能し、ファイルそのものを参照します。一方、シンボリックリンクはファイルへのパスを保持し、異なるファイルシステムやデバイスをまたいでリンクを作成することができます。
シンボリックリンクに比べ、ユーザー自身がlnコマンドでハードリンクを作成するケースは多くありません。しかし、一般的なLinuxシステムをインストールすると、複数のハードリンクを持つファイルがシステム上に作られます。なので、ハードリンクという機能を理解しておくことは、Linuxの運用・トラブルシューティングを行う上で重要です。
たとえばUbuntuでは、/usr/bin/bzip2・/usr/bin/bzcat・/usr/bin/bunzip2はすべて同じファイルのハードリンクとなっています。以下の通り、「ls -il」コマンドで確認することができます。
$ ls -li /usr/bin/bzip2 /usr/bin/bzcat /usr/bin/bunzip2
2889772 -rwxr-xr-x 3 root root 39296 3月 23 2022 /usr/bin/bunzip2
2889772 -rwxr-xr-x 3 root root 39296 3月 23 2022 /usr/bin/bzcat
2889772 -rwxr-xr-x 3 root root 39296 3月 23 2022 /usr/bin/bzip2
1つ目のフィールド「2889772」はiノード番号です。数値はシステムにより異なります。すべて同じなので、この3つのファイル名は同じファイルを指していることがわかります。そして、3つ目のフィールド「3」はハードリンク数です。3つのファイル名と紐づいている、というわけです。
以下のようにstatコマンドでも、3つのファイル名がすべて同じファイルを指していることが分かります。
$ stat /usr/bin/bzip2 /usr/bin/bzcat /usr/bin/bunzip2
File: /usr/bin/bzip2
Size: 39296 Blocks: 80 IO Block: 4096 通常ファイル
Device: 802h/2050d Inode: 2889772 Links: 3
Access: (0755/-rwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2023-01-13 06:33:07.762695363 +0900
Modify: 2022-03-23 18:45:10.000000000 +0900
Change: 2022-05-16 13:25:34.644647872 +0900
Birth: 2022-05-16 13:25:34.640648593 +0900
File: /usr/bin/bzcat
Size: 39296 Blocks: 80 IO Block: 4096 通常ファイル
Device: 802h/2050d Inode: 2889772 Links: 3
Access: (0755/-rwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2023-01-13 06:33:07.762695363 +0900
Modify: 2022-03-23 18:45:10.000000000 +0900
Change: 2022-05-16 13:25:34.644647872 +0900
Birth: 2022-05-16 13:25:34.640648593 +0900
File: /usr/bin/bunzip2
Size: 39296 Blocks: 80 IO Block: 4096 通常ファイル
Device: 802h/2050d Inode: 2889772 Links: 3
Access: (0755/-rwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2023-01-13 06:33:07.762695363 +0900
Modify: 2022-03-23 18:45:10.000000000 +0900
Change: 2022-05-16 13:25:34.644647872 +0900
Birth: 2022-05-16 13:25:34.640648593 +0900
Bzip2はデータ圧縮・展開を行うプログラムですが、一つの実行バイナリが、bzip2で実行された時はデフォルトで圧縮を、bunzip2で実行された時は展開を、bzcatで実行された時は標準出力に展開を行うように作られているため、このように1つのファイルが複数のハードリンクを持つよう配置されているわけです。
シンボリックリンクについての追加知識
シンボリックリンクは、Linuxシステムにおいてファイルやディレクトリへの参照を作成するための特殊なファイルです。シンボリックリンクは、実際のファイルやディレクトリに対する参照であり、別のディレクトリや名前でファイルにアクセスすることを可能にします。
以下に、シンボリックリンクファイルに関するいくつかの重要なポイントを説明します。
- ファイルシステムをまたいだリンク: シンボリックリンクは、異なるファイルシステムやデバイスをまたいでリンクを作成することができます。これは、ハードリンクとは異なる点です。
- リンク先の変更: シンボリックリンクは、リンク先のファイルやディレクトリが存在しない場合でも有効なままであり、リンク先が移動しても自動的には変更されません。そのため、リンク先のファイルやディレクトリが移動あるいは削除されてしまうと、シンボリックリンクは「リンク切れ」となり、アクセスできなくなります。
- シンボリックリンクの利用例: シンボリックリンクは、以下のようなさまざまな用途で活用されます。
- ファイルやディレクトリのエイリアスを作成する場合、略名でアクセスするための便利な手段として使用されます。
- インストールされたプログラムやライブラリへのパスを設定する場合、シンボリックリンクを使用してシンボリックな参照を作成することがあります。
- ネットワーク上のファイルシステムにアクセスする場合、シンボリックリンクを使用してローカルのファイルパスをネットワークパスに関連付けることができます。
このように、シンボリックリンクは、柔軟なリンク作成の手段として広く使用されており、ファイルやディレクトリの操作やシステムの設定において重要な役割を果たしています。
多くのLinuxディストリビューションでは、システムの各所にシンボリックリンクファイルを見つけることができます。たとえば、libfoo.so.1.0というバージョン1.0のライブラリが存在する場合、libfoo.soというシンボリックリンクが作成され、libfoo.so.1.0を指すといった配置が行われています。これにより、プログラムはlibfoo.soを通じてシステム上にインストールされたバージョンのライブラリにアクセスできます。
また、/etc/alternativesには多くのシンボリックリンクが張られており、システムにインストールされているコマンドなどにリンクされています。このリンクは、update-alternativesコマンドでカスタマイズ可能です。これにより、たとえば「vi」コマンドを実行したときに、実行するviエディタのフレーバーを好みのものに切り替える、といった機能が実現されています。
lnのヘルプ
Usage: ln [OPTION]... [-T] TARGET LINK_NAME or: ln [OPTION]... TARGET or: ln [OPTION]... TARGET... DIRECTORY or: ln [OPTION]... -t DIRECTORY TARGET... In the 1st form, create a link to TARGET with the name LINK_NAME. In the 2nd form, create a link to TARGET in the current directory. In the 3rd and 4th forms, create links to each TARGET in DIRECTORY. Create hard links by default, symbolic links with --symbolic. By default, each destination (name of new link) should not already exist. When creating hard links, each TARGET must exist. Symbolic links can hold arbitrary text; if later resolved, a relative link is interpreted in relation to its parent directory. Mandatory arguments to long options are mandatory for short options too. --backup[=CONTROL] 対象ファイルが存在する時にバックアップを作成する -b --backup と同様だが引数を取らない -d, -F, --directory スーパーユーザがディレクトリに対するハードリンク を作成することを許可する。(備考: スーパーユーザ であってもシステムの制限で失敗することがある) -f, --force 対象ファイルが存在する時に削除する -i, --interactive prompt whether to remove destinations -L, --logical dereference TARGETs that are symbolic links -n, --no-dereference treat LINK_NAME as a normal file if it is a symbolic link to a directory -P, --physical make hard links directly to symbolic links -r, --relative create symbolic links relative to link location -s, --symbolic make symbolic links instead of hard links -S, --suffix=SUFFIX override the usual backup suffix -t, --target-directory=DIRECTORY specify the DIRECTORY in which to create the links -T, --no-target-directory treat LINK_NAME as a normal file always -v, --verbose print name of each linked file --help この使い方を表示して終了する --version バージョン情報を表示して終了する The backup suffix is '~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX. The version control method may be selected via the --backup option or through the VERSION_CONTROL environment variable. Here are the values: none, off バックアップを作成しない (--backup を付けた時でも) numbered, t 番号付きバックアップを作成する existing, nil 番号付きバックアップがあれば番号付き、 そうでなければ、simple で作成する simple, never 常に簡易バックアップを作成 Using -s ignores -L and -P. Otherwise, the last option specified controls behavior when a TARGET is a symbolic link, defaulting to -P. GNU coreutils online help: <https://www.gnu.org/software/coreutils/> Report any translation bugs to <https://translationproject.org/team/> Full documentation <https://www.gnu.org/software/coreutils/ln> or available locally via: info '(coreutils) ln invocation'
lnのマニュアル
LN(1) ユーザーコマンド LN(1) 名前 ln - ファイル間のリンクを作成する 書式 ln [OPTION]... [-T] TARGET LINK_NAME (1番目の形式) ln [OPTION]... TARGET (2番目の形式) ln [OPTION]... TARGET... DIRECTORY (3番目の形式) ln [OPTION]... -t DIRECTORY TARGET... (4番目の形式) 説明 1 番目の書式では TARGET に対する LINK_NAME という名前のリンクを作成しま す。 2 番目の書式では TARGET に対するリンクを現在のディレクトリに作成し ます。 3 番目と 4 番目の書式では、各 TARGET に対するリンクを DIRECTORY に作成します。 デフォルトではハードリンクが作成されます。 --symbolic を 使用すると、シンボリックリンクが作成されます。 デフォルトでは、作成先 (新しいリンクの名前) がすでに存在していてはいけません。 ハードリンクを 作成する場合は TARGET が存在しなければいけません。 シンボリックリンクは 任意のテキストを保持することができます。 後でシンボリックリンクを辿る際 には、相対的なリンクは親ディレクトリに対する ものとして解釈されます。 長いオプションで必須となっている引数は短いオプションでも必須です。 --backup[=CONTROL] 対象ファイルが存在する時にバックアップを作成する -b --backup と同様だが引数を取らない -d, -F, --directory スーパーユーザがディレクトリに対するハードリンク を作成すること を許可する。(備考: スーパーユーザ であってもシステムの制限で失敗 することがある) -f, --force 対象ファイルが存在する時に削除する -i, --interactive 対象を削除するかどうか確認メッセージを表示する -L, --logical TARGET がシンボリックリンクの場合リンクを辿る -n, --no-dereference 対象がディレクトリに対するシンボリックリンクの場合 通常ファイル に対するリンクとして扱う -P, --physical シンボリックリンク自体へのハードリンクを作成する -r, --relative リンクの場所からの相対パスのシンボリックリンクを作成する -s, --symbolic ハードリンクではなくシンボリックリンクを作成する -S, --suffix=SUFFIX バックアップ接尾辞を SUFFIX にする -t, --target-directory=DIRECTORY リンクを作成する DIRECTORY を指定する -T, --no-target-directory 常に LINK_NAME を通常ファイルとして扱う -v, --verbose リンクを作成した時にファイル名を表示する --help この使い方を表示して終了する --version バージョン情報を表示して終了する --suffix も環境変数 SIMPLE_BACKUP_SUFFIX も設定されていない場合、 バッ クアップ接尾辞は '~' になります。 バージョン管理方法は --backup オプ ションや VERSION_CONTROL 環境変数で 選択できます。以下の値を指定できま す: none, off バックアップを作成しない (--backup を付けた時でも) numbered, t 番号付きバックアップを作成する existing, nil 番号付きバックアップがあれば番号付き、 そうでなければ、simple で作成する simple, never 常に簡易バックアップを作成 -s を使用した時は -L および -P は無視されます。それ以外の場合、TAREGT が シンボリックリンクの場合は最後に指定したオプションが効果を持ちます。 デフォルトは -P です。 GNU coreutils のオンラインヘルプ: <http://www.gnu.org/software/coreutils/> ln の翻訳に関するバグは <http://translationproject.org/team/ja.html> に連絡してください。 完全 な文書は <http://www.gnu.org/software/coreutils/ln> にあります。 ローカ ルでは info '(coreutils) ln invocation' で参照できます。 作者 作者 Mike Parker および David MacKenzie。 著作権 Copyright © 2016 Free Software Foundation, Inc. ライセンス GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. 関連項目 link(2), symlink(2) ln の完全なマニュアルは Texinfo マニュアルとして整備されている。もし、 info および ln のプログラムが正しくインストールされているならば、コマン ド info ln を使用すると完全なマニュアルを読むことができるはずだ。 GNU coreutils 2016年2月 LN(1)
コメント