mirror of
https://github.com/ibm-s390-linux/s390-tools.git
synced 2026-08-05 02:14:52 +00:00
This prevents out-of-memory (OOM) situations in the kdump crashkernel environment. Please note that the new dracut module 95zdev-kdump and the new library zdev-lib.sh need to be packaged into the same (core) (sub)package as 95zdev. This patch introduces a new dracut module "zdev-kdump", which is used instead of module "zdev" when building a kdump initrd: 1. Ignore all persistently configured block devices and disable zfcp auto LUN scanning => minimize the number of SCSI devices enabled during kdump. 2. Do not rely on chzdev's persistent configuration => work with systems that do not use chzdev for persistent device configuration. The detection of kdump is based on strict hostonly mode and on $IN_KDUMP. See also https://src.fedoraproject.org/rpms/kexec-tools commit 4eedcae5e154 ("dracut-module-setup.sh: don't include multipath-hostonly") and https://github.com/dracutdevs/dracut commits 35e86ac117ac ("Merge 90-multipath-hostonly and 90-multipath") a695250ec7db ("Introduce tri-state hostonly mode") and https://src.fedoraproject.org/rpms/kexec-tools/blob/rawhide/f/mkdumprd#_17 https://src.fedoraproject.org/rpms/kexec-tools/blob/rawhide/f/dracut-module-setup.sh#_23. The detection of kdump is also based on kdump_needed() in https://github.com/openSUSE/kdump/blob/master/dracut/module-setup.sh. Reviewed-by: Peter Oberparleiter <oberpar@linux.ibm.com> Signed-off-by: Steffen Maier <maier@linux.ibm.com> Signed-off-by: Jan Höppner <hoeppner@linux.ibm.com>
100 lines
3.1 KiB
Bash
Executable File
100 lines
3.1 KiB
Bash
Executable File
#!/bin/bash
|
|
#
|
|
# Copyright IBM Corp. 2023
|
|
#
|
|
# s390-tools is free software; you can redistribute it and/or modify
|
|
# it under the terms of the MIT license. See LICENSE for details.
|
|
#
|
|
#
|
|
# 95zdev-kdump/module_setup.sh
|
|
# This module installs configuration files (udev rules and modprobe.conf
|
|
# files) required to enable the kdump target on s390.
|
|
#
|
|
|
|
# called by dracut
|
|
check() {
|
|
local _arch=${DRACUT_ARCH:-$(uname -m)}
|
|
|
|
# Ensure that we're running on s390
|
|
[ "$_arch" = "s390" -o "$_arch" = "s390x" ] || return 1
|
|
|
|
source "$moddir/../95zdev/zdev-lib.sh"
|
|
|
|
# Ensure this module is only included when building kdump initrd
|
|
is_kdump || return 1
|
|
|
|
# Ensure that required tools are available
|
|
require_binaries chzdev || return 1
|
|
|
|
return 0
|
|
}
|
|
|
|
# called by dracut
|
|
depends() {
|
|
return 0
|
|
}
|
|
|
|
# called by dracut
|
|
installkernel() {
|
|
# Add modules for all device types supported by chzdev (required for
|
|
# auto-configuration)
|
|
instmods ctcm lcs qeth qeth_l2 qeth_l3 dasd_mod dasd_eckd_mod dasd_fba_mod \
|
|
dasd_diag_mod zfcp
|
|
}
|
|
|
|
# called by dracut
|
|
install() {
|
|
local _tempfile
|
|
|
|
# Obtain kdump target device configuration
|
|
|
|
_tempfile=$(mktemp --tmpdir dracut-zdev.XXXXXX)
|
|
|
|
# work with systems that are not based on chzdev persistent config
|
|
local _configuration="--active"
|
|
# disable zfcp auto LUN scan to prevent OOM situations on systems with
|
|
# many zFCP LUNs
|
|
inst_dir /etc/modprobe.d
|
|
chzdev zfcp --type "allow_lun_scan=0" --persistent \
|
|
--base "/etc=$initdir/etc" --yes --quiet --no-root-update \
|
|
--force >/dev/null
|
|
# drop /etc/zfcp.conf from dracut module 95zfcp
|
|
echo "rd.zfcp.conf=0" > "$initdir/etc/cmdline.d/00-no-zfcp-conf.conf"
|
|
# => only activate individual zfcp paths found as required below
|
|
|
|
function check_zdev() {
|
|
local _dev=$1
|
|
local _devsysfs _bdevpath
|
|
_devsysfs=$(
|
|
cd -P /sys/dev/block/"$_dev" && echo "$PWD"
|
|
)
|
|
_bdevpath=/dev/${_devsysfs##*/}
|
|
# do not export device type information potentially unknown on import
|
|
chzdev --export - "$_configuration" --by-node "$_bdevpath" --quiet \
|
|
2>/dev/null >> "$_tempfile"
|
|
}
|
|
for_each_host_dev_and_slaves_all check_zdev
|
|
sed -i -e 's/^\[active /\[persistent /' "$_tempfile"
|
|
|
|
# Apply via --import to prevent other devices from being configured
|
|
chzdev --import "$_tempfile" --persistent --base "/etc=$initdir/etc" \
|
|
--yes --quiet --no-root-update --force >/dev/null
|
|
|
|
rm -f "$_tempfile"
|
|
|
|
# these are purely generated udev rules so we have to glob expand
|
|
# within $initdir and strip the $initdir prefix for mark_hostonly
|
|
local -a _array
|
|
local _nullglob=$(shopt -p nullglob)
|
|
shopt -u nullglob
|
|
readarray -t _array < \
|
|
<(ls -1 $initdir/etc/udev/rules.d/41-*.rules 2> /dev/null)
|
|
[[ ${#_array[@]} -gt 0 ]] && mark_hostonly "${_array[@]#$initdir}"
|
|
readarray -t _array < \
|
|
<(ls -1 $initdir/etc/modprobe.d/s390x-*.conf 2> /dev/null)
|
|
[[ ${#_array[@]} -gt 0 ]] && mark_hostonly "${_array[@]#$initdir}"
|
|
$_nullglob
|
|
|
|
return 0
|
|
}
|