Linux 上のディスクのキャラクターデバイス

Linux 上のディスクのキャラクターデバイス

Linux ではストレージ デバイスにキャラクタ デバイスが必要ないのに、他の UNIX システムではなぜ必要なのでしょうか?

他の UNIX OS (AIX、HPUX、Solaris、macOS) では、ストレージ デバイスに '/dev/rdisk#' や '/dev/disk#' などが使用されます。

答え1

このウィキペディアの記事はhttps://en.wikipedia.org/wiki/Raw_deviceとてもわかりやすく説明されています:

コンピューティング、特に Unix および Unix 系オペレーティング システムでは、raw デバイスは、文字デバイス ファイルに関連付けられた特殊な種類の論理デバイスであり、オペレーティング システムのキャッシュとバッファをバイパスして、ハード ディスク ドライブなどのストレージ デバイスに直接アクセスできます (ただし、ハードウェア キャッシュが使用される場合もあります)。データベース管理システムなどのアプリケーションは、raw デバイスを直接使用できるため、データのキャッシュ方法をオペレーティング システムに委ねるのではなく、アプリケーション側で管理できます。

FreeBSD では、すべてのデバイス ファイルは実際には raw デバイスです。バッファ管理を簡素化し、スケーラビリティとパフォーマンスを向上させるために、FreeBSD 4.0 では非 raw デバイスのサポートが削除されました。1

Linux カーネルでは、O_DIRECT フラグを代わりに使用できるため、raw デバイスは非推奨となり、ある時点で削除される予定でした。

答え2

ブロック デバイス インターフェイスを使用する場合に raw インターフェイスを使用する理由は、raw インターフェイスの方が通常は高速であるためです。オペレーティング システムは、ブロック特殊ファイルに対してのみバッファー キャッシュを実行します。

非常に大きなファイルを磁気テープなどのメディアから読み取ったり、メディアに書き込んだりする場合、ブロックが複数回読み取られることはないため、オペレーティング システムによるバッファ キャッシュにはメリットがありません。raw デバイス インターフェイスを使用すると、このような余分なシステム アクティビティを回避できます。

磁気メディア上の非常に大きなストリーム ファイルを処理するときに raw デバイス インターフェイスを使用するもう 1 つの理由は、raw インターフェイスが非常に大きなブロック サイズをサポートし、非常に高いデータ転送速度を実現できることです。ブロック デバイス インターフェイスを使用してデバイスにアクセスする場合、すべての読み取りと書き込みはシステム バッファを通過する必要があるため、ファイル システムのブロック サイズ (通常は 1K または 2K バイト) に制限されます。raw デバイスを使用する場合は、32K 以上のブロック サイズを使用できます。--John J. Valley、UNIX プログラマーズリファレンス; 1991年版

パフォーマンスの向上とは別に、キャッシュの一貫性を保つために、ブロック インターフェイスを介してアクセスされるファイル システムをマウント解除する必要がありました (現在も必要ですか?)。システムによってキャッシュされたブロックは、ディスクに書き戻されるときに、ブロック デバイスを介して行われた変更を上書きする可能性があります。fschk の前にマウント解除するのは少し面倒ですが、直接アクセスを必要とするアプリケーションがシステムの主な用途である場合は、さらに面倒です。

元の質問に対する回答ですが、問題の多くは主に歴史的なものです。現代のシステムでは、デバイス バッファがシステム バッファよりも大きくなることはまれです。(ワークステーションのメモリよりも大きなバッファを持つ高速プリンタに接続されたワークステーションを最後に使用したのはいつですか?)

関連情報