On 06/10/2014 01:20 AM, Arthur Zou wrote:
This patch is a contrast of patch v3 which pass a commandline to
second kenel
to tell the ip address type. In this approach, Install extra getent and head in
initramfs so that we can use it to tell the ip address type in the second kernel.
Comparing with patch v3, this approach will cause the size of decompressed initramfs
increase about 72K which I think is acceptable.
Resolves: bz821620
Currently dracut has supported for ipv6, and it is a significant feture for
kdump to enhance to support ipv6.
For ipv6 nfs dump:
if ipv6 address type is link scope, /etc/kdump.conf should be edited like
"nfs [fe80::5054:ff:fe48:ca80%eth0]:/mnt"
else /etc/kdump.conf should be edited like "nfs
[2001:db8:0:f101::2]:/mnt"
For ipv6 ssh dump
if ipv6 address type is link scope, /etc/kdump.conf should be edited like
"ssh root@fe80::5054:ff:fe48:ca80%eth0"
else /etc/kdump.conf should be edited like "ssh root@2001:db8:0:f101::2"
Signed-off-by: Arthur Zou <zzou(a)redhat.com>
It would be nice to see that it
was tested for IPV6 and IPV4 addresses.
Otherwise, looks good.
ACK
Marc
---
dracut-kdump.sh | 10 ++++++++--
dracut-module-setup.sh | 37 ++++++++++++++++++++++++++++++-------
kdump-lib.sh | 23 +++++++++++++++++++++++
3 files changed, 61 insertions(+), 9 deletions(-)
diff --git a/dracut-kdump.sh b/dracut-kdump.sh
index cb13d92..c215bee 100755
--- a/dracut-kdump.sh
+++ b/dracut-kdump.sh
@@ -206,10 +206,16 @@ get_host_ip()
then
kdumpnic=$(getarg kdumpnic=)
[ -z "$kdumpnic" ] && echo "kdump: failed to get
kdumpnic!" && return 1
- _host=`ip addr show dev $kdumpnic|grep 'inet '`
+ if is_ipv6_target
+ then
+ _host=`ip addr show dev $kdumpnic|grep 'inet6'`
+ else
+ _host=`ip addr show dev $kdumpnic|grep 'inet '`
+ fi
[ $? -ne 0 ] && echo "kdump: wrong kdumpnic: $kdumpnic"
&& return 1
- _host="${_host##*inet }"
+ _host="${_host#*inet}"
_host="${_host%%/*}"
+ _host=`echo $_host | cut -d' ' -f2`
[ -z "$_host" ] && echo "kdump: wrong kdumpnic:
$kdumpnic" && return 1
HOST_IP=$_host
fi
diff --git a/dracut-module-setup.sh b/dracut-module-setup.sh
index 2a16900..e3e0ee6 100755
--- a/dracut-module-setup.sh
+++ b/dracut-module-setup.sh
@@ -64,6 +64,7 @@ kdump_setup_dns() {
. /etc/sysconfig/network-scripts/ifcfg-$1
[ -n "$DNS1" ] && echo "nameserver=$DNS1" >
"$_dnsfile"
[ -n "$DNS2" ] && echo "nameserver=$DNS2" >>
"$_dnsfile"
+ [ -f /etc/resolv.conf ] && cat /etc/resolv.conf >>
"$_dnsfile"
}
#$1: netdev name
@@ -71,10 +72,20 @@ kdump_setup_dns() {
#if it use static ip echo it, or echo null
kdump_static_ip() {
. /etc/sysconfig/network-scripts/ifcfg-$1
- if [ -n "$IPADDR" ]; then
- [ -z "$NETMASK" -a -n "$PREFIX" ] && \
+ if is_ipv6_target
+ then
+ if [ -n "$IPV6ADDR" ]; then
+ IPV6ADDR=${IPV6ADDR%/*} #strip the prefix
+ IPV6ADDR="[${IPV6ADDR}]"
+ IPV6_DEFAULTGW="[${IPV6_DEFAULTGW}]"
+ echo -n "${IPV6ADDR}::${IPV6_DEFAULTGW}:64::"
+ fi
+ else
+ if [ -n "$IPADDR" ]; then
+ [ -z "$NETMASK" -a -n "$PREFIX" ] && \
NETMASK=$(ipcalc -m $IPADDR/$PREFIX | cut -d'=' -f2)
- echo -n "${IPADDR}::${GATEWAY}:${NETMASK}::"
+ echo -n "${IPADDR}::${GATEWAY}:${NETMASK}::"
+ fi
fi
}
@@ -227,16 +238,26 @@ kdump_install_net() {
local _server _netdev
local config_val="$1"
- _server=`echo $config_val | sed 's/.*@//' | cut -d':' -f1`
+ _server=`echo $config_val | sed 's/.*@//'`
+ _server=${_server%:/*}
+ _server=${_server#[}
+ _server=${_server%]}
+ _server=${_server%\%*} #strip the zone_ID if exist
- _need_dns=`echo $_server|grep "[a-zA-Z]"`
- [ -n "$_need_dns" ] && _server=`getent hosts $_server|cut -d'
' -f1`
+ if is_ipv6_target
+ then
+ _need_dns=`echo $_server|grep "[:]"`
+ [ -z "$_need_dns" ] && _server=`getent hosts $_server| head -n
1 | cut -d' ' -f1`
+ else
+ _need_dns=`echo $_server|grep "[a-zA-Z]"`
+ [ -n "$_need_dns" ] && _server=`getent hosts $_server| head -n
1 | cut -d' ' -f1`
+ fi
_netdev=`/sbin/ip route get to $_server 2>&1`
[ $? != 0 ] && echo "Bad kdump location: $config_val" &&
exit 1
#the field in the ip output changes if we go to another subnet
- if [ -n "`echo $_netdev | grep via`" ]
+ if [ -n "`echo $_netdev | grep -E 'via|from'`" ]
then
# we are going to a different subnet
_netdev=`echo $_netdev|awk '{print $5;}'|head -n 1`
@@ -542,6 +563,8 @@ install() {
inst "/bin/date" "/bin/date"
inst "/bin/sync" "/bin/sync"
inst "/bin/cut" "/bin/cut"
+ inst "/bin/getent" "/bin/getent"
+ inst "/bin/head" "/bin/head"
inst "/sbin/makedumpfile" "/sbin/makedumpfile"
inst "/sbin/vmcore-dmesg" "/sbin/vmcore-dmesg"
inst_hook pre-pivot 9999 "$moddir/kdump.sh"
diff --git a/kdump-lib.sh b/kdump-lib.sh
index a20c6e8..5e9f973 100755
--- a/kdump-lib.sh
+++ b/kdump-lib.sh
@@ -44,6 +44,29 @@ strip_comments()
echo $@ | sed -e 's/\(.*\)#.*/\1/'
}
+# check the remote server ip address tpye
+is_ipv6_target()
+{
+ local _server _server_tmp
+ if is_ssh_dump_target; then
+ _server=`grep "^ssh " /etc/kdump.conf`
+ elif is_nfs_dump_target; then
+ _server=`grep "^nfs " /etc/kdump.conf`
+ fi
+
+ [ -z "$_server" ] && return 1
+ _server=`strip_comments $_server`
+ _server=${_server#*@}
+ _server=${_server%:/*}
+ _server=${_server#[}
+ _server=${_server%]}
+ _server=${_server%\%*}
+ _server_tmp=$_server
+ _server=`getent hosts $_server | head -n 1 | cut -d' ' -f1`
+ _server=${_server:-$_server_tmp}
+ echo $_server | grep -q ":"
+}
+
# Check if fence kdump is configured in Pacemaker cluster
is_pcs_fence_kdump()
{