nmcli修改连接名 笔记240725

nmcli修改连接名

nmcli connection modify 原名 con-name 新名
nmcli connection modify UUID con-name 新名

通过网络名或uuid删除连接

nmcli connection delete 连接名或uuid

通过设备名删除连接

nmcli device disconnect 设备连接

nmcli device connect 设备名 创建的连接名和设备名一样,或者和原先的名称一样, 没法设置

nmcli device connect 设备名

nmcli connection add con-name 连接名 type 802-3-ethernet ifname 设备名 创建的连接可以指定连接名,

nmcli connection add con-name 连接名 type 802-3-ethernet ifname 设备名

type 802-3-ethernet 可简写为 type ethernet

nmcli connection add con-name 连接名 type ethernet ifname 设备名

先删除,再创建, 这种方式连同 /etc/NetworkManager/system-connections 对应的配置文件一并删除再创建, 配置文件名也变为新名

nmcli connection delete 原连接名
nmcli connection add    con-name 新连接名    type 802-3-ethernet     ifname 设备名

Linux 设置更改网卡名称

ip link set 只能暂时修改设备名
sudo ip link set dev eth0 name newname
###  dev可以省略
sudo ip link set eth0 name newname
修改或创建 /etc/udev/rules.d/70-persistent-net.rules 来永久修改设备名
vi /etc/udev/rules.d/70-persistent-net.rules

也可取名 xx.rules, 如80.rules , 80会覆盖70

vi /etc/udev/rules.d/80.rules

模板

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="修改这里的mac", ATTR{type}=="1",  NAME="eth0"

nmcli 修改连接名

nmcli connection modify 原名 con-name 新名
nmcli connection modify UUID con-name 新名

列出所有连接名称, 除了lo , 的多种写法

nmcli connection | awk 'NR>1 && !/lo/ {print$1}'
nmcli connection | awk 'NR>1 {if($1!="lo"){print$1}}'
nmcli connection | awk 'NR>1 {if($1 !~ /lo/){print$1}}'
nmcli connection | grep -v 'lo' |  awk 'NR>1 {print $1}'
删除所有连接 多种写法
nmcli connection delete $( nmcli connection | awk 'NR>1 && !/lo/ {print$1}' )
nmcli connection | grep -v 'lo' |  awk 'NR>1 {print $1}' | xargs nmcli connection delete
nmcli connection | grep -v 'lo' |  awk 'NR>1 {print $1}' | xargs -I {} nmcli connection delete {}

激活所有连接

nmcli device status | awk 'NR >1 && !/lo/ {print$1}' | xargs -I {} nmcli device connect {}
nmcli device status | awk 'NR >1 && !/lo/ {print$1}' | xargs -I xxx nmcli device connect xxx
nmcli device status | awk 'NR>1{if($1 != "lo")print$1}'  | xargs -I {} nmcli device connect {}

添加连接

nmcli connection add    con-name ens224    type 802-3-ethernet     ifname ens224

Linux 设置更改网卡名称

在Linux中,更改网卡名称(通常指的是网络接口名称,比如从eth0更改为ens33)可以通过多种方法实现,但主要依赖于你使用的发行版及其网络管理工具。从较旧的ifrename工具到现代的基于udevsystemd-networkd的规则配置,方法多种多样。不过,自系统d(systemd)成为许多Linux发行版的初始化系统和系统管理器以来,大多数现代Linux系统推荐使用systemd-networkd或基于udev的规则来管理网络接口名称。

以下是一些常用的方法来更改Linux系统中的网卡名称:

1. 使用udev规则(推荐方法)

udev是Linux内核的一部分,用于管理设备节点的创建和删除。你可以通过编写udev规则来永久更改网络接口的名称。

  1. 确定你的网卡硬件信息
    使用ip linklspci | grep -i ethernet(对于以太网)查看网卡信息。然后,使用ethtool -i [interface]来获取更多关于接口的详细信息,比如bus-info

  2. 编写udev规则
    /etc/udev/rules.d/目录下创建一个新的udev规则文件,比如70-persistent-net.rules(注意:文件名和编号可能因系统而异,但确保你的规则文件在其它网络相关的udev规则之后被处理)。

    编写规则以匹配你的网卡信息,并设置新的接口名称。例如:

    SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="你的网卡MAC地址", ATTR{dev_id}=="0x0", ATTR{type}=="1",  NAME="new_interface_name"
    

    注意替换你的网卡MAC地址new_interface_name为实际的MAC地址和你想设置的接口名称。

  3. 重启udev服务或重启系统

    sudo udevadm control --reload-rules
    sudo udevadm trigger
    

    或者简单地重启你的系统。

2. 使用nmcli(NetworkManager的命令行界面)

如果你的系统使用NetworkManager,你可以使用nmcli来重命名网络接口。但是,请注意,这种方法可能不是永久性的,因为NetworkManager可能会在下一次启动时重新应用其配置。

  1. 列出所有网络接口

    nmcli device status
    
  2. 重命名网络接口

    nmcli con mod [connection-name] connection.interface-name [new-name]
    

    注意替换[connection-name]为当前的连接名称(不是设备名称),[new-name]为你想要设置的新名称。

  3. 重新加载NetworkManager配置

    sudo systemctl restart NetworkManager
    

/etc/udev/rules.d/

/etc/udev/rules.d/ 目录在 Linux 系统中用于存放自定义的 udev 规则文件。udev 是一个设备管理器,它根据存储在 /etc/udev/rules.d/ 目录下的规则文件来管理 /dev 目录下的设备文件。这些规则文件决定了当内核检测到新设备时,如何为该设备创建或修改设备文件。

对于网络接口(网卡)的名称管理,虽然现代 Linux 系统通常使用 systemd-networkd 或 NetworkManager 来处理网络接口的配置,但 udev 规则仍然可以用来设置或更改网络接口的名称。然而,这种方法通常用于在系统启动时或设备首次被识别时确定接口名称,而不是在运行时更改它们。

要在 /etc/udev/rules.d/ 目录下创建用于更改网络接口名称的 udev 规则,你需要:

  1. 确定网卡的硬件标识符:使用 lspcilsusb(对于 USB 网卡)或 ip link 命令查看系统上的网络接口和设备信息。你可能需要查找 MAC 地址、设备型号或总线信息来唯一标识你的网卡。

  2. 编写 udev 规则:在 /etc/udev/rules.d/ 目录下创建一个新的规则文件(确保文件名以 .rules 结尾,并且文件名在数字上大于 70,以确保它在默认规则之后被处理)。在该文件中,编写一个规则来匹配你的网卡,并设置一个新的接口名称。例如:

    # 假设网卡的 MAC 地址是 00:1A:2B:3C:4D:5E
    SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="00:1a:2b:3c:4d:5e", NAME="eth_custom"
    

    注意:在实际使用中,MAC 地址应该完全匹配(包括大小写),但通常小写字母更为常见。此外,某些系统可能不允许将接口名称更改为以 eth 开头的名称,除非你的系统明确支持这一点(例如,通过预测性接口命名方案之外的配置)。

  3. 重新加载 udev 规则:创建或修改规则文件后,你需要重新加载 udev 规则以使更改生效。这可以通过运行 udevadm control --reload-rules 命令来完成,然后你可能需要触发 udev 事件来应用新规则,这可以通过 udevadm trigger 命令来完成,或者简单地重启系统。

然而,请注意,对于大多数现代 Linux 发行版来说,网络接口的名称通常是由 systemd-networkd 或 NetworkManager 根据预测性接口命名方案(如基于位置的命名 enpXsYfZ、基于 MAC 地址的命名 enx... 等)自动设置的。如果你想要更改这些名称,你可能需要调整 systemd-networkd 或 NetworkManager 的配置,而不是编写 udev 规则。

此外,如果你的系统使用 NetworkManager,并且你想要更改网络接口的名称,你可以考虑使用 NetworkManager 的命令行工具 nmcli 来实现这一点,但这通常涉及更改连接配置而不是网络接口本身的名称。对于永久更改,你可能需要编辑 NetworkManager 的配置文件(如 /etc/NetworkManager/system-connections/ 目录下的文件)。

Linux的udev

Linux中的udev(Userspace Device Enumeration)是一个设备管理器,它允许用户空间程序根据存储在/etc/udev/rules.d/目录下的规则文件来管理/dev目录下的设备文件。udev通过监听内核发出的设备添加或删除事件来动态地管理设备节点,这使得Linux系统能够更灵活、更高效地处理硬件设备。

udev的主要功能和特点包括:

  1. 动态设备管理:udev能够动态地创建和删除/dev目录下的设备文件,而无需重启系统。当内核检测到新设备时,udev会读取相应的规则文件,并根据规则来创建或修改设备文件。

  2. 灵活的命名规则:udev允许用户通过编写规则文件来自定义设备文件的命名规则。这些规则可以基于设备的各种属性,如供应商ID、产品ID、序列号、总线类型等。

  3. 权限和所有权管理:udev规则还可以指定设备文件的权限和所有权,从而确保只有合适的用户或组能够访问这些设备。

  4. 环境变量和属性导出:udev可以将设备的属性导出为环境变量,供用户空间程序使用。这使得用户空间程序能够更容易地获取设备的详细信息。

udev的工作流程大致如下:

  1. 内核检测到新设备:当内核检测到新设备时,它会发送一个设备添加事件到udev守护进程。

  2. udev守护进程接收事件:udev守护进程接收到设备添加事件后,会读取/etc/udev/rules.d/目录下的规则文件,并尝试匹配该设备的属性。

  3. 规则匹配:udev会按照规则文件的顺序逐一匹配设备的属性。如果找到匹配的规则,udev会根据规则中的指令来创建或修改设备文件。

  4. 创建或修改设备文件:如果规则指定了创建设备文件,udev会在/dev目录下创建相应的设备文件,并根据规则设置其权限、所有权等属性。

  5. 发送事件:udev还会发送一个设备准备就绪的事件到用户空间,通知其他程序该设备已经可用。

udev规则文件的编写:

udev规则文件通常包含一系列的行,每行都是一个规则。规则由多个键值对组成,它们之间用逗号分隔。规则文件的基本语法如下:

KEY="value", KEY="value", ... RUN+="program"

其中,KEY="value"部分用于匹配设备的属性,而RUN+="program"部分则指定了当规则匹配时要执行的程序或脚本。

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:cf:4b:cd", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

这行udev规则是用来在Linux系统中自动配置网络设备接口的。让我们一步步解析这个规则的含义:

  • SUBSYSTEM=="net": 这个条件指定了规则适用于哪个子系统。在这个例子中,它指定了规则仅适用于网络(net)子系统。这意呀着,当udev检测到与网络相关的设备事件时,这个规则才会被考虑。

  • ACTION=="add": 这个条件指定了规则应该在什么动作下触发。add表示当设备被添加到系统中时(例如,当网络接口卡(NIC)被物理插入或系统启动时识别到网络接口),这个规则会被执行。

  • DRIVERS=="?*": 这个条件用于匹配设备的驱动程序。?*是一个通配符,表示这个规则不特定于某个驱动程序,而是适用于所有驱动程序。然而,在实际应用中,如果可能的话,指定具体的驱动程序会更精确。

  • ATTR{address}=="00:0c:29:cf:4b:cd": 这个条件指定了设备的MAC地址。只有当设备的MAC地址与00:0c:29:cf:4b:cd完全匹配时,这个规则才会被应用。MAC地址是网络接口卡的唯一标识符。

  • ATTR{type}=="1": 这个条件指定了网络接口的类型。1通常表示以太网接口(Ethernet)。这有助于确保规则仅应用于以太网设备。

  • KERNEL=="eth*": 这个条件指定了内核设备名称的模式。eth*表示任何以eth开头的设备名称,这是传统上用于以太网接口的命名方式。然而,现代Linux系统可能使用enpens等命名方案,具体取决于系统的配置。

  • NAME="eth0": 这个动作指定了当规则匹配时,应该给设备分配的名称。在这个例子中,无论设备的原始名称是什么,只要它满足上述所有条件,它都将被重命名为eth0。这对于保持网络接口名称的一致性非常有用,尤其是在需要明确知道网络接口名称的脚本或配置文件中。

ACTION=="add", SUBSYSTEM=="net", DRIVERS=="?*", ATTR{type}=="1", PROGRAM="/lib/udev/rename_device", RESULT=="?*", NAME="$result"

这段udev规则是用来在系统检测到新的网络设备(如网卡)被添加时,执行一个特定的脚本来重命名这个设备。下面是对这段规则的详细解释:

  • ACTION=="add": 这表示当udev接收到一个设备添加(add)的事件时,这条规则才会被应用。

  • SUBSYSTEM=="net": 这指定了规则适用的子系统是“net”,即网络设备。

  • DRIVERS=="?*": 这里使用了通配符?*,意味着这条规则会匹配任何驱动程序的设备。但实际上,对于网络设备来说,这个条件可能并不是特别有用,因为网络设备的识别通常不依赖于驱动程序名称的精确匹配。不过,这里可能是为了保持规则的通用性或兼容性。

  • ATTR{type}=="1": 这指定了设备属性type必须等于1。在网络设备的上下文中,type属性可能指的是设备类型或某种特定的属性,但具体含义取决于设备及其驱动程序。不过,对于大多数现代Linux系统来说,这个条件可能不是必需的,因为udev已经能够很好地根据其他属性来识别网络设备。

  • PROGRAM="/lib/udev/rename_device": 这指定了当规则匹配时,udev应该执行的程序。在这个例子中,它指向了一个名为rename_device的脚本,该脚本位于/lib/udev/目录下。这个脚本的具体作用是重命名设备,但请注意,这个脚本是虚构的,实际的Linux发行版中可能并不包含这样的脚本。你需要自己编写这个脚本,或者指向一个已经存在的、能够执行重命名操作的脚本。

  • RESULT=="?*": 这个条件是用来捕获PROGRAM指定的脚本执行后的输出结果的。?*是一个通配符,意味着它会匹配脚本输出的任何内容。然而,这里有一个问题:udev的RESULT变量实际上并不直接支持从PROGRAM中捕获输出。通常,你会在脚本中直接设置设备名称,而不是通过RESULT变量。因此,这个条件可能是不准确的,或者是在某种特定上下文(如某个特定版本的udev或某个自定义的udev扩展)中使用的。

  • NAME="$result": 这指定了如果前面的条件都满足,那么设备的名称应该被设置为$result变量的值。但是,由于RESULT变量在标准的udev中并不用于捕获PROGRAM的输出,因此这里可能是一个错误或误解。在实际应用中,你可能需要在脚本中直接调用udevadm testudevadm info等工具来设置设备名称,或者通过修改/etc/udev/rules.d/中的规则文件来直接指定新的设备名称。

综上所述,这段udev规则试图在添加新网络设备时执行一个脚本来重命名该设备,但其中存在一些不准确或需要修改的地方。特别是RESULT=="?*"NAME="$result"部分,它们可能需要根据实际情况进行调整。

综上所述,这个udev规则的目的是在Linux系统中自动将具有特定MAC地址(00:0c:29:cf:4b:cd)和类型(以太网)的网络接口重命名为eth0。这对于确保网络接口名称的一致性非常有用,尤其是在需要明确知道网络接口名称的自动化脚本或配置文件中。

注意事项:

  • 编写udev规则时,需要确保规则文件的语法正确,并且规则之间的顺序符合你的需求。
  • 规则文件中的属性名称和值需要与实际设备的属性相匹配,否则规则将无法正确匹配设备。
  • 在修改udev规则后,通常需要重新加载udev规则或重启udev守护进程来使更改生效。这可以通过运行udevadm control --reload-rulesudevadm trigger命令来完成。

udev是Linux系统中非常重要的一部分,它使得设备管理变得更加灵活和高效。通过编写udev规则文件,用户可以自定义设备文件的命名规则、权限和所有权等属性,从而满足不同的使用需求。

是否所有Linux都使用udev

并非所有Linux都使用udev,但udev已成为许多现代Linux发行版的默认设备管理工具。udev是Linux 2.6内核引入的一个功能,它替代了早期的devfs,成为管理/dev目录下设备文件的主要方式。

udev的普及程度

  • 现代Linux发行版:大多数现代的Linux发行版,如Fedora、Ubuntu、Debian等,都默认使用udev作为设备管理器。
  • 旧版Linux:在一些较旧的Linux版本或特定的发行版中,可能仍然使用devfs或其他设备管理工具。然而,随着Linux内核的发展,这些旧工具已经被逐渐淘汰。

udev的优势

  • 动态管理:udev能够动态地创建和删除设备文件,而无需重启系统。这使得Linux系统能够更灵活地处理硬件设备的变化。
  • 灵活的命名规则:用户可以通过编写udev规则文件来自定义设备文件的命名规则,这些规则可以基于设备的各种属性,如供应商ID、产品ID、序列号等。
  • 权限和所有权管理:udev规则还可以指定设备文件的权限和所有权,从而确保只有合适的用户或组能够访问这些设备。

特殊情况

  • 嵌入式系统:在一些资源受限的嵌入式系统中,可能会使用更轻量级的设备管理工具来替代udev。
  • 特殊需求:某些特定的应用场景或需求可能要求使用特定的设备管理工具,而不是udev。

结论

虽然udev已成为许多现代Linux发行版的默认设备管理工具,但并不是所有Linux都使用udev。在选择设备管理工具时,Linux发行版会根据其目标用户群、系统资源、功能需求等因素进行综合考虑。然而,随着Linux内核和发行版的发展,udev的普及程度有望继续提高。




ACTION=="add", SUBSYSTEM=="net", DRIVERS=="?*", ATTR{type}=="1", PROGRAM="/lib/udev/rename_device", RESULT=="?*", NAME="$result" 的说明

ACTION=="add", SUBSYSTEM=="net", DRIVERS=="?*", ATTR{type}=="1", PROGRAM="/lib/udev/rename_device", RESULT=="?*", NAME="$result"

这段udev规则是用来在系统检测到新的网络设备(如网卡)被添加时,执行一个特定的脚本来重命名这个设备。下面是对这段规则的详细解释:

  • ACTION=="add": 这表示当udev接收到一个设备添加(add)的事件时,这条规则才会被应用。

  • SUBSYSTEM=="net": 这指定了规则适用的子系统是“net”,即网络设备。

  • DRIVERS=="?*": 这里使用了通配符?*,意味着这条规则会匹配任何驱动程序的设备。但实际上,对于网络设备来说,这个条件可能并不是特别有用,因为网络设备的识别通常不依赖于驱动程序名称的精确匹配。不过,这里可能是为了保持规则的通用性或兼容性。

  • ATTR{type}=="1": 这指定了设备属性type必须等于1。在网络设备的上下文中,type属性可能指的是设备类型或某种特定的属性,但具体含义取决于设备及其驱动程序。不过,对于大多数现代Linux系统来说,这个条件可能不是必需的,因为udev已经能够很好地根据其他属性来识别网络设备。

  • PROGRAM="/lib/udev/rename_device": 这指定了当规则匹配时,udev应该执行的程序。在这个例子中,它指向了一个名为rename_device的脚本,该脚本位于/lib/udev/目录下。这个脚本的具体作用是重命名设备,但请注意,这个脚本是虚构的,实际的Linux发行版中可能并不包含这样的脚本。你需要自己编写这个脚本,或者指向一个已经存在的、能够执行重命名操作的脚本。

  • RESULT=="?*": 这个条件是用来捕获PROGRAM指定的脚本执行后的输出结果的。?*是一个通配符,意味着它会匹配脚本输出的任何内容。然而,这里有一个问题:udev的RESULT变量实际上并不直接支持从PROGRAM中捕获输出。通常,你会在脚本中直接设置设备名称,而不是通过RESULT变量。因此,这个条件可能是不准确的,或者是在某种特定上下文(如某个特定版本的udev或某个自定义的udev扩展)中使用的。

  • NAME="$result": 这指定了如果前面的条件都满足,那么设备的名称应该被设置为$result变量的值。但是,由于RESULT变量在标准的udev中并不用于捕获PROGRAM的输出,因此这里可能是一个错误或误解。在实际应用中,你可能需要在脚本中直接调用udevadm testudevadm info等工具来设置设备名称,或者通过修改/etc/udev/rules.d/中的规则文件来直接指定新的设备名称。

综上所述,这段udev规则试图在添加新网络设备时执行一个脚本来重命名该设备,但其中存在一些不准确或需要修改的地方。特别是RESULT=="?*"NAME="$result"部分,它们可能需要根据实际情况进行调整。




SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:cf:4b:cd", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0" 说明

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:cf:4b:cd", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

这行udev规则是用来在Linux系统中自动配置网络设备接口的。让我们一步步解析这个规则的含义:

  • SUBSYSTEM=="net": 这个条件指定了规则适用于哪个子系统。在这个例子中,它指定了规则仅适用于网络(net)子系统。这意呀着,当udev检测到与网络相关的设备事件时,这个规则才会被考虑。

  • ACTION=="add": 这个条件指定了规则应该在什么动作下触发。add表示当设备被添加到系统中时(例如,当网络接口卡(NIC)被物理插入或系统启动时识别到网络接口),这个规则会被执行。

  • DRIVERS=="?*": 这个条件用于匹配设备的驱动程序。?*是一个通配符,表示这个规则不特定于某个驱动程序,而是适用于所有驱动程序。然而,在实际应用中,如果可能的话,指定具体的驱动程序会更精确。

  • ATTR{address}=="00:0c:29:cf:4b:cd": 这个条件指定了设备的MAC地址。只有当设备的MAC地址与00:0c:29:cf:4b:cd完全匹配时,这个规则才会被应用。MAC地址是网络接口卡的唯一标识符。

  • ATTR{type}=="1": 这个条件指定了网络接口的类型。1通常表示以太网接口(Ethernet)。这有助于确保规则仅应用于以太网设备。

  • KERNEL=="eth*": 这个条件指定了内核设备名称的模式。eth*表示任何以eth开头的设备名称,这是传统上用于以太网接口的命名方式。然而,现代Linux系统可能使用enpens等命名方案,具体取决于系统的配置。

  • NAME="eth0": 这个动作指定了当规则匹配时,应该给设备分配的名称。在这个例子中,无论设备的原始名称是什么,只要它满足上述所有条件,它都将被重命名为eth0。这对于保持网络接口名称的一致性非常有用,尤其是在需要明确知道网络接口名称的脚本或配置文件中。




ACTION=="add", SUBSYSTEM=="net", NAME=="", DRIVERS=="ibmveth", PROGRAM="/bin/sh -ec 'D=$${DEVPATH#*/vio/}; D=$${D%%%%/*}; D=$${D#????}; D=$${D#0}; D=$${D#0}; D=$${D#0}; D=$${D#0}; echo $${D:-0}'", NAME="ibmveth$result" 说明

ACTION=="add", SUBSYSTEM=="net", NAME=="", DRIVERS=="ibmveth", PROGRAM="/bin/sh -ec 'D=$${DEVPATH#*/vio/}; D=$${D%%%%/*}; D=$${D#????}; D=$${D#0}; D=$${D#0}; D=$${D#0}; D=$${D#0}; echo $${D:-0}'", NAME="ibmveth$result"

这段udev规则是针对IBM Power系列服务器上的ibmveth网络接口卡(NIC)设计的,用于在设备添加时自动重命名网络接口。让我们逐步解析这段规则:

  • ACTION=="add": 这表示当udev接收到一个设备添加(add)的事件时,这条规则才会被触发。

  • SUBSYSTEM=="net": 指定了规则适用的子系统是“net”,即网络设备。

  • NAME=="": 这个条件通常用于确保在udev尝试设置设备名称之前,该设备还没有被赋予名称。然而,在某些情况下,这个条件可能是多余的,因为udev通常会在应用规则之前清除设备名称。但在这里,它可能是为了确保只有在设备当前没有名称时才会应用这条规则。

  • DRIVERS=="ibmveth": 指定了规则仅适用于驱动程序为ibmveth的设备。ibmveth是IBM Power系列服务器上用于虚拟化环境(如LPARs和虚拟机)的网络接口驱动程序。

  • PROGRAM="/bin/sh -ec '...': 这是规则的核心部分,它指定了一个要执行的shell命令。这个命令通过一系列shell参数扩展和字符串操作来生成一个新的设备名称。具体步骤如下:

    • D=$${DEVPATH#*/vio/};:从DEVPATH环境变量(表示设备在udev设备树中的路径)中移除开头的*/vio/部分。DEVPATH是udev用来唯一标识设备的路径。
    • 接下来的几行D=$${D%%%%/*}; D=$${D#????};等是对D变量进行进一步的字符串处理,目的是从路径中提取出用于命名网络接口的部分。这些操作包括移除路径的末尾部分(可能是设备实例号或其他标识符),以及从剩余部分中移除前导的字符(这里用????表示,但实际上可能是基于ibmveth设备路径的具体结构来确定的)。
    • echo $${D:-0}'":最后,使用echo命令输出处理后的字符串D,如果D为空,则默认为0。这个输出将被用作设备的新名称。
  • NAME="ibmveth$result": 这里,$result变量应该捕获PROGRAM命令的输出。但是,请注意,udev规则中的PROGRAM并不直接设置$result变量。相反,udev会捕获PROGRAM命令的标准输出,并将其存储在内部,然后可以在规则的其他部分(如NAME赋值)中通过%k(对于内核名称)或%E{key}(对于环境变量)等占位符来引用。然而,在这个例子中,$result的使用可能是不准确的,因为udev没有这样的内置变量。正确的做法可能是直接使用%c(对于PROGRAM命令的输出,但并非所有udev版本都支持)或者通过某种方式将输出保存到环境变量中,并在NAME赋值时引用该环境变量。

然而,由于udev的复杂性,以及不同Linux发行版和udev版本之间的差异,上述规则中的$result部分可能无法按预期工作。一个更可靠的方法是使用udev的内置功能来捕获PROGRAM命令的输出,并直接在NAME赋值中引用它。但是,由于udev的限制,这可能需要一些创造性的解决方案,比如将输出写入一个临时文件,然后在udev规则中读取该文件的内容。

不过,对于大多数情况,你可能不需要如此复杂的脚本来生成设备名称。通常,简单的udev规则就足以根据设备的某些属性(如序列号、MAC地址或设备路径的一部分)来设置唯一的名称。在这个例子中,如果ibmveth设备的路径中包含足够的信息来唯一标识每个接口,那么你可以直接修改PROGRAM命令来提取这些信息,并将其用作设备名称的一部分。




SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:cf:4b:cd", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0" 说明

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:cf:4b:cd", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

在udev规则中,您提供的规则片段用于在添加网络接口时,根据特定的条件来重命名该接口。这里,您使用了SUBSYSTEMACTIONDRIVERSATTR{address}ATTR{type}KERNEL等属性来匹配网络接口,如果所有条件都满足,则将接口重命名为eth0。不过,有几个地方需要注意或可能需要调整:

  1. DRIVERS==“?*”:这个条件通常用于匹配任何驱动程序。如果您的目的是不特别关心驱动程序,那么这个条件是可以的。但如果您想要针对特定的驱动程序,您应该替换?*为具体的驱动程序名称。

  2. ATTR{address}ATTR{type}:这些条件分别用于匹配网络接口的MAC地址和类型。在您的情况下,它们被设置为00:0c:29:cf:4b:cd1。确保这些值与您想要匹配的接口的实际值相匹配。

  3. KERNEL=="eth"*:这个条件用于匹配内核中设备的名称,这里它匹配以eth开头的任何名称。这通常是为了确保规则只应用于以太网接口。然而,请注意,在现代Linux系统中,网络接口的名称可能不是由内核直接分配的(特别是在使用systemd-networkd或udev的预测性命名规则时),但这个条件仍然可以用于过滤出传统上被认为是“以太网”类型的接口。

  4. NAME=“eth0”:这是udev规则中用于设置设备名称的部分。如果前面的所有条件都满足,该接口将被重命名为eth0

完整的udev规则可能看起来像这样(注意,我已经移除了不必要的空格和格式化以符合通常的udev规则风格):

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:cf:4b:cd", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

确保将此规则添加到udev规则文件中,这些文件通常位于/etc/udev/rules.d/目录下,并且以.rules作为文件扩展名。您可能还需要重新加载udev规则或重启系统来使更改生效。

另外,请注意,如果系统使用了systemd的预测性命名规则或其他网络接口命名机制,那么直接通过udev规则来重命名接口可能不起作用,或者可能需要在系统启动时通过其他方式(如systemd服务或启动脚本)来重置接口名称。然而,在大多数基于Debian和Red Hat的Linux发行版中,传统的udev命名方法仍然有效,只要没有启用预测性命名。




SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="<网卡的MAC地址>", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="newname" 说明

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="<网卡的MAC地址>", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="newname"

这条udev规则是用来在Linux系统中自动识别和重命名网络接口的。下面是对这条规则的详细解释:

  • SUBSYSTEM=="net": 指定这条规则适用于net子系统,即这条规则将应用于网络设备相关的事件。

  • ACTION=="add": 指定这条规则仅在设备被添加(即插入或启动)到系统时触发。

  • DRIVERS=="?*": 这里使用?*作为通配符,意味着这条规则不特定于某个驱动程序。它适用于所有驱动程序。然而,在实际情况中,你可能想指定具体的驱动程序以更精确地控制规则的应用。

  • ATTR{address}=="<网卡的MAC地址>": 这里需要你将<网卡的MAC地址>替换为具体的MAC地址。这条规则会检查网络设备的MAC地址是否匹配指定的值。MAC地址是网络接口的唯一标识符,用于网络通信。

  • ATTR{dev_id}=="0x0": 指定设备的设备ID。然而,通常设备ID是用来唯一标识设备的,但在网络设备的上下文中,它可能不是必须的或者不是唯一的。这个值可能需要根据实际情况进行调整或移除。

  • ATTR{type}=="1": 指定设备类型。对于网络设备来说,type=1通常表示以太网设备。

  • KERNEL=="eth*": 指定内核识别的设备名称。eth*是一个通配符,表示所有以eth开头的设备名称。这通常用于匹配传统的以太网接口名称,如eth0eth1等。

  • NAME="newname": 这是规则的动作部分,它将匹配的设备重命名为newname。你需要将newname替换为你希望赋予网络接口的新名称。

综上所述,这条udev规则的目的是在Linux系统中自动识别和重命名一个具有特定MAC地址的以太网设备为newname。请注意,在实际应用中,你可能需要根据你的系统环境和具体需求调整这条规则。

另外,要使这条规则生效,你需要将其添加到udev的规则文件中,通常位于/etc/udev/rules.d/目录下。然后,你可能需要重启udev服务或重新加载udev规则(使用udevadm control --reload-rules命令),以及重新加载网络接口(例如,通过重启网络服务或使用ip link set <原接口名> down; ip link set <原接口名> name <新接口名>; ip link set <新接口名> up命令)来应用这个更改。










nmcli 删除所有连接

在使用nmcli(NetworkManager的命令行界面)时,直接删除所有网络连接的命令并不直接存在,因为nmcli没有提供一个直接的命令来一次性删除所有连接。但是,你可以通过一些脚本或命令组合来实现这个目的。

下面是一个使用bash脚本和nmcli命令来删除所有网络连接的示例方法。请注意,在运行这些命令之前,请确保你完全理解它们的含义,并且你确实想要删除所有网络连接。

方法一:使用nmclibash循环

你可以使用nmcli con show命令列出所有连接,然后通过循环和nmcli con delete命令来删除它们。

#!/bin/bash

# 列出所有网络连接并删除它们
connections=$(nmcli con show | awk 'NR>1 {print $1}')
for con in $connections; do
    nmcli con delete "$con"
done

注意:这个脚本跳过了第一行(通常是标题行),并且假设所有的连接名称都不包含空格或特殊字符,这通常是对的,但并非总是如此。

方法二:使用grepxargs

另一个方法是使用grep来过滤出连接名称,并使用xargs来将它们作为参数传递给nmcli con delete命令。

nmcli con show | grep -v "^NAME" | awk '{print $1}' | xargs -I {} nmcli con delete {}

这条命令的工作方式如下:

  1. nmcli con show:列出所有网络连接。
  2. grep -v "^NAME":排除标题行(假设标题行以"NAME"开头)。
  3. awk '{print $1}':打印每行的第一个字段,即连接名称。
  4. xargs -I {} nmcli con delete {}:将前面的输出作为参数传递给nmcli con delete命令,-I {}是一个替换字符串,用于在nmcli con delete命令中插入每个连接名称。

注意

  • 在执行这些操作之前,请确保你已经保存了所有重要连接的配置,因为一旦删除,这些配置将不可恢复(除非你有备份)。
  • 如果你不确定哪些连接是重要的,或者你不确定这些命令的效果,请先在一个测试环境中尝试它们。
  • 在某些系统上,你可能需要sudo权限来删除网络连接。如果是这样,请在命令前加上sudo

xargs的大括号{}

xargs 命令是一个强大的命令行工具,它可以将标准输入(stdin)数据转换成命令行参数。xargs 在处理来自管道(pipe)或文件的数据时特别有用,尤其是当这些数据需要作为其他命令的参数时。

然而,在直接讨论 xargs 的大括号 {} 时,我们实际上可能是在混淆了 xargs 和另一个常用的命令行工具——find 命令与 -exec 选项结合使用时的 {} 占位符,或者是在讨论 xargs-I 选项(在某些版本的 xargs 中是 -i)结合使用时自定义的替换字符串。

find 命令的 {}

find 命令中,{} 是一个特殊的字符串,它代表了 find 命令找到的每个文件名。当与 -exec 选项一起使用时,{} 被用来在 -exec 指定的命令中插入这些文件名。例如:

find . -name "*.txt" -exec echo {} \;

这个命令会查找当前目录及其子目录下所有扩展名为 .txt 的文件,并对每个找到的文件执行 echo 命令,打印出文件名。

xargs 的 -I 选项

虽然 xargs 本身不使用 {} 作为内置占位符,但它允许你通过 -I(或 -i,在某些实现中)选项指定一个自定义的替换字符串。这个字符串将在 xargs 从标准输入读取的每个项目出现时被替换。例如:

echo -e "file1.txt\nfile2.txt" | xargs -I {} echo Processing {}

这个命令会输出:

Processing file1.txt
Processing file2.txt

在这里,{} 被用作替换字符串,xargs 会将每个从标准输入读取的行替换为 {},然后执行指定的命令(在这个例子中是 echo Processing {})。

总结

因此,当你看到大括号 {}xargs 一起使用时,很可能是因为 xargs 被用来处理由其他命令(如 find)生成的数据,并且 {} 实际上是在那个生成数据的命令中使用的。或者,xargs 正在使用 -I 选项来指定一个自定义的替换字符串,该字符串在功能上类似于 find 命令中的 {}







  • 13
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kfepiza

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值