Linux のハードリンクとソフトリンクの区別

Linux のハードリンクとソフトリンクの区別

Linux には、2 種類のファイル接続があります。1 つは Windows のショートカットに似ており、対象のファイル (またはディレクトリ) にすばやくリンクできます。これはソフト リンク、またはシンボリック リンクと呼ばれます。もう 1 つは、新しいファイルを作成する代わりに、ファイル システムの inode 接続を通じて新しいファイル名を生成する方法です。これはハード リンクと呼ばれ、エンティティ リンクとも呼ばれます。 ソフト リンクとハード リンクはまったく異なるものです。

1. ハードリンク

1.1 はじめに

一般的に、ファイル名と inode 番号は 1 対 1 で対応しており、各 inode 番号はファイル名に対応します。ただし、Unix/Linux システムでは、複数のファイル名が同じ inode 番号を指すことができます。つまり、同じコンテンツに異なるファイル名を使用してアクセスできます。ファイル コンテンツを変更すると、すべてのファイル名に影響しますが、1 つのファイル名を削除しても、別のファイル名へのアクセスには影響しません。この状況は「ハードリンク」と呼ばれます。

ln コマンドはハードリンクを作成できます:

ln <ソースファイル> <ハードリンク>

上記のコマンドを実行すると、ソース ファイルとターゲット ファイルの inode 番号は同じになり、両方が同じ inode を指します。 inode 情報には「リンク数」という項目があり、inode を指しているファイル名の総数が記録されており、このとき 1 増加します。逆に、ファイル名を削除すると、inode ノード内の「リンク数」が 1 減少します。この値が 0 に減少すると、この inode を指すファイル名がないことを示し、システムはこの inode 番号とそれに対応するブロック領域をリサイクルします。

さて、ディレクトリファイルの「リンク数」についてお話します。ディレクトリを作成すると、デフォルトで「」と「…」の 2 つのディレクトリ エントリが生成されます。前者の inode 番号は現在のディレクトリの inode 番号であり、これは現在のディレクトリの「ハード リンク」に相当します。後者の inode 番号は現在のディレクトリの親ディレクトリの inode 番号であり、これは親ディレクトリの「ハード リンク」に相当します。したがって、任意のディレクトリの「ハード リンク」の合計数は、常に 2 とそのサブディレクトリ (隠しディレクトリを含む) の合計数の合計に等しくなります。ここで、2 はディレクトリ名自体への「ハード リンク」と、現在のディレクトリ内の「.」への「ハード リンク」を指します。

1.2 ハードリンクとinodeの関係

ハード リンクは、基本的に、ソース ファイルと同じ inode にマップされるファイルのエイリアスです。次に、ソース ファイル lvlv.txt とハード リンク lvlv_hd.txt をそれぞれ /etc ディレクトリと /root ディレクトリに作成し、ファイルのプロパティを確認します。

#ハードリンク ln /etc/lvlv.txt /root/lvlv_hd.txt を作成します 

#ファイル属性を一覧表示する ll -i /etc/lvlv.txt
7792474 -rw---x--x 2 b3335 b3335 22 11月9日 21:05 lvlv.txt
ll -i /root/lvlv_hd.txt
7792474 -rw---x--x 2 b3335 b3335 22 11月9日 21:05 lvlv_hd.txt

上記から、ハードリンク /etc/lvlv_hd.txt の inode はソースファイル lvlv.txt と同じであり、その他の情報もまったく同じであることがわかります。ストレージ図は次のとおりです。

図の内容は、ディレクトリ /root 内のハード リンク lvlv_hd.txt と /etc 内のファイル lvlv.txt が同じ inode を介して同じファイル コンテンツをポイントしていることを示しています。ディレクトリのデータ エンティティには、各ファイル名とファイルの inode 番号が記録されます。ハード リンクは本質的にファイルのエイリアスであることがわかります。

1.3 ハードリンクに関する注意事項

ハード リンクには 2 つの制限があります。
(1) ファイルシステムをまたぐことはできません。ハードリンクはファイルのエイリアスにすぎず、独立したファイルではありません。したがって、単一のファイルシステムでのみ実行でき、ファイルシステムをまたぐことはできません。

(2)ディレクトリに接続できません。ディレクトリに接続されたハードリンクにより、ディレクトリの inode と物理ブロックがループを形成する可能性があるためです。このとき、ディレクトリが削除されると、ディレクトリ エンティティ ブロックはシステムからアクセスできなくなり、孤立したディレクトリ (ルート ディレクトリからアクセスできなくなる) になります。孤立したディレクトリの inode とエンティティ ブロックを削除する場合は、マーク付けとクリーニングを実行する必要がありますが、これはディスク上で操作するのに非常に時間がかかります。ソフト リンクでは、ターゲット ディレクトリのリンク数が増加しないため、この問題は発生しません。

たとえば、/etc ディレクトリまたはそのサブディレクトリにハード リンク /etc/etc_hd が作成されると、次の図に示すようにループが形成されます。

このとき、/etc ディレクトリを削除するためにrm -r /etcを実行しても、/etc の inode とブロックがまだ残っているため、実際には /etc ディレクトリは削除されず、孤立したディレクトリになります。このとき、ルート ディレクトリから /etc にアクセスすることはできません。

2. ソフトリンク

ハード リンクとは異なり、ソフト リンクは独自の inode を持つ独立したファイルを作成しますが、このファイルは接続されているファイルへのデータの読み取りを指示します。ポインティング操作としてファイルのみが使用されるため、ソース ファイルが削除されると、ソフト リンク ファイルは「開けません」というメッセージが表示され、削除されたソース ファイルは見つかりません。

ソフト リンクを作成し、そのソフト リンクのプロパティを表示してみましょう。

#ソフトリンクを作成 $ ln -s /etc/lvlv.txt lvlv_sb.txt

#ファイル属性を表示 $ ll -i 
7792474 -rw---x--x 2 b3335 b3335 22 11月9日 21:05 lvlv.txt
[b3335@MIC ルート]$ ll -i 
7792478 lrwxrwxrwx 1 b3335 b3335 11月13日 15:23 lvlv_sb.txt -> /etc/lvlv.txt

ソフトリンクのinodeノードはソースファイルlvlv.txtとは異なり、ソフトリンクのサイズは文字列「/etc/lvlv.txt」13の長さと正確に等しいことがわかります。ソフトリンクは別の新しいファイルであり、ファイルの内容はポイントされたファイルのパスであることがわかります。

以下は、lvlv.txt ファイルを例として示したソフト リンクの概略図です。

上記は、Linux のハードリンクとソフトリンクを区別する詳細な内容です。Linux のハードリンクとソフトリンクの詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • Linux デバイスに空き容量がありません inode の満杯により 500 エラーが発生します
  • Linux/Nginx で検索エンジン スパイダー クローラーの動作を表示する方法
  • Linux gzip コマンドのファイル圧縮実装原理とコード例
  • Linux ipcsコマンドの使用
  • SpringBoot + Vue プロジェクトを Linux サーバーにデプロイするための詳細なチュートリアル
  • Linux コマンドラインで電卓を使用する 5 つのコマンド
  • Linux lsコマンドの使用
  • 1行のコードでLinuxのプロセスを隠す方法を学ぶ
  • Linux sedコマンドの使用
  • Linux インデックスノード inode の詳細な説明

<<:  MySql でデータの重複挿入を回避する 3 つの方法

>>:  Vueモバイル端末に最適な適応ソリューションについての簡単な説明

推薦する

ドラッグ効果を実現するための js オブジェクト指向メソッド

この記事では、ドラッグアンドドロップをJSオブジェクト指向で実装するための具体的なコードを参考までに...

インスタンス化されたオブジェクトパラメータによるMySQLクエリ例の説明

この記事では、オブジェクト パラメータをインスタンス化して MySQL でデータをクエリする方法を紹...

この SQL 書き込み方法では本当にインデックスが失敗するのでしょうか?

序文インターネット上には、MySQL でインデックスにヒットできないさまざまな状況をまとめた記事がよ...

JavaScript デザインパターン コマンドパターン

コマンド パターンは、JavaScript デザイン パターンにおける動作デザイン パターンです。定...

Tomcat の文字化けしたコードとポート占有の解決方法について簡単に説明します

Tomcat サーバーは、無料でオープン ソースの Web アプリケーション サーバーです。軽量のア...

Dockerコンテナを作成、起動、停止する方法

1. コンテナとは、独立して実行されるアプリケーション、またはアプリケーションのグループとその動作環...

CentOSはexpectを使用してスクリプトやコマンドをバッチでリモート実行します

サーバーへのファイルのアップロード、ソフトウェアのインストール、コマンドやスクリプトの実行、サービス...

CSS テキスト装飾 text-decoration と text-emphasis の詳細な説明

CSS では、テキストは私たちが毎日扱う最も一般的なものの 1 つです。テキストの場合、テキストの装...

axios でリクエストをキャンセルし、重複リクエストを防ぐ方法について簡単に説明します。

目次序文コア - キャンセルトークン実用的なアプリケーションとパッケージングいくつかの小さな詳細序文...

Vue を通じて QR コードスキャン機能を実装する

ヒントこのプラグインは https プロトコルでのみアクセスできます。http プロトコルはうまく機...

Dockerのプロセスとイメージを実行するための基本コマンドの詳細な説明

目次1. ワークフローを実行する2. ミラーリングの基本コマンド1. ワークフローを実行するDock...

Docker コンテナのマウントディレクトリ操作の表示

Dockerコンテナのマウントディレクトリ情報のみを表示する docker 検査 --format ...

Webデザインと制作のテスト問題と参考回答

<br />Web デザインと制作テスト パート I 多肢選択問題 1. 単一選択問題 ...

Linuxのtimeコマンドの使い方の詳しい説明

1. コマンドの紹介時間は、コマンドの実行に費やされた時間や関連するシステム リソース、その他の情報...

CSS変数を使用してダークモードを実装するためのサンプルコード

最近、WeChatはAppleによってダークモードの開発を強制されました。ますます多くのウェブサイト...