2019年10月13日日曜日

Raspberry-piにてvolumio2のビルド環境を整えてみる

volumio2のkernelをビルドしてみたい.

正確にいうと、これを書いている時点で最新のvolumio2のOS上(ラズパイ)で自作moduleをコンパイルする環境を整えたいということなんだ.

ところがいろいろと地雷がありましてな.
・最新volumio2 kernel version 4.19.60のsourceが見つからないよ
・githubの最終upは4.9.xであるようで、そこからDLしたsourceだとmoduleをinsmodできなかったりしてうぎゃぎゃ
・kernel buildをせずに済ますため、apt-get install raspberry-kernel-headers みたいなことをやるのがお馴染みだけど、これで取得できるkernel versionも古くて使えないんだ
・ラズパイvolumio2のビルドで困っている人は多くないらしく、ネットの情報が少なく、また分散的である

台風19号が日本列島周辺をうろついてる間にこればっかりやっとたよ.

以下はその苦闘の結果得られたラッキー結果だ.クロスコンパイルはしない.

【ラズパイ volumio2の環境】
以下に書く情報は、これを書いている2019年10月の最新ラズパイvolumio2を使っている.ラズパイのハードウエアは3+Bとかそんなもの.

Linux volumio 4.19.60-v7+ #1247 SMP Thu Jul 25 14:41:19 BST 2019 armv7l
                       ___
                      /\_ \                        __
         __  __    ___\//\ \    __  __    ___ ___ /\_\    ___
        /\ \/\ \  / __`\\ \ \  /\ \/\ \ /' __` __`\/\ \  / __`\
        \ \ \_/ |/\ \L\ \\_\ \_\ \ \_\ \/\ \/\ \/\ \ \ \/\ \L\ \
         \ \___/ \ \____//\____\\ \____/\ \_\ \_\ \_\ \_\ \____/
          \/__/   \/___/ \/____/ \/___/  \/_/\/_/\/_/\/_/\/___/

             Free Audiophile Linux Music Player - Version 2.0

          C 2015 Michelangelo Guarise - Volumio Team - Volumio.org

uname -a
Linux volumio 4.19.60-v7+ #1247 SMP Thu Jul 25 14:41:19 BST 2019 armv7l GNU/Linux

mpd -V
Music Player Daemon 0.20.18 (128d910-dirty)


【ラズパイvolumioの調達とインスト】
これを使った.
volumio-2.599-2019-08-02-pi.img
ここからDLした.
https://volumio.org/get-started/

SDに焼く方法の説明は割愛.
めでたく起動できたとする.
ログインしよう.
login: root
pass: volmio     ←初期パスワード

【お好みでtoolをインスト】   不要な人はしなくてもいい
% apt-get update
% apt-get install ftpd  ftp  telnet  telnetd      ←適宜Yを打つ必要あり
/etc/ftpusers  をeditorで編集し、rootを削除
/etc/securetty  をeditorで編集し、末尾にでもpts/0とpts/1を追加
% shutdown -r now

【ビルドツールをインスト】
volumio環境には開発ツールがあまりインストされてないようだ.gccもmakeも入ってないので入れる.適宜Yを打つ必要あり.
% apt-get install git bc bison flex libssl-dev
% apt-get install libncurses5-dev
% apt-get install gcc make

【ソースをdownloadする】
冒頭で書いたように、最新volumio2のkernel versionは4.19.60-v7+なのである.
しかし、githubから取ろうとしても4.4.xが取れてしまったり、revisionを選んでも4.9.xまでしか無かった.
困っていたら、あまり知られていないかもしれない凄く簡単なやりかたがあるのだった.
volumio kernelsource         ←これは偉大な神コマンド!
この後に、/usr/src/rpi-linux にsource一式ができあがる.
Makefileをみると、versionは4.19.60になっている.めでたい.
VERSION = 4
PATCHLEVEL = 19
SUBLEVEL = 60

【sourceにリンクを張る】
現行kernel versionを表示する.
% uname -r
4.19.60-v7+
リンクする.
% cd   /lib/modules/4.19.60-v7+         ←kernel versionに等しい場所へ行く
% ln -s   /usr/src/rpi-linux  build          ←DLしたsourceの場所をbuildにリンク!

↑これやらんでもいいみたい.rpi-linuxを得た時点でリンクが張られてるため.

【お試しbuildしたい人だけ】
moduleをコンパイルしてinsmodなどするだけならkernelのrebuildとreinstallは不要なのだが、動作確認したければどうぞ.数時間もかかるよ.buildの前には.configを用意せにゃいかんが、すでに入ってるので悩む必要なし.便利だね.
% cd  /usr/src/rpi-linux
% make

【簡単なサンプルmoduleの試運転】
rootでログインし、/rootに作業ディレクトリを作る.
% cd /root
% mkdir test
% cd test

editorでMakefileを作る.
obj-m := test.o
KDIR    := /lib/modules/$(shell uname -r)/build
PWD     := $(shell pwd)
VERBOSE = 0
all:
        make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
        rm -f *.o *.ko *.mod.c

editorでtest.cを作っておく.insmod時にkermel messageを出すだけのもの.
#include <linux/module.h>
MODULE_LICENSE("GPL v2");
static int mymodule_init(void) {
        printk(KERN_ALERT "Hello world!\n");
        return 0;
}
static void mymodule_exit(void) {    /* Do nothing */   }
module_init(mymodule_init);
module_exit(mymodule_exit);

moduleをコンパイルする.
% make
% modinfo test.ko
filename:       /root/test/test.ko
license:        GPL v2
depends:
name:           test
vermagic:       4.19.60 ARMv7 p2v8      ←4.19.60になっておる
% insmod   test.ko      ←moduleを組み込む
% dmesg
[39935.415667] Hello world!        ←kernel messageが出てるのでOK
% rmmod  test    ←moduleを取り下げ



【追記:make installでトラブル多数あり】
上の簡単なmoduleは無問題だったが、既存のI2S moduleを単品コンパイルして組み込んだところ、動かなかった.稼働中のKernelと、単品コンパイルしたmoduleには依存関係に齟齬が在るようだ.(問題1)

そこで、rpi-linux配下のKernelとmoduleを全てリビルド → make install というマトモなやりかたを試みた.

ところがここでvolumioのSD構成にまつわるトラブルが発生する.(問題2)
make installが停まってしまうのだ.
原因は簡単明快、/bootが64MB割り当てられているのだが、既存ファイルが領域を100%使い切っていているため、新しいKernelをコピーできないのだ.

/bootの容量を拡張しなければならない.

それには別のLinuxマシンにSDを挿してGPartedでpartitionを移動などするのだが、詳細は割愛する.この辺のページを参考にしてどうぞどうぞ.

ただしここにも地雷が.Partitionのサイズ変更・移動にあたってはMB表示で操作するとしくじる確率が非常に高い.かならずシリンダー数表示で操作することをオススメする.(問題3

なお、ネット情報にはext4fsのpartition移動ができないと書かれているものもあるが、これを書いている時点のGPartedはext4fsも移動できたよ.

/bootを200MBほどに拡張できvolumioの起動もできたが、ここまででヘトヘトなわたしだ.

ところがまだトラブルがある.make installするとまた停まる.
% make install
/bin/bash ./arch/arm/boot/install.sh "4.19.60-v7" .......
Makefileが参照する4.19.60-v7なんつうdirectoryは存在しないのだ.(問題4)
なぜなら、uname -rで表示されるのは4.19.60-v7+なのだから.どういうわけか末尾の+が消えちゃうんだね.

Makefile冒頭に「-v7+」を追加してみたが治らない.
VERSION = 4
PATCHLEVEL = 19
SUBLEVEL = 60
EXTRAVERSION = -v7+

仕方ないので、/lib/modules の下でリンクを張ってみたらmake installが動くようになったよ.
   4.19.60-v7 -> 4.19.60-v7+

volumioは開発用ディストリでなく、コンパクト志向で調整されたディストリだと思うので、リビルドするといろいろな地雷があるみたいだねぇ.

かしこ

0 件のコメント:

コメントを投稿