UNIX系OSには、「ファイル名は異なるが中身は同じ」というファイルが存在する。代表的なのは、「ハードリンク」のファイルと「シンボリックリンク」のファイルだ。管理者やユーザーが自発的にこれらのファイルを作ることはあまりないが、そうしたファイルの存在と、今回説明するくらいの概要は押さえておいていただきたい。

「実態は1つ」のハードリンク

ファイルシステムに依存する話なので説明がややこしいのだが、「中身は同じで名前だけが異なるもの」がハードリンクと呼ばれる方法で作成されたファイルだと考えてほしい。lsコマンドで、/bin/の中身をご覧いただきたい。CentOS 7ならば、次の4つのコマンドの実行ファイルはハードリンクで作成されたものだ。

ハードリンクで作成されたファイル

上記の画面のように、lsコマンドに-iオプションを指定すると、「iノード番号」と呼ばれる情報が表示される(オプション「-l」は詳細情報を表示するために付加している)。上記の画面で言うと、行の一番最初に表示されている数字(33804968)だ。このiノード番号が実態(バイナリファイル)を示している。ファイルシステムの中身を説明せずにこの部分の概念を説明するのはちょっと無理があるので、ともかくこのiノード番号が同じであれば、実態は同じだと考えてほしい。

通常ならば、「nmtui」、「nmtui-connect」、「nmtui-edit」、「nmtui-hostname」という4つのコマンドに対し、バイナリファイルが4つ存在するはずだ。しかし、ハードリンクで作成されているので、ご覧のとおりiノード番号はすべて同じ、つまりバイナリファイルは1つしかない。

だとすると、例えば「nmtui」を削除したら、実態は1つなのだから「nmtui-connect」も削除されそうな気がするが、そうはならない。ハードリンクで作成されたファイルは、ハードリンクの数が0になるまでそこにあり続ける。4つ首の竜の姿をイメージしてもらうといいだろう。首が1つでも残っていれば、竜は死なない。最後の首を削除すると実態も消える。そういう仕組みだ。

「複製したように見せかける」シンボリックリンク

ハードリンクとよく似たものとして、シンボリックリンクがある。これはアクセスすると同じ中身を指すのだが、ハードリンクのように同じ実態を共有しているわけではない。ファイルを複製したように見せかける仕組みなので、指し示している、という表現がより適切だ。ファイルに対するシンボリックリンクは、「ls -l」で確認できる。

ファイルに対するシンボリックリンク

「redhat-release -> centos-release」というのが、シンボリックリンクを示している。「redhat-release」というファイルにアクセスすると、「centos-release」というファイルにアクセスするという意味だ。

ファイルの中身をcatコマンドで確認したり、ハッシュ値を生成して違いを調べようとしたりしても、シンボリックリンクで作成されたファイルは、指し示している先のファイルとまったく同じ結果を返す。しかし、先ほどのハードリンクのときのように「ls -il」を実行してiノード番号を表示させてみると、番号が異なっており、違うファイルであることを確認できる。

中身は同じだが、iノード番号は異なっている

シンボリックリンクでは、「指されているファイル」と「指しているファイル」は実態が別なので、ハードリンクと違って個別に削除できる。「指しているファイル」を削除しても、「指されているファイル」には何の影響もない。逆に、「指されているファイル」を削除した場合、見た目に問題はないが「指しているファイル」の中身を見ようとするとエラーが出る。

もう1つ、ハードリンクとシンボリックリンクの最大の違いは、その見せかけの複製機構をディレクトリに対して適用できるかどうかというところにある。シンボリックリンクでは、ディレクトリに対してリンクを張ることができる。この機能は、別名のパスで特定のパスを指定したい場合などに使われることが多い。

ディレクトリに対するシンボリックリンク

ただし、OSやそのバージョンによっては、ハードリンクをディレクトリに対して指定できるものもあるそうだ。しかし、それを許可するにはいろいろとループにならないように処理を制御する必要があるなど、手間に対して得られるメリットが少ないため、一般的には禁止しているOSのほうが多い。また、シンボリックリンク以外の方法で似たような機能を提供しているファイルシステムもある。

いったい何のために……?

ハードリンクやシンボリックリンクが導入されたのには理由があるし、現在でもこれらの機能には意味がある。ハードリンクやシンボリックリンクを使っていない状態で出荷されるディストリビューションはほとんど存在していないように思う。

ユーザーや管理者が自分で作成することはあまりないものの、バックアップ時やファイルのアーカイブを作成しようとしたときには問題が起きやすい。

ファイルのコピーやバックアップを実施する場合、「対象のファイルやディレクトリにシンボリックリンクが含まれている場合、コマンドやアプリケーションのオプションをよく調べること」を念頭に置いておいてほしい。ここで見落としがあると、取っていたと思っていたバックアップの中身が空だったとか、不要なデータまでバックアップしてディスクが満タンになってしまったといったことになりかねないからだ。

今回のおさらい

今回のおさらいは、次のとおりだ。

  • 実態は1つしかないが、ファイル名を複数持たせられるハードリンクという仕組みがある
  • ハードリンクと似ているが、iノード番号が異なるシンボリックリンクという仕組みがある
  • iノード番号は、「ls -i」で表示できる
  • シンボリックリンクは、ディレクトリに対しても適用できる
  • ハードリンクでは、同じ実態を持つすべてのファイルを削除するまで実態は消えない
  • シンボリックリンクでは、指される側と指す側を個別に削除できる
  • バックアップやコピーの対象にシンボリックリンクやハードリンクが含まれている場合、マニュアルをよく読み、処理結果のデータを確認して必要な処理が行われているかどうかをきちんとチェックする

シンボリックリンクは「ls -l」の出力で一番最初の文字列が「l」になるし、「ls -l」の出力で「→」のような記号が表示され、しかも色も変わるのでわかりやすい。一方、ハードリンクはわかりにくいことが多いので注意が必要だ。

シンボリックリンクとハードリンクは普段作業する際は特に気にすることはないが、コピーやバックアップといった操作をするときには、くれぐれもよく確認するようにしてほしい。