在 2018年05月21日 23:40, Kazuhito Hagio 写道:
Hi Lianbo,
Sorry for the long delay.
Thank you, Kazu.
It's ok, never mind.
Lianbo
On 5/6/2018 9:28 PM, Lianbo Jiang wrote:
> Kdump service starts too late, so early crashes will have no chance
> to get kdump kernel booting, this will cause crash information to be
> lost. It is necessary to add a dracut module in order to load crash
> kernel and initramfs as early as possible. You can provide "rd.early
> kdump" in grub commandline to enable, then the early kdump will load
> those files like the normal kdump, which is disabled by default.
>
> For the normal kdump service, it can check whether the early kdump
> has loaded the crash kernel and initramfs. It has no conflict with
> the early kdump.
>
> If you rebuild the new initramfs for early kdump, the new initramfs
> size will become large, because it will put the vmlinuz and kdump
> initramfs into the new initramfs.
>
> In addition, early kdump doesn't support fadump.
>
> Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com>
> ---
> Some changes based the patch v3&v4&v5:
> 1.dracut-early-kdump-module-setup.sh
> -Introduce some variables to parse parameters for kernel commandline
> and initrd.
> -It will use "dracut --add earlykdump --force" to rebuild the new
> initramfs for the early kdump.
> -install some commands, such as find, cut, dirname, hexdump, tail. (*)
> -modify code style. (*)
> 2.early-kdump-howto.txt
> -update the usage about the early kdump.
> 3.dracut-early-kdump.sh
> -modify prepare_parameters() function and handle the case with
> a "KDUMP_KERNELVER" setting.
>
> dracut-early-kdump-module-setup.sh | 44 ++++++++++++++++++++
> dracut-early-kdump.sh | 84 ++++++++++++++++++++++++++++++++++++++
> early-kdump-howto.txt | 50 +++++++++++++++++++++++
> kexec-tools.spec | 11 +++++
> 4 files changed, 189 insertions(+)
> create mode 100755 dracut-early-kdump-module-setup.sh
> create mode 100755 dracut-early-kdump.sh
> create mode 100644 early-kdump-howto.txt
>
> diff --git a/dracut-early-kdump-module-setup.sh b/dracut-early-kdump-module-setup.sh
> new file mode 100755
> index 0000000..ee8038f
> --- /dev/null
> +++ b/dracut-early-kdump-module-setup.sh
> @@ -0,0 +1,44 @@
> +#!/bin/bash
> +
> +. /etc/sysconfig/kdump
> +. /lib/kdump/kdump-lib.sh
> +
> +KDUMP_KERNEL=""
> +KDUMP_INITRD=""
> +
> +check() {
> + if [ ! -f /etc/sysconfig/kdump ] || [ ! -f /lib/kdump/kdump-lib.sh ]\
> + || [ -n "${IN_KDUMP}" ]
> + then
> + return 1
> + fi
> + return 255
> +}
> +
> +depends() {
> + echo "base shutdown"
I overlooked this, but is the 'shutdown' module needed?
May be it really needs, because the 'shutdown' module will install
some basic commands, such as 'reboot'...
Thanks.
Lianbo
> + return 0
> +}
> +
> +prepare_kernel_initrd() {
> + KDUMP_BOOTDIR=$(check_boot_dir "${KDUMP_BOOTDIR}")
> + if [ -z "$KDUMP_KERNELVER" ]; then
> + kdump_kver=`uname -r`
> + else
> + kdump_kver=$KDUMP_KERNELVER
> + fi
> +
KDUMP_KERNEL="${KDUMP_BOOTDIR}/${KDUMP_IMG}-${kdump_kver}${KDUMP_IMG_EXT}"
> + KDUMP_INITRD="${KDUMP_BOOTDIR}/initramfs-${kdump_kver}kdump.img"
> +}
> +
> +install() {
> + inst_multiple tail find cut dirname hexdump split
I can't find the 'split' command in the source code.
Is it needed? (I can see a split() function of awk instead.)
Thank you, Kazu.
The 'split' command does't need, it will be deleted.
Lianbo
> Thanks,
> Kazu
>
>> + inst_simple "/etc/sysconfig/kdump"
>> + inst_binary "/usr/sbin/kexec"
>> + inst_binary "/usr/bin/gawk" "/usr/bin/awk"
>> + inst_script "/lib/kdump/kdump-lib.sh"
"/lib/kdump-lib.sh"
>> + inst_hook cmdline 00 "$moddir/early-kdump.sh"
>> + prepare_kernel_initrd
>> + inst_binary "$KDUMP_KERNEL"
>> + inst_binary "$KDUMP_INITRD"> +}
>> diff --git a/dracut-early-kdump.sh b/dracut-early-kdump.sh
>> new file mode 100755
>> index 0000000..34a9909
>> --- /dev/null
>> +++ b/dracut-early-kdump.sh
>> @@ -0,0 +1,84 @@
>> +#! /bin/sh
>> +
>> +KEXEC=/sbin/kexec
>> +standard_kexec_args="-p"
>> +
>> +EARLY_KDUMP_INITRD=""
>> +EARLY_KDUMP_KERNEL=""
>> +EARLY_KDUMP_CMDLINE=""
>> +EARLY_KDUMP_KERNELVER=""
>> +EARLY_KEXEC_ARGS=""
>> +
>> +. /etc/sysconfig/kdump
>> +. /lib/dracut-lib.sh
>> +. /lib/kdump-lib.sh
>> +
>> +prepare_parameters()
>> +{
>> + EARLY_KDUMP_CMDLINE=$(prepare_cmdline "${KDUMP_COMMANDLINE}"
"${KDUMP_COMMANDLINE_REMOVE}" "${KDUMP_COMMANDLINE_APPEND}")
>> + KDUMP_BOOTDIR=$(check_boot_dir "${KDUMP_BOOTDIR}")
>> +
>> + #make early-kdump kernel string
>> + if [ -z "$KDUMP_KERNELVER" ]; then
>> + EARLY_KDUMP_KERNELVER=`uname -r`
>> + else
>> + EARLY_KDUMP_KERNELVER=$KDUMP_KERNELVER
>> + fi
>> +
>> +
EARLY_KDUMP_KERNEL="${KDUMP_BOOTDIR}/${KDUMP_IMG}-${EARLY_KDUMP_KERNELVER}${KDUMP_IMG_EXT}"
>> +
>> + #make early-kdump initrd string
>> +
EARLY_KDUMP_INITRD="${KDUMP_BOOTDIR}/initramfs-${EARLY_KDUMP_KERNELVER}kdump.img"
>> +}
>> +
>> +early_kdump_load()
>> +{
>> + check_kdump_feasibility
>> + if [ $? -ne 0 ]; then
>> + return 1
>> + fi
>> +
>> + if is_fadump_capable; then
>> + echo "WARNING: early kdump doesn't support fadump."
>> + return 1
>> + fi
>> +
>> + check_current_kdump_status
>> + if [ $? == 0 ]; then
>> + return 1
>> + fi
>> +
>> + prepare_parameters
>> +
>> + EARLY_KEXEC_ARGS=$(prepare_kexec_args "${KEXEC_ARGS}")
>> +
>> + if is_secure_boot_enforced; then
>> + echo "Secure Boot is enabled. Using kexec file based
syscall."
>> + EARLY_KEXEC_ARGS="$EARLY_KEXEC_ARGS -s"
>> + fi
>> +
>> + $KEXEC ${EARLY_KEXEC_ARGS} $standard_kexec_args \
>> + --command-line="$EARLY_KDUMP_CMDLINE" \
>> + --initrd=$EARLY_KDUMP_INITRD $EARLY_KDUMP_KERNEL
>> + if [ $? == 0 ]; then
>> + echo "kexec: loaded early-kdump kernel"
>> + return 0
>> + else
>> + echo "kexec: failed to load early-kdump kernel"
>> + return 1
>> + fi
>> +}
>> +
>> +set_early_kdump()
>> +{
>> + if getargbool 0 rd.earlykdump; then
>> + echo "early-kdump is enabled."
>> + early_kdump_load
>> + else
>> + echo "early-kdump is disabled."
>> + fi
>> +
>> + return 0
>> +}
>> +
>> +set_early_kdump
>> diff --git a/early-kdump-howto.txt b/early-kdump-howto.txt
>> new file mode 100644
>> index 0000000..07da8eb
>> --- /dev/null
>> +++ b/early-kdump-howto.txt
>> @@ -0,0 +1,50 @@
>> +Early Kdump HOWTO
>> +
>> +Introduction
>> +
>> +Kdump service starts too late, so early crashes will have no chance to get
>> +kdump kernel booting, this will cause crash information to be lost. It is
>> +necessary to add a dracut module in order to load crash kernel and initramfs
>> +as early as possible. You can provide "rd.earlykdump" in grub
commandline
>> +to enable, then the early kdump will load those files like the normal kdump,
>> +which is disabled by default.
>> +
>> +For the normal kdump service, it can check whether the early kdump has loaded
>> +the crash kernel and initramfs. It has no conflict with the early kdump.
>> +
>> +How to configure early kdump:
>> +
>> +We assume if you're reading this document, you should already have
kexec-tools
>> +installed.
>> +
>> +For early kdump, if you need to rebuild the initramfs, please manually execute
>> +dracut command:
>> + # dracut --add earlykdump --force
>> +
>> +By the way, if you rebuild the new initramfs for early kdump, the new initramfs
>> +size will become large, because it will put the vmlinuz and kdump initramfs
into
>> +the new initramfs.
>> +
>> +Next up, we need to add "rd.earlykdump" to enable early kdump in grub.
After
>> +making said changes, reboot your system to take effect. Of course, if you want
>> +to disable early kdump, you can simply remove "rd.earlykdump" from
kernel boot
>> +parameters in grub, and reboot system like above.
>> +
>> +Once the boot is completed, you can check the status of the early kdump support
>> +on the command prompt:
>> +
>> + # journalctl -x|grep early-kdump
>> +
>> +Then, you will see some useful logs, for exapmle:
>> +
>> +1. if early kdump is successful.
>> +Mar 09 09:57:56 localhost.localdomain dracut-cmdline[190]: early-kdump is
enabled.
>> +Mar 09 09:57:56 localhost.localdomain dracut-cmdline[190]: kexec: loaded early-
>> +kdump kernel
>> +
>> +2. if early kdump is disabled.
>> +Mar 09 10:02:47 localhost.localdomain dracut-cmdline[189]: early-kdump is
disabled.
>> +
>> +Limitation
>> +
>> +At present, early kdump doesn't support fadump.
>> diff --git a/kexec-tools.spec b/kexec-tools.spec
>> index f04527c..303b971 100644
>> --- a/kexec-tools.spec
>> +++ b/kexec-tools.spec
>> @@ -29,6 +29,7 @@ Source24: kdump-lib-initramfs.sh
>> Source25: kdump.sysconfig.ppc64le
>> Source26: kdumpctl.8
>> Source27: live-image-kdump-howto.txt
>> +Source28: early-kdump-howto.txt
>>
>> #######################################
>> # These are sources for mkdumpramfs
>> @@ -42,6 +43,8 @@ Source104: dracut-kdump-emergency.service
>> Source105: dracut-kdump-error-handler.service
>> Source106: dracut-kdump-capture.service
>> Source107: dracut-kdump-emergency.target
>> +Source108: dracut-early-kdump.sh
>> +Source109: dracut-early-kdump-module-setup.sh
>>
>> Requires(post): systemd-units
>> Requires(preun): systemd-units
>> @@ -136,6 +139,7 @@ rm -f kexec-tools.spec.in
>> cp %{SOURCE10} .
>> cp %{SOURCE21} .
>> cp %{SOURCE27} .
>> +cp %{SOURCE28} .
>>
>> make
>> %ifarch %{ix86} x86_64 ppc64 s390x ppc64le aarch64
>> @@ -194,6 +198,7 @@ make -C kdump-anaconda-addon install DESTDIR=$RPM_BUILD_ROOT
>> %find_lang kdump-anaconda-addon
>>
>> %define remove_dracut_prefix() %(echo -n %1|sed 's/.*dracut-//g')
>> +%define remove_dracut_early_kdump_prefix() %(echo -n %1|sed
's/.*dracut-early-kdump-//g')
>>
>> # deal with dracut modules
>> mkdir -p -m755
$RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99kdumpbase
>> @@ -207,6 +212,11 @@ cp %{SOURCE106}
$RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99kdumpb
>> cp %{SOURCE107}
$RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99kdumpbase/%{remove_dracut_prefix
%{SOURCE107}}
>> chmod 755
$RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99kdumpbase/%{remove_dracut_prefix
%{SOURCE100}}
>> chmod 755
$RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99kdumpbase/%{remove_dracut_prefix
%{SOURCE101}}
>> +mkdir -p -m755
$RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99earlykdump
>> +cp %{SOURCE108}
$RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99earlykdump/%{remove_dracut_prefix
%{SOURCE108}}
>> +cp %{SOURCE109}
$RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99earlykdump/%{remove_dracut_early_kdump_prefix
%{SOURCE109}}
>> +chmod 755
$RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99earlykdump/%{remove_dracut_prefix
%{SOURCE108}}
>> +chmod 755
$RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99earlykdump/%{remove_dracut_early_kdump_prefix
%{SOURCE109}}
>>
>>
>> %define dracutlibdir %{_prefix}/lib/dracut
>> @@ -305,6 +315,7 @@ done
>> %license COPYING
>> %doc TODO
>> %doc kexec-kdump-howto.txt
>> +%doc early-kdump-howto.txt
>> %doc kdump-in-cluster-environment.txt
>> %doc live-image-kdump-howto.txt
>> %ifarch %{ix86} x86_64 ppc64 s390x ppc64le aarch64
>>
>
>
> _______________________________________________
> kexec mailing list -- kexec(a)lists.fedoraproject.org
> To unsubscribe send an email to kexec-leave(a)lists.fedoraproject.org
> Fedora Code of Conduct:
https://getfedora.org/code-of-conduct.html
> List Guidelines:
https://fedoraproject.org/wiki/Mailing_list_guidelines
> List Archives:
https://lists.fedoraproject.org/archives/list/kexec@lists.fedoraproject.o...
>