Raspberry Pi 2 / 3 向け CentOS 7 RT Kernel RPM の作成

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
カテゴリー: めも パーマリンク

1 Response to Raspberry Pi 2 / 3 向け CentOS 7 RT Kernel RPM の作成

  1. ピンバック: Raspberry Pi 2 / 3 向け CentOS 7 RT Kernel の評価 | まこぴかっと

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です