kexec 커널이 수행하는 작업을 볼 수 있도록 kexec 커널용 인텔 드라이버 i915의 비디오 모드를 어떻게 재설정합니까?

kexec 커널이 수행하는 작업을 볼 수 있도록 kexec 커널용 인텔 드라이버 i915의 비디오 모드를 어떻게 재설정합니까?

저는 Arch Linux를 실행하고 있으며 설정을 완료했습니다.덤프 파일이렇게 하면 현재 커널에 패닉이 발생하면(또는 sysrq+c를 통해 수동으로 충돌이 발생하면) 다른 커널(kexec 커널)이 시작되어 나중에 검사할 수 있도록 충돌 덤프를 생성합니다.

문제는 콘솔에서 트리거하든 Xorg 내에서 트리거하든 kexec 커널 전체 기간 동안 동일한 화면이 디스플레이에 남아 있으므로 그것이 무엇을 하는지 볼 수 없다는 것입니다.

예를 들어, 이는 AMD/Radeon을 사용하는 i915가 아닌 노트북에서는 문제가 되지 않습니다.

kexec 커널에 대해 다음 커널 매개변수를 시도했지만 문제에 아무런 영향을 미치지 않습니다.
1. systemd.unit=kdump-save.service irqpoll nr_cpus=1 reset_devices ipv6.disable=1 loglevel=9
2.systemd.unit=kdump-save.service irqpoll nr_cpus=1 reset_devices ipv6.disable=1 loglevel=9 i915.fastboot=0 i915.reset=1 i915.modeset=-1 i915.force_reset_modeset_test=true i915.verbose_state_checks=1 i915.enable_hangcheck=1 i915.error_capture=1 zram.num_devices=3 zswap.enabled=0

ExecStart=현재 아무런 효과 없이 사용하고 있는 전체 라인은 다음과 같습니다.ExecStart=/usr/bin/kexec -p /boot/vmlinuz-linux-git --initrd=/boot/initramfs-linux-git.img --reuse-cmdline --reset-vga --console-vga "--append=root=UUID=2b8b9ab8-7ac5-4586-aa42-d7ffb12de92a systemd.unit=kdump-save.service irqpoll nr_cpus=1 reset_devices ipv6.disable=1 loglevel=9 i915.fastboot=0 i915.reset=1 i915.modeset=-1 i915.force_reset_modeset_test=true i915.verbose_state_checks=1 i915.enable_hangcheck=1 i915.error_capture=1 zram.num_devices=3 zswap.enabled=0"

따라서 커널 패닉이 발생하면 kexec 커널이 덤프 파일 저장을 마치고 다시 시작할 때까지 패닉 당시에 있던 X 또는 콘솔 화면이 화면에 남아 있습니다.

crashkernel=kexec 커널은 기본 커널의 arg가 너무 낮을 때 OOM할 수 있으므로 makedumpfile해당 화면을 볼 수 없기 때문에 x분 후에 재부팅되지 않는 이유를 모르겠습니다.

80x25 모드로 전환하는 (작동하는) 방법이 필요한 것 같아요. 아니면 kexec 커널에 i915 그래픽 카드를 재설정하여 정상적으로 다시 초기화할 수 있도록 지시하는 방법이 필요한 것 같아요.

편집하다:EFI를 사용하지 않고 grub+MBR 및 일부 주요 커널 정보를 사용합니다.

[    0.275493] Kernel command line: BOOT_IMAGE=/boot/vmlinuz-linux-git root=UUID=2b8b9ab8-7ac5-4586-aa42-d7ffb12de92a rw root_trim=yes rd.luks.allow-discards rd.luks.options=discard ipv6.disable=1 ipv6.disable_ipv6=1 ipv6.autoconf=0 loglevel=15 log_buf_len=16M ignore_loglevel printk.always_kmsg_dump=y printk.time=y printk.devkmsg=on mminit_loglevel=4 memory_corruption_check=1 fbcon=scrollback:4096k fbcon=font:ProFont6x11 net.ifnames=0 nolvm dobtrfs console=tty1 earlyprintk=vga audit=0 systemd.log_target=kmsg systemd.journald.forward_to_console=1 enforcing=0 udev.children-max=1256 rd.udev.children-max=1256 nohz=on oops=panic crashkernel=1024M panic=0 page_poison=1 psi=1 sysrq_always_enabled random.trust_cpu=off logo.nologo lpj=0 mce=bootlog reboot=force,cold noexec=on nohibernate scsi_mod.use_blk_mq=1 consoleblank=120 mitigations=off nospectre_v1 nospectre_v2 spectre_v2=off nospec_store_bypass_disable kvm-intel.vmentry_l1d_flush=never l1tf=off nopti pti=off no_stf_barrier noibrs noibpb ssbd=force-off spectre_v2_user=off noretpoline mds=off rd.log=all noefi cpuidle.governor=menu zram.num_devices=3 zswap.enabled=0 zswap.same_filled_pages_enabled=1 zswap.compressor=zstd zswap.max_pool_percent=40 zswap.zpool=z3fold vsyscall=none i915.enable_fbc=1 i915.verbose_state_checks=1 i915.enable_hangcheck=1 i915.error_capture=1
[    0.845622] device: 'fbcon': device_add
[    0.845626] PM: Adding info for No Bus:fbcon
...
[    4.416734] fbcon: i915drmfb (fb0) is primary device
...
[    4.494499] i915 0000:00:02.0: fb0: i915drmfb frame buffer device

기본 커널과 kexec 커널 간의 명령줄 차이점은 다음과 같습니다.

diff --git a/home/user/logs/pri_kernel.log b/home/user/logs/kexeckernel.log
index e6d2815..9b90a12 100644
--- a/home/user/logs/pri_kernel.log
+++ b/home/user/logs/kexeckernel.log
@@ -1,2 +1,2 @@
 [    0.000000] Command line:
-BOOT_IMAGE=/boot/vmlinuz-linux-git
  root=UUID=2b8b9ab8-7ac5-4586-aa42-d7ffb12de92a rw root_trim=yes rd.luks.allow-discards rd.luks.options=discard ipv6.disable=1 ipv6.disable_ipv6=1 ipv6.autoconf=0 loglevel=15 log_buf_len=16M ignore_loglevel printk.always_kmsg_dump=y printk.time=y printk.devkmsg=on mminit_loglevel=4 memory_corruption_check=1 fbcon=scrollback:4096k fbcon=font:ProFont6x11 net.ifnames=0 nolvm dobtrfs console=tty1 earlyprintk=vga audit=0 systemd.log_target=kmsg systemd.journald.forward_to_console=1 enforcing=0 udev.children-max=1256 rd.udev.children-max=1256 nohz=on oops=panic
-crashkernel=1024M
  panic=0 page_poison=1 psi=1 sysrq_always_enabled random.trust_cpu=off logo.nologo lpj=0 mce=bootlog reboot=force,cold noexec=on nohibernate scsi_mod.use_blk_mq=1 consoleblank=120 mitigations=off nospectre_v1 nospectre_v2 spectre_v2=off nospec_store_bypass_disable kvm-intel.vmentry_l1d_flush=never l1tf=off nopti pti=off no_stf_barrier noibrs noibpb ssbd=force-off spectre_v2_user=off noretpoline mds=off rd.log=all noefi cpuidle.governor=menu zram.num_devices=3 zswap.enabled=0 zswap.same_filled_pages_enabled=1 zswap.compressor=zstd zswap.max_pool_percent=40 zswap.zpool=z3fold vsyscall=none i915.enable_fbc=1 i915.verbose_state_checks=1 i915.enable_hangcheck=1 i915.error_capture=1 
+root=UUID=2b8b9ab8-7ac5-4586-aa42-d7ffb12de92a systemd.unit=kdump-save.service irqpoll nr_cpus=1 reset_devices ipv6.disable=1 loglevel=9 i915.fastboot=0 i915.reset=1 i915.modeset=-1 i915.force_reset_modeset_test=true i915.verbose_state_checks=1 i915.enable_hangcheck=1 i915.error_capture=1 zram.num_devices=3 zswap.enabled=0 acpi_rsdp=0xf05b0 elfcorehdr=2588032K
~

~

cmdline을 제외하고 kexec 커널 dmesg에는 언급된 내용이 없습니다 i915.

답변1

CONFIG_DRM_I915=y저는 .CONFIG_DRM_I915=mCONFIG_DRM=y=m

위의 두 가지 변경을 수행한 후 make nconfig실제 변경 사항은 다음과 같습니다 .config.

--- .config.old 2019-09-10 12:38:12.798272432 +0200
+++ .config 2019-09-10 15:17:26.327144324 +0200
@@ -2279,7 +2279,7 @@ CONFIG_I2C_MUX=m

 CONFIG_I2C_HELPER_AUTO=y
 CONFIG_I2C_SMBUS=m
-CONFIG_I2C_ALGOBIT=m
+CONFIG_I2C_ALGOBIT=y

 #
 # I2C Hardware Bus support
@@ -3124,11 +3124,12 @@ CONFIG_AGP_INTEL=y
 CONFIG_INTEL_GTT=y
 # CONFIG_VGA_ARB is not set
 # CONFIG_VGA_SWITCHEROO is not set
-CONFIG_DRM=m
+CONFIG_DRM=y
 CONFIG_DRM_MIPI_DSI=y
 CONFIG_DRM_DP_AUX_CHARDEV=y
+# CONFIG_DRM_DEBUG_MM is not set
 # CONFIG_DRM_DEBUG_SELFTEST is not set
-CONFIG_DRM_KMS_HELPER=m
+CONFIG_DRM_KMS_HELPER=y
 CONFIG_DRM_KMS_FB_HELPER=y
 CONFIG_DRM_FBDEV_EMULATION=y
 CONFIG_DRM_FBDEV_OVERALLOC=100
@@ -3160,7 +3161,7 @@ CONFIG_DRM_I2C_NXP_TDA998X=m
 # end of ACP (Audio CoProcessor) Configuration

 # CONFIG_DRM_NOUVEAU is not set
-CONFIG_DRM_I915=m
+CONFIG_DRM_I915=y
 CONFIG_DRM_I915_ALPHA_SUPPORT=y
 CONFIG_DRM_I915_FORCE_PROBE="*"
 CONFIG_DRM_I915_CAPTURE_ERROR=y
@@ -3223,7 +3224,7 @@ CONFIG_DRM_PANEL_BRIDGE=y
 # CONFIG_DRM_TINYDRM is not set
 # CONFIG_DRM_VBOXVIDEO is not set
 # CONFIG_DRM_LEGACY is not set
-CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=m
+CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y

 #
 # Frame buffer Devices
@@ -3236,11 +3237,11 @@ CONFIG_FB_BOOT_VESA_SUPPORT=y
 CONFIG_FB_CFB_FILLRECT=y
 CONFIG_FB_CFB_COPYAREA=y
 CONFIG_FB_CFB_IMAGEBLIT=y
-CONFIG_FB_SYS_FILLRECT=m
-CONFIG_FB_SYS_COPYAREA=m
-CONFIG_FB_SYS_IMAGEBLIT=m
+CONFIG_FB_SYS_FILLRECT=y
+CONFIG_FB_SYS_COPYAREA=y
+CONFIG_FB_SYS_IMAGEBLIT=y
 # CONFIG_FB_FOREIGN_ENDIAN is not set
-CONFIG_FB_SYS_FOPS=m
+CONFIG_FB_SYS_FOPS=y
 CONFIG_FB_DEFERRED_IO=y
 # CONFIG_FB_MODE_HELPERS is not set
 CONFIG_FB_TILEBLITTING=y
@@ -3265,7 +3266,6 @@ CONFIG_FB_VESA=y
 # CONFIG_FB_RIVA is not set
 # CONFIG_FB_I740 is not set
 # CONFIG_FB_LE80578 is not set
-# CONFIG_FB_INTEL is not set
 # CONFIG_FB_MATROX is not set
 # CONFIG_FB_RADEON is not set
 # CONFIG_FB_ATY128 is not set

OP의 모든 kexec 커널 매개변수를 유지했는데 작동합니다! 또한 i915OP에서 모든 매개변수를 제거했지만 다음과 같이 계속 작동합니다.systemd.unit=kdump-save.service irqpoll nr_cpus=1 reset_devices ipv6.disable=1 loglevel=9

이제 비디오 모드가 재설정되고 부팅 후 0.2초 이내에 kexec 커널의 모든 내용을 볼 수 있습니다.

이것이 아마도 (이미) AMD/Radeon에서 실행되는 이유일 것입니다. DRM_RADEON=yCONFIG_DRM=y.

고쳐 쓰다: 나는 다른 방법을 찾았습니다. and를 커널 모듈로
유지하려면 해당 항목이 (솔직히 모두 필요한지 확실하지 않음) 및 (아마도 그럴 필요는 없음)이 한 줄에 있는지 확인하십시오 . 이 방법도 작동하지만 표시되는 가장 오래된 dmesg 행은 부팅 후 4.3초입니다(커널 i915/drm의 경우 0.2초와 비교).i915drm/etc/mkintcpio.confMODULES=(i915 drm fbcon)/etc/modules-load.d/i915.confi915

^ 즉, initrd/initramfs 이미지에 kexec 커널이 부팅 시 최대한 빨리 로드할 수 있는 모듈이 있는지 확인하세요.

관련 정보