2013/05/08

VortexBoxのカーネル再構築

VortexBox 2.2のカーネルにCONFIG_PREEMPT_RTのパッチを当てる等して、カーネルの性能アップを狙います。

カーネルの再構築はベースになっているFedoraの流儀に従いました。
Building a custom kernel


2013年5月8日の時点での方針は以下の通りです。
  1. Processor familyにIntel Atomを指定
  2. Preemption ModelにFully Preemptible Kernel (RT)を指定
  3. Kernel hackingの項目は可能な限り組み込まない

再構築後のカーネルが動かなくなる可能性は大いにあります。
私は今回、カーネルパニックで起動しないのを1回、起動してもディレクトリ構造を全く読み込めないのを1回作りました。

出来上がったカーネルでMPDを使用しての音楽再生の感想ですが…、曲によって差がありますが音が滑らかになったかなぁという気がします。

2.8MHzのDSDを176.4kHz/24bitのflacファイルに変換したものを再生した際に特に顕著に感じました。

他にはクリアになったのと音が広がるような印象を持った曲もありました。

つたない表現ですいません。


以下の作業は一般ユーザで行い、root権限が必要な場合はsudoコマンドを使用しております。


・デフォルト状態の確認
[vortexbox.localdomain ~]# uname -a
Linux vortexbox.localdomain 3.6.11-4.fc16.i686.PAE #1 SMP Tue Jan 8 21:18:14 UTC 2013 i686 i686 i386 GNU/Linux


・RPMパッケージの作成に必要なツールインストールする
[vortexbox.localdomain ~]# sudo yum install rpmdevtools yum-utils

〜 省略 〜

総ダウンロード容量: 225 k
インストール済み容量: 347 k
これでいいですか? [y/N]y

〜 省略 〜

完了しました!


・RPMのビルド環境を作る
[vortexbox.localdomain ~]# rpmdev-setuptree

・カーネルソースパッケージをダウンロード
[vortexbox.localdomain ~]# yumdownloader --source kernel

〜 省略 〜

kernel-3.6.11-4.fc16.src.rpm | 66 MB 00:29


・カーネルソースパッケージに必要なパッケージをインストールする
[vortexbox.localdomain ~]# sudo yum-builddep kernel-3.6.11-4.fc16.src.rpm

〜 省略 〜

総ダウンロード容量: 8.2 M
インストール済み容量: 15 M
これでいいですか? [y/N]y

〜 省略 〜

完了しました!


・カーネルソースパッケージを一般ユーザの~/rpmbuild/以下にインストールする
警告が出ますが無視して良いようです。
[vortexbox.localdomain ~]# rpm -Uvh kernel-3.6.11-4.fc16.src.rpm

〜 省略 〜

警告: ユーザー mockbuild は存在しません - root を使用します
警告: グループ mockbuild は存在しません - root を使用します


・カーネルソースツリーを準備する
[vortexbox.localdomain ~]# cd ~/rpmbuild/SPECS/
[vortexbox.localdomain SPECS]# rpmbuild -bp --target=$(uname -m) kernel.spec

〜 省略 〜

+ cd ..
+ exit 0


・環境変数を設定する
[vortexbox.localdomain SPECS]# export arch=i686
[vortexbox.localdomain SPECS]# export ver=3.6
[vortexbox.localdomain SPECS]# export subver=11-4
[vortexbox.localdomain SPECS]# export fedver=fc16


・CONFIG_PREEMPT_RT当てた後のconfigファイルを作成する環境を作る
[vortexbox.localdomain SPECS]# cp -r ~/rpmbuild/BUILD/kernel-$ver.$fedver ~/rpmbuild/BUILD/kernel-$ver.$fedver.orig
[vortexbox.localdomain SPECS]# cp -al ~/rpmbuild/BUILD/kernel-$ver.$fedver.orig ~/rpmbuild/BUILD/kernel-$ver.$fedver.new


・CONFIG_PREEMPT_RTを準備する
CONFIG_PREEMPT_RTからパッチを入手します。
新しいパッチがリリースされると古いものはフォルダから移動されるようなので、コマンド例のURLは無効になっている可能性があります。
CONFIG_PREEMPT_RTからカーネルバージョンに合った最新版を入手してください。
[vortexbox.localdomain SPECS]# cd ../SOURCES/
[vortexbox.localdomain SOURCES]# wget https://www.kernel.org/pub/linux/kernel/projects/rt/3.6/patch-3.6.11.2-rt34-rc1.patch.gz

〜 省略 〜

013-05-07 09:06:42 (248 KB/s) - `patch-3.6.11.2-rt34-rc1.patch.gz' へ保存完了 [167521/167521]

[vortexbox.localdomain SOURCES]# gzip -d patch-3.6.11.2-rt34-rc1.patch.gz


・config作成用のソースツリーにCONFIG_PREEMPT_RTを当てる
[vortexbox.localdomain SOURCES]# cd ../BUILD/kernel-3.6.fc16.new/linux-3.6.i686/
[vortexbox.localdomain linux-3.6.i686]# patch -p1 < ../../../SOURCES/patch-3.6.11.2-rt34-rc1.patch

〜 省略 〜

patching file net/packet/af_packet.c
patching file net/rds/ib_rdma.c
patching file scripts/mkcompile_h


・ベースとなるconfigファイルを準備する
[vortexbox.localdomain linux-3.6.i686]# cp configs/kernel-3.6.11-i686-PAE.config .config

・make menuconfigを実行するために必要なncurses-develをインストールする
[vortexbox.localdomain linux-3.6.i686]# sudo yum install ncurses-devel

〜 省略 〜

総ダウンロード容量: 700 k
インストール済み容量: 700 k
これでいいですか? [y/N]y


・make menuconfigを実行してカーネルに組み込む機能を選択する
[vortexbox.localdomain linux-3.6.i686]# make menuconfig
menuconfig トップ画面

Processor type and features
→ Processor family を Intel Atom に設定

Processor type and features
→ Preemption Model を Fully Preemptible Kernel (RT) に設定

Kernel hacking の項目を可能な限り外す

・configファイルの先頭に # i386 を記述
[vortexbox.localdomain linux-3.6.i686]# vi .config
[vortexbox.localdomain linux-3.6.i686]# head -n1 .config
# i386


・作成したconfigファイルをコピーする
[vortexbox.localdomain linux-3.6.i686]# cp .config ~/rpmbuild/SOURCES/config-`uname -m`-generic

・32-bit x86 カーネルの場合は下記もコピーする
コピーしないと後で行うrpmbuildの途中で止まってしまいます。
[vortexbox.localdomain linux-3.6.i686]# cp .config ~/rpmbuild/SOURCES/config-i686-PAE
[vortexbox.localdomain linux-3.6.i686]# cp .config ~/rpmbuild/SOURCES/config-x86-32-generic


・SPECファイルを修正する
左端の番号は行番号です。
状況により異なる番号になるかもしれません。
色を変えてある部分が修正した箇所です。
[vortexbox.localdomain linux-3.6.i686]# cd ~/rpmbuild/SPECS
[vortexbox.localdomain SPECS]# vi kernel.spec

〜 省略 〜

26 # % define buildid .local
27 %define buildid .hanagurort3

〜 省略 〜

739 #rhbz 890547
740 Patch21240: ACPI-do-not-use-Lid-and-Sleep-button-for-S5-wakeup.patch
741
742 Patch99999: patch-3.6.11.2-rt34-rc1.patch

〜 省略 〜

1395 #rhbz 890547
1396 ApplyPatch ACPI-do-not-use-Lid-and-Sleep-button-for-S5-wakeup.patch
1397
1398 ApplyPatch patch-3.6.11.2-rt34-rc1.patch

〜 省略 〜


・カーネルをビルドする
--without pae と --without debug を指定して私の環境には必要ないものはビルドしません。
全部ビルドしたら15時間くらいかかりました。
[vortexbox.localdomain SPECS]# rpmbuild -bb --without pae --without debug --target=`uname -m` kernel.spec

〜 省略 〜

書き込み完了: /home/hanaguro/rpmbuild/RPMS/i686/kernel-3.6.11-4.hanagurort3.fc16.i686.rpm
書き込み完了: /home/hanaguro/rpmbuild/RPMS/i686/kernel-headers-3.6.11-4.hanagurort3.fc16.i686.rpm
書き込み完了: /home/hanaguro/rpmbuild/RPMS/i686/kernel-debuginfo-common-i686-3.6.11-4.hanagurort3.fc16.i686.rpm
書き込み完了: /home/hanaguro/rpmbuild/RPMS/i686/kernel-tools-3.6.11-4.hanagurort3.fc16.i686.rpm
書き込み完了: /home/hanaguro/rpmbuild/RPMS/i686/kernel-tools-libs-3.6.11-4.hanagurort3.fc16.i686.rpm
書き込み完了: /home/hanaguro/rpmbuild/RPMS/i686/kernel-tools-libs-devel-3.6.11-4.hanagurort3.fc16.i686.rpm
書き込み完了: /home/hanaguro/rpmbuild/RPMS/i686/kernel-tools-debuginfo-3.6.11-4.hanagurort3.fc16.i686.rpm
書き込み完了: /home/hanaguro/rpmbuild/RPMS/i686/kernel-devel-3.6.11-4.hanagurort3.fc16.i686.rpm
書き込み完了: /home/hanaguro/rpmbuild/RPMS/i686/kernel-debuginfo-3.6.11-4.hanagurort3.fc16.i686.rpm
実行中(%clean): /bin/sh -e /var/tmp/rpm-tmp.mUMZZ7
+ umask 022
+ cd /home/hanaguro/rpmbuild/BUILD
+ cd kernel-3.6.fc16
+ rm -rf /home/hanaguro/rpmbuild/BUILDROOT/kernel-3.6.11-4.hanagurort3.fc16.i386
+ exit 0


・カーネルをインストールします
とりあえずカーネルとモジュールだけインストールして、問題なく起動することを確認後にインストールします。

-Uや--upgradeオプションは使用してはいけないとドキュメントにあります。
おそらく正常に動いているカーネルが削除されてしまい、新しくインストールしたカーネルが動かなかった場合にどうしようもなくなる可能性があるからかと思います。
 [vortexbox.localdomain SPECS]# cd ../RPMS/i686/
[vortexbox.localdomain i686]# sudo rpm -ivh --force kernel-3.6.11-4.hanagurort3.fc16.i686.rpm
準備しています... ########################################### [100%]
1:kernel ########################################### [100%]


・GRUBの設定ファイルを修正してインストールしたカーネルの起動オプションにmaxcpus=1とlapicを追加します
[vortexbox.localdomain i686]# sudo vi/etc/grub2.cfg

〜 省略 〜

menuentry 'Fedora (3.6.11-4.hanagurort3.fc16.i686)' --class vortexbox --class gnu-linux --class gnu --class os {
load_video
set gfxpayload=keep
insmod gzio
insmod part_gpt
insmod ext2
set root='(hd0,gpt2)'
search --no-floppy --fs-uuid --set=root 764f5a38-5c5b-4330-b689-fa21c0cbb68c
echo 'Loading Fedora (3.6.11-4.hanagurort3.fc16.i686)'
linux /vmlinuz-3.6.11-4.hanagurort3.fc16.i686 root=/dev/mapper/VolGroup-lv_root ro rd.md=0 rd.dm=0 rd.lvm.lv=VolGroup/lv_swap KEYTABLE=jp106 quiet SYSFONT=latarcyrheb-sun16 rhgb rd.lvm.lv=VolGroup/lv_root rd.luks=0 LANG=en_US.UTF-8 maxcpus=1 lapic
echo 'Loading initial ramdisk ...'
initrd /initramfs-3.6.11-4.hanagurort3.fc16.i686.img
}

〜 省略 〜



ここで再起動したところ以下のようなエラーメッセージが出てモジュールを読み込むことが出来ませんでした。

modprobe: FATAL: Could not load
/lib/modules/3.6.11-4.hanagurort3.fc16.i686-rt34-rc1/modules.dep: No such file or directory


そこでシンボリックリンクを作成して誤魔化しました。
[vortexbox.localdomain ~]# cd /lib/modules
[vortexbox.localdomain modules]# sudo ln -s 3.6.11-4.hanagurort3.fc16.i686 3.6.11-4.hanagurort3.fc16.i686-rt34-rc1


新しくインストールしたカーネルで起動した際の情報です。
[vortexbox.localdomain ~]# uname -a
Linux vortexbox.localdomain 3.6.11-4.hanagurort3.fc16.i686-rt34-rc1 #1 SMP PREEMPT RT Wed May 8 03:45:02 JST 2013 i686 i686 i386 GNU/Linux


0 件のコメント: