Linux ファイル システムはオペレーティング システムのコア コンポーネントであり、そのオペレーティング メカニズムは私たちプログラマーが理解して習得する必要があるものです。ディスクはシステムに最も基本的な永続ストレージを提供し、ファイル システムはシステムにLinux ではすべてのファイルを管理するため、すべてがファイルであり、通常のファイルやディレクトリだけでなく、ブロックデバイス、ソケット、パイプなども統一されたファイルシステムで管理する必要があります。今日は、ディスクとファイル システムはどのように機能するのかについて一緒に話します。
ノードとディレクトリ エントリのインデックスを作成する
Linux ファイル システムでは、ファイルのメタデータには、ディレクトリ エントリ、インデックス ノード、データ ブロックが含まれます。
- ディレクトリ エントリ: dentry と呼ばれ、ファイルの名前、インデックス ノード ポインタ、および他のディレクトリ エントリとの関連付けを記録するために使用されます。複数の関連付けられたディレクトリ エントリがファイル システムのディレクトリ構造を構成します。ディレクトリ エントリはカーネルによって維持されるメモリ データ構造であるため、ディレクトリ エントリ キャッシュ (キャッシュ) と呼ばれることがよくあります。
- インデックス ノード: inode と呼ばれ、inode 番号、ファイル サイズ、アクセス許可、変更日、データの場所、リンク数などを含むファイルのメタデータを記録するために使用されます。インデックス ノード情報は永続化されます。ストレージ用のディスク。ディスク領域を占有します。
- データ ブロック: ブロックと呼ばれ、ファイル データが保存されます。ディスクの最小の記憶単位はセクタと呼ばれます。各セクタには 512 バイトが格納され、これは 0.5KB に相当します。オペレーティング システムがハードディスクを読み取るとき、セクタごとに読み取ることはなく、あまりにも非効率です。複数のセクターを一度に連続して読み取ります。つまり、一度に 1 つの「ブロック」を読み取ります。複数のセクターから構成されるこの「ブロック」がファイルアクセスの最小単位です。 「ブロック」サイズ、最も一般的なのは 4KB (8 セクター) です。
ファイルアクセスを高速化するために、通常、インデックスノードはメモリにロードされ、フォーマット時にハードディスクはスーパーブロック、インデックスノード領域、データブロック領域の3つの記憶領域に分割されます。
- スーパーブロックは、ブロック数、ブロックサイズ、空きブロックなど、ファイルシステムの詳細情報を保存するために使用されます。
- インデックス ノード領域。インデックス ノードを格納するために使用されます。
- データ ブロック領域。ファイルまたはディレクトリ データを保存するために使用されます。
仮想ファイル システム
Linux システムの仮想ファイル システム (VFS、仮想ファイル システム) は、ユーザーとアプリケーションに一貫したファイル システム インターフェイスを提供する重要な抽象化レイヤーであり、統一された方法でシステム内のさまざまな種類のファイルに安心してアクセスできるようにします。基礎となるファイル システムの実装の詳細について。
ユーザープログラムと glibc ライブラリは両方ともユーザー空間に属し、ファイル操作はシステム コール層 (SCI) の関数を呼び出すことによって完了します。これらの関数は、ユーザーがシステムに操作を要求するために Linux カーネルによって提供されるインターフェイスです。たとえば、システムの cat コマンドは、open() 関数を呼び出してファイルを開き、次に read() 関数を呼び出してファイルの内容を読み取り、最後に write() 関数を呼び出してファイルの内容をコンソールに出力します。 。一般的なファイル システムの種類は、いくつかの広いカテゴリに分類できます。
- ローカル ディスクに基づく: EXT3、EXT4、XFS、OverlayFS など。このタイプのファイル システムの特徴は、データがコンピュータにローカルにマウントされたディスクに直接保存され、優れたパフォーマンスとネットワーク IO アクセスの消費がないことです。
- ネットワーク ファイル システムに基づく: NFS、CIFS/SMB、CephFS、GlusterFS など。このタイプのファイルの特徴は、ユーザーがネットワーク経由でファイルにアクセスして管理できることです。分散、クロスプラットフォーム、柔軟性、拡張性が最大の利点です。
- メモリベースのファイル システム: tmpfs、ramfs、/proc など。これらのメモリベースのファイル システムは通常、一時ファイル ストレージ、キャッシュ、高速データ アクセスなどの特定の目的に使用されます。これらはメモリ内のファイルの読み取りと書き込みのための高性能ソリューションを提供しますが、メモリの制限とデータの揮発性にも注意する必要があります。
ファイル I/O
さまざまなタイプのファイル システムを作成するために、ディスクをパーティション分割してフォーマットします。これらのファイル システムは、システムで使用する前に、Linux の VFS 上の特定のディレクトリにマウントする必要があります。ファイルの読み取りおよび書き込み操作にはさまざまな I/O タイプがあり、アプリケーション プログラムはニーズに応じて適切な方法を選択します。
バッファ型 I/O とバッファなし I/O
- いわゆるバッファリングなしとは、カーネルがバッファリングを提供せず、単純なシステム コールのみを提供し、関数ライブラリの呼び出しを提供しないことを意味します。システム カーネルは、ディスクの読み取りおよび書き込み用のブロック バッファを提供します。write 関数を使用してデータを書き込む場合、システム コールが直接呼び出され、データがブロック バッファに書き込まれ、キューに入れられます。ブロック バッファが一定の値に達すると、システム コールが直接呼び出されます。一定量になると、データがディスクに書き込まれます。したがって、いわゆるバッファなし I/O は、プロセスがバッファリング機能を提供しないことを意味します。書き込みまたは読み取り関数が呼び出されるたびに、システムによって直接呼び出されます。 (カーネルによってバッファリングされます)。
- バッファリングされた I/O は、プロセスが入出力ストリームを改善し、ストリーム バッファーを提供することを意味します。 write関数でデータを書き込む場合、まずストリームバッファにデータを書き込み、ストリームバッファが一杯になるなど一定の条件が満たされると、カーネルが提供するブロックバッファに一括してデータを送信し、次に、ブロック バッファを介してディスクに書き込まれます。 (ダブルバッファリング)
- したがって、同じ量のデータをディスクに書き込む場合、バッファリングされた I/O はバッファリングされていない I/O よりも必要なシステム コールが少なくなります。
直接 I/O と間接 I/O
- ダイレクト I/O: アプリケーションはカーネル バッファを経由せずにディスク データに直接アクセスします。この目的は、カーネル バッファからユーザー プログラム キャッシュへのデータ コピーを減らすことです。
- 間接 I/O: ファイルの読み取りまたは書き込み時には、まずシステムのページ キャッシュを通過し、次にカーネルまたは追加のシステム コールによってディスクに書き込まれる必要があります。
- 直接 I/O の場合、アクセスされたデータがアプリケーション キャッシュにない場合、データは毎回ディスクから直接ロードされるため、この直接ロードの効率は遅くなります。ただし、データベース管理システムなどのアプリケーションの場合は、独自のキャッシュ メカニズムを選択する可能性が高くなります。これは、データベース管理システムはオペレーティング システムよりもデータベースに保存されているデータをよく知っていることが多く、直接 I/O の方が適切であるためです。
ブロッキング I/O とノンブロッキング I/O
- I/O のブロック: アプリケーション プロセスは、I/O 操作を呼び出すときにブロックします。操作対象のデータが準備でき、アプリケーション プロセスのバッファーにコピーされた場合にのみ戻ります。実装難易度が低く、アプリケーション開発が容易で、同時実行数の少ないネットワークアプリケーションの開発に適しているという特徴があります。
- ノンブロッキング I/O: アプリケーションが I/O 操作を実行した後、現在のスレッドをブロックせず、引き続き他のタスクを実行し、ポーリングまたはイベント通知を通じて呼び出しの結果を取得できることを意味します。 。特徴は次のとおりです。 比較的複雑です。同時実行量が少なく、タイムリーな応答を必要としないネットワーク アプリケーション開発に適しています
同期および非同期 I/O
- 同期 I/O: アプリケーションが I/O 操作を実行した後、I/O 応答を取得するには、I/O 全体が完了するまで待機する必要があることを意味します。
- 非同期 I/O: アプリケーションが I/O 操作を実行した後、完了や完了後の応答を待つ必要がなく、実行を続行できることを意味します。この I/O が完了すると、その応答がイベント通知の形式でアプリケーションに通知されます。
ファイルに関する一般的な知識
ディスクにはまだ多くのスペースが残っていますが、新しいファイルやディレクトリを保存するためのスペースが不足しています。
- トラブルシューティングのアイデア: 小さなファイルが多すぎて i ノードが使い果たされている可能性が高くなります。df -i を使用できます。
du と df の間のハード ディスク使用量統計に一貫性がありません。
- du は、ファイル システムによって記録された各ファイルのサイズをカウントし、ファイル システムを通じて取得される合計サイズを累積します。 df は主にスーパーブロック (スーパーブロック) からハードディスクの使用状況情報を読み取り、ディスク ブロックの使用状況を取得します。この状況は、ファイルが削除されているにもかかわらず、別のプロセスがそのファイルを使用している (ハンドルを所有している) ことが原因で発生する可能性が高く、lsof | grep delete で確認できます。プロセスが停止または強制終了されると、これらのスペースは解放されます。
ディスク容量をクエリすると、使用済みアベイルのサイズが常に総容量 (SIze) よりも小さいのはなぜですか。
- 緊急事態を防ぐために、Linux ext ファイル システムはハード ディスク領域を予約します。特定の予約値は、tune2fs -l [dev_name] | grep "予約ブロック数"、(dev_name) はデバイス名で確認できます。 , ここで、予約スペースは df によって使用スペースに計算され、その結果、df と du の間で統計が矛盾します。予約スペースのサイズを調整する必要がある場合は、tune2fs -m [size] [dev_name] を使用して調整できます。
以上がLinux ファイル システムがどのように機能するかを知りたいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。