Linux:获取"user-friendly"网络接口名称
Linux: Get "user-friendly" network interface name
我正在编写一个程序,用户应该 select 在 Linux 下的某些网络接口,如下所示:
Please select a network card:
1) enp2s0
2) wlan3
3) ppp2
到目前为止我没有问题。
但是,我希望用户看到更多 "descriptive" 名称,如下所示:
Please select a network card:
1) PCI Ethernet (enp2s0)
2) Wireless LAN (wlan3)
3) Dial-up connection (ppp2)
问题:
- Linux 是否知道网络接口的此类描述性名称?
- 如果是:我怎样才能得到这些名字?
- 如果没有:有没有办法从接口名中猜出用户友好的名字,可靠性相当高?
示例:"ppp*" => "Dial-up connection"; "wl*" => "Wireless network"
也许结合 /sys/class/net/.../type
? 中的代码
- 如果是:我在哪里可以找到可能的接口名称列表?
我知道 Gnome 桌面在网络状态下拉菜单中列出了像 "PCI Ethernet" 这样的网络接口名称。所以必须有一些方法来获取某个网络接口的 "descriptive" 名称。
这些是 systemd 使用的本机命名策略。使用旧的命名方式(eth0、wlan0、...),接口名称是不可预测的(例如,您的第一张 eth 卡可能使用 eth0 以外的名称),这导致了各种问题。新的命名标准根据以下之一为接口分配名称:
- 包含 Firmware/BIOS 的名称提供了机载设备的索引号(例如:eno1)
- 包含 Firmware/BIOS 的名称提供了 PCI Express 热插拔插槽索引号(例如:ens1)
- 包含 physical/geographical 硬件连接器位置的名称(例如:enp2s0)
- 包含接口的 MAC 地址的名称(示例:enx78e7d1ea46da)
- 经典的、不可预测的内核原生 ethX 命名(例如:eth0)
systemd 将从 1 开始,回落到 2,3,...
编辑:
我补充一下,如果你看了我发的link,你可以使用你自己的名字!
You create your own manual naming scheme, for example by naming your interfaces "internet0", "dmz0" or "lan0". For that create your own .link files in /etc/systemd/network/, that choose an explicit name or a better naming scheme for one, some, or all of your interfaces. See systemd.link(5) for more information.
Does Linux know "friendly" names for network interfaces at all?
没有
If no: Is there a way to guess the user-friendly name from the interface name with a quite high reliability?
您或许可以做出您所建议的概括。如果您使用的是基于 systemd
的系统,请查看 systemd net naming scheme,它显示了用于不同接口类型的前缀:
+--------+------------------------------------+
| Prefix | Description |
+--------+------------------------------------+
| en | Ethernet |
| ib | InfiniBand |
| sl | serial line IP (slip) |
| wl | Wireless local area network (WLAN) |
| ww | Wireless wide area network (WWAN |
+--------+------------------------------------+
Maybe in combination with the code from /sys/class/net/.../type?
我不确定 type
信息是否有用。例如,以太网和无线接口都显示 type
of 1
。另一方面,你可以积极地识别ppp接口,例如,使用这个值。
type
的可能值在 if_arp.h
中可用。
我正在编写一个程序,用户应该 select 在 Linux 下的某些网络接口,如下所示:
Please select a network card:
1) enp2s0
2) wlan3
3) ppp2
到目前为止我没有问题。
但是,我希望用户看到更多 "descriptive" 名称,如下所示:
Please select a network card:
1) PCI Ethernet (enp2s0)
2) Wireless LAN (wlan3)
3) Dial-up connection (ppp2)
问题:
- Linux 是否知道网络接口的此类描述性名称?
- 如果是:我怎样才能得到这些名字?
- 如果没有:有没有办法从接口名中猜出用户友好的名字,可靠性相当高?
示例:"ppp*" => "Dial-up connection"; "wl*" => "Wireless network"
也许结合/sys/class/net/.../type
? 中的代码
- 如果是:我在哪里可以找到可能的接口名称列表?
我知道 Gnome 桌面在网络状态下拉菜单中列出了像 "PCI Ethernet" 这样的网络接口名称。所以必须有一些方法来获取某个网络接口的 "descriptive" 名称。
这些是 systemd 使用的本机命名策略。使用旧的命名方式(eth0、wlan0、...),接口名称是不可预测的(例如,您的第一张 eth 卡可能使用 eth0 以外的名称),这导致了各种问题。新的命名标准根据以下之一为接口分配名称:
- 包含 Firmware/BIOS 的名称提供了机载设备的索引号(例如:eno1)
- 包含 Firmware/BIOS 的名称提供了 PCI Express 热插拔插槽索引号(例如:ens1)
- 包含 physical/geographical 硬件连接器位置的名称(例如:enp2s0)
- 包含接口的 MAC 地址的名称(示例:enx78e7d1ea46da)
- 经典的、不可预测的内核原生 ethX 命名(例如:eth0)
systemd 将从 1 开始,回落到 2,3,...
编辑:
我补充一下,如果你看了我发的link,你可以使用你自己的名字!
You create your own manual naming scheme, for example by naming your interfaces "internet0", "dmz0" or "lan0". For that create your own .link files in /etc/systemd/network/, that choose an explicit name or a better naming scheme for one, some, or all of your interfaces. See systemd.link(5) for more information.
Does Linux know "friendly" names for network interfaces at all?
没有
If no: Is there a way to guess the user-friendly name from the interface name with a quite high reliability?
您或许可以做出您所建议的概括。如果您使用的是基于 systemd
的系统,请查看 systemd net naming scheme,它显示了用于不同接口类型的前缀:
+--------+------------------------------------+
| Prefix | Description |
+--------+------------------------------------+
| en | Ethernet |
| ib | InfiniBand |
| sl | serial line IP (slip) |
| wl | Wireless local area network (WLAN) |
| ww | Wireless wide area network (WWAN |
+--------+------------------------------------+
Maybe in combination with the code from /sys/class/net/.../type?
我不确定 type
信息是否有用。例如,以太网和无线接口都显示 type
of 1
。另一方面,你可以积极地识别ppp接口,例如,使用这个值。
type
的可能值在 if_arp.h
中可用。