Enhance kdump to support ipv6 protocal.
v10:
- adjust some code to make it review easiler
- add comment to describe the function
v9:
- re-construct the patchset to make it more clear.
- modify some function name
v8:
- re-construct the patchset to make it more clear.
v7:
- use interface function is_ipv6_address to check whether is ipv6 or not
- fix some bugs
v6:
- construct the patches, split more small patches
- wrap the similar functional code to make it more clearly
v5:
- modify the get_route function
v4:
- consistent the netdevice name to add the prefix "kdump-" before the ethX
v3:
- Support the static route
v2:
- Fix some bugs
Minfei Huang (8):
kdump-lib: Quote the parameter to correct it if contains the blank
mkdumprd: Add proper prefix "kdump-" before ethX in 2nd kernel
kdump-lib: Add functions to enhance ipv6 judgement
dracut-kdump: Use the first filtered ip address as the dumping
directory
dracut-module-setup: Support the static route with ipv6 mode
dracut-module-setup: Support the static ip with ipv6 mode
dracut-module-setup: Install the network to support ipv6
dracut-module-setup: Enhance iscsi to support ipv6
dracut-kdump.sh | 4 +-
dracut-module-setup.sh | 165 ++++++++++++++++++++++++++++++++++++-------------
kdump-lib.sh | 65 +++++++++++++++----
mkdumprd | 16 ++++-
4 files changed, 193 insertions(+), 57 deletions(-)
--
1.9.3
Show replies by date
If the $1 parameter contains the blank, it may break the condition that
whether the $1 parameter contains the "eth".
Quote the $1 to integrate it as one parameter.
Signed-off-by: Minfei Huang <mhuang(a)redhat.com>
Acked-by: Baoquan He <bhe(a)redhat.com>
Acked-by: Dave Young <dyoung(a)redhat.com>
---
kdump-lib.sh | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/kdump-lib.sh b/kdump-lib.sh
index f24f08d..b886c5d 100755
--- a/kdump-lib.sh
+++ b/kdump-lib.sh
@@ -146,7 +146,7 @@ check_save_path_fs()
kdump_setup_ifname() {
local _ifname
- if [[ $1 =~ eth* ]]; then
+ if [[ "$1" =~ eth* ]]; then
_ifname="kdump-$1"
else
_ifname="$1"
--
1.9.3
The ipv6 link scope (like: fe80::fab1:56ff:feb6:56d5%eth1) needs to
append the netdevice to identify the ipv6 address.
Due to add prefix "kdump-" before ethX(commit: ba7660f) in the 2nd
kernel, we should correct the mount parameter and /etc/kdump.conf to
add the prefix "kdump-" before ethX, if use the ipv6 link scope.
Signed-off-by: Minfei Huang <mhuang(a)redhat.com>
---
dracut-module-setup.sh | 23 +++++++++++++++++++++++
mkdumprd | 16 +++++++++++++++-
2 files changed, 38 insertions(+), 1 deletion(-)
diff --git a/dracut-module-setup.sh b/dracut-module-setup.sh
index 4641025..8d451b4 100755
--- a/dracut-module-setup.sh
+++ b/dracut-module-setup.sh
@@ -343,6 +343,28 @@ default_dump_target_install_conf()
}
+# The ipv6 link scope (like: fe80::fab1:56ff:feb6:56d5%eth1) needs to
+# append the netdevice to identify the ipv6 address. Kdump will add the
+# prefix "kdump-" before ethX in the 2nd kernel.
+kdump_ipv6_netdev_fixup()
+{
+ local _srcaddr _tmp_conf=$1
+ if is_ssh_dump_target; then
+ _srcaddr=$(get_option_value ssh)
+ elif is_nfs_dump_target; then
+ _srcaddr=$(get_option_value nfs)
+ fi
+
+ if [ "x" != "x"$_srcaddr ] && `echo $_srcaddr | grep -q
"%"`; then
+ local _orig_netdev=${_srcaddr#*\%}
+ _orig_netdev=${_orig_netdev%]*}
+ local _pre_netdev=$(kdump_setup_ifname $_orig_netdev)
+ if [ "x"$_orig_netdev != "x"$_pre_netdev ]; then
+ sed -i "s#$_orig_netdev#$_pre_netdev#" $_tmp_conf
+ fi
+ fi
+}
+
#install kdump.conf and what user specifies in kdump.conf
kdump_install_conf() {
sed -ne '/^#/!p' /etc/kdump.conf > ${initdir}/tmp/$$-kdump.conf
@@ -357,6 +379,7 @@ kdump_install_conf() {
;;
ssh|nfs)
kdump_install_net "$config_val"
+ kdump_ipv6_netdev_fixup "${initdir}/tmp/$$-kdump.conf"
;;
kdump_pre|kdump_post|extra_bins)
dracut_install $config_val
diff --git a/mkdumprd b/mkdumprd
index 4d251ba..34bed63 100644
--- a/mkdumprd
+++ b/mkdumprd
@@ -78,8 +78,22 @@ add_dracut_module() {
add_dracut_arg "--add" "$1"
}
+# The ipv6 link scope which appends the netdevice to identify the ipv6
+# address is start with prefix "fe80", so we should correct the mount
+# parameter to add the prefix "kdump-" before ethX.
add_dracut_mount() {
- add_dracut_arg "--mount" "$1"
+ local _val="$1"
+
+ if is_nfs_dump_target; then
+ if `echo "$_val" | grep -q "^\[fe80"`; then
+ local _prefix="${_val%%\%*}"
+ local _netdev="${_val#*\%}"
+ _netdev=$(kdump_setup_ifname "$_netdev")
+ _val="$_prefix"%"$_netdev"
+ fi
+ fi
+
+ add_dracut_arg "--mount" "$_val"
}
add_dracut_sshkey() {
--
1.9.3
The ipv6 address has the special character colon ":", so we can use the
new function to pick it out.
We can use the new function to parse the passed parameter. The passed
parameter is hostname/domain, if it is satisfied with the condition that
it is without colon ":", and contanis the [a-zA-Z].
Add a new function to simplify to get the ip address, if the specified
address is a domain/hostname in /etc/kdump.conf.
The function will parse the passed parameter, and use the "getent ahost"
to get the ip address, if passed parameter is domain/hostname.
Signed-off-by: Minfei Huang <mhuang(a)redhat.com>
---
dracut-module-setup.sh | 1 +
kdump-lib.sh | 48 +++++++++++++++++++++++++++++++++++++-----------
2 files changed, 38 insertions(+), 11 deletions(-)
diff --git a/dracut-module-setup.sh b/dracut-module-setup.sh
index 8d451b4..f5fce2f 100755
--- a/dracut-module-setup.sh
+++ b/dracut-module-setup.sh
@@ -628,6 +628,7 @@ install() {
inst "/bin/dd" "/bin/dd"
inst "/bin/tail" "/bin/tail"
inst "/bin/date" "/bin/date"
+ inst "/bin/getent" "/bin/getent"
inst "/bin/sync" "/bin/sync"
inst "/bin/cut" "/bin/cut"
inst "/sbin/makedumpfile" "/sbin/makedumpfile"
diff --git a/kdump-lib.sh b/kdump-lib.sh
index b886c5d..cc33e01 100755
--- a/kdump-lib.sh
+++ b/kdump-lib.sh
@@ -170,21 +170,47 @@ get_remote_host()
echo $_config_val
}
-# check the remote server ip address tpye
-is_ipv6_target()
+# Convert hostname to ip address, echo the original value if $1 is already an ip
address.
+# $1: hostname or ip address
+get_ip_address()
{
- local _server _server_tmp
+ local _ip_address
+
+ _ip_address=`getent ahosts $1 | head -n 1 | cut -d' ' -f1`
+ _ip_address=${_ip_address:-$1}
+ echo $_ip_address
+}
+
+# the ipv6 address has the special character colon ":", so we can pick it out.
+# we can pass a ip address, if ipv6 address, will return ipv6 address,
+# otherwise return NULL
+is_ipv6_host()
+{
+ local _addr=$(get_ip_address $1)
+ echo $_addr | grep -q ":"
+}
+
+get_network_target()
+{
+ local _target
if is_ssh_dump_target; then
- _server=`get_option_value ssh`
+ _target=`get_option_value ssh`
elif is_nfs_dump_target; then
- _server=`get_option_value nfs`
+ _target=`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 ":"
+ [ -z "$_target" ] && return
+
+ _target=`get_remote_host $_target`
+ echo $_target
+}
+
+# check the remote server ip address tpye
+is_ipv6_target()
+{
+ local _target=$(get_network_target)
+
+ [ -z "$_target" ] && return 1
+ echo $(is_ipv6_host $_target)
}
--
1.9.3
In general, the dracut will setup the ipv4 or ipv6 mode exclusively, If
we specify the config to use the ssh or nfs to dump the core.
Modify the function to get the first filered ip address as the dumping
directory, and does not concern the ip address is ipv4 or ipv6.
Signed-off-by: Minfei Huang <mhuang(a)redhat.com>
Acked-by: Baoquan He <bhe(a)redhat.com>
Acked-by: Dave Young <dyoung(a)redhat.com>
---
dracut-kdump.sh | 4 ++--
dracut-module-setup.sh | 1 +
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/dracut-kdump.sh b/dracut-kdump.sh
index fa8908f..db3af7a 100755
--- a/dracut-kdump.sh
+++ b/dracut-kdump.sh
@@ -114,9 +114,9 @@ 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 '`
+ _host=`ip addr show dev $kdumpnic|grep 'inet'`
[ $? -ne 0 ] && echo "kdump: wrong kdumpnic: $kdumpnic"
&& return 1
- _host="${_host##*inet }"
+ _host=`echo $_host | head -n 1 | cut -d' ' -f2`
_host="${_host%%/*}"
[ -z "$_host" ] && echo "kdump: wrong kdumpnic:
$kdumpnic" && return 1
HOST_IP=$_host
diff --git a/dracut-module-setup.sh b/dracut-module-setup.sh
index f5fce2f..edefee4 100755
--- a/dracut-module-setup.sh
+++ b/dracut-module-setup.sh
@@ -629,6 +629,7 @@ install() {
inst "/bin/tail" "/bin/tail"
inst "/bin/date" "/bin/date"
inst "/bin/getent" "/bin/getent"
+ inst "/bin/head" "/bin/head"
inst "/bin/sync" "/bin/sync"
inst "/bin/cut" "/bin/cut"
inst "/sbin/makedumpfile" "/sbin/makedumpfile"
--
1.9.3
In order to enhance kdump to support ipv6, support the static route with
ipv6, which ipv4 has supported already.
Due to the different format with ipv4 and ipv6, dracut uses bracket "[]"
to quote the ipv6 address to identify it in the 2nd kernel.
Signed-off-by: Minfei Huang <mhuang(a)redhat.com>
Acked-by: Baoquan He <bhe(a)redhat.com>
Acked-by: Dave Young <dyoung(a)redhat.com>
---
dracut-module-setup.sh | 50 ++++++++++++++++++++++++++++++++++----------------
1 file changed, 34 insertions(+), 16 deletions(-)
diff --git a/dracut-module-setup.sh b/dracut-module-setup.sh
index edefee4..ad977e4 100755
--- a/dracut-module-setup.sh
+++ b/dracut-module-setup.sh
@@ -195,27 +195,45 @@ kdump_setup_znet() {
echo rd.znet=${NETTYPE},${SUBCHANNELS}${_options} >
${initdir}/etc/cmdline.d/30znet.conf
}
+#
+# For the same subnet region, following is the route format
+# ipv4:
+# _route='192.168.200.137 dev eth1 src 192.168.200.129
+# cache '
+# ipv6:
+# _route='2001:11::11f from :: dev eth1 src 2001:11::120 metric 0
+# cache'
+# For the different subnet region, following is the route format
+# ipv4:
+# _route='192.168.201.215 via 192.168.200.137 dev eth1 src 192.168.200.129
+# cache '
+# ipv6:
+# _route='2001:10::120 from :: via 2001:11::11f dev eth1 src 2001:11::120
metric 0
+# cache'
get_routes() {
local _netdev="$1" _target="$2"
local _route _nexthop
- _route=`/sbin/ip route get to $_target 2>&1`
-#
-# in the same subnet region, following is the route format
-# _route='192.168.200.137 dev eth1 src 192.168.200.129
-# cache '
-#
-# in the different subnet region, following is the route format
-# _route='192.168.201.215 via 192.168.200.137 dev eth1 src 192.168.200.129
-# cache '
-#
- if `echo $_route | grep -q "via"`; then
- # route going to a different subnet via a router
- _nexthop=`echo $_route | awk '{print $3}'`
- fi
- _netdev=$(kdump_setup_ifname $_netdev)
+ if is_ipv6_host $_target; then
+ _route=`/sbin/ip -6 route get to $_target 2>&1`
+ _netdev=$(kdump_setup_ifname $_netdev)
+ if `echo $_route | grep -q "via"`; then
+ # route going to a different subnet via a router
+ _nexthop=`echo $_route | awk '{print $5}'`
+ echo "rd.route=[$_target]:[$_nexthop]:$_netdev" >>
${initdir}/etc/cmdline.d/45route-static.conf
+ else
+ echo "rd.route=[$_target]::$_netdev" >>
${initdir}/etc/cmdline.d/45route-static.conf
+ fi
+ else
+ _route=`/sbin/ip route get to $_target 2>&1`
+ if `echo $_route | grep -q "via"`; then
+ # route going to a different subnet via a router
+ _nexthop=`echo $_route | awk '{print $3}'`
+ fi
+ _netdev=$(kdump_setup_ifname $_netdev)
- echo "rd.route=$_target:$_nexthop:$_netdev" >>
${initdir}/etc/cmdline.d/45route-static.conf
+ echo "rd.route=$_target:$_nexthop:$_netdev" >>
${initdir}/etc/cmdline.d/45route-static.conf
+ fi
}
# Setup dracut to bringup a given network interface
--
1.9.3
In order to enhance kdump to support ipv6, support the static ip with
ipv6, which ipv4 has supported already.
Due to the different format with ipv4 and ipv6, dracut uses bracket"[]"
to quote the ipv6 address to identify it in the 2nd kernel.
Signed-off-by: Minfei Huang <mhuang(a)redhat.com>
---
dracut-module-setup.sh | 23 +++++++++++++++++------
1 file changed, 17 insertions(+), 6 deletions(-)
diff --git a/dracut-module-setup.sh b/dracut-module-setup.sh
index ad977e4..c6922c0 100755
--- a/dracut-module-setup.sh
+++ b/dracut-module-setup.sh
@@ -74,14 +74,25 @@ kdump_setup_dns() {
#$2: srcaddr
#if it use static ip echo it, or echo null
kdump_static_ip() {
- local _netmask _gateway
+ local _netmask _gateway _ipaddr
local _netdev="$1" _srcaddr="$2"
- local _ipaddr=$(ip addr show dev $_netdev permanent | \
+
+ if is_ipv6_host $_srcaddr; then
+ _ipaddr=$(ip -6 addr show dev $_netdev permanent | \
+ awk "/ $_srcaddr\/.* /{print \$2}")
+ if [ -n "$_ipaddr" ]; then
+ _netmask=${_ipaddr#*\/}
+ _gateway=$(ip -6 route list dev $_netdev | awk '/^default /{print
$3}')
+ echo -n "[${_srcaddr}]::[${_gateway}]:${_netmask}::"
+ fi
+ else
+ _ipaddr=$(ip addr show dev $_netdev permanent | \
awk "/ $_srcaddr\/.* $_netdev\$/{print \$2}")
- if [ -n "$_ipaddr" ]; then
- _netmask=$(ipcalc -m $_ipaddr | cut -d'=' -f2)
- _gateway=$(ip route list dev $_netdev | awk '/^default /{print $3}')
- echo -n "${_srcaddr}::${_gateway}:${_netmask}::"
+ if [ -n "$_ipaddr" ]; then
+ _netmask=$(ipcalc -m $_ipaddr | cut -d'=' -f2)
+ _gateway=$(ip route list dev $_netdev | awk '/^default /{print $3}')
+ echo -n "${_srcaddr}::${_gateway}:${_netmask}::"
+ fi
fi
}
--
1.9.3
Currently kdump doesn't support ipv6 nfs/ssh dump. Due to the lastet
version of the Internet Protocal, it is a significant feature for kdump
to enhance to support ipv6.
Following is the special config for ipv6 protocal.
For ipv6 nfs dump:
Link scope, /etc/kdump.conf should be specified like
"nfs [fe80::5054:ff:fe48:ca80%eth0]:/mnt"
otherwise
"nfs [2001:db8:0:f101::2]:/mnt"
For ipv6 ssh dump:
Link scope, /etc/kdump.conf should be edited like
"ssh root at fe80::5054:ff:fe48:ca80%eth0"
otherwise
"ssh root at 2001:db8:0:f101::2"
Signed-off-by: Minfei Huang <mhuang(a)redhat.com>
---
dracut-module-setup.sh | 46 +++++++++++++++++++++++++++++-----------------
kdump-lib.sh | 15 +++++++++++++++
2 files changed, 44 insertions(+), 17 deletions(-)
diff --git a/dracut-module-setup.sh b/dracut-module-setup.sh
index c6922c0..7b71f60 100755
--- a/dracut-module-setup.sh
+++ b/dracut-module-setup.sh
@@ -301,24 +301,36 @@ kdump_install_net() {
local _server _netdev _srcaddr
local config_val="$1"
- _server=`echo $config_val | sed 's/.*@//' | cut -d':' -f1`
-
- _need_dns=`echo $_server|grep "[a-zA-Z]"`
- [ -n "$_need_dns" ] && _server=`getent hosts $_server|cut -d'
' -f1`
-
- _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`" ]
- then
- # we are going to a different subnet
- _srcaddr=`echo $_netdev|awk '{print $7}'|head -n 1`
- _netdev=`echo $_netdev|awk '{print $5;}'|head -n 1`
+ _server=`get_remote_host $config_val`
+
+ is_hostname $_server && _server=`getent ahosts $_server|cut -d' '
-f1`
+
+ if is_ipv6_host $_server; then
+ _netdev=`/sbin/ip -6 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`" ]; then
+ # we are going to a different subnet
+ _srcaddr=`echo $_netdev|awk '{print $9}'|head -n 1`
+ _netdev=`echo $_netdev|awk '{print $7;}'|head -n 1`
+ else
+ # we are on the same subnet
+ _srcaddr=`echo $_netdev|awk '{print $7}'|head -n 1`
+ _netdev=`echo $_netdev|awk '{print $5}'|head -n 1`
+ fi
else
- # we are on the same subnet
- _srcaddr=`echo $_netdev|awk '{print $5}'|head -n 1`
- _netdev=`echo $_netdev|awk '{print $3}'|head -n 1`
+ _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`" ]; then
+ # we are going to a different subnet
+ _srcaddr=`echo $_netdev|awk '{print $7}'|head -n 1`
+ _netdev=`echo $_netdev|awk '{print $5;}'|head -n 1`
+ else
+ # we are on the same subnet
+ _srcaddr=`echo $_netdev|awk '{print $5}'|head -n 1`
+ _netdev=`echo $_netdev|awk '{print $3}'|head -n 1`
+ fi
fi
kdump_setup_netdev "${_netdev}" "${_srcaddr}"
"${_server}"
diff --git a/kdump-lib.sh b/kdump-lib.sh
index cc33e01..e643802 100755
--- a/kdump-lib.sh
+++ b/kdump-lib.sh
@@ -214,3 +214,18 @@ is_ipv6_target()
[ -z "$_target" ] && return 1
echo $(is_ipv6_host $_target)
}
+
+# if the passed parameter is hostname/domain, it will be satisfied with
+# condition which it is without colon ":", and contains the [a-zA-Z]
+# $1: hostname
+is_hostname()
+{
+ local _hostname=`echo $1 | grep ":"`
+
+ # ipv6 address
+ if [ -n "$_hostname" ]; then
+ return 1
+ else
+ echo $1 | grep -q "[a-zA-Z]"
+ fi
+}
--
1.9.3
Now the dracut does not have enough info to setup the ipv6 to connect
the iscsi target in the 2nd kernel, if the iscsi connecting is ipv6
protocal.
For this patch, we will parse the iscsi connecting, pass the config to
the dracut to setup the ipv6 in the 2nd kernel.
Signed-off-by: Minfei Huang <mhuang(a)redhat.com>
---
dracut-module-setup.sh | 25 ++++++++++++++++++++-----
1 file changed, 20 insertions(+), 5 deletions(-)
diff --git a/dracut-module-setup.sh b/dracut-module-setup.sh
index 7b71f60..6479960 100755
--- a/dracut-module-setup.sh
+++ b/dracut-module-setup.sh
@@ -487,6 +487,7 @@ kdump_get_iscsi_initiator() {
kdump_setup_iscsi_device() {
local path=$1
local tgt_name; local tgt_ipaddr;
+ local _srcaddr _prefix _netdev
local username; local password; local userpwd_str;
local username_in; local password_in; local userpwd_in_str;
local netdev
@@ -524,19 +525,33 @@ kdump_setup_iscsi_device() {
[ -n "$username_in" ] &&
userpwd_in_str=":$username_in:$password_in"
- netdev=$(/sbin/ip route get to ${tgt_ipaddr} | \
- sed 's|.*dev \(.*\).*|\1|g')
+ if is_ipv6_host $tgt_ipaddr; then
+ netdev=$(/sbin/ip -6 route get to $(get_remote_host $tgt_ipaddr) | \
+ sed 's|.*dev \(.*\).*|\1|g')
+ else
+ netdev=$(/sbin/ip route get to ${tgt_ipaddr} | \
+ sed 's|.*dev \(.*\).*|\1|g')
+ fi
srcaddr=$(echo $netdev | awk '{ print $3; exit }')
netdev=$(echo $netdev | awk '{ print $1; exit }')
- kdump_setup_netdev $netdev $srcaddr $tgt_ipaddr
+ kdump_setup_netdev $netdev $srcaddr $(get_remote_host $tgt_ipaddr)
# prepare netroot= command line
- # FIXME: IPV6 addresses require explicit [] around $tgt_ipaddr
# FIXME: Do we need to parse and set other parameters like protocol, port
# iscsi_iface_name, netdev_name, LUN etc.
-
netroot_str="netroot=iscsi:${userpwd_str}${userpwd_in_str}@$tgt_ipaddr::::$tgt_name"
+ if is_ipv6_host $tgt_ipaddr; then
+ if `echo $tgt_ipaddr | grep -q "%"`; then
+ _prefix=${tgt_ipaddr%\%*}
+ _netdev=${tgt_ipaddr#*\%}
+ _netdev=$(kdump_setup_ifname $_netdev)
+ tgt_ipaddr=$_prefix%$_netdev
+ fi
+
netroot_str="netroot=iscsi:${userpwd_str}${userpwd_in_str}@[$tgt_ipaddr]::::$tgt_name"
+ else
+
netroot_str="netroot=iscsi:${userpwd_str}${userpwd_in_str}@$tgt_ipaddr::::$tgt_name"
+ fi
[[ -f $netroot_conf ]] || touch $netroot_conf
--
1.9.3