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 <mhuang@redhat.com>
This commit is contained in:
Minfei Huang 2014-12-05 16:24:30 +08:00 committed by WANG Chao
parent 08809fb0c7
commit 63476302aa
3 changed files with 73 additions and 16 deletions

View File

@ -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

View File

@ -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

View File

@ -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 ":"
}