前提条件
- 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)互換性がある。そのため一般的なアプリケーションの動作では、ほとんど影響しない。
なぜRHCKか?
UEKとRHCKでは互換性があるのは知っているけれど、RHCKを使いたいケースがある。
たとえば、使う商用パッケージがサポートするのはRHCKだけとか、RHCKのほうが利用者が多いので安定してるんじゃね(全RHEL系ディストリビューションを含む)といった理由だ。
次に実際の方法を解説する。
環境を確認する
これから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するときは、このファイルが参照される。アップデートパッケージがあるときには、こちらで指定した方がデフォルトカーネルになる。
# UPDATEDEFAULT specifies if new-kernel-pkg should make
# new kernels the default
UPDATEDEFAULT=yes
# DEFAULTKERNEL specifies the default kernel package type
DEFAULTKERNEL=kernel-uek
# 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 メニューの永続的な変更
デフォルトのカーネルを表示する。
# 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
末尾に-core
が付けるかわからないときはrpm -qa
で判断できる。kernel-core
やkernel-uek-core
があれば、それぞれ-core
が必要である。
$ 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
$ 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
$ 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系コマンドもあるが、それよりもずいぶんスマートにできたはずである。