Linuxでシンボリックリンクの作成方法がわかりにくいといった事はないでしょうか?
またシンボリックリンクとハードリンクの違いなどもわかりずらくないでしょうか?
そこでLinuxのシンボリックリンクについて、現役エンジニアの筆者がまとめます。
筆者はWindowsサーバーやLinuxサーバーの運用構築を11年以上おこなってきました。その経験を元に知識を公開していきます!
Linuxでのわかりずらいリンクについて、実例を用いて説明していますので、理解する事が可能です。
Linuxでlnコマンドによるシンボリックリンクの作成方法
Linuxでシンボリックリンクの作成方法はlnコマンドです。
ln -s リンク元のファイルかディレクトリ(絶対パス) シンボリックリンク
シンボリックリンクの確認は「ls -l」や「ls -F」で行います。
「ls -l」コマンドでは「シンボリックリンク -> リンク元のファイル」と表示されます。またパーミッションの最初に「l」がつきます。
「ls -F」コマンドでシンボリックリンクは名前の後にアットマークが付きます。これがシンボリックリンクの意味になります。
シンボリックリンクを様々なパターンで作成してみる
シンボリックリンクを作成する4パターンを見てみます。
- リンク元ファイルとシンボリックリンクのパスを指定する
- リンク元ファイルとシンボリックリンクのパス+リンク名を指定する
- リンク元ディレクトリとシンボリックリンクのパスを指定する
- リンク元ディレクトリとシンボリックリンクのパス+ファイル名を指定する
リンク元ファイルとシンボリックリンクのパスを指定する
カレントディレクトリに「symbolic-link-file1」と「symbolic-link」ディレクトリを作成します。
mkdir symbolic-link
touch symbolic-link-file1
作成したファイルにviエディタで文字を記述します。
ファイル元の「symbolic-link-file1」のシンボリックリンクを「symbolic-link」ディレクトリに作成します。
リンク元ファイルとシンボリックリンクのパスを指定します。
ln -s /root/symbolic-link-file1 symbolic-link/
シンボリックリンクを「ls -l」コマンドで確認します。
[root@localhost ~]# ls -l symbolic-link/
合計 0
lrwxrwxrwx 1 root root 25 5月 8 18:10 symbolic-link-file1 -> /root/symbolic-link-file1
指定したパスの配下に元ファイルと同じ名前で、シンボリックリンクが作成されています。
catコマンドで元ファイルとシンボリックリンクの中身を確認します。
[root@localhost ~]# cat symbolic-link-file1
symbolic-link-file1-contents
[root@localhost ~]#
[root@localhost ~]# cat symbolic-link/symbolic-link-file1
symbolic-link-file1-contents
どちらも同じ内容が表示されています。シンボリックリンク作成成功です。
リンク元ファイルとシンボリックリンクのパス+リンク名を指定する
リンク元ファイルとシンボリックリンクのパス+リンク名を指定してみます。
ln -s /root/symbolic-link-file2 symbolic-link/link2
シンボリックリンクを「ls -l」コマンドで確認します。
[root@localhost ~]# ls -l symbolic-link/
合計 0
lrwxrwxrwx 1 root root 25 5月 8 18:33 link2 -> /root/symbolic-link-file2
指定したパスの配下に指定したファイル名で、シンボリックリンクが作成されています。
catコマンドで元ファイルとシンボリックリンクの中身を確認します。
[root@localhost ~]# cat symbolic-link-file2
symbolic-link-file2-contents
[root@localhost ~]#
[root@localhost ~]# cat symbolic-link/link2
symbolic-link-file2-contents
どちらも同じ内容が表示されています。シンボリックリンク作成成功です。
リンク元ディレクトリとシンボリックリンクのパスを指定する
ディレクトリ用のシンボリックリンクを置くディレクトリを作成します。
mkdir symbolic-link-dir
リンク元ディレクトリとシンボリックリンクのパスを指定してみます。
ln -s /root/symbolic-link symbolic-link-dir/
シンボリックリンクを「ls -l」コマンドで確認します。
[root@localhost ~]# ls -l symbolic-link-dir/
合計 0
lrwxrwxrwx 1 root root 19 5月 8 18:45 symbolic-link -> /root/symbolic-link
指定したパスの配下に元ディレクトリ名で、シンボリックリンクが作成されています。
cdコマンドでシンボリックリンクを指定して移動してみます。
[root@localhost ~]# cd symbolic-link-dir/symbolic-link/
[root@localhost symbolic-link]# pwd
/root/symbolic-link-dir/symbolic-link
[root@localhost symbolic-link]# ls
link2 symbolic-link-file1
pwdコマンドでカレントディレクトリを表示すると、シンボリックリンクのパスが表示されていますが、lsコマンドをたたくと、元のディレクトリ「symbolic-link」の内容が表示されています。シンボリックリンク作成成功です。
リンク元ディレクトリとシンボリックリンクのパス+ファイル名を指定する
リンク元ディレクトリとシンボリックリンクのパスを指定してみます。
ln -s /root/symbolic-link symbolic-link-dir/symbolic-link-dir-link
シンボリックリンクを「ls -l」コマンドで確認します。
[root@localhost symbolic-link-dir]# ls -l
合計 0
lrwxrwxrwx 1 root root 19 5月 8 18:54 symbolic-link-dir-link -> /root/symbolic-link
指定したパスの配下に指定したファイル名で、シンボリックリンクが作成されています。
cdコマンドでシンボリックリンクを指定して移動してみます。
[root@localhost symbolic-link-dir]# cd symbolic-link-dir-link/
[root@localhost symbolic-link-dir-link]# pwd
/root/symbolic-link-dir/symbolic-link-dir-link
[root@localhost symbolic-link-dir-link]# ls
link2 symbolic-link-file1
lsコマンドをたたくと、元のディレクトリ「symbolic-link」の内容が表示されています。シンボリックリンク作成成功です。
シンボリックリンクを削除する方法
シンボリックリンクを削除する方法は以下のコマンドです。
unlink シンボリックリンク
実際に削除してみます。
[root@localhost symbolic-link-dir]# ls -F
symbolic-link@ symbolic-link-dir-link@
[root@localhost symbolic-link-dir]# unlink symbolic-link
[root@localhost symbolic-link-dir]# ls
symbolic-link-dir-link
2つあったシンボリックリンクの一つが削除されています。
[root@localhost symbolic-link-dir]# unlink symbolic-link-dir-link/
unlink: `symbolic-link-dir-link/' を削除 (unlink) できません: ディレクトリではありません
[root@localhost symbolic-link-dir]# unlink symbolic-link-dir-link
[root@localhost symbolic-link-dir]# ls
[root@localhost symbolic-link-dir]#
シンボリックリンクの最後の/があれば削除できません。/をなくしたら削除できています。
Linuxのリンクの種類について
Linuxでリンクの種類は2種類あります。
- シンボリックリンク
- ハードリンク
それぞれの特徴をまとめます。
シンボリックリンクの特徴
- ディレクトリにもリンク可能
- 参照先のファイルを削除するとエラーとなる
- i-nodeが参照元とシンボリックリンクで違うので、パーミッション間のリンクも可能
- パーミッションの初めに「l」がつく
ハードリンクの特徴
- ディレクトリにはリンク不可能
- 同じi-nodeなので片方を削除してもエラーとはならない
- i-nodeが参照元とシンボリックリンクが同じなので、パーミッション間のリンクは不可能
シンボリックリンクの作成は「ln」コマンドのsオプションでしたが、オプションなしだとハードリンクを作成できます。
シンボリックリンクとハードリンクの違いを確認する
シンボリックリンクとハードリンクを作成します。
ln -s symbolic-link-file3 symbolic-link-file3.ln
ln symbolic-link-file4 symbolic-link-file4.ln
「ls -il」コマンドで確認します。
[root@localhost ~]# ls -il
合計 80
10797427 -rw-r--r-- 1 root root 29 5月 8 20:20 symbolic-link-file3
10797421 lrwxrwxrwx 1 root root 19 5月 8 20:21 symbolic-link-file3.ln -> symbolic-link-file3
10797426 -rw-r--r-- 2 root root 29 5月 8 20:21 symbolic-link-file4
10797426 -rw-r--r-- 2 root root 29 5月 8 20:21 symbolic-link-file4.ln
シンボリックリンクのパーミッションの初めにlがついていますが、ハードリンクにはついていません。
シンボリックリンクと元ファイルはi-node番号が違いますが、ハードリンクは同じです。
シンボリックリンクの元ファイルを削除してみます。
rm -f symbolic-link-file3
シンボリックリンクをcatコマンドで参照してみます。
[root@localhost ~]# cat symbolic-link-file3.ln
cat: symbolic-link-file3.ln: そのようなファイルやディレクトリはありません
参照しようとしてもエラーで見る事ができません。
ハードリンク元を削除してみます。
[root@localhost ~]# rm -f symbolic-link-file4
ハードリンクを参照してみます。
[root@localhost ~]# cat symbolic-link-file4.ln
symbolic-link-file4-contents
参照元が削除されてもi-nodeが同じなので、ファイルの中身が表示されています。
シンボリックリンクの方は赤くなりエラーになっています。ハードリンクはエラーが出ていません。
まとめ:Linuxでlnコマンドによるシンボリックリンクの作成方法
Linuxのlnコマンドによるシンボリックリンクの作成方法は以下のコマンドです。
ln -s リンク元のファイルかディレクトリ(絶対パス) シンボリックリンク
シンボリックリンクの確認は「ls -l」や「ls -F」で行います。
シンボリックリンクはパスを指定すれば、そのパス配下に元ファイル名でリンクが作成される。パス+ファイル名を指定する事でリンク名を付ける事ができる。
リンクの削除コマンドはunlinkコマンド
unlink リンク名
Linuxでリンクの種類は2種類あります。
- シンボリックリンク
- ハードリンク
シンボリックリンクの特徴
- ディレクトリにもリンク可能
- 参照先のファイルを削除するとエラーとなる
- i-nodeが参照元とシンボリックリンクで違うので、パーミッション間のリンクも可能
- パーミッションの初めに「l」がつく
ハードリンクの特徴
- ディレクトリにはリンク不可能
- 同じi-nodeなので片方を削除してもエラーとはならない
- i-nodeが参照元とシンボリックリンクが同じなので、パーミッション間のリンクは不可能
シンボリックリンクの作成は「ln」コマンドのsオプションでしたが、オプションなしだとハードリンクを作成できます。