From: Dave Young <dyoung(a)redhat.com>
We maintained several kdump specific functions which are duplicate with the
similar versions in dracut, Dracut upstream splitted dracut init stuff from
dracut-functions.sh so that we can source it now.
Notes about kdump_get_presistent_dev:
Dracut now has a persistent_policy feature, for kdump when we dump to
raw disks we do not care the filesystem uuid and labels so we prefer to
search disk id instead. For raw disk set the persistent_policy before calling
get_persistent_dev ensure kdump logic still work.
Tested filesystem and raw dump in kvm guests.
[Xunlei: drop other functions other than get_persistent_dev.]
Signed-off-by: Dave Young <dyoung(a)redhat.com>
---
kdump-lib.sh | 26 ---------------------
kdumpctl | 8 +++++-
mkdumprd | 70 +++++------------------------------------------------------
3 files changed, 13 insertions(+), 91 deletions(-)
--- kexec-tools.orig/kdump-lib.sh
+++ kexec-tools/kdump-lib.sh
@@ -88,32 +88,6 @@ to_dev_name() {
echo $dev
}
-kdump_get_persistent_dev() {
- local i _tmp _dev _lookup_dirs
-
- _dev=$(udevadm info --query=name --name="$1" 2>/dev/null)
- [ -z "$_dev" ] && {
- perror_exit "Kernel dev name of $1 is not found."
- }
-
- if [[ $2 = "raw" ]];then
- _lookup_dirs="/dev/mapper/* /dev/disk/by-id/*"
- else
- _lookup_dirs="/dev/mapper/* /dev/disk/by-uuid/* /dev/disk/by-id/*"
- fi
-
- for i in $_lookup_dirs; do
- _tmp=$(udevadm info --query=name --name="$i" 2>/dev/null)
- if [ "$_tmp" = "$_dev" ]; then
- echo $i
- return
- fi
- done
-
- perror "WARNING: Persistent device name of $1 not found. Using $1 as dump target name"
- echo $1
-}
-
get_user_configured_dump_disk()
{
local _target
--- kexec-tools.orig/kdumpctl
+++ kexec-tools/kdumpctl
@@ -19,6 +19,8 @@ FADUMP_REGISTER_SYS_NODE="/sys/kernel/fa
DEFAULT_DUMP_MODE="kdump"
image_time=0
+[[ $dracutbasedir ]] || dracutbasedir=/usr/lib/dracut
+. $dracutbasedir/dracut-functions.sh
. /lib/kdump/kdump-lib.sh
standard_kexec_args="-p"
@@ -432,7 +434,11 @@ check_dump_fs_modified()
if [[ $(expr substr $_new_fstype 1 3) = "nfs" ]];then
_new_dev=$_target
else
- _new_dev=$(kdump_get_persistent_dev $_target $_new_fstype)
+ _new_dev=$(get_persistent_dev $_target)
+ if [ -z "$_new_dev" ]; then
+ echo "Get persistent device name failed"
+ return 2
+ fi
fi
if ! findmnt $_target >/dev/null; then
--- kexec-tools.orig/mkdumprd
+++ kexec-tools/mkdumprd
@@ -6,6 +6,8 @@
# Written by Cong Wang <amwang(a)redhat.com>
#
+[[ $dracutbasedir ]] || dracutbasedir=/usr/lib/dracut
+. $dracutbasedir/dracut-functions.sh
. /lib/kdump/kdump-lib.sh
export IN_KDUMP=1
@@ -78,9 +80,6 @@ add_dracut_sshkey() {
add_dracut_arg "--sshkey" "$1"
}
-# Generic substring function. If $2 is in $1, return 0.
-strstr() { [[ $1 =~ $2 ]]; }
-
target_is_root() {
local _t
_t=$(findmnt -k -n -r -o TARGET $1|sort|head -1)
@@ -127,8 +126,8 @@ to_mount() {
_mntopts="$_target $_fstype $_options"
#for non-nfs _dev converting to use udev persistent name
if [ -b "$_source" ]; then
- _pdev="$(kdump_get_persistent_dev $_source $_fstype)"
- if [ $? -ne 0 ]; then
+ _pdev="$(get_persistent_dev $_source)"
+ if [ -z "$_pdev" ]; then
return 1
fi
@@ -257,63 +256,6 @@ add_mount() {
fi
}
-# get_maj_min <device>
-# Prints the major and minor of a device node.
-# Example:
-# $ get_maj_min /dev/sda2
-# 8:2
-get_maj_min() {
- local _dev
- _dev=$(stat -L -c '$((0x%t)):$((0x%T))' "$1" 2>/dev/null)
- _dev=$(eval "echo $_dev")
- echo $_dev
-}
-
-# ugly workaround for the lvm design
-# There is no volume group device,
-# so, there are no slave devices for volume groups.
-# Logical volumes only have the slave devices they really live on,
-# but you cannot create the logical volume without the volume group.
-# And the volume group might be bigger than the devices the LV needs.
-check_vol_slaves() {
- local _lv _vg _pv
- for i in /dev/mapper/*; do
- _lv=$(get_maj_min $i)
- if [[ $_lv = $2 ]]; then
- _vg=$(lvm lvs --noheadings -o vg_name $i 2>/dev/null)
- # strip space
- _vg=$(echo $_vg)
- if [[ $_vg ]]; then
- for _pv in $(lvm vgs --noheadings -o pv_name "$_vg" 2>/dev/null)
- do
- check_block_and_slaves $1 $(get_maj_min $_pv) && return 0
- done
- fi
- fi
- done
- return 1
-}
-
-# Walk all the slave relationships for a given block device.
-# Stop when our helper function returns success
-# $1 = function to call on every found block device
-# $2 = block device in major:minor format
-check_block_and_slaves() {
- local _x
- [[ -b /dev/block/$2 ]] || return 1 # Not a block device? So sorry.
- "$1" $2 && return
- check_vol_slaves "$@" && return 0
- if [[ -f /sys/dev/block/$2/../dev ]]; then
- check_block_and_slaves $1 $(cat "/sys/dev/block/$2/../dev") && return 0
- fi
- [[ -d /sys/dev/block/$2/slaves ]] || return 1
- for _x in /sys/dev/block/$2/slaves/*/dev; do
- [[ -f $_x ]] || continue
- check_block_and_slaves $1 $(cat "$_x") && return 0
- done
- return 1
-}
-
get_block_dump_target()
{
local _target
@@ -532,8 +474,8 @@ do
dd if=$config_val count=1 of=/dev/null > /dev/null 2>&1 || {
perror_exit "Bad raw disk $config_val"
}
- _praw=$(kdump_get_persistent_dev $config_val "raw")
- if [ $? -ne 0 ]; then
+ _praw=$(persistent_policy="by-id" get_persistent_dev $config_val)
+ if [ -z "$_praw" ]; then
exit 1
fi
add_dracut_arg "--device" "$_praw"