私はガレージセールでKernighanとPikeによって書かれた「The Unixプログラミング環境」のコピーを受け取りました。私はUNIXファイルシステムに関する章に非常に興味がありました。もちろん私はこの詩も興味深いと思います。
さて、ディレクトリのバイトを見てみましょう。
$ od -cb . 0000000 4 ; . \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 064 073 056 000 000 000 000 000 000 000 000 000 000 000 000 000 ....
長すぎて書いてはいけません。要点は、システムに保存されているディレクトリを表示することです。私はそれを試すためにすぐに私のラップトップ(Debian)に走りました。本に記載されているように命令を入力しました。
$ od -cb .
od: .: read error: Is a directory
0000000
明らかに、ディレクトリの元の内容を見ることはできません。これが私の問題です。
Linuxカーネルは元のUNIXカーネルとは異なるディレクトリを保存しますか?そうでなければ、ユーザーにディレクトリの実際のバイトを隠す必要があるのはなぜですか?
答え1
各ファイルシステムタイプはディレクトリをさまざまな方法で保存します。高スループットに適した、高い並行性に適しており、限られたメモリ環境に適しており、読み取りと書き込みのパフォーマンス間のさまざまなトレードオフ、複雑さ、信頼性など、さまざまな特性を持つさまざまな種類のファイルシステムがあります。あなたの本は、初期のUnixシステムで使用されたファイルシステムを説明します。最新のシステムは、さまざまなファイルシステムをサポートしています。
初期バージョンのUnixには、カーネルの外部で多くのファイルシステム操作がありました。たとえば、一部のファイルシステムデータ構造を直接編集して作業できますmkdir
。rmdir
これは統合ディレクトリアクセスインターフェイスにすばやく置き換えられました。opendir
readdir
//closedir
シリーズは、アプリケーションが後でどのように実装されるかを知らずにディレクトリを操作できるようにします。
Linuxでディレクトリの内容を読み取れないのは、ディレクトリの内容を隠す必要があるためではなく、その機能が実装されている場合にのみ存在し、この機能は意味がなく、コストがかかるためです。形式がファイルシステムによって異なることを考慮すると、これは無意味な機能です。プログラムは読んでいる内容の形式を知る方法がありません。両方をサポートすることは完全にマイナーな機能ではありません。一部のファイルシステムは、バイトストリームよりも多くの方法でディレクトリを構成します。たとえば、次のように設定できます。Bツリー。一部のUnix亜種では、以前のバージョンとの互換性のためにアプリケーションがディレクトリの内容を直接読み取ることができますが、Linuxにはこの機能はありません(私が覚えている限りはありませんでした。ない機能でした)。
答え2
はい、しかし:
- 最新のシステムはファイル名をさまざまな方法で保存します。もともとUnixでは、名前は14文字に制限されており、そのうちの2バイトがinodeとして使用されていました。
- ディレクトリへのインタフェースは、次の関数を介して行われます。
opendir
、readdir
、closedir
open
read
ではなく、close
組織の変化を反映しています。 - 実際には16バイトのディレクトリエントリを読む必要がある人はいないので、デザイナはrawディレクトリファイルを読み取るように設計されたプログラムからrawディレクトリファイルを読み取る機能を無視しました。文書。
追加資料:
- ガイド:LinuxでCプログラミングにディレクトリを使用する
- opendir、readdirなどに関する質問です。、1990年のUsenetスレッドに関する議論現代実装
opendir
など
答え3
はい、LinuxカーネルはVFSを使用してさまざまなファイルシステムを抽象化し、ディレクトリの使用を許可しませんread(2)
。
ただし、Linux EXT2/3/4ファイルシステムのディレクトリの生の内容に本当に興味がある場合は、このdebugfs(8)
ユーティリティを使用できます。このユーティリティを使用すると、e2fsprogs
ディレクトリを通常のファイルに読み込んだりダンプしたりできます。