On 12/11/14 at 01:26pm, Baoquan He wrote:
On 12/05/14 at 04:24pm, Minfei Huang wrote:
> 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(a)redhat.com>
> ---
> 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 4fef0c5..cbfe7c6 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
> @@ -182,6 +203,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 f47f428..79a6c83 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"
> -}
> -
Moving kdump_setup_ifname could be put in a independent patch to make it
clearer. But I have no strong opinion on this, it's up to you. Anyway
it's a good style and easier for reviewer.
Good idea. I will split the patch to make it clear for reviewing.
> 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
Is this func only used for ipv6? Can it be indicated in func name, Like
get_ipv6_remote_host?
And it would be better to add explanation above func definition to
make it more readable.
Okay. Maybe it is easier to know what the function does.
> +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 ":"
> +}
> --
> 1.8.3.1
>
> _______________________________________________
> kexec mailing list
> kexec(a)lists.fedoraproject.org
>
https://lists.fedoraproject.org/mailman/listinfo/kexec