2014-09-23 16:11:11 +00:00
|
|
|
From: Petr Tesarik <ptesarik@suse.cz>
|
|
|
|
Date: Tue Sep 23 16:12:34 2014 +0200
|
|
|
|
Subject: Add KDUMP_NETCONFIG modes to support IPv6
|
|
|
|
References: bnc#885897
|
|
|
|
Patch-mainline: v0.8.16
|
2014-09-26 12:18:03 +00:00
|
|
|
Git-commit: ffd6542ed47a41be1f1d9f8df95781b6d94123d4
|
2014-09-23 16:11:11 +00:00
|
|
|
|
|
|
|
KDUMP_NETCONFIG had only two modes: static and dhcp, where dhcp
|
|
|
|
actually only means DHCP4. New modes are needed to get an IPv6
|
|
|
|
address on the interface.
|
|
|
|
|
|
|
|
Note that automatic configuration (KDUMP_NETCONFIG=auto) still uses
|
|
|
|
only IPv4, because dracut does not implement multiple alternative
|
|
|
|
ip configurations, and there's no way to determine in advance
|
|
|
|
which stack should be used.
|
|
|
|
|
|
|
|
Signed-off-by: Petr Tesarik <ptesarik@suse.cz>
|
|
|
|
|
|
|
|
---
|
|
|
|
doc/man/kdump.5.txt.in | 35 ++++++++++++++++++++++++++++++-----
|
|
|
|
init/module-setup.sh | 42 ++++++++++++++++++++++++++++++++++--------
|
|
|
|
init/setup-kdump.functions | 39 ++++++++++++++++++++++++++++++++++++++-
|
|
|
|
sysconfig.kdump.in | 4 ++--
|
|
|
|
4 files changed, 104 insertions(+), 16 deletions(-)
|
|
|
|
|
|
|
|
--- a/doc/man/kdump.5.txt.in
|
|
|
|
+++ b/doc/man/kdump.5.txt.in
|
|
|
|
@@ -513,13 +513,38 @@ KDUMP_NETCONFIG
|
|
|
|
|
|
|
|
Network configuration for kdump. Because the dump process runs in initrd, the
|
|
|
|
network configuration is different from the normal network configuration. Use
|
|
|
|
-_auto_ to auto-detect the network configuration, this is also the default.
|
|
|
|
+_auto_ to auto-detect the network configuration (see *auto* mode below). The
|
|
|
|
+interface with the default route will be used. This is the default.
|
|
|
|
+
|
|
|
|
+Auto-detection cannot be used to set up dual-stack (IPv4 and IPv6) hosts
|
|
|
|
+because of limitations in the implementation of the _ip=_ initrd command line
|
|
|
|
+option.
|
|
|
|
|
|
|
|
Use a _netdevice:mode_ string to force a specific network device to be used. A
|
|
|
|
-_netdevice_ is for example "eth0". The _mode_ can be either "dhcp" or "static".
|
|
|
|
-If you use "static", you have to set the IP address with _ip=ipspec_. _ipspec_
|
|
|
|
-is <client>:<server>:<gateway>:<netmask>:<hostname>:<device>:<proto>. See
|
|
|
|
-*mkinitrd*(8) for details.
|
|
|
|
+_netdevice_ is for example "eth0". The _mode_ can be:
|
|
|
|
+
|
|
|
|
+*static*::
|
|
|
|
+ Always re-use the current configuration of _netdevice_ (both IPv4 and IPv6).
|
|
|
|
+ Note that only permanent global IPv6 addresses are stored, because temporary
|
|
|
|
+ addresses are likely to expire before the system crashes, and link-local
|
|
|
|
+ addresses are set up automatically.
|
|
|
|
+
|
|
|
|
+*auto6*::
|
|
|
|
+ Use IPv6 autoconfiguration to get an address on the interface.
|
|
|
|
+
|
|
|
|
+*dhcp*::
|
|
|
|
+*dhcp4*::
|
|
|
|
+ Use DHCP to configure an IPv4 address on the interface.
|
|
|
|
+
|
|
|
|
+*dhcp6*::
|
|
|
|
+ Use DHCP6 to configure an IPv6 address on the interface.
|
|
|
|
+
|
|
|
|
+*auto*::
|
|
|
|
+ Select the mode depending on the current state of the interface:
|
|
|
|
+
|
|
|
|
+ * use DHCP4 if it has an IPv4 address (IPv6 not set up),
|
|
|
|
+ * use DHCP6 if it has a permanent IPv6 address (IPv4 not set up),
|
|
|
|
+ * use IPv6 auto-configuration if it has neither (IPv4 not set up).
|
|
|
|
|
|
|
|
You can set KDUMP_NETCONFIG to "" if you want no network in initrd, i.e. you use
|
|
|
|
disk dumping.
|
|
|
|
--- a/init/module-setup.sh
|
|
|
|
+++ b/init/module-setup.sh
|
|
|
|
@@ -65,24 +65,50 @@ kdump_cmdline_ip() {
|
|
|
|
[ "$kdump_neednet" = y ] || return 0
|
|
|
|
|
|
|
|
echo -n "rd.neednet=1"
|
|
|
|
+
|
|
|
|
+ local _if _mode
|
|
|
|
if [ "$KDUMP_NETCONFIG" = "auto" ] ; then
|
|
|
|
- echo -n " ip=any"
|
|
|
|
+ _if=default
|
|
|
|
+ _mode=auto
|
|
|
|
else
|
|
|
|
set -- ${KDUMP_NETCONFIG//:/ }
|
|
|
|
local _if=$1
|
|
|
|
local _mode=$2
|
|
|
|
+ fi
|
|
|
|
|
|
|
|
- if [ "$_if" = "default" ] ; then
|
|
|
|
- _if=$(kdump_default_netdev)
|
|
|
|
- fi
|
|
|
|
- printf " %s" $(kdump_ifname_config "$_if")
|
|
|
|
+ [ "$_if" = "default" ] && _if=$(kdump_default_netdev)
|
|
|
|
|
|
|
|
- if [ "$_mode" = "static" ] ; then
|
|
|
|
- printf " %s" $(kdump_ip_config "$_if")
|
|
|
|
+ printf " %s" $(kdump_ifname_config "$_if")
|
|
|
|
+
|
|
|
|
+ if [ "$_mode" = "auto" ] ; then
|
2014-09-26 12:18:03 +00:00
|
|
|
+ if [ -n $(kdump_ip_config "$_if") ] ; then
|
2014-09-23 16:11:11 +00:00
|
|
|
+ _mode=dhcp4
|
2014-09-26 12:18:03 +00:00
|
|
|
+ elif [ -n $(kdump_ip6_config "$_if") ] ; then
|
2014-09-23 16:11:11 +00:00
|
|
|
+ _mode=dhcp6
|
|
|
|
else
|
|
|
|
- echo -n " ip=${_if}:dhcp"
|
|
|
|
+ _mode=auto6
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
+
|
|
|
|
+ case "$_mode" in
|
|
|
|
+ static)
|
|
|
|
+ printf " %s" \
|
|
|
|
+ $(kdump_ip_config "$_if") \
|
|
|
|
+ $(kdump_ip6_config "$_if")
|
|
|
|
+ ;;
|
|
|
|
+ dhcp|dhcp4)
|
|
|
|
+ echo " ip=${_if}:dhcp"
|
|
|
|
+ ;;
|
|
|
|
+ dhcp6)
|
|
|
|
+ echo " ip=${_if}:dhcp6"
|
|
|
|
+ ;;
|
|
|
|
+ auto6)
|
|
|
|
+ echo " ip=${_if}:auto6"
|
|
|
|
+ ;;
|
|
|
|
+ *)
|
|
|
|
+ derror "Wrong KDUMP_NETCONFIG mode: $_mode"
|
|
|
|
+ ;;
|
|
|
|
+ esac
|
|
|
|
}
|
|
|
|
|
|
|
|
cmdline() {
|
|
|
|
--- a/init/setup-kdump.functions
|
|
|
|
+++ b/init/setup-kdump.functions
|
|
|
|
@@ -230,7 +230,7 @@ kdump_prefix2netmask() { # {{{
|
|
|
|
} # }}}
|
|
|
|
|
|
|
|
#
|
|
|
|
-# Get the ip= parameter for a given device
|
|
|
|
+# Get the IPv4 ip= parameter for a given device
|
|
|
|
#
|
|
|
|
# Parameters:
|
|
|
|
# 1) device device name
|
|
|
|
@@ -267,6 +267,43 @@ function kdump_ip_config() # {{{
|
|
|
|
} # }}}
|
|
|
|
|
|
|
|
#
|
|
|
|
+# Get the IPv6 ip= parameter for a given device
|
|
|
|
+#
|
|
|
|
+# Parameters:
|
|
|
|
+# 1) device device name
|
|
|
|
+# Output:
|
|
|
|
+# ip configuration string that can be used for the ip= initrd parameter
|
|
|
|
+function kdump_ip6_config() # {{{
|
|
|
|
+{
|
|
|
|
+ local iface="$1"
|
|
|
|
+ local ipaddr peeraddr gwaddr hostname
|
|
|
|
+ local family cidr rest prefix
|
|
|
|
+
|
|
|
|
+ hostname=$(hostname)
|
|
|
|
+ gwaddr=$(ip -6 route show ::/0 | sed -n 's/.* via \([^ ]*\).*/[\1]/p')
|
|
|
|
+
|
|
|
|
+ while read family cidr rest
|
|
|
|
+ do
|
|
|
|
+ [ "$family" = "inet6" ] || continue
|
|
|
|
+
|
|
|
|
+ ipaddr="${cidr%/*}"
|
|
|
|
+ prefix="${cidr:${#ipaddr}}"
|
|
|
|
+ ipaddr="[$ipaddr]$prefix"
|
|
|
|
+ set -- $rest
|
|
|
|
+
|
|
|
|
+ if [ "$1" == "peer" ] ; then
|
|
|
|
+ peeraddr="${2%/*}"
|
|
|
|
+ prefix="${2:${#peeraddr}}"
|
|
|
|
+ peeraddr="[$peeraddr]"
|
|
|
|
+ else
|
|
|
|
+ peeraddr=
|
|
|
|
+ fi
|
|
|
|
+
|
|
|
|
+ echo "ip=$ipaddr:$peeraddr:$gwaddr::$hostname:$iface:none"
|
|
|
|
+ done < <(ip -6 address show dev "$iface" permanent scope global)
|
|
|
|
+} # }}}
|
|
|
|
+
|
|
|
|
+#
|
|
|
|
# Get the save directory and protocol.
|
|
|
|
#
|
|
|
|
# Output variables:
|
|
|
|
--- a/sysconfig.kdump.in
|
|
|
|
+++ b/sysconfig.kdump.in
|
|
|
|
@@ -279,8 +279,8 @@ KDUMPTOOL_FLAGS=""
|
|
|
|
## ServiceRestart: kdump
|
|
|
|
#
|
|
|
|
# Network configuration. Use "auto" for auto-detection in initrd, or a string
|
|
|
|
-# that contains the network device and the mode (dhcp,static), separated by
|
|
|
|
-# a colon. Example: "eth0:static" or "eth1:dhcp".
|
|
|
|
+# that contains the network device and the mode (static, dhcp, dhcp6, auto6),
|
|
|
|
+# separated by a colon. Example: "eth0:static" or "eth1:dhcp".
|
|
|
|
#
|
|
|
|
# For static configuration, you have to add the configuration to
|
|
|
|
# KDUMP_COMMANDLINE_APPEND.
|