問題タブ [block-device]
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.
windows - Windowsで「ブロックデバイス」を作成する方法
Linuxに精通している場合は、モジュールを作成してブロックデバイスとして登録することができます。これにより、ユーザーはそれを通常のディスクとしてマウントできます(USBマスストレージなど、すべてのブロックI / Oはモジュールによって処理されます)。
Windowsでこれを行う方法はありますか?(Windowsでマウント可能なボリュームを作成する必要があります。生データは適切なインターフェイスから取得されます)。
c - ファイルシステムを実装するためのブロック特殊ファイル/デバイスの操作
FUSE を使用して基本的なファイルシステムを実装し、予見可能なすべての POSIX 機能を実装しました [もちろん、まだプロファイリングしていません ;)]。現在、通常のファイル(st_mode & S_IFREG)
でファイルシステムを実行できますが、開発の次のステップは、実際のブロック デバイスでホストすることです。コードをそのまま実行すると、デバイスst_size
で呼び出しfstat
た後、すぐに読み取りに失敗します。もちろん、問題がそこで止まるとは思っていません。
- 通常のファイルではなく、ブロック デバイスで操作するには、どのような変更が必要ですか?
- パフォーマンス、制限、特別な機能などに関して、特別に考慮する必要があることは何ですか?
- ブロック スペシャル ファイルの取り扱いに関するチュートリアルやリファレンスはありますか? グーグルはほとんど役に立ちません。私は背景知識 (皮肉なことに私の暗い過去の MSDN から) とマンページにいくつかの乏しい情報しか持っていません。
Update0
- 「通常のファイル」の意味を指摘しました。
- デバイスのサイズを取得することに集中したくありません。パフォーマンスと使用に関する通常のファイルとデバイス ファイルの違いに関する一般的なガイドラインが必要です。
linux - Linux で複数のファイルから構成されるループバック デバイスをプログラミングする
ねえ、
losetup
Linux でブロック デバイスをエミュレートするためにファイルを使用するのは比較的簡単です。
コンテンツを取得している複数のファイルに基づいて独自のブロックデバイスをプログラムしたい場合に、何を探すべきかについてのヒントを教えてください。ご理解いただくために、file1 からバイト 1 ~ 500 および 1.000 ~ 3.000 を取得し、file2 からバイト 501 ~ 999 およびバイト 3.001 ~ 5.000 を取得して、それらを組み合わせたブロックデバイスとして提供するとしましょう。私の好みのプログラミング言語は Python で、できるだけユーザー空間でプログラムを書きたいと思っています。
Windows の場合、そのような実装を見つけました。これは FileDisk および HttpDisk と呼ばれ、次の場所にあります。
よろしくお願いします、ライナー
linux - ファイルレベルでの USB 大容量ストレージ
課題: 私は、データを記録してディスクに保存する Linux ハンドヘルド デバイスを持っています。これらのデータは、USB 経由で Windows アプリケーションと交換する必要があります。ユーザーがこのデータにアクセスできる場合 (USB マスストレージなどを介して)、データを暗号化する必要があります。さまざまなOSで、citrix端末セッションなどでも、すぐに使用できるはずです。
計画: FUSEを使用してユーザー空間にファイル システムを作成し、大容量ストレージを介して Windows に提供します。Windows が 1 つのファイルにアクセスするたびに、コールバックを受け取り、その場でデータを暗号化します。さらに、いくつかの動的コンテンツを含めることができます。たとえば、パスワードがファイルに書き込まれると、より多くのコンテンツが表示されます。
問題: 大容量ストレージ ガジェット ( g_file_storage など) を使用する場合、ファイルまたはブロック デバイスのみを受け入れますが、ファイル システム (ディレクトリ) は受け入れません。なんで?
[...] データのセクターを読み書きするためのシンプルなインターフェイスを提供します。これは、ハード ドライブへのアクセスに使用される低レベル インターフェイスによく似ています [...]。オペレーティング システムは、USB ドライブをハード ドライブのように扱い、任意のファイル システムでフォーマットできます。(ウィキペディアより)
したがって、大容量ストレージを介して動的ファイルシステムを使用する機会はありません...これが、Android携帯電話をPCに接続すると、電話上のすべてのデータをアンマウントする理由のようです。
オプション:
- 「ユーザー空間にブロックデバイス」を作成します-FUSEに似ています(ファイルを動的に提供したい場合は、リバースFATドライバーが必要です)
- ブロックデバイスを作成するために独自の nbd サーバーを実装します (リバース FAT ドライバーも必要ですか?)
- 暗号化されたファイルをパーティションに保存し、このパーティションを大容量ストレージ ガジェットに渡します (問題は、パフォーマンスと動的相互作用の欠如です)
- 大容量ストレージ デバイスを提供せず、他のアイデア (eth over USB) に注意する
現時点では、最後のオプションのみが現実的であるように思われます - または、別のヒントはありますか?
私は感謝されます!
チャーリー
linux - 複数の構造体BIOを単一の構造体リクエストに結合するにはどうすればよいですか?
Linuxカーネルバージョン2.6.39.1に取り組んでおり、ブロックデバイスドライバーを開発しています。この点で、複数struct bio
のsを1つに結合し、デバイスドライバーで処理するために-にstruct request
追加します。request_queue
scsi_request_fn()
->bi_next
のフィールドを使用して、作成したstruct bio
複数struct bio
のをリンクしてみました。これにより、のリンクリストが作成されましたstruct bio
。submit_bio()
I / O用にブロックデバイスレイヤーにバイオを送信するように呼び出すと、コードがを想定しているため、これ BUG_ON()
がトリガーbio->bi_next
されますNULL
。
サービスのために下位レイヤーに送信する前struct bio
に、複数のを1つにリンクする方法はありますか?struct request
linux - Linux ブロック デバイスのリクエスト キューを特定するにはどうすればよいですか
ネットワーク経由でハードディスクを接続するこのドライバーに取り組んでいます。コンピューターで 2 つ以上のハード ディスクを有効にすると、最初のハード ディスクだけがパーティションを調べて識別されるというバグがあります。その結果、hda に 1 つのパーティションと hdb に 1 つのパーティションがある場合、hda を接続するとすぐにマウントできるパーティションができます。したがって、hda1 はマウントするとすぐに blkid xyz123 を取得します。しかし、先に進んで hdb1 をマウントすると、同じ blkid が表示され、実際には、ドライバーは hdb ではなく hda から読み取っています。
それで、ドライバーがおかしくなっている場所を見つけたと思います。以下は、間違ったデバイスにアクセスしているように見える最初の場所に配置した dump_stack を含むデバッグ出力です。
コードセクションは次のとおりです。
ここにログ出力があります。何が起こっているのか、どこで悪いコールが発生しているように見えるのかを理解するのに役立つコメントをいくつか追加しました。
これが十分な背景情報であることを願っています。おそらく現時点で明らかな疑問は、「request_queues はいつ、どこに割り当てられるのか?」ということです。
これは add_disk 関数の少し前に処理されます。追加ディスクは、ログ出力の最初の行です。
私の知る限り、これは標準的な操作です。それでは、元の質問に戻ります。どこかで要求キューを見つけて、新しいデバイスごとにインクリメントまたは一意であることを確認できますか?それとも、Linux カーネルはメジャー番号ごとに 1 つのキューしか使用しませんか? このドライバーが 2 つの異なるブロック ストレージに同じキューをロードしている理由を突き止め、それが初期登録プロセス中に blkid の重複を引き起こしているかどうかを判断したいと考えています。
私のためにこの状況を見てくれてありがとう。
c - 複数のスレッドを使用したファイルへの同時書き込み
flags を使用してファイルを開くユーザーレベルのプログラムがありますO_WRONLY|O_SYNC
。このプログラムは、それぞれ 256 バイト以上のデータをファイルに書き込もうとする 256 個のスレッドを作成します。合計で 1280000 件のリクエストが必要で、合計で約 300 MB のデータになります。1280000 件のリクエストが完了すると、プログラムは終了します。
pthread_spin_trylock()
完了したリクエストの数を追跡する変数をインクリメントするために使用します。各スレッドが一意のオフセットに書き込むようにするために、pwrite()
既に書き込まれた要求の数の関数としてオフセットを使用して計算します。したがって、実際にファイルに書き込むときはミューテックスを使用しません (このアプローチはデータの整合性を保証しますか?)
呼び出しがブロックされた平均時間pwrite()
と対応する数値 (つまり、BIO の完全なライフサイクルの時間の尺度である平均 Q2C 時間) を使用しblktrace
て確認すると、有意差。pwrite()
実際、特定の BIO の平均完了時間は、通話の平均待ち時間よりもはるかに長くなります。この不一致の背後にある理由は何ですか? O_SYNC
データが返される前に実際に物理メディアに書き込まれることを保証するため、これらの数値は似ているはずではありませんか?
c - デバイス名でデバイスフラグを取得する
あなたが私を助けてくれることを願っています:私はデバイスが取り外し可能かどうかを判断しようとしています、私が持っているのはデバイス名(/ dev / sdc)だけです。実際、このファイルのフルパスによって、リムーバブルメディアまたはローカルディスク上のファイルがいつになるかを判断する必要があります。
current-> fs-> pwdで検索しようとしました が、ここで見つけたのはフラグのセットだけです:* current-> fs-> pwd.mnt-> mnt_sb-> s_bdev-> bd_disk-> flags *ここで、GENHD_FL_REMOVABLEはリムーバブルデバイス用に設定されています
しかし、私は常に同じフラグを設定します(私が理解しているように、s_bdevは常に同じデバイス(/ dev / sda)を指します)。
だから今私はmtabを解析することによって私のファイルを含むデバイス名(/ dev / sdc)を取得しますが、それでもそれを見つけることができないか、それを削除できるかどうか。
デバイス名でblock_device構造を取得する方法はありますか?(たとえば、「ファイル」構造は、fd = open( "name")fl = fged(fd)を呼び出すことで取得できます。ここで、flは「ファイル」構造を指します)
windows - EC2 ブロック デバイス マッピングのリストと Windows ドライブ間のマッピング
EC2 ブロック デバイス マッピングのリストと Windows ドライブ間のマッピングはどのように行われますか?
たとえば、指定した場合-b "/dev/sdb=snap-XXXXXXX" -b "/dev/sdc=ephemeral0"
Windows インスタンスの起動中に、D:\ を EBS ボリューム スナップショットに、E:\ をエフェメラル ストレージにマッピングします。マッピングを逆の順序で指定すると、同じことが行われます。Windowsドライブでこのマッピングが実際にどのように行われるか知りたいですか? インスタンスの起動後に何かを保存する必要があるため、エフェメラルストレージがどのドライブにマップされるかを知ることは実際に重要です。
ありがとう!
linux - Linux でマウントせずにデバイス情報をブロックする
Linux、C++ でブロック デバイスの情報 (具体的にはブロック サイズ) を取得しようとしています。デバイスをマウントせずに、おそらく動的ファイル (のような/sys
) を調べることなく、システム コールのみでデバイスのブロック サイズを取得することは可能ですか?
で試していましたが、 について尋ねると、ファイルシステムstat
に関するデータが返されます。/dev
/dev/sdb2
システムコールで無理な場合、動的ファイルのどこを調べればよいでしょうか(見つけられませんでした)。