Linux仮想ファイルシステム:なぜ必要なのか、どのように機能するのか? パート1

みなさんこんにちは! 既に愛用しているコースで引き続き新しいストリームを開始し、4月下旬に開始されるLinux Administratorコースで新しいセットを開始することを急いでお知らせします。 新しい出版物は、このイベントに合わせてタイミングが取られます。 オリジナルの資料はこちらにあります

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



ファイルシステムとは何ですか? Linuxの最初の寄稿者および著者の1人であるRobert Loveの言葉に基づいて、「ファイルシステムは、特定の構造に従って組み立てられた階層データウェアハウスです。」 それはともかく、この定義はVFAT(仮想ファイルアロケーションテーブル)、Git、およびCassandraNoSQL 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 、およびtmpfsfile_operations Big Three関数をfile_operationsず、直接メモリに読み書きすることに注意してください。
以下の図は、Linuxシステムに通常マウントされているさまざまなタイプのファイルシステムにユーザー空間がどのようにアクセスするかを示しています。 pipesdmesg POSIX clocksなどの構成は、 file_operations構造も実装し、VFSレイヤーを通過するアクセスは示されていません。



VFSは、システムコールと、 ext4procfsなどの特定のfile_operations実装との間の「シェルレイヤー」です。 file_operations関数は、デバイスドライバーまたはメモリアクセスデバイスとやり取りできます。 tmpfsdevtmpfsおよびcgroupsdevtmpfsを使用しませんが、メモリに直接アクセスします。
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が開催するオープンウェビナーに伝統的に招待します。

第二部。

Source: https://habr.com/ru/post/J446614/


All Articles