/usr/lib/udev/ccw_init [1] shipped by s390utils extracts the values of
SUBCHANNELS, NETTYPE and LAYER2 from /etc/sysconfig/network-scripts/ifcfg-*
or /etc/NetworkManager/system-connections/*.nmconnection to activate znet
network device. If the connection profile is copied to initrd,
there is no need to set up the "rd.znet" dracut cmdline parameter.
There are two cases addressed by this commit,
1. znet network interface is a slave of bonding/teaming/vlan/bridging
network. The connection profile has been copied to initrd by
kdump_copy_nmconnection_file and it contains the info needed by
ccw_init.
2. znet network interface is a slave of bonding/teaming/vlan/bridging
network. The corresponding ifcfg-*/*.nmconnection file may not contain
info like SUBCHANNELS [2]. In this case, copy the ifcfg-*/*.nmconnection
file that has this info to the kdump initrd. Also to prevent the copied
connection profile from being chosen by NM, set
connection.autoconnect=false for this connection profile.
Note
1. ccw_init doesn't care if SUBCHANNELS, NETTYPE and LAYER2 comes from
an active NM profile or not. If an inactive NM profile contains this
info, it needs to be copied to the kdump initrd as well.
2. "rd.znet_ifname=$_netdev:${SUBCHANNELS}" is no needed because now
there is no renaming of s390x network interfaces when reusing
NetworkManager profiles. rd.znet_ifname was introduced in commit
ce0305d ("Add a new option 'rd.znet_ifname' in order to use it in udev
rules") to address the special case of non-persistent MAC address by
renaming a network interface by SUBCHANNELS.
[1]
https://src.fedoraproject.org/rpms/s390utils/blob/rawhide/f/ccw_init
[2]
https://bugzilla.redhat.com/show_bug.cgi?id=2064708
Signed-off-by: Coiby Xu <coxu(a)redhat.com>
---
dracut-module-setup.sh | 72 ++++++++++++++++++++++--------------------
1 file changed, 37 insertions(+), 35 deletions(-)
diff --git a/dracut-module-setup.sh b/dracut-module-setup.sh
index 8b28141..712e5af 100755
--- a/dracut-module-setup.sh
+++ b/dracut-module-setup.sh
@@ -350,34 +350,46 @@ find_online_znet_device() {
echo -n "$ifname"
}
-# setup s390 znet cmdline
-# $1: netdev (ifname)
-# $2: nmcli connection path
+_find_znet_nmconnection() {
+ LANG=C grep -E -i -l \
+ "^s390-subchannels=([0-9]\.[0-9]\.[a-f0-9]+;){0,2}" \
+ "$1/*.nmconnection" | LC_ALL=C sed -e "$2"
+}
+
+# setup s390 znet
+#
+# Note part of code is extracted from ccw_init provided by s390utils
kdump_setup_znet() {
- local _netdev="$1"
- local _conpath="$2"
- local s390_prefix="802-3-ethernet.s390-"
- local _options=""
- local NETTYPE
- local SUBCHANNELS
-
- NETTYPE=$(get_nmcli_field_by_conpath "${s390_prefix}nettype"
"$_conpath")
- SUBCHANNELS=$(get_nmcli_field_by_conpath "${s390_prefix}subchannels"
"$_conpath")
- _options=$(get_nmcli_field_by_conpath "${s390_prefix}options"
"$_conpath")
-
- if [[ -z $NETTYPE || -z $SUBCHANNELS || -z $_options ]]; then
- dwarning "Failed to get znet configuration via nmlci output. Now try
sourcing ifcfg script."
- source_ifcfg_file "$_netdev"
- for i in $OPTIONS; do
- _options=${_options},$i
- done
+ local _config_file _uniq_name _NM_conf_dir
+ local
__sed_discard_ignored_files='/\(~\|\.bak\|\.old\|\.orig\|\.rpmnew\|\.rpmorig\|\.rpmsave\)$/d'
+
+ _NM_conf_dir="/etc/NetworkManager/system-connections"
+
+ _config_file=$(_find_znet_nmconnection "$initdir/$_NM_conf_dir"
"$__sed_discard_ignored_files")
+ if [[ -n "$_config_file" ]]; then
+ ddebug "$_config_file has already contained the znet config"
+ return
fi
- if [[ -z $NETTYPE || -z $SUBCHANNELS || -z $_options ]]; then
- exit 1
+ _config_file=$(LANG=C grep -E -i -l \
+
"^[[:space:]]*SUBCHANNELS=['\"]?([0-9]\.[0-9]\.[a-f0-9]+,){0,2}" \
+ /etc/sysconfig/network-scripts/ifcfg-* \
+ | LC_ALL=C sed -e "$__sed_discard_ignored_files")
+
+ if [[ -n "$_config_file" ]]; then
+ LANG=c grep 'SUBCHANNELS\|NETTYPE\|OPTIONS' "$_config_file"
> "$initdir/$_config_file"
+ else
+ _config_file=$(_find_znet_nmconnection "$_NM_conf_dir"
"$__sed_discard_ignored_files")
+ fi
+
+ if [[ -n "$_config_file" ]]; then
+ _uniq_name=$(cat /proc/sys/kernel/random/uuid)
+ nmcli connection clone --temporary "$_config_file"
"$_uniq_name"
+ nmcli connection modify --temporary "$_uniq_name"
connection.autoconnect false
+ inst
"/run/NetworkManager/system-connections/${_uniq_name}.nmconnection"
"${_NM_conf_dir}/${_uniq_name}.nmconnection"
+ nmcli connection del "$_uniq_name"
fi
- echo "rd.znet=${NETTYPE},${SUBCHANNELS},${_options}
rd.znet_ifname=$_netdev:${SUBCHANNELS}" >
"${initdir}/etc/cmdline.d/30znet.conf"
}
kdump_get_ip_route() {
@@ -410,8 +422,7 @@ kdump_get_remote_ip() {
# initramfs accessing giving destination
# $1: destination host
kdump_install_net() {
- local _destaddr _route _netdev _conpath _kdumpip
- local _znet_netdev _znet_conpath
+ local _destaddr _route _netdev _kdumpip
# each netowrk interface is managed by a NM connection profile
declare -A nmconnection_map
@@ -422,7 +433,6 @@ kdump_install_net() {
_destaddr=$(kdump_get_remote_ip "$1")
_route=$(kdump_get_ip_route "$_destaddr")
_netdev=$(kdump_get_ip_route_field "$_route" "dev")
- _conpath=$(get_nmcli_connection_apath_by_ifname "$_netdev")
if ! _kdumpip=$(ip addr show dev "$_netdev" | grep '[ ]*inet');
then
derror "Failed to get IP of $_netdev"
@@ -431,15 +441,6 @@ kdump_install_net() {
_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
- derror "Failed to set up znet"
- exit 1
- fi
- fi
echo -n > "/tmp/$$-netif_allowlist"
@@ -454,6 +455,7 @@ kdump_install_net() {
fi
kdump_copy_nmconnection_file "$_netdev"
+ [[ -n "$(find_online_znet_device)" ]] && kdump_setup_znet
kdump_install_nm_netif_allowlist
if [[ ! -f ${initdir}/etc/cmdline.d/50neednet.conf ]]; then
--
2.34.1