目標
「iノード」と「iノード番号」の概要を理解する。
「ハードリンク」の概要を理解する。
「シンボリックリンク」について概要を理解する。
「lnコマンド」を利用してハードリンクとシンボリックリンクを作成できる。
「iノード」と「iノード番号」
「iノード」と「iノード番号」の概要
「iノード」とは
Linux(UNIX系のOS)でファイルの属性情報を記録したデータのことを「i-node」といいます。保存されているメタ情報には「ファイルの種類(普通のファイル(Reguler File)・ディレクトリファイル・シンボリックリンクなど)、ユーザーID・グループID・ファイルサイズ・データブロック番号(ポインタ)」などがあります。
「iノード番号」とは
i-node を利用するファイルシステムでファイルの作成を行うと「メタ情報(i-node)」と「実際のデータ」の2つが作成されます。この時、生成された「メタ情報(i-node)」に割り振られる番号を「i-node番号」といいます。この i-node番号 は同一のパーティション内で重複することはありません。
i-nodeを記録する領域とファイルのデータを記録する領域
ハードディスクなどの記憶媒体にi-nodeを利用するファイルシステムを作成した場合、次のように「i-node」を記録する領域と「ファイルデータ(実際のデータ)」を記録する領域が作られます。
このファイルシステムを利用してファイルを作成すると「ファイルの実体」と「メタ情報として i-node」 が作成されます。このメタ情報は「i-node領域」に書き込まれます。
作成された「メタ情報」と「ファイルの実体」は別々に管理されます。
ハードリンクとシンボリックリンク
ハードリンク
「ファイル名」から「i-node番号」を利用して「ファイルの実体」を参照することを「ハードリンク」といいます。この時、「ファイル名」が違っても、対応表で同じ「i-node番号」を利用した場合は、いずれも同じ「ファイルの実体」を参照することになります。
ディレクトリでファイルを作成すると、その作成したファイルは1つのハードリンクを持つことになります。
ハードリンクのイメージ
「sample1.txt」のハードリンクとして「hardlink1.txt」を作成すると「hardlink1.txt」は「sample1.txt」と同じi-node番号を利用することになります。結果的にいずれの「ファイル名」からも同じ「ファイルの実体」を参照することになります。
ハードリンクの削除では「i-node番号からi-nodeを指す線の削除」と捉えることができます。この場合はリンクが全て削除されて、初めて、ファイルデータが削除されることになります。
シンボリックリンク
「ファイル名」→「元ファイルへのポインタ」→「元ファイルのi-node番号」→「ファイルの実体」の順番でファイルを参照することを「シンボリックリンク」といいます。
シンボリックリンクのイメージ
シンボリックリンクの削除では「元ファイルを指す線の削除」と捉えることができます。シンボリックリンクではリンクが全て削除されても、ファイルデータのが削除されることはありません。
リンクの作成
リンクの作成
lnコマンド
lnコマンド
リンクを作成するコマンドです。
文法:
ln [省略できるOP] リンク元のファイル名 リンクさせるファイル名
※OP:オプションのことです。
コマンドの参考資料はこちら
ハードリンクの作成
ここでは「lnコマンド」を利用してハードリンクを作成してみたいと思います。
まず「ls -li」で先頭にi-node番号を付けてファイルの情報を表示してみます。[rocky001@rockylinux001 ~]$ ls -li dir1
total 12
18088903 -rw-rw-r–. 1 rocky001 rocky001 227 May 3 10:29 rocky2.txt
18088909 -rw-rw-r–. 1 rocky001 rocky001 585 May 3 10:29 rocky3.txt
18088910 -rw-rw-r–. 1 rocky001 rocky001 43 May 3 10:29 rocky4.txt
コマンドで「ln リンク元のファイル名 リンクさせるファイル名」と入力します。
[rocky001@rockylinux001 ~]$ ln dir1/rocky2.txt hlrocky2.txt
再度ファイルの内容をi-node番号を付けて確認してみます。「i-node番号」が共通のリンクが作成できています。見た目ではどちらが後から作成したリンクか見分けがつきません。これがハードリンクです。
[rocky001@rockylinux001 ~]$ ls -li hlrocky2.txt dir1/rocky2.txt
18088903 -rw-rw-r–. 2 rocky001 rocky001 227 May 3 10:29 dir1/rocky2.txt
18088903 -rw-rw-r–. 2 rocky001 rocky001 227 May 3 10:29 hlrocky2.txt
シンボリックリンクの作成
続けて「lnコマンド」にオプション「s」を利用してシンボリックリンクを作成してみたいと思います。コマンドで「ln -s リンク元のファイル名 リンクさせるファイル名」と入力します。
[rocky001@rockylinux001 ~]$ ln -s dir1/rocky2.txt slrocky2.txt
ファイルの内容をi-node番号を付けて確認してみると「i-node番号」が異なるリンクが作成されています。ファイルの種類は「l」となっていてシンボリックリンクというのが分かります。また「ファイル名->リンク元のファイル名」と表示されています。これがシンボリックリンクです。
[rocky001@rockylinux001 ~]$ ls -li slrocky2.txt dir1/rocky2.txt
18088903 -rw-rw-r–. 2 rocky001 rocky001 227 May 3 10:29 dir1/rocky2.txt
51426338 lrwxrwxrwx. 1 rocky001 rocky001 15 May 13 00:06 slrocky2.txt -> dir1/rocky2.txt
シンボリックリンクからのファイルの編集
続けて、ファイルの編集が元のファイルに影響するのかを確認してみます。slrocky2.txtをviエディタで開いて「hard link file slrocky.txt」と入力します。[rocky001@rockylinux001 ~]$ vi slrocky2.txt
(hard link file slrocky.txtと入力)
[rocky001@rockylinux001 ~]$ cat slrocky2.txt
hard link file slrocky.txt
[rocky001@rockylinux001 ~]$ cat dir1/rocky2.txt
hard link file slrocky.txt
↑元のファイルでも編集されたのが確認できます。
シンボリックリンクのリンク元ファイルの削除
更に続けてリンク元のファイルを削除してリンク切れが起きているかを確認します。
[rocky001@rockylinux001 ~]$ rm dir1/rocky2.txt
[rocky001@rockylinux001 ~]$ ls -li slrocky2.txt
51426338 lrwxrwxrwx. 1 rocky001 rocky001 15 May 13 00:06 slrocky2.txt -> dir1/rocky2.txt
リンク切れを確認できます。
[rocky001@rockylinux001 ~]$ cat slrocky2.txt
cat: slrocky2.txt: No such file or directory
リンク元を削除したファイルへ「ハードリンク」からのアクセス
「dir1/rocky2.txt」はハードリンクも作成していたので残ったハードリンクでリンクが行えるかを確認してみます。ハードリンクではリンクが行るのを確認できました。
[rocky001@rockylinux001 ~]$ cat hlrocky2.txt
hard link file slrocky.txt
リンク元ファイル名を再作成する
リンク切れを起こしているシンボリックリンクのリンク元ファイル名を再作成してみます。[rocky001@rockylinux001 ~]$ cp hlrocky2.txt dir1/rocky2.txt
再作成した場合、削除前同様にシンボリックリンクが利用できるようになります。
[rocky001@rockylinux001 ~]$ ls -li slrocky2.txt
51426338 lrwxrwxrwx. 1 rocky001 rocky001 15 May 13 00:06 slrocky2.txt -> dir1/rocky2.txt
シンボリックリンクのコピー(オプションなし)
シンボリックリンク自体のコピーを行ってみます。
(結果としてシンボリックリンクとしてのコピーは失敗します。)
[rocky001@rockylinux001 ~]$ cp slrocky2.txt cpslrocky2.txt
シンボリックリンクのコピー、シンボリックリンクのファイル、リンク元のファイルを並べて表示してみます。
[rocky001@rockylinux001 ~]$ ls -li cpslrocky2.txt slrocky2.txt dir1/rocky2.txt
51128526 -rw-rw-r–. 1 rocky001 rocky001 27 May 13 00:46 cpslrocky2.txt
18088938 -rw-rw-r–. 1 rocky001 rocky001 27 May 13 00:45 dir1/rocky2.txt
51426338 lrwxrwxrwx. 1 rocky001 rocky001 15 May 13 00:06 slrocky2.txt -> dir1/rocky2.txt
↑表示の順番は変わっていますが、次のようになっています。
シンボリックリンクのコピー(cpslrocky2.txt):普通ファイル
シンボリックリンクのファイル(slrocky2.txt):シンボリックリンク
リンク元のファイルを(dir1/rocky2.txt):普通ファイル
こちらのファイルは問題なくコピーされています。
[rocky001@rockylinux001 ~]$ cat cpslrocky2.txt
hard link file slrocky.txt
シンボリックリンクのコピー(オプション「d」)
こちらではシンボリックリンクとしてのコピーが行えています。
[rocky001@rockylinux001 ~]$ cp -d slrocky2.txt cpslrocky_optiond2.txt
[rocky001@rockylinux001 ~]$ ls -li cpslrocky_optiond2.txt slrocky2.txt dir1/rocky2.txt
51128527 lrwxrwxrwx. 1 rocky001 rocky001 15 May 13 01:04 cpslrocky_optiond2.txt -> dir1/rocky2.txt
18088938 -rw-rw-r–. 1 rocky001 rocky001 27 May 13 00:45 dir1/rocky2.txt
51426338 lrwxrwxrwx. 1 rocky001 rocky001 15 May 13 00:06 slrocky2.txt -> dir1/rocky2.txt
今回は以上になります。
ブックマークのすすめ
「ほわほわぶろぐ」を常に検索するのが面倒だという方はブックマークをお勧めします。ブックマークの設定は別記事にて掲載しています。