Linuxではファイルを作成した際に、それを直接参照するのではなく、リンクと呼ばれるファイルを生成し、リンクを通して間接的にデータを参照することがあります。また、その仕組みをある程度把握するためには、iノードと呼ばれるデータ概念を理解するのが近道となります。ここでは主に、「リンク」、「iノード」に焦点を絞って解説していきます。
リンクのメカニズム
リンクとは、あるファイルへの参照を目的とした、「ショートカット」のようなものです。
私たちも普段デスクトップなどにショートカットを作成し、ファイルを実行したり、フォルダに移動したりすることがあると思います。それに似た操作を、Linux上でも簡単に行うことが出来ます。
リンクには主に下記の2つの種類が存在します。
2つのリンクの種類
- ハードリンク
- シンボリックリンク
リンクを使用すると複雑な階層にあるファイルを実行できるので、作業時間を軽減出来たり、バッチ処理などのフローを簡略化できたりします。
ハードリンク
ハードリンクとは、対象となるファイルと同じ「iノード番号」をリンクに設定し、あたかも実態がそこにあるかのように振舞います。(※ iノードについての説明は後述します。)
ハードリンクの特徴として、別の場所にあるiノードを参照するため、もとのファイルを移動させてもデッドリンクになることはありません。また、ディレクトリのハードリンクは作成することができません。
シンボリックリンク
シンボリックリンクはiノードではなく、もとのファイルのパスを参照します。私たちが普段使う「ショートカット」と同じような概念となります。
シンボリックリンクはハードリンクと異なり、もとのファイルを移動させたり削除するとデッドリンクとなってしまいます。また、ディレクトリのリンクを作成することが可能です。
リンクの設定(ln)
リンクの設定をするには、lnコマンドを使用します。
リンクの書式
コマンドの書式
ln[オプション] ファイル名 リンク名
コマンドの主なオプション
- -s(--symbolic):ハードリンクの代わりにシンボリックリンクを作成する
- -f(--force):リンクファイルと同じ名前のファイルがあっても強制的に上書きする
- -i(--interactive):上書き前に確認する
- -L(--logical):対象がシンボリックリンクの場合リンクを巡る
- -P(--physical):シンボリックリンク自体へのハードリンクを作成する
- -r(--relative):相対パスのシンボリックリンクを作成する
- -T(--no-target-directory):リンク先を常に通常ファイルとして扱う
- -t(--target-directory):指定したディレクトリにリンクを作成する
- -v(--verbose):経過を表示する
ハードリンクの設定
カレントディレクトリに「test01.txt」というテキストファイルを作成し、そのリンク「testLink01」を作成していきます。
下記のコマンドを実行します。
# ln test01.txt testLink01
1 2 3 4 5 6 7 8 9 10 11 12 |
[root@CentOS7 ~]# touch test01.txt [root@CentOS7 ~]# echo "abcdefg" > test01.txt [root@CentOS7 ~]# cat test01.txt abcdefg ------------------------------------------------------------ [root@CentOS7 ~]# ln test01.txt testLink01 [root@CentOS7 ~]# ls -l -rw-r--r--. 2 root root 8 4月 2 17:03 test01.txt -rw-r--r--. 2 root root 8 4月 2 17:03 testLink01 ------------------------------------------------------------ [root@CentOS7 ~]# cat testLink01 abcdefg |
「test01.txt」のハードリンクである「testLink01」が作成されました。
「ls」コマンドでカレントディレクトリを表示すると「testLink01」が出来ているのが分かります。作成されたリンクを「cat」コマンドで参照すると、もとの「test01.txt」と同じ内容が表示されます。
シンボリックリンクの設定
カレントディレクトリに「test02.txt」というテキストファイルを作成し、そのシンボリックリンク「testLing02」を作成していきます。
下記のコマンドを実行します。
# ln -s test02.txt testLink02
1 2 3 4 5 6 7 8 9 10 11 12 |
[root@CentOS7 ~]# touch test02.txt [root@CentOS7 ~]# echo "hijklmn" > test02.txt [root@CentOS7 ~]# cat test02.txt hijklmn ------------------------------------------------------------ [root@CentOS7 ~]# ln -s test02.txt testLink02 [root@CentOS7 ~]# ls -l -rw-r--r--. 1 root root 8 4月 2 17:06 test02.txt lrwxrwxrwx. 1 root root 10 4月 2 17:06 testLink02 -> test02.txt ------------------------------------------------------------ [root@CentOS7 ~]# cat testLink02 hijklmn |
コマンドオプション「-s」を付与することにより、シンボリックリンクが作成できました。
「ls」コマンドでカレントディレクトリを表示すると「testLink02」の「シンボリックリンク」が出来ているのが分かります。作成されたリンクを「cat」コマンドで参照すると、もとの「test02.txt」と同じ内容が表示されます。
シンボリックリンクの主な用途は、深い階層にあるログファイル等を、自分の扱いやすいディレクトリへリンクする場合や、アプリケーションのバージョンアップなどで、カレントディレクトリを切り替える場合に使用します。
iノードとは
「iノード(inode)」とは、主にUNIX系で扱われる、ファイルやディレクトリの属性情報が書いてあるデータのことです。
Linux上のあるディレクトリに「hoge.txt」というファイルを作成し、そのテキストに「ああああ」と記述したとします。ファイルの中身の情報とは別に、「属性情報」と呼ばれるデータが別の場所で管理され、この属性情報のことをiノードと呼んでいます。
iノードの属性情報
- ファイル種別
- ファイルサイズ
- アクセス権
- 所有者情報
- リンク
- ブロック番号
「iノード」にはiノード番号と呼ばれる番号が振り分けられ、このiノード番号と作成したファイルは結び付けられます。
例えば、「hoge.txt」を作成した際に作られたiノードの番号が12だった場合、[12 : hoge.txt]というようにそれぞれの情報が紐づけられます。
リンク処理とiノードの関係
ここまでの解説で、リンクとiノードについてはある程度ご理解いただけたかと思います。では、今度は「ハードリンク」と「シンボリックリンク」それぞれのリンクが、どのようにiノードと結びついているのかを説明していきます。
ハードリンクとiノードの関係
前述した「リンクの設定(ln)・ハードリンクの設定」の続きからいきます。
カレントディレクトリには、「test01.txt」と「testLink01」が作成されています。下記のコマンドを実行してみます。
# ls -li
1 2 3 |
[root@CentOS7 ~]# ls -li 33575008 -rw-r--r--. 2 root root 0 4月 3 12:16 test01.txt 33575008 -rw-r--r--. 2 root root 0 4月 3 12:16 testLink01 |
コマンドオプション「-il」を付与することにより、iノード番号を表示させることができます。
ここでは第一カラム「33575008」がiノード番号となり、もとのファイルとリンクが一緒のiノード番号を参照していることが分かるかと思います。
第三カラム「2」は、そのiノードを参照している数となります。リンクを削除すると、ここの値は「1」になります。
シンボリックリンクとiノードの関係
述した「リンクの設定(ln)・シンボリックリンクの設定」の続きからいきます。
カレントディレクトリには、「test02.txt」と「testLink02」が作成されています。下記のコマンドを実行してみます。
# ls -il
1 2 3 |
[root@CentOS7 ~]# ls -il 33574990 -rw-r--r--. 1 root root 8 4月 2 17:06 test02.txt 33574997 lrwxrwxrwx. 1 root root 10 4月 2 17:06 testLink02 -> test02.txt |
ハードリンクとは違い、それぞれiノード番号が異なっています。リンクが作成された時点で新たなiノードが作られ、その番号が割り当てられています。
また、第二カラムの「lrwxrwxrwx」はファイルの種別を表しており、1文字目が「l」になっています。これは、このファイルがシンボリックリンクということを表しています。
まとめ
この記事では、リンクとiノードについて解説していきました。
- ハードリンク
ディレクトリのハードリンクは作成できない。
また、元のファイルを移動 or 削除してもデッドリンクとならない。 - シンボリックリンク
ディレクトリのハードリンクは作成可能。
元のディレクトリ、ファイルを移動 or 削除するとデッドリンクとなってしまう。
上記の特性から、更新頻度の低い設定ファイルなどは、ハードリンクで管理を行い、更新頻度の高いログファイルなどは、シンボリックリンクで管理するのがよいでしょう
実際のサーバー構築において、ハードリンクを使用する場面は、ほとんどありません。
Linux基礎知識(全12記事)
├─Linuxとは何か? Linuxの基本概要を理解しよう!
├─Linuxをインストールし、ログインしてみよう!
├─起動の仕組みとカーネルについて!
├─ディレクトリ構造とファイルシステムについて!
├─ユーザー環境(ユーザー、グループ、パスワード)の設定について!
├─ディレクトリ操作について!
├─ファイル操作について!
├─テキスト操作について!
├─Linuxの基本コマンドを覚えよう!
├─適切なアクセス制御を付与してみよう!
├─リンクとiノードについて理解を深めよう!
└─LVMとは?LVMを理解しよう?