2014年2月19日水曜日

Linux Mint 13以降 (最近のDebian系) でPocket Wifi GL04Pをeth*として使用する

 さーて、自分のための備忘録も兼ねて、ふつーの人が使わないかもしれないけどちょっと使える情報を載せていこうと思う。
 ま、記載ペースは適当ってことで。毎日は続かないだろうけど、必要な人は見てください。
 んで第一回目はPocket Wifi GL04PをLinux Mint15以降(最近のDebian系)で使用する方法です。
 ふつーに使おうと思うんなら、PCにWifiが付いて入ればいいんでしょうけど、ここでお教えする方法は、WindowsやMacでは対応するんだけどLinuxでは提供されていない「USB経由でネットワークカードとして認識させる」方法です。
 この情報、他の場所にも載っていますが(Ubuntu 12.04で動作したという話、http://yutarommx.com/?p=433)、自分がLinux Mint 15以降で行おうと思った場合はひと手間加える必要がありました。
 また、HUAWEIのドライバをそのままインストールした際には、Debian系のinitデーモンスクリプトから見たら変な記述だったりしてちょっと不満なのでその当たりも変更する必要があります。

1.USB接続用のドライバの仕組み

さて、このGL04P、通常Linuxに接続するとCD-ROM以外は見えません。
 ここでこのルータにUSB端子経由でマジックコマンドを入力することにより、それがUSBネットワークデバイスであると変身させているのです。また、HUAWEIがNDISドライバを提供し、これによりネットワークデバイスとしても認識出来るようにします。
 そのために必要な仕組みはLinuxのディストリでも提供はされていますが(usb_modeswitch)、せっかくドライバをHUAWEIが提供しているのでそれを使います。

2.ドライバの入手

まず、以下の場所からドライバをダウンロードします。最新版は4.19.19.00です。
http://consumer.huawei.com/en/support/downloads/index.htm
Search Downloads By Keyword」 に"linux" と入力すると "HUAWEI Data Cards Linux Driver"が表示されると思います。
 次にこのZIPファイルを解凍します。tarボールが出るのでこれも解凍。

3.Debian系の場合のデーモンスクリプト修正

Readmeを読むとそのまま./installでインストールスクリプトが走りますが、ここで手間を加えます。
 最初はndis_driver/ndis_src/src にあるhw_cdc_driver.c の"dbg ("can't kmalloc dev");"をコメントアウトします。
 dbg関数が悪さをするらしく「ndis driverのMakeが出来ない」とググるとかなり引っかかります。

 次はskeletonファイルを以下のとおりに変更します。このファイル、インストール終了後はinitデーモンのスクリプトになりますが、このままの記述だとstopが正常に動作しません。

#!/bin/sh

# Copyright (c) 2008 Huawei Technologies, C
# All rights reserved.
#
# Authors: Franko Fang
#

### BEGIN INIT INFO
# Provides: HWActivator
# Required-Start: $syslog $local_fs
# Should-Start:
# Required-Stop:
# Should-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: HWActivator daemon providing fxz
# Description: Start HWActivator to allow XY and provide YZ
# continued on second line by '#'
# should contain enough info for the runlevel editor
# to give admin some idea what this service does and
# what it's needed for ...
# (The Short-Description should already be a good hint.)
### END INIT INFO

HWAPP=CURPATH/driver/HWActivator
DAEMON=$HWAPP
NAME=HWActivator
PIDFILE=/var/run/HWActivator/$NAME.pid
DESC="Huawei Activator"
DAEMON_ARGS=".bin"

unset TMPDIR

test -x $HWAPP || { echo "$HWAPP not installed";
if [ "$1" = "stop" ]; then exit 0;
else exit 5; fi; }

. /lib/lsb/init-functions

case "$1" in
start)
log_begin_msg "Starting $DESC: $NAME"

#mkdir -p `dirname "$PIDFILE"`
start-stop-daemon --start --quiet --oknodo --background --exec $DAEMON -- $DAEMON_ARGS && success=1
log_end_msg $?
;;
stop)
log_begin_msg "Stopping $DESC: $NAME"
start-stop-daemon --stop --quiet --retry 2 --oknodo --name $NAME && success=1
log_end_msg $?
;;
restart)
log_begin_msg "Restarting $DESC: $NAME"
if start-stop-daemon --stop --quiet --retry 2 --oknodo --name $NAME; then
start-stop-daemon --start --quiet --oknodo --background --exec $DAEMON -- $DAEMON_ARGS && success=1
fi
log_end_msg $?
#$0 stop
#$0 start
;;
reload|force-reload)
log_begin_msg "Reloading $DESC: $NAME"
start-stop-daemon --stop --quiet --name $NAME --signal 1 && success=1
log_end_msg $?
;;
status)
echo -n "Status of $DESC: "
if start-stop-daemon --status --name $NAME; then
echo "$NAME is running."
exit 0
else
echo "$NAME is not running."
exit 1
fi

;;
*)
N=/etc/init.d/${0##*/}
echo "Usage: $N {start|stop|restart|force-reload|status}" >&2
exit 1
;;
esac
#rc_exit

exit 0

4.インストーラへのデーモンスクリプト追加方法の修正(Debian系)


 あと、そのままのinstallスクリプトでは/etc/init*.dに強引にシンボリックリンクを貼る方法で実現しているため、Debian系のディストリの場合はここの記載事項を以下の通り直してしまいます。
 (元ファイルだと①265行目くらい"use command"のあたり〜280行目くらい"done"まで。②286行目くらい"if [ -f /etc/init.d/.depend.start ]; then"〜290行目くらい"fi"までです。もとのスクリプトはコメントアウトするか消してしまいましょう。)
① update-rc.d $CONFNAME defaults 99 1
②echo "update-rc.d -f $CONFNAME remove" >> "$INSTALL_PATH"/driver/Uninstall

 上の行はDebian系のデーモンを有効化するコマンド、下の行はUninstallスクリプトにupdate-rc.dでrunhuaweiactivatorを削除させるコマンドです。

5.スクリプトのインストール

さて、やっと準備が出来ました。後はsudoと共にinstallスクリプトを実行してください。標準では/usr/local/Mobile_Partnerにインストールされます。


6.モジュールの正常読込の確認+不要なドライバの除外

次に確認しないとならない事項は、lsmodコマンドでインストール後に正常にモジュールが読み込まれているかです。
 私が試した限りでは、以下の通りになっていないとeth*が追加されませんでした。
Module                  Size  Used by
option                 42468  0
usb_wwan               20380  1 option
usbserial              44667  2 option,usb_wwan
hw_cdc_driver          43815  0
mii                    13934  1 hw_cdc_driver
hw_cdc_driver以外にcdc_ncm・usbnetが追加された場合、正常に動作しません。 特にmiiの下にはhw_cdc_driver以外はあってはいけません。
このLinuxドライバではそのためにHWActivatorというプログラムがデーモンとして常駐し、USB挿抜時にいろいろお助けしてくれるようにはなっていますが、Linux Mint15以降のようにカーネルが比較的新しい場合には追従できていないです(cdc_wdmは消去するように記載されているようだ)。
この時動作を邪魔するものを/etc/modprobe.d/にブラックリストとして記載し、そのモジュールを読み込ませないようします。自分はblacklist-huawei.confというファイルを作成し、以下の通り記載しました。
blacklist cdc_ncm
blacklist usbnet

おそらく、cdc_ncmが読込されなければusbnetも上がってこないと思いますが一応念の為追加してます。
さて、多分これで再起動後にはちゃんと動作していると思います。NetworkManagerでもeth*が形成されれればDHCP経由でIPの設定がされますのでちゃんと動作します。


7.最後に

なぜWifiで動くのにこういうことやろうかと思ったきっかけは、PCにUSBで接続して充電しているとどうやら最近のカーネルの場合、ネット接続されないとPocketWifiの内部のファームを壊す可能性が非常に高い挙動が見受けられるためです(そのように使っていると、電源ボタンを押した際のシャットダウン→再起動がうまく動かない場合があり)。
 Wifiを使わないと周りの電波とも干渉しないし、便利ですしね。
 WindowsやMacにできてLinuxで動かないのも癪に障るし。
 あと、ここに紹介した方法、inidデーモンスクリプトの所以外はredhat系でも同じく有効だと思います。多分最近のカーネルではcdc_ncmが悪戯してこのhw_cdc_driverの動作を阻害するのでしょう。

0 件のコメント:

コメントを投稿