Infra Engineer

シンボリックリンク
2022.08.31
Lv1

シンボリックリンク

 

この記事を読んでほしいひと

LPIC level1習得を目ざす、初学者のかたへ。
コマンドの基本的な使い方について、解説をします。


今回の内容

今回は、シンボリックリンクについて解説します。
シンボリックリンクとハードリンクはお互い関連する内容なのであわせて読んでみてください。またリンクについて不安な方はこちらの記事をお読みください。

・シンボリックリンクとは
・シンボリックリンクの作成
・まとめ
・確認問題

シンボリックリンクとは

シンボリックリンクとは、リンク先のパスを保持しているファイルです。ハードリンクは実際のデータとファイル名の結びつきを表していましたが、異なるファイルシステムからリンクの作成が行えませんでした。一方シンボリックリンクの場合、異なるファイルシステム上へもリンクの作成を行うことができます。また、ディレクトリに対してもリンクを作成することができます。なので一般的に、シンボリックリンクの方がよく使われています。
下記の図では、ファイルの実体に対してsak1.txtというファイル名が結び付けられていますが(ハードリンク)、そのsak1.txtに対してsak2というシンボリックリンクが作成されています。

シンボリックリンクの書式
ls  -s  <リンク元ファイル名>  <シンボリックリンク名>

シンボリックリンクの作成

それではシンボリックリンクを作成してみましょう。まずsak1.txtをDocumentsディレクトリ下に作成して、hogeとテキストを入力しておきます。そしてsak2というシンボリックリンクを作成してみます。

[root@localhost Documents]# touch sak1.txt  #sak1.txtをDocumentsディレクトリ下に作成する
[root@localhost Documents]# vi sak1.txt  #viコマンドによりsak1.txtにhogeを入力を行う
[root@localhost Documents]# cat sak1.txt #catコマンドによりsak1.txtの内容を確認する
hoge
[root@localhost Documents]# ln -s sak1.txt sak2 #lnコマンドによりsak2というシンボリックリンクを作成する
[root@localhost Documents]# ls #Documentsディレクトリ下にはsak1.txtとsak2というシンボリックリンクが存在する
sak1.txt sak2
[root@localhost Documents]# cat sak2 #sak2というシンボリックリンクを参照する
hoge
[root@localhost Documents]# ls -l #lsコマンドで-lオプションを指定してリンク先を確認する
-rw-r--r--. 1 root root 5 Aug 31 00:00 file1
lrwxrwxrwx. 1 root root 5 Aug 31 00:00 file2 -> file1

これでシンボリックリンクの作成はできました。シンボリックリンクのリンク先を確認するには、lsコマンドで-lオプションを指定すると、「file2 -> file1」のようにシンボリックリンクが表示されます。

それではリンク元のファイルを削除したらどうなるでしょうか。sak1.txtを削除してsak2が参照できるか確認してみましょう。

[root@localhost Documents]# rm sak1.txt  #sak1.txtを削除する
[root@localhost Documents]# cat sak2 #sak2を参照する
cat: sake2: No such file or directory

シンボリックリンクではリンク元のファイルを削除した場合、シンボリックリンクを参照してもデータにアクセスすることはできなくなります。ファイルの実体に結びつけられているsak1.txtというハードリンクが削除されすべてのハードリンクが削除された場合、ファイルの実体が削除されることになります。またsak2が保持しているパス情報も参照できないことから、エラーが表示されるのです。

(……ここまで読まれた方お疲れさまです。次に話す内容は少し発展的な内容を含むことになります。今までの内容ちょっと難しいなぁ…と感じられた方は確認問題に挑戦してみてください。そして次読むときにぜひ読んでみてください。もちろん初めて読む方でも分かりやすいように書いてあります。では続きをはじめましょう!)

Linuxのファイルシステムで用いられいているext3やext4では、すべてのファイルの実体にiノード番号と呼ばれるものが割りふられています。ここで新たにsak3というファイルとsak4というシンボリックリンクを作成して、iノード番号を確認してみましょう。

[root@localhost Documents]# ls #Documentsディレクトリ下にはsak3とsak4というシンボリックリンクが存在する
sak3 sak4
[root@localhost Documents]# ls -il #lsコマンドに-ilというオプションをつけることでiノード番号を表示させることができる
8409166 -rw-r--r--. 1 root root 5 Aug 31 00:00 sak3
8409158 lrwxrwxrwx. 1 root root 5 Aug 31 00:00 sak3 -> sak4 

sak3には8409166、sak4には8409158と違うiノード番号が割り振られていることが確認できました。ファイルの実体と結び付けられているリンク元のファイル(sak3のiノード番号)を削除すると、シンボリックリンクでは参照できなくなるのです。

(…というわけで以上難しい内容が終了しました! ファイルの管理にはiノード番号が使われていて、シンボリックリンクでは違うiノード番号が使われているんだなぁ、と理解できたら大丈夫です!)

シンボリックリンクのまとめ
シンボリックリンクは、リンク先のパスを保持しているファイルである。
リンク元のファイルを削除すると、シンボリックリンクからデータにアクセスすることはできない

まとめ

今回は、シンボリックリンクの作成についてお話しました。ハードリンクと関連する部分が多いので、ぜひハードリンクについても読んでみてください。
最後に確認問題で、今回の記事の知識を復習してみましょう。


確認問題

問題

「ln -s fileA fileB」でシンボリックリンクを作成したあと、fileAを違うディレクトリに移動した。この場合、fileBを参照するとどうなるか。

解答
答え:
参照することはできない。シンボリックリンクではfileAを移動した場合、リンク先のパスを参照することができないためエラーが表示される。fileAを元のディレクトリに移動した場合、fileBでまた参照することができる。