カーネル/VM Advent Calendar 8日目 : Plan9で作るお手軽 Packet Recorder & Generator       の予定でしたorz

この記事はカーネル/VM Advent Calendar2011のためにかかれたものです。

前回に引き続き今年もPlan 9なネタでいきたいと思います。


が、残念ながら完成までこぎ着けられなかったので、出来たあたりまでのお話をしたいと思います
m(_ _)m


''ことのあらまし''
ネットワーク周りを弄っていると、いろいろなテストを目的として出来る限りのトラフィックを流したいという場合があります。えっ、ないって?

OKANEMOCHIならトラフィックジェネレータ箱を買って云々といった事も考えられます。しかし我々貧乏人はiperf、flood ping、tcpreplayなどのソフトウェアに頼るしかありません。とはいえこれらのソフトは9には無かったりといろいろ困ったものです。

また、iperfやpingについてはあくまで計測用のトラフィックでありそれっぽい多彩な(どんなだ)パケットが流れないといった懸念もあります。さらに、ネットワークをいぢめぬくという観点では, トラフィックレコードを利用するにあたってもいくつか工夫が必要です。

そこで今回は, 9向けに簡単なトラフィックレコーダ&負荷発生向けパケットジェネレータを作ってみます。出来る限り全力でパケットを投げつけるために、試しにドライバレベルでこれを行ってみました。


''環境''
ドライバレベルで、という制約のためどこでも動くという訳にはいきません。今回はPlan 9用実験マシンとして使っているThinkpad X60を用います。
この子にはNICとしてintelの82573が載っています。ちょうど良い具合にPlan 9ではこの82573向けのドライバがether82563.cとして用意されているので、これを改造するところから始めます。


''ぼくの考えたさいきょーのぱけっとじぇねれーた in 9''
ドライバレベルのパケットジェネレータということで、ここでは以下のような運用モデルを考えます。Plan 9なのでもちろんインタフェイスはファイルです

  1. "echo rec > packetgencmd" でパケットのレコード開始
  2. 適当に通信をしてトラフィックを流す
  3. "echo recstop > packetgencmd"でパケットのレコード終了
  4. "echo start > packetgencmd"で記録したパケットを全力で送信開始
  5. いぢめる
  6. "echo stop > packetgencmd"でパケットの送信を終了


''やってみる''
今回のそれはいろいろてきとーな実装なのでいくつか制限があります。

  1. 記録は128個まで! recstopはなし! 一杯になったら上書き! ジェネレート開始しても自動終了!
  2. パケットの送信は何らかの通信を契機に開始!
  3. 全部 on memory! きちんとしたメモリの考慮なにそれおいしいの

いろいろと屑いですがまぁなんとかやってみましょう

目的として、出来る限り全力でパケットを送り続けて貰いたいわけですが、ひとまず送信処理を継続して行い続けるあたりから始めてみます。


''ドライバの中身''
ドライバのソース自体はここにあります.

主な変更点は以下の3つです。

  • レコード&ジェネレートの操作インタフェイス追加
  • ドライバ側の送信処理での、キューが空の場合の動作
  • ドライバ側の送信済みデータの扱い


''使い方''
まずはソースを落としてきましょう。これはpc(x86)向けのドライバなので/sys/src/9/pc以下にコピーします。

次にカーネルのコンフィグファイルを編集します。今回のデバイスドライバ''devpackgen''という名前なので''packgen''バイスを/sys/src/9/pc/pcfに組み込むよう設定します。

さてカーネルコンパイルしましょう. pcfカーネルなので、9pcfというイメージができあがっているハズです。

% cd /sys/src/9/pc
% mk 'CONF=pcf'
% ls 9pcf
9pcf

これを起動できるように設定します。ここでは起動時に, pg9pcfという名前で表示されるようにリネーム等を行っています。

% cd /sys/src/9/pc
[ 9fat領域 (カーネルイメージをしまっておく場所 ) を/n/9fat以下にマウント ] 
% 9fat:
% ls /n/9fat
....

[ 先ほど生成したカーネルをここにコピー (pg9pcfにリネーム) ]
% cp 9pcf /n/9fat/pg9pcf

[ 起動時に選択肢に現れるように/n/9fat/plan9.iniに以下の行を追加 ]
bootfile=sdC0!9fat!pg9pcf

カーネルの配置が終わったら再起動し、pg9pcfカーネルを起動します。



実際にレコード&ジェネレートをするには, packgenドライバをロードする必要があります。このために、まずこのデバイスのファイルツリーを適当な位置にマウントします。

% bind -a '#G' /mnt/pg
% ls /mnt/pg
/mnt/pg/packgencmd

これでドライバのロードが完了です。


''やってみた''
さて、実際に動かしてどんなものなのかみてみましょう。まずは以下のコマンドでパケットの記録を開始します。

% echo rec > /mnt/pg/packgencmd

その後、適当に通信をしてなんとなく記録した気分になりましょう。

次に実際にパケットのジェネレーションを開始します。

%echo start > /mnt/pg/packgencmd

これでパケットの送信を開始
といきたいところですが、パケット送出をキックする部分が送信処理の一部に組み込まれているため、ping一発程度を打ってやる必要があります。


現状、残念ながらある程度パケットを送り出した後にパニックするので使い物になりませんorz



お粗末様でした。



''終わりに''
アイディアをくださった@rshさんに感謝!