Oracle LinuxのデフォルトカーネルをスマートにUEKからRHCKに変更する

# 前提条件

* Oracle Linux 7
* Oracle Linux 8
* Oracle Linux 9

# はじめに
Oracle Linuxには2種類のカーネルがある。1つはデフォルトカーネルのUEK（Unbreakable Enterprise Kernel）で、もう1つはRed Hatと完全に互換性を持つRHCK（Red Hat Compatible Kernel）である。UEKにはR4、R5など、さらにいくつかあるのだが、本題では無いので無視する。

今回何が言いたいかというと、

**UEK→RHCKの変更に関する情報はたくさん転がっているけれど、スマートではないものが多いんじゃね？**

7系になってGRUB2に変更されたことが大きく影響しているのだけれど、独断と偏見で、スマートな変更方法について語りたい。

### UEKとRHCKの互換性
UEKとRHCKではベースカーネルのバージョンは違うが、ユーザー空間で動作するアプリケーションについてはABI（Application Binary Interface）互換性がある。そのため一般的なアプリケーションの動作では、ほとんど影響しない。

* [Unbreakable Enterprise Kernelリリース7 - リリース・ノート](https://docs.oracle.com/cd/F10276_01/7/relnotes7.0/uek7.0-AboutUnbreakableEnterpriseKernelRelease7.html#oracle-certification-notice)
* [Oracle Linux for Oracle Cloud Infrastructure FAQ](https://www.oracle.com/a/ocom/docs/oracle-linux-for-cloud-infrastructure-faq.pdf)

### なぜRHCKか？

UEKとRHCKではアプリゲーションの互換性があるのは知っているけれど、RHCKを使いたいケースがある。

たとえば、使う商用パッケージがサポートするのはRHCKだけとか、デバイスドライバがRHCKだけに対応しているとか、RHCKのほうが利用者が多いので安定してるんじゃね、などの理由だ。

次に実際の方法を解説する。

# 環境を確認する

これからOracle Linux 7 / 8 / 9における変更方法を説明する。6系は違うので注意すること。

ディストリビューション＆バージョンを調べる。

```
# cat /etc/oracle-release
Oracle Linux Server release 7.6
```

現在のカーネルを確認すると"uek.x86_64"となっており、UEKカーネルになっていることがわかる。

```
# uname -r
4.14.35-1844.3.2.el7uek.x86_64
```

インストールされているカーネルを確認すると、UEKとRHCKがインストールされている。

```
# rpm -qa | grep kernel | sort
abrt-addon-kerneloops-2.1.11-52.0.1.el7.x86_64
kernel-3.10.0-957.10.1.el7.x86_64
kernel-3.10.0-957.12.1.el7.x86_64 ★これにしたい
kernel-3.10.0-957.5.1.el7.x86_64
kernel-tools-3.10.0-957.12.1.el7.x86_64
kernel-tools-libs-3.10.0-957.12.1.el7.x86_64
kernel-uek-4.14.35-1844.2.5.el7uek.x86_64
kernel-uek-4.14.35-1844.3.2.el7uek.x86_64 ★これが現在
kernel-uek-4.14.35-1844.4.5.el7uek.x86_64
```

見落としがちなのが/etc/sysconfig/kernelで、yum updateするときは、このファイルが参照される。アップデートパッケージがあるときには、こちらで指定した方がデフォルトカーネルになる。

```:UEK-UEK6：/etc/sysconfig/kernel
# UPDATEDEFAULT specifies if new-kernel-pkg should make
# new kernels the default
UPDATEDEFAULT=yes

# DEFAULTKERNEL specifies the default kernel package type
DEFAULTKERNEL=kernel-uek
```

```:UEK7：/etc/sysconfig/kernel
# UPDATEDEFAULT specifies if kernel-install should make
# new kernels the default
UPDATEDEFAULT=yes

# DEFAULTKERNEL specifies the default kernel package type
DEFAULTKERNEL=kernel-uek-core
```

# grubbyを使って変更する

GRUB2で便利なのがgrubbyである。grubbyを使うとかなりスマートに変更できる。詳しくは```grubby --help```や下記のマニュアルを見てほしい。

参考：[grubby ツールを使用した GRUB 2 メニューの永続的な変更](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/system_administrators_guide/sec-making_persistent_changes_to_a_grub_2_menu_using_the_grubby_tool)

デフォルトのカーネルを表示する。

```
# grubby --default-kernel
/boot/vmlinuz-4.14.35-1844.4.5.el7uek.x86_64
```

デフォルトのインデックス番号を表示する。これだけではよく分からないので、次にメニューを全表示する。

```
# grubby --default-index
0
```

メニューを全部表示するには```--info=ALL```を指定する。

```
# grubby --info=ALL
index=0　★現在はインデックス番号0のこれ↓
kernel=/boot/vmlinuz-4.14.35-1844.4.5.el7uek.x86_64
args="ro crashkernel=auto LANG=ja_JP.utf8 console=tty0 console=ttyS0,9600 rd.luks=0 rd.lvm=0 rd.md=0 rd.dm=0 netroot=iscsi:169.254.0.2:::1:iqn.2015-02.oracle.boot:uefi iscsi_param=node.session.timeo.replacement_timeout=6000 net.ifnames=1 nvme_core.shutdown_timeout=10 ipmi_si.tryacpi=0 ipmi_si.trydmi=0 ipmi_si.trydefaults=0 libiscsi.debug_libiscsi_eh=1 network-config=e2NvbmZpZzogZGlzYWJsZWR9Cg== loglevel=4"
root=UUID=0efcd14b-2edf-4b85-ae64-4c3855ca5a58
initrd=/boot/initramfs-4.14.35-1844.4.5.el7uek.x86_64.img
title=Oracle Linux Server 7.6, with Unbreakable Enterprise Kernel 4.14.35-1844.4.5.el7uek.x86_64
index=1
kernel=/boot/vmlinuz-3.10.0-957.12.1.el7.x86_64 ★これに変更したい
args="ro crashkernel=auto LANG=ja_JP.utf8 console=tty0 console=ttyS0,9600 rd.luks=0 rd.lvm=0 rd.md=0 rd.dm=0 netroot=iscsi:169.254.0.2:::1:iqn.2015-02.oracle.boot:uefi iscsi_param=node.session.timeo.replacement_timeout=6000 net.ifnames=1 nvme_core.shutdown_timeout=10 ipmi_si.tryacpi=0 ipmi_si.trydmi=0 ipmi_si.trydefaults=0 libiscsi.debug_libiscsi_eh=1 network-config=e2NvbmZpZzogZGlzYWJsZWR9Cg== loglevel=4"
root=UUID=0efcd14b-2edf-4b85-ae64-4c3855ca5a58
initrd=/boot/initramfs-3.10.0-957.12.1.el7.x86_64.img
title=Oracle Linux Server 7.6, with Linux 3.10.0-957.12.1.el7.x86_64
index=2
kernel=/boot/vmlinuz-0-rescue-9c95796465364eaf81b3c9f027d03ee6
args="ro crashkernel=auto LANG=en_US.UTF-8 console=tty0 console=ttyS0,9600 rd.luks=0 rd.lvm=0 rd.md=0 rd.dm=0 netroot=iscsi:169.254.0.2:::1:iqn.2015-02.oracle.boot:uefi iscsi_param=node.session.timeo.replacement_timeout=6000 net.ifnames=1 nvme_core.shutdown_timeout=10 ipmi_si.tryacpi=0 ipmi_si.trydmi=0 ipmi_si.trydefaults=0 libiscsi.debug_libiscsi_eh=1 network-config=e2NvbmZpZzogZGlzYWJsZWR9Cg== loglevel=4"
root=UUID=0efcd14b-2edf-4b85-ae64-4c3855ca5a58
initrd=/boot/initramfs-0-rescue-9c95796465364eaf81b3c9f027d03ee6.img
title=Oracle Linux Server 7.6 Rescue 9c95796465364eaf81b3c9f027d03ee6 (3.10.0-957.10.1.el7.x86_64)
★中略
index=8
non linux entry
```

次のようにgrepすれば簡潔に表示できる。

```
grubby --info=ALL | grep -A 2 index
```

デフォルトカーネルをRHCKに変更する。```--set-default-index=<index number>```を使えばインデックス番号を使える。しかし間違いの元なので使わない。

```
# grubby --set-default /boot/vmlinuz-3.10.0-957.12.1.el7.x86_64
```

変更されていることを確認する。

```
# grubby --default-index
1
# grubby --default-kernel
/boot/vmlinuz-3.10.0-957.12.1.el7.x86_64
```

# /etc/sysconfig/kernelを修正する


最後に`/etc/sysconfig/kernel`の`DEFAULTKERNEL`パラメータでデフォルトカーネルをRHCK変更する。これを変更しないとパッケージをupdateしたときにUEKに戻ってしまう。なお、指定するパラメータはカーネルのバージョンによって異なる。

| カーネルの種類 | DEFAULTKERNELの値 |
|:-:|:-:|
| RHCK(Oracle Linux7まで)    | kernel  |
| RHCK(Oracle Linux8以降)   | kernel-core  |
| UEK-UEK6  | kernel-uek |
| UEK7(※)  | kernel-uek-core  |

※ UEK7がデフォルトになっているのはOracle Linux 8 Update 7以降。Oracle Linuxでは、同一メジャーバージョン内でも複数バージョンのUEKがあるので注意する。

```
# vi /etc/sysconfig/kernel
```

**変更前：**
　DEFAULTKERNEL=kernel-uek-core

**変更後：**
　DEFAULTKERNEL=kernel-core
　#DEFAULTKERNEL=kernel-uek-core

:::note warn
末尾に`-core`が付けるかわからないときは`rpm -qa`で判断できる。`kernel-core`や`kernel-uek-core`があれば、それぞれ`-core`が必要である。

```:UEK7の場合
$ rpm -qa | grep uek | sort
kernel-uek-5.15.0-5.76.5.1.el9uek.x86_64
kernel-uek-core-5.15.0-5.76.5.1.el9uek.x86_64  ★coreがあるのでkernel-uek-core
kernel-uek-devel-5.15.0-5.76.5.1.el9uek.x86_64
kernel-uek-modules-5.15.0-5.76.5.1.el9uek.x86_64
```

```:UEK6の場合
$ rpm -qa | grep uek | sort
kernel-uek-5.4.17-2136.314.6.2.el8uek.x86_64 ★coreがないのでkernel-uek
kernel-uek-devel-5.4.17-2136.314.6.2.el8uek.x86_64
```

```:RHCKの場合
$ rpm -qa | grep kernel | sort -n
kernel-5.14.0-70.26.1.0.1.el9_0.x86_64
kernel-core-5.14.0-70.26.1.0.1.el9_0.x86_64  ★coreがあるのでkernel-core
kernel-headers-5.14.0-70.26.1.0.1.el9_0.x86_64
kernel-modules-5.14.0-70.26.1.0.1.el9_0.x86_64
kernel-tools-5.14.0-70.26.1.0.1.el9_0.x86_64
```
:::


修正が終わったらリブートする。

```
# reboot
```

再起動したら確認する。次のようにRHCKに変わっていることがわかる。

```
# grubby --default-kernel
/boot/vmlinuz-3.10.0-957.12.1.el7.x86_64
# grubby --default-index
1
```

# おわりに

一通りの手順を見てどうだろうか。grub2-mkconfigなどのgrub2系コマンドもあるが、それよりもずいぶんスマートにできたはずである。

# 参考資料

* [Oracle Linux ドキュメント](https://www.oracle.com/jp/linux/technologies/oracle-linux-documentation.html)
* [Oracle Linux Document](https://docs.oracle.com/en/operating-systems/linux.html)
* [Announcing the Unbreakable Enterprise Kernel Release 6 for Oracle Linux](https://blogs.oracle.com/linux/announcing-the-unbreakable-enterprise-kernel-release-6-for-oracle-linux)
* [Oracle Linux - How to Change Default Kernel](https://community.oracle.com/docs/DOC-1026887)