【内容】
シンボリックリンクとそのコマンドについて簡単に振り返る記事です。
- ざっくりと比較して、違いをつかむ!
名称 | 分類 | 元ファイルとリンクの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分間シンボリックリンクでした!