2008年4月24日木曜日

netflow の exporter その 4

その 5 はその後で...測定せず多々感覚的だけど、いったん自分の中ではオチをつけよう。

きっかけは....良くある話かわからないけどアカウンティングを取ることができないルータ、スイッチでアカウントを取りたかったと。でインターフェースのミラーをして、キャプチャするんだけど送信、受信で 2つのインターフェースの面倒を見なくちゃイカンと。100Mbit 全二重に流れるパケットをロス少なく (古い) nprobe とぷらっとホームさんの OpenMicroServer で取ろう。ってトコ。

新しい nprobe も購入してみたが netflow の v9 や VLAN MPLS などが不要であれば古いものでも、まぁ。加えて正確なフローというより、どこと、どこの、どのポート使った通信が多いか。程度がわかれば十分だし。

MMAPed な libpcap (って言うのかな?) と PF_RING な libpcap では、PF_RING の方が少し良さげ。ただしデバイスに NULL あるいは any を指定することができず、カーネルパッチも必要。また pcap_hoge を pfring_hoge で実装しているのだけど、何となく pcap_loop に重きを置いて、他が足りない感アリ。

PF_RING で二つのインターフェースを一つの (nprobe) プロセスで面倒見ようとこんなパッチ眺めながら epollで実装してみたが、一つのインターフェースで二つプロセス稼働させた方が全く良い。PF_RING のカーネルパッチ眺めると epoll ではなく poll の方が良い? 試しておらず。

むーん。と悩んだ結果....ifenslave で二つのインターフェースをバンディングして、これをデバイスと指定することで良しとした。ring.ko をロードする時に受信のみとするのと ethtool の -G で デバイスの rx ring を大きめに設定してみる。

で結果は 100M全二重はチト辛い。上下合わせてピーク 150M程度のトラヒックで /proc/net/pf_ring/<プロセスID>-<デバイス名>- みたいなエントリを覗くと 6〜7% ロスしてる。

何とかできるか...と無い知恵を絞って画策してみたが nprobe の商用サイト? で販売している筐体 nBox のスペック眺めたところ、OpenMicroServer では難かしいカモ。と弱気になったところで...オチ。

2008年4月16日水曜日

netflow の exporter その 3

先日書き綴ったものの修正。
>Documentation/networking/packet_mmap.txt のサイトはアクセスできず
>ここからソース持ってきてみたものの x86 のみ? で早々にあきらめ。
mb() でアセンブラがあったが、使っておらず、またこれら PACKET_MMAP な libpcap を参考にした lincap.c についても mb() についてはカーネルヘッダから、それなりのものを持って来れば良さげ。また
>PF_RING に挑戦したが...扱っている量がそーとーなレベルという事に気付く。
なんて書いたが、少々試したところ歴然たる差があった。当初試したときには pcap_open() での *device に NULL あるいは any が指定できるものと思い込んでいたが、指定して PF_RING が feature されずに動いてしまったため差が無いと思い込んでいた。この any が指定できないのが少々辛かったりするので PACKET_MMAP の libpcap も作成して試してみよう。

おまけと言っては失礼だけど環境変数設定すると様子が眺められたり、挙動を変更できるらしいのも、ちょと嬉し。

で、libpcap-0.9.8.20080206.tar.gz を持ってきて展開した後、debian lenny にて apt-get source libpcap0.8 この debian ディレクトリを丸ごとコピーして以下 debian/patches/10_shared_lib.diff を参考にした Makefile.in のパッチ。rules にて patch 当てないようにして
--- libpcap-0.9.8.20080206/Makefile.in  2008-02-08 08:49:02.000000000 +0900
+++ libpcap-0.9.8.20080206-deb/Makefile.in 2008-04-16 22:12:48.000000000 +0900
@@ -116,6 +116,17 @@
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
$(libpcap_la_LDFLAGS) $(LDFLAGS) -o $@
DEFAULT_INCLUDES = -I.@am__isrc@
+
+# some defines for shared library compilation
+MAJ=$(shell head -1 debian/changelog | perl -nle 'm/\S+(\d.\d)\s+\(\d\.\d\.\d+-\S+\)/ and print $$1')
+MIN=$(shell head -1 debian/changelog | perl -nle 'm/\S+\s+\(\d\.\d\.(\d+)-\S+\)/ and print $$1')
+LIBVERSION=$(shell head -1 debian/changelog | perl -nle 'm/\S+\s+\((\S+)-\S+\)/ and print $$1')
+VERSION=$(MAJ).$(MIN)
+LIBNAME=pcap
+LIBRARY=lib$(LIBNAME).a
+SOLIBRARY=lib$(LIBNAME).so
+SHAREDLIB=$(SOLIBRARY).$(LIBVERSION)
+
depcomp =
am__depfiles_maybe =
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
@@ -155,6 +166,7 @@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CFLAGS = @CFLAGS@
+CFLAGS_SHARED = -shared -Wl,-soname,$(SOLIBRARY).$(MAJ)
CPP = @CPP@
CPPFLAGS = @CPPFLAGS@
CXX = @CXX@
@@ -278,7 +290,7 @@
LTRELEASE = $(RMAJOR).$(RMINOR).$(RREVISION)
LTVERSION = $(VCURRENT):$(VREVISION):$(VAGE)
PCAP = @V_PCAP@
-PSRC = pcap-@V_PCAP@.c
+PSRC = pcap-@V_PCAP@.c pcap-ring.c
FSRC = fad-@V_FINDALLDEVS@.c
FADS = @V_FADS@
LEX = @V_LEX@
@@ -298,7 +310,9 @@
MAINTAINERCLEANFILES = Makefile.in Makefile.am.bak configure.ac.bak aclocal.m4 configure config.h.in
MOSTLYCLEANFILES = bpf_filter.c scanner.c grammar.c version.c lex.yy.c \
tokdefs.h version.h os-proto.h \
- stamp-h stamp-h.in
+ stamp-h stamp-h.in $(OBJ_PIC) libpcap.so*
+
+OBJ_PIC = $(PSRC:.c=_pic.o) $(FSRC:.c=_pic.o) $(CSRC:.c=_pic.o) $(SSRC:.c=_pic.o) $(GENSRC:.c=_pic.o)

HDR = arcnet.h atmuni31.h config.h ethertype.h gencode.h \
llc.h nlpid.h pcap-bpf.h pcap-int.h pcap-namedb.h \
@@ -384,6 +398,9 @@
$(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \
else :; fi; \
done
+ $(INSTALL_DATA) $(SHAREDLIB) $(DESTDIR)$(libdir)/
+ ln -sf $(SHAREDLIB) $(DESTDIR)$(libdir)/$(SOLIBRARY).$(MAJ)
+ ln -sf $(SOLIBRARY).$(MAJ) $(DESTDIR)$(libdir)/$(SOLIBRARY)

uninstall-libLTLIBRARIES:
@$(NORMAL_UNINSTALL)
@@ -411,7 +428,12 @@
-rm -f *.tab.c

.c.o:
- $(COMPILE) -c $<
+ # $(COMPILE) -c $<
+ $(COMPILE) -c -o $@ $(srcdir)/$*.c
+
+%_pic.o: %.c
+ @rm -f $@
+ $(COMPILE) -fPIC $(CFLAGS) -c -o $@ $(srcdir)/$*.c

.c.obj:
$(COMPILE) -c `$(CYGPATH_W) '$<'`
@@ -767,7 +789,7 @@

#all-local:
# rm -f libpcap.a; $(LN_S) .libs/libpcap.a libpcap.a
-all-local: libpcap.a
+all-local: libpcap.a $(SHAREDLIB)

libpcap.a: .libs/libpcap.a
cp .libs/libpcap.a libpcap.a
@@ -792,6 +814,13 @@
yyy:
sh beenthere

+$(SHAREDLIB): $(OBJ_PIC)
+ -@rm -f $@
+ -@rm -f $(SOLIBRARY) $(SOLIBRARY).$(MAJ)
+ $(CC) $(CFLAGS_SHARED) -o $(SHAREDLIB) $(OBJ_PIC) -lc
+ ln -s $(SHAREDLIB) $(SOLIBRARY).$(MAJ)
+ ln -s $(SOLIBRARY).$(MAJ) $(SOLIBRARY)
+
# generated source
pcap.3.gz: pcap.3
gzip -c < pcap.3 > pcap.3.gz
@@ -800,12 +829,18 @@
rm -f bpf_filter.c
$(LN_S) $(srcdir)/bpf/net/bpf_filter.c bpf_filter.c

+bpf_filter_pic.o: bpf_filter.c
+ $(COMPILE) -fPIC $(CFLAGS) -c bpf_filter.c -o $@
+
scanner.o: scanner.c tokdefs.h

scanner.c: scanner.l tokdefs.h
@rm -f $@
$(V_LEX) -t scanner.l > $$$$.$@; mv $$$$.$@ $@

+scanner_pic.o: scanner.c tokdefs.h
+ $(COMPILE) -fPIC $(CFLAGS) -o $@ -c scanner.c
+
tokdefs.h:
rm -f grammar.c
make grammar.o
@@ -818,6 +853,10 @@
mv y.tab.c grammar.c
mv y.tab.h tokdefs.h

+grammar_pic.o: grammar.c
+ @rm -f $@
+ $(COMPILE) -fPIC $(CFLAGS) -Dyylval=pcap_lval -o $@ -c grammar.c
+
version.o: version.c

version.c: $(srcdir)/REVISION version.h
@@ -828,6 +867,13 @@
version.h: $(srcdir)/VERSION
@rm -f $@
sed -n -e 's/.*/static const char pcap_version_string[] = "libpcap version &";/p' $(srcdir)/VERSION > $@
+
+version_pic.o: version.c
+ $(COMPILE) -fPIC $(CFLAGS) -c version.c -o $@
+
+pcap-ring_pic.o: version.c
+ $(COMPILE) -fPIC $(CFLAGS) -c pcap-ring.c -o $@
+
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:
# 早い時間の帰宅って嬉しいなぁ....

2008年4月11日金曜日

chroot で SSD & cross compile

OpenMicroServer のクロスコンパイルをするために SSD なるディストリビューションがあるらしく Web を彷徨うと Windows 方々は VMWare-Player 上で。と言うのが多いらしい。カーネルのコンパイルしてファームに組み込み。までしか試していないけど linux ならば。と chroot で試したところ、どうもできたらしい。

# なんて言っているが VMWare や lguest でも試した後の話。

ぷらっとホームさんのドキュメント``OpenMicroServer/OpenBlockS266 のファームウェアのカスタマイズ''を多々参考にしつつ長くなるけど...i386 のバイナリ tgz を揃えた後で
# mkdir SSD
# for i in tmp/*.tgz; do
> tar xzpf $i -C SSD
# done
# pushd SSD/usr/src/dist/distfiles/
# wget -nd ftp://ftp.plathome.co.jp/pub/ssdlinux/0.4-LATEST/distfiles/linux-2.6.16.59-004-mips-obs.patch.bz2
....
# wget -nd ftp://ftp.plathome.co.jp/pub/ssdlinux/0.4-LATEST/distfiles/linux-2.6.16.59.patch.bz2
....
# wget -nd ftp://ftp.plathome.co.jp/pub/ssdlinux/0.4-LATEST/distfiles/linux-mips-2.6.16.tar.bz2
....
# wget -nd ftp://ftp.plathome.co.jp/pub/ssdlinux/0.4-LATEST/distfiles/usagi-linux26-stable-20050714-2.6.16.diff.bz2
....
# wget -nd ftp://ftp.plathome.co.jp/pub/ssdlinux/0.4-LATEST/distfiles/mtd-snapshot-20060328.tar.bz2
....
# wget -nd ftp://ftp.plathome.co.jp/pub/ssdlinux/0.4-LATEST/distfiles/pcmcia-cs-3.2.8.tar.gz
....
# cd ../../distrib/mipsel-obs1550/product/initrd/
# wget -nd ftp://ftp.plathome.co.jp/pub/ssdlinux/0.4-LATEST/mipsel-obs1550/installation/ramdisk.image-product.gz
....
# popd
# chroot SSD
# cd /etc/
# cp mk.conf mk.conf.old
# vi mk.conf
# diff -ub mk.conf.old mk.conf
--- mk.conf.old 2008-04-10 23:29:42.000000000 +0900
+++ mk.conf 2008-04-10 23:30:51.000000000 +0900
@@ -10,19 +10,19 @@
#KERNEL_CONFIG?= /any_dir/my_kernel_config

# Cross Compile for OpenBlockS
-#CROSS_BUILD?= powerpc
-#DESTDIR?= /home/dest-powerpc
-#RELEASEDIR?= /home/release-powerpc
+CROSS_BUILD= mipsel
+DESTDIR= /home/dest/mipsel
+RELEASEDIR= /home/release/mipsel

# OPENBLOCKS 'obs50','obs200','obs266' or 'none'
-OPENBLOCKS?= none
+OPENBLOCKS= obs1550

-HAVE_CVS?= yes
+HAVE_CVS?= no
DEVELOPTOOLS?= yes
USE_PAM?= yes
USE_PCMCIA?= yes
USE_EXT3FS?= yes
-IPV6?= yes
+IPV6?= no
WITH_X11?= no

SSDVERSION= 0.4
# mknod /dev/null c 1 3
# export MACHTYPE
# export HOSTTYPE
# export SHELL
# export PATH=$PATH:/usr/cross/mipsel/bin/
# cd /usr/src/mkdist/mtd
# bmake
....
# cd /usr/src/mkdist/kernel
# bmake
....
# cd /usr/src/mkdist/pcmcia-cs
# bmake
....
ごにょごにょ
# cd /usr/src
# bmake -DNOCLEAN build_kernel
....
# cd /usr/src/distrib/mipsel-obs1550/product/treeboot
# bmake
....
# ls
Makefile System-product.map zImage.initrd.treeboot-product
# exit
# ls -l SSD/usr/src/distrib/mipsel-obs1550/product/treeboot
total 9588
-rw-r--r-- 1 root root 172 Aug 23 2005 Makefile
-rw-r--r-- 1 root root 609544 Apr 11 00:03 System-product.map
-rwxr-xr-x 1 root root 9280780 Apr 11 00:03 zImage.initrd.treeboot-product
気を付ける点としては pcmcia-cs を持ってきておくことと /dev/null 作ること位かしら?

2008年4月10日木曜日

netflow の exporter その 2

Documentation/networking/packet_mmap.txt のサイトはアクセスできず、ここ からソース持ってきてみたものの x86 のみ? で早々にあきらめ。

nprobe って言っているなら気付けよっ。との事で、こちら をありがたく参考しつつ PF_RING に挑戦したが...扱っている量がそーとーなレベルという事に気付く。OpenMicroServer にて nprobe 稼働させてロスしまくっていても flow-capture でひろってみると 5分おきに 6M位 のファイルができてる...

# 参考にさせていただいたところ補足。libpfring でのコンパイルは -fPIC 入れた方が良さげ。
# また libpfring の so は単独ではなく libpcap の README 曰く libpcap 作る時に *.o 加えてあげるらしい。

Cisco コンソール & cu & emacs

普段は emacs にて ``M-x shell'' の後 telnet 使っているけどコンソールは持ち運びできる PC が Windows なので TeraTerm なるものを使っていた。コンソールも emacs から。と同じように shell 起動して
cu --parity=none -s 9600 -l /dev/ttyUSB0
なんてやってみたがウマくない。例のごとく Web をウロウロしていたら Term Mode なるものを発見。``M-x term'' の後で cu してみたところ...おぉ ? でヘルプでるし TAB で補完もされる。``C-j'' ``C-k'' で line mode と char mode の切替が必要になるが、使い慣れた emacs でログは取れるし、コピペもできるし、ちょと嬉し。