GNU/Linux >> Linux の 問題 >  >> Linux

Linuxのハードリンクについて知っておくべき重要なことすべて

ハードリンクを表示する前に、Linuxのiノードについて学ぶことをお勧めします。 Linuxファイルシステムには2つの主要なコンポーネントがあります。データが保存されるデータブロックのプールと、このデータプールを管理するデータベースシステムです。 iノードはこのデータベースシステムのインデックスのようなものです。

ファイルへのハードリンクは、ファイル自体を指すのではなく、ファイルのiノードを指します。このようにして、ハードリンクは元のファイルのすべての属性を取得し、元のファイルと同じデータブロックを指します。

シンボリックリンクまたはソフトリンクを覚えている場合は、それがファイルを指していることがわかります。ハードリンクは、既存のiノードを指すディレクトリに手動で作成されたエントリです。

適切な図で説明します。このディレクトリ構造を例にとってみましょう:

したがって、基本的に、ルートディレクトリにはdir_1ディレクトリとdir_2ディレクトリが含まれます。 dir_1ディレクトリにはfile_1ファイルとfile_2ファイルがあり、dir_2にはfile_3とファイル2へのハードリンクが含まれています。

ファイルシステムでどのように見えるか見てみましょう。すべてが表象的です。実際には、ルートディレクトリには何千ものファイルがあります。ここでは、ディレクトリが2つしかないことを前提としています。

Linuxのディレクトリ構造を覚えていますか?ルート(/)から始めます。ルートディレクトリには常にiノード2があります。

ファイル3にアクセスする必要がある場合、絶対パスは/ dir_2/file_3になります。ここでは、次のように読むことができます。iノード2(ルートは常にiノード2)から開始し、矢印に従ってデータブロックに移動します。このデータブロックには、dir_2のiノード(この例ではiノード27)に関する情報が含まれています。

次に、iノード27を調べます。そのタイプはディレクトリです。 file_3(inode 88)のiノードに関する情報があるデータブロックに従います。 iノード88を調べます。そのタイプはファイルであり、そのデータブロックに従うと、ファイルのコンテンツにアクセスします。

ディレクトリ自体がファイルのデータを含んでいないことに気づきましたか?ディレクトリは基本的に、ファイルとサブディレクトリのiノードに関する情報を含むファイルです。

あなたは上の画像のリンクカウントのことについて疑問に思っているに違いありません。これは、ハードリンクを扱う場合に特に重要です。リンク数は、iノードを指すディレクトリエントリの数です。たとえば、dir_2のiノード27を取り上げます。 iノード27は、ルートディレクトリのデータブロックに1回、独自のデータブロック(特別なディレクトリ)に1回あります。したがって、リンク数は2です。

file_2を除くすべてのファイルのリンク数が1であることに注意してください。ファイルのリンク数が1を超える場合は、「このファイルへの」ハードリンクがあることを意味します。ハードリンクはターゲットファイルと同じiノード(この例ではiノード17)を指しているため、iノード17の2つのディレクトリリスト(dir_1とdir_2のデータブロック内)を取得します。

ハードリンクを作成するためにlnコマンドを使用できます:

ln target_file link_name

これにより、link_nameという名前のハードリンクがtarget_fileに作成されます。 link_nameは通常のファイルのように見え、その属性はターゲットファイルと同じであることがわかります。

ls -liコマンドを使用すると(-iオプションはiノード番号を示します)、リンク数は2であることがわかります。リンク数はファイル権限フィールドの後にあります。

134195 -rw-r--r-- 2 abhishek abhishek        0 Jul 17 19:49  target_file
134195 -rw-r--r-- 2 abhishek abhishek        0 Jul 17 19:49  link_target_file

明らかに、どちらも同じiノード番号134195を持っています。

ハードリンクについて覚えておくべきこと

Linuxのハードリンクについての良いアイデアが得られたので、もう少し進んでみましょう。

ターゲットファイルを削除しても、ハードリンクを介してそのコンテンツにアクセスできます。これは、ターゲットファイルとハードリンクの両方が同じiノードを持っているため、同じデータブロックを指しているためです。

Linuxでファイルを削除すると、基本的にリンクが解除されます。 rmコマンドを使用してfile_1を削除するとします。 Linuxカーネルは、file_1がinode 16に対応していることを検出します。dir_1のリストからfile_1エントリを削除し、inode 16のリンク数を1つ減らします。inode16のリンク数が0になると、カーネルはこれにリンクしている人がいないことを認識します。 iノードを削除して、それに関連付けられているデータブロックを安全に削除できるようにします。

ここで、file_2を削除するとします。カーネルは、file_2をdir_1のリストから削除し、iノード17に移動します。iノード17のリンク数が1に減少します。リンク数がゼロではないため、カーネルはiノードまたは関連するデータを削除しません。それ。したがって、ハードリンクにアクセスすると、元のファイルが削除されていてもデータにアクセスできます。

ディレクトリへのハードリンクを作成しないでください

ディレクトリへのソフトリンクを作成することはできますが、ディレクトリへのハードリンクを作成しようとすると、次のようなエラーが表示されます。

ln: newdir/test_dir: hard link not allowed for directory

ディレクトリにハードリンクが許可されていないのはなぜですか?ディレクトリにハードリンクを使用すると、ファイルシステムが破損する可能性があるためです。理論的には、-dまたは-Fオプションを使用してディレクトリへのハードリンクを作成できます。ただし、ほとんどのLinuxディストリビューションでは、rootユーザーであってもそれは許可されません。

>

以前に作成したハードリンクをもう一度見てみましょう:

134195 -rw-r--r-- 2 abhishek abhishek        0 Jul 17 19:49  target_file
134195 -rw-r--r-- 2 abhishek abhishek        0 Jul 17 19:49  link_target_file

それらは同じ属性を持っていますが、上記の例の名前に基づいてどちらがリンクであるかを推測できますが、名前が明確でない場合はどうなりますか?それらの名前がtarget_1とtarget_2であるかどうかをどうやって知ることができますか?

ファイルとリンクが別のディレクトリにある場合は、mtimeやその他のパラメータをチェックして、ディレクトリの内容がいつ変更されたかを確認してみてください。ただし、それでも確実ではありません。ファイルとハードリンクが同じディレクトリにあり、履歴が消去されている場合、どちらが元のファイルで、どちらがハードリンクであるかをどのように判断できるかわかりません。

ファイルに複数のリンクカウントがある場合は、そのファイルに関連付けられている他のハードリンクについて知りたいと思うかもしれません。

それを見つける1つの方法は、ファイルのiノード番号を使用することです。 ls -iコマンドまたはstatコマンドを使用して、iノード番号を取得できます。

iノード番号を取得すると、findコマンドを使用してそれに関連付けられているすべてのリンクを確認できます。

find . -inum inode_number

ハードリンクを理解するのは難しかったですか?

それほど「ハード」ではなく、Linuxのハードリンクの概念をよりよく理解していただければ幸いです。このトピックについて疑問や提案がある場合は、以下にコメントを残してください。


Linux
  1. Ubuntu13.04について知っておくべきことすべて

  2. SteamOSとは何ですか?この「ゲーム配信」について知っておくべき重要なことすべて

  3. Linux tmpディレクトリ:知っておくべきことすべて

  1. Linuxファイル圧縮:知っておくべきことすべて

  2. Linuxファイルのパーミッション:知っておくべきことすべて

  3. LinuxのSwappiness:知っておくべきことすべて

  1. Linuxファイルシステムについて知っておくべきことすべて

  2. LinuxChmodコマンドについて知っておくべきことすべて

  3. Linuxコンテナー(LXC)について知っておくべきことすべて