Ubuntu16.04でFedora30のカーネルを使ってみる話

## Ubuntu16.04でFedora30のカーネルを使ってみる話

####環境
```
% dmesg |grep -i pana
[    0.000000] DMI: Panasonic Corporation CF-SX2ADHCS/CFSX2-3, BIOS V3.00L10 12/27/2012
[    3.465184] input: Panasonic Laptop Support as /devices/virtual/input/input13
% cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.6 LTS"
```
####経緯
もともと半年に1回くらいのペースで、その時の最新のvanillaカーネルを自己ビルドして使ってきました。レッツノートの場合i8042.cにパッチを当てないとsuspend〜resumeが上手く行かない不具合があってずっと手パッチ当てててたのが、今回は要らなかったので良かったです。いや、ソース覗いて、i8042_pm_opsのresumeとrestoreの実装がほぼ同じだったのでもしや、という予感はありましたけど。

また、これまでも気が向いた時にFedoraのカーネルと.configで動作トライはしてきたんですが、起動に失敗続けていまして、今回初めて成功したため、ネタとして上げて見ました。

####ソース取得
[koji.fedoraproject.org](https://koji.fedoraproject.org/koji/)からkernelで検索して、ビルドに成功＆ほぼ最新、とう言う条件で、以下のソースをgetしました。
(A) [kernel-5.1.12-300.fc30.src.rpm](https://kojipkgs.fedoraproject.org//packages/kernel/5.1.12/300.fc30/src/kernel-5.1.12-300.fc30.src.rpm)

また、執筆時(6/24)での最新vanillaカーネルを取得します。
(B) [linux-5.1.14.tar.xz](https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.1.14.tar.xz)

(A)と(B)は$HOMEに置いておくと仮定します。

####ビルド準備
(B)を展開します。

```
% tar Jxf linux-5.1.14.tar.xz
```

(A)は適当なディレクトリ作ってrpm2cpioとcpioで、中身を展開しときます。

```
% mkdir -p /tmp/x
% cd /tmp/x
% rpm2cpio ~/kernel-5.1.12-300.fc30.src.rpm|cpio -id
```

あとは、kernel.specを覗いて、496行目からFedora向けのpatchを当てているところをなぞります。

```
% cd ~/linux-5.1.14
% patch -p1 < /tmp/x/arm-sdhci-esdhc-imx-fixes.patch
% patch -p1 < /tmp/x/arm64-rock960-enable-tsadc.patch
% patch -p1 < /tmp/x/bcm2835-cpufreq-add-CPU-frequency-control-driver.patch
% patch -p1 < /tmp/x/watchdog-bcm2835_wdt-Fix-module-autoload.patch
% patch -p1 < /tmp/x/arm64-tegra-jetson-tx1-fixes.patch
% patch -p1 < /tmp/x/arm64-tegra-Add-NVIDIA-Jetson-Nano-Developer-Kit-support.patch
% patch -p1 < /tmp/x/input-rmi4-remove-the-need-for-artifical-IRQ.patch
% patch -p1 < /tmp/x/0001-s390-jump_label-Correct-asm-contraint.patch
% patch -p1 < /tmp/x/0001-Drop-that-for-now.patch
% patch -p1 < /tmp/x/KEYS-Make-use-of-platform-keyring-for-module-signature.patch
% patch -p1 < /tmp/x/net-vhost_net-fix-possible-infinite-loop.patch
% patch -p1 < /tmp/x/0001-platform-x86-ideapad-laptop-Remove-no_hw_rfkill_list.patch
% patch -p1 < /tmp/x/ipv6_sockglue-fix-missing-check-bug-in-ip6_ra_control.patch
% patch -p1 < /tmp/x/Buffer-overflow-read-checks-in-mwifiex.patch
% patch -p1 < /tmp/x/0001-efi-x86-Add-missing-error-handling-to-old_memmap-1-1.patch
% patch -p1 < /tmp/x/0001-ip_sockglue-Fix-missing-check-bug-in-ip_ra_control.patch
% patch -p1 < /tmp/x/drm-edid-fix-missing-check-bug-in-drm_load_edid_firmware.patch
% patch -p1 < /tmp/x/consolemap-fix-memory-leaking-bug.patch
% patch -p1 < /tmp/x/clk-sunxi-fix-a-missing-check-bug-in-sunxi_divs_clk_setup.patch
% patch -p1 < /tmp/x/wcd9335-fix-a-incorrect-use-of-kstrndup.patch
% patch -p1 < /tmp/x/scsi-mpt3sas_ctl-fix-double-fetch-bug-in_ctl_ioctl_main.patch
% patch -p1 < /tmp/x/powerpc-fix-a-missing-check-in-dlpar_parse_cc_property.patch
% patch -p1 < /tmp/x/0001-netfilter-nat-fix-udp-checksum-corruption.patch
% patch -p1 < /tmp/x/mwifiex-Fix-heap-overflow-in-mwifiex_uap_parse_tail_ies.patch
% patch -p1 < /tmp/x/0001-platform-x86-asus-wmi-Only-Tell-EC-the-OS-will-handl.patch
% patch -p1 < /tmp/x/drm-panel-orientation-quirks.patch
% patch -p1 < /tmp/x/efi-bgrt-acpi6.2-support.patch
```

全部p1なので覚えておくと良いのかも。
※efi-secureboot.patchと0001-netfilter-nat-fix-udp-checksum-corruption.patchは
patch当てに失敗するので手パッチしてください。カーネルの5.1.14と5.1.12の違いだと思います。あるべき論としては、(B)で5.1.12を用意するということですが。


###ビルド
以下実行。LOCALVERSIONとKDEB_PKGVERSIONは自由な設定項目です。出来上がるdebファイルの名前に使われます。

```
% cd ~/linux-5.1.14
% cp /tmp/x/kernel-x86_64.config .config
% yes "" | make oldconfig
% make -j4 deb-pkg LOCALVERSION=-my KDEB_PKGVERSION=1 > log 2>&1 &
```

###インストール
rootで、ビルドした(make実行した)ディレクトリの一つ上の親ディレクトリに出来る以下のdebファイルをインストールします。
`# dpkg -i linux-headers-5.1.14-my_1_amd64.deb linux-image-5.1.14-my_1_amd64.deb`

無事リブートすればubuntuでFedoraのカーネルを動かすことができています。