diff --git a/dracut-kdump.sh b/dracut-kdump.sh index dc948d1..e062665 100755 --- a/dracut-kdump.sh +++ b/dracut-kdump.sh @@ -131,6 +131,27 @@ get_host_ip() return 0 } +# kdump will change the ethernet device name in the 2nd using prefix "kdump-", +# the link scope of ipv6 has the format like fe80::5054:ff:fe48:ca80%eth0, +# So we should correct the known hosts +correct_known_hosts() +{ + if is_ipv6_target && is_ssh_dump_target; then + local _ipv6 _netdev _pre_netdev + local _known_hosts="/root/.ssh/known_hosts" + local _srcaddr=$(get_option_value ssh) + + [ "x" = "x""$_srcaddr" ] && return 1 + + if `echo $_srcaddr | grep -q "%"`; then + _ipv6=`get_remote_host $_srcaddr` + _netdev=${_srcaddr#*-} + _pre_netdev=$(kdump_setup_ifname $_netdev) + sed -i "s#$_ipv6\%$_netdev#$_ipv6\%$_pre_netdev#" $_known_hosts + fi + fi +} + read_kdump_conf() { if [ ! -f "$KDUMP_CONF" ]; then @@ -175,6 +196,8 @@ if [ $? -ne 0 ]; then exit 1 fi +correct_known_hosts + if [ -z "$DUMP_INSTRUCTION" ]; then add_dump_code "dump_fs $NEWROOT" fi diff --git a/dracut-module-setup.sh b/dracut-module-setup.sh index f0d3311..4e004a9 100755 --- a/dracut-module-setup.sh +++ b/dracut-module-setup.sh @@ -97,22 +97,6 @@ kdump_get_perm_addr() { fi } -# Prefix kernel assigned names with "kdump-". EX: eth0 -> kdump-eth0 -# Because kernel assigned names are not persistent between 1st and 2nd -# kernel. We could probably end up with eth0 being eth1, eth0 being -# eth1, and naming conflict happens. -kdump_setup_ifname() { - local _ifname - - if [[ $1 =~ eth* ]]; then - _ifname="kdump-$1" - else - _ifname="$1" - fi - - echo "$_ifname" -} - kdump_setup_bridge() { local _netdev=$1 local _brif _dev _mac _kdumpdev diff --git a/kdump-lib.sh b/kdump-lib.sh index b9dec21..f24f08d 100755 --- a/kdump-lib.sh +++ b/kdump-lib.sh @@ -138,3 +138,53 @@ check_save_path_fs() fi } + +# Prefix kernel assigned names with "kdump-". EX: eth0 -> kdump-eth0 +# Because kernel assigned names are not persistent between 1st and 2nd +# kernel. We could probably end up with eth0 being eth1, eth0 being +# eth1, and naming conflict happens. +kdump_setup_ifname() { + local _ifname + + if [[ $1 =~ eth* ]]; then + _ifname="kdump-$1" + else + _ifname="$1" + fi + + echo "$_ifname" +} + +# get ip address or hostname from nfs/ssh config value +get_remote_host() +{ + local _config_val=$1 + + # in ipv6, the _config_val format is [xxxx:xxxx::xxxx%eth0]:/mnt/nfs or + # username at xxxx:xxxx::xxxx%eth0. what we need is just xxxx:xxxx::xxxx + _config_val=${_config_val#*@} + _config_val=${_config_val%:/*} + _config_val=${_config_val#[} + _config_val=${_config_val%]} + _config_val=${_config_val%\%*} + echo $_config_val +} + +# check the remote server ip address tpye +is_ipv6_target() +{ + local _server _server_tmp + + if is_ssh_dump_target; then + _server=`get_option_value ssh` + elif is_nfs_dump_target; then + _server=`get_option_value nfs` + fi + + [ -z "$_server" ] && return 1 + _server=`get_remote_host $_server` + _server_tmp=$_server + _server=`getent ahosts $_server | head -n 1 | cut -d' ' -f1` + _server=${_server:-$_server_tmp} + echo $_server | grep -q ":" +}