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

推薦する

フロントエンド例外 502 不正なゲートウェイの原因と解決策

目次502 不正なゲートウェイ エラーの発生1. 502 不正なゲートウェイ エラーとは何ですか? ...

Nginx 設定場所のマッチング優先順位の簡単な分析

序文Nginx 構成のサーバー ブロック内の場所は、リクエスト URI を一致させるために使用され、...

MySQLは現在の日付と時刻を取得する関数

現在の日付 + 時刻 (日付 + 時刻) を取得する関数: now() mysql> now(...

MySQLインデックスの詳細

1. インデックスの原則インデックスは、列内の特定の値を持つ行をすばやく見つけるために使用されます。...

レム適応の一般的なパッケージ3つについて

序文以前、rem適応についての記事を書きましたが、具体的なパッケージは紹介しませんでした。今日は、よ...

あなたのウェブサイトはIE8に適していますか?

オリンピック期間中にIE8ベータ2がリリースされ、英語版のリリースに合わせて中国語版も第一波でリリー...

Websocket に基づくシンプルなチャットルームダイアログの実装

この記事では、WebSocketを使用して簡単なチャットルームの会話を実装するための具体的なコードを...

Docker ベースの nginx ファイル サーバーを構築する方法と手順

1. このマシンに新しい設定ファイルdocker_nginx.confを作成します。 サーバー{ 7...

mysql-8.0.11-winx64.zip の詳細なインストール チュートリアル

zip インストール パッケージをダウンロードします。 MySQL8.0 For Windows z...

DockerにMySQLをインストールする方法

最近 Django を導入しましたが、MySQL を手動でインストールしたくなかったので、Docke...

vue3を使用してAppleシステムのサイドメッセージプロンプト効果を模倣する

目次アニメーションプレビューその他のUIライブラリ始めるコンポーネントディレクトリ構造トーストおおよ...

Vueはコンピュータカメラを呼び出して写真機能を実現します

この記事の例では、コンピュータカメラを呼び出して写真機能を実現するためのvueの具体的なコードを参考...

CentOS 8 に MariaDB をインストールするための詳細なチュートリアル

MariaDB データベース管理システムは MySQL のブランチであり、主にオープンソース コミュ...

ボックスモデルのサイズの詳細な説明は、パディング、マージン、境界の値によって異なります。

ボックス モデルは、要素ボックスの幅と高さ、パディング、境界線、余白のサイズを指定します。境界線の内...

このようなシェル スクリプトを使用して、多数の MySQL データベースを強制終了します (推奨)

朝早くに電話で起こされました。あるプロジェクトのデータベースがダウンしていて起動できないとのことでし...