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モバイル端末に最適な適応ソリューションについての簡単な説明

推薦する

スクロール画像バーを実現するための CSS サンプルコード

一部の Web サイトでは、画像が連続的にスクロールしているのをよく見かけます。この効果は、CSS ...

リバースプロキシ設定を実装するためのユニバーサルnginxインターフェース

1. プロキシサーバーとは何ですか?プロキシ サーバーは、クライアントが要求を送信すると、それを直接...

オブジェクト内のフィールドを削除する js メソッド

この記事では主に、オブジェクト内のフィールドを削除するための js の実装を紹介し、次のように共有し...

Vue は検証コードのカウントダウンボタンを実装します

この記事では、検証コードカウントダウンボタンを実装するためのVueの具体的なコードを例として紹介しま...

Vue が値を返してフォームを動的に生成し、データを送信する仕組みの詳細な説明

目次解決された主な問題1. バックエンドから返され、バックエンドに送信されるデータは、次の形式になり...

border-image を使用してテキストバブルの境界線を実装する方法のサンプルコード

開発中に、非常に単純なテキストバブル効果に遭遇しました。これは、おおよそ次のようになります。 うーん...

WeChatアプレットが検索ボックス機能を実装

この記事の例では、WeChatアプレットの検索ボックス機能を実装するための具体的なコードを参考までに...

MySQL の undo、redo、binlog の違いを簡単に分析します

目次序文【ログ取り消し】 【REDOログ】 【バイナリログ】要約する序文MySQL には、REDO ...

Vueは画像切り替え効果を実現

この記事の例では、画像切り替え効果を実現するためのVueの具体的なコードを参考までに共有しています。...

ウェブ理論: 考えさせない読書ノート

第 1 章<br /> Web ページをユーザーにとって使いやすいものにするための最も重...

JS ES6における構造化分解についてお話しましょう

概要es6 では、配列またはオブジェクトから指定された要素を取得する新しい方法が追加されました。これ...

Dockerでリモートアクセスを有効にする方法

DockerデーモンソケットDocker デーモンは、 unix 、 tcp 、 fdの 3 種類の...

MySQL でのインデックスの追加と削除に関連する操作

目次1. インデックスの役割2. インデックスの作成と削除(1)ALTER TABLE文を使用して、...

JavaScript フォーム検証の例

HTML フォームは、名前、電子メール アドレス、場所、年齢などのユーザー情報を収集するためによく使...