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

推薦する

docker createコマンドの使用方法

docker create コマンドは、イメージに基づいてコンテナを作成できます。このコマンドの効果...

Docker に MySQL をデプロイする例

目次1 コンテナクラウドとは何ですか? 2 Dockerの紹介3 dockerを使ってMySQLをイ...

IE8でラベルの背景画像が表示されない問題の解決方法

今日、ちょっとした問題に遭遇し、長い間苦労しました。そのことを皆さんにシェアしたいと思います。 a ...

コピー&ペーストはパッケージングの敵です

OO、デザイン パターン、および多くのオブジェクト指向の原則について話す前に、まず 1 つのことを習...

JavaScript の navigator.userAgent がブラウザ情報を取得するケースの説明

ブラウザはおそらく私たちにとって最も馴染みのあるツールです。 Firefox、Opera、Safar...

Layuiテーブルは指定された行のラジオボタンを選択し、その行の実装コードまでスクロールします。

layui テーブルには複数行のデータがあります。外部入力コンテンツを通じて、指定された行を見つけ...

使用したコマンドを表示するLinuxコマンドメソッドの概要

システムでは多くのコマンドが使用されていますが、使用したコマンドをどのように確認すればよいでしょうか...

ウェブサイトのテキストはまだデザインする必要がありますか?

多くの人が、ウェブサイト上のテキストはデザインする必要があるのか​​と疑問に思うかもしれません。多く...

MySQLのダウンロードとインストールのプロセスの詳細な説明

1: MySqlをダウンロードする公式サイトのダウンロードアドレス: https://dev.mys...

MySql 8.0.11-Winxp64 (無料インストール版) ​​設定チュートリアル

1. インストールディレクトリにzipパッケージを解凍します。まず、mysql-8.0.11-win...

Mybatisの特殊文字処理の詳細な説明

序文: Mybatis の特殊文字処理、Mybatis の xml ファイル内の特殊文字の処理、ここ...

Linux で crond ツールを使用してスケジュールされたタスクを作成する方法

序文Crond は Linux のスケジュール実行ツール (Windows のスケジュールされたタス...

MySQL 完全崩壊: クエリフィルタ条件の詳細な説明

概要実際のビジネス シナリオ アプリケーションでは、ビジネス条件に基づいて対象データを取得およびフィ...

マインスイーパゲームを実装するための jQuery プラグイン (1)

この記事では、jQueryプラグインを使用したマインスイーパゲームの最初の記事の具体的なコードを参考...

CSS で QR コードスキャンボックスを実装するためのサンプルコード

カメラを開くと通常はスキャンボックスが表示されますが、静的なQRコードではフォーカスを合わせたりスキ...