特別なデバイスファイルにiノードがあるのはなぜですか?


11

デバイスファイル自体はファイルではありません。これらは、Unixライクなオペレーティングシステムでデバイスを使用するためのI / Oインターフェイスです。これらはディスク上のスペースを使用しませんが、stat次のコマンドで報告されるようにiノードを使用します。

$ stat /dev/sda
      File: /dev/sda
      Size: 0               Blocks: 0          IO Block: 4096   block special file
Device: 6h/6d   Inode: 14628       Links: 1     Device type: 8,0

デバイスファイルはファイルシステムの物理的な iノードを使用しますか、なぜそれらを必要とするのですか?


2
iノードとデータファイルです。iノードがないと、ファイルはありません。(ただし、デバイスファイルにはデータがありません)
user253751

回答:


16

簡単に言えば、物理的なファイルシステムのバッキングがある場合にのみ機能します/dev(そして、最新のLinuxディストリビューションを使用している場合は、おそらくそうではありません)。

長い答えは次のとおりです。

これはすべて、すべてがファイルであるという元のUNIX哲学に戻っています。この哲学は、UNIXを多用途にした理由の一部です。なぜなら、物理ハードウェアと直接やり取りするためにアプリケーションに特別なコードを持たなくても、ユーザー空間からデバイスと直接やり取りできるからです。

もともとは、/devデバイスファイルを置く有名な名前を持つ別のディレクトリでした。UNIXシステムの中にはまだこのアプローチを採用しているものがあり(OpenBSDはまだそうだと思います)、システムが実際に持っていないデバイス用のデバイスファイル(たとえば、すべてのファイル可能なすべてのディスク上の可能なパーティション)。これにより、メモリの容量と起動時の時間が節約されますが、ディスク容量が少し増えますが、初期のシステムは一般にメモリが非常に制約され、高速ではないため、トレードオフになります。これは一般に、「静的」と呼ばれます/dev

最新のLinuxシステム(そしてFreeBSDとおそらく最新バージョンのSolarisも信じています)/devは、カーネル(またはSystemdを使用している場合はudev、カーネルがほとんど何もしないと信頼していないため)によって設定された一時的なインメモリファイルシステムです。 。これにより、メモリ(通常は数MB未満)と非常に小さい処理オーバーヘッドを犠牲にして、ディスク領域を節約できます。また、他にも多くの利点があり、最大の1つは、ホットプラグされたハードウェアを検出しやすいことです。これは一般に、ダイナミックと呼ばれ/devます。

ただし、どちらの場合でも、デバイスノードは通常のVFSレイヤーを介してアクセスされます。つまり、定義上、iノードが存在する必要があることを意味stat()します。これは/dev、iノードをメモリに格納するか、必要に応じて生成するため、動的を使用するシステムに/devは影響がありません。また、inodeはディスク上のほぼゼロのスペースを占め、ほとんどのファイルシステムには上限がないため、静的な場合はほぼゼロの影響です。それらまたは誰もが必要とする可能性が高いよりもはるかに多くの方法を提供します。


3
慎重に手を挙げます。サーバーでiノードが不足するプロジェクトに参加しました。最終的に、私たちのチームが経営陣に説得する必要があった危機でした。バックエンドシステムの交換に投資する必要がありました。
KRyan 2017

@KRyan発生する可能性がありますが、最近では、管理者がファイルシステムの作成時に明示的に数を減らしない限り、まれです。最近の多くのファイルシステム(少なくともNTFS、BTRFS、およびZFS、XFSもそうかもしれません)は、実際にiノードを動的に割り当てているため、多くの新しいシステムでは、実際に実行することは不可能です。
オースティンヘンメルガーン2017

@KRyan私もその問題を抱えています。そしてそれは実際によく設計されたシステムであり、少し日付が付けられて極端になりました(各トランザクションには独立したログが必要であり、ディスクに保持され、最終的には小さな小さなiノードでいっぱいになりました)
coteyr 2017

1
Odとdockerは、まさにこのiノードの問題を引き起こすことで有名です。
coteyr 2017

@AustinHemmelgarn extファミリは、静的な数のiノードを持つことで悪名高くなります(その後、不足します)。また、偶然にも、おそらく非常に大きなマージン(XFSに大量のデータを保存するシナリオで、ZFSとBTRFSは比較的新しい)で最も使用されるLinuxファイルシステムであり、ほとんどのディストリビューションではデフォルトです。もちろん、最近のシステムでは、デフォルトの最大iノードは、これまでにあるデバイスファイルの数よりも数桁大きくなっています。
ボブ

15

デバイスファイルにも権限があり、それらはiノードに保存されます。


言及するのを忘れていた素晴らしい点。
オースティンヘメルガルン

5
アクセス許可だけでなく、ファイルの種類やその他のメタデータも含まれます。従来、ディレクトリ自体には名前とiノード番号のみが含まれています。iノードを読み取るまで、ファイルがデバイスであることを示すものは何もありません。
Gilles「SO-邪悪なことをやめよう」

12

ディレクトリは単にファイル名からiノードへのマッピングなので、名前が参照するもの(ファイル、シンボリックリンク、デバイス、FIFO、ソケット)に関するすべてがiノード内にある必要があり、他に置く場所はありません。

デバイスに関する情報はiノードに保存されます。メジャーデバイス番号とマイナーデバイス番号、アクセス許可、タイムスタンプなどがあります。通常のファイルではなくブロックまたはキャラクターデバイスであることを示すtypeフィールドがそこに格納されます。

デバイスのiノードは、ファイルのブロックマップを含むフィールドを使用しません。


0

iノードがないと、問題のデバイスに関するすべての情報を保持するためのファイル名しか取得できません。これは、「素敵な」デバイス名/dev/sdaは問題外であることを意味します/dev/ohci/sda。たとえば、のような特定のドライバに関連付けられる名前が必要です。

さらに重要なのinode(のように依存しているすべてのツールはstatlsなど)の下に御馳走のパスに変更しなければならないであろう/dev特別な方法で。これは、現在の状況と比較して明らかな利点がない、非常に大量の作業になります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.