2017-01-01から1年間の記事一覧

64ZiB ほしい!

SCSI プロトコルでは、デバイスの容量を取得するために、READ CAPACITY(10) や READ CAPACITY(16) を提供している。 これらのコマンドは、Logical Block Address(LBA) とロジカルブロックのバイト数でのサイズを返すことができる。 (10) と (16) の違いは、…

VirtIO と TCMU

VirtIO は準仮想化のフレームワークで、ゲストOSで特別なハードウェアを用意して VMM と直に通信する方法を提供してくれる。 実装的には virtqueue というメモリ空間をゲストと VMM で共有することでデータ送受信を可能にしているらしい。 ここまでは良いの…

tcmu と IO スケジューラ

前回、tcmu でブロックデバイスを作ってみたが、思ったより性能が出なかった。 IO completion が遅いのだと思ってスレッド化してみたが、もとより少々遅くなってしまった。 ところがふと、IO スケジューラを確認してみると、cfq スケジューラを使っているこ…

tcmu でブロックデバイスを作る

tcmu は LIO のバックエンドの一つで、UIO を使って SCSI をコマンドをユーザーランドと通信する。 ドキュメントがかなり詳しく書いているのでわかりやすい。 https://www.kernel.org/doc/Documentation/target/tcmu-design.txt SCSI コマンドやデータのやり…

NBD で複数ソケットを使う

NBD では 4.10 から一つのブロックデバイスに対して複数のソケットをアサインすることができるようになった。 github.com github.com 前回使ったコードを適当に変更して複数ソケットをマルチスレッドでさばくようにした。 また fio で適当に計測してみた。 #…

NBD で遊ぶ

Linux の Network block device を使ってユーザーランドブロックデバイスを作って遊んでみた。 github.com バックエンドは単純なメモリを使っているので、前回と同様に fio を使って計測してみた。 rw: (g=0): rw=randrw, bs=(R) 4096B-4096B, (W) 4096B-409…

loopback block device で遊ぶ

linux にはいろんな仮想ブロックデバイスが存在して、ものによっては機能がかぶっていたりする。 今回は、ファイルをブロックデバイスとして見せる、loopback block device で遊んでみた。 まずは伝統的な loop モジュールによるもの。 arch で使うには modp…

EdgeRouter PoE の復旧

EdgeRouter の SNMP が取れなくなっていたので、ログを見たら IO エラーが出ていたので USB フラッシュが死んだらしい。 ネットワークは生きていたので、再起動とかはしないで、代替の USB フラッシュドライブとシリアルケーブルを購入しておいた。 購入した…

bindgen を使って rust binding を生成する

Rust は C API をゼロオーバーヘッドで呼び出せたりして便利なんだけど、当然バインディングは行わないといけない。 crates.io を探せばおおよそのものは見つかるけど、見つからなかったり、見つかっても古かったりして更新したいときがある。 そんなときは…