------
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
# 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 uvcuvcvideo 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 件のコメント:
コメントを投稿