在 2018年04月28日 05:10, Kazuhito Hagio 写道:
Hi Lianbo,
On 4/25/2018 8:53 AM, Lianbo Jiang wrote:
> we move some common functions from kdumpctl to kdump-lib.sh, the
> functions could be used in other modules, such as early kdump.
> It has no bad effect.
>
> Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com>
> ---
> Some changes based the patch v3:
> 1.kdump-lib.sh
> -add comment for some functions.
>
> kdump-lib.sh | 214 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> kdumpctl | 206 +-------------------------------------------------------
> 2 files changed, 217 insertions(+), 203 deletions(-)
>
> diff --git a/kdump-lib.sh b/kdump-lib.sh
> index d981c4f..a505a99 100755
> --- a/kdump-lib.sh
> +++ b/kdump-lib.sh
> @@ -485,3 +485,217 @@ get_dracut_args_target()
> {
> echo $1 | grep "\-\-mount" | sed "s/.*--mount .\(.*\)/\1/" |
cut -d' ' -f1
> }
> +
> +check_crash_mem_reserved()
> +{
> + local mem_reserved
> +
> + mem_reserved=$(cat /sys/kernel/kexec_crash_size)
> + if [ $mem_reserved -eq 0 ]; then
> + echo "No memory reserved for crash kernel"
> + return 1
> + fi
> +
> + return 0
> +}
> +
> +check_kdump_feasibility()
> +{
> + if [ ! -e /sys/kernel/kexec_crash_loaded ]; then
> + echo "Kdump is not supported on this kernel"
> + return 1
> + fi
> + check_crash_mem_reserved
> + return $?
> +}
> +
> +check_current_kdump_status()
> +{
> + if [ ! -f /sys/kernel/kexec_crash_loaded ];then
> + echo "Perhaps CONFIG_CRASH_DUMP is not enabled in kernel"
> + return 1
> + fi
> +
> + rc=`cat /sys/kernel/kexec_crash_loaded`
> + if [ $rc == 1 ]; then
> + return 0
> + else
> + return 1
> + fi
> +}
> +
> +# remove_cmdline_param <kernel cmdline> <param1> [<param2>] ...
[<paramN>]
> +# Remove a list of kernel parameters from a given kernel cmdline and print the
result.
> +# For each "arg" in the removing params list, "arg" and
"arg=xxx" will be removed if exists.
> +remove_cmdline_param()
> +{
> + local cmdline=$1
> + shift
> +
> + for arg in $@; do
> + cmdline=`echo $cmdline | \
> + sed -e "s/\b$arg=[^ ]*//g" \
> + -e "s/^$arg\b//g" \
> + -e "s/[[:space:]]$arg\b//g" \
> + -e "s/\s\+/ /g"`
> + done
> + echo $cmdline
> +}
> +
> +#
> +# This function returns the "apicid" of the boot
> +# cpu (cpu 0) if present.
> +#
> +get_bootcpu_apicid()
> +{
> + awk ' \
> + BEGIN { CPU = "-1"; } \
> + $1=="processor" && $2==":" { CPU = $NF; }
\
> + CPU=="0" && /^apicid/ { print $NF; } \
> + ' \
> + /proc/cpuinfo
> +}
> +
> +#
> +# append_cmdline <kernel cmdline> <parameter name> <parameter
value>
> +# This function appends argument "$2=$3" to string ($1) if not already
present.
> +#
> +append_cmdline()
> +{
> + local cmdline=$1
> + local newstr=${cmdline/$2/""}
> +
> + # unchanged str implies argument wasn't there
> + if [ "$cmdline" == "$newstr" ]; then
> + cmdline="${cmdline} ${2}=${3}"
> + fi
> +
> + echo $cmdline
> +}
> +
> +# This function check iomem and determines if we have more than
> +# 4GB of ram available. Returns 1 if we do, 0 if we dont
> +need_64bit_headers()
> +{
> + return `tail -n 1 /proc/iomem | awk '{ split ($1, r, "-"); \
> + print (strtonum("0x" r[2]) > strtonum("0xffffffff"));
}'`
> +}
> +
> +# Check if secure boot is being enforced.
> +#
> +# Per Peter Jones, we need check efivar SecureBoot-$(the UUID) and
> +# SetupMode-$(the UUID), they are both 5 bytes binary data. The first four
> +# bytes are the attributes associated with the variable and can safely be
> +# ignored, the last bytes are one-byte true-or-false variables. If SecureBoot
> +# is 1 and SetupMode is 0, then secure boot is being enforced.
> +#
> +# Assume efivars is mounted at /sys/firmware/efi/efivars.
> +is_secure_boot_enforced()
> +{
> + local secure_boot_file setup_mode_file
> + local secure_boot_byte setup_mode_byte
> +
> + secure_boot_file=$(find /sys/firmware/efi/efivars -name SecureBoot-*
2>/dev/null)
> + setup_mode_file=$(find /sys/firmware/efi/efivars -name SetupMode-*
2>/dev/null)
> +
> + if [ -f "$secure_boot_file" ] && [ -f
"$setup_mode_file" ]; then
> + secure_boot_byte=$(hexdump -v -e '/1 "%d\ "'
$secure_boot_file|cut -d' ' -f 5)
> + setup_mode_byte=$(hexdump -v -e '/1 "%d\ "'
$setup_mode_file|cut -d' ' -f 5)
> +
> + if [ "$secure_boot_byte" = "1" ] && [
"$setup_mode_byte" = "0" ]; then
> + return 0
> + fi
> + fi
> +
> + return 1
> +}
> +
> +#
> +# prepare_kexec_args <kexec args>
> +# This function prepares kexec argument.
> +#
> +prepare_kexec_args()
> +{
> + local kexec_args=$1
> + local found_elf_args
> +
> + ARCH=`uname -m`
> + if [ "$ARCH" == "i686" -o "$ARCH" ==
"i386" ]
> + then
> + need_64bit_headers
> + if [ $? == 1 ]
> + then
> + found_elf_args=`echo $kexec_args | grep elf32-core-headers`
> + if [ -n "$found_elf_args" ]
> + then
> + echo -n "Warning: elf32-core-headers overrides
correct elf64 setting"
> + echo
> + else
> + kexec_args="$kexec_args
--elf64-core-headers"
> + fi
> + else
> + found_elf_args=`echo $kexec_args | grep elf64-core-headers`
> + if [ -z "$found_elf_args" ]
> + then
> + kexec_args="$kexec_args
--elf32-core-headers"
> + fi
> + fi
> + fi
> + echo $kexec_args
> +}
> +
> +check_boot_dir()
> +{
> + local kdump_bootdir=$1
> + #If user specify a boot dir for kdump kernel, let's use it. Otherwise
> + #check whether it's a atomic host. If yes parse the subdirectory under
> + #/boot; If not just find it under /boot.
> + [ -n "$kdump_bootdir" ] && return
When I tested this patch with a KDUMP_BOOTDIR setting, dracut couldn't
find the kdump initramfs and the vmlinuz in the dir.
Now since the callers of check_boot_dir() assume that it prints a path,
it has to print it also here:
if [ -n "$kdump_bootdir" ]; then
echo "$kdump_bootdir"
return
fi
Thanks,
Kazu
Thanks Kazu. That's a good idea, i will fix it.
Lianbo
>> +
>> + if ! is_atomic || [ "$(uname -m)" = "s390x" ]; then
>> + kdump_bootdir="/boot"
>> + else
>> + eval $(cat /proc/cmdline| grep "BOOT_IMAGE" | cut
-d' ' -f1)
>> + kdump_bootdir="/boot"$(dirname $BOOT_IMAGE)
>> + fi
>> + echo $kdump_bootdir
>> +}
>> +
>> +#
>> +# prepare_cmdline <commandline> <commandline remove> <commandline
append>
>> +# This function performs a series of edits on the command line.
>> +# Store the final result in global $KDUMP_COMMANDLINE.
>> +prepare_cmdline()
>> +{
>> + local cmdline id
>> +
>> + if [ -z "$1" ]; then
>> + cmdline=$(cat /proc/cmdline)
>> + else
>> + cmdline="$1"
>> + fi
>> +
>> + # These params should always be removed
>> + cmdline=$(remove_cmdline_param "$cmdline" crashkernel
panic_on_warn)
>> + # These params can be removed configurably
>> + cmdline=$(remove_cmdline_param "$cmdline" "$2")
>> +
>> + # Always remove "root=X", as we now explicitly generate all
kinds
>> + # of dump target mount information including root fs.
>> + #
>> + # We do this before KDUMP_COMMANDLINE_APPEND, if one really cares
>> + # about it(e.g. for debug purpose), then can pass "root=X"
using
>> + # KDUMP_COMMANDLINE_APPEND.
>> + cmdline=$(remove_cmdline_param "$cmdline" root)
>> +
>> + # With the help of "--hostonly-cmdline", we can avoid some
interitage.
>> + cmdline=$(remove_cmdline_param "$cmdline" rd.lvm.lv
rd.luks.uuid rd.dm.uuid rd.md.uuid fcoe)
>> +
>> + cmdline="${cmdline} $3"
>> +
>> + id=$(get_bootcpu_apicid)
>> + if [ ! -z ${id} ] ; then
>> + cmdline=$(append_cmdline "${cmdline}"
disable_cpu_apicid ${id})
>> + fi
>> + echo ${cmdline}
>> +}
>> diff --git a/kdumpctl b/kdumpctl
>> index 4280e7e..afbe96e 100755
>> --- a/kdumpctl
>> +++ b/kdumpctl
>> @@ -62,93 +62,6 @@ determine_dump_mode()
>> fi
>> }
>>
>> -# remove_cmdline_param <kernel cmdline> <param1> [<param2>]
... [<paramN>]
>> -# Remove a list of kernel parameters from a given kernel cmdline and print the
result.
>> -# For each "arg" in the removing params list, "arg" and
"arg=xxx" will be removed if exists.
>> -remove_cmdline_param()
>> -{
>> - local cmdline=$1
>> - shift
>> -
>> - for arg in $@; do
>> - cmdline=`echo $cmdline | \
>> - sed -e "s/\b$arg=[^ ]*//g" \
>> - -e "s/^$arg\b//g" \
>> - -e "s/[[:space:]]$arg\b//g" \
>> - -e "s/\s\+/ /g"`
>> - done
>> - echo $cmdline
>> -}
>> -
>> -#
>> -# This function returns the "apicid" of the boot
>> -# cpu (cpu 0) if present.
>> -#
>> -get_bootcpu_apicid()
>> -{
>> - awk ' \
>> - BEGIN { CPU = "-1"; } \
>> - $1=="processor" && $2==":" { CPU = $NF; } \
>> - CPU=="0" && /^apicid/ { print $NF; } \
>> - ' \
>> - /proc/cpuinfo
>> -}
>> -
>> -#
>> -# This function appends argument "$2=$3" to string ($1) if not already
present.
>> -#
>> -append_cmdline()
>> -{
>> - local cmdline=$1
>> - local newstr=${cmdline/$2/""}
>> -
>> - # unchanged str implies argument wasn't there
>> - if [ "$cmdline" == "$newstr" ]; then
>> - cmdline="${cmdline} ${2}=${3}"
>> - fi
>> -
>> - echo $cmdline
>> -}
>> -
>> -# This function performs a series of edits on the command line.
>> -# Store the final result in global $KDUMP_COMMANDLINE.
>> -prepare_cmdline()
>> -{
>> - local cmdline id
>> -
>> - if [ -z "$KDUMP_COMMANDLINE" ]; then
>> - cmdline=$(cat /proc/cmdline)
>> - else
>> - cmdline=${KDUMP_COMMANDLINE}
>> - fi
>> -
>> - # These params should always be removed
>> - cmdline=$(remove_cmdline_param "$cmdline" crashkernel panic_on_warn)
>> - # These params can be removed configurably
>> - cmdline=$(remove_cmdline_param "$cmdline"
${KDUMP_COMMANDLINE_REMOVE})
>> -
>> - # Always remove "root=X", as we now explicitly generate all kinds
>> - # of dump target mount information including root fs.
>> - #
>> - # We do this before KDUMP_COMMANDLINE_APPEND, if one really cares
>> - # about it(e.g. for debug purpose), then can pass "root=X" using
>> - # KDUMP_COMMANDLINE_APPEND.
>> - cmdline=$(remove_cmdline_param "$cmdline" root)
>> -
>> - # With the help of "--hostonly-cmdline", we can avoid some
interitage.
>> - cmdline=$(remove_cmdline_param "$cmdline" rd.lvm.lv rd.luks.uuid
rd.dm.uuid rd.md.uuid fcoe)
>> -
>> - cmdline="${cmdline} ${KDUMP_COMMANDLINE_APPEND}"
>> -
>> - id=$(get_bootcpu_apicid)
>> - if [ ! -z ${id} ] ; then
>> - cmdline=$(append_cmdline "${cmdline}" disable_cpu_apicid ${id})
>> - fi
>> -
>> - KDUMP_COMMANDLINE=$cmdline
>> -}
>> -
>> -
>> save_core()
>> {
>> coredir="/var/crash/`date +"%Y-%m-%d-%H:%M"`"
>> @@ -361,21 +274,6 @@ get_pcs_cluster_modified_files()
>> echo $modified_files
>> }
>>
>> -check_boot_dir()
>> -{
>> - #If user specify a boot dir for kdump kernel, let's use it. Otherwise
>> - #check whether it's a atomic host. If yes parse the subdirectory under
>> - #/boot; If not just find it under /boot.
>> - [ -n "$KDUMP_BOOTDIR" ] && return
>> -
>> - if ! is_atomic || [ "$(uname -m)" = "s390x" ]; then
>> - KDUMP_BOOTDIR="/boot"
>> - else
>> - eval $(cat /proc/cmdline| grep "BOOT_IMAGE" | cut -d' '
-f1)
>> - KDUMP_BOOTDIR="/boot"$(dirname $BOOT_IMAGE)
>> - fi
>> -}
>> -
>> setup_initrd()
>> {
>> DEFAULT_INITRD="${KDUMP_BOOTDIR}/initramfs-`uname -r`.img"
>> @@ -596,7 +494,7 @@ check_rebuild()
>> local _force_no_rebuild force_no_rebuild="0"
>> local ret system_modified="0"
>>
>> - check_boot_dir
>> + KDUMP_BOOTDIR=$(check_boot_dir "${KDUMP_BOOTDIR}")
>>
>> if [ -z "$KDUMP_KERNELVER" ]; then
>> kdump_kver=`uname -r`
>> @@ -686,44 +584,13 @@ check_rebuild()
>> return $?
>> }
>>
>> -# This function check iomem and determines if we have more than
>> -# 4GB of ram available. Returns 1 if we do, 0 if we dont
>> -need_64bit_headers()
>> -{
>> - return `tail -n 1 /proc/iomem | awk '{ split ($1, r, "-"); \
>> - print (strtonum("0x" r[2]) > strtonum("0xffffffff"));
}'`
>> -}
>> -
>> # Load the kdump kernel specified in /etc/sysconfig/kdump
>> # If none is specified, try to load a kdump kernel with the same version
>> # as the currently running kernel.
>> load_kdump()
>> {
>> - ARCH=`uname -m`
>> - if [ "$ARCH" == "i686" -o "$ARCH" ==
"i386" ]
>> - then
>> -
>> - need_64bit_headers
>> - if [ $? == 1 ]
>> - then
>> - FOUND_ELF_ARGS=`echo $KEXEC_ARGS | grep elf32-core-headers`
>> - if [ -n "$FOUND_ELF_ARGS" ]
>> - then
>> - echo -n "Warning: elf32-core-headers overrides correct elf64
setting"
>> - echo
>> - else
>> - KEXEC_ARGS="$KEXEC_ARGS --elf64-core-headers"
>> - fi
>> - else
>> - FOUND_ELF_ARGS=`echo $KEXEC_ARGS | grep elf64-core-headers`
>> - if [ -z "$FOUND_ELF_ARGS" ]
>> - then
>> - KEXEC_ARGS="$KEXEC_ARGS --elf32-core-headers"
>> - fi
>> - fi
>> - fi
>> -
>> - prepare_cmdline
>> + KEXEC_ARGS=$(prepare_kexec_args "${KEXEC_ARGS}")
>> + KDUMP_COMMANDLINE=$(prepare_cmdline "${KDUMP_COMMANDLINE}"
"${KDUMP_COMMANDLINE_REMOVE}" "${KDUMP_COMMANDLINE_APPEND}")
>>
>> # For secureboot enabled machines, use new kexec file based syscall.
>> # Old syscall will always fail as it does not have capability to
>> @@ -850,21 +717,6 @@ check_current_fadump_status()
>> return 1
>> }
>>
>> -check_current_kdump_status()
>> -{
>> - if [ ! -f /sys/kernel/kexec_crash_loaded ];then
>> - echo "Perhaps CONFIG_CRASH_DUMP is not enabled in kernel"
>> - return 1
>> - fi
>> -
>> - rc=`cat /sys/kernel/kexec_crash_loaded`
>> - if [ $rc == 1 ]; then
>> - return 0
>> - else
>> - return 1
>> - fi
>> -}
>> -
>> check_current_status()
>> {
>> if [ $DEFAULT_DUMP_MODE == "fadump" ]; then
>> @@ -974,58 +826,6 @@ selinux_relabel()
>> done
>> }
>>
>> -# Check if secure boot is being enforced.
>> -#
>> -# Per Peter Jones, we need check efivar SecureBoot-$(the UUID) and
>> -# SetupMode-$(the UUID), they are both 5 bytes binary data. The first four
>> -# bytes are the attributes associated with the variable and can safely be
>> -# ignored, the last bytes are one-byte true-or-false variables. If SecureBoot
>> -# is 1 and SetupMode is 0, then secure boot is being enforced.
>> -#
>> -# Assume efivars is mounted at /sys/firmware/efi/efivars.
>> -is_secure_boot_enforced()
>> -{
>> - local secure_boot_file setup_mode_file
>> - local secure_boot_byte setup_mode_byte
>> -
>> - secure_boot_file=$(find /sys/firmware/efi/efivars -name SecureBoot-*
2>/dev/null)
>> - setup_mode_file=$(find /sys/firmware/efi/efivars -name SetupMode-*
2>/dev/null)
>> -
>> - if [ -f "$secure_boot_file" ] && [ -f
"$setup_mode_file" ]; then
>> - secure_boot_byte=$(hexdump -v -e '/1 "%d\ "'
$secure_boot_file|cut -d' ' -f 5)
>> - setup_mode_byte=$(hexdump -v -e '/1 "%d\ "'
$setup_mode_file|cut -d' ' -f 5)
>> -
>> - if [ "$secure_boot_byte" = "1" ] && [
"$setup_mode_byte" = "0" ]; then
>> - return 0
>> - fi
>> - fi
>> -
>> - return 1
>> -}
>> -
>> -check_crash_mem_reserved()
>> -{
>> - local mem_reserved
>> -
>> - mem_reserved=$(cat /sys/kernel/kexec_crash_size)
>> - if [ $mem_reserved -eq 0 ]; then
>> - echo "No memory reserved for crash kernel"
>> - return 1
>> - fi
>> -
>> - return 0
>> -}
>> -
>> -check_kdump_feasibility()
>> -{
>> - if [ ! -e /sys/kernel/kexec_crash_loaded ]; then
>> - echo "Kdump is not supported on this kernel"
>> - return 1
>> - fi
>> - check_crash_mem_reserved
>> - return $?
>> -}
>> -
>> check_fence_kdump_config()
>> {
>> local hostname=`hostname`
>>