Simplify setup_znet by copying connection profile to initrd

Resolves: bz2076416
Upstream: Fedora
Conflict: None

commit b5577c163a
Author: Coiby Xu <coxu@redhat.com>
Date:   Thu Sep 23 15:26:00 2021 +0800

    Simplify setup_znet by copying connection profile to initrd

    /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.

    With this implementation, there is also no need to check if znet is
    used beforehand.

    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 longer needed 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@redhat.com>
    Reviewed-by: Thomas Haller <thaller@redhat.com>
    Reviewed-by: Philipp Rudo <prudo@redhat.com>

Signed-off-by: Coiby Xu <coxu@redhat.com>
This commit is contained in:
Coiby Xu 2022-11-23 09:42:33 +08:00
parent 561952f12a
commit afbb32a83c

View File

@ -467,62 +467,48 @@ kdump_setup_vlan() {
_save_kdump_netifs "$_parent_netif" _save_kdump_netifs "$_parent_netif"
} }
# find online znet device _find_znet_nmconnection() {
# return ifname (_netdev) LANG=C grep -s -E -i -l \
# code reaped from the list_configured function of "^s390-subchannels=([0-9]\.[0-9]\.[a-f0-9]+;){0,2}" \
# https://github.com/hreinecke/s390-tools/blob/master/zconf/znetconf "$1"/*.nmconnection | LC_ALL=C sed -e "$2"
find_online_znet_device() {
local CCWGROUPBUS_DEVICEDIR="/sys/bus/ccwgroup/devices"
local NETWORK_DEVICES d ifname ONLINE
[[ ! -d $CCWGROUPBUS_DEVICEDIR ]] && return
NETWORK_DEVICES=$(find $CCWGROUPBUS_DEVICEDIR)
for d in $NETWORK_DEVICES; do
[[ ! -f "$d/online" ]] && continue
read -r ONLINE < "$d/online"
if [[ $ONLINE -ne 1 ]]; then
continue
fi
# determine interface name, if there (only for qeth and if
# device is online)
if [[ -f $d/if_name ]]; then
read -r ifname < "$d/if_name"
elif [[ -d $d/net ]]; then
ifname=$(ls "$d/net/")
fi
[[ -n $ifname ]] && break
done
echo -n "$ifname"
} }
# setup s390 znet cmdline # setup s390 znet
# $1: netdev (ifname) #
# $2: nmcli connection path # Note part of code is extracted from ccw_init provided by s390utils
kdump_setup_znet() { kdump_setup_znet() {
local _netdev="$1" local _config_file _unique_name _NM_conf_dir
local _conpath="$2" local __sed_discard_ignored_files='/\(~\|\.bak\|\.old\|\.orig\|\.rpmnew\|\.rpmorig\|\.rpmsave\)$/d'
local s390_prefix="802-3-ethernet.s390-"
local _options=""
local NETTYPE
local SUBCHANNELS
NETTYPE=$(get_nmcli_field_by_conpath "${s390_prefix}nettype" "$_conpath") if [[ "$(uname -m)" != "s390x" ]]; then
SUBCHANNELS=$(get_nmcli_field_by_conpath "${s390_prefix}subchannels" "$_conpath") return
_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
fi fi
if [[ -z $NETTYPE || -z $SUBCHANNELS || -z $_options ]]; then _NM_conf_dir="/etc/NetworkManager/system-connections"
exit 1
_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
_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 [[ -z "$_config_file" ]]; then
_config_file=$(_find_znet_nmconnection "$_NM_conf_dir" "$__sed_discard_ignored_files")
fi
if [[ -n "$_config_file" ]]; then
_unique_name=$(cat /proc/sys/kernel/random/uuid)
nmcli connection clone --temporary "$_config_file" "$_unique_name" &> >(ddebug)
nmcli connection modify --temporary "$_unique_name" connection.autoconnect false
inst "/run/NetworkManager/system-connections/${_unique_name}.nmconnection" "${_NM_conf_dir}/${_unique_name}.nmconnection"
nmcli connection del "$_unique_name" &> >(ddebug)
fi fi
echo "rd.znet=${NETTYPE},${SUBCHANNELS},${_options} rd.znet_ifname=$_netdev:${SUBCHANNELS}" > "${initdir}/etc/cmdline.d/30znet.conf"
} }
kdump_get_remote_ip() { kdump_get_remote_ip() {
@ -542,22 +528,12 @@ kdump_get_remote_ip() {
# $1: destination host # $1: destination host
kdump_collect_netif_usage() { kdump_collect_netif_usage() {
local _destaddr _srcaddr _route _netdev local _destaddr _srcaddr _route _netdev
local _znet_netdev _znet_conpath
_destaddr=$(kdump_get_remote_ip "$1") _destaddr=$(kdump_get_remote_ip "$1")
_route=$(kdump_get_ip_route "$_destaddr") _route=$(kdump_get_ip_route "$_destaddr")
_srcaddr=$(kdump_get_ip_route_field "$_route" "src") _srcaddr=$(kdump_get_ip_route_field "$_route" "src")
_netdev=$(kdump_get_ip_route_field "$_route" "dev") _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 if kdump_is_bridge "$_netdev"; then
kdump_setup_bridge "$_netdev" kdump_setup_bridge "$_netdev"
elif kdump_is_bond "$_netdev"; then elif kdump_is_bond "$_netdev"; then
@ -594,6 +570,7 @@ kdump_install_net() {
if [[ -n "$_netifs" ]]; then if [[ -n "$_netifs" ]]; then
kdump_install_nmconnections kdump_install_nmconnections
apply_nm_initrd_generator_timeouts apply_nm_initrd_generator_timeouts
kdump_setup_znet
kdump_install_nm_netif_allowlist "$_netifs" kdump_install_nm_netif_allowlist "$_netifs"
kdump_install_nic_driver "$_netifs" kdump_install_nic_driver "$_netifs"
fi fi