Linux 機と接続するために


最初に

ほんとは一瞬たりとも Windows 環境を経由せずに繋ぐことができるはずなのだが、 SL-A300 を繋いでるマシンと WINS サーバやってるマシンのネットワーク的な位置関係の都合で Samba の設定がめんどくさく、console だけはザウルスドライブを経由して導入した。 うう、ヘタレだ ...

母艦から SD カードに直接 console パッケージを書き込むことができるだけでもよかったんだが、 いまんとこ SD カードへは SL-A300 を経由しないとアクセスできない。 バグとか制限とかいうのでなく、単に物理的に繋げる方法がないというだけだけど。

カーネルのパッチ

本質的にはカーネル 2.4.19 に対して <http://www.ruault.com/Zaurus/patches/> にある usbdnet-2.4.19-patch.gz を当てて適切に make xconfig すればいけるはずだし、実際に繋がったが、 宝箱Pro にあった USB ドライバを参考にしてちょっといじった。 modprobe 時にモンク言わないようにする 2 行と、Vendor = 0x4dd, Product = 0x8005 の SL-A300 の登録。 このうち後者は make xconfig から usbdnet のところで User specified なやつが一つ登録できるので それで指定してやってもいいし、insmod 時のモジュールオプションとして vendor=, product= として指定することもできるから、モジュール内に直接埋め込む必要もない。 パッチとして取り込んだのは物事を明瞭簡潔にするついでだ。

ついでのついでにここ

これらも当てておいた。samba の出番が色々あるようなので。 なお、同じ場所にある 00-smbfs-2.4.18-codepage.patch.gz は 2.4.19 内に取り込まれていた。

カーネルの config

... くらいか? 要るのは。 ここで loop.ocramfs.o は接続というのとは関係ないが、後で使う。

USBDNET のところで VENDOR, PRODUCT, CLASS, SUBCLASS が設定できるのでここで SL-A300 用に設定することもできるが、 再コンフィグする時に前回の設定を忘れてくれる素晴しい特性がある ... というか、すでに忘れてくださってる(パッチで埋め込んだので今は使ってない)ので 何を設定してあったのか書けない。 それぞれ 0x04dd, 0x8005, 2, 10 でいいんだと思うが、記憶で書いてるので違ってたらすまん。

USBDNET のテスト

とりあえず適当に USB で繋いでから SL-A300 の電源を入れると SL-A300 が見える。 SL-A300 の項はこんな感じ:
Bus 001 Device 006: ID 04dd:8005 Sharp Corp. 
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass            2 Communications
  bDeviceSubClass         0 
  bDeviceProtocol         0 
  bMaxPacketSize0        16
  idVendor           0x04dd Sharp Corp.
  idProduct          0x8005 
  bcdDevice            0.00
  iManufacturer           1 Sharp
  iProduct                2 SL-A300
  iSerial                 0 
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           84
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          3
    bmAttributes         0xc0
      Self Powered
    MaxPower                2mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           3
      bInterfaceClass         2 Communications
      bInterfaceSubClass     10 
      bInterfaceProtocol      0 
      iInterface              4 MDLM Network Communication Interface
  unknown descriptor type: 05 24 00 10 01
  unknown descriptor type: 15 24 12 00 01 5d 34 cf 66 11 18 11 d6 a2 1a 00 01 02 ca 9a 7f
  unknown descriptor type: 06 24 13 00 00 03
  unknown descriptor type: 0d 24 0f 05 00 00 00 00 ea 05 00 00 00
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x02  EP 2 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               none
        wMaxPacketSize         64
        bInterval               0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               none
        wMaxPacketSize         64
        bInterval               0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x85  EP 5 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               none
        wMaxPacketSize          8
        bInterval              10
  Language IDs: (length=4)
     0409 English(US)
... unknown descriptor type って何やねん。
ともあれ、 この状態で modprobe usbdnet してやると、usb0 というネットワークデバイスが出来る。 ザウルス方は 192.168.129.201 に見えてるから、usb0 に適当に IP 張り付けてやると ping 位なら通る。

murasaki の設定

いちいち手で modprobe usbdnet してやるのは美しくない。 murasaki に usbdnet を自動ロードさせる。

/etc/murasaki/murasaki.usbmap に次の 2 行を追加。

# SHARP SL-A300
usbdnet        0x0003     0x04dd 0x8005    0 0    0x2 0xa 0x0 0x0 0x0 0x0   0x00000000
なお、 この 2 行を追加するさいに前後に空行を置いてはいけない。 murasaki.usbmap のパーザは極めて「タコ」である。行フォーマットと思って適当に書くと 名前の前後の余分な space や 改行の剥ぎ取りに失敗して load できないことがある。 実際、標準配付の murasaki.usbmap にはコメントはたくさんあっても空行はひとっつもない。

/etc/network/interfaces に次の 3 行追加。まあ、address は適当に。

iface usb0 inet static
        address 192.168.129.32
        netmask 255.255.255.0

murasaki を再起動後、SL-A300 を繋ぐと syslog には:

Sep 29 11:57:00 kuhn kernel: hub.c: USB new device connect on bus1/1, assigned device number 6
Sep 29 11:57:00 kuhn kernel: usb.c: kmalloc IF cfbad6c0, numif 1
Sep 29 11:57:00 kuhn kernel: usb.c: skipped 4 class/vendor specific interface descriptors
Sep 29 11:57:00 kuhn kernel: usb.c: new device strings: Mfr=1, Product=2, SerialNumber=0
Sep 29 11:57:00 kuhn kernel: usb.c: USB device number 6 default language ID 0x409
Sep 29 11:57:00 kuhn kernel: Manufacturer: Sharp
Sep 29 11:57:00 kuhn kernel: Product: SL-A300
Sep 29 11:57:00 kuhn kernel: usbdnet: probe
Sep 29 11:57:00 kuhn kernel: probe: -> idVendor: 04dd idProduct: 8005 InterfaceClass 02 InterfaceSubclass: 0a
Sep 29 11:57:00 kuhn kernel: idp_search[0]: idVendor: 049f idProduct: ffff bDeviceClass 02 bInterfaceClass: 02 bInterfaceSubclass: 06
中略
Sep 29 11:57:00 kuhn kernel: idp_search[0]: idVendor: 04dd idProduct: 8004 bDeviceClass 02 bInterfaceClass: ff bInterfaceSubclass: 01 Sep 29 11:57:00 kuhn kernel: idp_search[0]: idVendor: 04dd idProduct: 8005 bDeviceClass 02 bInterfaceClass: 02 bInterfaceSubclass: 0a Sep 29 11:57:00 kuhn kernel: idp_search[0]: MATCH
中略
Sep 29 11:57:00 kuhn murasaki.net[5654]: device is registered Sep 29 11:57:00 kuhn kernel: probe[0]: setting configuration 1 Sep 29 11:57:00 kuhn murasaki.net[5654]: execute ifup usb0
中略
Sep 29 11:57:00 kuhn kernel: usb.c: kusbd: /sbin/hotplug.murasaki add 6 Sep 29 11:57:00 kuhn murasaki.usb[5655]: device is added Sep 29 11:57:00 kuhn kernel: hub.c: port 2, portstatus 100, change 0, 12 Mb/s Sep 29 11:57:00 kuhn kernel: hub.c: port 1, portstatus 103, change 0, 12 Mb/s Sep 29 11:57:00 kuhn kernel: hub.c: port 2, portstatus 100, change 0, 12 Mb/s Sep 29 11:57:00 kuhn murasaki.usb[5655]: vendor:0x4dd product:0x8005 Dclass:0x2 Dsubclass:0x0 Dprotocol:0x0 Iclass:0x0 Isubclass:0x0 Iprotocol:0x0 Sep 29 11:57:00 kuhn murasaki.usb[5655]: MATCH(usbdnet) -> match_flags:0x3 vendor:0x4dd product:0x8005 Dclass:0x2 Dsubclass:0xa Dprotocol:0x0 Iclass:0x0 Isubclass:0x0 Iprotocol:0x0 Sep 29 11:57:00 kuhn murasaki.usb[5655]: MATCH(acm) -> match_flags:0x70 vendor:0x0 product:0x0 Dclass:0x2 Dsubclass:0x0 Dprotocol:0x0 Iclass:0x0 Isubclass:0x0 Iprotocol:0x0 Sep 29 11:57:01 kuhn kernel: usb.c: registered new driver acm Sep 29 11:57:01 kuhn kernel: acm.c: v0.21:USB Abstract Control Model driver for USB modems and ISDN adapters

"MATCH(usbdnet)" という行があるが、murasaki.usbmap で usbdnet の前 1 行を空けてたら "MATCH( usbdnet)" となって " usbdnet" を modprobe しにいって失敗していた。 しょうもな ..。

ところで一緒に acm.o というのもロードしてるが、 こいつが実態として何してるかは知らない。なくても LAN 接続には関係ない。 uub serial 関連かな?

ザウルス側の設定

母艦側のドライバの設定は、まあ、いつも通りのことだ。で、このままだとザウルス側は ping しか通らんので、 telnet 程度は通るようにしたい ── どうやって?

世にちらほら増えてきた SL-A300 の web ページから、telnetd が存在すること、/etc/inetd.conf ではコメントアウトされてること、なんてのは既知なのだが、 その /etc/inetd.conf にアクセスする方法も書き換える方法もないぞ〜

を拾ってきて windows 2000 のザウルスドライブ経由で SL-A300 に入れました。 すいません、根性なしで ...

ところでこのザウルスドライブとドライバなんだが、 なんかデフォルトの場所以外にインストールしたらアイコンが発見できてない。うーむ。 ま、いいか。もう使わないし。

閑話休題。コンソールを起動し、ソフトキーボードをポチポチ叩いて /etc/inetd.conf を編集する。 デフォルトで /usr/bin/vi が入ってるので vi で ... ということなんだけど、 根性で echo で書き換えた。なせばなる:

# cd /etc
# echo 'telnet  stream  tcp     nowait  root    /usr/sbin/tcpd  in.telnetd' >> inetd.conf
# echo ttya0 >> securetty
# echo ttya1 >> securetty
# echo ttya2 >> securetty
# echo ttya3 >> securetty
telnet で入ると /bin/ash だけど、console は /bin/bash になってんのね。 ソフトキーボードを叩くのは辛いが、bash で tab とか ctrl-p とかを駆使すればこれくらいは何とか。

ここで、telnet で入ってくる仮想端末は /dev/ttya* なんね。普段 /dev/pts/* だし、 /dev/ttyp* とかの可能性も捨て切れんかったが、ps aux したら ttya の名前が見えたので こっちの流儀だと分かった。

あとはいつもどおり ps aux | grep inetd して inetd の PID 調べて kill -HUP.

telnet で入る

telnet すると
% telnet odetto
Trying 192.168.129.201...
Connected to odetto.usbd.7n1umj.
Escape character is '^]'.

Lineo Embedix Linux(TM)
Copyright 1999-2000 Lineo, Inc.


sla300 login: 

... ふーん? ともかく root で login する。パスワードなしに入れる。 実はここで /etc/securetty の設定してなくて login incorrect でハネられて暫く首ひねってたのは秘密だ。 だって、telnet で root をハジく設定というのはやっても root で入れるようにする設定ってしたことないもん。

telnetd の項を有効にする時についでに ftpd も有効にしておいたけど、ftpd は入ってなかった。 ファイルのコピーはザウルスから母艦を nfs mount して行うことになる。 nfs client は入ってないので母艦からザウルスを nfs mount することは(まだ)出来ない。

サスペンド

telnet で入ってると SL-A300 本体には触らない。 すると、しばらくすると勝手に suspend してしまうわけだが、 ここで電源スイッチ入れて resume しても telnet connection は復帰しない。 nfs connection のほうは生きてるのにぃ。うう、使い辛い ...

Jan. 14, 2003 追記

Suspend/resume をまたいでの ssh (and telnet) connection の保全に成功。 カーネルのバグと断定する。... ま、そのうち書くべ。


[日記へ] [目次へ]