我们如何在Linux上创建多个虚拟接口?


11

在Linux上创建伪以太网虚拟接口,我们首先使用以下命令初始化虚拟接口驱动程序: / sbin / modprobe dummy
然后,我们为上面刚刚初始化的虚拟驱动程序分配以太网接口别名。

但是它给出以下致命错误: FATAL:找不到模块虚拟。

另外,在路径 cd / sys / devices / virtual / net#处,我们可以看到存在以下名称的虚拟接口:
dummy0 / lo / sit0 / tunl0 /

ifconfig -a

dummy0:   Link encap:Ethernet  HWaddr aa:3a:a6:cd:91:2b    
          BROADCAST NOARP  MTU:1500  Metric:1  
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0  
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0   
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

lo:     Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0  
          inet6 addr: ::1/128 Scope:Host  
          UP LOOPBACK RUNNING  MTU:16436  Metric:1  
          RX packets:111 errors:0 dropped:0 overruns:0 frame:0  
          TX packets:111 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0   
          RX bytes:8303 (8.1 KiB)  TX bytes:8303 (8.1 KiB)

sit0:      Link encap:UNSPEC  HWaddr 00-00-00-00-FF-00-00-00-00-00-00-00-00-00-00-00    
          NOARP  MTU:1480  Metric:1  
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0  
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0   
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

tunl0:  Link encap:IPIP Tunnel  HWaddr   
          NOARP  MTU:1480  Metric:1  
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0  
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0   
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)  

因此,modprobe命令无法加载内核模块。
我们如何使用modprobe或insmod 加载内核模块以初始化虚拟接口驱动程序?
我们可以在单个加载的模块上创建多个虚拟接口吗?


当谈论以太网虚拟接口时,您不需要加载任何虚拟模块。您可以使用eth0:1,eth0:2等ifconfig命令创建它
。– supriady

您可以使用ifconfig命令在以太网虚拟接口上设置不同的IP地址,子网和网关。只需将其添加到rc.local并加载到引导中即可。您无需创建任何以太网虚拟接口配置文件。
supriady

1
@supriady我不是在问虚拟接口。我知道我们可以使用eth0:1之类的ifconfig将虚拟IP分配给接口,但是这里的Mac硬件地址对于创建的每个虚拟接口都是相同的。我的问题是如何创建多个虚拟接口,如上面显示的dummy0,其H / w Mac地址与实际接口不同。
库沙尔

可以肯定的是,您确实意识到从机器外部看不到这些接口,对吗?
朱莉·佩勒捷

请在问题的全部输出modprobeuname -r
Rui F Ribeiro

Answers:


13

添加几个虚拟接口的通常方法是使用iproute2

# ip link add dummy0 type dummy
# ip link add dummy1 type dummy
# ip link list
...
5: dummy0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 22:4e:84:26:c5:98 brd ff:ff:ff:ff:ff:ff
6: dummy1: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 9e:3e:48:b5:d5:1d brd ff:ff:ff:ff:ff:ff

但是错误消息FATAL:未找到模块哑元表示您可能具有未启用哑接口模块的内核,因此请确保检查内核配置,并在必要时重新编译内核。


“错误消息FATAL:未找到模块虚拟消息,表明您可能具有未启用虚拟接口模块的内核” =>否,这可能意味着虚拟驱动程序不是作为模块构建的,而是直接添加到内核中的。显然dummy0,OP的计算机上存在接口。除此之外,您的答案还可以。
xhienne

1
@xhienne取决于您的modprobe版本,但是kmod至少从推出的最新版本会了解内建函数。尝试一下。例如modprobe unixmodprobe -r unix
sourcejedi

7

要在启动时创建虚拟接口,建议添加到 /etc/modules

dummy

请注意dummy,默认情况下,该模块仅允许在内核4.4.x(要验证的正确版本)之前使用两个虚拟接口。

如果需要更多,还必须使用所需的虚拟接口数量创建一个/etc/modprobe.d/local/etc/modprobe.d/dummy.conf定义参数numdummies

options dummy numdummies=4 

根据@Feuermurmel注释,在较新的内核中,除了使用命令默认创建的两个虚拟接口外,还添加了更多虚拟接口:

sudo ip link add dummyX type dummy

至少在内核4.4.0中,可以使用添加其他虚拟接口ip link add dumdum type dummy
Feuermurmel

@Feuermurmel如果可以添加两个以上的代码,您是否有一个想法?
Rui F Ribeiro

确实可以。为自己测试:for i in {0..100}; do ip link add blubb-$i type dummy; done
Feuermurmel

@Feuermurmel好消息,谢谢。您可能希望将其添加为其他答案。IMO都是相关的,因为仍然有很多iOT设备卡在较低的内核版本中。
Rui F Ribeiro

出于好奇:这些设备一旦创建,是否在重启后保持不变,还是在每次系统启动后都必须重新创建它们?
Robidu
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.