2007年11月19日月曜日

XORP の ospf6

制約っぽいのですが XORP 1.4 の release notes
- The OSPFv3 configuration allows multiple instances to be configured however only one instance will be created. Configuring multiple OSPFv3 instances is guaranteed to cause problems.
なる記述あり。で config.boot
potocol ospf6 10
とすると? しても? instance ID を 0 として Hello を投げ、受け取った側は instance ID が 10 じゃない。といったログ....消してしまった.... が残る。なので
protocol ospf6 0
としたところ、まぁ、動いた。

2007年11月7日水曜日

tcpdump で 802.1q

vconfig で vlan 作ったけど tcpdump で見えない。って話、結構ホットな内容かも。expected behavior of PF_PACKET on NETIF_F_HW_VLAN_RX device? を例のごとく一瞥すると NETIF_F_HW_VLAN_RX feature が on となっているデバイスの場合 tcpdump で見る時には vlan ヘッダが無い? とか。include/linux/netdevice.hにて
#define NETIF_F_HW_VLAN_RX 256 /* Receive VLAN hw acceleration */
現在利用しているデバイスの feature は cat /sys/class/net/eth#/features あたりを見ると 0x113a9 と 0x180。これかなぁ....

2007年11月6日火曜日

using lguest - 3

先日のネットワーク絵の設定。debian パッケージでは bridge-utils と vlan あたり。vlan パッケージ入れて vlan-interfaces (5) を見ると /etc/network/interfaces で vlan の設定ができるらしい。そうそう先日の絵で eth1.1 なんて書いていたが

/opt/lguest# vconfig add eth1 1
Added VLAN with VID == 1 to IF -:eth1:-
WARNING: VLAN 1 does not work with many switches,
consider another number if you have problems.
なんて言われるので eth1.10 と eth1.11 にしてしまった。肝心の /etc/network/interfaces は以下の通り
auto eth1.10
iface eth1.10 inet static
# vlan-raw-device eth1
address 172.27.129.1
broadcast 172.27.129.255
netmask 255.255.255.0
iface eth1.10 inet6 static
address fec0:0:0:1b81:201:8eff:feb3:84d8
netmask 64

auto br0
iface br0 inet static
pre-up brctl addbr $IFACE
address 192.168.0.3
netmask 255.255.255.0
post-down brctl delbr $IFACE

auto br1
iface br1 inet manual
pre-up brctl addbr $IFACE
post-up ip link set $IFACE up
pre-down ip link set $IFACE down
post-down brctl delbr $IFACE
auto br2
iface br2 inet manual
pre-up brctl addbr $IFACE
post-up ip link set $IFACE up
pre-down ip link set $IFACE down
post-down brctl delbr $IFACE

auto eth1.11
iface eth1.11 inet manual
post-up brctl addif br1 $IFACE
post-up ip link set $IFACE up
pre-down ip link set $IFACE down
pre-down brctl delif br1 $IFACE
まぁ IPv6 はご愛嬌。これで lguest を
./lguest 64m /usr/src/stable/vmlinux --block=FW1.img --block=FW1.swap root=/dev/lgba \
--tunnet=bridge:br0 --tunnet=bridge:br1 --tunnet=bridge:br2
と起動するとゲスト FW1 FW2 では eth0 eth1 eth2 が見える。こちらも以前書いたが、これらに対応するホスト側は (ユーザスペースコマンドの) lguest で tap# を作って、それぞれのブリッジインターフェースに addif してくれる。

通信できることはできるのだけど、とっても気になるのが eth1 での 802.1q。ホント喋っているのか tcpdump で確認できず。もう少々要確認ってトコ。

2007年11月1日木曜日

ネットワーク絵


目指すはっ。と構えるほど大それたものではないが、絵としては この辺り に近い構成を host と guest で作成して色々試そうかと。大きな四角がホストで中の小さな二つの四角がゲスト。赤太字がインターフェースで○はアドレスを持つ。実際の設定は....後日。

2007年10月31日水曜日

....

会ったことも無く当然私などを知っているはずは無いが、おこがましくも尊敬する itojun さんが亡くなられたとのおはなし。自身の語彙不足を今更ながら恨めしく....心からのご冥福をお祈りします。

2007年10月30日火曜日

using lguest - 2

ちょっと使えるようになるまで、また jot。
/opt/lguest# mount -t ext3 -o loop FW1.img tmp
/opt/lguest# chroot tmp
/# apt-get install udev iproute less
Reading package lists... Done
Building dependency tree... Done
....
/# cat >> /etc/fstab
proc /proc proc defaults 0 0
/dev/lgba / ext3 defaults,errors=remount-ro 0 1
/dev/lgbb none swap sw 0 0
/# cat > /etc/resolv.conf
nameserver 192.168.0.3
/# cat >> /etc/network/interfaces
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
address 192.168.0.1
netmask 255.255.255.0
gateway 192.168.0.3
/#
/# cat > /etc/hostname
fw1
/# exit
/opt/lguest# dd if=/dev/zero of=FW1.swap bs=1 count=1 seek=$((1024 * 1024 * 128 - 1))
1+0 records in
1+0 records out1+0 records in
1+0 records out
1 byte (1 B) copied, 0.000128516 seconds, 7.8 kB/s
/opt/lguest# mkswap FW1.swap
Setting up swapspace version 1, size = 134213 kB
no label, UUID=69713635-6d63-4cd9-b0da-96d1eb7fe561
/opt/lguest# brctl addbr br0
/opt/lguest# ip addr add 192.168.0.3/24 dev br0
/opt/lguest# ip link set br0 up
/opt/lguest# umount tmp
/opt/lguest# ./lguest 64m /usr/src/stable/vmlinux --block=FW1.img --block=FW1.swap root=/dev/lgba --tunnet=bridge:br0
....
Debian GNU/Linux lenny/sid fw1 /dev/hvc0

fw1 login: root
Last login: Tue Oct 30 14:08:48 UTC 2007 on hvc0
Linux fw1 2.6.23.1 #1 Wed Oct 17 13:58:03 JST 2007 i686

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
fw1:~#
fw1:~# ping -c3 192.168.0.3
PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data.
64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time=7.64 ms
64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.266 ms
64 bytes from 192.168.0.3: icmp_seq=3 ttl=64 time=0.262 ms

--- 192.168.0.3 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 0.262/2.724/7.644/3.478 ms
fw1:~# mount
/dev/lgba on / type ext3 (rw,errors=remount-ro)
tmpfs on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
procbususb on /proc/bus/usb type usbfs (rw)
udev on /dev type tmpfs (rw,mode=0755)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=620)
fw1:~# swapon -s
Filename Type Size Used Priority
/dev/lgbb partition 131064 0 -1
fw1:~# apt-get update
Get:1 http://ring.asahi-net.or.jp lenny Release.gpg [189B]
Hit http://ring.asahi-net.or.jp lenny Release
Get:2 http://ring.asahi-net.or.jp lenny/main Packages/DiffIndex [2038B]
Fetched 2227B in 2s (989B/s)
Reading package lists... Done
fw1:~# apt-get dist-upgrade
Reading package lists... Done
Building dependency tree
Reading state information... Done
Calculating upgrade... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
fw1:~# apt-get install ssh deborphan
....
fw1:~# useradd -d /home/chamaken -G users chamaken -m
fw1:~# passwd chamaken
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
fw1:~# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/lgba 2.0G 266M 1.7G 14% /
tmpfs 30M 0 30M 0% /lib/init/rw
udev 10M 20K 10M 1% /dev
tmpfs 30M 4.0K 30M 1% /dev/shm
fw1:~# shutdown -h now
Saving the system clock..
hwclock[1215] general protection eip:804aacb esp:bff53fc4 error:0
/etc/rc0.d/K25hwclock.sh: line 48: 1215 Segmentation fault /sbin/hwclock --systohc $GMT $HWCLOCKPARS $BADYEAR
....
lguest: CRASH: Power down
と、まぁまぁ使えるようになりましたっと。``さて'' という字は尻へんに長いと書く。と言っているおじさんがいました。

2007年10月22日月曜日

rtl8187 動作せず...

やっぱりダメらしい。
~# cat /sys/bus/usb/devices/2-2/product
NETGEAR WG111v3
Web 探してみると v2 で asic_rev = 1。更に rf_init = rtl8225z2_rf_init っぽかったのでベタで試してみたところ、ウンとは言うがスンとは言わず。といった感じ。 zd1211rw も bcm43xx も mac802.11 じゃないけど、この辺り使うしか無いのかしら....

madwifi も方向転換で HAL 使わなくなって、以前のものから仕切り直しっぽい。そうそう svn のリポジトリ が再構成 Repository restructured ¶ だそうだ。stable は svn switch http://svn.madwifi.org/madwifi/trunk だそうだ。

using lguest - 1

とりあえずの起動までを、ちょっと jot。
/opt/lguest# dd if=/dev/zero of=FW1.img bs=1 count=1 seek=$((1024 * 1024 * 1024 * 2 - 1))
1+0 records in
1+0 records out
1 byte (1 B) copied, 0.000126002 seconds, 7.9 kB/s
/opt/lguest# ls -l
total 16
-rw-r--r-- 1 root root 2147483648 2007-10-22 20:28 FW1.img
/opt/lguest# mkfs.ext3 FW1.img
mke2fs 1.40-WIP (14-Nov-2006)
FW1.img is not a block special device.
Proceed anyway? (y,n) y
Filesystem label=
OS type: Linux
....snip....
This filesystem will be automatically checked every 32 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
/opt/lguest# mkdir tmp
/opt/lguest# mount -t ext3 -o loop FW1.img tmp
/opt/lguest# debootstrap --arch i386 lenny tmp http://ring.asahi-net.or.jp/archives/linux/debian/debian
I: Retrieving Release
....snip....
I: Base system installed successfully.
/opt/lguest# chroot tmp
/# cp /etc/inittab oldtab
/# vi /etc/inittab
....
/# diff -ubB oldtab /etc/inittab
--- oldtab 2007-10-22 11:54:48.000000000 +0000
+++ /etc/inittab 2007-10-22 11:54:12.000000000 +0000
@@ -51,12 +51,12 @@
# Note that on most Debian systems tty7 is used by the X Window System,
# so if you want to add more getty's go ahead but skip tty7 if you run X.
#
-1:2345:respawn:/sbin/getty 38400 tty1
-2:23:respawn:/sbin/getty 38400 tty2
-3:23:respawn:/sbin/getty 38400 tty3
-4:23:respawn:/sbin/getty 38400 tty4
-5:23:respawn:/sbin/getty 38400 tty5
-6:23:respawn:/sbin/getty 38400 tty6
+1:2345:respawn:/sbin/getty 38400 /dev/hvc0
+#2:23:respawn:/sbin/getty 38400 tty2
+#3:23:respawn:/sbin/getty 38400 tty3
+#4:23:respawn:/sbin/getty 38400 tty4
+#5:23:respawn:/sbin/getty 38400 tty5
+#6:23:respawn:/sbin/getty 38400 tty6

# Example how to put a getty on a serial line (for a terminal)
#
/# cat >> /etc/securetty

# lguest console
hvc0
/# mknod /dev/hvc0 c 229 0
/# exit
exit
/opt/lguest# umount tmp
/opt/lguest# cd /usr/src/stable/Documentation/lguest/
/usr/src/stable/Documentation/lguest# make
cc -Wall -Wmissing-declarations -Wmissing-prototypes -O3 -Wl,-T,lguest.lds -static lguest.c -lz -o lguest
/usr/src/stable/Documentation/lguest# cp lguest /opt/lguest/
/usr/src/stable/Documentation/lguest# cd !$
cd /opt/lguest/
/opt/lguest# modprobe lg
/opt/lguest# ./lguest 64m /usr/src/stable/vmlinux --block=FW1.img root=/dev/lgba
いや、実のところ、途中途中しくじっているけどね。

2007年10月15日月曜日

The Art of UNIX Programming

出版当初に原著を購入したのだが、難かしい英語 --- えぇ勿論私にとって --- だったので、ものの数ページで挫折したのだが.... The Art of UNIX Programming おぉ和訳。と早速購入。訳云々は全くわかっていないのだが、原著読める方はもちろん、どうも読んでおくべき本。もう一冊 Linux System Programming も購入。Robert Love さん著は以前の Linux Kernel Development が大変良くできた内容だった。にしても Programming って、してない気がする。

swatch

仕事で swatch を使ってみた。root 権限のないホストだったので、まぁ適当にホームディレクトリに各種パッケージをインストールして。って感じ。で .swatchrc を書くのだが、適当にスペースで区切られたフィールドを行として扱う正規表現が
percodemy $prefix = "(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+).*";
なんてあまりにも....仕組としては .swatchrc から .swatch_script.$$ みたいなスクリプトを作成して、これを実行するようなので、眺めてみると
LOOP: while (defined($_=$File->read)) {

chomp;
my $S_ = $_;
@_ = split;

### quote all special shell chars ###
$S_ =~ s/([;&\(\)\|\^><\$`'\\])/\\$1/g;
my @S_ = split(/\s+/, $S_);
....
反則かもしれないけど、この @S_ を使うと便利ってただそれだけ。あっ、もう一点。--extra-moduleで指定したら、先の swatch_script.$$ でも use lib 'extra-modeule' してくれると嬉しいカモ。

2007年10月1日月曜日

LSRR with nuttcp その 2

遅すぎる LSRR 付けた nuttcp だが TSO (tcp segmentation offload) をオフとすると、それなりになった。tcpdump 追いかけると MSS が 1440 の所、何かのタイミングで丁度倍 2880 というサイズのパケットを送出して、もちろんロス。が原因っぽい。ハードウェア絡みなのかカーネルの話なのか不明。ちなみに NIC は x86_64上の
01:03.0 Ethernet controller: Intel Corporation 82541EI Gigabit Ethernet Controller (Copper)
Subsystem: Intel Corporation PRO/1000 MT Network Connection
Flags: bus master, 66MHz, medium devsel, latency 64, IRQ 18
Memory at fc9c0000 (32-bit, non-prefetchable) [size=128K]
Memory at fc9a0000 (32-bit, non-prefetchable) [size=128K]
I/O ports at 9880 [size=64]
Expansion ROM at fc980000 [disabled] [size=128K]
Capabilities: [dc] Power Management version 2
Capabilities: [e4] PCI-X non-bridge device

rtl8187 動作せず...

iwconfig iwlist でソレナリの表示はされるものの
~# ip link set wlan0 up
~# dmesg | tail -n2
phy0: RF Calibration Failed! 0
ADDRCONF(NETDEV_UP): wlan0: link is not ready

~# ip link ls
....
5: wmaster0: <BROADCAST,MULTICAST,UP,10000> mtu 1500 qdisc ieee80211 qlen 1000
link/ieee802.11 00:1b:2f:be:42:5c brd ff:ff:ff:ff:ff:ff
6: wlan0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:1b:2f:be:42:5c brd ff:ff:ff:ff:ff:ff
Monitor モードは可だが、Master モードは INVALID。の前に、デバイスのランプが点灯せず、動作していなさげ。む〜ん....

2007年9月19日水曜日

rtl8187

何となく rc6-mm1 パッチだけあてて make menuconfig してみたところ、zd1211rw の mac80211 ありました。なので、近々? zd1211 でも Master あるいは Monitor mode にできるかも。

....とか言いつつ mac80211 & USB で何か無いかなぁ。と眺めていたところ rtl8187 なるデバイスが 2.6.23-rc にて使えるとの話。探した探した見付かった。個人輸入代行まで考えていたが 7月? 頃 NetGear の日本語版が発売。物は
ネットギア・インターナショナル WG111 USB2.0 無線アダプタ WG111-300JPS
との事で大凡 2,000- 程度。で rtl8187_dev.c の適当なところに
{USB_DEVICE(0x0846, 0x4260)},
を加えてあげて、認識した。が、個人的には USB2.0 only はチト辛い。ここから先は未。

2007年9月18日火曜日

LSRR with nuttcp

iperf どうしようか...と考えていたところ nuttcp なるものを発見。例のごとく読み切れていないのだけど、クライアント側からの trans のみで有効なパッチを適当に作成して測定してみたところ...遅いっ。遅すぎる。なーぜー? 他の環境でも試してみよう。

あっ /proc/sys/net/ipv4/conf/eth#/accept_source_route だけではダメで all/accept_source_route も 1 に。また conntrack してるなら INVALID も受付けるように。

--- nuttcp-5.3.1.c.orig 2007-09-18 21:19:37.000000000 +0900
+++ nuttcp-5.3.1.c 2007-09-18 23:32:05.000000000 +0900
@@ -357,6 +357,16 @@
#include "addrinfo.h" /* from missing */
#endif

+/* Source record routing */
+#include <netinet/ip.h>
+#include <sys/queue.h>
+struct entry {
+ char *hname;
+ char strict;
+ TAILQ_ENTRY(entry) entries;
+};
+TAILQ_HEAD(qhead, entry);
+
static struct timeval time0; /* Time at which timing started */
static struct timeval timepk; /* Time at which last packet sent */
static struct timeval timep; /* Previous time - for interval reporting */
@@ -465,6 +475,8 @@
int delay( int us );
int mread( int fd, char *bufp, unsigned n);
char *getoptvalp( char **argv, int index, int reqval, int *skiparg );
+char *alloc_inet_srr(int is_ssrr);
+int add_inet_gate(char *optr, char *hname);

int vers_major = 5;
int vers_minor = 3;
@@ -508,6 +520,12 @@
int srvrwin=0;
/* end nick code */

+/* source record routing */
+int ngates = 0;
+struct qhead gates;
+struct qhead *gatesp;
+/* end source record routing */
+
int udp = 0; /* 0 = tcp, !0 = udp */
int udplossinfo = 0; /* set to 1 to give UDP loss info for
* interval reporting */
@@ -641,7 +659,8 @@
-T## transmit timeout in seconds (or (m|M)inutes or (h|H)ours)\n\
-i## receiver interval reporting in seconds (or (m|M)inutes)\n\
-Ixxx identifier for nuttcp output (max of 40 characters)\n\
- -F flip option to reverse direction of data connection open\n"
+ -F flip option to reverse direction of data connection open\n\
+ -gxxx specifies lsrr point\n"
#ifdef HAVE_SETPRIO
" -xP## set nuttcp process priority (must be root)\n"
#endif
@@ -972,6 +991,7 @@
short save_events;
int skiparg;
int reqval;
+ struct entry *gate;

sendwin = 0;
rcvwin = 0;
@@ -1435,6 +1455,24 @@
goto usage;
}
break;
+ case 'g':
+ reqval = 1;
+ gate = (struct entry *)calloc(1, sizeof(struct entry));
+ cp1 = getoptvalp(argv, 2, reqval, &skiparg);
+ gate->hname = calloc(1, strlen(cp1) + 1);
+ strncpy(gate->hname, cp1, strlen(cp1));
+ if (!ngates) {
+ TAILQ_INIT(&gates);
+ } else {
+ if (ngates > 9) {
+ fprintf(stderr, "too many gate was specified\n");
+ fflush(stderr);
+ exit(1);
+ }
+ }
+ TAILQ_INSERT_TAIL(&gates, gate, entries);
+ ngates++;
+ break;
case 'h':
default:
goto usage;
@@ -1608,6 +1646,11 @@
fprintf(stderr, "server mode only allowed for receiver\n");
goto usage;
}
+ if (ngates) {
+ fprintf(stderr, "source route only allowed for client\n");
+ goto usage;
+ }
+
udp = 0;
sinkmode = 1;
start_idx = 0;
@@ -2576,6 +2619,29 @@
err("setsockopt");
}
}
+ if (ngates) {
+ if (af == AF_INET6) {
+ fprintf(stderr, "source route allowed for AF_INET only, sorry");
+ fflush(stderr);
+ exit(1);
+ }
+
+ cp1 = alloc_inet_srr(0);
+ if (!cp1)
+ err("alloc");
+ for (gate = gates.tqh_first; gate != NULL; gate = gate->entries.tqe_next) {
+ i = add_inet_gate(cp1, gate->hname);
+ if (!i)
+ err("add gate");
+ if (i < 0) {
+ fprintf(stderr, "%s: %s\n", gai_strerror(i), gate->hname);
+ exit(1);
+ }
+ }
+ if (setsockopt(fd[stream_idx], IPPROTO_IP, IP_OPTIONS, cp1, i)) {
+ err("setsockopt");
+ }
+ }
}
if (!udp || (stream_idx == 0)) {
if (((trans && !reverse) && (stream_idx > 0)) ||
@@ -4572,3 +4638,59 @@

return(*nextarg);
}
+
+/* from Richard W. Stevens, unpv12 */
+
+char *
+alloc_inet_srr(int is_ssrr) {
+ char *opt, *p;
+
+ p = calloc(1, 44); /* NOP, code, len, ptr, up to 10 addresses */
+ if (!p) {
+ return NULL;
+ }
+ opt = p;
+ *opt++ = IPOPT_NOP; /* NOP for alignment */
+ *opt++ = is_ssrr ? IPOPT_SSRR : IPOPT_LSRR;
+ *opt++ = 3; /* fill in the length */
+ *opt++ = 4; /* offset to first address */
+
+ return p;
+}
+
+int
+add_inet_gate(char *optr, char *hname)
+{
+ int n;
+ struct addrinfo *ai, hints;
+ struct sockaddr_in *sin;
+
+ char *lenptr = optr + 2; /* pointer to length byte in SRR option */
+
+ if (*optr != IPOPT_NOP) {
+ errno = EINVAL; /* slight sanity check */
+ return 0;
+ }
+ if (*lenptr > 9) {
+ errno = ENOBUFS;
+ return 0; /* too many source routes */
+ }
+
+ bzero(&hints, sizeof(struct addrinfo));
+ hints.ai_flags = AI_CANONNAME; /* always return canonical name */
+ hints.ai_family = AF_INET;
+ hints.ai_socktype = 0;
+
+ if ((n = getaddrinfo(hname, NULL, &hints, &ai)) != 0) {
+ return n;
+ }
+
+ sin = (struct sockaddr_in *) ai->ai_addr;
+ memcpy(optr + 1 + *lenptr, &sin->sin_addr, sizeof(struct in_addr));
+ freeaddrinfo(ai);
+
+ *lenptr += sizeof(struct in_addr);
+
+ return *lenptr + 1; /* size for setsockopt() */
+}
すっかり LSRR ハマってる自分。

2007年9月10日月曜日

lguest64

[ANNOUNCE] Lguest64 - fatter puppies! This is a formal announcement of Lguest64. だそうだ。
git://git.et.redhat.com/kernel-lguest-64.git だそうだ (T_T)

ncftp(get|put) で bind

ncftpget, ncftpput で送信元アドレスを指定するパッチを貼り付け。あんまチェックとかしていないけど、とりあえずなら使えたので。
diff -ubBr ncftp-3.2.0/libncftp/ftp.c ncftp-3.2.0-bind/libncftp/ftp.c                                                                                                                 
--- ncftp-3.2.0/libncftp/ftp.c 2005-01-02 06:27:07.000000000 +0900
+++ ncftp-3.2.0-bind/libncftp/ftp.c 2007-09-09 16:37:07.000000000 +0900
@@ -88,6 +88,16 @@
return (result);
} /* GetSocketAddress */

+static int
+SetSocketAddress(int sockfd, struct sockaddr_in *saddr)
+{
+ saddr->sin_family = AF_INET;
+ saddr->sin_port = 0;
+
+ return bind(sockfd, (struct sockaddr *) saddr, sizeof(struct sockaddr_in));
+} /* SetSocketAddress */
+
+



@@ -286,7 +296,7 @@
* size specified.
*/
(void) SetSocketBufSize(sockfd, cip->ctrlSocketRBufSize, cip->ctrlSocketSBufSize);
-
+ (void) SetSocketAddress(sockfd, &cip->ourCtlAddr);
#ifdef NO_SIGNALS
err = SConnect(sockfd, &cip->servCtlAddr, (int) cip->connTimeout);

diff -ubBr ncftp-3.2.0/sh_util/ncftpget.c ncftp-3.2.0-bind/sh_util/ncftpget.c
--- ncftp-3.2.0/sh_util/ncftpget.c 2006-08-12 08:36:34.000000000 +0900
+++ ncftp-3.2.0-bind/sh_util/ncftpget.c 2007-09-09 17:17:21.000000000 +0900
@@ -228,7 +228,7 @@
perfilecmd[0] = '\0';

GetoptReset(&opt);
- while ((c = Getopt(&opt, argc, argv, "P:u:j:p:h:e:d:t:aRTr:vVf:ADzZEFbcCB:W:X:Y:")) > 0) {
+ while ((c = Getopt(&opt, argc, argv, "P:u:j:p:h:e:d:t:aRTr:vVf:ADzZEFbcCB:W:X:Y:L:")) > 0) {
if (c == 'b') {
batchmode++;
}
@@ -247,7 +247,7 @@
}

GetoptReset(&opt);
- while ((c = Getopt(&opt, argc, argv, "P:u:j:p:h:e:d:t:aRTr:vVf:o:ADzZEFbcCB:W:X:Y:")) > 0) switch(c) {
+ while ((c = Getopt(&opt, argc, argv, "P:u:j:p:h:e:d:t:aRTr:vVf:o:ADzZEFbcCB:W:X:Y:L:")) > 0) switch(c) {
case 'P':
fi.port = atoi(opt.arg);
break;
@@ -363,6 +363,11 @@
case 'C':
ftpcat = 2;
break;
+ case 'L':
+ if (inet_pton(AF_INET, opt.arg, &fi.ourCtlAddr.sin_addr) <= 0) {
+ (void) fprintf(stderr, "Warning: could not resolve address specified by -L flag: %s\n", opt.arg);
+ }
+ break;
default:
Usage();
}
diff -ubBr ncftp-3.2.0/sh_util/ncftpput.c ncftp-3.2.0-bind/sh_util/ncftpput.c
--- ncftp-3.2.0/sh_util/ncftpput.c 2006-08-12 08:36:29.000000000 +0900
+++ ncftp-3.2.0-bind/sh_util/ncftpput.c 2007-09-09 17:17:51.000000000 +0900
@@ -230,7 +230,7 @@
perfilecmd[0] = '\0';

GetoptReset(&opt);
- while ((c = Getopt(&opt, argc, argv, "P:u:j:p:h:e:d:U:t:mar:RvVf:o:AT:S:EFcCyZzDbB:W:X:Y:")) > 0) {
+ while ((c = Getopt(&opt, argc, argv, "P:u:j:p:h:e:d:U:t:mar:RvVf:o:AT:S:EFcCyZzDbB:W:X:Y:L:")) > 0) {
if (c == 'b') {
batchmode++;
}
@@ -250,7 +250,7 @@
}

GetoptReset(&opt);
- while ((c = Getopt(&opt, argc, argv, "P:u:j:p:h:e:d:U:t:mar:RvVf:o:AT:S:EFcCyZzDbB:W:X:Y:")) > 0) switch(c) {
+ while ((c = Getopt(&opt, argc, argv, "P:u:j:p:h:e:d:U:t:mar:RvVf:o:AT:S:EFcCyZzDbB:W:X:Y:L:")) > 0) switch(c) {
case 'P':
fi.port = atoi(opt.arg);
break;
@@ -380,6 +380,11 @@
STRNCAT(postcmd, opt.arg);
STRNCAT(postcmd, "\n");
break;
+ case 'L':
+ if (inet_pton(AF_INET, opt.arg, &fi.ourCtlAddr.sin_addr) <= 0) {
+ (void) fprintf(stderr, "Warning: could not resolve address specified by -L flag: %s\n", opt.arg);
+ }
+ break;
default:
iperf のソース見難いなぁ。ttcp.c とかの方が良い?

2007年9月2日日曜日

いろいろ。

バタバタと忙しくて元気が無いので雑多なメモ。

NVIDIA-Linux-x86_64-1.0-9639-pkg2

2.6.23-rc2 以降位でコンパイル通すためのパッチ。
--- nv/nv-linux.h       2007-04-17 13:03:18.000000000 +0900
+++ nv-new/nv-linux.h 2007-09-02 18:06:02.000000000 +0900
@@ -528,7 +528,7 @@
#define NV_KMEM_CACHE_CREATE(kmem_cache, name, type) \
{ \
kmem_cache = kmem_cache_create(name, sizeof(type), \
- 0, 0, NULL, NULL); \
+ 0, 0, NULL); \
}

#define NV_KMEM_CACHE_DESTROY(kmem_cache) \
Only in nv-new: nv-linux.h.orig
Only in nv-new: nv-vm.o
diff -ubBr nv/nv.c nv-new/nv.c
--- nv/nv.c 2007-04-17 13:03:18.000000000 +0900
+++ nv-new/nv.c 2007-09-02 18:06:02.000000000 +0900
@@ -107,7 +107,8 @@

static int nv_mmconfig_failure_detected = 0;

-static kmem_cache_t *nv_pte_t_cache = NULL;
+static struct kmem_cache *nv_pte_t_cache;

// allow an easy way to convert all debug printfs related to events
// back and forth between 'info' and 'errors'
@@ -1423,8 +1424,7 @@
if (apm_nv_dev[i] != NULL) pm_unregister(apm_nv_dev[i]);
#endif

- if (unregister_chrdev(nv_major, "nvidia") < 0)
- nv_printf(NV_DBG_ERRORS, "NVRM: unregister nv chrdev failed\n");
+ unregister_chrdev(nv_major, "nvidia");

for (i = 0; i < num_nv_devices; i++)
{
@@ -1450,8 +1450,7 @@

nv_printf(NV_DBG_INFO, "NVRM: nvidia_exit_module\n");

- if (unregister_chrdev(nv_major, "nvidia") < 0)
- nv_printf(NV_DBG_ERRORS, "NVRM: unregister nv chrdev failed\n");
+ unregister_chrdev(nv_major, "nvidia");

for (i = 0; i < num_nv_devices; i++)
{

[PATCH 0/25 -v2] paravirt_ops for x86_64, second round

おなじ x86_64 で lguest (paravirt_ops) のパッチが LKML に 2度目? 投げられているが 2.6.24 になるのかしら?

遅延 ACK

TCP の sliding window の話をしていたところ「遅延 ACKとゆーものがあって、受信側はウィンドウサイズ (cwnd?) 分のパケットを受け取った後でないと ACK を返さない」とおかしな事を言い切っていたが、そんな実装もあるのか? Web をウロウロしていたら linux では quickackというものがあり...評判が悪いらしい。けど、どういった状態で delayed ACK を無効にするか知りたいが、そう。TCP のコードも私にとっては難解。

あとあと piggyback を使っているアプリケーションってある? 先日の lsrr を iperf に実装すべくコード読み始めたけど読み辛い....

2007年8月18日土曜日

LSRR の受信?

受信か送信かどうでも良くなってしまったが、LSRR 使えなかった原因の一つは NIC によるものだったらしい。とっても古い (らしい) 3Com の 3c905C というもので /sys/class/net/eth0/features の値は 3。意味するところは include/linux/netdevce.h から
....
#define NETIF_F_SG 1 /* Scatter/gather IO. */
#define NETIF_F_IP_CSUM 2 /* Can checksum only TCP/UDP over IPv4. */
#define NETIF_F_NO_CSUM 4 /* Does not require checksum. F.e. loopack. */
#define NETIF_F_HW_CSUM 8 /* Can checksum all the packets. */
....
boot パラメタに 3c59x.hw_checksums=0 と指定したら動いた...けど features も 0 に? scatter/gather は checksum 必須なの?

ポリシング

以前 egress も police でできるのでは? と書いて、試してみた。
# tc qdisc add dev eth1 root handle 10: prio
# tc filter add dev eth1 parent 10: protocol ip prio 20 u32 match u8 0 0 police rate 1Mbit buffer 64Kb drop flowid :1
# iperf -c toptor4
------------------------------------------------------------
Client connecting to toptor4, TCP port 5001
TCP window size: 16.0 KByte (default)
------------------------------------------------------------
[ 3] local 172.27.129.1 port 57260 connected with 172.27.129.2 port 5001
[ 3] 0.0-10.0 sec 1.26 MBytes 1.05 Mbits/sec
それなり。ingress も同様で burst の値でだいぶ変わるけど、まぁそれなり....
あと flowid :1 も ingress 同様どうでも良いのか?

2007年8月15日水曜日

lguest のネットワーク

(ユーザスペースの) lguest のオプションは、何も指定しないと
lguest: Usage: lguest [--verbose] [--sharenet=<filename>|--tunnet=(<ipaddr>|bridge:<bridgename>)
|--block=<filename>|--initrd=<filename>]...
<mem-in-mb> vmlinux [args...]
となる。この内ネットワークに関する部分は
--sharenet=<filename>
どうもゲスト間のインターフェース。ファイル名だし

--tunnet
TUN/TAPを使う。TUN と TAP って linux で区別されているのか知らない...
<ipaddr>
よくある? peer to peer のインターフェース。試していないが一番てっとり早いと思われる

bridge:<bridgename>
これが本題。README にはホストと同じセグメントにすべく例があるけど、別共有ネットワークも簡単に作れる。当初個々ゲストに上の ipaddr を指定して、後で tap# をブリッジに加えてあげれば良いかな。と考えていたが、良く考えてくれてあってブリッジだけ作っておけば、勝手に tap# 作って加えてくれる。
なので conntrack-tools のテストケースであればホストを A として
# brctl addbr lguest
# ... ブリッジいろいろ
# lguest 64m --block FW1.img --tunnet bridge:lgbr --sharenet ether0 --sharenet ether2 vmlinux root=/dev/lgba
# lguest 64m --block FW2.img --tunnet bridge:lgbr --sharenet ether0 --sharenet ether2 vmlinux root=/dev/lgba
# lguest 64m --block B.img --sharenet ether0 vmlinux root=/dev/lgba
でイケそうな感じ。eth0 eth2 のパケットも見たいのであれば、取り急ぎ sharenet 止めてブリッジ作ってあげれば良い?

2007年8月14日火曜日

lguest のコンソール

2.6.23-rc に入ったので lguest 再度試してみる。まだ FAQ には反映されていないけど、patch の中にこんな記述があった。
Q: Why don't I have a console when I boot my image?

A: Most images are set up to create a console virtual consoles (/dev/tty0 etc), but the lguest console is /dev/hvc0: look for a line like "1:2345:respawn:/sbin/getty 38400 tty1" in /etc/inittab and change "tty1" to o "hvc0".
debootstrap でイメージ作った後にゲストの /dev に移動して
mknod hvc0 c 229 0
上記通り inittab を書き換えて... root でログインできん。で /etc/securetty に hvc0 を追記。やっと最初の一歩。

2007年8月8日水曜日

TCP の checksum

なさけないはなしー
 /* This routine computes an IPv4 TCP checksum. */
を見付けるまでに 1時間以上。イカンですな。未だ netcat の -g 使った lsrr を動作できたりできなかったり。tcpdump の出力信じるならば checksum がおかしい。ということで追ってみたところ net/ipv4/tcp_ipv4.c::tcp_v4_send_check() にて上記コメント発見。SYN_SENT で ack を受け取った場合を追ってみると
tcp_v4_do_rcv()
>> tcp_rcv_state_process()
>>>> tcp_rcv_synsent_state_process()
>>>>>> tcp_send_ack()
>>>>>>>> tcp_transmit_skb() この中で
inet_connection_sock_af_ops ipv4_specific->send_check() が...
tcp_v4_send_check() では CHECKSUM_PARTIAL で処理分け。lwn を見ると
That value has been replaced with CHECKSUM_PARTIAL (intended for outgoing packets where the job must be completed by the hardware) and CHECKSUM_COMPLETE (for incoming packets which have been completely checksummed by the hardware).
仰しゃる通り関数名からも、送信側の話。送受信双方共にethtook -K で変更できるらしい。TCP もドライバも何でも...深いから、まだまだ時間かかるだろうなぁ。

2007年8月6日月曜日

zd1211rw のその後

2.6.22 にて 802.11 スタックが新たに追加され、以前のものを softmac とか ieee80211。新しいモノを mac80211 と呼ぶらしい。で vanilla kernel では zd1211rw は以前の ieee80211 にしか対応していない。その後は? と検索してみると、新しい zd1211rw-mac80211 なるものの開発も始まっているらしい。曰く
Although some driver-level code is still required,
it does fill in many blanks in our feature table:
it has stack-level support for master mode, ad-hoc, automatic rate adjustment, ...
でも developers only だそうで。 git 使えない...日本語の Git 入門 大変ありがたいです。今後も頑張って下さい。

libkeepalive

つらつらと web を彷徨って TLDP に行ってみたら TCP Keepalive HOWTO なる HOWTO があった。まぁ細かいとこ...と眺めていったところ libkeepalive という pre load するとレガシなアプリケーションでも keepalive 投げるようになる wrapper の紹介でした。ファイアウォールのタイムアウト値上限で悩んでいる方は良いカモ。

XORP その後

Open Tech Press に Vyatta 2.2ベータがリリース なる記事が掲載されていた。大元? の XORP 1.4 の release notes 眺めると...
ALL:
...
- Implementation of OSPFv3 (draft-ietf-ospf-ospfv3-update-14.txt).
おぉ。でも deb パッケージが無いので根性ナシはここまで

2007年7月31日火曜日

rp_filter って?

linux ネットワークセキュリティのことはじめ。みたいなページに /proc/sys/net/conf/eth#/rpfilter は 1 にしましょう。らしき事が書かれており、盲目的にそーゆーモン。と信じていたが LSRR 試し始めてふと気になった。

本来ならば net/ipv4/fib_frontend.c の fib_validate_source() をフムフムと読みたいところなのだが... Understanding Linux Network Internals の力を借りる始末。曰く入ってきたデバイスの経路を調べて、そのデバイスを経由した到達の可否を判断 --- Reverse Path Filter --- ということらしい。淋しい自身の経路を示すと
# ip route ls
172.27.202.0/24 via 172.27.129.1 dev eth0 proto zebra metric 20
172.27.200.0/24 via 172.27.129.1 dev eth0 proto zebra metric 20
172.27.140.0/24 dev tap0 proto kernel scope link src 172.27.140.1
172.27.102.0/24 via 172.27.129.1 dev eth0 proto zebra metric 20
172.27.129.0/24 dev eth0 proto kernel scope link src 172.27.129.2
172.27.130.0/24 dev vmnet1 proto kernel scope link src 172.27.130.1
172.27.100.0/24 via 172.27.129.1 dev eth0 proto zebra metric 20
172.27.131.0/24 via 172.27.130.254 dev vmnet1 proto zebra
172.27.1.0/24 via 172.27.129.1 dev eth0 proto zebra metric 20
default via 172.27.129.1 dev eth0
となっている場合において vmnet1 は 172.27.130.0/24 と 172.27.131.0/24 のみ。よって、これら以外のソースアドレスを持ったパケットが vmnet1 に入ってきた場合は落とすよ。というお話。

名前から推測するという情けなさだが、先の fib_validate_source() を一瞥すると rpfilter エントリは
  rpf = IN_DEV_RPFILTER(in_dev);
さらにinclude/linux/inetdevice.h を眺めて
#define IN_DEV_ANDCONF(in_dev, attr) \
(IPV4_DEVCONF_ALL(attr) && IN_DEV_CONF_GET((in_dev), attr))
....
#define IN_DEV_RPFILTER(in_dev) IN_DEV_ANDCONF((in_dev), RP_FILTER)
となっているので vmnet1 というデバイスの場合であれば /proc/sys/net/ipv4/conf/all/rpfilter と /proc/sys/net/ipv4/conf/vmnet1/rpfilter 両方が 1 となっている場合のみ有効...らしい。FIB 周りっていつになったら理解できるんだろう。

2007年7月12日木曜日

lguest for 2.6.22

コンパイルでエラーになってしまったので、2.6.21 の頃のものと比較。
--- arch/i386/kernel/asm-offsets.c.orig 2007-07-12 00:06:33.000000000 +0900
+++ arch/i386/kernel/asm-offsets.c 2007-07-12 00:17:51.000000000 +0900
@@ -16,6 +16,10 @@
#include <asm/processor.h>
#include <asm/thread_info.h>
#include <asm/elf.h>
+#ifdef CONFIG_LGUEST_GUEST
+#include <linux/lguest.h>
+#include "../../../drivers/lguest/lg.h"
+#endif

#define DEFINE(sym, val) \
asm volatile("\n->" #sym " %0 " #val : : "i" (val))
@@ -115,4 +119,17 @@
OFFSET(PARAVIRT_iret, paravirt_ops, iret);
OFFSET(PARAVIRT_read_cr0, paravirt_ops, read_cr0);
#endif
+#ifdef CONFIG_LGUEST_GUEST
+ BLANK();
+ OFFSET(LGUEST_DATA_irq_enabled, lguest_data, irq_enabled);
+ OFFSET(LGUEST_PAGES_host_gdt_desc, lguest_pages, state.host_gdt_desc);
+ OFFSET(LGUEST_PAGES_host_idt_desc, lguest_pages, state.host_idt_desc);
+ OFFSET(LGUEST_PAGES_host_cr3, lguest_pages, state.host_cr3);
+ OFFSET(LGUEST_PAGES_host_sp, lguest_pages, state.host_sp);
+ OFFSET(LGUEST_PAGES_guest_gdt_desc, lguest_pages,state.guest_gdt_desc);
+ OFFSET(LGUEST_PAGES_guest_idt_desc, lguest_pages,state.guest_idt_desc);
+ OFFSET(LGUEST_PAGES_guest_gdt, lguest_pages, state.guest_gdt);
+ OFFSET(LGUEST_PAGES_regs_trapnum, lguest_pages, regs.trapnum);
+ OFFSET(LGUEST_PAGES_regs_errcode, lguest_pages, regs.errcode);
+ OFFSET(LGUEST_PAGES_regs, lguest_pages, regs);
+#endif
}
とりあえず通るは通った。

2007年7月11日水曜日

LSRR の受信

ちょっと情けないが、ちょっと jot。興味があちこちしてしまいデジャヴばかりの様な気がする。
ip_rcv()
NF_IP_PREROUTING
ip_rcv_finish()
ip_rcv_options() ヘッダ長 20バイト超ならばオプションあり
ip_rcv_options_compile() sk_buff 内 cb に設定
ip_opeions_rcv_srr()
ip_route_input()
ip_route_input()
dst_input()

ip_forward()
NF_IP_FORWARD
ip_forward_finish()
ip_forward_options()
dst_output()
ip_output()
ip_fragment()

skb->pkt_type は eth_type_trans() にて設定
rt->rt_type の設定は....
ip_route_input()
ip_route_input_slow()
ip_mkroute_input()
(ip_mkroute_input_def())
__mkroute_input()
rt_set_nexthop()
output側も同じ感じ。
ip_local_deliver() は ip_route_input_slow() にて rth->u.dst.input に

ip_local_deliver()
NF_IP_LOCAL_IN
ip_local_deliver_finish()

先日の見難い図を簡単にすると
hostA ---- host B ---- host C
にて
  1. host B から host A , hostB を通って hostC
  2. hostC から hostB, hostA 再度 hostB に戻って hostC
といった lsrr を投げと、1.の場合は hostB。2.の場合は hostC の PREROUTING で -j LOG は取れるものの INPUT にはログが残らず、もちろん到達せず。両方の場合で IP上は src dst 共に自アドレスとなっている。/proc の accept_source_route を 1。rp_filter を 0。netfilter の全ての hook のポリシを ACCEPT としたが、通さず。2. にて hostB を通過している点、1. 2. にて PREROUTING に LOG が残っているので、ip_rcv_finish() あたりなのか...調べること。

2007年7月10日火曜日

conntrackd の internal と external キャッシュ

ソースをつらつらと眺めていたところ、少し理解できた。
internal
カーネルから (netlink 経由で) 受け取った内容を展開。なので master 側の話

external
マスタから (マルチキャストで) 受け取った内容を展開。なので slave 側の話。VRRP でマスタが落ちたと判断した場合、この内容を (netlink 経由で) カーネルに通知。通知を受けたカーネルは netlink で通知。で巡り巡って旧 slave 現 master となった internal に展開される。
じゃ internal って意味ないじゃん。と思ったのだが、これは master と slave のやりとり --- プロトコル --- の問題らしい。

sync モードと nack モードなるものがあり、現在 nack モードを推奨。internal を参照しているのは sync モードのみらしく、しかも ENOBUFS の時のみ。nack モードの場合どんなやりとりか調べること。でも、まだ実際に稼働させたことなし.... virtualize 何にしようか。

2007年7月9日月曜日

いろいろ。

元気がないので、記事引用などなど
OLS 2日目:カーネル開発、ファイルシステムについての講演。タイトルとは無関係っぽいが
 Anton Blanchard氏によって手短にデモが行なわれたPower6プロセッサには、4.7GHzのコアが16基搭載されていた。Blanchard氏がデモを印象付けるために、Linuxカーネルを10回コンパイルするベンチマークツールを使用してデモを行なったところ、たったの20秒で完了した。
あーはっはっはっはっはっはぁ....

Lguest ソッコーで 2.6.22 のパッチが出ていた
Releases

The good news is: lguest is all one big kernel patch, including the launcher. You can download the latest patch for 2.6.22.
やっぱ買うなら x86 かぁ。

TCPの輻輳制御について。2.6.22 のもの全てではないが TCP and Linux' Pluggable Congestion Control Algorithmsなくなってくれるな。まだ読んでいない。また末尾のリンクも良さげ。

2007年7月3日火曜日

conntrack と LSRR

ソースルーティング (ポリシのではない) を試すべく

~~~~~~~~~~~~~~~ +-----------+ +---------+ +---------+
{ The Internet} ----+ firewall+----+ host 1 +----+ host 2 |
~~~~~~~~~~~~~~~ +-----------+ +---------+ +---------+
<-----------------<
>-------------------------------->

みたいな構成で試したところ... firewall から出ない。accept_source_route は 0 なのに何故? ふと思い HOWTO 見た一般過程向き? のルールの抜粋
 
-A block -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A block -i ! eth0 -m conntrack --ctstate NEW -j ACCEPT
-A block -j DROP
DROP の前に LOG を入れてみると見事 dmesg に表示。う〜んと悩むこと小一時間。結果は state に INVALID を入れてあげれば通った。iptables (8) から抜粋すると
Possible states are INVALID meaning that the packet is associated with no known connection,
lsrr 面倒見ないよ、知らん。って事らしい。
で、こちらも中途....

2007年6月26日火曜日

conntrackd に至る前置き

古い記事ですが、Slashdot 本家に Firewall Failover With pfsync And CARPという記事があった。良いなぁ。と linux 周りを眺めていたら ct_sync? という conntrackd 実装している方が、以前全てカーネルスペースで実装しようとしていた形跡を発見。ML にも入らず日々ダラダラ過ごしていたところ、conntrackd なるものを発見。ct_sync より勢いがありそうな感じで今後に期待....というのが今更ながらの前置き。そうそう CARP と conntrackd 使ってみたらしき ML への投稿があった気がする。

元気が無いのでまたまた貢献できないと思ふぅ。商用ファイアウォール製品と比較して、辛いな。と思う部分ですので、頑張って下さい。

conntrackd のオプション

目に余る逸脱ぶりなので、ちょっと戻る。-c の ``external cache'' という言葉に戸惑う。相変わらず内部、外部キャッシュの意味を理解していない.... conntrack-tools/src/main.c から

static const char usage_client_commands[] =
"Client mode commands:\n"
" -c, commit external cache to conntrack table\n"
(プライマリ) 外部のキャッシュをコミット

" -f, flush internal and external cache\n"
(プライマリ、バックアップ) キャッシュのクリア

" -F, flush kernel conntrack table\n"
(バックアップ) カーネルの conntrack テーブルのクリア

" -i, display content of the internal cache\n"
内部キャッシュの表示

" -e, display the content of the external cache\n"
外部キャッシュの表示

" -k, kill conntrack daemon\n"
停止

" -s, dump statistics\n"
統計情報表示

" -R, resync with kernel conntrack table\n"
(プライマリ) カーネルの conntrack テーブルとの再同期

" -n, request resync with other node (only NACK mode)\n"
(ん? script_.*.sh にない) NACK モードにて他ノードとの再同期

" -x, dump cache in XML format (requires -i or -e)";
どーゆ経過か知らないけどキャッシュ内容の XML 出力

linux で Gigabit

New Reno では Gbit は辛いらしいと、どこかで目にした後うろうろしていたら
How to achieve Gigabit speeds with Linux
というドキュメントを見付けた。要約してみると
interrupt coalescence (ハードウェアで割り込み回数減らす)
# ethtool -c eth1
Coalesce parameters for eth1:
Cannot get device coalesce settings: Operation not supported
ガーン。他 -k や -g。ethtool(8) 参照

NAPI対応のドライバ

送信キュー長の変更

ifconfig だけど流行? であれば
ip link set eth1 txqueuelen 2000
あれ? デフォルト ip link ls eth0 で 1000 ある。

受信キュー長の変更
sysctl –w sys.net.core.netdev_max_backlog=2000
ちなみにデフォルトは
# cat /proc/sys/net/core/netdev_max_backlog
1000

TCP輻輳ウィンドウ 指数増加閾値上限なし
sysctl –w sys.net.ipv4.route.flush=1
こちらは /proc 下のパーミッションが
ls -l /proc/sys/net/ipv4/route/flush
--w------- 1 root root 0 2007-06-26 22:05 /proc/sys/net/ipv4/route/flush

SACK を無効に

競合がない...目一杯自分だけのテストなので
sysctl -w net.ipv4.tcp_sack=0

TCPバッファサイズの変更

上限
  • net.core.rmem_max
  • net.core.wmem_max
  • net.ipv4.tcp_mem

デフォルト値
  • net.ipv4.tcp_rmem
  • net.ipv4.tcp_wmem

で試してないっと...

2007年6月20日水曜日

VMware workstation 6.0

Open Tech Press の記事 に VMWare6 すばらしい。らしき書かれていて眺めると
今回のWorkstation 6では、ユーザインタフェースなしでVMを実行できる。Workstationのウィンドウを閉じると、VMを電源オフにするかバックグラウンドで実行を続けるかの選択肢が表示される。これは、Webサーバなど、後で接続したいサービスをVMが実行している場合に便利だ。
と私にとって魅力的なものが。# もしかして Server でもできていた?

しかも x86_64 もあったので、早速 Upgrade して試してみたところ、まぁ上記通りライブラリ含めて 64bit になっていたし、ウィンド閉じようとすると daemon で稼働させるか聞いてくる。

2.6.22-rc をホストとした場合 sk_buff 周りの変更に vmnet が対応しておらず、ここから patch 持ってきてあてておく。cvut.cz にあった any-any-update が最近更新されていないのが少々恐い。

あとは個人的にネットワークは hostonl のインターフェースのみとして /usr/lib/vmware/net-services.sh いじって dhcp 止めるのとインターフェースのアップを vmware_bg_exec から vmware_exec へ。他 /etc/rc2.d/S19 番目。これやっておかないと dhcp の relay が動かんから。

# lguest が 32bit のみだから試すにあたって? 目的のための手段のための手段のための...

2007年6月6日水曜日

帯域増と転送速度

「10M から 100M に増速しました」増速? みたいな話のあと
「ファイル転送したけど転送時間あまり変わらないですね」
「いやぁ RTT が短くなった訳ではないですので、あまり期待しないで下さい」
....むーん、増速の速度って何よ。検索サイトに long fat pipe でお尋ねしましょう。

エンドユーザに実感してもらうには ftp がてっとり早いということで proftpd 入れて SO_SNDBUF SO_RCVBUF あたりを設定ファイルで...と調べたら tcpSendWindow tcpReceiveWindow とか...ではなく SocketOptions の rcvbuf sndbuf で指定するらしい。

カーネルコンパイルのオプション眺めると輻輳制御のアルゴリズム色々あるなぁ。10Gbit とかいう世界になると何が良いのでしょうか?

# /proc/sys/net/ipv4 以下や、ndd -set /dev/tcp も忘れずに。

tcpdump で wlan

tcpdump の filter expression でデータフレームだけ。こちら。バージョンまでひっくるめるならば
(wlan[0] & 0x0F) == 0x08
# radio header って、何見てわかったつもりになっていたっけ?
# 2.6.22 で 802.11 stack を新しい mac80211 とすると zd1211 が出てこん。

2007年5月29日火曜日

kqemu

仮想化で使ったことが無かった qemu に挑戦。debian 使っているので、DebianでQEMUを高速化する(kqemuモジュール)がとっても参考になった。細かな話だけど module-assistant の部分はどこかの madwifi のコンパイル方法にもあったが
m-a a-i kqemu
かな。QEMUのサイトにあるlinux-0.2.img.bz2 (8 MB)でも良いけど。debian であれば qemu-make-debian-root なるものがあったり qemu-img もあるけど。その後 ここここを参照しつつ

# dd if=/dev/zero of=disk.img bs=1M seek=2047 count=1
# losetup /dev/loop0 disk.img
# cfdisk -s 63 -h 16 /dev/loop0
....(1つのパーティションで bootable に)
# losetup -o 32256 /dev/loop0 disk.img
# mkfs -t ext3 /dev/loop0
# losetup -d /dev/loop0
# mkdir rootfs
# mount -o offset=32256,loop disk.img rootfs
# debootstrap --arch amd64 etch rootfs http://ring.asahi-net.or.jp/archives/linux/debian/debian
....
# chroot rootfs /bin/bash
# apt-get install kernel-image-2.6-amd64-generic grub
....
# mkdir /boot/grub
# update-grub
# cp /usr/lib/grub/x86_64-pc/* .
# exit
# umount root
# exit
# /usr/sbin/grub --no-floppy
# grub --no-floppy
Probing devices to guess BIOS drives. This may take a long time.

GNU GRUB version 0.97 (640K lower / 3072K upper memory)

[ Minimal BASH-like line editing is supported. For
the first word, TAB lists possible command
completions. Anywhere else TAB lists the possible
completions of a device/filename. ]
grub> device (hd0) disk.img
device (hd0) disk.img
grub> root (hd0,0)
root (hd0,0)
Filesystem type is ext2fs, partition type 0x83
grub> setup (hd0)
setup (hd0)
Checking if "/boot/grub/stage1" exists... yes
Checking if "/boot/grub/stage2" exists... yes
Checking if "/boot/grub/e2fs_stage1_5" exists... yes
Running "embed /boot/grub/e2fs_stage1_5 (hd0)"... 15 sectors are embedded.
succeeded
Running "install /boot/grub/stage1 (hd0) (hd0)1+15 p (hd0,0)/boot/grub/stage2 /
Done.
grub> quit
quit
# qemu-system-x86_64 disk.img
おぉ...と思ったら slashdot に こんな 記事が。さて...

# 目的のための手段のための手段のための...が目的に

2007年5月28日月曜日

Virtualizationいろいろ

順序間違えてしまった...conntrackd 試すがためにホスト 2台準備するのはツライので何か流行の仮想化を使おうと画策。Vmware Server で試したところ keepalived までは OK。でも肝心の conntrackd の挙動が怪しかったので UML に。と考えていたら、こんな比較が

TechComparison

流行? の上良さげなのは KVM だけど VT, Pacifica 対応の PC ないしぃ。Xen は vanilla に組込まれそうな気配が無さそうとの話だし、Vmware もう一度試してみようか。そうそう Workstation の 6 って良い? version up した方が良い?

2007年5月9日水曜日

conntrackd のコンパイル

以前 libnetfilter_conntrack のコンパイルができたり、できなかったりは pkg-config というパッケージがホストによって入っていたり、入っていなかったりが原因。ごめんなさい。なのでコンパイラ周りと automake libtool pkg-config 等々が必要。途中省略しまくりのログ。

$ svn co https://svn.netfilter.org/netfilter/trunk/libnfnetlink/. libnfnetlink
....
$ svn co https://svn.netfilter.org/netfilter/trunk/libnetfilter_conntrack/. libnetfilter_conntrack
....
$ svn co https://svn.netfilter.org/netfilter/trunk/conntrack-tools conntrack-tools
....
$ cd libnfnetlink
$ ./autogen.sh
....
$ ./configure --prefix=/usr/local
....
$ sudo make install
....
$ cd ../libnetfilter_conntrack/
$ ./autogen.sh
....
$ PKG_CONFIG_DIR=/usr/local/lib/pkgconfig ./configure --prefix=/usr/local
....
$ make
....
$ sudo make install
....
$ cd ../conntrack-tools
$ ./autogen.sh
....
$ PKG_CONFIG_DIR=/usr/local/lib/pkgconfig ./configure --prefix=/usr/local
....
$ sudo make install
....
$
$ cd /usr/local/lib
$ find /usr/local -ctime -20
....


svn も必要か。最近まで sudo 使わずに root になってたけど何となく使うようにしよう。sudores は
chamaken  ALL=(root) NOPASSWD: /usr/bin/make install
みたく

2007年5月8日火曜日

conntrackd のインストールについて

途中からすっげっ嫌になったので、すっげっ意訳となってしまつたぁ...

How to install the conntrack-tools

このドキュメントにて conntrack-tools のセットアップ方法を詳しく述べます。

0. Introduction

conntrack-tools パッケージには二つのプログラムを含みます:
  • conntrack: connection tracking システムとやり取りをするコマンドラインインターフェース。
  • conntrackd: ハイアベイラビリティな GNU/Linux のファイアウォールを配備するために使用し、ファイアウォールの使用統計を収集することができる connection tracking ユーザスペースデーモン。

1. Requirements

conntrack-tools を動作させるために以下のソフトウェアをインストールしなければなりません。先に進む前にこれらが正しくインストールされているか確認して下さい。
  • linux kernel バージョン >= 2.6.18 (http://www.kernel.org)とサポートできるようにするのは:
    • connection tracking system (quite obvious ;)
    • nfnetlink
    • ctnetlink (ip_conntrack_netlink)
    • connection tracking event notification API
  • libnfnetlink: オフィシャルリリース netfilter.org から取得可能な netfilter netlink ライブラリ。
  • libnetfilter_conntrack:
    オフィシャルリリース netfilter.org から入手できるnetfilter conntrack ライブラリ。
2. Basic Installacion

conntrack-tools をコンパイル、インストールためには、ただ一般的な以下のステップに従うだけです。
./configure
$ make
# make install
この時点でコマンドラインインターフェース `conntrack' を使うことが できます。しかし `conntrackd' と呼ばれるユーザスペースデーモンを動 作させるためにはいくつかの魔法の言葉が必要です。

3. Setting up conntrackd

現在 conntrackd は二つの動作モードを持ちます: 統計モードと同期モード双方の詳細について以下述べます。

3.1. Synchronization mode

conntrackd は Linux 上のステートフルファイアウォールの接続の状態を複製することができます。この章ではデーモンを同期モードで設定する方法を述べます。

3.1.1. Requirements

Keepalived バージョン 1.x (http://www.keepalived.org): 使用しているディストリビューションが最近のバージョンのものかチェックして下さい。

3.1.2. Configuration

  1. keepalived のインストールと設定:
    keepalived 1.x の最新のバージョンをダウンロード、インストールします。使用しているディストリビューションに含まれているかチェックして下さい。シンプルなプライマリ/バックアップのシナリオを設定するのであれば conntrackd の tarball 内のサンプルファイルを使用することができます。
    • node 1 に対しては: conntrackd-x.x.x/examples/sync/node1/keepalived.conf
    • node 2 に対しては: conntrackd-x.x.x/examples/sync/node2/keepalived.conf

  2. これらのファイルは仮想 IP 192.168.0.100 を eth0 で、また 192.168.1.100 を eth1 で持つ二つの端末から構成されるシンプルな VRRPクラスタを設定するのに用いることができます。keepalived に詳しくないのであれば http://www.keepalived.org の公式ドキュメントを読んで下さい。step2 に進む前に keepalived が正しく稼働しているか確認して下さい。

  3. Setting up conntrackd:
    'conntrackd' を同期モードで設定するためには設定ファイルを /etc/conntrackd に置かなければなりません。
    node1 上では
    # cp examples/sync/_type_/node1/conntrackd.conf /etc/conntrackd.conf

    node2 では
    # cp examples/sync/_type_/node1/conntrackd.conf /etc/conntrackd.conf

    _type_ は現在二つある同期タイプ、パーシステントモードか NACK モード、を選びます。パーシステントモードは NACK モードよりリソースを消費しますが、NACK モードは、まだ実験的です。

    配備した設定に合うよう、これらファイルを編集するのを忘れないで下さい。

    設定ファイルを /etc/conntrackd 配下に置きたくないのであればconntrackd にオプション -C でどこを探すか教えてやって下さい。

  4. Running conntrackd

    conntrackd はコンソールモードで稼働することができます。この場合、ただ 'conntrackd' とタイプして下さい。あるいはデーモンモードで稼働させていのであれば 'conntrackd -d' とタイプして下さい。

  5. Checking that conntrackd is working fine
    conntrackd には、ステータスをチェックするための、いくつかの方法があります:
    • (別名内部キャッシュと呼ばれる) 現在このノードによって処理されている接続のキャッシュをダンプ:
      # conntrackd -i

    • (別名外部キャッシュと呼ばれる) ネットワーク内の別ノードから送信された接続についてのキャッシュをダンプ:
      # conntrackd -e

    • 複製デーモンによって収集された統計情報のダンプ:
      # conntrackd -s

  6. Setting up interaction with keepalived

    keepalived はアクティブノードが落ちたと検知すると、落ちたアクティブを置き換えるノード候補を指定します。このイベントにて外部キャッシュ、例えば? 別のノードによって処理された接続を含むキャッシュが (カーネルに?) 引渡されなければなりません。外部キャッシュを引渡すためには

    # conntrackd-c
    とタイプします。

    keepalived は別プログラムとやり取りするためのインターフェースとしてシェルスクリプトを提供しているので以下に紹介する行を keepalived の設定ファイルに記述することにより、外部キャッシュを引渡す処理を自動化できます。

    'script_master.sh' 内には以下の記述があります:
    #!/bin/sh
    /usr/sbin/conntrackd -c # commit external cache
    /usr/sbin/conntrackd -R # resync with kernel conntrack table
    よって、(アクティブノードが) 落ちたイベントにて次候補となるノードが仮想 IP と落ちるノードが処理していた接続を引き継ぎます。NACK モードでは、このファイルは異なることを見て下さい。

  7. Disable TCP window tracking
    適切なパッチがカーネルのメインラインに入るまで TCP window tracking を不能としなければなりません。以下をとりあえずの解決策とすることを検討して下さい:
    # echo 1 >  /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_be_liberal

3.2. Statistic mode

conntrackd は統計デーモンとして稼働することも可能です。興味が無いようであれば飛ばして下さい。同期モードを稼働させる必要はありません。この章ではデーモンを統計モードで設定するための方法を述べます。
  1. Configuration

    conntrackd を統計モードで設定するのは、幾分簡単です。設定ファイルをコピーするだけです。

    # cp examples/stats/conntrackd.conf /etc/conntrackd.conf

  2. Running conntrackd in statistics mode

    To run conntrackd in statistics mode:

    # conntrackd -S

    Alternatively, you can run conntrackd in daemon mode:

    # conntrackd -S -d

    In order to dump the statistics, just type:

    # conntrackd -s

    To dump the current connection forwarded, just type:

    # conntrackd -i

2007年4月17日火曜日

ポリシング

ingress の qdisc 例を探していたところホストを SYN フラッドから守るなるものがあった。filter を理解していないので、すっごい adhoc だけど eth0 の ingress ポリシングは
tc qdisc add dev eth0 handle ffff: ingress
tc filter add dev eth0 parent ffff: protocol ip prio 20 u32 match u8 0 0 police rate 1Mbit buffer 20Kb drop flowid :1
みたいな感じで OK っぽい。ただ最後の flowid :1 って何かわからん。
結局何が言いたいかと言うと、先日の TBF って頑張らなくても filter - police - action drop で同じことができるのでは? とゆー話。

有益そうなリンク。以前 netdev でアナウンスされたことがあった記憶が...で IFB って使うとデバイスにヒモ付かなくても qdisc 使えるの?

2007年4月16日月曜日

conntrackd のテストケース

2.6.18 から netfilter の state について netlink 経由でやり取りできるようになったらしい。このやり取りを multicast 使ってクラスタ組むデーモン conntrackdテストケースの意訳。ベタな上にちょっと長いけど。


Test Case

このドキュメントではシンプルなプライマリ/バックアップ設定に基づく、とてもシンプルな高可用性の設定について述べます。

Description

テストケースではファイアウォールとして動作する二つのホスト FW1 と FW2、またデスクトップとして動作する A と B から構成されます。ネットワーク概要については下図に詳述されています。

初めに、FW1 は図中赤色で強調された仮想 IP を保持していると見なします。このように配備された設定は FW1 がアクティブ FW2 がアクティブホストが落ちるのを待つという古典的なプライマリ/バックアップとなります。仮想IP を受け継ぐ過程を自動化するソフトウェアはkeepalived です。

Ruleset

FW1 と FW2 で実装されているフィルタリングポリシは以下の通りです。

[1] iptables -P FORWARD DROP
[2] iptables -A FORWARD -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
[3] iptables -A FORWARD -i eth1 -p tcp --syn -m state --state NEW -j ACCEPT
[4] iptables -A FORWARD -i eth1 -p tcp -m state --state ESTABLISHED -j ACCEPT
[5] iptables -I FORWARD -j LOG
[6] iptables -I POSTROUTING -t nat -s 192.168.0.3 -j SNAT --to 192.168.1.100
見た通り、転送するデフォルトのポリシは 破棄 [1]。ファイアウォールクラスタはホスト A から開始されるホスト B への新規 TCP 接続を 許可 [3,4] して逆方向は確立されたもののみ [2]。加えて、このクラスタはホスト A から B に向かう接続の 送信元 NATを行う。この転送ポリシに合致しないパケットは全てログに残される [5]。

Generating traffic

テストのため、ホスト A から B への SSH セッションを開始します。

Failure and Takeover

FW1 を落としてみると、すぐに FW2 が仮想 IP を受け継ぎます。

Problems

理屈では SSH 接続は FW2 にて転送されるべきですが、新たにアクティブとなったホストは、そのような接続については何も知らないため、これを新規接続と見なします。あいにく、この接続は実際は 確立されており、パケットを通過させるルール [2] に該当しません。このパケットの破棄はログに残されます。

Solution: Conntrackd

この問題を克服するためには FW1 と FW3 に conntrackd を配備しなければなりません。このデーモンはアクティブノードによって転送された接続の状態を複製するのでバックアップは適宜この接続を引き継ぐことができます。アクティブノードによって転送された接続の状態をダンプさせることができます。

(shell FW1)# conntrackd -i
tcp 6 ESTABLISHED src=192.168.0.3 dst=192.168.0.100 sport=51356
dport=22 src=192.168.0.100 dst=192.168.1.3 sport=22 dport=51356
[ASSURED] mark=0 [active since 5s]
バックアップノードでは複製された接続を観測することができます。
(shell FW2)# conntrackd -e
tcp 6 ESTABLISHED
src=192.168.0.3 dst=192.168.0.100 sport=51356 dport=22
src=192.168.0.100 dst=192.168.1.3 sport=22 dport=51356 [ASSURED] mark=0
[active since 2s]

2007年4月9日月曜日

TBF

ポリシングとシェーピングあたりが違いがわかりやすかった。加えて Linux 特化な部分があるけど このあたりにある
Other info: very good paper about tbf (6 pages, 17 May 2001)
からの図もわかりやすい。意訳すると...

バケツがトラフィックフローの平均送信レートを表すトークンによって補充されるレートである rate。トークンバケツが貯めることができるトークン数である bucket size あるいは burst size。limit はバケツのサイズとキューのサイズの合計。これによって TBF がポリシングするかシェーピングするか決める。limit が bucket size と同じならばキューのサイズは 0 となり、(descipline に) 従わないパケットはドロップされる。つまりポリシング。limit が bucket size より大きいならば...

で、ポリシングの場合は
tc qdisc add dev eth1 root tbf rate 1Mbit burst 20Kb limit 20Kb
で iperf 使って測ると見事ソレらしい数値になった。
もう一回。limit と burst が同じならばポリシング、limit が burst より大きくなると、それなりにシェーピング。

2007年3月27日火曜日

libnetfilter_conntrack

svn update をしたところ、ちょこっと変更されていたので再 make。以前手元の automake (aclocal?) で作成された configure が不完全で無理矢理手直ししていたが解消。その代わりと言ってはナンだが pkg-config の設定? をきちんとせねばらななくなった。何のことは無い PKG_CONFIG_PATH=/usr/local/lib/pkgconfig して configure 走らせれば良いだけのコト。忘れないよーに。

virtual IP

結果としては keepalived.conf の virtual_ipaddress のサブネットを指定し忘れていたのがイカンかった。正しくは
virtual_ipaddress {172.27.100.254/24 } 
のサブネット /24 を指定しなかったために /32 が via 実アドレスで OSPF に流れてしまい、さてこの /32 をどうやって消そうか。とウンウン悩んでしまった。

なので設定ミス。ということだったけど VRRP (HSRP) の Virtual IP アドレスを OSPF で配布する場合の一般的な方法ってどうしてるんだろ? 今回は keepalived の向こう側のセグメントを static で virtual IP アドレス。としてしまったが。

本来は広告する側で制御すべきものだと思うのだけど directory connected なので route-map 使えないし OSPF で distribute-list 使わん方が良いと書かれているし Cisco の FAQ 見ると RFC でエリア内は必ず優先する。ってある。む〜ん...

2007年3月13日火曜日

うっとーしー ssh アクセスの客

自宅につなぎっぱのノート PC があり、どこからでも ssh のアクセス OK だけどパスワード認証はだめだよ。としていたけど
Mar 12 23:59:30 localhost sshd[6163]: Invalid user test from  ###.###.###.###
Mar 12 23:59:31 localhost sshd[6165]: Invalid user guest from ###.###.###.###
Mar 12 23:59:32 localhost sshd[6167]: Invalid user admin from ###.###.###.###
みたいなログが沢山で ADSLモデムのランプがちゃかちゃかと...

何か良いものは無いかと探したところ perl のスクリプトでログ見て iptables のルール作るようなものがあったけど...で、更に探してみたところ iptables の recent というモジュールがあった。先にこっち見付けるべきだろ。

-A INPUT -i ppp0 -p tcp -m tcp --dport 22 -m state --state NEW -m recent --set --name DEFAULT --rsource
-A INPUT -i ppp0 -p tcp -m tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 5 --name DEFAULT --rsource -j DROP

ssh の最初の syn を送ってきたソースアドレスを DEFAULT という名前のリストに保存。このリストにエントリがあって 60秒間に 5回以上アクセスしてきたら DROP。う〜ん、ありがたい...

2007年2月28日水曜日

conntrackd の internal と external cache

include/conntrackd.h から

struct ct_sync_state {
struct cache *internal; /* internal events cache (netlink) */
struct cache *external; /* external events cache (mcast) */

internal の netlink って kernel conntrack table と同義?

IPS_ASSUREDって?

TCPの場合

struct nf_conntrack_l4proto nf_conntrack_l4proto_tcp4 =
{
....
.packet = tcp_packet,

struct nf_conntrack_l4proto nf_conntrack_l4proto_tcp6 =
{
....
.packet = tcp_packet,
net/netfilter/nf_conntrack_proto_tcp.c::tcp_packet()にて

  • IPS_SEEN_REPLY が立っていて

  • IPS_ASSURED が立っていなくて

  • old_state が TCP_CONNTRACK_SYN_RECV か TCP_CONNTRACK_ESTABLISHED で new_state が TCP_CONNTRACK_ESTABLISHED

の場合 conntrack->status に IPS_ASSURED を立てる...とゆーことは IPS_SEEN_REPLY が前提。nf_conntrack_proto_tcp.c の頭の方に TCP の conntrack での状態遷移あり。機会があれば絵にしたいなぁ。

2007年2月22日木曜日

zd1211rw の Master mode

zd1211rw デバイスに対して iwconfig eth# mode Master とすると、エラー。ちょっと眺めると ioctl のリクエストコード SIOCSIWMODE については zd_mac.c:int zd_mac_set_mode() が処理。中を見ると
        switch (mode) {
case IW_MODE_AUTO:
case IW_MODE_ADHOC:
case IW_MODE_INFRA:
mac->netdev->type = ARPHRD_ETHER;
break;
case IW_MODE_MONITOR:
mac->netdev->type = ARPHRD_IEEE80211_RADIOTAP;
break;
default:
dev_dbg_f(zd_mac_dev(mac), "wrong mode %u\n", mode);
return -EINVAL;
}
include/linux/wireless.h で定義されてる
#define IW_MODE_MASTER  3       /* Synchronisation master or Access Point */
は EINVAL 扱い。というわけで他力本願としては zd_mac.c をパッチの都度眺めるということで。

単身赴任者のネットワーク 1

仕事の都合上ウィークデイは独身貴族^H^H^H^H単身赴任という辛い状況なのです。で自宅からとアパートから、2箇所からインターネットに接続できる環境にあるので 簡単な VPN環境となっています。字ばっかの blog もなぁ。と図を書こうと dia を立ち上げたものの、上手いことイカン。

スクリプト書いて、それ実行すれば良いだけなのだけど、備忘録としてメモ。自宅の ISP IPV4 アドレスとアパートの ISP IPv4 アドレス間で IPSec の transparent モード。更に gre 掘る。何で gre にしたかとゆーと、IPv6 も使いたかったから。quagga で ospf6d 動かしたかったから。ハマッたのは MTU が違ったので、小さい方に合わせた点。いじょ。
ip link set gre1 up multicast on mtu 1388
# あ、木曜日定例の洗濯機のピーピー音が...

2007年2月21日水曜日

CIDRを class Bで。

やべっ。一週間以上経過。気にしない気にしない、一休み一休み。

VMWare の Server であれば、X動いていなくても GuestOS 走りっぱなしにできるっぽいけど UML の方が何の根拠もなく、リソース少なそうなので 2台の PC にて計 6つ GuestOS 動かしっぱなし。で bind でホスト名登録しようとしてプライベートで使っている class B を 2つの bind で管理するには CIDR, CIDR な〜んて...できるワケがない。そもそも /24 より小さなセグメント分けのためのものなので、無理矢理 CNAME でやろうとすると親の逆引き zone ファイルが 60,000以上のエントリに...

やるわけないって? やっちゃいました、無理矢理。最初スクリプト書いて 60,000 以上のエントリだったけど bind9 附属のドキュメント見たところ $GENERATE なるものが。で、こんな感じ


$ORIGIN 16.172.in-addr.arpa.
$GENERATE 1-254 $.1 CNAME $.1.foo
$GENERATE 1-254 $.2 CNAME $.2.foo
...
$GENERATE 1-254 $129 $.129.bar
$GENERATE 1-254 $130 $.130.bar


slave 側は当然 60,000 以上のエントリに。まねしないよーに...

2007年2月6日火曜日

UML の環境 その 2

udev入れたのに MACアドレス指定していなかった。で eth# が無いとエラー。 /etc/udev/rules.d/z25_persistent-net.rules を消すという姑息な手段で逃げる。ちょっと長くなるけど uml_switch の起動スクリプト。debian のものをちょこっと変更しただけ。

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/bin/uml_switch
NAME=uml_switch
DESC="User-mode networking switch"

PIDFILE_0=/var/run/uml-utilities/$NAME.0.pid
PIDFILE_1=/var/run/uml-utilities/$NAME.1.pid
PIDFILE_2=/var/run/uml-utilities/$NAME.2.pid

test -x $DAEMON || exit 0

set -e

UML_SWITCH_USER="uml-net"

UML_SWITCH_CTL_0="/var/run/uml-utilities/switch.0"
UML_SWITCH_CTL_1="/var/run/uml-utilities/switch.1"
UML_SWITCH_CTL_2="/var/run/uml-utilities/switch.2"

OPTIONS_0="-tap tap0 -hub -unix $UML_SWITCH_CTL_0"
OPTIONS_1="-hub -unix $UML_SWITCH_CTL_1"
OPTIONS_2="-hub -unix $UML_SWITCH_CTL_2"


case "$1" in
start)
echo -n "Starting $DESC: "
if [ "x$UML_SWITCH_START" = "xfalse" ] ; then
echo " Disabled."
exit 0
else
echo -n " $NAME"
fi

for i in 0 1 2; do
eval start-stop-daemon --start --quiet --pidfile \$PIDFILE_${i} \
--make-pidfile --background --chuid \$UML_SWITCH_USER \
--exec $DAEMON -- \$OPTIONS_${i}

WAIT=5
while ! eval test -e \$UML_SWITCH_CTL_${i}; do
sleep 1
WAIT=$(($WAIT - 1))
if [ $WAIT -le 0 ]; then
eval echo "\$DAEMON never created control socket \$UML_SWITCH_CTL_${i}" >&2
exit 1
fi
done

eval chmod 777 \$UML_SWITCH_CTL_${i}
done
echo "."
;;
stop)
echo -n "Stopping $DESC: $NAME"
for i in 0 1 2; do
eval start-stop-daemon --stop --quiet --pidfile \$PIDFILE_${i} \
--oknodo --exec \$DAEMON
eval rm -f \$PIDFILE_${i} \$UML_SWITCH_CTL_${i}
done
echo "."
done
echo "."
;;
restart|force-reload)
$0 stop
$0 start
;;
*)
N=/etc/init.d/$NAME
# echo "Usage: $N {start|stop|restart|reload|force-reload}" >&2
echo "Usage: $N {start|stop|restart|force-reload}" >&2
exit 1
;;
esac

exit 0
更に同じディレクトリに linux というバイナリがある前提の起動用

if [ -z $1 ]; then
echo "what number?" 1>&2
exit
fi

nohup ./linux \
ubda=rootfs_$1 \
ubdb=swap_$1 \
mem=64m \
eth0=daemon,26:4b:fb:b7:fb:0${1},,/var/run/uml-utilities/switch.0 \
eth1=daemon,26:4b:fb:b7:fb:1${1},,/var/run/uml-utilities/switch.1 \
eth2=daemon,26:4b:fb:b7:fb:2${1},,/var/run/uml-utilities/switch.2 \
con0=null > uml_${1}.log 2>&1 &
いや、こんなこと や dhcp の冗長とかやってみたくて...

2007年1月30日火曜日

UML の環境 その 1

何やってんのか...目的のための手段が目的になってばっかり。NFS 扱いちょっと不満。ネットワーク周りは debian で楽だから。と書かれていたので uml_switch を使っているのだけど autofs で mount している /home を hostfs では mount できんし、そもそも NFS 経由で mount できん。NFS ERR パケット多発。あと 2.6.19.2 i386 でコンパイルする場合は

--- stub.h.orig 2007-01-30 19:43:19.000000000 +0900
+++ stub.h.patched 2007-01-30 19:43:46.000000000 +0900
@@ -9,6 +9,7 @@
#include <sys/mman.h>
#include <asm/ptrace.h>
#include <asm/unistd.h>
+#include <asm/page.h>
#include "stub-data.h"
#include "kern_constants.h"
#include "uml-config.h"

が必要になるかも。で持ってきた debian の rootfs イメージは shadow になっていないらしいので passwd を reconfigure。あとは uml_switch で -hub を指定してあげないと UML 同士で接続できない...ってとこか。そうそう udev をインストールしておかないと swap でハマる。

2007年1月29日月曜日

UML の build

ソースから UML をコンパイルしようとしたら、エラーで止まってしまった。よくドキュメントを読んでみたら

make ARCH=um mrproper
make ARCH=um defconfig

あたりが抜けてた。忘れないよーに。

2007年1月22日月曜日

open("~/")

User-Mode-Linux の時に書いたバイナリとか root fs とか置いて下さっているサイト から 2.6.19.2 のバイナリとか持ってきたけど動かん... strace すると open("~/.uml", , O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY) が ENOENT になる。で x86_64 では、この部分 /home/hoge/.uml になっている様だが...自分でコンパイルしろっ。ってコトですね。

2007年1月16日火曜日

User-Mode-Linux

Open Tech Press に User-Mode-Linux の 記事があった。
サイトがちょっと 新しくなったそうだ。
あと rootイメージの良さげなサイト
vmware-server 使わせてもらっているけど、久し振りに...

2007年1月14日日曜日

今年の目標

今更ながら...週に一度位記録を残そうか。
あまり気負いせずに。

ブログ アーカイブ