2016年2月29日月曜日

【Linux】 Kona-linux3.0でmoduleの単体コンパイル(Debian系)

Linux Kernelやmoduleをビルドする際のエラー回避について、ネットにたくさんの記事が在る.本記事もそれらの一つとして広大なネットの雲の中の水滴の一粒とならんと思ふのだっっ.そしてすぐに陳腐化した情報として風化してゆくのだっ.

------
Linux Kernelやmoduleのビルドには、バージョン毎にmakeのエントリーが変わったり、ディレクトリ構成が変わったり、様々な障害が立ちふさがります.わたしのような初心レベルの者にとってはいろいろ大変です.

次の環境において、Kernel sourceをDLし、特定のmoduleのみを単体ビルドするためにどんな手続きが必要だったか、について書きます.意外とながいぞ~~

【環境】
 ・Kona-linux 3.0  (Debian系らしい)
 ・Kernel 3.16.0-4-amd64
 ・CPU Atom D425だったかな?
 ・単体ビルドしたいmodule  uvcvideo

それでは始めます.root権限でやってます.

【Kernel sourceの入手】
次の場所からお好みのバージョンのKernel sourceをgit checkoutするコトが出来ますが、今回はこれらは敬遠しておきました.
 # git clone https://kernel.googlesource.com/pub/scm/linux/kernel/git/rt/linux-stable-rt
 # git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git

apt-getでDLできるように吊り下がっているsoureをこれらのコマンドでinstallしました.
  apt-get update
 # apt-get install linux-source
 # apt-get install linux-headers-`uname -r` build-essential
linux-headerとbuild-essentialはビルドに不可欠な何かのようです.

これらのコマンドが正常に済むと、
 /usr/src/linux-source-3.16.tar.xz
が出来ています.これを解凍します.
 # xz -dv linux-source-3.16.tar.xz
 # tar xvf linux-source-3.16.tar
解凍して出来たKernel sourceは、このディレクトリに展開されます.
 /usr/src/linux-source-3.16

【ビルドの準備】
ソースディレクトリに移動.
 # cd /usr/src/linux-source-3.16
カーネルの様々な設定をする代わりに、/bootに置かれている「現状のconfig」を流用するためにコピーします.
 # cp /boot/config-3.16.0-4-amd64 .config
それを今回利用するためのおまじないをやります.
 # make oldconfig

余談: ここでmake helpと打つと、Makefileの様々なエントリの一覧表が表示されます.

つぎにmoduleをビルドする準備のおまじないです.このエントリ名は古いバージョンだと”prepare”でしたが、このバージョンではこうなっています.
 # make modules_prepare

他サイトの情報によると、古いバージョンではさらに meke script をやる必要があると書かれていますが、このバージョンでは”script”というエントリは存在しないらしく、割愛しました.

【特定のmoduleだけを単体ビルド】
目的のmoduleが置かれたディレクトリに移動.
 # cd drivers/media/usb/uvc

ビルドします.-C optionが重要です.しかし良かれと思ってソースディレクトリTOPを指定すると、出来上がったmoduleがismodできないファイルになってしまいます.これはダメです.
 # make -C /usr/src/linux-source-3.16 M=`pwd`  (ダメ)

ビルドするにはこのコマンドであればOKです.
 # make -C /lib/modules/3.16.0-4-amd64/build M=`pwd`
出来上がるのは、
 uvcvideo.ko
というファイルです.これをカーネルに登録してみます.
 # insmod uvcvideo.ko
しか~し、まだダメ.知らないシンボルを呼ぼうとしてるとかなんとか怒られます.

【不足するシンボルを解決する】
ここで使ったLinuxマシンは、クリーンインストール直後にかなり近い状態であったため、不足するmoduleやlibが多々あるのも仕方ないのでした.

uvcvideo moduleが他のどのmoduleを呼び出しているのかを表示させます.すると、こんなにたくさんの他moduleを呼びたい人なのでした.
 # modprobe --show-depends uvcvideo
 insmod /lib/modules/3.16.0-4-amd64/kernel/drivers/usb/common/usb-common.ko
 insmod /lib/modules/3.16.0-4-amd64/kernel/drivers/usb/core/usbcore.ko
 insmod /lib/modules/3.16.0-4-amd64/kernel/drivers/i2c/i2c-core.ko
 insmod /lib/modules/3.16.0-4-amd64/kernel/drivers/media/media.ko
 insmod /lib/modules/3.16.0-4-amd64/kernel/drivers/media/v4l2-core/videodev.ko
 insmod /lib/modules/3.16.0-4-amd64/kernel/drivers/media/v4l2-core/v4l2-common.ko
 insmod /lib/modules/3.16.0-4-amd64/kernel/drivers/media/v4l2-core/videobuf2-core.ko
 insmod /lib/modules/3.16.0-4-amd64/kernel/drivers/media/v4l2-core/videobuf2-memops.ko
 insmod /lib/modules/3.16.0-4-amd64/kernel/drivers/media/v4l2-core/videobuf2-vmalloc.ko
 insmod /lib/modules/3.16.0-4-amd64/kernel/drivers/media/usb/uvc/uvcvideo.ko

それではすでにカーネルに登録されているのはどれだ?と調べたら、登録済みなのはusbcoreぐらいでした.寂しいものがある.
 # lsmod

各moduleのディレクトリを訪問すると.koファイルすら存在しないのがポコポコあったので、無いモノは各々を単体ビルドしました.一例としてはこのようになります.上で述べたのと同じやりかたです.
 # cd /lib/modules/3.16.0-4-amd64/kernel/drivers/usb/common
 # make -C /lib/modules/3.16.0-4-amd64/build M=`pwd`
ちなみに、/lib/...から辿った場所と、/usr/...から辿った場所とはリンクで同じ場所をポイントしていると思います、たぶん.

各々のmoduleを単体ビルドできましたら、カーネルに登録します.ノーエラーで登録できるはずです.いくつかは「すでに登録されてる」と怒られます.
 # insmod /lib/modules/3.16.0-4-amd64/kernel/drivers/usb/common/usb-common.ko
 # insmod /lib/modules/3.16.0-4-amd64/kernel/drivers/usb/core/usbcore.ko
 # insmod /lib/modules/3.16.0-4-amd64/kernel/drivers/i2c/i2c-core.ko
 # insmod /lib/modules/3.16.0-4-amd64/kernel/drivers/media/media.ko
 # insmod /lib/modules/3.16.0-4-amd64/kernel/drivers/media/v4l2-core/videodev.ko
 # insmod /lib/modules/3.16.0-4-amd64/kernel/drivers/media/v4l2-core/v4l2-common.ko
 # insmod /lib/modules/3.16.0-4-amd64/kernel/drivers/media/v4l2-core/videobuf2-core.ko
 # insmod /lib/modules/3.16.0-4-amd64/kernel/drivers/media/v4l2-core/videobuf2-memops.ko
 # insmod /lib/modules/3.16.0-4-amd64/kernel/drivers/media/v4l2-core/videobuf2-vmalloc.ko

そして最期に、目的であるuvcvideo.koをカーネルに登録します.
 # insmod /lib/modules/3.16.0-4-amd64/kernel/drivers/media/usb/uvc/uvcvideo.ko
今度はノーエラーで登録できるはずです.

念のため、moduleの稼働状況を表示させてみます.ちゃんとuvcvideoが居ます.
 # lsmod | grep uvc
 uvcvideo               79005  0
 videobuf2_vmalloc      12816  1 uvcvideo
 videobuf2_core         47787  1 uvcvideo
 videodev              126451  3 uvcvideo,v4l2_common,videobuf2_core
 media                  18305  2 uvcvideo,videodev
 usbcore               195340  6 uvcvideo,ohci_hcd,ohci_pci,ehci_hcd,ehci_pci,usbhid

----------
以上でmodule単体ビルドと組み込みの説明はおしまいです.

moduleのビルド→登録時に生じるトラブル回避の参考になりますと幸いにて.

なんか鬼のように疲れたなぁ.

かしこ


人気ブÍグランキングへ

0 件のコメント:

コメントを投稿