Linuxのシンボリックリンクとは
Linuxのシンボリックリンクとは、Linuxが提供するファイルシステムの機能の1つを表します。Linuxの設定ファイルやコマンドでも数多く使用されています。ここでは、シンボリックリンクの概要を学び、使い方を順を追って解説していきます。
シンボリックリンクの概要
それぞれのOSには、ファイルシステムの機能としてディスクに格納するいくつかのファイルタイプが設定されています。一般的に用いられるファイルやディレクトリに加えて、実体のないシンボリックリンクというファイル形式がサポートされます。
このファイルタイプの場合は、参照するとソフトリンクされている別の実体のあるファイルを参照できます。
これによって、実体のあるファイルを別のファイル名でアクセスしたり、別のパスを割り当てたりすることが簡単にできます。シンボリックリンクはLinuxなどのUNIX系OSで広く利用されますが、Windowsでもシンボリックリンクを作成するコマンドが提供されています。
シンボリックリンクとハードリンクの違い
シンボリックリンクのようなソフトリンクは実体のないファイルですが、ハードリンクと呼ばれる実体のあるファイルをリンクし別名で登録することも可能です。
シンボリックリンクとハードリンクの違いは、シンボリックリンクはハード的な制限を受けにくく、ハードリンクはハード的な制限を受けやすい点に違いがあります。
シンボリックリンクは、実体がないファイルにポインター情報を格納します。ファイルがオープンされると、ポインター情報から元の実態のあるファイルが参照されます。
ポインター情報のみが格納されているので、別のパーティションやファイルシステムにシンボリックリンクを作成することもできます。シンボリックリンクは、元のファイルとは独立して作成・削除が可能です。
ハードリンクは、実体のあるファイルで用いる同一のiノードを指しており、リンクを作成するとリンクカウントを加算します。リンクを解除した場合は、リンクカウントを減算し、最後の1つになったらリンクを解除することで削除されます。
制限としては同一のiノードを指すため、別のパーティションへのリンク設定ができないことが挙げられます。
Linuxのシンボリックリンクの使い方
Linuxのシンボリックリンクの使い方は難しいわけではありません。操作の手順が分かればすぐに覚えることができます。ここでは、シンボリックリンクの基本構文を学び、作成から削除までの流れを順を追って解説していきます。
シンボリックリンクの基本構文
Linuxのシンボリックリンクは、lnコマンドを使用して作成します。lnコマンドはシンボリックリンクのほか、ハードリンクなども作成します。lnコマンドを用いてシンボリックリンクを作成する場合の基本構文は以下の通りです。
ln -s 「元のファイルあるいはディレクトリ」 「作成するリンクのターゲットパス」
ここで指定する、 ”-s” がシンボリックリンクの指定です。
lnコマンド自体には、多くのオプションが用意されていますが、シンボリックリンクに関しては ”-s” を指定します。 ”-s” ではなく、 ”--symbolic” とフルネームで指定することもできます。フルネームの場合は、行頭にハイフンを2つ記述します。
指定する引数は、「元のファイルあるいはディレクトリ」が実際のファイルあるいはディレクトリです。「作成するリンクのターゲットパス」は、シンボリックリンク名です。リンクのポインター情報の格納された特殊なファイルが作成されます。
シンボリックリンクに関するオプションについても、簡単に解説します。 “-f” を指定すると、すでにファイルがある場合に強制的にリンクを作成する場合に使用します。
”-n” オプションは、ディレクトリへのシンボリックリンクであるリンク先の場合、通常のファイルと同様に扱うために指定します。 ”-n” オプションは、 ”-f” とともに指定します。
シンボリックリンクの作成
シンボリックリンクの作成は、lnコマンドを使います。すでに基本構文を学びましたので、ここでは実際に使ってみます。例えば、/tmpディレクトリでlnコマンドを使い、/etc/hostsをメンテナンス用に「hosts.local」というシンボリックリンクファイルを作成する例を示します。
user@host:/tmp$ ls
user@host:/tmp$ ln -s /etc/hosts hosts.local
user@host:/tmp$ ls
hosts.local
user@host:/tmp$
ここでは、/tmpディレクトリで他のファイルがないことを確認し、lnコマンドを実行しました。その結果、「hosts.local」が作成されたことが確認できました。シンボリックリンクはファイルだけではなく、ディレクトリに対しても同じ要領で作成することができます。
シンボリックリンクの確認方法
シンボリックリンクの確認には、いくつかのコマンドが使用できます。まずは、fileコマンドやlsコマンドで確認すると良いでしょう。
fileコマンドはファイルのタイプを表示するコマンドです。使用するには、コマンドの引数に対象とするファイルを指定します。ファイル名はワイルドカードも使用できます。先ほど作成したシンボリックリンクファイルをワイルドカードを指定して実行すると次のように表示されます。
user@host:/tmp$ file *
hosts.local: symbolic link to /etc/hosts
user@host:/tmp$
コマンドの結果表示を見ると、このファイルがシンボリックリンクのファイルであり、参照する実体が/etc/hostsであることが分かります。
続いてlsコマンドでファイルタイプを表示する例を示します。
user@host:/tmp$ ls -l
total 0
lrwxrwxrwx 1 user user 10 Nov 12 15:15 hosts.local -> /etc/hosts
user@host:/tmp$
lsコマンドで ”-l” オプションを指定すると、表示の先頭にファイルタイプが表示されます。シンボリックリンクのファイルは ”l” から始まります。行末のファイル名には参照する実体のファイル名が表示されます。
lsコマンドの ”-l” オプションは、grepコマンドを使って ”^l” で検索するとシンボリックリンクのファイルのみを抽出することもできます。
findコマンドでも、 ”-type l” を指定するとシンボリックリンクのファイルのみを一覧で検索表示することができます。
シンボリックリンクの削除
シンボリックリンクの削除には、unlinkコマンドまたはrmコマンドを用います。
user@host:/tmp$ ls
hosts.local
user@host:/tmp$ unlink hosts.local または rm hosts.local
user@host:/tmp$ ls
user@host:/tmp$
unlinkコマンドとrmコマンドはファイル削除については大きな違いがありませんが、ディレクトリを参照するシンボリックリンクを削除する際には、違いがあります。
具体的には、rmコマンドは ”-f” で強制的に削除することが可能であり、さらに ”-r” でディレクトリを再帰的に削除することが可能です。このオプションを使う際には注意を要します。
気軽に ”rm -rf 元のディレクトリ” としたり、 ”rm -rf シンボリックリンク/*” などと指定したりしてしまうと、元の実態のディレクトリやその配下のファイルが削除されてしまいます。
rmコマンドを使用する場合は、無条件に ”-rf” をつけず、可能であれば “-i” で削除可否を逐次確認するなど慎重な操作がおすすめです。
シンボリックリンクの使用例
シンボリックリンクは、Linuxの実行ファイルや設定ファイルなどにも数多く使用されています。試しに、筆者の環境で/etcと/usr配下のシンボリックリンクのファイル数は4666と表示されました。
user@host:/tmp$ find /etc /usr -type l 2> /dev/null | wc -l
4666
user@host:/tmp$
このように、システムでも用いられるシンボリックリンクですが、アプリのバージョン管理などにも応用できます。
例えば、アプリのフォルダが/usr/local/appとし、その配下にバージョンごとにサブディレクトリとしてモジュールが格納されているとします。この場合、アプリの実行ファイルはversion1.0/bin/app、あるいはversion1.1/bin/appなどとなります。
この例ではappコマンドを実行するには、それぞれのバージョンを意識する必要があり不便です。このケースでは、 ”ln -s /usr/local/app/version1.0/bin/app /usr/local/bin/app” などのようにシンボリックリンクを設定すると、操作担当者は ”/usr/local/bin/app” だけ分かれば実行することができます。
そして、バージョンアップの際には、リンクファイルをunlinkコマンドやrmコマンドで削除し、 ”ln -s /usr/local/app/version1.1/bin/app /usr/local/bin/app” のようにシンボリックリンクを再設定するだけで、これまで同様に ”/usr/local/bin/app” を実行すればよく、何も変わらず最新版のコマンドを使用することが可能になります。
なお、このようなバージョンやパスの変更など参照するリンク元が変更された場合は、シンボリックリンクを再設定する際に冒頭紹介した ”-f” オプションを指定することで、リンクファイルがすでにある場合でも削除を必要とせずに強制的に上書きすることもできます。
また、/var配下の特定の領域などではOSが再起動すると、再設定されるディレクトリもあります。シンボリックリンクを作成する場合は、動作確認を再起動後にもう1度行うと良いでしょう。
Linuxのシンボリックリンクでファイルやディレクトリを効率的に管理できる
シンボリックリンクは、分散配置しているファイルやディレクトリであっても特定のディレクトリにリンクファイルを作成することで一元管理することができる特徴があります。システムも数多く使用していることから、アプリケーションのファイル管理も効率的に運用することができるでしょう。
その他の関連記事
その他に関連する内容は、下記の記事でもご紹介しています。ぜひ参考にご覧ください。
Linuxエンジニアとは?年収や必要なスキル、将来性を解説!
Linuxの初心者向け資格3選!勉強方法やキャリアパスも解説!
Linux初心者でも安心!ディレクトリ削除を安全に行う方法を解説
編集部オススメコンテンツ
アンドエンジニアへの取材依頼、情報提供などはこちらから