USBホットプラグによる自動設定
2003.04/19
前回の記事を書くにあたり、最新のソースをThe linux-wlan(tm) Companyのサイトでチェックしたところ、2003年4月3日付のlinux-wlan-ng-0.2.1-pre1がリリースされていました。バージョンが従来の0.1.16から0.2.1にメジャーアップとなっています。
実は、USB無線LANデバイス WLI-USB-KS11Gドライバの構築で記述したドライバのパッチは、まだ同社に報告してなかったのですが、このバージョンでも依然含まれていませんでした。そこでこの機会にとメールで連絡しておいたところ、翌日にはメールが返信され、『They'll be added to the next release.』と書かれていました。ですから、次のリリースからは上記記事で紹介したパッチは不要となるはずです。
また、併せて「WEP暗号つきでは一度でつながらないことが多い」という状況をメールに付記したところ、最新のリリースで試してほしいとのコメントも書かれていました。そこで、これもこの機会に、と思い、早速ダウンロードして試してみたところ、本当に一度でつながるようになっていました。システムの改善は予想以上のスピードで進んでいるようです。
ただ、このときに副作用が出て、今回紹介するセットアップの自動化処理に障害が生じました。リリースに含まれていた初期化スクリプトに問題があり、途中でエラー終了し、うまく起動できないのです。ちょっと手間がかかりましたが調査した結果その原因もなんとかつかめ、これまたlinux-wlan社に連絡しておきましたが、この記事ではその問題と対処についてものちほど触れることにします。
もう一つ、PCMCIAの無線LANカード設定について、最後におまけとして記述してあります。
murasakiによるホットプラグ起動処理
Linuxカーネル2.4のホットプラグ機能に対応したホットプラグマネージャーは、ディストリビューションなどによりいくつかあると思いますが、ここでは私の使っているVineとTurbolinuxの両方で採用されているmurasakiの設定を紹介します。それ以外のマネージャは、それぞれのマニュアル等を参照して設定して下さい。
まず、murasakiが起動しているか確認して下さい。chkconfigコマンドで、ランレベルの設定がonなら起動しているはずです。
# runlevel
N 3 ←現在のランレベルが3。グラフィカルログインなら5。
# chkconfig --list murasaki
murasaki 0:off 1:off 2:on 3:on 4:on 5:on 6:off
→3:onなのでOK。もしoffなら「chkconfig murasaki on」と実行する。
murasakiは多彩な機能を持ちますが、そのうちここでは、カーネルモジュールがロードされたタイミングでコマンドを起動する機能を使用します。具体的には、以下のような構成です。
- 設定ファイル…/etc/murasaki/murasaki.call
- トリガとなるモジュール…prism2_usb.o
- 起動するスクリプト…/home/doi/bin/UsbWlan
ここで、三番目の起動するスクリプトは、まったく任意です。/etcに置く手もありますが、個人的には/etc以下に標準的な設定ファイル以外のものはあまり置きたくない、という好みの問題があります。そこで、プライベートなコマンド類を置いてある$home/binに置くことにしました。
ただし、この機能はユーザレベルでなくシステムレベルのものと考えられるので、その意味ではhome以下に置くのもちょっと変です。まあ、個人マシンということで、よしとしましょう(笑)。実は、こういう方法だと、$homeをバックアップしたとき、こうしたシステム設定のカスタマイズも一緒に保存できるというメリットもあるのです。
具体的には、/etc/murasaki/murasaki.callに以下の行を記述します。
prism2_usb: /home/doi/bin/UsbWlan
murasaki.callは、最初のフィールドに検出すべきロードモジュール、2番目以降のフィールドにそのモジュールロードが検出されたときに実行すべき実行可能ファイルを記述します。実行可能ファイルは複数記述することもできます。
ここでは、prism2_usb.oというカーネルモジュールがロードされたとき、/home/doi/bin/UsbWlanという実行可能ファイル(この場合スクリプト)を実行しなさい、ということになります。
最初のドライバ構築記事で紹介したシステムのインストールが正常に行われていれば、今回のUSB無線LANカード「WLI-USB-KS11G」がUSB端子に挿入された場合、モジュールprism_usbは自動的にロードされるはずです。もしカードを差し込み、/sbin/lsmodコマンドを実行したとき、リストにprism2_usbが表示されないときは、linux-wlan-ngドライバのインストールを再度確認してください。
ホットプラグで起動されるスクリプト
上記でmurasaki.callに設定した、起動スクリプト/home/doi/bin/UsbWlanの内容は、以下の通りです。
#!/bin/sh
#
# Start USB WLAN(WLI-USB-KS11G)
# カードは挿してあること
# Mac 00:08:45:24:39:FF
#
ifconfig eth0 down
/etc/rc.d/init.d/wlan start
スクリプトは極めてシンプルで、まず、内蔵LANがアクティブの場合、ifconfig eth0 downで無効化します。
次に、無線LANの起動スクリプト、/etc/rc.d/init.d/wlanをstartします。前回見た/etc/wlan/以下の各設定ファイルもここで参照され、処理されます。
基本的にはこれで終わりです。ただし、この方法では、/etc/wlan以下に設定した、wlan.confを中心にした一種類のAP(アクセスポイントまたはステーション)への接続しか利用できません。しかし、実際には、複数の異なるAPへの接続を使い分けたい場合が多いと思います。
私の場合でも、自宅のほか、会社のオフィス、実家、妻の実家でも無線LANを使っています。これらは、会社以外は同じSSIDとWEPキーに設定できないことはないかも知れませんが、ほかにもYahoo!BBモバイルやその他のホットスポットも存在します。
これらの異なるAPへのアクセス設定については、いろいろ工夫が可能ですが、ここでは一例として、よく利用する某無料ホットスポット(よく利用する、というのは架空です)に接続する場合のスクリプトを示します。上記/home/doi/bin/UsbWlanの/etc/rc.d/init.d/wlan startの1行を、下記の記述に置き換えます。
if [ -f /tmp/any ]; then
wlanctl-ng wlan0 lnxreq_ifstate ifstate=enable
wlanctl-ng wlan0 lnxreq_autojoin ssid="any" authtype=opensystem
/sbin/dhclient wlan0
/bin/rm -f /tmp/any
else
/etc/rc.d/init.d/wlan start
fi
if以下の4行の処理でアクセスできるステーションを利用する場合、カードを挿す前に、「touch /tmp/any」などのコマンドを実行して、/tmp/anyというファイルを作っておきます。それからカードを挿すと、anyというSSIDのオープンなAPに接続にいくという処理をします。/sbin/dhclientはTurbolinuxの場合で、VineなどRedHat系では/sbin/dhcpcdです。
通常はWEP暗号キーの不要なホットスポットは少ないかも知れません。そうなると、/etc/wlan/以下にWEPキーなどの設定をしたwlancfg-XXXというファイルが必要となるでしょう。この場合には、AP別のwlan.confファイルを準備しておき、それをなんらかの手順で/etc/wlan/wlan.confにオーバーライトするという手続きになると思います。
今のところ、複数の異なるAPを使い分けるという構造は準備されていませんので、各自、工夫してこれを実現してください。基本的には、上記スクリプトにelse ifを追加してけば、任意の数の処理が設定できますし、そこで、「cat /etc/wlan/wlan.conf.ybb > /etc/wlan/wlan.conf」のような処理を記述すればいいはずです。あるいは、コマンドのaliasを作っておくのもいいかも知れません。ちょっとしたアイデアでこのように使いやすく設定できるのもLinuxの強力な利点の一つです。
DHCPクライアントの起動設定
/etc/rc.d/init.d/wlanスクリプトで起動すると、「/etc/sysconfig/network-scripts/ifcfg-デバイス名」に定義した設定が実行されます。DHCPクライアントを起動したい場合、ここに設定します。
私の環境では、USB無線LANのデバイス名は「wlan0」となりますので、/etc/sysconfig/network-scripts/ifcfg-wlan0というファイルの設定が参照されます。ここで、以下のように設定しておくと、自動的にそのシステムのDHCPクライアント(Vineでは/sbin/dhcpcd、Turbolinuxでは/sbin/dhclient)が起動されます。
DEVICE=wlan0
BOOTPROTO=dhcp
ONBOOT=no
NAME=wlan0
バージョン0.2.1-pre1のスクリプトの修正
この記事の最初に書いたように、最新のlinux-wlan-ng-0.2.1-pre1にドライバと設定ファイルをバージョンアップしたところ、副作用で上記/etc/rc.d/init.d/wlanスクリプトが正常に起動しなくなりました。原因を調べてみると、/etc/wlan/sharedファイルの以下のスクリプトに問題があることがわかりました。
wlan_enable ()
{
# $1 == wlandev
#=======ENABLE IFSTATE=============================
# Bring the device into its operable state
# First, make sure the driver is loaded....
if ! ifconfig $1 2>&1 > /dev/null ; then
echo "Error: Device $1 does not seem to be present."
echo "Make sure you've inserted the appropriate"
echo "modules or that your modules.conf file contains"
echo "the appropriate aliase(s)."
return 1
fi
上記のif文は、通常のターミナル・シェルから実行すると、偽になり、正常処理(fi以降の行)に進みますが、murasakiのような非ターミナル環境から実行すると、真になってしまい、ここでエラー終了してしまうのです。
対応としては、一番手っ取り早いのはif〜fiまでの行を削除するかコメントアウトすることです。この処理は、以前のバージョンではなかった部分で、最近追加されたものです。したがって、削除してもそれほど問題はないと思われます。
おまけ・PCMCIA無線LANカードの設定
話は変わりますが、先日、PCMCIAの無線LANカードを使用している実家の母から、無線がつながらなくなったとヘルプが来ました。早速出かけていって調べてみたのですが、なぜかパケットを送信はしているが、受信できていないのです。
いろいろ試行錯誤しましたが、結局平日の夜で時間もあまりなく、原因は不明、とりあえずカードの故障かどうかを確認するため、カードだけ自宅に持ち帰って調べることにしました。
最終的には、ドライバファイルの一つがなくなっていた(休みに遊びに来ていた親戚が間違って消してしまったらしい)のが原因とわかり、ドライバの再インストールで難なく復旧しましたが、自宅での調査では、LinuxでのPCMCIAの無線LANカードの設定をやって接続を確認しました。
最近のLinuxのバージョンでPCMCIA無線LANの設定をしたのは初めてでしたが、標準的にインストールされている状態のままで、適当に設定ファイルのあたりをつけてやってみたところ、いとも簡単にWEP暗号つきでつながってしまいました。USBの無線LANに比べるとあっけないほどです。
忘備録の意味も兼ねて、この記事のおまけとして、PCMCIA無線LANカードの設定を紹介します。機種はメルコのWLI-PCM-L11G、メジャーなカードです。
設定ファイルは、/etc/pcmcia/wireless.optsです。このファイルでは、PCMCIAスロットに差し込まれたカードのMACアドレス(=メーカ、カード機種)に応じた設定を行います。最初に
というスクリプトから始まり、
# NOTE : Remove the following four lines to activate the samples below ...
# --------- START SECTION TO REMOVE -----------
*,*,*,*)
;;
# ---------- END SECTION TO REMOVE ------------
という記述があります。このままでは、すべてのカードの起動処理は、この「無処理」に吸い込まれ、何も起こらないことになりますので、コメントの指示にある通り、この2行は削除するかコメントアウトします。
次に、WLI-PCM-L11Gを挿したときの処理ですが、これは以下のcaseに飛びます。
# Lucent Wavelan IEEE (+ Orinoco, RoamAbout and ELSA)
# Note : wvlan_cs driver only, and version 1.0.4+ for encryption support
*,*,*,00:60:1D:*|*,*,*,00:02:2D:*)
INFO="Wavelan IEEE example (Lucent default settings)"
ESSID="Wavelan Network"
MODE="Managed"
# RATE="auto"
KEY="s:secu1"
ここで、下記のように必要なESSIDとWEPキーを設定するようにします。
設定内容は、これまでの記事で行ったUSB無線LANと同じにしてあります。
*,*,*,00:60:1D:*|*,*,*,00:02:2D:*)
INFO="WLI-PCMCIA-L11G (MELCO)"
ESSID="fox"
MODE="auto"
CHANNEL="3"
RATE="auto"
KEY="s:tanukinekodog"
KEYは、ASCIIで設定する場合の例で、s:に続いて文字列を記述します。16進の場合、下記のように先頭から16進数を直接書き込みます。
KEY="74616e756b696e656b6f646f67"
あと、前と同様、DHCPの起動設定ファイルを/etc/sysconfig/network-scripts/以下に作成します。
私のマシンは内蔵LANがあるので、無線LANカードはeth1で認識されます。そこで、ifcfg-eth1ファイルを作成し、以下のように記述します。
DEVICE=eth1
BOOTPROTO=dhcp
ONBOOT=no
NAME=eth1
あきれたことに(笑)、たったこれだけの設定で、何の苦もなくWEP暗号化つきの無線LAN接続が確立してしまいます。
メール
neyubacca@yahoo.co.jp