問題タブ [ext2]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux - ブロックサイズのサイズ制限
Ext2 の wiki エントリによると、「Linux ではブロック サイズはアーキテクチャ ページ サイズによって制限されます。」
この制限は、典型的なファイル システム (ext2 など) ではデータがページ単位で処理されるため、アーキテクチャ ページ サイズを使用するとパフォーマンスが向上するためだと思います。
私の質問は次のとおりです。この制限が実装されている正確な場所を教えてください。だから私はページサイズ(通常は4k)よりも小さいフォーマットにすることはできませんか?
ありがとう
c - ext2ブロックグループからiノードテーブルを読み取る方法は?
趣味のOS用のext2ドライバーを作成しているときに、ブロックグループ記述子からiノードテーブルを読み取るときに問題が発生しました。
ブロックグループ記述子の3番目のフィールドは、そのグループのiノードテーブルのブロックIDです。私のファイルシステムのルートディレクトリの場合、これは64として返されます。スーパーブロックはブロック1にあり、ボリュームの先頭から1024バイト過ぎています。ブロックサイズは1024バイトですが、私のディスクセクターサイズは512です。したがって、スーパーブロックにアクセスするために、lba2から読み取ります。
問題は、iノードテーブルを読み取ろうとしたときです。ブロックIDが64で、ブロックサイズが1024、ディスクセクターサイズが512の場合、ディスクセクター130からiノードテーブルを読み取りませんか?私はそれをしますが、何もありません...
有効なブロックグループ記述子が与えられた場合にiノードテーブルを読み取る適切な方法は何ですか?
filesystems - ext2 ディレクトリ エントリ名は、有効なファイル システムで null で終わることが保証されていますか?
これは簡単な質問だと思ったのですが、答えが見つかりません。私は主にこれらの仕様を読んでいます:
http://www.nongnu.org/ext2-doc/ext2.html
ディレクトリエントリの名前がヌルで終わるはずかどうかについては言及していないようです。未定義だと思います。name_len フィールドがあるので、とにかく名前を簡単に出力できます。
ext2 ディレクトリ名は null で終わることが保証されていますか?
趣味の OS で ext2 ドライバーをテストしているときに、いくつかのディレクトリ名を印刷したときに最後にゴミ文字が出てくることに気付いたので、質問します。単純に name_len 文字を出力すれば問題ありませんが、null で終了していれば問題ありません。
ありがとう!
c - USB2 接続の ext2 ボリュームで小さなファイルの読み取り時間を改善
私は Linux プログラマーよりも経験豊富な Windows プログラマーです。明らかな何かが欠けている場合はお詫び申し上げます。
Linux を実行している USB2 接続の ext2 ボリュームで 10,000 個を超える小さなファイル (~2->10k) を読み取る必要があります。ディストリビューションはカスタムで、busybox を実行します。
これらの書き込みを改善するためのヒントを期待しています。私は次のことをやっています
私の読み取りは小さいので、この1つの read() は1回の呼び出しで仕事をする傾向があります
パフォーマンスを向上させるためにできることはありますか? これは USB2 (リムーバブル) ディスク上で動作する Linux のカスタム ディストリビューションであるため、明らかなカーネル設定やマウント オプションが不足している可能性はありますか?
ありがとう!
c - ext2ブロックへのカーネルメモリの書き込み
大学の課題では、ext2ファイルシステムを変更して、ファイルが60バイト未満の場合はiノードのブロックポインターにファイルを保存し、ファイルがそれより大きくなると通常のブロックストレージに移動する必要があります。
2.6 linuxカーネルソースからext2コードをコピーし(指示どおり)、そこから移動しました。
ファイルが60バイトより大きくなると、現在iノードのブロックポインタ配列にあるデータを実際のブロックにコピーする必要があります。したがって、カーネルメモリをext2ブロックに書き込む必要があります。の単純な呼び出しdo_sync_write
は、ユーザースペースのメモリを必要とするため、ここでは機能しません。
私はの実装を見てきましたがdo_sync_write
、それが何をするのかを実際に複製する方法はわかりませんが、代わりにカーネルメモリを使用します。
これは、この特定の部分の現在の実装です(機能しません):
編集:
シンボリックリンクを見ました。基本的に、ext2には「高速シンボリックリンク」の概念があります。つまり、リンク名の長さは60バイト未満です。高速シンボリックリンクの場合、データはブロックポインタに格納されます。これは簡単に実行でき、通常のファイルにはすでに実装しています。リンクが高速シンボリックリンクでない場合、データは通常のファイルと同じ方法で処理されます。私は正方形に戻ったと思います。
c - ext2ファイルシステムへのマウントオプションの追加
割り当てのためにext2ファイルシステムを変更しています。ファイルシステムがマウント解除されるまで有効なマウントオプションを追加する必要があります。オプション列挙型にオプションをすでに追加しており、指定されている場合を処理しています。
オプションはキーと値のペアであるため、値をどこかに格納する必要がありますが、どこにあるのかわかりません。他のext2キー/値ペアオプションはに保存されstruct ext2_sb_info
ます。
を変更できないかstruct ext2_super_block
、のどのソースファイルにも定義されていないためです。struct ext2_sb_info
struct super_block
/usr/src/linux-source/fs/ext2
struct ext2_super_block
のs_reserved
メンバーに書き込むのは安全ですか?この値を保存できる場所は他にありますか?
c - ディレクトリの子の参照を保存する
プロジェクトでは、プログラムはディレクトリの各子の参照/識別子をその変数 (スタックなど) に保存する必要があります。つまり、ディレクトリが読み取られると、プログラムはすべての子に対して再度 pathlookup を実行してはなりません。
その方法がよくわかりません。inode番号が格納されている場合、対応するファイル/ディレクトリにinodeからアクセスできないからですよね?
いくつかの指針に感謝します
ありがとう
編集:「pathlookupを再度実行してはならない」という私の理由.....スレッドはファイルシステムツリーを深さから最初に読み取っており、ディレクトリを読み取ると...その子の識別子は、それに続くために保存されます再び深さ第一の方法。識別子を保存する理由は、読み取られたディレクトリが同時スレッドによってファイル システムの別の部分に移動される可能性があり、移動されたディレクトリの下のサブツリーが、ツリーのその部分が既に走査されているために読み取られない可能性があるためです。
windows - Windows 用のユーザーモード ext2 ファイルシステム ライブラリはありますか?
Windows のアプリケーション内から、ext フォーマットのボリュームから多数のファイルを読み取ることができる C/C++ ライブラリを見つけたいと思っています。このボリュームを従来の方法でマウントする必要はありません。必要なのは、ファイルへの API アクセスだけです。読み取り専用で大丈夫です。私の 1 つのアプリケーションは、ボリュームへのアクセスを必要とする唯一のアプリケーションです。
要するに、Windows 用のインストール可能なファイルシステムの代わりに、ドライバーをインストールする必要がないようなライブラリーを好みます。ディスクがいつ到着したか、ボリュームの場所などを検出できます。
私にとって最も重要なのは、インストールされたファイルシステムを必要とせずに、ボリュームからファイルを確実に読み取る機能です。
書き込みサポートは必要ありません
c - system()を使用して外部プログラムを介して作成されたファイルとopen()を介してファイルを開く間に必要な遅延?
プログラムからTARアーカイブを作成し、アーカイブを開いてさらに処理しようとしています。system()
呼び出しとの間に2秒の遅延がありopen()
ます。これまでのところ、問題なく動作しますが、なぜ2秒の遅延が必要なのか、それが正しい解決策であるのかはわかりません。
遅延なしで、呼び出しからエラーコード2(ENOENT "No such file or directory")を受け取りますopen()
。私の最初の考えは、ファイルシステムがそれ自体を十分に速く更新してopen()
おらず、ファイルを見つけることができなかったということでした。しかし、システムが本当にビジーな場合はどうなるでしょうか。もっと長い遅延が必要ですか?open()
遅延ではなく成功するまでループする必要がありますか?問題はまったく違うものですか?
UPDATE
ルートファイルシステムはEXT2です。/tmp
TMPFSを使用してRAMにマウントされます。アーカイブの内容を抽出するのではなく、アーカイブを作成するtar
ために使用しています。基本的に、私のプログラムはいくつかのログファイルのアーカイブを作成し、それらをネットワーク経由で送信することになっています(そのため、作成後にアーカイブを開きます)。
filesystems - USB上のExt2ファイルシステム
OSをプログラミングするためのリソースとしてosdevwikiを使用しています。これまでのところ、最小限の32ビットプロテクトモードカーネルを備えた2ステージのブートローダーがあります。
ただし、ブートローダーについては、特定のセクターへの書き込みと特定のセクターからの読み取りを行っており、「正しい方法」でファイルシステムを使用することにしたので、ext2ファイルシステムを選択しました。 、wikiにはドキュメントがあります。そこで、Ubuntu 11.10でgpartedを使用してフラッシュドライブをext2でフォーマットし、lde(Linuxディスクエディター)を取得して、フラッシュドライブで実行しました。
問題は、ext2ページで説明されているようにテーブルが表示されないこと、バイト1024(0x400)などを確認したこと、およびテーブルが見つからないことです。gpartedに戻りましたが、まだフォーマットされています。また、ext2と指定しても、ldeは「認識されないファイルシステム」と表示します。フラッシュドライブは標準のext2ファイルシステムを使用していませんか、ファイルシステムがページに記載されているものに似ているほど変更されていますか、それとも適切な場所を探していませんか?
リンク:
Ext2- http: //wiki.osdev.org/Ext2
OsDevWiki- http: //wiki.osdev.org/Main_Page