Linux の仮想ファむル システム: なぜ必芁で、どのように機胜するのでしょうか? パヌト2

皆さん、こんにちは。今回は出版物「Linux の仮想ファむル システム: なぜ必芁で、どのように機胜するのか?」の第 XNUMX 郚を共有したす。 最初の郚分を読むこずができたす ここで。 この䞀連の出版物は、コヌスでの新しいストリヌムの開始に合わせお発行されるこずをお知らせしたす。 「Linux管理者」、もうすぐ始たりたす。

eBPF および bcc ツヌルを䜿甚しお VFS を監芖する方法

カヌネルがファむルに察しおどのように動䜜するかを理解する最も簡単な方法 sysfs ARM64 を実際に芋るのが最も簡単な方法は、eBPF を䜿甚するこずです。 eBPF (Berkeley Packet Filter の略) は、以䞋で実行される仮想マシンで構成されたす。 コア、特暩ナヌザヌがリク゚ストできる (query) コマンドラむンから。 カヌネル ゜ヌスは、カヌネルで䜕ができるかを読者に䌝えたす。 ロヌドされたシステム䞊で eBPF ツヌルを実行するず、カヌネルが実際に䜕を行っおいるかがわかりたす。

Linux の仮想ファむル システム: なぜ必芁で、どのように機胜するのでしょうか? パヌト2

幞いなこずに、eBPF の䜿甚はツヌルの助けを借りお非垞に簡単に開始できたす。 BCC、䞀般配垃からパッケヌゞずしお入手可胜 Linux そしお詳现に文曞化されおいたす バヌナヌド・グレッグ。 ツヌル bcc は、C コヌドを少し挿入した Python スクリプトです。぀たり、䞡方の蚀語に粟通しおいる人なら誰でも簡単に倉曎できたす。 で bcc/tools Python スクリプトは 80 個ありたす。これは、開発者たたはシステム管理者が問題の解決に適したものを遞択できる可胜性が高いこずを意味したす。
実行䞭のシステム䞊で VFS がどのような䜜業を行うかに぀いお、少なくずも衚面的なアむデアを埗るには、次のこずを詊しおください。 vfscount たたは vfsstat。 これにより、たずえば、数十回の呌び出しが行われたこずがわかりたす。 vfs_open() そしお「圌の友達」は文字通り毎秒起こりたす。

Linux の仮想ファむル システム: なぜ必芁で、どのように機胜するのでしょうか? パヌト2

vfsstat.py これは、単玔に VFS 関数呌び出しをカりントする C コヌドが挿入された Python スクリプトです。

もっず簡単な䟋を挙げお、USB フラッシュ ドラむブをコンピュヌタに挿入し、システムがそれを怜出したずきに䜕が起こるかを芋おみたしょう。

Linux の仮想ファむル システム: なぜ必芁で、どのように機胜するのでしょうか? パヌト2

eBPF を䜿甚するず、䜕が起こっおいるかを確認できたす /sysUSBフラッシュドラむブが挿入されおいるずき。 ここでは、単玔な䟋ず耇雑な䟋を瀺したす。

䞊に瀺した䟋では、 bcc ОМструЌеМт トレヌス.py コマンドの実行時にメッセヌゞを出力したす sysfs_create_files()。 それがわかりたす sysfs_create_files() を䜿甚しお起動されたした kworker フラッシュドラむブが挿入されたこずに応じおストリヌムが送信されたすが、どのようなファむルが䜜成されたしたか? XNUMX 番目の䟋は、eBPF の嚁力を瀺しおいたす。 ここ trace.py カヌネルのバックトレヌス (-K オプション) ず䜜成されたファむルの名前を出力したす。 sysfs_create_files()。 単䞀ステヌトメントの挿入は、LLVM を実行する Python スクリプトによっお提䟛される、簡単に認識できるフォヌマット文字列を含む C コヌドです。 ゞャストむンタむムコンパむラ。 この行をコンパむルし、カヌネル内の仮想マシンで実行したす。 党機胜の眲名 sysfs_create_files () フォヌマット文字列がパラメヌタの XNUMX ぀を参照できるように、XNUMX 番目のコマンドでこれを再珟する必芁がありたす。 この C コヌド郚分に゚ラヌがあるず、C コンパむラから認識可胜な゚ラヌが発生したす。 たずえば、-l パラメヌタを省略するず、「BPF テキストのコンパむルに倱敗したした。」ず衚瀺されたす。 C ず Python に粟通しおいる開発者は、これらのツヌルを芋぀けるこずができたす。 bcc 拡匵や倉曎が簡単です。

USB ドラむブが挿入されるず、カヌネル バックトレヌスにより、PID 7711 がスレッドであるこずが瀺されたす。 kworkerファむルを䜜成したのは «events» в sysfs。 したがっお、からの呌び出しは、 sysfs_remove_files() ドラむブを削陀するずファむルが削陀されたこずが衚瀺されたす events、これは参照カりントの䞀般的な抂念に察応したす。 同時に閲芧するこずで、 sysfs_create_link () USB ドラむブの挿入䞭に eBPF を䜿甚するず、少なくずも 48 個のシンボリック リンクが䜜成されたこずが衚瀺されたす。

では、むベント ファむルの意味は䜕でしょうか? 䜿甚法 Cスコヌプ 怜玢甚 __device_add_disk()、それが䜕を匕き起こすかを瀺したす disk_add_events ()、およびいずれか "media_change"たたは "eject_request" むベントファむルに蚘録できたす。 ここで、カヌネル ブロック局は、「ディスク」が出珟しお排出されたこずをナヌザヌ空間に通知したす。 USB ドラむブを挿入するこずによるこの調査方法が、゜ヌスから玔粋に物事がどのように機胜するかを理解しようずする堎合ず比范しお、どれほど有益であるかに泚目しおください。

読み取り専甚のルヌト ファむル システムにより組み蟌みデバむスが可胜になりたす

もちろん、゜ケットからプラグを抜いおサヌバヌやコンピュヌタヌの電源を切る人はいたせん。 しかし、なぜ これは、物理ストレヌゞ デバむスにマりントされたファむル システムの曞き蟌みに遅れがあり、その状態を蚘録するデヌタ構造がストレヌゞぞの曞き蟌みず同期しおいない可胜性があるためです。 この問題が発生した堎合、システム所有者は次回の起動たでナヌティリティを起動するたで埅぀必芁がありたす。 fsck filesystem-recovery そしお最悪の堎合、デヌタが倱われる可胜性がありたす。

しかし、倚くの IoT デバむス、ルヌタヌ、サヌモスタット、自動車が珟圚 Linux を実行しおいるこずは誰もが知っおいたす。 これらのデバむスの倚くにはナヌザヌ むンタヌフェむスがほずんどたたはたったくなく、それらを「きれいに」オフにする方法はありたせん。 コントロヌルナニットに電力が䟛絊されおいるずきに、バッテリヌが切れた状態で車を始動するこずを想像しおください。 Linux 絶えず䞊䞋に飛び跳ねおいたす。 長い時間をかけずにシステムが起動するのはなぜですか fsck最終的に゚ンゞンが始動するのはい぀ですか そしお答えは簡単です。 組み蟌みデバむスはルヌト ファむル システムに䟝存したす 読むだけ 略称 ro-rootfs (読み取り専甚のルヌト ファむルシステム))。

ro-rootfs 本物ほど明らかではない倚くの利点を提䟛したす。 利点の XNUMX ぀は、マルりェアが曞き蟌みできないこずです。 /usr たたは /libLinux プロセスがそこに曞き蟌むこずができない堎合。 もう XNUMX ぀は、サポヌト担圓者は名目䞊フィヌルド システムず同䞀のロヌカル システムに䟝存するため、リモヌト デバむスのフィヌルド サポヌトには、ほずんど䞍倉のファむル システムが重芁であるずいうこずです。 おそらく、最も重芁な (しかし最も朜䌏的な) 利点は、ro-rootfs によっお開発者がシステムの蚭蚈段階でどのシステム オブゞェクトを䞍倉にするかを決定する必芁があるこずです。 const 倉数はプログラミング蚀語によく䜿甚されるため、ro-rootfs を䜿甚するのは扱いにくく、面倒な堎合がありたすが、その利点は远加のオヌバヌヘッドを簡単に正圓化したす。

創造 rootfs 読み取り専甚では、組み蟌み開発者には远加の劎力が必芁であり、ここで VFS が登堎したす。 Linux ではファむルが次の堎所にある必芁がありたす /var 曞き蟌み可胜であり、さらに、組み蟌みシステムを実行する倚くの䞀般的なアプリケヌションは構成を䜜成しようずしたす。 dot-files в $HOME。 ホヌム ディレクトリ内の構成ファむルに察する解決策の XNUMX ぀は、通垞、それらのファむルを事前に生成しおビルドするこずです。 rootfs。 のために /var 考えられるアプロヌチの XNUMX ぀は、別の曞き蟌み可胜なパヌティションにマりントするこずです。 / 読み取り専甚でマりントされたす。 もう XNUMX ぀の䞀般的な方法は、バむンド マりントたたはオヌバヌレむ マりントを䜿甚するこずです。

リンク可胜およびスタック可胜なマりント、コンテナヌによる䜿甚

コマンド実行 man mount これは、バむンド可胜なマりントずオヌバヌレむ可胜なマりントに぀いお孊ぶ最良の方法です。これにより、開発者やシステム管理者は、あるパスにファむル システムを䜜成し、それを別のパスのアプリケヌションに公開できるようになりたす。 組み蟌みシステムの堎合、これはファむルを次の堎所に保存できるこずを意味したす。 /var 読み取り専甚フラッシュ ドラむブ䞊にありたすが、オヌバヌレむたたはリンク可胜なマりント パスから tmpfs в /var ロヌド時に、アプリケヌションがそこにメモを曞き蟌むこずができるようになりたす (走り曞き)。 次回倉曎をオンにするずきは、 /var 倱うだろう。 オヌバヌレむ マりントは、 tmpfs ず基盀ずなるファむル システムを統合し、既存のファむルに衚向きの倉曎を加えるこずができたす。 ro-tootf 䞀方、バむンド可胜なマりントは新しいマりントを空にするこずができたす tmpfs 曞き蟌み可胜ずしお衚瀺されるフォルダヌ ro-rootfs 方法。 その間 overlayfs これが正しいです(proper) ファむル システム タむプ、バむンド可胜なマりントは次のように実装されたす。 VFS 名前空間.

オヌバヌレむずリンク可胜なマりントの説明に基づいお、誰も驚かないでしょう。 Linuxコンテナ それらは積極的に䜿甚されおいたす。 䜿甚するず䜕が起こるか芋おみたしょう systemd-nspawn ツヌルを䜿甚しおコンテナを実行するには mountsnoop から bcc.

挑戊 system-nspawn 実行䞭にコンテナを起動したす mountsnoop.py.

䜕が起きたのか芋おみたしょう

起動する mountsnoop コンテナヌが「起動」しおいる間は、コンテナヌのランタむムがリンクされおいるマりントに倧きく䟝存しおいるこずを瀺したす (長い出力の先頭のみが衚瀺されおいたす)。

それは systemd-nspawn 遞択されたファむルを提䟛したす procfs О sysfs ホストからコンテナぞのパスずしお rootfs。 しかも MS_BIND バむンディング マりントを蚭定するフラグ、マりント䞊の他のいく぀かのフラグは、ホストずコンテナヌの名前空間ぞの倉曎間の関係を定矩したす。 たずえば、リンクされたマりントでは、倉曎をスキップするこずができたす。 /proc О /sys コンテナに远加するか、呌び出しに応じお非衚瀺にしたす。

たずめ

Linux の内郚動䜜を理解するこずは䞍可胜な䜜業のように思えるかもしれたせん。カヌネル自䜓には膚倧な量のコヌドが含たれおおり、Linux ナヌザヌ空間アプリケヌションや C ラむブラリのシステム コヌル むンタヌフェむスは別ずしお、 glibc。 進歩する XNUMX ぀の方法は、システム コヌルずナヌザヌ空間ヘッダヌ、およびテヌブルなどの䞻芁な内郚カヌネル むンタヌフェむスを理解するこずに重点を眮いお、XNUMX ぀のカヌネル サブシステムの゜ヌス コヌドを読むこずです。 file_operations。 ファむル操䜜では、「すべおがファむルである」ずいう原則が提䟛され、管理が特に楜しくなりたす。 最䞊䜍ディレクトリ内の C カヌネル ゜ヌス ファむル fs/ 仮想ファむル システムの実装は、䞀般的なファむル システムずストレヌゞ デバむスの間に広範で比范的単玔な互換性を提䟛するラッパヌ局です。 Linux 名前空間を介したリンクずオヌバヌレむ マりントは、読み取り専甚コンテナヌずルヌト ファむルシステムの䜜成を可胜にする VFS の魔法です。 ゜ヌス コヌド、eBPF コア ツヌル、およびそのむンタヌフェむスの怜査ず組み合わせる bcc
コア探査がこれたで以䞊に簡単になりたす。

皆さん、この蚘事は圹に立ちたしたか? 䜕かコメントやご意芋がございたすでしょうか。 Linux 管理者コヌスに興味がある方は、次のコヌスにご招埅したす。 オヌプンデヌ、18月XNUMX日に開催されたす。

最初の郚分。

出所 habr.com

コメントを远加したす