SunOS 4.1.4 で MTU値を変更するには |
||
SunOS 4.1.4 | YAMAMORI Takenori |
ADSL でインターネットにアクセスを行なう場合、MTU値をイーサネットのデフォルトの1500
から 1454 などの値に小さく変更する必要があります。これは、通常ならば
「# ifconfig le1 mtu 1454」のように実行すればいいだけですが、SunOS 4.1.4
では ifconfig
コマンドが MTU値の変更に対応していません。
なお、私自身は現在、ADSL以外のアクセス手段を用いているため、MTU値を変更する必要はないのですが、今後のためにその方法を以下に書いておきます。
実際、SunOS 4.1.4 の
ifconfig コマンドは、mtu
オプションが使えないだけでなく、MTU値を表示することもできません。
しかし、
/usr/include/sys/sockio.h
を見ると、その中では
SIOCSIFMTU や SIOCGIFMTU
がちゃんと定義されています。そこで、自分で、socket() を SIOCSIFMTU
で ioctl() するようなテストプログラムを書いてみましたが、これはエラーになり、MTU値の変更はできませんでした。
では、SunOS 4.1.4 で MTU値を扱っているコマンドは何かというと、それは netstat です。 netstat -in を実行すると、
$ netstat -in Name Mtu Net/Dest Address Ipkts Ierrs Opkts Oerrs Collis Queue le0 1500 192.168.xx.0 192.168.xx.xx 3015 0 3 0 0 0 le1 1500 xxx.xx.xx.xx xxx.xx.xx.xxx 44100 0 6940 0 0 0 lo0 1536 127.0.0.0 127.0.0.1 40327 0 40327 0 0 0 |
…のようにMTU値を表示します。
というわけで、netstatコマンドが何をやっているかを strace
などで調べれば、SunOS 4.1.4
のMTU値の変更の手がかりがつかめるはずです。
実際には、netstat コマンドは、nlist でカーネルのシンボルテーブルを読み、カーネルのメモリを読み出す方法で MTU値などの情報を表示しているようでした。
これで、MTU値の変更のためには、結局カーネルメモリにアクセスしなければならないことがわかりました。 そこで、そのようなC言語のプログラムを書いてやれば、MTU値の変更ができるでしょう。
しかし、ここでは、もっと簡単に、adb を使って、カーネルメモリを直接操作する方法をとることにします。
結論的には、次のようなシェルスクリプトで、MTU値の表示が可能です。
#!/bin/sh adb_exec() { echo "$1" | adb /vmunix /dev/kmem } # main p=`adb_exec '*ifnet=X' | tail -1` p=`echo $p` while [ $p != 0 ] do adb_exec "*$p/S; $p+4/d; $p+6/d" | tail +2 p=`adb_exec "*($p+54)=X" | tail -1` p=`echo $p` done |
この mtustat スクリプトを実行すると次のようになります。なお、mtustat の実行には /dev/kmem へのアクセス権限が必要です。
$ ./mtustat _leops+0x7c: le 0xff004004: 0 0xff004006: 1500 _leops+0x7c: le 0xff004160: 1 0xff004162: 1500 _etherbroadcastaddr+0x134: lo _loif+4: 0 _loif+6: 1536 $ |
この例では、le0, le1, lo0 の、計3つインターフェイスの MTU値が、それぞれ 1500, 1500, 1536 であることがわかります。 これらの値が格納されているカーネルメモリのアドレスも表示されているため、あとはこれを書き換えればいいだけです。
実際に MTU値を書き換える場合は、adb を -w オプション付きで起動して、/W コマンドで書き込みます。 MTU値の変更後、この mtustat スクリプトまたは通常の netstat -in コマンドで、MTU値が変更されたことが確認できます。