From 63476302aa09b7844ac0fff5aa3878bcc9a5bc0d Mon Sep 17 00:00:00 2001 From: Minfei Huang Date: Fri, 5 Dec 2014 16:24:30 +0800 Subject: [PATCH] dracut-kdump: Use proper the known hosts entry in the file known_hosts Once login using ssh, the ssh will store the known hosts entry to the local ~/.ssh/known_hosts. From now, we can login using ssh automaticly. The ssh will check the ~/ssh/.known_hosts entry, if set the option StrictHostKeyChecking=yes/ask in the config or command line, when you want to login the target. the default value of StrictHostKeyChecking is ask. And the kdump using the ssh will append the option StrictHostKeyChecking=yes in the command line. We can using following ip to connect peer machine, if enable the ipv6. fe80::5054:ff:fe48:ca80%eth0 Obviously, above ip contains the ethX. Kdump will add the prefix "kdump-" before ethX to avoid flowing netdevice name in case netdevice names ethX in the 2nd kernel. So the ip address will change to fe80::5054:ff:fe48:ca80%kdump-eth0. Kdump will login the target manully in the 2nd kernel, because of the option StrictHostKeyChecking=yes and inexistence known hosts entry in the local ~/.ssh/known_hosts. Hence dumping core will fail. In order to login automaticly using ssh, we should add the prefix "kdump-" before ethX in the local ~/.ssh/known_hosts. Signed-off-by: Minfei Huang --- dracut-kdump.sh | 23 +++++++++++++++++++ dracut-module-setup.sh | 16 -------------- kdump-lib.sh | 50 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 73 insertions(+), 16 deletions(-) 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 ":" +}