LinuCレベル1 101試験の例題と解説
1.02.3ハードリンクとシンボリックリンク
LinuCレベル1101試験の出題範囲から「1.02.3 ハードリンクとシンボリックリンク」についての例題を解いてみます。
ここでは、リンクの作成方法について確認しておきましょう。
例題
lnコマンドを用いて、test/testfile.txtのシンボリックリンクを作成する際のコマンドを一つ選択してください。
- ln -s test/testfile.txt ./test_link.txt
- ln test/testfile.txt ./test_link.txt
- ln -f test/testfile.txt ./test_link.txt
- ln -i test/testfile.txt ./test_link.txt
※この例題は実際の試験問題とは異なります。
解答と解説
正解は、「1.ln -s test/testfile.txt ./test_link.txt」です。
初めに、ハードリンク、シンボリックリンクの特徴を確認しましょう。
ハードリンク
ハードリンクは、iノードの仕組みを用いて、複数のファイル名で一つのファイルの実体を共有することができます。
iノードはファイルシステムごとに管理されてます。そのため、ハードリンクは、同じファイルシステム内でのみ作成することができます。ハードリンクを作成すると元ファイルと同じiノード番号になります。
シンボリックリンク
シンボリックリンクは、リンク元の実体の場所を情報としてもっています。その情報を元に、リンク元のファイルやディレクトリを参照します。
そのため、ファイルやディレクトリの移動によりリンク元の実体の場所が変わってしまうと参照ができなくなってしまいます。
しかし、別のファイルシステム上のファイルに対してリンクを作成したり、ディレクトリに対しても作成することが可能です。
今回の例題は、シンボリックリンクを作成する問題です。
ハードリンクやシンボリックリンクを作成するコマンドは、lnコマンドです。
lnコマンドの書式は以下の通りです。
ln [オプション] [リンク先] [リンク名]
lnコマンドの主なオプションは以下の通りです。
オプション | 概要 | |
-s | : | シンボリックリンクを作成する |
-d | : | ディレクトリのハードリンクを作成する(スーパーユーザーのみ) |
-f | : | リンクファイルと同じファイルが存在したとき上書きする |
-i | : | リンクファイルと同じファイルが存在したとき上書きを行うか確認する |
-v | : | リンクを作成する際に、作成するリンク名とリンク先を表示する |
-b | : | リンクファイルと同じファイルが存在したとき、バックアップを作成しリンクを作成する |
選択肢の解説は以下です。
1.ln -s test/testfile.txt ./test_link.txt
正解です。
-sオプションは、シンボリックリンクを作成する際に使用します。
実行すると以下のように、シンボリックリンクを作成できます。
$ ln -s test/testfile.txt ./test_link.txt
$ ls -l
total 0
drwxrwxr-x. 2 user user 26 Apr 11 14:50 test
lrwxrwxrwx. 1 user user 17 Apr 11 18:03 test_link.txt -> test/testfile.txt
また、「ls -l」などでファイルタイプを確認するとシンボリックリンクが作成されているのがわかります。
「readlink」コマンドを利用して確認することも可能です。実行例は、以下になります。
$ readlink test_link.txt
test/testfile.txt
2.ln test/testfile.txt ./test_link.txt
誤りです。
オプションなしでlnコマンドを実行すると、ハードリンクが作成されます。
実行すると以下のように、ハードリンクが作成されます。
$ ln test/testfile.txt ./test_link.txt
$ ls -l
total 4
drwxrwxr-x. 2 user user 26 Apr 11 14:50 test
-rw-rw-r--. 2 user user 14 Apr 11 14:50 test_link.txt
先ほどと同様に「ls -l」で確認してみるとファイルタイプの部分か「l」になっていないのがわかります。
「ls -li」でリンク先と作成したリンクを確認してみましょう。一つ目のフィールドに表示されるのが、iノード番号です。
$ ls -li test/testfile.txt
6293266 -rw-rw-r--. 2 user user 14 Apr 11 14:50 test/testfile.txt
$ ls -li test_link.txt
6293266 -rw-rw-r--. 2 user user 14 Apr 11 14:50 test_link.txt
3.ln -f test/testfile.txt ./test_link.txt
誤りです。
-fオプションは、リンクファイルと同じファイルが存在したとき、上書きするオプションです。
リンクファイルと同じ名前のファイルを作成して、実行してみます。
$ touch test_link.txt
$ ln test/testfile.txt ./test_link.txt
ln: failed to create hard link './test_link.txt': File exists
$ ln -f test/testfile.txt ./test_link.txt
作成したリンクファイルを確認してみるとハードリンクになっていることがわかります。
$ ls -li test/testfile.txt
6293266 -rw-rw-r--. 2 user user 14 Apr 11 14:50 test/testfile.txt
$ ls -li test_link.txt
6293266 -rw-rw-r--. 2 user user 14 Apr 11 14:50 test_link.txt
シンボリックリンクを作成するならば、-sオプションが必要になります。
以下のように、-fオプションと合わせて利用することも可能です。
$ touch test_link.txt
$ ln -fs test/testfile.txt ./test_link.txt
$ ls -l
total 0
drwxrwxr-x. 2 user user 26 Apr 11 14:50 test
lrwxrwxrwx. 1 user user 17 Apr 11 18:50 test_link.txt -> test/testfile.txt
4.ln -i test/testfile.txt ./test_link.txt
誤りです。
-iオプションは、リンクファイルと同じファイルが存在したとき、上書きを行うか確認するオプションです。
リンクファイルと同じ名前のファイルを作成して、実行してみます。
$ touch test_link.txt
$ ln test/testfile.txt ./test_link.txt
ln: failed to create hard link './test_link.txt': File exists
$ ln -i test/testfile.txt ./test_link.txt
ln: replace './test_link.txt'? y
-fオプション同様に、ハードリンクが作成されてしまいます。
シンボリックリンクを作成するならば、-sオプションが必要になります。
$ ln -is test/testfile.txt ./test_link.txt
ln: replace './test_link.txt'? y
$ ls -l
total 0
drwxrwxr-x. 2 user user 26 Apr 11 14:50 test
lrwxrwxrwx. 1 user user 17 Apr 11 19:05 test_link.txt -> test/testfile.txt
ハードリンクとシンボリックリンクの違いを理解して、lnコマンドでリンクを作成できるようにしましょう。
例題作成者
株式会社デージーネット OSS研究室 上野 貴博