仮想ファイルシステムは、Linux哲学で「すべてがファイルである」と言うことができる、ある種の魔法の抽象化として機能します。

ファイルシステムとは何ですか? Linuxの最初の寄稿者および著者の1人であるRobert Loveの言葉に基づいて、「ファイルシステムは、特定の構造に従って組み立てられた階層データウェアハウスです。」 それはともかく、この定義はVFAT(仮想ファイルアロケーションテーブル)、Git、およびCassandra ( NoSQL Database )にも同様に適しています。 それでは、「ファイルシステム」のような概念を正確に定義するものは何でしょうか。
ファイルシステムの基本
Linuxカーネルには、ファイルシステムと見なすことができるエンティティに対する特定の要件があります。 名前を持つ永続オブジェクトに対して
open()
、
read()
および
write()
メソッドを実装する必要があります。 オブジェクト指向プログラミングの観点から、カーネルは一般的なファイルシステム(一般的なファイルシステム)を抽象インターフェースとして定義します。これら3つの大きな機能は「仮想」と見なされ、特定の定義はありません。 したがって、ファイルシステムのデフォルトの実装は、仮想ファイルシステム(VFS)と呼ばれます。

エンティティを開いたり、読み書きしたりできる場合、上記のコンソールの例からわかるように、このエンティティはファイルと見なされます。
VFS現象は、Unixに似たシステムの特徴である「すべてがファイルである」ことを強調するだけです。 / dev / consoleを使用した上記の小さな例が、コンソールが実際にどのように機能するかを示しているのはどれほど奇妙なことだと思います。 この図は、インタラクティブなBashセッションを示しています。 文字列をコンソール(仮想コンソールデバイス)に送信すると、仮想画面に表示されます。 VFSには、他にも、さらに奇妙な特性があります。 たとえば、 それらを検索することができます 。
ext4、NFS、および/ procなどの使い慣れたシステムには、file_operationsと呼ばれるCデータ構造に3つの重要な機能があります。 さらに、特定のファイルシステムは、使い慣れたオブジェクト指向の方法でVFS機能を拡張および再定義します。 Robert Loveが指摘するように、VFSの抽象化により、Linuxユーザーは、内部データ形式を気にせずに、サードパーティのオペレーティングシステムまたはパイプなどの抽象エンティティとファイルをスムーズにコピーできます。 ユーザー側(ユーザー空間)では、システムコールを使用して、プロセスは1つのファイルシステムの
read()
メソッドを使用してファイルからカーネルデータ構造にコピーし、別のファイルシステムの
write()
メソッドを使用してデータを出力できます。
基本的なVFSタイプに属する関数定義は 、カーネルソースからのfs / *。Cファイルにあり、
fs/
サブディレクトリには特定のファイルシステムが含まれています。 カーネルには、
cgroups
、
/dev
および
tmpfs
などのエンティティも含まれます。これらは、ブートプロセス中に必要なため、
init/
kernelサブディレクトリで定義されます。
cgroups
、
/dev
、および
tmpfs
は
file_operations
Big Three関数を
file_operations
ず、直接メモリに読み書きすることに注意してください。
以下の図は、Linuxシステムに通常マウントされているさまざまなタイプのファイルシステムにユーザー空間がどのようにアクセスするかを示しています。
pipes
、
dmesg
POSIX clocks
などの構成は、
file_operations
構造も実装し、VFSレイヤーを通過するアクセスは示されていません。

VFSは、システムコールと、
ext4
や
procfs
などの特定の
file_operations
実装との間の「シェルレイヤー」です。
file_operations
関数は、デバイスドライバーまたはメモリアクセスデバイスとやり取りできます。
tmpfs
、
devtmpfs
および
cgroups
は
devtmpfs
を使用しませんが、メモリに直接アクセスします。
VFSが存在すると、ファイルシステムに関連付けられた基本的なメソッドを各タイプのファイルシステムで再実装する必要がないため、コードを再利用できます。 コードを再利用することは、ソフトウェアエンジニアにとって広く受け入れられている方法です。 ただし、再利用可能なコードに重大なエラーが含まれている場合 、一般的なメソッドを継承するすべての実装でエラーが発生します。
/ tmp:簡単なヒント
VFSがシステムに存在することを検出する簡単な方法は、
mount | grep -v sd | grep -v :/
を入力することです
mount | grep -v sd | grep -v :/
mount | grep -v sd | grep -v :/
mount | grep -v sd | grep -v :/
。NFSではなく、ディスクに常駐するすべてのマウントされたファイルシステムを表示します。これは、ほとんどのコンピューターに当てはまります。 リストされているVFSマウントの1つは間違いなく
/tmp
になりますか?

物理メディアに
/tmp
を保存するのはおかしいことは誰もが知っています! 出所
/tmp
を物理メディアに保存することが望ましくないのはなぜですか?
/tmp
内のファイルは一時的なものであり、記憶装置はtmpfsが作成されるメモリよりも遅いためです。 さらに、物理メディアは、メモリよりも摩耗の影響を受けやすくなっています。 最後に、/ tmp内のファイルには機密情報が含まれている可能性があるため、再起動ごとの消失は不可欠な機能です。
残念ながら、一部のLinuxディストリビューションインストールスクリプトは、デフォルトのストレージデバイスに/ tmpを作成します。 これがシステムにも発生した場合、絶望しないでください。 これを修正するにはArch Wikiの簡単な指示に従ってください。また、
tmpfs
割り当てられたメモリは他の目的ではアクセスできなくなることを覚えておいてください。 つまり、巨大なtmpfsと大きなファイルを含むシステムでは、メモリが不足してクラッシュする可能性があります。 別のヒント:
/etc/fstab
編集するときは、改行で終わる必要があることに
/etc/fstab
してください。そうしないと、システムが起動しません。
/ procおよび/ sys
/tmp
に加えて、Linuxユーザーが最もよく知っているVFS(仮想ファイルシステム)は
/proc
および
/sys
です。 (
/dev
は共有メモリにあり、
file_operations
はありません)。 なぜこれら2つのコンポーネントがぴったりなのか この問題を見てみましょう。
procfs
は、カーネルと、
userspace
監視するプロセスのインスタントスナップショットを
userspace
ます。
/proc
カーネルは、割り込み、仮想メモリ、スケジューラなど、所有しているツールに関する情報を表示します。 また、
/proc/sys
は、
sysctl
コマンドで構成されたオプションが
userspace
利用できる場所です。 個々のプロセスのステータスと統計は、
/proc/
ディレクトリに表示されます。

ここで
/proc/meminfo
は空のファイルですが、それでもなお貴重な情報が含まれています。
/proc
ファイルの動作は、異なるVFSディスクファイルシステムがどのように異なるかを示しています。 一方、
/proc/meminfo
は、
free
コマンドで表示できる情報が含まれています。 一方、そこは空です! どう? この状況は、 「月は誰も見ていなくても存在しますか?」という有名な記事に似ています。 現実と量子理論」 、1985年にコーネル大学の物理学教授David Merminによって書かれました。 実際のところ、カーネルは
/proc
リクエストが行われたときにメモリ統計を収集し、実際には
/proc
ファイルに誰もいないときは
/proc
ファイルに何もありません。 メルミンが言ったように、「基本的な量子ドクトリンは、測定は原則として、測定された特性の既存の値を明らかにしないと述べています。」(月を宿題と考えてください!)
procfs
空虚さは理にかなっています。なぜなら、そこにある情報は動的だからです。
sysfs
わずかに異なる状況。
/proc
と
/sys
少なくとも1バイトのファイルがいくつあるかを比較してみましょう。

Procfs
は1つのファイル、つまりエクスポートされたカーネル構成がありますが、これは例外です。ブートごとに生成する必要があるのは1回だけであるためです。 一方、
/sys
はさらに多くの膨大なファイルが含まれており、その多くはメモリのページ全体を占めています。 通常、
sysfs
ファイルには、
/proc/meminfo
などのファイルを読み取って取得した情報のテーブルとは異なり、正確に1つの番号または行が含まれます。
sysfs
の目的は、カーネルがユーザー空間で
«kobjects»
と呼ぶものの読み取りおよび
«kobjects»
なプロパティを提供することです。
kobjects
の唯一の目的はリンクをカウントすることです
kobjects
への最後のリンクが削除されると、システムはそれに関連付けられたリソースを復元します。 ただし、
/sys
は、有名な「ユーザー空間用の安定したABI」カーネルのほとんどを構成します。これは、どのような状況でも誰も「壊れる」ことができません。 これは、sysfs内のファイルが静的であることを意味するものではなく、不安定なオブジェクトへのリンクのカウントと矛盾します。
カーネルの安定したカーネルアプリケーションインターフェイス(カーネルの安定したABI)は、この特定の瞬間に実際に存在するものではなく、
/sys
に表示されるものを制限します。 sysfsでファイルのアクセス許可を一覧表示すると、デバイス、モジュール、ファイルシステムなどの構成可能な設定を理解できます。 カスタマイズまたは読み取ることができます。 procfsも安定したABIカーネルの一部であると結論付けていますが、これはドキュメントには明示的に記載されていません。

sysfs
内のファイルは、エンティティごとに1つの特定のプロパティを記述し、読み取り可能、書き換え可能、またはその両方を同時に実行できます。 ファイル内の「0」は、SSDを削除できないことを示します。
翻訳の第2部は、 eBPFおよびbccツールを使用してVFSを視聴する方法から始まります。今、私たちはあなたのコメントを待っており、4月9日に教師Vladimir Drozdetskyが開催するオープンウェビナーに伝統的に招待します。
第二部。