drop dracut duplicate functions

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@redhat.com>
Reviewed-by: Xunlei Pang <xlpang@redhat.com>
This commit is contained in:
Dave Young 2016-11-17 12:51:12 +08:00
parent 391969ced7
commit 631d979eb3
3 changed files with 13 additions and 91 deletions

View File

@ -88,32 +88,6 @@ to_dev_name() {
echo $dev 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() get_user_configured_dump_disk()
{ {
local _target local _target

View File

@ -19,6 +19,8 @@ FADUMP_REGISTER_SYS_NODE="/sys/kernel/fadump_registered"
DEFAULT_DUMP_MODE="kdump" DEFAULT_DUMP_MODE="kdump"
image_time=0 image_time=0
[[ $dracutbasedir ]] || dracutbasedir=/usr/lib/dracut
. $dracutbasedir/dracut-functions.sh
. /lib/kdump/kdump-lib.sh . /lib/kdump/kdump-lib.sh
standard_kexec_args="-p" standard_kexec_args="-p"
@ -432,7 +434,11 @@ check_dump_fs_modified()
if [[ $(expr substr $_new_fstype 1 3) = "nfs" ]];then if [[ $(expr substr $_new_fstype 1 3) = "nfs" ]];then
_new_dev=$_target _new_dev=$_target
else 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 fi
if ! findmnt $_target >/dev/null; then if ! findmnt $_target >/dev/null; then

View File

@ -6,6 +6,8 @@
# Written by Cong Wang <amwang@redhat.com> # Written by Cong Wang <amwang@redhat.com>
# #
[[ $dracutbasedir ]] || dracutbasedir=/usr/lib/dracut
. $dracutbasedir/dracut-functions.sh
. /lib/kdump/kdump-lib.sh . /lib/kdump/kdump-lib.sh
export IN_KDUMP=1 export IN_KDUMP=1
@ -78,9 +80,6 @@ add_dracut_sshkey() {
add_dracut_arg "--sshkey" "$1" add_dracut_arg "--sshkey" "$1"
} }
# Generic substring function. If $2 is in $1, return 0.
strstr() { [[ $1 =~ $2 ]]; }
target_is_root() { target_is_root() {
local _t local _t
_t=$(findmnt -k -n -r -o TARGET $1|sort|head -1) _t=$(findmnt -k -n -r -o TARGET $1|sort|head -1)
@ -127,8 +126,8 @@ to_mount() {
_mntopts="$_target $_fstype $_options" _mntopts="$_target $_fstype $_options"
#for non-nfs _dev converting to use udev persistent name #for non-nfs _dev converting to use udev persistent name
if [ -b "$_source" ]; then if [ -b "$_source" ]; then
_pdev="$(kdump_get_persistent_dev $_source $_fstype)" _pdev="$(get_persistent_dev $_source)"
if [ $? -ne 0 ]; then if [ -z "$_pdev" ]; then
return 1 return 1
fi fi
@ -257,63 +256,6 @@ add_mount() {
fi 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() get_block_dump_target()
{ {
local _target local _target
@ -532,8 +474,8 @@ do
dd if=$config_val count=1 of=/dev/null > /dev/null 2>&1 || { dd if=$config_val count=1 of=/dev/null > /dev/null 2>&1 || {
perror_exit "Bad raw disk $config_val" perror_exit "Bad raw disk $config_val"
} }
_praw=$(kdump_get_persistent_dev $config_val "raw") _praw=$(persistent_policy="by-id" get_persistent_dev $config_val)
if [ $? -ne 0 ]; then if [ -z "$_praw" ]; then
exit 1 exit 1
fi fi
add_dracut_arg "--device" "$_praw" add_dracut_arg "--device" "$_praw"