Linux の 101 試験対策: ハード・リンクとシンボリック・リンクの作成および変更

同じファイルに複数の名前を使用する

Linux システム上でファイルのハード・リンクとシンボリック・リンクを作成し、管理する方法を学んでください。このチュートリアルの内容は、Linux のシステム管理者として認定するための LPI 101 試験に備えて勉強するために利用することも、ハード・リンクとソフト・リンク (別名、シンボリック・リンク) の違いを探り、ファイルをコピーする代わりに、ファイルへのリンクを張る最善の方法を調べるためだけに利用することもできます。

Ian Shields, Linux Author, Freelance

Ian ShieldsIan Shields は、Linux のフリー・ライターです。ノースカロライナ州 Research Triangle Park にある IBM を退職した彼が、オーストラリアのキャンベラにある IBM にシステム・エンジニアとして入社したのが 1973年であり、それ以降、カナダのモントリオールやノースカロナイナ州 Research Triangle Park でシステム・エンジニアリングとソフトウェア開発の両方に携わってきました。1990年代後半からは、Linux を使用して Linux 上で開発を行うとともに、Linux に関する執筆も行ってきました。彼は、オーストラリア国立大学で純粋数学および哲学の学士号を取得し、ノースカロライナ州立大学でコンピューター・サイエンスの修士号と博士号を取得しています。普段はオリエンテーリングを楽しんでおり、旅行に行くのも好きです。



2016年 4月 21日 (初版 2010年 6月 01日)

概要

より詳しく学び、さらなる開発を行い、より多くの人とつながる

新たに登場した developerWorks Premium メンバーシップ・プログラムでは、メンバーになると、強力な開発ツールのほか、Safari Books Online を通じて提供される最もホットな 500 タイトルの技術書 (Java 開発者向けのものが大量にあります) を含む各種のリソースをすべて自由に利用できるようになります。さらに、主要な開発者向けイベントの登録料の大幅な割引や、最新の O'Reilly カンファレンスの全容を閲覧できる再生動画など、その他にもさまざまな特典が提供されます。今すぐサインアップしてください。

このチュートリアルでは、ハード・リンクとシンボリック・リンクを作成し、管理する方法について学びます。このチュートリアルで説明する内容は以下のとおりです。

  • ハード・リンクまたはソフト・リンクを作成する方法
  • リンクを識別し、リンクのタイプを把握する方法
  • ファイルをコピーする場合と、ファイルへのリンクを張る場合の違い
  • リンクを使用してシステム管理タスクを行う方法

このチュートリアルは、LPIC-1: Linux Server Professional Certification 101 試験における主題 104 の項目 104.6 に備える上で役に立ちます。この項目は、重要度が 2 とされています。


リンクの概要

ストレージ・デバイスでは、ファイルまたはディレクトリーはブロックの集合の中に含まれ、ファイルに関する情報は「i ノード」に格納されます。i ノードには、ファイルの所有者、ファイルの最終アクセス時刻、ファイルのサイズ、ファイルがディレクトリーであるかどうか、ファイルの読み取りまたは書き込みが許可されているユーザーなどの情報が記録されます。i ノード番号は「ファイル・シリアル番号」としても知られており、個々のファイルシステム内で一意に決まる番号です。各「ディレクトリー・エントリー」には、ファイルまたはディレクトリーの名前と、そのファイルまたはディレクトリーに関する情報が格納されている i ノードへのポインターが組み込まれます。

この連載について

この連載は Linux システム管理タスクの学習に役立つだけでなく、Linux Professional Institute の LPIC-1: Linux Server Professional Certification 試験に備えるための教材にもなります。

連載の各チュートリアルに関する説明とリンクについては、developerWorks の「Linux の 101 試験対策: LPIC-1 のロードマップ」を参照してください。現在進行中のこのロードマップは、2015年 4月 15日に更新された LPIC-1 試験の項目のバージョン 4.0 を反映しています。完成したチュートリアルは、その都度ロードマップに追加されていきます。

「リンク」は、同じ 1 つのファイルまたはディレクトリーに複数の名前を使えるようにするために追加するディレクトリー・エントリーに過ぎません。

前提条件

この連載のチュートリアルを最大限に活用するには、Linux の基礎知識と、チュートリアルに記載されたコマンドを演習できる実際の Linux システムが必要です。特に記載のない場合、このチュートリアルの例で使用しているのは、CentOS 6 (カーネル 2.6.32-504) です。

プログラムのバージョンによって出力のフォーマットに違いが出てくる場合もあるため、コマンドの実行結果は必ずしもここに記載するリストや図とまったく同じであるとは限りません。特に、記載する出力のほとんどは、お使いのシステムにインストールされているパッケージによって大きく左右されます。出力がかなり違っているとしても、重要な共通点は認識できるはずです。


リンクを作成する

「ハード・リンク」とは、i ノードを指すディレクトリー・エントリーのことです。一方、「ソフト・リンク」(または「シンボリック・リンク」) とは、別のディレクトリー・エントリーの名前を指定する i ノードを指すディレクトリー・エントリーです。この別の名前を保存するための厳密なメカニズムは、ファイルシステムと名前の長さの両方によって左右されます。シンボリック・リンクは、「symlink」とも呼ばれます。

ハード・リンクを作成できるのはファイルに対してのみであり、ディレクトリーに対してハード・リンクを作成することはできません。ただし例外があり、サブディレクトリーの数を保持するためのハード・リンク「.」および「..」(ディレクトリー自体およびその親ディレクトリー) に対応する特殊なディレクトリー・エントリーをディレクトリー内に作成することはできます。ハード・リンクが指すのは i ノードであり、i ノードがその一意性を持つのは特定のファイルシステム内に限られるため、複数のファイルシステムにまたがってハード・リンクを作成することはできません。複数のハード・リンクがあるファイルの場合、そのファイルの i ノードを指す最後のリンクが削除されて、リンク・カウントが 0 になるまで、そのファイルは削除されません。

ソフト・リンク (または symlink) は、別のファイルまたはディレクトリーを指しますが、その際 i ノードを使わずに名前で指定します。そのため、ソフト・リンクはファイルシステムの境界をまたぐことができます。ソフト・リンクを削除しても、ターゲットのファイルまたはディレクトリーは削除されません。また、ターゲット・ファイルまたはディレクトリーを削除しても、ソフト・リンクが自動的に削除されることはありません。

まずは、ハード・リンクおよびソフト・リンクを作成する方法から説明します。そして、ここで作成したリンクを例に、リンクを識別する方法、リンクを使用する方法を解説します。

ハード・リンク

既存のファイルへのハード・リンクを作成して追加するには、ln コマンドを使用します (ただし、システムが「.」および「..」をハード・リンクとして設定しているとしても、ディレクトリーへのハード・リンクを作成することはできません)。

リスト 1 に、2 つのファイルと 1 つのサブディレクトリーが含まれるディレクトリーを作成し、file1 へのハード・リンクを同じディレクトリー内に 1 つ、サブディレクトリー内に 1 つ設定する方法を示します。file1 と file3 にはそれぞれ異なる単語を追加し、サブディレクトリー内のリンクの内容を表示して、確かに同じデータを指していることを証明しています。

リスト 1. ハード・リンクを作成する
[ian@atticf22 ~]$ mkdir -p lpi104-6/subdir
[ian@atticf22 ~]$ touch lpi104-6/file1
[ian@atticf22 ~]$ touch lpi104-6/file2
[ian@atticf22 ~]$ ln lpi104-6/file1 lpi104-6/file3
[ian@atticf22 ~]$ ln lpi104-6/file1 lpi104-6/subdir/file3sub
[ian@atticf22 ~]$ echo "something" > lpi104-6/file1
[ian@atticf22 ~]$ echo "else" >> lpi104-6/file3
[ian@atticf22 ~]$ cat lpi104-6/subdir/file3sub
something
else

別のファイルシステムにまたがるハード・リンクや、ディレクトリーのハード・リンクを作成しようとすると、エラーになります。リスト 2 に示すように、home ディレクトリーと research ディレクトリーは別々のファイルシステム上にあるため、これらのディレクトリーをまたがるハード・リンクを作成しようすると失敗に終わります。同様に lpi104-6 ディレクトリーへのハード・リンクを作成しようすると失敗に終わります。

リスト 2. ハード・リンクの作成の失敗
[ian@atticf22 ~]$ df . research
Filesystem     1K-blocks     Used Available Use% Mounted on
/dev/sda5       71168700 31642752  35887712  47% /
/dev/sdb3       60326992 30677592  26578276  54% /home/ian/research
[ian@atticf22 ~]$ mkdir -p research/lpi104-6/
[ian@atticf22 ~]$ ln lpi104-6/file1 research/lpi104-6/file3
ln: failed to create hard link ‘research/lpi104-6/file3’ => ‘lpi104-6/file1’: Invalid cross-device link
[ian@atticf22 ~]$ ln lpi104-6 lpidir104-6
ln: ‘lpi104-6’: hard link not allowed for directory

ソフト・リンク

ソフト・リンクを作成するには、ln コマンドに -s オプションを指定します。ソフト・リンクはファイル名またはディレクトリー名を使用しますが、これは相対名であっても、絶対名であっても構いません。通常、相対名を使用するのは、リンクを作成しているディレクトリーをカレント作業ディレクトリーにする場合です。そうでない場合、作成するリンクはファイルシステム内の別のポイントを基準にすることになります。

リスト 3 に、先ほど作成した file1 へのソフト・リンクを作成する 2 つの方法に加え、リスト 2 で失敗した 2 つのハード・リンクに代わるソフト・リンクを作成する方法を示します。

リスト 3. ソフト・リンクを作成する
[ian@atticf22 ~]$ # Create symlink using absolute paths
[ian@atticf22 ~]$ ln -s ~/lpi104-6/file1 ~/lpi104-6/file4
[ian@atticf22 ~]$ # Create symlink using relative paths
[ian@atticf22 ~]$ cd lpi104-6/
[ian@atticf22 lpi104-6]$ ln -s file1 file5
[ian@atticf22 lpi104-6]$ cd ..
[ian@atticf22 ~]$ # Create symlink across file systems
[ian@atticf22 ~]$ mkdir -p ~ian/research/lpi104-6
[ian@atticf22 ~]$ ln -s ~/lpi104-6/file1 ~ian/research/lpi104-6/file4
[ian@atticf22 ~]$ # Create symlink for directory
[ian@atticf22 ~]$ ln -s lpi104-6 lpidir104-6

前と同じく、リンクのどれを使っても、あるいはターゲット・ファイル名を使っても、ファイルまたはディレクトリーを参照することができます。リスト 4 にいくつかの例を記載します。

リスト 4. ソフト・リンクを使用する
[ian@atticf22 ~]$ echo "another line" >> ~ian/research/lpi104-6/file
[ian@atticf22 ~]$ # cat a symlink
[ian@atticf22 ~]$ cat lpi104-6/file5
something
else
[ian@atticf22 ~]$ # cat a hard link
[ian@atticf22 ~]$ cat lpi104-6/file1
something
else
[ian@atticf22 ~]$ # display directory contents using symlink
[ian@atticf22 ~]$ ls lpidir104-6
file1  file2  file3  file4  file5  subdir

さまざまなリンクを作成する一環として、リンクを作成したいディレクトリーがカレント作業ディレクトリーではないときに、相対パスを使用したリンクを作成してみます。このリンクの内容については、次のセクションで説明します。

リスト 5. 無効なソフト・リンクを作成する
[ian@atticf22 ~]$ ln -s lpi104-6/file1 lpi104-6/file6

リンクを識別する

前のセクションではリンクを作成する方法を説明しましたが、作成したリンクを見分ける方法については説明していません。これから、その方法を説明します。

情報を見つけ出す

多くのシステムでは、ls コマンドに ls --color=auto というエイリアスが設定されており、ファイルシステムのさまざまなオブジェクトがタイプによって色分けして出力されます。このオプションを使用すると、例えば symlink はシアンのテキストで表示されます (図 1 を参照)。

図 1. ls の --colors オプションを使用してリンクを識別する
ls の --colors オプションを使用することでリンクが識別された画面のスクリーンショット

古い構成では、例えばハード・リンクはダーク・ブルーの背景色で表示されます。これらの色は、dircolors プログラムを使用して構成することができます。ターミナル・ソフトにおける表示をカスタマイズする場合、やりたいことはおそらく ls の実行出力の一部の色を変えるといったことでしょう。リスト 6 に、Fedora 22 システム上でハード・リンクの背景色を青に設定する 1 つの方法を記載し、その結果を図 2 に示します。この例の詳細を理解するには、man ページを参照してください。

リスト 6. dircolors を使用して、ハード・リンクの背景色を青に設定する
[ian@atticf22 ~]$ # Save a copy of dircolors defaults
[ian@atticf22 ~]$ dircolors -p > dircolors-defaults
[ian@atticf22 ~]$ grep MULTI dircolors-defaults 
MULTIHARDLINK 00 # regular file with more than one link
[ian@atticf22 ~]$ # Change MULTIHARDLINK to blue background
[ian@atticf22 ~]$ sed -e'/MULTI/s/00/00;44/' dircolors-defaults > dircolors-new
[ian@atticf22 ~]$ grep MULTI dircolors-new 
MULTIHARDLINK 00;44 # regular file with more than one link
[ian@atticf22 ~]$ # Set the new colors for the current terminal session
[ian@atticf22 ~]$ eval $(dircolors dircolors-new )
図 2. 青の背景色でハード・リンクを識別する
ls の --colors オプションを使用してリンクを識別する

このような色分けは、色を見分けることが可能な、目が見える人々にとっては便利かもしれませんが、そうでなければ役に立ちません。もちろん、シェル・スクリプトやプログラムには無意味です。色を使わないとしたら、例えば ls –l によって長々としたリストで提供される情報などのように、より多くの情報が必要になります。リスト 7 では、最初の例での色付き出力を明示的に無効にしていますが、他の 2 つの例で行ったように /bin/ls コマンドを明示的に呼び出すという方法も使えます。

リスト 7. リンクを識別する
[ian@atticf22 ~]$ ls --color=none -lR lpi104-6
lpi104-6:
total 12
-rw-rw-r--. 3 ian ian   15 Aug  9 14:19 file1
-rw-rw-r--. 1 ian ian    0 Aug  9 14:19 file2
-rw-rw-r--. 3 ian ian   15 Aug  9 14:19 file3
lrwxrwxrwx. 1 ian ian   24 Aug  9 14:26 file4 -> /home/ian/lpi104-6/file1
lrwxrwxrwx. 1 ian ian    5 Aug  9 14:26 file5 -> file1
lrwxrwxrwx. 1 ian ian   14 Aug  9 14:34 file6 -> lpi104-6/file1
drwxrwxr-x. 2 ian ian 4096 Aug  9 14:19 subdir

lpi104-6/subdir:
total 4
-rw-rw-r--. 3 ian ian 15 Aug  9 14:19 file3sub
[ian@atticf22 ~]$ /bin/ls -l ~ian/research/lpi104-6/file4
lrwxrwxrwx. 1 ian ian 24 Aug  9 14:27 /home/ian/research/lpi104-6/file4 -> /home/ian/lpi104-6/file1
[ian@atticf22 ~]$ /bin/ls -l lpidir104-6
lrwxrwxrwx. 1 ian ian 8 Aug  9 14:27 lpidir104-6 -> lpi104-6

上記の出力で 2 列目に表示されているのは、このファイルへのハード・リンクの数を示すリンク・カウントであるため、file1、file3、file3sub にはいずれも、それぞれが表すオブジェクトを指すハード・リンクが複数あることがわかります。しかしこれだけの情報では、そのすべてが同じオブジェクトを表しているかどうかはわかりません。リンク・カウントが 1 よりも大きいファイルを削除すると、i ノードに格納されたリンク・カウントは 1 つ減ります。けれどもそのファイルは、カウントが 0 にならない限り削除されません。そのため、このファイルに対して張られたその他すべてのハード・リンクは、1 つ数が減ったリンク・カウントを示すことになります。

出力行の最初の列を見ると、先頭文字はシンボリック・リンクを表す「l」(小文字の L) になっていることがわかります。また、ソフト・リンクのターゲットは、「file4 -> /home/ian/lpi104-6/file1」というように、-> 文字の後に表示されることも示されています。リンクを識別するもう 1 つの手掛かりとなるのは、サイズが、リンクのターゲットの名前に含まれる文字数を表しているという点です。ディレクトリー・リストのリンク・カウントは、シンボリック・リンクの場合には更新されないことに注意してください。シンボリック・リンクを削除してもターゲット・ファイルには影響しないため、symlink によってファイルを削除できないということはありませんが、ターゲット・ファイルが移動または削除されると symlink が壊れます。そのため、多くのシステムではディレクトリー・リストで色を使用して、大抵は正常なリンクを薄い青、壊れたリンクを赤で示します。

ファイルおよびディレクトリー・エントリーの i ノード番号を表示するには、ls コマンドで -i オプションを使用します。リスト 8 に、このコマンドを lpi104-6 ディレクトリーを対象に実行した場合の出力を、要約バージョンと詳細バージョンの両方で示します。

リスト 8. i ノード情報を表示する
[ian@atticf22 ~]$ ls -i lpi104-6
1988884 file1  1988884 file3  1988892 file5  1988605 subdir
1988886 file2  1988885 file4  1988891 file6
[ian@atticf22 ~]$ ls -il lpi104-6
total 12
1988884 -rw-rw-r--. 3 ian ian   15 Aug  9 14:19 file1
1988886 -rw-rw-r--. 1 ian ian    0 Aug  9 14:19 file2
1988884 -rw-rw-r--. 3 ian ian   15 Aug  9 14:19 file3
1988885 lrwxrwxrwx. 1 ian ian   24 Aug  9 14:26 file4 -> /home/ian/lpi104-6/file1
1988892 lrwxrwxrwx. 1 ian ian    5 Aug  9 14:26 file5 -> file1
1988891 lrwxrwxrwx. 1 ian ian   14 Aug  9 14:34 file6 -> lpi104-6/file1
1988605 drwxrwxr-x. 2 ian ian 4096 Aug  9 14:19 subdir

find コマンドを使ってシンボリック・リンクを検索することもできます。それには、リスト 9 のように -type l 検索式を使用します。

リスト 9. find を使用して symlink を見つける
[ian@atticf22 ~]$ find lpi104-6 research/lpi104-6 -type l
lpi104-6/file4
lpi104-6/file6
lpi104-6/file5
research/lpi104-6/file4

リンク切れの symlink

リスト 5 では無効なソフト・リンクを作成しましたが、これはリンク切れ symlink の一例です。ハード・リンクは常にファイルを表す i ノードを指すことから、常に有効なリンクとなりますが、symlink は以下に挙げるようなさまざまな理由から壊れることがあります。

  • 元のファイルまたはリンクのターゲットのいずれかが、リンクの作成時に存在していなかった場合 (これに該当するのが、リスト 5 です)
  • リンクのターゲットが削除されたか、名前変更された場合
  • ターゲットのパスに含まれる要素が削除されたか、要素の名前が変更された場合

いずれの場合もエラーは発生しないため、symlink を作成するときには、symlink に発生する可能性のある事態を十分慎重に考える必要があります。特に、絶対パスと相対パスのどちらを選択するかは、リンクの存続期間中にリンク先のオブジェクトに起こると想定される事態の影響を受ける可能性が高くなります。

出力を色分けしている場合には、リンクの切れた symlink は、図 1 の file6 のように、背景色が黒の赤いテキストで示されます。出力が色分けされないとしたら、ls コマンドで -H オプションまたは -L オプションのいずれかを使用してリンクを逆参照し、ターゲットに関する情報を入手する必要があります。-H オプションはコマンドラインのリンクを逆参照し、-L オプションはコマンドラインのリンクと、表示に含まれるリンクの両方を逆参照します。リスト 10 に、この 2 つのオプションのそれぞれを使用した場合の出力を比較します。

リスト 10. ls -H および ls -L でリンクを逆参照する
[ian@atticf22 ~]$ /bin/ls -lH lpidir104-6
total 12
-rw-rw-r--. 3 ian ian   15 Aug  9 14:19 file1
-rw-rw-r--. 1 ian ian    0 Aug  9 14:19 file2
-rw-rw-r--. 3 ian ian   15 Aug  9 14:19 file3
lrwxrwxrwx. 1 ian ian   24 Aug  9 14:26 file4 -> /home/ian/lpi104-6/file1
lrwxrwxrwx. 1 ian ian    5 Aug  9 14:26 file5 -> file1
lrwxrwxrwx. 1 ian ian   14 Aug  9 14:34 file6 -> lpi104-6/file1
drwxrwxr-x. 2 ian ian 4096 Aug  9 14:19 subdir
[ian@atticf22 ~]$ /bin/ls -lL lpidir104-6
/bin/ls: cannot access lpidir104-6/file6: No such file or directory
total 20
-rw-rw-r--. 3 ian ian   15 Aug  9 14:19 file1
-rw-rw-r--. 1 ian ian    0 Aug  9 14:19 file2
-rw-rw-r--. 3 ian ian   15 Aug  9 14:19 file3
-rw-rw-r--. 3 ian ian   15 Aug  9 14:19 file4
-rw-rw-r--. 3 ian ian   15 Aug  9 14:19 file5
l?????????? ? ?   ?      ?            ? file6
drwxrwxr-x. 2 ian ian 4096 Aug  9 14:19 subdir

エラー・メッセージによって、file6 が存在しないことを通知しているのと同時に、このファイルに対応する出力もすべて「?」文字になって、ファイルが見つからないことを示している点に注意してください。

このリンク切れのシンボリック・リンクに関する最後の注意点として、ファイルを読み取ろうとすると、ファイルが存在しないことから読み取り操作は失敗しますが、適切なアクセス権を持っている場合には、ターゲット・ファイルへの書き込み操作は成功するはずです (リスト 11 を参照)。ただし、ファイルへの書き込みを可能にするには、その前に lpi104-6/lpi104-6 を作成しなければなりません。

リスト 11. リンク切れ symlink に対して読み取りおよび書き込み操作を実行する
[ian@atticf22 ~]$ cat lpi104-6/file6
cat: lpi104-6/file6: No such file or directory
[ian@atticf22 ~]$ echo "Testing file6" > lpi104-6/file6
bash: lpi104-6/file6: No such file or directory
[ian@atticf22 ~]$ mkdir lpi104-6/lpi104-6
[ian@atticf22 ~]$ cat lpi104-6/file6
cat: lpi104-6/file6: No such file or directory
[ian@atticf22 ~]$ echo "Testing file6" > lpi104-6/file6
[ian@atticf22 ~]$ cat lpi104-6/file6
Testing file6
[ian@atticf22 ~]$ ls lpi104-6/lpi104-6
file1
[ian@atticf22 ~]$ ls -l lpi104-6/file6
lrwxrwxrwx. 1 ian ian 14 Aug  9 14:34 lpi104-6/file6 -> lpi104-6/file1

誰が自分にリンクしているのか

特定の i ノードに対してどのファイルからハード・リンクが張られているかを調べるには、find コマンドと、ファイル名を指定した -samefile オプションまたは i ノード番号を指定した -inum オプションを使用することができます (リスト 12 を参照)。

リスト 12. 同じファイルに張られたハード・リンクを検索する
[ian@atticf22 ~]$ find lpi104-6 -samefile lpi104-6/file1
lpi104-6/file1
lpi104-6/file3
lpi104-6/subdir/file3sub
[ian@atticf22 ~]$ ls -i lpi104-6/file1
1988884 lpi104-6/file1
[ian@atticf22 ~]$ find lpi104-6 -inum 1988884
lpi104-6/file1
lpi104-6/file3
lpi104-6/subdir/file3sub

特定のファイルに対してどのファイルからシンボリック・リンクが張られているかを調べるには、find コマンドと、ファイル名を指定した -lname オプションを使用します (リスト 13 を参照)。リンクには相対パスと絶対パスのいずれかを使用できるので、名前の先頭にアスタリスクを付けて、そのファイル名が含まれるすべての一致結果を検索しなければならない場合も考えられます。

リスト 13. ファイルまたはディレクトリーへのシンボリック・リンクを検索する
[ian@atticf22 ~]$ find lpi104-6 research/lpi104-6 -lname "*file1"
lpi104-6/file4
lpi104-6/file6
lpi104-6/file5
research/lpi104-6/file4

コピーする場合とリンクを張る場合の違い

何を目的にしているかによって、リンクを使用する場合もあれば、ファイルのコピーを作成したほうが有効な場合もあります。その主な違いは、リンクでは 1 つのファイルに対して複数の名前を指定する一方、コピーではまったく同じデータの 2 つのセットをそれぞれに異なる名前で作成するという点です。バックアップや、実際に運用しているデータをリスクにさらすことなく新しいプログラムをテストすることが目的であれば、もちろんファイルをコピーすることになります。その一方、例えば使いやすい簡潔なパスを提供するために、ファイル (またはディレクトリー) のエイリアスが必要であるという場合にはリンクを使います。これ以外のリンクの使い道については、次のセクションで説明します。

前述したとおり、ファイルを更新すると、そのファイルへのすべてのリンクが更新されますが、ファイルをコピーする場合には、その限りではありません。また、シンボリック・リンクは壊れることがあっても、壊れた後の書き込み操作で新しいファイルが作成される可能性もあると説明しました。つまり、リンクは慎重に使用しなければならないということです。


リンクとシステム管理

Linux システム管理では、シンボリック・リンクを筆頭に、リンクが頻繁に使用されます。コマンドには大抵、ユーザーが現行のコマンドのバージョン番号を知らなくても済むようにエイリアスが設定されていますが、必要に応じて、それよりも長いコマンド名を使って他のバージョンにアクセスすることも可能です。リスト 14 に示す python コマンドは python2 への symlink であり、python2 それ自体も、バージョン 2.7 である python2.7 への symlink になっています。

リスト 14. コマンドに特定のバージョンに応じたエイリアスを設定する
[ian@atticf22 ~]$ which python
/usr/bin/python
[ian@atticf22 ~]$ ls -l /usr/bin/python
lrwxrwxrwx. 1 root root 7 May 27 14:12 /usr/bin/python -> python2
[ian@atticf22 ~]$ ls -l /usr/bin/python2
lrwxrwxrwx. 1 root root 9 May 27 14:12 /usr/bin/python2 -> python2.7
[ian@atticf22 ~]$ ls -l /usr/bin/python2.7
-rwxr-xr-x. 1 root root 7120 May 27 14:12 /usr/bin/python2.7

リンクの他の使い方は、複数のコマンド名で同一のコード (例えば、システムの停止や再起動に使用する各種のコマンドなど) を使用している場合に関係します。場合によっては、新しいコマンド名 (例えば、genisoimage) を古いコマンド名の代わりとする一方、古い名前 (mkisofs) をその新しいコマンドへのリンクとして残しておくことがあります。そして、代替機能では広範にリンクを使用するので、複数の代替機能のなかから、例えば java などのコマンドに対してどれを使うかを選択することができます。リスト 15 にいくつかの例を記載します。

リスト 15. コマンド・エイリアスの例
[ian@atticf22 ~]$ which halt
/usr/sbin/halt
[ian@atticf22 ~]$ ls -l /usr/sbin/halt
lrwxrwxrwx. 1 root root 16 Jun  9 09:16 /usr/sbin/halt -> ../bin/systemctl
[ian@atticf22 ~]$ find /usr/sbin /usr/bin -lname "*/systemctl"
/usr/sbin/halt
/usr/sbin/telinit
/usr/sbin/shutdown
/usr/sbin/runlevel
/usr/sbin/poweroff
/usr/sbin/reboot
[ian@atticf22 ~]$ which mkisofs
/usr/bin/mkisofs
[ian@atticf22 ~]$ ls -l /usr/bin/mkisofs
lrwxrwxrwx. 1 root root 25 Jun 15 08:02 /usr/bin/mkisofs -> /etc/alternatives/mkisofs
[ian@atticf22 ~]$ alternatives --display mkisofs
mkisofs - status is auto.
 link currently points to /usr/bin/genisoimage
/usr/bin/genisoimage - priority 50
 slave mkisofs-mkhybrid: /usr/bin/genisoimage
 slave mkisofs-mkhybridman: /usr/share/man/man1/genisoimage.1.gz
 slave mkisofs-mkisofsman: /usr/share/man/man1/genisoimage.1.gz
Current `best' version is /usr/bin/genisoimage.

ライブラリー名の管理にも、同じく symlink が多用されます。その目的は、プログラムが汎用名にリンクしながらも、現行バージョンを取得できるようにすること、あるいはシステム (32 ビットのプログラムを実行可能な 64 ビットのシステムなど) を管理することです。リスト 16 にライブラリーのリンクの例を記載します。リンクによって、絶対パスを使用しているもの、相対パスを使用しているものがあることに注目してください。

リスト 16. ライブラリーのリンク
[ian@atticf22 ~]$ ls -l /usr/lib*/libm.so*
lrwxrwxrwx. 1 root root 21 Feb 23 10:31 /usr/lib64/libm.so -> ../../lib64/libm.so.6
lrwxrwxrwx. 1 root root 12 Feb 23 10:33 /usr/lib64/libm.so.6 -> libm-2.21.so
lrwxrwxrwx. 1 root root 12 Feb 23 10:35 /usr/lib/libm.so.6 -> libm-2.21.so
[ian@atticf22 ~]$ find  /usr/lib/ /usr/lib64/ -lname "*libstdc++*"
/usr/lib/gcc/x86_64-redhat-linux/5.1.1/libstdc++.so
/usr/lib/gcc/x86_64-redhat-linux/5.1.1/32/libstdc++.so
/usr/lib/gcc/x86_64-redhat-linux/5.1.1/32/libstdc++.a
/usr/lib64/libstdc++.so.6
[ian@atticf22 ~]$ ls -l /usr/lib64/libstdc++.so.6
lrwxrwxrwx. 1 root root 19 Jun 18 06:52 /usr/lib64/libstdc++.so.6 -> libstdc++.so.6.0.21
[ian@atticf22 ~]$ ls -l /usr/lib64/libwbclient*
lrwxrwxrwx. 1 root root 19 Jul  1 10:37 /usr/lib64/libwbclient.so.0 -> libwbclient.so.0.12
lrwxrwxrwx. 1 root root 40 Jul  1 10:37 /usr/lib64/libwbclient.so.0.12 -> 
/etc/alternatives/libwbclient.so.0.12-64

リンクについての詳細は、ln コマンドをはじめ、チュートリアルに記載したその他のコマンドの man ページを参照してください。

参考文献

学ぶために

議論するために

  • developerWorks コミュニティーに参加してください。ここでは他の developerWorks ユーザーとのつながりを持てる他、開発者が主導するブログ、フォーラム、グループ、Wiki を調べることができます。

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Linux
ArticleID=1030091
ArticleTitle=Linux の 101 試験対策: ハード・リンクとシンボリック・リンクの作成および変更
publish-date=04212016