我见过 ip link 命令的一些示例,其中一些显示为
ip link add dev xxx type devtype
有时它的形式是
ip link add link xxx type devtype
我查看了文档,但仍然搞不清楚两者之间的区别。它们之间有区别吗?如果有区别,什么时候使用其中一种,什么时候使用另一种。
答案1
混淆是由语法中的缩写引起的。如果坚持使用完整语法,就不会产生混淆。
可选
dev
(和name
)关键字常用命令(不需要
link
)的完整语法是:ip link add name foo type bar ...
现在
name
是可选的,在许多情况下(不是全部,见下面的示例)可以与 互换dev
。一旦创建了接口,就可以使用以下命令进行设置:ip link set dev foo ...
再次强调,这里
dev
是可选的。只有当以下参数本身被视为关键字时,才需要name
或。因此,您可以创建一个名为的接口:dev
dev
ip link add name dev type dummy
并将其重命名为
up
(这里dev
和name
上面的作用不一样):ip link set dev dev name up
但最好避免这样的奇怪选择:
ip link set dev up name foo
当不存在语法歧义时,可以省略某些关键字。这里
dev
可以省略,因为接口名称与关键字不冲突:ip link set foo up
因此在大多数情况下,您不会在处理接口的命令中看到
dev
或name
。正如您所理解的,操作任意接口名称的脚本绝不会省略这些关键字,否则会遭遇意外失败。实际上,甚至命名设备也是可选的。如果在创建设备时没有命名,它通常会采用取决于类型的默认命名约定,通常是类型+编号,编号是下一个可用编号。例如:
ip link add type bridge
将创建一个名为的桥接接口,
bridge0
除非bridge0
已经存在,在这种情况下它将选择bridge1
或bridge2
等。使用
link
关键字对于在创建时与其他接口有关系的接口,有一个额外的关键字
link
来指定此类接口:这适用于 VLAN、macvlan ... 接口。因此,要创建此接口,除了新接口的选定名称外,还必须提供其他接口:ip link add link foo name bar type vlan id 10
可以再次
name
替换为dev
:ip link add link foo dev bar2 type vlan id 20
并且可以省略这两个名称,因为与当前使用的名称的语法没有歧义:
ip link add link foo mvlan0 type macvlan mode bridge
如前所述,如果你甚至不关心命名创建的接口,系统将自己选择一个名称:
ip link add link foo type macvlan
将创建一个链接到父接口的 macvlan 接口
foo
并命名它macvlan0
,或者如果该名称已经存在macvlan1
等。
最终使用起来还是有很大区别的:
ip link add link foo type macvlan
系统将选择与之链接的接口的名称foo
而不是:
ip link add dev foo type bridge
在这里创建一个名为 的接口foo
。类型很重要,在这里不能互换,但例如:
ip link add link foo type bridge
也可以工作,但会忽略不需要的参数link foo
并创建一个名为的桥接接口bridge1
。
任何可能发生的混淆都是由缩写引起的。如果保留完整的语法,就不会出现任何混淆。自动化脚本也应该这样做。
答案2
当我在debian10上运行该命令时
ip link add link foo type bridge
,它不会忽略不需要的参数,而是报告错误:
root@debian10:~# ip link add link foo type bridge
Cannot find device "foo"
因此该设备foo
必须存在于系统中,然后它将忽略不需要的参数(这里是link foo
),而不会出现任何错误报告