RHEL8.1betaでのRHEL8.0からの新機能/変更点まとめ(3)

Red Hat Enterprise Linux 8.1 betaでのRed Hat Enterprise Linux 8.0からの新機能/変更点まとめ(3)

ここでは、Red Hat Enterprise Linux (RHEL) 8.1 betaのRHEL 8.0からの差分を簡単に纏めてみます。

RHEL 8.0の個々の新機能の紹介は、別途ブログで順次投稿していく予定です。

RHEL8.1betaでのRHEL8.0からの新機能/変更点まとめ記事の過去記事はこちらを参照ください。

Red Hat Enterprise Linux 8.1 betaとRed Hat Enterprise Linux 8.0との差分

ここでは、RHEL 8.1betaのRHEL 8.0からの差分の情報を、Red Hatのリリースノート(8.1 beta Release Notes: Chapter 4. New features)から抜き出してそれぞれ(順不同になってしまいますが)確認したいと思います。

リリースノートによると、RHEL 8.1 betaでの新しい機能としては

  1. The web console
  2. Installer and image creation
  3. Kernel
  4. Infrastructure services
  5. Dynamic programming languages, web and database servers
  6. Desktop
  7. Graphics infrastructures
  8. Hardware enablement
  9. Identity Management
  10. Compilers and development tools
  11. File systems and storage
  12. High availability and clusters
  13. Networking
  14. Security

があります。

今回は第一回第二回に引き続き、「3. Kernel」の新機能/変更点での残りの項目を簡単に纏めます。

尚、RHEL上のパッチの確認には、RHNのサイトからダウンロードできる、それぞれのパッケージのsrc.rpmからソースコード及びpatchとSPECファイルを参照しています。

3.Kernelの新機能/変更点(続き)

3.1 “early kdump”機能のサポート

RHEL 8.0では”テクノロジープレビュー”となっていたearly kdumpが8.1からはサポートされました。

以下、このearly kdump機能を少し見てみましょう。

3.1.1 “early kdump”機能の説明

    1. early kdump機能

RHEL5/6/7ではkdumpサービスがスタートするのがboot時に遅すぎたため、ブート中の早い段階でcrashした際にdumpが取得できませんでした。

“early kdump”はクラッシュカーネルのvmlinuzとinitramfsをブート中のカーネルのinitramfsに保存し、確保されているメモリ(crashkernel)に直接読み込みます。

ブート中にブートしているkernelのクラッシュダンプを取得する目的で、クラッシュカーネルとinitramfsをロードするために、kexec-toolsパッケージに以下の2つのdracutモジュールが付け加えられました。

[root@rhel81beta ~]# ls -l /usr/lib/dracut/modules.d/99earlykdump/
合計 8
-rwxr-xr-x. 1 root root 1690  6月 17 10:15 early-kdump.sh
-rwxr-xr-x. 1 root root 1879  6月 17 10:15 module-setup.sh
    1. early kdumpの有効化

前提として、kdumpが有効になって起動している必要があります。

“dracut”でinitramfsがearly kdumpをサポートするようにします。

[root@rhel81beta ~]# dracut -f --add earlykdump
    1. rd.earlykdumpパラメータを/boot/grub2/grubenvファイルに追加し、再起動します。
saved_entry=f7f53275423a4aa3aa3bb0515abba56d-4.18.0-107.el8.x86_64
kernelopts=root=/dev/mapper/rhel-root ro crashkernel=auto resume=/dev/mapper/rhel-swap rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb console=tty0 console=ttyS0,9600n8r rd.earlykdump
boot_success=1
    1. lsinitrdでinitramfsのイメージファイル内を見てみると、early kdump用のinitramfs, vmlinuzがboot/以下にあることがわかります。
[root@rhel81beta boot]# lsinitrd /boot/initramfs-4.18.0-107.el8.x86_64.img |grep boot
drwxr-xr-x   2 root     root            0 Jun 14 10:10 boot
-rw-------   1 root     root     18070458 Jun 14 10:10 boot/initramfs-4.18.0-107.el8.x86_64kdump.img
lrwxrwxrwx   1 root     root           40 Jun 14 10:10 boot/initramfs-earlykdump.img -> initramfs-4.18.0-107.el8.x86_64kdump.img
-rw-r--r--   1 root     root      8036496 Jun 14 10:00 boot/vmlinuz-4.18.0-107.el8.x86_64
lrwxrwxrwx   1 root     root           29 Jun 14 10:10 boot/vmlinuz-earlykdump -> vmlinuz-4.18.0-107.el8.x86_64
    1. journalctlで起動時のログを見てみると、early-kdumpが有効になっていることがわかります。
[root@rhel81beta boot]# journalctl -x |grep early-kdump
10月 18 07:51:10 rhel81beta.localtest dracut-cmdline[231]: early-kdump is enabled.
10月 18 07:51:10 rhel81beta.localtest dracut-cmdline[231]: kexec: loaded early-kdump kernel
[root@rhel81beta boot]# 

3.1.2 “early kdump”機能のテスト

    1. kdump.serviceが起動する前にSysRqを用いてパニックを起こすようなunitファイルを作成します。
[root@rhel81beta boot]# vi /etc/systemd/system/sysrq.service
[root@rhel81beta boot]# chmod 664 /etc/systemd/system/sysrq.service 
[root@rhel81beta boot]# cat /etc/systemd/system/sysrq.service 
[Unit]
Description=SysRq Service
Before=kdump.service

[Service]
ExecStart=/usr/local/sysrq.sh
Type=simple

[Install]
WantedBy=default.target
[root@rhel81beta boot]# vi /usr/local/sysrq.sh
[root@rhel81beta boot]# cat /usr/local/sysrq.sh 
#!/bin/bash
/usr/bin/echo c > /proc/sysrq-trigger

[root@rhel81beta boot]# chmod +x /usr/local/sysrq.sh 
[root@rhel81beta boot]# systemctl daemon-reload
[root@rhel81beta boot]# systemctl enable sysrq.service 
Created symlink /etc/systemd/system/default.target.wants/sysrq.service → /etc/systemd/system/sysrq.service.
    1. システムを再起動すると、sysrq.serviceを起動してパニックが発生します。
[    7.685901] sysrq: SysRq : Trigger a crash
[    7.687550] BUG: unable to handle kernel NULL pointer dereference at 0000000000000000
[    7.689754] PGD 0 P4D 0
[    7.690776] Oops: 0002 [#1] SMP PTI
[    7.692120] CPU: 0 PID: 1045 Comm: echo Kdump: loaded Tainted: G                 ---------r-  - 4.18.0-107.el8.x86_64 #1
[    7.695125] Hardware name: VMware, Inc. VMware Virtual Platform/440BX Desktop Reference Platform, BIOS 6.00 04/13/2018
[    7.697923] RIP: 0010:sysrq_handle_crash+0x12/0x20
[    7.699621] Code: 34 f7 c5 ff 48 89 df e8 7c fb ff ff e9 9c fe ff ff 90 90 90 90 90 90 90 0f 1f 44 00 00 c7 05 6d 47 d3 00 01 00 00 00 0f ae f8  04 25 00 00 00 00 01 c3 0f 1f 44 00 00 0f 1f 44 00 00 bf 01 00
[    7.705742] RSP: 0018:ffffb69bc1ebfe80 EFLAGS: 00010246
[    7.707604] RAX: ffffffff9d50f4d0 RBX: 0000000000000063 RCX: 0000000000000000
[    7.710089] RDX: 0000000000000000 RSI: ffff9cb231016a08 RDI: 0000000000000063
[    7.712575] RBP: 0000000000000007 R08: 0000000000000612 R09: 0000000000aaaaaa
[    7.715073] R10: 0000000000000000 R11: ffffb69bc15fd600 R12: 0000000000000000
[    7.717674] R13: ffffffff9e337180 R14: 000055a69012a5f0 R15: 0000000000000000
[    7.719911] FS:  00007fe4d1663540(0000) GS:ffff9cb231000000(0000) knlGS:0000000000000000
[    7.722494] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[    7.724488] CR2: 0000000000000000 CR3: 000000000f2e6005 CR4: 00000000003606f0
[    7.726797] Call Trace:
[    7.727946]  __handle_sysrq.cold.9+0x45/0xec
[    7.729667]  write_sysrq_trigger+0x2b/0x30
[    7.731391]  proc_reg_write+0x3c/0x60
[    7.732932]  vfs_write+0xa5/0x1a0
[    7.734253]  ksys_write+0x4f/0xb0
[    7.735604]  do_syscall_64+0x5b/0x1b0
[    7.736976]  entry_SYSCALL_64_after_hwframe+0x65/0xca
[    7.738644] RIP: 0033:0x7fe4d1177de8
[    7.739962] Code: 89 02 48 c7 c0 ff ff ff ff eb b3 0f 1f 80 00 00 00 00 f3 0f 1e fa 48 8d 05 35 59 2d 00 8b 00 85 c0 75 17 b8 01 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 58 c3 0f 1f 80 00 00 00 00 41 54 49 89 d4 55
[    7.746528] RSP: 002b:00007fff8d050308 EFLAGS: 00000246 ORIG_RAX: 0000000000000001
[    7.749022] RAX: ffffffffffffffda RBX: 0000000000000002 RCX: 00007fe4d1177de8
[    7.751576] RDX: 0000000000000002 RSI: 000055a69012a5f0 RDI: 0000000000000001
[    7.753973] RBP: 000055a69012a5f0 R08: 00007fe4d144a8e0 R09: 00007fe4d1663540
[    7.756345] R10: 000055a690125010 R11: 0000000000000246 R12: 00007fe4d1449780
[    7.759215] R13: 0000000000000002 R14: 00007fe4d1444740 R15: 0000000000000002
[    7.761994] Modules linked in: sunrpc intel_pmc_core crct10dif_pclmul crc32_pclmul ghash_clmulni_intel vmw_balloon intel_rapl_perf joydev pcspkr sg vmw_vmci i2c_piix4 xfs libcrc32c sr_mod cdrom vmwgfx sd_mod drm_kms_helper ata_generic syscopyarea sysfillrect sysimgblt fb_sys_fops ttm ahci drm libahci ata_piix mptspi crc32c_intel scsi_transport_spi libata mptscsih serio_raw e1000 mptbase dm_mirror dm_region_hash dm_log dm_mod
[    7.775041] CR2: 0000000000000000
[    0.000000] Linux version 4.18.0-107.el8.x86_64 (mockbuild@x86-vm-09.build.eng.bos.redhat.com) (gcc version 8.3.1 20190507 (Red Hat 8.3.1-4) (GCC)) #1 SMP Fri Jun 14 13:46:34 UTC 2019
[    0.000000] Command line: BOOT_IMAGE=(hd0,msdos1)/vmlinuz-4.18.0-107.el8.x86_64 ro resume=/dev/mapper/rhel-swap rhgb console=tty0 console=ttyS0,9600n8r rd.earlykdump irqpoll nr_cpus=1 reset_devices cgroup_disable=memory mce=off numa=off udev.children-max=2 panic=10 rootflags=nofail acpi_no_memhotplug transparent_hugepage=never nokaslr novmcoredd disable_cpu_apicid=0 elfcorehdr=2080120K
[    0.000000] Disabled fast string operations
[    0.000000] x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers'
[    0.000000] x86/fpu: Supporting XSAVE feature 0x002: 'SSE registers'
[    0.000000] x86/fpu: Supporting XSAVE feature 0x004: 'AVX registers'
[    0.000000] x86/fpu: xstate_offset[2]:  576, xstate_sizes[2]:  256
[    0.000000] x86/fpu: Enabled xstate features 0x7, context size is 832 bytes, using 'standard' format.
[    0.000000] BIOS-provided physical RAM map:
[    0.000000] BIOS-e820: [mem 0x0000000000000000-0x0000000000000fff] reserved

    1. grub画面で起動オプションに”systemd.unit=rescue.target”を付けて起動することで、システムがレスキューモードで立ち上がるので、rootパスワードを入れた後にsysrq.serviceを無効にします。
[    0.000000] Kernel command line: BOOT_IMAGE=(hd0,msdos1)/vmlinuz-4.18.0-107.el8.x86_64 root=/dev/mapper/rhel-root ro crashkernel=auto resume=/dev/mapper/rhel-swap rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb console=tty0 console=ttyS0,9600n8r rd.earlykdump systemd.unit=rescue.target
[    0.000000] Specific versions of hardware are certified with Red Hat Enterprise Linux 8. Please see the list of hardware certified with Red Hat Enterprise Linux 8 at https://access.redhat.com/ecosystem.
[    0.000000] Memory: 261664K/2096628K available (12292K kernel code, 2117K rwdata, 3776K rodata, 2368K init, 6356K bss, 304296K reserved, 0K cma-reserved)
[    0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=128, Nodes=1
[    0.000000] Kernel/User page tables isolation: enabled
----省略----
[    7.217391] RAPL PMU: hw unit of domain pp1-gpu 2^-0 Joules
[    7.220314] RAPL PMU: hw unit of domain psys 2^-0 Joules
[    7.515211] intel_pmc_core:  initialized
[    7.604968] XFS (sda1): Mounting V5 Filesystem
[    7.618940] XFS (sda1): Ending clean mount
You are in rescue mode. After logging in, type "journalctl -xb" to view
system logs, "systemctl reboot" to reboot, "systemctl default" or "exit"
to boot into default mode.
メンテナンスを行います。 root のパスワードを入力してください
(Control-D を押すと、処理を続行することができます): 
[root@rhel81beta boot]# systemctl enable sysrq.service
Removed /etc/systemd/system/default.target.wants/sysrq.service.
[root@rhel81beta boot]# 
    1. /var/crash以下にvmcoreが出来ていることがわかります。
[root@rhel81beta ~]# ls -l /var/crash/127.0.0.1-2019-10-18-08
合計 53008
-rw-------. 1 root root 54166099 10月 18 08:42 vmcore
-rw-r--r--. 1 root root   108816 10月 18 08:42 vmcore-dmesg.txt
[root@rhel81beta boot]#cat /var/crash/127.0.0.1-2019-10-18-08/vmcore-dmesg.txt 
---省略---
[    7.593253] RPC: Registered tcp NFSv4.1 backchannel transport module.
[    7.685901] sysrq: SysRq : Trigger a crash
[    7.687550] BUG: unable to handle kernel NULL pointer dereference at 0000000000000000
[    7.689754] PGD 0 P4D 0 
[    7.690776] Oops: 0002 [#1] SMP PTI
[    7.692120] CPU: 0 PID: 1045 Comm: echo Kdump: loaded Tainted: G                 ---------r-  - 4.18.0-107.el8.x86_64 #1
[    7.695125] Hardware name: VMware, Inc. VMware Virtual Platform/440BX Desktop Reference Platform, BIOS 6.00 04/13/2018
[    7.697923] RIP: 0010:sysrq_handle_crash+0x12/0x20
[    7.699621] Code: 34 f7 c5 ff 48 89 df e8 7c fb ff ff e9 9c fe ff ff 90 90 90 90 90 90 90 0f 1f 44 00 00 c7 05 6d 47 d3 00 01 00 00 00 0f ae f8  04 25 00 00 00 00 01 c3 0f 1f 44 00 00 0f 1f 44 00 00 bf 01 00
[    7.705742] RSP: 0018:ffffb69bc1ebfe80 EFLAGS: 00010246
[    7.707604] RAX: ffffffff9d50f4d0 RBX: 0000000000000063 RCX: 0000000000000000
[    7.710089] RDX: 0000000000000000 RSI: ffff9cb231016a08 RDI: 0000000000000063
[    7.712575] RBP: 0000000000000007 R08: 0000000000000612 R09: 0000000000aaaaaa
[    7.715073] R10: 0000000000000000 R11: ffffb69bc15fd600 R12: 0000000000000000
[    7.717674] R13: ffffffff9e337180 R14: 000055a69012a5f0 R15: 0000000000000000
[    7.719911] FS:  00007fe4d1663540(0000) GS:ffff9cb231000000(0000) knlGS:0000000000000000
[    7.722494] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033

3.2 “ipcnmi_extend”パラメータのサポート

LKMLのこちらから始まる一連の議論の中で、IPC_MNI(32k)の制限を拡張できるようにしようという話があり、その流れでipcnmi_extendパラメータがサポートされました。

sysctlで制御できるパラメータに関してはこちらのRHEL 7のドキュメントがわかりやすいですが

  • msgmni: メッセージキュー識別子の最大数
  • shmmni: システム全体の共有メモリセグメントの最大数

となっています。RHEL 8.1betaをインストールした段階でのデフォルト値は

[root@rhel81beta ~]# sysctl kernel.msgmni
kernel.msgmni = 32000
[root@rhel81beta ~]# sysctl kernel.shmmni
kernel.shmmni = 4096
[root@rhel81beta ~]# 

となっており、32768(32k)を超える値を設定すると

[root@rhel81beta ~]# sysctl -w kernel.shmmni=32768
kernel.shmmni = 32768
[root@rhel81beta ~]# sysctl -w kernel.msgmni=32768
kernel.msgmni = 32768
[root@rhel81beta ~]# sysctl -w kernel.msgmni=32769
sysctl: setting key "kernel.msgmni": 無効な引数です
kernel.msgmni = 32769
[root@rhel81beta ~]# sysctl -w kernel.shmmni=32769
sysctl: setting key "kernel.shmmni": 無効な引数です
kernel.shmmni = 32769

とエラーになります(実際には下記のように設定は反映されていません)。

sysctl: setting key "kernel.shmmni": 無効な引数です
kernel.shmmni = 32769
[root@rhel81beta ~]# sysctl -a|grep mni
kernel.auto_msgmni = 0
kernel.msgmni = 32000
kernel.shmmni = 4096

ここで、”ipcmni_extend”をGrubでbootのパラメータに加えて起動すると、

[    0.000000] Linux version 4.18.0-107.el8.x86_64 (mockbuild@x86-vm-09.build.eng.bos.redhat.com) (gcc version 8.3.1 20190507 (Red Hat 8.3.1-4) (GCC)) #1 SMP Fri Jun 14 13:46:34 UTC 2019
[    0.000000] Command line: BOOT_IMAGE=(hd0,msdos1)/vmlinuz-4.18.0-107.el8.x86_64 root=/dev/mapper/rhel-root ro crashkernel=auto resume=/dev/mapper/rhel-swap rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb console=tty0 console=ttyS0,9600n8r rd.earlykdump ipcmni_extend
--省略--
[    0.000000] BIOS-e820: [mem 0x00000000fffe0000-0x00000000ffffffff] reserved
[    0.000000] IPCMNI extended to 16777216.
[    0.000000] NX (Execute Disable) protection: active

となり、IPC_MNIが16777216(16MB)まで拡張されていることがわかります。

[root@rhel81beta ~]# sysctl -w kernel.shmmni=16777216
kernel.shmmni = 16777216
[root@rhel81beta ~]# sysctl -w kernel.msgmni=16777216
kernel.msgmni = 16777216
[root@rhel81beta ~]# sysctl -a|grep mni
kernel.auto_msgmni = 0
kernel.msgmni = 16777216
kernel.shmmni = 16777216

ここで、shmmni/msgmni双方に16777216(16M)を超える値を設定すると

[root@rhel81beta ~]# sysctl -w kernel.shmmni=16777217
sysctl: setting key "kernel.shmmni": 無効な引数です
kernel.shmmni = 16777217
[root@rhel81beta ~]# sysctl -w kernel.msgmni=16777217
sysctl: setting key "kernel.msgmni": 無効な引数です
kernel.msgmni = 16777217
[root@rhel81beta ~]# sysctl -a|grep mni
kernel.auto_msgmni = 0
kernel.msgmni = 32000
kernel.shmmni = 4096

と、エラーになります。

(注意) ipcmni_extendを付けることによりパフォーマンス劣化を招く場合もありますので、仕様の際にはくれぐれもお気をつけ下さい。


3.3 永続メモリ初期化コードで並列初期化をサポート

永続メモリ初期化コードで、永続メモリの複数のノードを持つシステムでの並列初期化をサポートしました。これにより、大量の永続メモリを備えたシステムでの全体的なメモリ初期化時間が大幅に短縮され、結果としてこれらのシステムは、高速に起動できるようになりました。

3.4 TPMツールの最新版へのアップデート

tpm2-toolsが最新バージョンに更新されました。

[RHEL8]
[sios@rhel8test ~]$ rpm -qa |grep tpm2-tools
tpm2-tools-3.1.1-4.el8.x86_64
-----------
[RHEL8.1beta]
[sios@rhel81beta ~]$ rpm -qa|grep tpm2-tools
tpm2-tools-3.1.4-5.el8.x86_64

3.1.1から3.1.4までの主な変更点は以下になります。

3.1.4 - 2019-03-14
  * 幾つかのmanページの修正
  * tpm2_getmanufec: ビルド中のワーニングの修正
  * "-T オプション"の修正
  * 幾つかのユニットテストの修正
  * autoconf-archiveバージョンの更新

3.1.3 - 2018-10-15
  * TCTI設定のためのTPM2TOOLS_*環境変数のサポートと、TPM2TOOLS_ENV_TCTIのサポート
  * tpm2_getcapの修正
  * test_tpm2_activecredentialの Python 3対応
  * tpm2_takeownershipの修正

3.1.2 - 2018-08-14
  * tpm2_create / tpm2_createprimary man ページの修正

3.5 “rngd”デーモンが非特権ユーザで動作

こちらはrng-tools-6.6-3で修正されています。現在リリース中の8.1betaではrng-tools-6.6-2がインストールされているため、動作の確認が出来ません。また、Fedora 31で使用できるrng-tools-6.7-3.fc31.x86_64でもサポートされていないようです。8.1がリリースされる際には、rng-tools-6.6-3以降が使用されると思われますので、サポートされているはずです。2019/10/19(JST)時点では、未だrng-tools-6.6-3は取得できない状態になっています。


3.6 debug Kernelでの”Undefined Behavior Sanitizer(UBSan) ユーティリティの有効化

Undefined Behavior Sanitizer(UBSan)ユーティリティは、実行時にCコード言語の未定義動作の欠陥を暴露します。 コンパイラの動作は、場合によっては開発者が期待するものと異なるため、このユーティリティがデバッグカーネルで有効になりました。 特にコンパイラーの最適化の場合、見つけにくいバグが発生しますが、UBSanを有効にしてデバッグカーネルを実行すると、システムはそのようなバグを簡単に検出できます。


3.7 bpftrace言語のサポート

こちらの@IT記事でも紹介されていますが、bpftraceというdtraceに似た動的トレーサが開発されています。RHEL8.1からは、bpftrace言語もサポートされます。


次回予告

ここまでで「3. Kernel」の変更点は終わりです。次回はその他の修正点等を簡単に纏めます。


RHEL8.1betaでのRHEL8.0からの新機能/変更点まとめ記事はこちらを参照ください。