• DKMSでドライバを自動ビルドする

    さて、前回の続きです。
    なんとなく、なんとなくですがカーネルが変わっても自動的にドライバを読み込んでくれるようになったので備忘録的に書いていきます。

    前回の「USBのWi-Fiアダプタのインストール」では、とりあえずソースコードからドライバを生成し、取りあえず使えるところまで行きました。
    ところが、このままではカーネルがアップデートされた際にドライバが読み込まれず、困ったことになってしまいます。
    そこで、新しいカーネルがインストールされる際に、自動的にソースコードからドライバを生成してくれるDKMSというアプリを使ってみたいと思います。

    基本的にはUbuntu Japanese Wikiに掲載(下記URL)の通りに進めていきます。
    https://wiki.ubuntulinux.jp/UbuntuTips/Others/DkmsHowTo

    0.事前準備

    前回は生成したドライバ(カーネルモジュール)を”/lib/modules/3.16.0-30-generic/kernel/drivers/net/wireless”など、それっぽいディレクトリに格納していました。
    (カーネル部分:3.16.0-30-genericは環境によって違うよ!)
    調べたところ、dkmsによって自動的にビルドする際は”/lib/modules/3.16.0-30-generic/updates/dkms”に配置みたいです。
    dkmsのビルドが正常にできるかどうか確認するためにも、前回導入したモジュールは一旦アンロードし、別の場所に退避するか削除するかしておきましょう。
    (Wi-Fiをオフにしてからでないとアンロードできないかも!モジュールファイルを削除して、再起動でもOK)

    $sudo modprobe -r mt7650u_sta
    $sudo rm -f /lib/modules/3.16.0-30-generic/kernel/drivers/net/wireless/mt7650u_sta.ko

    1.dkmsのインストール

    dkmsのパッケージをインストール。これがなきゃ始まらない。

    $sudo apt-get install dkms

    2.ソースファイルのコピー

    Makefileなどのファイルが入っているディレクトリをまるごと/usr/src/配下に移動します。心配な人はcp -Rでコピーでもおk!
    移動後、フォルダ名を「パッケージ名」-「バージョン」に変更します。
    (前回の続きなのでディレクトリなどは踏襲してます。)

    $sudo mv gw-450d_driver_linux_v3002/mt7610u_wifi_sta_v3002_dpo_20130916 /usr/src/
    $sudo su –
    #cd /usr/src
    #mv mt7610u_wifi_sta_v3002_dpo_20130916/ mt7610u-3.0.0.4

    チップメーカであるMediaTekのドライバ配布ページではドライバ名MT7610U USB、バージョン3.0.0.4となっていたので、今回はパッケージ名「mt7610」バージョン「3.0.0.4」としたが、この辺は任意で構わないっぽいです。

    3.Makefileの修正

    初期のMakefileのままだとカーネルバージョンが正しく認識されないため修正を施します。
    具体的には、Makefileの中の$(shell uname -r)となっている箇所を変数に置き換えます。
    コメントアウトされている箇所もありますが、念の為全部変えておきます。

    行数 変更前 変更後
    199 $(shell uname -r) $(KERNELVER)
    202 $(shell uname -r) $(KERNELVER)
    218 $(shell uname -r) $(KERNELVER)
    248 $(shell uname -r) $(KERNELVER)

    上記の修正を施した後、ファイルの先頭あたりに変数の宣言を入れておきましょう。
    dkmsのみで使う分には不要ですが、手動でmakeする際にもすんなりできるようにしておきます。

    行数 変更前 変更後
    1 なし(新規挿入) KERNELVER = $(shell uname -r)

    4.dkms用コンフィグファイルの作成

    続いてソースコードが入ったフォルダの中に「dkms.conf」というテキストファイルを作成します。

    #vim mt7610u-3.0.0.4/dkms.conf
    PACKAGE_NAME=”mt7610u”
    PACKAGE_VERSION=”3.0.0.4″
    CLEAN=”make clean”
    MAKE[0]=”make KERNELVER=${kernelver}”
    BUILT_MODULE_LOCATION[0]=”os/linux”
    BUILT_MODULE_NAME[0]=”mt7650u_sta”
    DEST_MODULE_LOCATION[0]=”/kernel/drivers/net/wireless”
    AUTOINSTALL=”yes”

    適切にカーネルバージョンを取得できるように、Makefileに追記した変数をここで代入。
    (KERNELVER=${kernelver}”の箇所)
    Makefile内での宣言より、makeの引数として宣言したほうが優先されます。
    その他テキストファイルの中身の解説については割愛します。
    Ubuntu japanese Wikiのページを見てくだせー。

    5.dkmsへの登録とビルド・インストール

    作成したコンフィグファイルを元にdkmsに登録します。また、ちゃんとビルド〜インストールできるかどうか確認しましょう。

    #dkms add -m mt7610u -v 3.0.0.4

    Creating symlink /var/lib/dkms/mt7610u/3.0.0.4/source ->
    /usr/src/mt7610u-3.0.0.4

    DKMS: add completed.
    #
    #dkms build -m mt7610u -v 3.0.0.4

    Building module:
    cleaning build area….
    make KERNELRELEASE=3.16.0-30-generic………………………………………………………………………………………………………………..
    cleaning build area….

    DKMS: build completed.
    #
    #dkms install -m t7610u -v 3.0.0.4

    mt7650u_sta:
    Running module version sanity check.
    – Original module
    – No original module exists within this kernel
    – Installation
    – Installing to /lib/modules/3.16.0-30-generic/updates/dkms/

    depmod……….

    DKMS: install completed.

    ちゃんとdkms経由でインストールできました!

    6.ドライバが自動的に生成されるか確かめる

    では、本当にカーネルをアップデートした時に正常にドライバが再生成されるかどうか確かめます。
    運良くカーネルのアップデートパッケージが提供されていればいいのですが、そうでない場合は古いカーネルの再インストールでもOKです。
    /lib/modules/配下に現在インストールされているカーネルのバージョンごとにディレクトリが作られているので、現在のカーネル以外のバージョンのものを再インストールしてみよう。
    ちなみに私のUbuntu14.10環境では下記2つのカーネルがインストールされていました。

    • 3.16.0-23-generic
    • 3.16.0-30-generic

    現在は3.16.0-30-genericを使用しているので、3.16.0-23-genericを再インストールしてみます。

    #apt-get install –reinstall linux-image-3.16.0-23-generic

    インストール完了後、そのカーネルのモジュール格納場所にmt7650u_sta.koができていれば成功。
    /lib/modules/3.16.0-23-generic/updates/dmksにブツがあるか確認しまっしょ。
    更に、再インストールしたカーネルでブートしてみて、動作するかも確認してみましょう。

    これでカーネルのアップデートがあってもWi-Fiアダプタが使える…!
    ただし、アップデートのたびにビルドが走るため、5分ほどかかるようになってしまいました…。致し方ないですがね。

    ちなみにdmksでモジュールが格納される場所が${kernel}/updates/dmksに固定なことについては別記事でコメントしまっす。

    カテゴリー: Linux, 技術系

    DKMSでドライバを自動ビルドする」への1件のフィードバック

    コメントを残す

    メールアドレスが公開されることはありません。

    計算式の空欄を埋めてください。 * Time limit is exhausted. Please reload CAPTCHA.