SunOS 4.1.4 で MTU値を変更するには

SunOS 4.1.4
YAMAMORI Takenori


SunOS 4.1.4 では、他の OS とは違って ifconfig コマンドを使っても MTU値の変更はできません。このページでは、adb を使ってカーネルメモリを直接書き換え、SunOS 4.1.4 のMTU値を変更する方法を紹介します。
●MTU値の変更の必要性

ADSL でインターネットにアクセスを行なう場合、MTU値をイーサネットのデフォルトの1500 から 1454 などの値に小さく変更する必要があります。これは、通常ならば 「# ifconfig le1 mtu 1454」のように実行すればいいだけですが、SunOS 4.1.4 では ifconfig コマンドが MTU値の変更に対応していません。
なお、私自身は現在、ADSL以外のアクセス手段を用いているため、MTU値を変更する必要はないのですが、今後のためにその方法を以下に書いておきます。

●なぜ ifconfig mtu できない?

実際、SunOS 4.1.4 の ifconfig コマンドは、mtu オプションが使えないだけでなく、MTU値を表示することもできません。
しかし、 /usr/include/sys/sockio.h を見ると、その中では SIOCSIFMTU や SIOCGIFMTU がちゃんと定義されています。そこで、自分で、socket() を SIOCSIFMTU で ioctl() するようなテストプログラムを書いてみましたが、これはエラーになり、MTU値の変更はできませんでした。

○netstatコマンドは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値などの情報を表示しているようでした。


●adb を使った MTU値の変更

これで、MTU値の変更のためには、結局カーネルメモリにアクセスしなければならないことがわかりました。 そこで、そのようなC言語のプログラムを書いてやれば、MTU値の変更ができるでしょう。

しかし、ここでは、もっと簡単に、adb を使って、カーネルメモリを直接操作する方法をとることにします。

結論的には、次のようなシェルスクリプトで、MTU値の表示が可能です。

● MTU値を表示する mtustat スクリプト

#!/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 の実行例

$ ./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値が変更されたことが確認できます。


To 『SunOS 4.1.4 の謎』index

To「謎の処理系 SunOS 4.1.4 with Linux/FreeBSD/Solaris」Home
yamamori