Xenomai導入まとめ(備忘録)

どうもrealteckです。

今回は今やってる、Linux(Ubuntu)へのXenomaiパッチ当ての備忘録を書き残します。あくまで自分のために書いているので、何かあっても当方で責任は負えません。ご容赦ください。


以下Ubuntu 14.04 LTSにて

①対象とするカーネルとXenomaiバージョンの選定

・インストール当初のUbuntuのバージョンは3.13.0-24

・(このときの)XenomaiのI-pipe(パッチ当て用のツールとでも思えばいい)がlinuxのv3系では3.18.20までなので、それ以下で最大のものを選択する。v4系でもいいが・・・Ubuntu上での安定動作は謎。一度安定動作を確認したいときは手順②へ。動作に不安がない、またはmenuconfigの設定ができる自信があるなら③へ。

②後のconfigに備えて一度カーネルをアップデート。(参考にしたサイト Hisakazu's Programming Notes より)

・以下のサイトにて、Ubuntuの様々なLinux kernelが存在する。

 http://kernel.ubuntu.com/~kernel-ppa/mainline/

 ちなみにUbuntuのバージョンごとのコードネームは公式HP「Ubuntuとは」に記載。

・14.04はコードネームはTrusty Tahr。なのでv3.16.7-ckt23-trustyを選択しておく(cktの意味はわからない)。

・ホームディレクトリまたは適当なフォルダを作っておき、headersとつくファイルでall.debと対応CPU.deb、またimageとつくファイルで対応CPU.debをダウンロードする。

 今回のCPUはintelの64bitなので、

 linux-headers-3.16.7-031607-generic_3.16.7-031607.201601280530_amd64.deb

 linux-headers-3.16.7-031607_3.16.7-031607.201601280530_all.deb

 linux-image-3.16.7-031607-generic_3.16.7-031607.201601280530_amd64.deb

 (genericとはUbuntuカーネル郡のこと。Ubuntu wiki内 「UbuntuStudioTips/Setup/Kernels」 に記載)

・以下のコマンドですべてのファイルを指定して、パッケージインストールをする。ここではdpkg -iを使うが、こうすることで複数バージョンを後からでも切り替えることができる上、後で当該カーネルを消せる利点がある。

 sudo dpkg -i linux-headers-3.16.7-*.deb linux-image-3.16.7-*.deb

  (ここではダウンロードした3ファイルが選べれば良いと思われ。)

・再起動後にsudo update-grubしましょう。

・もしこのバージョンアップしたカーネルで異常が出るなら、他のバージョンを選ぶ。カーネルを削除する際は以下のコマンド

 sudo apt-get remove linux-headers-3.16.7-* linux-image-3.16.7-*

・バージョン管理にはgitを使った賢いやり方もあるんだろうけど、僕gitは使えないんです・・・

余談:UbuntuはRT-Preemptパッチを当てたlowratencyというカーネルを用意している。当方で実験してみたが、intelのx64アーキのCPUならおそらくレイテンシは最大でも200usぐらいだと思う。なおUbuntuをリアルタイム向けに強化してUbuntuStdioという強力なツールも存在するため、簡単にそこそこのリアルタイムのPCを作りたいならこの選択が無難だ。

だって sudo apt-get install linux-lowlatency でリアルタイムカーネルに切り替えてくれるんだから・・・

③Xenomaiパッチ当て (参考にしたサイト jbohren.com, Xenomai 公式HPのインストールページ より)

・ホームディレクトリか適当なフォルダを別に作り、いくつかダウンロードする。

・その前にコンパイル用の下準備、リンク先の英語ページを鵜呑みにして以下のコマンドを実行した。

 sudo apt-get install kernel-package

 sudo apt-get install fakeroot build-essential crash kexec-tools makedumpfile kernel-wedge

 sudo apt-get build-dep linux

 sudo apt-get install git-core libncurses5 libncurses5-dev libelf-dev asciidoc binutils-dev

  (bzImageを作ってインストールしてもいいけど、めんどくさいのでfakerootでpkgを作るコマンドを実行する腹らしい)

・これが実行できない場合は、一度g++をダウンロードする。

 sudo apt-get install g++

・今後の処理を少し楽にするため、参考サイトに則って環境変数を作っておこう。ここでのLinuxバージョンやXenomaiのバージョンは予め選定してあったものを使用する。Xenomai3はリリースされて日が浅いが、いくつか追加になった機能が存在するらしい。怖い人はXenomai2系を選ぶといいだろう。以下はダウンロードするディレクトリで行っていく(pwdがあるため)。

 export linux_version=3.16.7 #選んだバージョンで

 export linux_tree=`pwd`/linux-$linux_version

 export xenomai_version=3.0.1 #選んだバージョンで

 export xenomai_root=`pwd`/xenomai-$xenomai_version

 export ipipe_version=3.16.7-x86-5 #linuxのバージョンに合わせたほうがいい

 export ipipe_root=`pwd`/ipipe-core-$ipipe_version.patch

・続いて各種ファイルのダウンロード。参考サイトとはリンクが違うので注意。僕がgitが使えれば(ry

 wget https://xenomai.org/downloads/xenomai/stable/xenomai-$xenomai_version.tar.bz2

 tar xvf xenomai-$xenomai_version.tar.bz2

 wget http://www.kernel.org/pub/linux/kernel/v3.0/linux-$linux_version.tar.gz #バージョンによって拡張子が違うので注意

 tar xvf linux-$linux_version.tar.gz

 wget https://xenomai.org/downloads/ipipe/v3.x/x86/older/ipipe-core-$ipipe_version.patch

・configファイルを持ってくる。ここで②をしておくことが生きてくる(と思う)

 cp -vi /boot/config-`uname -r` $linux_tree/.config

・xenomaiのパッチ当て

 cd $linux_tree

 $xenomai_root/scripts/prepare-kernel.sh --arch=x86_64\ #--arch=には該当デバイスの形式を記述

 --adeos=`find $xenomai_root | grep $linux_version-x86`\ #xenomaiの該当は64bit,32bitでもx86らしい?

 --linux=$linux_tree --ipipe=$ipipe_root

 今時はarmにだって入っちゃうんだからすげえよ。

・コンフィグ

 make menuconfig #ここでXenomaiの設定をオンにする。詳しいやり方は参考サイトに譲る

 (ここでつまづくことがおおいので何度かやるといい。ミスったら展開したlinuxカーネルファイルだけを消して、もう一度展開。同様にconfigファイルのコピー以降の手順を繰り返す。)

debファイルの作成。

・ところでdebファイルはdebianベースのOSのみに許されたファイル形式なので、RedHat系のFedoraとか、他の郡のOSだと話はまた変わってくる。

debファイル作成

 export CONCURRENCY_LEVEL=4 #引数 -j4に相当、8とかでもいいと思う。プロセッサ次第。

 fakeroot make-kpkg --bzimage --initrd\

 --append-to-version=-xenomai-$xenomai_version kernel-image kernel-headers modules

・インストール

 cd ..

 sudo dpkg -i linux-image-*.deb linux-headers-*.deb

 これで導入完了です。再起動後にsudo update-grubしましょう。

これ以降のオプションがいろいろありますが、そこは他のサイトに譲ることにします。

arm系マイコンlinuxが入るなら手続きは同様なのかは調査中です。

またクロスコンパイルについてはまだ書く気が起きないので、もしその機会が来たらまた記すことにします。

(shファイル作ると楽かもね。)