09-Linux & Virtual Box

Virtual Box & Linux(Part.18)| Linux ファイルの管理(3)【リンク】| 現役エンジニア&プログラミングスクール講師

目標

「iノード」と「iノード番号」の概要を理解する。
「ハードリンク」の概要を理解する。
「シンボリックリンク」について概要を理解する。
「lnコマンド」を利用してハードリンクとシンボリックリンクを作成できる。

「iノード」と「iノード番号」

「iノード」と「iノード番号」の概要

「iノード」とは

Linux(UNIX系のOS)でファイルの属性情報を記録したデータのことを「i-node」といいます。保存されているメタ情報には「ファイルの種類(普通のファイル(Reguler File)・ディレクトリファイル・シンボリックリンクなど)、ユーザーID・グループID・ファイルサイズ・データブロック番号(ポインタ)」などがあります。

i-nodeは「ext2や、ext3、ext4、xfs」などのファイルシステムで利用されます。ファイルシステムによってはi-nodeを利用しないものがあります。

「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領域」に書き込まれます。

作成された「メタ情報」と「ファイルの実体」は別々に管理されます。

ハードリンクとシンボリックリンク

ハードリンク

「ファイル名」から「i-node番号」を利用して「ファイルの実体」を参照することを「ハードリンク」といいます。この時、「ファイル名」が違っても、対応表で同じ「i-node番号」を利用した場合は、いずれも同じ「ファイルの実体」を参照することになります。

ディレクトリでファイルを作成すると、その作成したファイルは1つのハードリンクを持つことになります。

ディレクトリは「ファイル名」と「ファイルの実体」を対応付ける特別なファイルです。ハードリンクでは、この対応付けの表には「i-node番号」が利用されます。

ハードリンクは、次のことができません。
異なるファイルシステムへのリンクは作成できません。
異なるディレクトリへのリンクは作成できません。

ハードリンクのイメージ

「sample1.txt」のハードリンクとして「hardlink1.txt」を作成すると「hardlink1.txt」は「sample1.txt」と同じi-node番号を利用することになります。結果的にいずれの「ファイル名」からも同じ「ファイルの実体」を参照することになります。

ハードリンクの削除では「i-node番号からi-nodeを指す線の削除」と捉えることができます。この場合はリンクが全て削除されて、初めて、ファイルデータが削除されることになります。

シンボリックリンク

「ファイル名」→「元ファイルへのポインタ」→「元ファイルのi-node番号」→「ファイルの実体」の順番でファイルを参照することを「シンボリックリンク」といいます。

シンボリックリンクでは「別ディレクトリへのリンク」も「別ファイルシステムへのリンク」も可能です。

シンボリックリンクのイメージ

シンボリックリンクの削除では「元ファイルを指す線の削除」と捉えることができます。シンボリックリンクではリンクが全て削除されても、ファイルデータのが削除されることはありません。

注意点として「元ファイル」が削除されるとリンクエラーを起こします。

リンクの作成

リンクの作成

lnコマンド

lnコマンド

リンクを作成するコマンドです
文法:
ln  [省略できるOP] リンク元のファイル名 リンクさせるファイル名
※OP:オプションのことです。
コマンドの参考資料はこちら

lnコマンドはオプションに何も指定しないと「ハードリンク」を作成します。オプションに「s」を利用すると「シンボリックリンク」を作成できます。

ハードリンクの作成

ここでは「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


今回は以上になります。

「Linux」おすすめ書籍6選【初心者・脱初心者用】| 現役エンジニア&プログラミングスクール講師「Linux」初心者の方がLinuxの操作や仕組みを理解するためのお勧めの書籍について取り上げています。また中級者として更に進んだ学習ができる書籍についても1冊取り上げています。ページの下部には「おすすめのITスクール情報」「おすすめ求人サイト」について情報を掲載中。...

ブックマークのすすめ

「ほわほわぶろぐ」を常に検索するのが面倒だという方はブックマークをお勧めします。ブックマークの設定は別記事にて掲載しています。

「お気に入り」の登録・削除方法【Google Chrome / Microsoft Edge】| 現役エンジニア&プログラミングスクール講師「お気に入り」の登録・削除方法【Google Chrome / Microsoft Edge】について解説している記事です。削除方法も掲載しています。...
【パソコン選び】失敗しないための重要ポイント | 現役エンジニア&プログラミングスクール講師【パソコン選び】失敗しないための重要ポイントについての記事です。パソコンのタイプと購入時に検討すべき点・家電量販店で見かけるCPUの見方・購入者が必要とするメモリ容量・HDDとSSDについて・ディスプレイの種類・バッテリーの持ち時間や保証・Officeソフト・ウィルス対策ソフトについて書いています。...
RELATED POST
09-Linux & Virtual Box

Virtual Box & Linux(Part.11)| Linux テキスト処理(3)| 現役エンジニア&プログラミングスクール講師

2023年4月29日
プログラミング学習 おすすめ書籍情報発信 パソコン初心者 エンジニア希望者 新人エンジニア IT業界への就職・転職希望者 サポートサイト Programming learning Recommended schools Recommended books Information dissemination Computer beginners Prospective engineers New engineers Prospective job seekers in the IT industry Support site
09-Linux & Virtual Box

Virtual Box & Linux(Part.23)| Linux USBメモリ内でのパーティショ作成とファイルシステム作成 | 現役エンジニア&プログラミングスクール講師

2023年5月25日
プログラミング学習 おすすめ書籍情報発信 パソコン初心者 エンジニア希望者 新人エンジニア IT業界への就職・転職希望者 サポートサイト Programming learning Recommended schools Recommended books Information dissemination Computer beginners Prospective engineers New engineers Prospective job seekers in the IT industry Support site
09-Linux & Virtual Box

Virtual Box & Linux(Part.7)| Linux viエディタの利用方法(2)| 現役エンジニア&プログラミングスクール講師

2023年4月25日
プログラミング学習 おすすめ書籍情報発信 パソコン初心者 エンジニア希望者 新人エンジニア IT業界への就職・転職希望者 サポートサイト Programming learning Recommended schools Recommended books Information dissemination Computer beginners Prospective engineers New engineers Prospective job seekers in the IT industry Support site
09-Linux & Virtual Box

Virtual Box & Linux(Part.22)| Virtual box でUSBメモリを認識させる方法 | 現役エンジニア&プログラミングスクール講師

2023年5月22日
プログラミング学習 おすすめ書籍情報発信 パソコン初心者 エンジニア希望者 新人エンジニア IT業界への就職・転職希望者 サポートサイト Programming learning Recommended schools Recommended books Information dissemination Computer beginners Prospective engineers New engineers Prospective job seekers in the IT industry Support site
09-Linux & Virtual Box

Virtual Box & Linux(Part.9)| Linux テキスト処理(1)| 現役エンジニア&プログラミングスクール講師

2023年4月27日
プログラミング学習 おすすめ書籍情報発信 パソコン初心者 エンジニア希望者 新人エンジニア IT業界への就職・転職希望者 サポートサイト Programming learning Recommended schools Recommended books Information dissemination Computer beginners Prospective engineers New engineers Prospective job seekers in the IT industry Support site
09-Linux & Virtual Box

Virtual Box & Linux(Part.20)| Linux プロセスの管理(2)| 現役エンジニア&プログラミングスクール講師

2023年5月20日
プログラミング学習 おすすめ書籍情報発信 パソコン初心者 エンジニア希望者 新人エンジニア IT業界への就職・転職希望者 サポートサイト Programming learning Recommended schools Recommended books Information dissemination Computer beginners Prospective engineers New engineers Prospective job seekers in the IT industry Support site