/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 | 70 ++++++++++++++++++++++--------------------
1 file changed, 37 insertions(+), 33 deletions(-)
diff --git a/dracut-module-setup.sh b/dracut-module-setup.sh
index 1a8f55f..12b658a 100755
--- a/dracut-module-setup.sh
+++ b/dracut-module-setup.sh
@@ -434,34 +434,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 -s -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 -s -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" &> >(ddebug)
+ 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" &> >(ddebug)
fi
- echo "rd.znet=${NETTYPE},${SUBCHANNELS},${_options}
rd.znet_ifname=$_netdev:${SUBCHANNELS}" >
"${initdir}/etc/cmdline.d/30znet.conf"
}
kdump_get_remote_ip() {
@@ -482,7 +494,6 @@ kdump_get_remote_ip() {
# $1: destination host
kdump_install_net() {
local _destaddr _route _netdev
- local _znet_netdev _znet_conpath
# each netowrk interface is managed by a NM connection profile
declare -A nmconnection_map
@@ -495,15 +506,6 @@ kdump_install_net() {
_route=$(kdump_get_ip_route "$_destaddr")
_netdev=$(kdump_get_ip_route_field "$_route" "dev")
- _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
-
if kdump_is_bridge "$_netdev"; then
kdump_setup_bridge "$_netdev"
elif kdump_is_bond "$_netdev"; then
@@ -516,6 +518,8 @@ kdump_install_net() {
kdump_copy_nmconnection_file "$_netdev"
+ [[ -n "$(find_online_znet_device)" ]] && kdump_setup_znet
+
if [[ ! -f ${initdir}/etc/cmdline.d/50neednet.conf ]]; then
# network-manager module needs this parameter
echo "rd.neednet" >>
"${initdir}/etc/cmdline.d/50neednet.conf"
--
2.35.3