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
工具到现代的基于udev
或systemd-networkd
的规则配置,方法多种多样。不过,自系统d(systemd)成为许多Linux发行版的初始化系统和系统管理器以来,大多数现代Linux系统推荐使用systemd-networkd
或基于udev的规则来管理网络接口名称。
以下是一些常用的方法来更改Linux系统中的网卡名称:
1. 使用udev规则(推荐方法)
udev是Linux内核的一部分,用于管理设备节点的创建和删除。你可以通过编写udev规则来永久更改网络接口的名称。
确定你的网卡硬件信息:
使用ip link
或lspci | grep -i ethernet
(对于以太网)查看网卡信息。然后,使用ethtool -i [interface]
来获取更多关于接口的详细信息,比如bus-info
。编写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地址和你想设置的接口名称。重启udev服务或重启系统:
sudo udevadm control --reload-rules sudo udevadm trigger
或者简单地重启你的系统。
2. 使用nmcli
(NetworkManager的命令行界面)
如果你的系统使用NetworkManager,你可以使用nmcli
来重命名网络接口。但是,请注意,这种方法可能不是永久性的,因为NetworkManager可能会在下一次启动时重新应用其配置。
列出所有网络接口:
nmcli device status
重命名网络接口:
nmcli con mod [connection-name] connection.interface-name [new-name]
注意替换
[connection-name]
为当前的连接名称(不是设备名称),[new-name]
为你想要设置的新名称。重新加载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 规则,你需要:
确定网卡的硬件标识符:使用
lspci
、lsusb
(对于 USB 网卡)或ip link
命令查看系统上的网络接口和设备信息。你可能需要查找 MAC 地址、设备型号或总线信息来唯一标识你的网卡。编写 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
开头的名称,除非你的系统明确支持这一点(例如,通过预测性接口命名方案之外的配置)。重新加载 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的主要功能和特点包括:
动态设备管理:udev能够动态地创建和删除
/dev
目录下的设备文件,而无需重启系统。当内核检测到新设备时,udev会读取相应的规则文件,并根据规则来创建或修改设备文件。灵活的命名规则:udev允许用户通过编写规则文件来自定义设备文件的命名规则。这些规则可以基于设备的各种属性,如供应商ID、产品ID、序列号、总线类型等。
权限和所有权管理:udev规则还可以指定设备文件的权限和所有权,从而确保只有合适的用户或组能够访问这些设备。
环境变量和属性导出:udev可以将设备的属性导出为环境变量,供用户空间程序使用。这使得用户空间程序能够更容易地获取设备的详细信息。
udev的工作流程大致如下:
内核检测到新设备:当内核检测到新设备时,它会发送一个设备添加事件到udev守护进程。
udev守护进程接收事件:udev守护进程接收到设备添加事件后,会读取
/etc/udev/rules.d/
目录下的规则文件,并尝试匹配该设备的属性。规则匹配:udev会按照规则文件的顺序逐一匹配设备的属性。如果找到匹配的规则,udev会根据规则中的指令来创建或修改设备文件。
创建或修改设备文件:如果规则指定了创建设备文件,udev会在
/dev
目录下创建相应的设备文件,并根据规则设置其权限、所有权等属性。发送事件: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系统可能使用enp
、ens
等命名方案,具体取决于系统的配置。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 test
或udevadm 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-rules
和udevadm 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 test
或udevadm 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系统可能使用enp
、ens
等命名方案,具体取决于系统的配置。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规则中,您提供的规则片段用于在添加网络接口时,根据特定的条件来重命名该接口。这里,您使用了SUBSYSTEM
、ACTION
、DRIVERS
、ATTR{address}
、ATTR{type}
和KERNEL
等属性来匹配网络接口,如果所有条件都满足,则将接口重命名为eth0
。不过,有几个地方需要注意或可能需要调整:
DRIVERS==“?*”:这个条件通常用于匹配任何驱动程序。如果您的目的是不特别关心驱动程序,那么这个条件是可以的。但如果您想要针对特定的驱动程序,您应该替换
?*
为具体的驱动程序名称。ATTR{address} 和 ATTR{type}:这些条件分别用于匹配网络接口的MAC地址和类型。在您的情况下,它们被设置为
00:0c:29:cf:4b:cd
和1
。确保这些值与您想要匹配的接口的实际值相匹配。KERNEL=="eth"*:这个条件用于匹配内核中设备的名称,这里它匹配以
eth
开头的任何名称。这通常是为了确保规则只应用于以太网接口。然而,请注意,在现代Linux系统中,网络接口的名称可能不是由内核直接分配的(特别是在使用systemd-networkd或udev的预测性命名规则时),但这个条件仍然可以用于过滤出传统上被认为是“以太网”类型的接口。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
开头的设备名称。这通常用于匹配传统的以太网接口名称,如eth0
、eth1
等。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
命令来删除所有网络连接的示例方法。请注意,在运行这些命令之前,请确保你完全理解它们的含义,并且你确实想要删除所有网络连接。
方法一:使用nmcli
和bash
循环
你可以使用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
注意:这个脚本跳过了第一行(通常是标题行),并且假设所有的连接名称都不包含空格或特殊字符,这通常是对的,但并非总是如此。
方法二:使用grep
和xargs
另一个方法是使用grep
来过滤出连接名称,并使用xargs
来将它们作为参数传递给nmcli con delete
命令。
nmcli con show | grep -v "^NAME" | awk '{print $1}' | xargs -I {} nmcli con delete {}
这条命令的工作方式如下:
nmcli con show
:列出所有网络连接。grep -v "^NAME"
:排除标题行(假设标题行以"NAME"开头)。awk '{print $1}'
:打印每行的第一个字段,即连接名称。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
命令中的 {}
。