Linux の基礎知識

【Linuxの基礎知識】リンクとiノードについて理解を深めよう!

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

「test01.txt」のハードリンクである「testLink01」が作成されました。

「ls」コマンドでカレントディレクトリを表示すると「testLink01」が出来ているのが分かります。作成されたリンクを「cat」コマンドで参照すると、もとの「test01.txt」と同じ内容が表示されます。

シンボリックリンクの設定

カレントディレクトリに「test02.txt」というテキストファイルを作成し、そのシンボリックリンク「testLing02」を作成していきます。

下記のコマンドを実行します。

# ln -s test02.txt testLink02

コマンドオプション「-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

コマンドオプション「-il」を付与することにより、iノード番号を表示させることができます。

ここでは第一カラム「33575008」がiノード番号となり、もとのファイルとリンクが一緒のiノード番号を参照していることが分かるかと思います。

第三カラム「2」は、そのiノードを参照している数となります。リンクを削除すると、ここの値は「1」になります。

シンボリックリンクとiノードの関係

述した「リンクの設定(ln)・シンボリックリンクの設定」の続きからいきます。

カレントディレクトリには、「test02.txt」と「testLink02」が作成されています。下記のコマンドを実行してみます。

# ls -il

ハードリンクとは違い、それぞれiノード番号が異なっています。リンクが作成された時点で新たなiノードが作られ、その番号が割り当てられています。

また、第二カラムの「lrwxrwxrwx」はファイルの種別を表しており、1文字目が「l」になっています。これは、このファイルがシンボリックリンクということを表しています。

まとめ

この記事では、リンクとiノードについて解説していきました。

  • ハードリンク
    ディレクトリのハードリンクは作成できない。
    また、元のファイルを移動 or 削除してもデッドリンクとならない。
  • シンボリックリンク
    ディレクトリのハードリンクは作成可能。
    元のディレクトリ、ファイルを移動 or 削除するとデッドリンクとなってしまう。

上記の特性から、更新頻度の低い設定ファイルなどは、ハードリンクで管理を行い、更新頻度の高いログファイルなどは、シンボリックリンクで管理するのがよいでしょう

実際のサーバー構築において、ハードリンクを使用する場面は、ほとんどありません。

よく読まれている記事

1

Shellとは? Shellとは、人間の理解できる言葉を機会へ伝えるプログラムです。 Linux環境でコマンドプロンプト画面を開いているとき、常にShellは起動している状態です。 「Shell」とは ...

2

Linuxは主にサーバー用として利用されるOSです。大規模な基幹システムの開発者、ロボットや家電開発等の組み込み系エンジニア、ネットワーク機器やデータベースに携わるインフラエンジニアは触れることが多い ...

3

プログラミング言語を習得しようと思った時、必ずと言っていいほど候補として挙げられるのが「Java」というプログラミング言語です。 「Java」は、現在日本で最も使われている言語であり、非常に人気のある ...

4

この記事は、Linuxについて勉強している初心者の方向けに「Shellスクリプト」について解説します。最後まで読んで頂けましたら、Shellスクリプトはどのような役割を担っているのか?を理解出来るよう ...

-Linux の基礎知識