A NIC may get a different name in the kdump kernel from 1st kernel
in cases like,
- kernel assigned network interface names are not persistent e.g. [1]
- there is an udev rule to rename the NIC in the 1st kernel but the
kdump initrd may not have that rule e.g. [2]
If NM tries to match a NIC with a connection profile based on NIC name
i.e. connection.interface-name, it will fail the above bases. So we
should remove the line connection.interface-name=XX from the connection
file. With this line deleted, multiple NICs may be matched by a
connection profile but we don't need to worry about a wrong NIC is
brought up by NM since we have explicitly asked NM to only bring up the
NICs needed by kdump via /etc/NetworkManager/conf.d/10-kdump-netif.conf.
Note we don't need to do this for user created NIC like vlan, bridge and
bond.
An remaining issue is passing the name of a NIC via the kdumpnic dracut
command line parameter which requires passing ifname=<interface>:<MAC> to
have fixed NIC name. But we can simply drop this requirement. kdumpnic
is needed because kdump needs to get the IP by NIC name and use the IP
to created a dumping folder named "{IP}-{DATE}". We can simply pass the
IP to the kdump kernel directly via a new dracut command line parameter
kdumpip instead. In addition to the benefit of simplifying the code,
there are other three benefits brought by this approach,
- make use of whatever network to transfer the vmcore. Because as long
as we have the network to we don't care which NIC is active.
- if obtained IP in the kdump kernel is different from the one in the
1st kernel. "{IP}-{DATE}" would better tell where the dumped vmcore
comes from.
- without passing ifname=<interface>:<MAC> to to kdump initrd, the
issue of there are two interfaces with the same MAC address for
Azure Hyper-V NIC SR-IOV [3] is resolved automatically.
[1]
https://bugzilla.redhat.com/show_bug.cgi?id=1121778
[2]
https://bugzilla.redhat.com/show_bug.cgi?id=810107
[3]
https://bugzilla.redhat.com/show_bug.cgi?id=1962421
Signed-off-by: Coiby Xu <coxu(a)redhat.com>
---
dracut-kdump.sh | 18 ++++--------------
dracut-module-setup.sh | 38 ++++++++++++++------------------------
2 files changed, 18 insertions(+), 38 deletions(-)
diff --git a/dracut-kdump.sh b/dracut-kdump.sh
index b69bc98..e27be61 100755
--- a/dracut-kdump.sh
+++ b/dracut-kdump.sh
@@ -475,22 +475,12 @@ save_vmcore_dmesg_ssh()
get_host_ip()
{
if is_nfs_dump_target || is_ssh_dump_target; then
- kdumpnic=$(getarg kdumpnic=)
- if [ -z "$kdumpnic" ]; then
- derror "failed to get kdumpnic!"
+ kdumpip=$(getarg kdumpip=)
+ if [ -z "$kdumpip" ]; then
+ derror "failed to get kdumpip!"
return 1
fi
- if ! kdumphost=$(ip addr show dev "$kdumpnic" | grep '[ ]*inet');
then
- derror "wrong kdumpnic: $kdumpnic"
- return 1
- fi
- kdumphost=$(echo "$kdumphost" | head -n 1 | awk '{print $2}')
- kdumphost="${kdumphost%%/*}"
- if [ -z "$kdumphost" ]; then
- derror "wrong kdumpnic: $kdumpnic"
- return 1
- fi
- HOST_IP=$kdumphost
+ HOST_IP=$kdumpip
fi
return 0
}
diff --git a/dracut-module-setup.sh b/dracut-module-setup.sh
index c05666e..8b28141 100755
--- a/dracut-module-setup.sh
+++ b/dracut-module-setup.sh
@@ -210,26 +210,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 ifname already has 'kdump-' prefix, we must be switching from
- # fadump to kdump. Skip prefixing 'kdump-' in this case as adding
- # another prefix may truncate the ifname. Since an ifname with
- # 'kdump-' is already persistent, this should be fine.
- if [[ $1 =~ eth* ]] && [[ ! $1 =~ ^kdump-* ]]; then
- _ifname="kdump-$1"
- else
- _ifname="$1"
- fi
-
- echo "$_ifname"
-}
-
kdump_copy_nmconnection_file() {
local _dev _nmconnection_file_path _nmconnection_name _initrd_nmconnection_file_path
local _cloned_nmconnection_file_path _uniq_name _old_uuid _old_name _uuid _per_mac
@@ -264,6 +244,8 @@ kdump_copy_nmconnection_file() {
_per_mac=$(kdump_get_perm_addr "$_dev")
if [[ "$_per_mac" != 'not set' ]]; then
echo -n "except:mac:$_per_mac," >>
"/tmp/$$-netif_allowlist"
+ # Ask NM to not match a connection profile based on interface-name
+ sed -i -E "s/^interface-name=.*$//g"
"${initdir}/$_initrd_nmconnection_file_path"
else
echo -n "except:interface-name:$_dev," >>
"/tmp/$$-netif_allowlist"
fi
@@ -428,7 +410,7 @@ kdump_get_remote_ip() {
# initramfs accessing giving destination
# $1: destination host
kdump_install_net() {
- local _destaddr _route _netdev _conpath kdumpnic
+ local _destaddr _route _netdev _conpath _kdumpip
local _znet_netdev _znet_conpath
# each netowrk interface is managed by a NM connection profile
declare -A nmconnection_map
@@ -441,9 +423,16 @@ kdump_install_net() {
_route=$(kdump_get_ip_route "$_destaddr")
_netdev=$(kdump_get_ip_route_field "$_route" "dev")
_conpath=$(get_nmcli_connection_apath_by_ifname "$_netdev")
- kdumpnic=$(kdump_setup_ifname "$_netdev")
+ if ! _kdumpip=$(ip addr show dev "$_netdev" | grep '[ ]*inet');
then
+ derror "Failed to get IP of $_netdev"
+ return 1
+ fi
+
+ _kdumpip=$(echo "$_kdumpip" | head -n 1 | awk '{print $2}')
+ _kdumpip="${_kdumpip%%/*}"
_znet_netdev=$(find_online_znet_device)
+
if [[ -n $_znet_netdev ]]; then
_znet_conpath=$(get_nmcli_connection_apath_by_ifname "$_znet_netdev")
if ! (kdump_setup_znet "$_znet_netdev" "$_znet_conpath");
then
@@ -463,6 +452,7 @@ kdump_install_net() {
elif kdump_is_vlan "$_netdev"; then
kdump_setup_vlan "$_netdev"
fi
+
kdump_copy_nmconnection_file "$_netdev"
kdump_install_nm_netif_allowlist
@@ -483,8 +473,8 @@ kdump_install_net() {
# the default gate way for network dump, eth1 in the fence kdump path will
# call kdump_install_net again and we don't want eth1 to be the default
# gateway.
- if [[ ! -f ${initdir}/etc/cmdline.d/60kdumpnic.conf ]]; then
- echo "kdumpnic=$kdumpnic" >
"${initdir}/etc/cmdline.d/60kdumpnic.conf"
+ if [[ ! -f ${initdir}/etc/cmdline.d/60kdumpip.conf ]]; then
+ echo "kdumpip=$_kdumpip" >
"${initdir}/etc/cmdline.d/60kdumpip.conf"
fi
}
--
2.34.1