From b378c67f4650783f2523966f70470766701e0d1b Mon Sep 17 00:00:00 2001 From: zhangjian Date: Wed, 20 Aug 2025 06:44:51 +0000 Subject: [PATCH] support mkdumprd for btrfs --- kdump-lib.sh | 52 ++++++++++++++++++++++++++++++++++++------------ kexec-tools.spec | 5 ++++- mkdumprd | 12 +++++------ 3 files changed, 49 insertions(+), 20 deletions(-) diff --git a/kdump-lib.sh b/kdump-lib.sh index c9f14d1..92c3e9c 100755 --- a/kdump-lib.sh +++ b/kdump-lib.sh @@ -216,24 +216,50 @@ get_kdump_targets() # /dev/mapper/atomicos-root[/ostree/deploy/rhel-atomic-host/var], if the # directory is bind mounted. The former part represents the device path, rest # part is the bind mounted directory which quotes by bracket "[]". +get_mount_info() +{ +__kdump_mnt=$(findmnt -k -n -r -o "$1" "--$2" "$3" $4) + +[ -z "$__kdump_mnt" ] && [ -e "/etc/fstab" ] && __kdump_mnt=$(findmnt -s -n -r -o "$1" "--$2" "$3" $4) + +echo "$__kdump_mnt" +} + get_bind_mount_source() { - local _path=$1 - # In case it's a sub path in a mount point, get the mount point first - local _mnt_top=$(df $_path | tail -1 | awk '{print $NF}') - local _mntpoint=$(findmnt $_mnt_top | tail -n 1 | awk '{print $2}') - local _mntpoint_nofsroot=$(findmnt -v $_mnt_top | tail -n 1 | awk '{print $2}') + local _mnt _path _src _opt _fstype + local _fsroot _src_nofsroot - if [[ "$_mntpoint" = $_mntpoint_nofsroot ]]; then - echo $_path && return - fi + _mnt=$(df "$1" | tail -1 | awk '{print $NF}') + _path=${1#"$_mnt"} - _mntpoint=${_mntpoint#*$_mntpoint_nofsroot} - _mntpoint=${_mntpoint#[} - _mntpoint=${_mntpoint%]} - _path=${_path#$_mnt_top} + _src=$(get_mount_info SOURCE target "$_mnt" -f) + _opt=$(get_mount_info OPTIONS target "$_mnt" -f) + _fstype=$(get_mount_info FSTYPE target "$_mnt" -f) - echo $_mntpoint$_path + # bind mount in fstab + if [[ -d $_src ]] && [[ $_fstype == none ]] && (echo "$_opt" | grep -q "\bbind\b"); then + echo "$_src$_path" && return + fi + + # direct mount + _src_nofsroot=$(get_mount_info SOURCE target "$_mnt" -v -f) + if [[ $_src_nofsroot == "$_src" ]]; then + echo "$_mnt$_path" && return + fi + + _fsroot=${_src#"${_src_nofsroot}"[} + _fsroot=${_fsroot%]} + _mnt=$(get_mntpoint_from_target "$_src_nofsroot") + + # for btrfs, _fsroot will also contain the subvol value as well, strip it + if [[ $_fstype == btrfs ]]; then + local _subvol + _subvol=${_opt#*subvol=} + _subvol=${_subvol%,*} + _fsroot=${_fsroot#"$_subvol"} + fi + echo "$_mnt$_fsroot$_path" } # Return the real underlaying device of a path, ignore bind mounts diff --git a/kexec-tools.spec b/kexec-tools.spec index e2fc973..1ff586a 100644 --- a/kexec-tools.spec +++ b/kexec-tools.spec @@ -4,7 +4,7 @@ Name: kexec-tools Version: 2.0.26 -Release: 11 +Release: 12 License: GPLv2 Summary: The kexec/kdump userspace component URL: https://www.kernel.org/ @@ -298,6 +298,9 @@ done %endif %changelog +* Thu Aug 21 2025 zhangjian - 2.0.26-12 +- mkdumprd support btrfs + * Thu Jun 26 2025 chenhaixiang - 2.0.26-11 - kdump: use kexec_file_load() when secure boot is enabled diff --git a/mkdumprd b/mkdumprd index 35f5eed..15d5961 100644 --- a/mkdumprd +++ b/mkdumprd @@ -53,7 +53,7 @@ add_dracut_sshkey() { to_mount() { local _dev=$1 _source _target _fstype _options _mntopts _pdev - _source=$(findmnt -k -f -n -r -o SOURCE $_dev) + _source=$(findmnt -v -k -f -n -r -o SOURCE $_dev) _target=$(get_mntpoint_from_target $_dev) # mount under /sysroot if dump to root disk or mount under #/kdumproot/$_target in other cases in 2nd kernel. systemd @@ -65,10 +65,10 @@ to_mount() { _target="/kdumproot/$_target" fi - _fstype=$(findmnt -k -f -n -r -o FSTYPE $_dev) - [[ -e /etc/fstab ]] && _options=$(findmnt --fstab -f -n -r -o OPTIONS $_dev) + _fstype=$(findmnt -v -k -f -n -r -o FSTYPE $_dev) + [[ -e /etc/fstab ]] && _options=$(findmnt -v --fstab -f -n -r -o OPTIONS $_dev) if [ -z "$_options" ]; then - _options=$(findmnt -k -f -n -r -o OPTIONS $_dev) + _options=$(findmnt -v -k -f -n -r -o OPTIONS $_dev) if [[ $_fstype == "nfs"* ]]; then _options=$(echo $_options | sed 's/,addr=[^,]*//') _options=$(echo $_options | sed 's/,proto=[^,]*//') @@ -102,7 +102,7 @@ to_mount() { is_readonly_mount() { local _mnt - _mnt=$(findmnt -k -f -n -r -o OPTIONS $1) + _mnt=$(findmnt -v -k -f -n -r -o OPTIONS $1) #fs/proc_namespace.c: show_mountinfo(): #seq_puts(m, mnt->mnt_flags & MNT_READONLY ? " ro" : " rw"); @@ -374,7 +374,7 @@ do extra_modules="$extra_modules $config_val" ;; ext[234]|xfs|btrfs|minix|nfs) - if ! findmnt $config_val >/dev/null; then + if ! findmnt -v $config_val >/dev/null; then perror_exit "Dump target $config_val is probably not mounted." fi -- Gitee