ZYNQ Linuxの/lib/modulesフォルダやmodules.dep等の作り方
これまでZynqberry用のUbuntu Linuxを提供してまいりましたが、恥ずかしながら今まで/lib/modules/($uname -r)/フォルダの作り方がわからなかったので、このフォルダを提供できず、modprobeなどができませんでした。
mkdirで空の/lib/modules/$(uname -r)を作っておけば様々なエラーの回避はできるのですが、正しいmodules.dep等がないとカーネルモジュールが使えません。
今、ようやく/lib/modules/$(uname -r)/フォルダの作り方を理解したので紹介します。
まず、前提として/lib/modules/$(uname -r)/というフォルダは、Linuxのカーネルコンパイルの際に一緒に作られます。したがって、Linuxをコンパイルしたときのソースフォルダがが必要です。
しかし、今更そのようなフォルダはないとか、コンフィグを変えて再コンパイルしてしまったなどで、当時のフォルダがないことも多々あるでしょう。
そのような場合でも心配はいりません。過去のLinuxのソースはいつでもダウンロードできるし、コンパイルの際のコンフィグは動作中のLinuxから得ることができるからです。
Zynqberryの場合、XILINX用Linuxカーネル4.9.0なので、Xilinxのgitからダウンロードしてきます。
以下、クロスビルド用のホストPCでの作業です。
$ git clone -b xlnx_rebase_v4.9 git://github.com/Xilinx/linux-xlnx.git
$ cd linux-xlnx
Linuxのコンパイルに使用したコンフィグは、オプションで無効にしていなければ/proc/config.gzにあります。動作中のZynqberryの/procからconfig.gzをコピーしてきて、解凍して.configを作ります。
$ scp ユーザ名@IPアドレス:/proc/config.gz .
$ gunzip -c < config.gz > .config
これで、コンパイル当時のLinuxのソースフォルダが再構成できました。
そうしたらCROSS_COMPILEのマクロを設定したり、Xilinx SDKの初期化コマンドを実行して環境を整えたら、Linuxカーネルをコンパイルします。
$ export CROSS_COMPILE=arm-linux-gnueabihf-
$ source /opt/Xilinx/SDK/2017.4/settings64.sh ← 環境に応じて変えよ
$ make ARCH=arm UIMAGE_LOADADDR=0x8000 uImage
当時の状況でLinuxカーネルがコンパイルされ、arch/arm/bootにuImageが出来上がっているはずです。
そうしたら、次に以下のコマンドを入力します。
$ make ARCH=arm INSTALL_MOD_PATH=./modroot modules
$ make ARCH=arm INSTALL_MOD_PATH=./modroot modules_install
これで、linux-xlnx/modroot配下にlibフォルダが作られ、その中にモジュール一式が入っているというわけです。
見てみましょう
naitou@ubuntu:~/linux-xlnx/modroot/lib/modules/4.9.0-xilinx$ ls -al
合計 92
drwxrwxr-x 3 naitou naitou 4096 9月 29 11:34 .
drwxrwxr-x 3 naitou naitou 4096 9月 29 11:34 ..
lrwxrwxrwx 1 naitou naitou 23 9月 29 11:34 build -> /home/naitou/linux-xlnx
drwxrwxr-x 5 naitou naitou 4096 9月 29 11:34 kernel
-rw-r--r-- 1 naitou naitou 353 9月 29 11:34 modules.alias
-rw-r--r-- 1 naitou naitou 455 9月 29 11:34 modules.alias.bin
-rw-rw-r-- 1 naitou naitou 16780 9月 29 11:34 modules.builtin
-rw-r--r-- 1 naitou naitou 19538 9月 29 11:34 modules.builtin.bin
-rw-r--r-- 1 naitou naitou 832 9月 29 11:34 modules.dep
-rw-r--r-- 1 naitou naitou 1647 9月 29 11:34 modules.dep.bin
-rw-r--r-- 1 naitou naitou 52 9月 29 11:34 modules.devname
-rw-rw-r-- 1 naitou naitou 426 9月 29 11:34 modules.order
-rw-r--r-- 1 naitou naitou 131 9月 29 11:34 modules.softdep
-rw-r--r-- 1 naitou naitou 3613 9月 29 11:34 modules.symbols
-rw-r--r-- 1 naitou naitou 4529 9月 29 11:34 modules.symbols.bin
lrwxrwxrwx 1 naitou naitou 23 9月 29 11:34 source -> /home/naitou/linux-xlnx
そうしたらこれをtgzで固めて、Zynqberryに転送します。
$ tar -zcvf module.tgz lib/
$ scp module.tgz ユーザ名@IPアドレス:/home/share
受け取ったZynqberryではこれを解凍し、($uname -r)以下に移動します。
# tar -zxvf module.tgz
# mv lib/modules/4.9.0-xilinx/ /lib/modules/4.9.0-xilinx-00027-g9c2e29b/
lsで様子を見てみます。
これでカーネルモジュールに対応でき、lsmodやinsmod、modprobeなどが使えるようになりました。
作成したmodulesと、カーネルヘッダは下記のURLからダウンロードできます。
なお、上の図のとおりbuildフォルダとsourceフォルダがクロスコンパイルに使ったホストPCのフォルダ名のシンボリックリンクを参照してしまっているのと、カーネルコンパイルが終わった状態でlinux-xlnxフォルダは3.3GByteもあるので、容易には配布できません。そのため、ソース一式の配布はいたしません。必要な場合は上記の手順で作りなおした方が早いと思います。
| 固定リンク



コメント
$ make ARCH=arm INSTALL_MOD_PATH=./modroot modules
$ make ARCH=arm INSTALL_MOD_PATH=./modroot modules_install
で生成した modroot 以下の lib ディレクトリですが、シンボリックリンクを含むので、上の手順で tar で固めると、ターゲットのボードで展開した後にシンボリックリンクが解決できず、カーネルモジュールのビルドなどをしようとするとうまくいかなくなると思います。
この問題を解決するには、tar のオプションで h オプションを追加すると、シンボリックリンクをたどって固めてくれるようです。
ご参考までに。
投稿: ねっぽ | 2021.06.07 05:52
追加です。
tar で h オプションをつけるときは、上記の INSTALL_MOD_PATH をカーネルツリー以外のどこかに指定しないといけないようです。
カーネルツリーの中に入れてしまうと、循環参照的な感じで永遠に tar が終わらないという。。。
罠でした。
投稿: ねっぽ | 2021.06.07 05:59
有用な情報ありがとうございます!
投稿: なひたふ | 2021.06.09 17:00