« 2011年12月 | トップページ

2013年3月

2013年3月31日 (日)

SL6.3+kernel 3.4でOpen vSwitchを動かす

KernelコードにマージされたOpen vSwitchを動作させた際のメモです。

Kernelのビルド。まず、オプションを有効にしてカーネルをつくります。Networking support>Networking option>Open vSwitchにチェックを入れビルドします。
これで出来上がるのはopenvswitch.koというローダブルモジュールだけなので出来上がったら、modules_installして、modprobe openvswitchしてもちゃんとうごきます。つまり、既存のbridgeと干渉したりはしません。
その代り、brcompatというモジュールはできません。
さて、モジュールを組み込んだだけでは使えません、制御するためのソフトはディストリビューション側で用意するものなのでしょうが、red hat系には既成のバイナリはないようです。
なので、ソースからこれらを作る必要があります。後々のメンテナンスを考え、サイトからダウンロードして、いったんrpmを作った後にインストールすることにします。今回は1.9を使いました。
アーカイブをダウンロードしたら展開して、rhelディレクトリにあるopenvswitch.specをとりだします。ソースアーカイブをrpmbuild/SOURCESに入れ、rpmbuildするのですが、openvswitch-kmod-rhel6がないと言ってエラーになります。上でも書きましたが、カーネルモジュールはすでにあって、このrpmは作る必要がないので、ここは削除します。
無事rpmができたら、yum localinstallでインストールします。
スイッチの設定を行うにはコントローラを動かす必要があるのでovsdb-toolを使って初期化します。この辺は本家のインストールガイドを始めあちこちに書かれているので割愛します。
dbができたらservice openvswitch startしてコントローラを立ち上げ、スイッチをコンフィグします。
前のエントリで書きましたが、すでにブリッジ構成なのでそれを手直ししてopenvswitchに移行するのを前提にスイッチを組みます。
ovs-vsctl add-br br0
ovs-vsctl add-port br0 eth0
ovs-vsctl add-port br0 wlan0
そして、/etc/sysconfig/network-scriptsのファイルを手直しします
ifcfg-br0
TYPE=Bridge > TYPE=ovsBridge
ifcfg-eth0
BRIDGE=br0 > コメントアウト
つまり、eth0,wlan0といったポートはコンフィグですでにつながっているのでifupする際にさらにブリッジに接続する必要はないのです。そして、br0インタフェースですが、TYPEにovsBridgeと指定するとbr0という仮想スイッチのbr0というポートにつながります。これで、bridge互換モジュールをがなくてもちゃんと従来のbridgeと同様に使えます。
準備ができたらservice network restartして、OKならchkconfig openvswitch onした後に再起動すると新環境で使う使うことができます。
めでたしめでたし。と思ったのですが、hostapdがちゃんと動かないようです。具体的には接続したあとすぐにパスワードを再要求されるようになってしまいます。
もしかしたら続編があるかもしれません。

2013年3月30日 (土)

Logitec W150N/U2がホストモードで動くまでの長い道のり(3)

さて、最後はhostapdです。

残念ながら、hostapdはScientific Linuxのリポジトリにはモジュールがありません。外部リポジトリにあるようなのですが、ソースがあるのは2.0でコンパイル済はatrpmsの0.5.8です。
どっちにしようか迷ったのですが、コンパイルすることにしました。
実はhostapdは今風の./configure一発なソフトではなくて、作るのは今日的な感覚でいうとかなり面倒な部類です
ここでもまた先人の知恵を借りてなんとかコンパイルし、モジュールを作ります。参照先にもありますが、依存するパッケージを持ってこないとエラーになります。特にlibnl-develは盛大にスクロールするのでうんざり気分になります。そうこうしつつコンパイルし、動かすと色々でてきます。
nl80211が使えないと言われたのでnetworking support>Wireless>nl80211 testmode commandを有効にしてカーネルのビルドを再度やったり。細々としたパラメータ調整をして、そして
country_code=JP

をconfigに入れるのをお忘れなく。

何とか起動できたら、先ほどのサイトからリンクしているサイトでhostapd用のiniスクリプトをもらってchkconfig --add hostapdすれば何とか出来上がりです。
とりあえずAndroidをつないでみてアプリの更新などをやった範囲では問題なく動いているようです。
しかし、150mbpsと書いてあるもののn技術(=n technology?)は802.11gらしい。いったいどれくらいスピードでるのやら。まぁ、どうすればいいかはわかったのでスピードが問題ならまたその時かんがえましょう。とりあえず今はWiMaxのルータから無線を切り離すのが優先事項なので。

Logitec W150N/U2がホストモードで動くまでの長い道のり(2)

さて、次はデバイスをネットワークに組み込まなければいけないのですが、その前にやることがあります。

現在使ってるeth0は直接アドレスが振られているのですが、これをブリッジ経由に切り替えます。
つまり、無線LANから入ってきたパケットをLANに送り出すわけですが、無線APに接続したクライアントもLANと同じネットワークアドレスを持っていなければ非常に使いづらいわけで、そうするためには無線側のパケットを有線のLANにそのまま送るようにします。
そんなわけで、/etc/sysconfig/networks-scripts/ifcfg-eth0をコピーしてifcfg-br0を作り、ifcfg-eth0の方はbr0にブリッジ接続します、という定義に書き換えます。yum install bridge-utilsもやった方がいいかもしれません。
ウチで使っている定義はこんなのです
DEVICE="br0"
BOOTPROTO=none
NM_CONTROLLED="no"
ONBOOT=yes
TYPE="Bridge"
IPADDR=192.168.0.171
PREFIX=24
GATEWAY=192.168.0.2
DNS1=192.168.0.202
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME="Bridge over trubled water"
LAST_CONNECT=1364209692

そして、cfg-eth0

DEVICE="eth0"
BOOTPROTO=none
NM_CONTROLLED="no"
ONBOOT=yes
BRIDGE=br0
TYPE="Ethernet"
UUID="311d6b62-96ef-41b5-a9ba-8ddd54835ac8"
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME="System eth0"
HWADDR=80:EE:73:0A:14:10
LAST_CONNECT=1364209692
書き換えついでにNetworkManagerを動かないようにしておく方がいいでしょう。
# chkconfig NetworkManager off

こうしてネットワークを再起動します。上手くいっていれば今まで通りにネットワークが使えるはずです。
そして、wlan0のifcfg-wlna0も作ります。
DEVICE="wlan0"
BOOTPROTO=none
NM_CONTROLLED="no"
ONBOOT=no
#BRIDGE=br0
WIRELESS_MODE=Managed
TYPE="Wireless"
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME="W150N wlan0"
LAST_CONNECT=1364209692

この辺はかなり適当です。BRIDGE=br0がコメントになっているのは、入れてもエラーになるのと、hostapdがその辺のコントロールはやってくれるので今の段階ではブリッジに属さなくても大丈夫だからこうしています。

Logitec W150N/U2がホストモードで動くまでの長い道のり(1)

ことの始まりはいつものように電気屋だった。近所の巨大電気店をフラフラ歩いていたらPCをスマホのアクセスポイントにして快適ネットワーク、という触れ込みの無線LANドングルが売られていた。お値段680円。裏を見るとホストモードもサポートしていると書かれている。

まぁ680円だし、ダメ元でLinuxに突っ込んで無線LAN APにしてみよう、と思ったのが長い戦いの始まりだった。
さて、まずこのドングルをUbuntuをインストールしたノートに差し込む。あっさり認識し、接続できる。Linuxってもう一部の特殊な人が使うものではないんだな、なんて感慨にふける。しかし、これが罠だとはまだ気が付いていない。
lsusbすると
Bus 001 Device 002: ID 0789:0168 Logitec Corp. LAN-W150N/U2 Wireless LAN Adapter
というIDが表示される。どうやらドライバはrt2800usbというものらしい。
さて、このままノートにさしておくわけにも行かないので本来APにしたいターゲットに刺す。ものはShuttle XS35、Atomベースの省スペースPCで中身はScientific Linux 6.3だ。
lsusbに刺すとIDは表示されるので認識しているようだが、うんともスンともいなわい。rt2800usbというドライバも影も形もない。とりあえずドライバを用意しなければいけないので情報収集。ralinkのrtシリーズはかつてstagingで存在したが今はmainlineにマージされている。ネットを漁ると両方の情報が入り混じって出てくるので混乱する。
今更stagingでもないのでmainlineのrt2800usbを使う方向で考えると、結局ソースからビルドするということになる。だったらもうちょっと新しいのにしたいね、ということで今回は思い切ってバージョンを上げ、Longtermの中では一番新しい3.4にすることにした。
3.4はOpen vSwitchがマージされているなどネットワークデバイスとして魅力が大きいこともバージョン更新の理由の一つ。
さて、kernel.orgからソースをダウンロードし、make oldconfig、make menuconfigをやって新しいカーネルをインストールする。
カーネルとドライバができた。modprobe rt2800usbするとちゃんとドライバは読み込まれる。だけどwlanは出てこない。ファームウェアなるものが要るらしい。先人の情報によればralinkのサイトからダウンロード、と書かれているけどそのサイトはすでになくて、別のサイトに飛ばされる。まぁ、ちょっと名前とか入れるフォームが出るけどなんとか入手できた。
実は、ここにも落とし穴がある。Ubuntuなどに添付されているファームウェアはホストモードにはならないらしい。確かに、バイナリダンプを見るとUbuntuのrt2870.binとサイトからダウンロードしたrt2870.binは別物だった。
さて、ファームも手に入った、けどやっぱりwlanは現れない。これまた先人の知恵によるとecho "ベンダid プロダクトid" > /sys/bus/usb/drivers/rt2800usb/new_idというおまじないが目に入る。なにこれ?公式ドライバなのにidを教えないと動かないの?(詳細は後でわかるんだけど)
とりあえずやれば動く。
実際はこのあとしばらくこの状態でhostapdとかセットアップしていたのですが、話のまとまりが悪いので種明かしをすると、rt2800usbを作るときにInclude support for unknown deviceにチェックを入れていなかったのがいけないのでした。
デバイスドライバは自分がサポートするidの一覧というものを持っていて、これはソースにハードコーディングされています。今回の場合、0789,168というのがそれにあたるのですが、このIDは
#ifdef CONFIG_RT2800USB_UNKNOWN
:
#endif
で囲まれた中に入っているグループで、上記のチェックを入れないとここがコンパイルされない、よってノードも作られない。というわけでした。そして、/etc/udev/ruls.dにルールを追加して、OSとデバイス関係はひとまずおしまい。

« 2011年12月 | トップページ