LoginSignup
3
5

More than 5 years have passed since last update.

3分間シンボリックリンク

Last updated at Posted at 2016-12-18

【内容】
シンボリックリンクとそのコマンドについて簡単に振り返る記事です。


1. ざっくりと比較して、違いをつかむ!

   名称          分類  元ファイルとリンクのinodeの関係 特徴 参照方法
リンク ハードリンク 同じ 同じファイルシステム内でのみ作成可 inodeで参照する
シンボリックリンク 異なる 異なるファイルシステム間でも作成可  作成時のパスで参照する

*inodeが分からなかったら、ファイルシステムと一般的なファイルの参照方法について調べましょう!


2.シンボリックリンク関係のコマンド

シンボリックリンク作成
ln -s TARGET LINK_NAME

① -s オプションはsymbolicって意味です。
シンボリックリンクを作りますよーって意思表示しましょう。
また、ディレクトリに対しては -n オプションで対応可能です。

② -s オプションを付けない場合は、ハードリンク作成になります。
 


シンボリックリンク削除
unlink LINK_NAME

① Linuxではunlinkコマンドが用意されています。
専用に用意されている意図を含めて、unlinkコマンドを使います。

② 裏側で呼んでいるシステムコールがちょっと違ってて、
unlinkコマンドがunlink関数
rmコマンドがunlinkat関数
を呼び出しています。

詳しくは man 2 unlink, man 2 unlinkatで!


シンボリックリンク張替え
ln -sf TARGET LINK_NAME

① -f オプション(forceオプション)で削除と作成を同時にやってくれます。
毎度 unlinkで削除して、ln -sで再作成するよりもラクです。
作成時と同じく、ディレクトリに対しては -n オプションで対応可能です。


シンボリックリンク確認
readlink -e TARGET_NAME 

file TARGET_NAME 

① シンボリックリンクが期待通りに作成されたことを確認します。
-e オプションを使いましょう。
このオプションはリンク元のファイルが存在するかチェックします。

② straceで ln -s のシステムコールを追ってみると、
シンボリック作成時にリンク元のファイルの存在をチェックせずに、
symlink関数を使ってリンクを作成しています。

つまり、ln -s した時点ではリンク元の存在に関わらずに
シンボリックを作成するため、元ファイルを辿れないリンクを作成することも可能です。
仕事としては、間違えてしまう箇所になりますね。


3.まとめ

まとめとして、存在し無いファイルに対してシンボリックリンクを作成した場合を見ていくよ!


存在し無いファイルに対してシンボリックリンクを作成した場合

# わざと存在しないファイルに対してシンボリックリンクを作成
[user@server]$ ls -la /var/hoge
ls: cannot access /var/hoge: そのようなファイルやディレクトリはありません

[user@server]$ ln -s /var/hoge hoge-link
[user@server]$ echo $?
0



# 確認コマンドとして、良い例と駄目な例でそれぞれ確認してみます。 


#不適切な確認その1
[user@server]$ ls -la hoge-link 
lrwxrwxrwx. 1 root root 9 12 19 05:33 2016 hoge-link -> /var/hoge

/ リンク元が存在してないにも関わらず、ぱっとみリンク元があるように見えてします。 /


#不適切な確認その2
[user@server]$ readlink hoge-link 
/var/hoge

/ リンク元が存在してないのも関わらず、ぱっとみリンク元があるように見えてします。
  readlinkって名前に対して色眼鏡を外しましょう。 /


#確認その1
[user@server]$ file  hoge-link 
hoge-link: broken symbolic link to `/var/hoge`

/ "broken symbolic" と出力されます。
 fileコマンドの本来の用途とは別になりますが、
 このコマンドを使った確認は初心者に対しても意外と視覚的にわかりやすいと思います! /


#確認その2
[user@server]$ readlink -e hoge-link 

/リンク元ファイルが存在しないため、何も表示されません。これは期待通りの結果です。
 返値で1が返ってくるので、シェルスクリプトで分岐させたいときはfileコマンドより、
 readlink -e でチェックしたほうがきれいかもですね。 /


[user@server]$ file hoge-link 
hoge-link: broken symbolic link to `/var/hoge`
[user@server]$ echo $?
0

[user@server]$ readlink -e hoge-link 
[user@server]$ echo $?
1


以上、3分間シンボリックリンクでした!


3
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5