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 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ファイル作ると楽かもね。)