Linuxでシンボリックリンクを使用する方法は?

Linuxでシンボリックリンクを使用する方法は?

つまり、一部のプロセスがシンボリックリンクを読み取ろうとするとどうなりますか?読み書き中にシンボリックリンクが変更された場合はどうなりますか?

例:2つの巨大で類似した100Gファイルがあり、シンボリック/mnt/1リンクを介して使用できます。一部のプログラムは読み取りを開始します。しばらくするとリンクがからに変わりますが、ファイルはまだ読み込まれています。/mnt/2/mnt/1/home/user/fileA/home/user/file/mnt/1/mnt/2A

プログラムは絶対パスをキャッシュしますか?

シンボリックリンクが変更されたため、エラーが発生して失敗しますか、それとも何も起こらなかったかのように動作しますか?

/home/user/fileブロックデバイス(クローン化された2つのiSCSIディスク)に接続されている場合は異なりますか?

答え1

シンボリックリンクは物理ファイルの名前です(インデックスノード)ファイルシステムから。システムは実際のファイルを見つけるためにシンボリックリンクを解釈し、ファイルを開くときにファイルのinodeを見つけて使用します。この時点でファイルをインポートするために使用するパスは重要ではありません。オペレーティングシステムは、コンテンツをキャッシュせずにそのinodeを介してファイルから読み込みます。私が理解しているように、ハードリンクを介してファイルの読み取りを開始し、そのハードリンクを削除することができます(ファイルがまだ他の場所にリンクされている限り)。そしてファイルが解析された限り(名前文字列 - > inode)。

答え2

象徴的なリンクは、以下を含む小さなファイルです。場所(つまり、ターゲットファイルのパスとファイル名)ディレクトリエントリにシンボリックリンクであることを示すフラグがあります。

シンボリックリンクを開くと、オペレーティングシステムはその場所でターゲットファイルを探します。ターゲット自体がシンボリックリンクの場合、その場所がファイルを指すまで、その場所(1)(2)も続きます。いいえシンボリックリンク(と呼ぶ最終文書)。その後、オペレーティングシステムは次のようになります。インデックスノード~の最終文書(インデックスノードには変更時間などのメタデータが含まれており、ファイルデータへのポインタも含まれています。)最後のインデックスノード最終文書開く。これ以降、プロセスはその inode を使用してファイルを読み書きします。したがって、シンボリックリンクの名前またはパスを変更し、シンボリックリンクを削除し、パスまたは名前を変更します。最終文書も削除最終文書(3) プロセスに影響を与えません。それでも同じinodeから読みます。

ほとんどの場合、シンボリックリンクのファイルデータ操作は次のような影響を与えます。最終文書(たとえば、シンボリックリンクを読み書きするのは読み取り/書き込みです。最終文書)しかし例外もあります。readlink()システムコールはシンボリックリンク自体の内容を読み込みます。

一方、名前の変更や削除などのファイルメタデータ操作は、シンボリックリンクに影響を与えることがよくあります。しかし、ここには例外があります。lstat()システムコールは、stat()シンボリックリンクではなくシンボリックリンク自体に関する情報を返すことを除いて同様です。最終文書(2).


(1)レベル数に制限があり、シンボリックリンクの位置が相対パスである場合、状況はより複雑になります。

(2) 読書Symlink(7): シンボリックリンク処理詳細については。man 7 symlink

(3)rmコマンドやunlink()システムコールはファイルを物理的に削除しません。ファイルinodeを指すディレクトリエントリを削除します。ファイル自体は、次の場合にのみ削除されます。両方a) 対応する inode を参照するディレクトリエントリ (ハードリンク) がなくなり、 b) ファイルを開いたプロセスがありません。

答え3

これはほとんどLinuxに透過的で、オペレーティングシステムよりも使用されているファイルシステムに関連しています。

VFATパーティションでは機能するシンボリックリンクを作成できないため、通常のファイルでも非常に小さいファイルでもありません。たとえば、ファイルシステムによって直接書き込まれるため、シンボリックリンク自体をコピーするだけです。

シンボリックリンクとハードリンクの違いは、ハードリンクなどのデータセクタを指すのではなく、ハードリンクを指定することです。

例:

テスト1:

echo 'data' >file.txt

これにより、セクタ10〜20 *を指すハードリンクfile.txtが生成されます(*番号は説明用にすぎません)。

テスト2:

今も?

ln file.txt file_2.txt

これにより、セクタ10〜20(file.txtと同じ)を指すハードリンクfile_2.txtが生成されるため、file.txtを削除するとセクタ10〜20が残り、file_2.txtでデータを表示できます。 (file.txtとfile_2.txtの両方がオリジナルと同じです)

テスト3:

ln -s file.txt file_sym.txt 

file_sym.txtシンボリックリンクをハードリンクfile.txtとして指定するため、file_sym.txtにアクセスしようとするとfile.txtが表示されますが、file.txtを削除するとfile_symはターゲットを見つけることができなくなります。

これは、Linuxのext4モジュール(またはカーネルでコンパイルされた場合)などのファイルシステムによって管理され、Linuxを使用するか他のUnixを使用するかは重要ではありません。

関連情報