Ubuntu でカーネルモジュールをちょっとだけ更新したい。

techracho のカテゴリわけが android, rails, ios, mac, google となっていて、なんとなく疎外感を感じつつも。

久々に、ネットワークのデバイスドライバがいじりたくなったので、コンパイルしようと思った。本当は FreeBSD でやりたかったけど、デバイスの対応とか、Embedded 環境の整備具合とかの関係で、今回は Linux。社内では Ubuntu が多いので、Ubuntu。LTS ってやつらしいのでなんとなく 12.04 を選択。Kernel Version は 3.5.0。

Ubuntu 12.04 を VM でインストール。Unity とかいう GUI がデフォルトでインストールされて、ちょっとげんなりしつつも、頑張ってネットワークの設定、sshd を立ち上げ、putty 越しに作業開始。

ソースは…ない。kernel もパッケージで管理する Linux のことなので、ソースもパッケージに違いない。探してみたら存在を確認。

% sudo apt-get install linux-source

/usr/src 以下に、

linux-source-3.2.0.tar.bz2 -> linux-source-3.2.0/linux-source-3.2.0.tar.bz2

こんな感じで、bzip で固められたファイルが置かれた。自分で解凍しなければいけない模様。

% sudo tar jxvf linux-source-3.2.0.tar.bz2

Linux の tar コマンドで bzip2 を扱う場合につけるオプションは j。ちなみに FreeBSD の場合は、y。

紛らわしい。BSD tar と GNU tar は違うものですものね。

今回、僕のターゲットは、Ralink 2×00 ドライバ。近年の無線 USB WiFi では、このRalink という会社が結構多いみたい。Buffalo とか IO-DATA とかで購入できる 1000 円くらいの USB Wifi はこのデバイスが多い。ちょっと前だと、Realtek (通称「かに」。ロゴがカニのマークに見えるから。)という会社のチップセットが多かったけど、無線では Ralink の模様。適当に find してみると、ドライバは、以下に存在。

/usr/src/linux-source-3.2.0/drivers/net/wireless/rt2x00

ほほう。

適当にソースを見ながら、今回やりたいことの目星がついてきた。

よし、まずは printk() を挟んでコンパイルっしょ。適当に make すればカーネルモジュールである .ko を吐いてくれるに違いない。

% cd /usr/src/linux-source-3.2.0/drivers/net/wireless/rt2x00
% sudo make
make: *** No targets.  Stop.

ん?ダメだ。何かオプションが必要に違いない。

適当に上のエラーログでググると、カーネルのソースの場所とかを make コマンドに引数として渡さないといけないらしい。

そうですか。いろんなソースをコンパイルできるようにっていう配慮なんすよね。めんどくさいなあ。

% make -C /usr/src/linux-source-3.2.0 M=`pwd`
scripts/genksyms/genksyms: No such file or directory

今度はなんでしょうか??ああ、kernel を一度もコンパイルしないでドライバだけコンパイルしようとしたから、いろいろと auto generate なファイルが足りないのね。

# make oldconfig
# make prepare
# make scripts

いろいろとファイルを生成してくれました。3つともやらないとダメです。一番最初の oldconfig は、実際に kernel をコンパイルする際に組み込むモジュール群の選択画面です。5分くらいかかりますが、気長に y/n を選択しましょう。 さて、そろそろ Ralink ドライバコンパイルできるんじゃね?

% cd /usr/src/linux-source-3.2.0/drivers/net/wireless/rt2x00
% sudo make -C /usr/src/linux-source-3.2.0 M=`pwd`

成功。たくさんの ko が出来上がりました。

make install と打ってもインストールはしてくれなかったので、手動で ko を対象ディレクトリにコピーします。

% cd /lib/modules/3.5.0-23-generic/kernel/drivers/net/wireless
% sudo cp -r rt2x00 rt2x00.ori
% cd /usr/src/linux-source-3.2.0/drivers/net/wireless/rt2x00
% sudo cp *.ko  /lib/modules/3.5.0-23-generic/kernel/drivers/net/wireless/rt2x00

さて、これで僕の printk() がやっと確認できます。

すでに load されている rt2xxx という名前のついているカーネルモジュールを丁寧に rmmod しまくり、USB wifi をさしなおしました。これで、USB の ID から必要なカーネルモジュールをロードしてくれるはずです。

 rt2x00lib: no symbol version for module_layout

ん…?version ???

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

 

ここまで読んだ方で、正解に気づいた方はさすがです。

Ubuntu 12.04 の kernel version は、3.5.0。apt-get でインストールされた linux-source のバージョンは、3.2.0。Linux の場合、カーネルモジュールのバージョン管理が結構しっかりしているので、動作しないのは当然ですね。

…はー?apt でのソース管理なめてんのー!?

知り合いに聞いたところ、こんなもんとのこと。Ubuntu でカーネル差し替えたかったら、kernel.org から取ってこいとのこと。

ぶへー。めんどくせー。

と、今日はここまで。営業マン(笑)の貴重な2時間が apt のせいで犠牲になりました。。。

Ruby on RailsによるWEBシステム開発、Android/iPhoneアプリ開発、電子書籍配信のことならお任せください この記事を書いた人と働こう! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

榊原 寛

1980 年埼玉県生まれ。BPS COO。慶應義塾志木高校からそのまま慶應義塾大学湘南藤沢キャンパスへ。コンピュータの勉強がしたかったので、学部1年より徳田英幸研究室へ。無線ネットワークに関する研究、ユビキタスネットワークに関する研究、センサネットワークに関する研究、仮想ネットワークに関する研究等を行い、2010年慶應義塾大学政策・メディア研究科後記博士課程単位取得退学。 IPA 未踏事業 2006年度、2007年度開発責任者。日本学術振興会特別研究員(DC2) 2008年度。技術が実際に役に立つ現場に行きたく、BPSへ。BPSでは、主に電子書籍に関する事業に従事。マンガEPUBビューアや WebKit を利用した EPUB3 の日本語縦書きビューアプロジェクトを推進。全国中小企業団体中央会によるグローバル技術連携・創業支援補助金(創業枠)及び東京都中小企業振興公社「新製品・新技術助成事業 助成金」を MangaReborn 事業にて申請・獲得。電子書籍に関する次なるソリューションについて日々試行錯誤。慶應義塾大学環境情報学部非常勤講師兼任中。慶應義塾大学 SFC 研究所所員。W3C AC Representative。 http://techracho/bpsinc.jp/skk/ , http://www.ht.sfc.keio.ac.jp/~skk/

榊原 寛の書いた記事

開発
W3C/IDPF の統合に関して

2016年05月15日

週刊Railsウォッチ

インフラ

Rubyスタイルガイドを読む

BigBinary記事より

ActiveSupport探訪シリーズ