2008年6月17日火曜日

PACKET_MMAP #2

ごめんなさいっ。libpcap のパッチおかしかった。修正しましたので、以前のものを持って行った方は、取り直して下さい、すいません。でパッチのあて方ですが、debian 前提で etch lenny 共に
apt-get source libpcap0.8
して、ソースディレクトリに cd した後
etch
これ持って行って
patch -p1 < libpcap0.8-etch.patch
./debian/rules binary
で上位ディレクトリに deb パッケージが出来ます。

lenny
持って行くモノがこれ - libpcap0.8-lenny.patch 以外は etch と同じです。
以前も書きましたが configure で root 権限が必要なシステムコール使っていますので、fakeroot では無効のままです、ご注意下さい。生? の debian/patches はそれぞれ etch用lenny用にあります。また修正があったらお知らせしますし、おかしなトコがありましたら教えてやって下さい。

一つ (だけじゃないけど) イマイチなのが PACKET_RX_RING 使っているか使っていないかがわからない点。見栄えが悪いですが stderr に use PACKET_MMAP, ... なんて出力があれば PACKET_RX_RING 使っています。/proc/net/packet あたりでわかれば嬉しいけど、理解していない。

あぁ、また一つ。繰り返しになりますが、デフォルト 8Mbyte mmap します。1514 フルであれば 4096 パケットです。多すぎ? 環境変数 PCAP_MMAP_MEMSIZE をバイト単位で調節して下さい。tcpdump であれば
PCAP_MMAP_MEMSIZE=262144 tcpdump -nevi eth0 'ip and port...
あるいは
export PCAP_MMAP_MEMSIZE=524288
tcpdump ...
などなど。また ingnore や lprobe については後日、近日。と自分に言いきかせて、今日も夜が更けてくてくてく....

2008年6月10日火曜日

PACKET_MMAP #1

広告? チラシ? の裏よりタチが悪い。自分でも忘れない内にコンパイルや使い方書かないと....と思いながら、モチベーションというか忙しかったりする。で、チラシの裏。lenny 用も etch に準じないと...。あっ、./debian/rules binary する前に autoconf が必要。

2008年6月8日日曜日

netflow の exporter その 5

その後ですが、PF_RING を使わずに。と NetBSD のパッケージ? にある古い nprobe 持ってきて大幅ダーティハック。稚拙ですが
Netflow exporter もどき lprobe として ここ
に置いときます。パッチなど送っていただければ幸せです。

IPv4 だけだし、flow とは名ばかりで TCP のフラグ見ていないし、IP のフラグメンテーションも処理していません。ただノーマル? の libpcap 使った nprobe や fprobe よりはパケット落ちがありません。で、OpenMicroServer にて最高 25kpkt/s 程の中、何とかパケット落ちなく頑張って稼働している様です。

flow-tools の flow-capture で集めた後、flowscan-cuflow で RRD グラフを作ってみたのですが /24 とかのネットワークが混在しまくっていて、マスクの集合で in と out を追いきれず....utils の下にインターフェースで in out を区別する、ほんのちょっとだけ修正した CUFlow.pm がありますので、こちらも良ろしかったら。

drop, only drop ingress qdisc

例の PF_RING であったり、web を彷徨っていると NET_RX_CONSUMED なるパッチがあったり、キャプチャしている「だけ」のインターフェースでは PF_PACKET socket に届けた後は何もしなくて良いよ。vanilla カーネルに直接手を入れるのを避けるためには...とツラツラソース眺めたところ ingress qdisc の判断が良さげ。

で、tc で何とかならないか。と
tc qdisc add dev eth1 ingress handle ffff:
tc filter del dev eth1 parent ffff: protocol ip priority 10 u32 match u8 0 0 police mtu 1 drop flowid :1
試してみたところ、かえって遅くなってしまった。恐らく毎度の勉強不足。フィルタではなく、ただただ落とす方法を探せず....とは言え何とかならないか? とダーティハック
無視するだけの - いんぐのあ (ingnore)
ネーミングセンス無さすぎ? tc コマンドのソース持って来て ingress 該当部分を ingnore とすれば使えるけど面倒そうなので、ユーザスペースのコマンドは後日予定。

こちらも毎度正確な測定はしていないけど、こちらの linpcap.c にて表示せず、送信側は pktgen で試してみたところ、数パーセントだけど確実に取得量は増えている模様。

mmap'ed libpcap

PF_RING ではなくて PACKET_MMAP を使おう。ということで libpcap 試していたが
> おまけと言っては失礼だけど環境変数設定すると様子が眺められたり、挙動を変更できるらしいのも、ちょと嬉し。
と言うか環境変数設定「しなくては」動作しない。よく忘れるし、もの珍しげに CONFIG_SLUB としているせいか PCAP_MEMORY=max も怪しげ。細かな時間調整も特段必要なく、理解していないマルチキャストを消したり....
debian lenny 用のパッチ
正直試しておらず、tcpdump 動いたぁ。のレベルですが、良かったら使ってやって下さい。何も指定しないと 8Mbyte のメモリを map します。環境変数 PCAP_MMAP_MEMSIZE で変更可ですが、私は忘れるでしょう...

apt-get source libpcap0.8 した後に debian/patch に上記 60_ring.diff 置いて、同じディレクトリにある series にエントリ追加します。で debian/rules binary なのですが、fakeroot では組み込まれないと思います。

お付き合いいただける方はパッチとか送っていただけると、幸せです。

2008年6月3日火曜日

kgdb?

ただただソース眺めているだけの私に言われたくないだろうが 2.6.26 から kgdb が vanilla にマージされるそーで rc 見ると確かに....驚いた。信念よりも嬉しい人の方が多くなったのかなぁ。十中九点九 私には使いきれない。が、ちょっと jot。

カーネルコンパイルのオプションで
CONFIG_DEBUG_INFO=y
CONFIG_KGDB=y
CONFIG_KGDB_SERIAL_CONSOLE=y
としてコンパイル。VMWare にインストールした後で/boot/grub/menu.lstにこんな感じで update-grub
# kopt=root=/dev/sda1 ro kgdbwait kgdboc=ttyS0,115200
あっ、その前にありがたくこちらを参考にしつつシリアルの設定。一点手元の socat では
socat unix-connect:/tmp/vmware-serial-$1-$PORT \
pty:link=/tmp/ttyv$1$PORT,raw,echo=0,waitslave
では NG で pty,link=... としなくてはならんかった。その後リブートすると
....
serial8250: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
serial8250: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A
00:09 ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
00:0a ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A
kgdb: Registerd I/O driver kgdboc.
kgdb: Waiting for connection from remote gdb...
で止まる。ホスト側で socat して、手元に先の vmlinux 置いて
$ pwd
/usr/src/i386linux
$ gdb -q
(gdb) set remotebaud 115200
(gdb) symbol-file vmlinux
Reading symbols from /usr/src/i386linux/vmlinux...done.
Using host libthread_db library "/lib/libthread_db.so.1".
(gdb) target remote /tmp/ttyvHOST
Remote debugging using /tmp/ttyvHOST
kgdb_breakpoint () at kernel/kgdb.c:1677
1677 wmb(); /* Sync point after breakpoint */
(gdb) n
[New Thread 1]
1678 atomic_set(&kgdb_setting_breakpoint, 0);
(gdb) n
1679 }
(gdb) list
1674 atomic_set(&kgdb_setting_breakpoint, 1);
1675 wmb(); /* Sync point before breakpoint */
1676 arch_kgdb_breakpoint();
1677 wmb(); /* Sync point after breakpoint */
1678 atomic_set(&kgdb_setting_breakpoint, 0);
1679 }
1680 EXPORT_SYMBOL_GPL(kgdb_breakpoint);
1681
1682 static int __init opt_kgdb_wait(char *str)
1683 {
(gdb)
をぉ.... # こーして夜がふけてくてくてくてく