RaspberryPiに最新のRT-Linuxを入れる方法
RT-Linuxとは、リアルタイム性を重視したlinuxのことで、以前にも導入方法を書いていました。 ところが、その方法だけだと、今のバージョンでは起動しないことがわかったので忘備録として書いておこうと思います。
現在、最新のRT-linuxは下記から入手できます。
https://www.kernel.org/pub/linux/kernel/projects/rt/
4.9 のページに入って最新のバージョンを探します。
とりあえず使うのは「patch-4.9.76-rt61.patch.gz 」にしてみます。
これは、カーネルソース一式ではなく、パッチといわれる差分だけを収録したファイルです。つまり、このバージョンに合わせたカーネルソースも必要です。
実は、ここがクセモノなのです。
特定のバージョンのソース一式をラスベリーパイ公式のhttps://github.com/raspberrypi/linuxから持ってくるときに、一番簡単なのはlinux/Makefileを開いてHistoryをみることなのですが。。。
Historyを見ると過去のバージョンが見え、その commit 番号もわかります。
4.9.76 はこれだ!
赤丸の部分をクリックすると、ファイルの差分が表示され、commit番号もでてきます。 (ファイルアイコンのような部分をクリックするとダイレクトにcommit番号がクリップボードにコピーされます。)
この赤丸の” 7bbc6ca4887794cc44b41412a35bdfbe0cbd1c50 ”という長い文字列がコミット番号です。
コミット番号がわかれば、下記の方法でソース一式をgetできます。gitでクローンするより断然速い。
wget https://github.com/raspberrypi/linux/archive/コミット番号.tar.gz
ところが
このcommit番号で持ってきたソースの中にはDevice Tree Overlayのソースが入っていなかったのです。
カーネルとデバイスモジュールをビルドした後、dtbsをビルドするときに気が付きました。
忘れないように備忘録として書くのはこの部分です。
カーネルバージョンが分かっても、次にバージョンがUPされるまでの間に沢山のcommitがあります。 Kernelのバージョンだけ分かってもダメな可能性があるんですね。
先ほどの「linux/Makefile」と「linux/arch/arm/boot/dts/overlays/Makefile」 のHistoryを比較してみます。
そうすると、linux/Makefileの 4.9.76と4.9.77の日付けの間に、overlays/Makefileも運よく更新されていました。 今度は、こちらのcommit番号で持ってきます。
wget https://github.com/raspberrypi/linux/archive/aae807a781807e95c761fe0a5babbc9bd5adaed6.tar.gz
今度は、Device Tree Overlayのcommit番号なので、Overlayのソース一式が抜けてるなんてことはありません。
これにて万事解決!
とはいかないのが linux の世界です。
頻繁に必要な手順(やコマンド)が変わっていくのです。
今回成功した手順を以下に書いておきます。
ビルド環境の準備
事前にSDカードの空き容量が1GB以上あることを確認しておきます。
sudo apt-get update
sudo apt-get -y install ncurses-dev device-tree-compiler bc
RT-linuxのソースコード準備
以下は patch-4.9.76-rt61に合わせたcommit番号での説明です。
wget https://github.com/raspberrypi/linux/archive/aae807a781807e95c761fe0a5babbc9bd5adaed6.tar.gz
改行せずに1行のコマンドです。(webブラウザ表示で勝手に改行されたり後ろが切れたりしますが。)
tar xvzf aae807a781807e95c761fe0a5babbc9bd5adaed6.tar.gz
ln -s /home/pi/linux-aae807a781807e95c761fe0a5babbc9bd5adaed6 ./linux
cd linux
sudo su
wget https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/patch-4.9.76-rt61.patch.gz
gunzip patch-4.9.76-rt61.patch.gz
cat patch-4.9.76-rt61.patch | patch -p1
沢山の文字がでます。これでパッチがあたりRTカーネルのソース一式ができました。
念のため、パッチ時にエラーメッセージが出ていないか確認した方が良いです。 エラーが出ているときは正しくパッチ当てができていない可能性があり、その後に進んでも結果はNGになります。
RT-linuxのconfig設定
modprobe configs
zcat /proc/config.gz > .config
make oldconfig
沢山の文字がでますが、下記の部分でプリエンプションを選択します。
Preemption Model
1. No Forced Preemption (Server) (PREEMPT_NONE)
> 2. Voluntary Kernel Preemption (Desktop) (PREEMPT_VOLUNTARY)
3. Preemptible Kernel (Low-Latency Desktop) (PREEMPT__LL)
4. Preemptible Kernel (Basic RT) (PREEMPT_RTB) (NEW)
5. Fully Preemptible Kernel (RT) (PREEMPT_RT_FULL) (NEW)
choice[1-5]:
今回は 「5」のFully Preemtible Kernel を選択しました。 その他は、デフォルト値にしました。(エンターを押すだけ)
終わったら念のため menuconfigでプリエンプションの周波数を確認しておきましょう。
make menuconfig と打って、Kernel Future -> Timer Frequency をみます。
タスク切り替えがこの周波数で強制的におきます。 あまり速くしすぎると実行効率が落ちてしまうので気をつけます。 タスクを切り替える時間がゼロではないからです。
RT-linuxのビルド
====== zImge =======
make -j6 zImage 2>&1 | tee make1.log
====== modules =======
make -j6 modules 2>&1 | tee make2.log
====== dtbs =======
make dtbs 2>&1 | tee make3.log
sshを切断すると、ビルドしているプロセスも落ちてしまいます。 ビルド中ずっとssh接続を維持するためにPCの電源を入れっぱなしが嫌な人は、nohup コマンドでバックグラウンド処理にすればOKです。
nohup make -j6 zImage modules dtbs 2>&1 | tee make.log &
あとは、じっくり待ちます。 ビルド時間はSDカードの速度に大きく影響されます。速いSDカードだと90分程度で終わります。 ごはんを食べてくるなり、別の仕事をするなりして時間をつぶしましょう。
RT-linux Kernelの導入と起動
ここでもハマりました。
まずは、モジュールのインストール
make modules_install
カーネルのインストール(念のため現在のカーネルをバックアップ)
mv /boot/kernel7.img /boot/kernel7-bakup.img
cp arch/arm/boot/zImage /boot/kernel7.img
デバイスツリーオーバーレイのインストール
cp arch/arm/boot/dts/overlays/*.dtbo /boot/overlays/
cp arch/arm/boot/dts/overlays/README /boot/overlays/
ここまでは従来通りですね。
RaspberryPiのSDカードの/bootフォルダには下記のデバイスツリーも入っています。
bcm2708-rpi-0-w.dtb
bcm2708-rpi-b.dtb
bcm2708-rpi-b-plus.dtb
bcm2708-rpi-cm.dtb
bcm2709-rpi-2-b.dtb
bcm2710-rpi-3-b.dtb
bcm2710-rpi-cm3.dtb
なんだろうなーーー とは思っていたのですが、特に気にしないことにしてました。
今回、これも新しくビルドしたものに差し替えないと起動しませんでした。下記のコマンドで転送します。(おそらくrpi-2 と rpi-3 のみでOKですが)
cp arch/arm/boot/dts/bcm27*.dtb /boot/
あとは再起動すればOK。
reboot
再起動したら、確認してみます。
こんな感じです。 4.9.76-rt61 と出てますね。 起動は成功です。
ただ、今回、moode audioで試したのですが、phpが動作不安定で、まともに動きません。
というオチでした。
rtパッチはRaspberryPi専用に作られているモノではないため、どのバージョンでもRaspberryPiで問題なく動作するという訳ではありません。安定して動作するバージョンを探して導入するのがお約束です。
誰かが検証して大丈夫そうというバージョンを使うというのもアリですね。
Fully Preemptible Kernel (RT) ではなく Preemptible Kernel (Basic RT) にするというのも1つの手段です。
ではでは、良き RT-Linux ライフを!
追記=========
この辺をみると良いかもしれません。安定して動くバージョンなど検証報告が上がっています。
https://github.com/raspberrypi/linux/issues/2244
にほんブログ村
ブログランキングに参加中です。 めざせ1位!
もしよろしければ「ぽちっと」お願いします。
« Moode Audio 4.0 正式版をスクリプト一発で導入 | トップページ | AACを最高の音質で聴くためのMPDコンパイル FDK-AAC-0.1.5 »
「Raspberry Pi」カテゴリの記事
- MotionEyeと余っているラズパイで監視カメラ(2024.11.21)
- 秋の夜長にはRaspberryPi5 RT-linux セルフビルド(2024.10.13)
- 秋の夜長にはRaspberryPi5 64bit版 Sabreberry32 ドライバコンパイル(2024.10.10)
- RaspberryPi 5 の公式OSは32bit版でも64bit?(2024.10.09)
- 秋の夜長にはRaspberry Pi5 64bit カーネル・セフル・ビルド (2024.10.07)
コメント
« Moode Audio 4.0 正式版をスクリプト一発で導入 | トップページ | AACを最高の音質で聴くためのMPDコンパイル FDK-AAC-0.1.5 »
こんにちは。
RT-kernelはどのような環境でお使いになられるのですか。例えば、Moode Audioへの転用を考えられておられますか?
投稿: AYOR | 2018年2月12日 (月) 11時57分
AYOR さん
RT-linuxの活躍の場はオーディオだけではないですね。 ここでの説明はあくまでもビルド方法についての備忘録です。
投稿: たかじん | 2018年2月13日 (火) 12時34分
moodeのkernel入れ替えを試みられたのですね。
phpの不具合は、想定外でした。やはり、何かあるのでしょうか。
投稿: AYOR | 2018年2月13日 (火) 21時35分
AYOR さん
phpによるwebアプリの挙動がおかしいのは、別の要因の可能性がありますね。 たくさんのアプリケーションをバックグラウンドで動かしていて、その応答を取得しているっぽいので、何かの応答待ちになっているのでは、と思います。
moodeで使うなら別のバージョンでビルドするのが良いでしょうね。 phpをデバッグして問題解決するのは骨が折れるでしょうから。
投稿: たかじん | 2018年2月15日 (木) 08時08分
たかじんさん、
話題が飛びますが、tinker boardの新型 tinker board Sを手に入れました。Sでは、スレーブになれるようです。以前のマスターモードのドライバが使えるかもしれません。電源にクセがありそうですが。
投稿: AYOR | 2018年2月15日 (木) 22時01分
AYOR さん
素早いですね。 Sは、まだ情報が少ないので様子見してます。
投稿: たかじん | 2018年2月18日 (日) 08時19分
情報ありがとうございます。
色々なcommit番号が反映されたカーネルをダウンロードしてビルドし楽しめるようになりました。
投稿: takobozu | 2018年2月25日 (日) 15時29分
takobozu さん
よかったです。 色々遊んでみてください。
投稿: たかじん | 2018年2月25日 (日) 20時00分