試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

tuxonice-sourcesとrt(リアルタイム)パッチ

Gentoo Linuxの「pro-audio」Overlayにある「rt-sources」というパッケージでrtカーネルのソースをインストールすることができるのだが、これはkernel.orgの提供するソースに対して適用されることになり、GentooパッチセットやTuxOnIceは含まれない。
そこで、2.6.24-tuxonice-r2のソースにALSA 1.0.16を適用したソースツリーにrtパッチを当ててみたところ、Gentooパッチセットに含まれる修正とTuxOnIceのどちらも使えることが分かった。gentoo-sourcesを使用している場合も、TuxOnIceが含まれないだけの違いなので、同様に使える。
バリエーションが色々あるが、もう一度関係をまとめると

  • rt-sources=vanilla-sources(kernel.orgのカーネル)+rtパッチ
  • gentoo-sources=vanilla-sources+Gentooパッチセット
  • tuxonice-sources=gentoo-sources+TuxOnIce=vanilla-sources+Gentooパッチセット+TuxOnIce

となっている。今回の記事で得られるのは「tuxonice-sources+rtパッチ=vanilla-sources+Gentooパッチセット+TuxOnIce+rtパッチ」。

パッチ当て作業と、適用されない部分に関して

事前に
http://www.kernel.org/pub/linux/kernel/projects/rt/
からパッチ(今回使用したのはpatch-2.6.24-rt1.bz2)をダウンロードしておく。
/usr/src/linux-2.6.24-tuxonice-r2/以下にはすでにALSA 1.0.16が入っているものとする。「カーネルソースツリーのALSAドライバを新しいalsa-driverに置き換える」のシェルスクリプトを使用してカーネルソースツリー内のALSAのコードを入れ替えた。
下はtuxonice-sourcesのソースツリーをコピーしてパッチを当てる作業例。最後のsedMakefile内のバージョン文字列を変更している。

$ sudo cp -pr /usr/src/linux-2.6.24-tuxonice-r2{,-rt1}
$ cd /usr/src/
$ sudo ln -fns linux-2.6.24-tuxonice-r2-rt1 linux
$ cd linux/
$ sudo make mrproper
$ bzcat [patch-2.6.24-rt1.bz2の場所] | sudo patch -p1
$ find -name "*.rej"
./sound/core/control_compat.c.rej
./Makefile.rej
./drivers/video/console/fbcon.c.rej
$ sudo sed -i 's:\(EXTRAVERSION = -tuxonice-r2\):\1-rt1:' Makefile

3つのファイルに対しての修正に失敗した*1が、該当部分を確認したところ、いずれも問題はないと思われる。

  • Makefileはバージョン番号(EXTRAVERSION)部分の元が変わったためにパッチが当たらなかっただけ。
  • fbcon.cの修正(括弧付け)はfbcondecorのパッチ(gentoo-sources/tuxonice-sourcesで使用されるGentooパッチセット内の2.6.24/4200_fbcondecor-0.9.4.patch)に含まれる*2
  • control_compat.cALSA 1.0.16で変更された部分で、修正の必要はなさそう。*3

カーネル設定

リアルタイムカーネル用の追加設定部分は「oldconfig」ターゲットで既定の選択肢を選んでいく(そのままEnterで進んでいく)で問題はなさそうに見えるが、その他の部分(「JACK Audio Connection Kitの音飛びについてと、その対処」のカーネル設定部分・追記を含む)も設定できているかを確認したほうがよさそう。
リアルタイムカーネル用の主な設定は以下の場所。リストから「Complete Preemption (Real-Time)」が選択されていればOK。

Processor type and features  --->
 Preemption Mode (Complete Preemption (Real-Time))  --->   [CONFIG_PREEMPT_RT]

下は、既存のカーネル設定を元にした作業例。元のカーネルの設定(今回の例では../linux-2.6.24-tuxonice-r2/.config)をコピー .config"」で現在のカーネル設定が書き出せる他、「sudo cp /boot/config-[バージョン] .config」で、保存されている設定ファイルをコピーすることもできる">*4してから

$ CCACHE_DIR="[ccacheのディレクトリ]" sudo make HOSTCXX="ccache g++" CC="ccache gcc" oldconfig
$ CCACHE_DIR="[ccacheのディレクトリ]" sudo make HOSTCXX="ccache g++" CC="ccache gcc"
$ CCACHE_DIR="[ccacheのディレクトリ]" sudo make HOSTCXX="ccache g++" CC="ccache gcc" modules_install
$ CCACHE_DIR="[ccacheのディレクトリ]" sudo make HOSTCXX="ccache g++" CC="ccache gcc" install

などのようにする。

関連:他のディストリのrtカーネルのパッケージ

(2010/1/15)Gentoo以外のrtカーネルのパッケージについての記述を追加する。いずれもkernel.orgのソースにrtパッチが当たっているのみで、ディストリのパッチや追加ドライバなどは提供されない。Gentooとの大きな違いは、ビルド済みですぐ使えるというところ。

Ubuntu

linux-image-rt」というパッケージでインストールできる。UbuntuのみでDebianにはないようだ。
Ubuntu Studioというディストリでは標準で使用されているので追加インストールの必要はない。

*1:パッチの適用に失敗すると、該当ブロック(Hunk)がrejという拡張子のファイルに書き出される

*2:また、括弧付けに加えて、else以下に別の処理も追加されている

*3:rtパッチでは「int i, type, count, size;」のcount変数の初期値を0にしているが、ALSA 1.0.16では「int uninitialized_var(count);」になっている

*4:CONFIG_IKCONFIGを組み込みかモジュールにした上でCONFIG_IKCONFIG_PROCが有効なら、「sudo sh -c "zcat /proc/config.gz > .config"」で現在のカーネル設定が書き出せる他、「sudo cp /boot/config-[バージョン] .config」で、保存されている設定ファイルをコピーすることもできる