Raspberry Pi 用 CentOS 7 の最新 Kernel RPM を先日作った。
ただ、せっかくなので、Real-Time (PREEMPT_RT) Kernel も作りたくなった。
まあ、Kernel だけ用意してもあんまり意味ないんだけどね。
とりあえず作っただけで、テストや評価はまた後日。
■成果物だけがほしい人向け
・成果物置き場
https://www.sgv417.jp/repos/altarch/rpi2-kernel-rt/
・上記成果物を使うためのリポジトリファイル
https://www.sgv417.jp/repos/altarch/rpi2-kernel-rt/tsc-centos7-rpi2-kernel-rt.repo
次のように使う。
# cd /etc/yum.repos.d/ # curl -L --output /etc/yum.repos.d/tsc-centos7-rpi2-kernel-rt.repo https://www.sgv417.jp/repos/altarch/rpi2-kernel-rt/tsc-centos7-rpi2-kernel-rt.repo # yum update --enablerepo=tsc-kernel-rt raspberrypi2\*
・tsc-centos7-rpi2-kernel-rt.repo の中身
[tsc-kernel-rt] name=CentOS 7 RT-Kernels for Raspberry Pi by tsc baseurl=https://www.sgv417.jp/repos/altarch/rpi2-kernel-rt/ failovermethod=priority enabled=0 gpgcheck=1 gpgkey=https://www.sgv417.jp/repos/altarch/rpi2-kernel-rt/RPM-GPG-KEY-tsc-kernel
■ベースとする Kernel
今回は先日作った「raspberrypi2-4.4.46-v7.1.el7.tsc.src.rpm」をベースとする。
■Real-Time Linux Patch
Real-Time Linux Wiki を参考に情報を集めてみる。
https://rt.wiki.kernel.org/
今の Raspberry Pi 用 Kernel は、4.4系列なので Latest 4.4-rt を選べばよいらしい。
ただ、今回ほしいのは「4.4.46」用のパッチだけど、そこにはなかった。
なので、自力でパッチをいじることとした。
・patch? patches?
patches には、どれが何のパッチなのかわかるように、コミットされたパッチごとに保存されている。
しかし、これだと、Patchするのが手間なので、一つにまとまっている patch のほうを今回は採用する。
なので「patches-4.4.39-rt50.tar.gz」を採用。
■ベースとなる Source RPM の展開と、SPEC の修正、Patch の配備
・Source RPMの展開
$ cd ~/rpmbuild/SRPMS/ $ rpm -ivh raspberrypi2-4.4.46-v7.1.el7.tsc.src.rpm
・SPEC の修正
$ cd ~/rpmbuild/SPECS/ $ cp -piav raspberrypi2.spec raspberrypi2.spec.org $ vi raspberrypi2.spec
変更点Diffは以下の通り。
--- raspberrypi2.spec.org 2017-02-04 12:11:48.000000000 +0900 +++ raspberrypi2.spec 2017-02-05 20:56:35.783353977 +0900 @@ -5,7 +5,7 @@ %define Arch arm %define local_version v7 -%define extra_version 1 +%define extra_version 1.rt Name: raspberrypi2 Version: 4.4.46 @@ -26,6 +26,8 @@ # Compile with SELinux but disable per default Patch0: bcm2709_selinux_config.patch +Patch1: patch-4.4.39-rt50_tsc.patch +Patch2: preempt_rt_full_config.patch %description Specific kernel and bootcode for Raspberry Pi @@ -77,6 +79,8 @@ %prep %setup -q -n raspberrypi-linux-%{commit_linux_short} %patch0 -p1 +%patch1 -p1 +%patch2 -p1 perl -p -i -e "s/^EXTRAVERSION.*/EXTRAVERSION = -%{release}/" Makefile perl -p -i -e "s/^CONFIG_LOCALVERSION=.*/CONFIG_LOCALVERSION=/" arch/%{Arch}/configs/bcm2709_defconfig @@ -184,6 +188,10 @@ %doc /boot/LICENCE.broadcom %changelog +* Sun Feb 5 2017 NAME <MAILADDR> - 4.4.46-v7.1.rt.el7 +- RT Patch applied (patch-4.4.39-rt50_tsc.patch) +- Enable CONFIG_PREEMPT_RT_FULL (preempt_rt_full_config.patch) + * Sat Feb 4 2017 NAME <MAILADDR> - 4.4.46-v7.1.el7 - update to upstream version 4.4.46
・Patch の配備
patch-4.4.39-rt50.patch (オリジナル) と 今回修正した patch-4.4.39-rt50_tsc.patch の差分は以下の通り。
すでにアップストリームで取り込まれたパッチの削除と、追加されたコードのための修正となっている。
なので、大きな差異はないはず。たぶん。
あと、手抜きするために -rt50 が追記されないようにREBASEの削除もした。
なお、patches での該当パッチは次の通り。
0305-sc16is7xx-Drop-bogus-use-of-IRQF_ONESHOT.patch
→当てない
0087-posix-timers-Thread-posix-cpu-timers-on-rt.patch
→該当パッチ部前後に修正が入ったのでコード修正
0365-Linux-4.4.39-rt50-REBASE.patch
→当てない
--- patch-4.4.39-rt50.patch 2017-01-05 03:02:09.000000000 +0900 +++ patch-4.4.39-rt50_tsc.patch 2017-02-05 23:12:14.000000000 +0900 @@ -11121,19 +11121,6 @@ } static int __init -diff --git a/drivers/tty/serial/sc16is7xx.c b/drivers/tty/serial/sc16is7xx.c -index edb5305b9d4d..7d5ee8a13ac6 100644 ---- a/drivers/tty/serial/sc16is7xx.c -+++ b/drivers/tty/serial/sc16is7xx.c -@@ -1230,7 +1230,7 @@ static int sc16is7xx_probe(struct device *dev, - - /* Setup interrupt */ - ret = devm_request_irq(dev, irq, sc16is7xx_irq, -- IRQF_ONESHOT | flags, dev_name(dev), s); -+ flags, dev_name(dev), s); - if (!ret) - return 0; - diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c index f44ce09367bc..5fc9a14721bd 100644 --- a/drivers/usb/core/hcd.c @@ -14384,7 +14371,7 @@ +#endif /* process credentials */ - const struct cred __rcu *real_cred; /* objective and real subjective task + const struct cred __rcu *ptracer_cred; /* Tracer's credentials at attach */ @@ -1568,10 +1592,15 @@ struct task_struct { /* signal handlers */ struct signal_struct *signal; @@ -29010,13 +28997,6 @@ print_symbol("caller is %s\n", (long)__builtin_return_address(0)); dump_stack(); -diff --git a/localversion-rt b/localversion-rt -new file mode 100644 -index 000000000000..42c384668389 ---- /dev/null -+++ b/localversion-rt -@@ -0,0 +1 @@ -+-rt50 diff --git a/mm/Kconfig b/mm/Kconfig index 97a4e06b15c0..9614351e68b8 100644 --- a/mm/Kconfig
また、上記 Patch を当てても、ビルドする Kernel の Config には反映されないため、Kernel Configuration に PREEMPT_RT_FULL を適用するパッチも用意する。
--- a/arch/arm/configs/bcm2709_defconfig 2017-02-05 20:15:00.381483642 +0900 +++ b/arch/arm/configs/bcm2709_defconfig 2017-02-05 20:44:36.068653317 +0900 @@ -27,9 +27,9 @@ CONFIG_BLK_DEV_INITRD=y CONFIG_EMBEDDED=y # CONFIG_COMPAT_BRK is not set CONFIG_PROFILING=y -CONFIG_OPROFILE=m +# CONFIG_OPROFILE is not set CONFIG_KPROBES=y -CONFIG_JUMP_LABEL=y +# CONFIG_JUMP_LABEL is not set CONFIG_MODULES=y CONFIG_MODULE_UNLOAD=y CONFIG_MODVERSIONS=y @@ -43,7 +43,15 @@ CONFIG_ARCH_BCM2709=y CONFIG_SMP=y CONFIG_HAVE_ARM_ARCH_TIMER=y CONFIG_VMSPLIT_2G=y -CONFIG_PREEMPT_VOLUNTARY=y +# CONFIG_PREEMPT_TRACER is not set +# CONFIG_PREEMPT_VOLUNTARY is not set +CONFIG_DEBUG_PREEMPT=y +CONFIG_PREEMPT=y +CONFIG_PREEMPT_COUNT=y +CONFIG_PREEMPT_LAZY=y +CONFIG_PREEMPT_RCU=y +CONFIG_PREEMPT_RT_BASE=y +CONFIG_PREEMPT_RT_FULL=y CONFIG_AEABI=y CONFIG_OABI_COMPAT=y # CONFIG_CPU_SW_DOMAIN_PAN is not set @@ -1072,7 +1080,7 @@ CONFIG_LEDS_TRIGGER_TIMER=y CONFIG_LEDS_TRIGGER_ONESHOT=y CONFIG_LEDS_TRIGGER_HEARTBEAT=y CONFIG_LEDS_TRIGGER_BACKLIGHT=y -CONFIG_LEDS_TRIGGER_CPU=y +# CONFIG_LEDS_TRIGGER_CPU is not set CONFIG_LEDS_TRIGGER_GPIO=y CONFIG_LEDS_TRIGGER_DEFAULT_ON=y CONFIG_LEDS_TRIGGER_TRANSIENT=m
■Source RPM の作成と Binary RPM の作成
$ cd ~/rpmbuild/SPECS/ $ rpmbuild -bs --define 'dist .el7.tsc' raspberrypi2.spec $ rpmbuild --rebuild --define 'dist .el7.tsc' ~/rpmbuild/SRPMS/raspberrypi2-4.4.46-v7.1.rt.el7.tsc.src.rpm
ピンバック: Raspberry Pi 2 / 3 向け CentOS 7 RT Kernel の評価 | まこぴかっと