Linux之lshw工具及其网络部分
Linux之lshw工具及其网络部分
lshw工具
lshw: HardWare LiSter for Linux
lshw is a small tool to provide detailed information on the hardware configuration of the machine. It can report exact memory configuration, firmware version, mainboard configuration, CPU version and speed, cache configuration, bus speed, etc. on DMI-capable x86 or EFI (IA-64) systems and on some ARM and PowerPC machines (PowerMac G4 is known to work).
Information can be output in plain text, XML or HTML.
It currently supports DMI (x86 and EFI only), OpenFirmware device tree (PowerPC only), PCI/AGP, ISA PnP (x86), CPUID (x86), IDE/ATA/ATAPI, PCMCIA (only tested on x86), USB and SCSI.
lshw 是一个小工具,用于提供机器硬件配置的详细信息。它可以在支持DMI的x86系统或EFI(IA-64)系统上,以及一些ARM和PowerPC机器上(已知PowerMac G4可以使用)报告精确的内存配置、固件版本、主板配置、CPU版本和速度、缓存配置、总线速度等。
信息可以以纯文本、XML或HTML格式输出。
官网及源码:
lshw工具的网络部分
lshw工具的网络部分主要集中在src/core/network.cc
处理,主要函数为:scan_network()
,里面会通过各种ioctl
接口去获取网卡相关信息,配置及能力等。
大致输出如下:
$ sudo lshw -C network
*-network
description: Ethernet interface
product: RTL8111/8168/8211/8411 PCI Express Gigabit Ethernet Controller
vendor: Realtek Semiconductor Co., Ltd.
physical id: 0
bus info: pci@0000:03:00.0
logical name: enp3s0
version: 15
serial: 02:22:33:44:55:66
size: 1Gbit/s
capacity: 1Gbit/s
width: 64 bits
clock: 33MHz
capabilities: pm msi pciexpress msix vpd bus_master cap_list ethernet physical tp mii 10bt 10bt-fd 100bt 100bt-fd 1000bt-fd autonegotiation
configuration: autonegotiation=on broadcast=yes driver=r8169 duplex=full firmware=rtl8168h-2_0.0.2 02/26/15 ip=10.42.12.226 latency=0 link=yes multicast=yes port=MII speed=1Gbit/s
resources: irq:16 ioport:4000(size=256) memory:a0204000-a0204fff memory:a0200000-a0203fff
下面是scan_network()
的一些主要流程步骤和操作:
获取所有的网卡接口
load_interfaces
获取所有的网卡接口,主要是通过/proc/net/dev
文件获取。
创建套接字
创建一个使用IPv4协议族和UDP协议的数据报套接字,并将返回的文件描述符。这个是后续几乎所有ioctl
操作的基础。
int fd = socket(PF_INET, SOCK_DGRAM, 0);
获取IP地址
获取指定网络接口的 IP 地址。
int fd = socket(AF_INET, SOCK_DGRAM, 0);
if (ioctl(fd, SIOCGIFADDR, &ifr) == 0)
获取网络接口的标志
通过SIOCGIFFLAGS
命令获取, 接口标志描述了接口的状态和特性,例如接口是否处于启动状态、是否支持广播、是否是一个回环接口等。
if (ioctl(fd, SIOCGIFFLAGS, &ifr) == 0)
获取MAC地址
通过SIOCGIFHWADDR
命令获取, 获取网络接口的硬件地址(MAC 地址)
if (ioctl(fd, SIOCGIFHWADDR, &ifr) == 0)
获取无线网络接口名称
SIOCGIWNAME
命令获取, 获取无线扩展(Wireless Extensions)相关信息,这里主要是用于验证无线扩展的存在,判断是否为无线网卡。
if (ioctl(fd, SIOCGIWNAME, &buffer) == 0)
查询网络接口的链路状态
通过ethtool的请求代码ETHTOOL_GLINK
查询,检查网络接口是否处于链接状态(即是否有物理连接到网络,并且该连接是否有效)。
if (ioctl(fd, SIOCETHTOOL, &ifr) == 0) -> ETHTOOL_GLINK
扫描查询链路模式及接口当前配置
通过ethtool的请求代码ETHTOOL_GLINKSETTINGS
查询,用于获取网络接口的当前链路配置,如速度、双工模式、暂停帧(pause frame)设置、链路模式等更详细的链路配置信息。
if (ioctl(fd, SIOCETHTOOL, &ifr) == 0) ETHTOOL_GLINKSETTINGS
通过ethtool的请求代码ETHTOOL_GSET
查询,用于获取网络接口的当前设置。包括速度、双工模式、自动协商等参数。
if (ioctl(fd, SIOCETHTOOL, &ifr) == 0) ETHTOOL_GSET
获取光模块相关信息
通过ethtool的请求代码ETHTOOL_GMODULEINFO
获取,用于获取网络接口上光纤模块(如 SFP 或 QSFP)的信息。这包括模块的标识符、修订号、供应商信息等。
if (ioctl(fd, SIOCETHTOOL, &ifr) != 0) ETHTOOL_GMODULEINFO
通过ethtool的请求代码ETHTOOL_GMODULEEEPROM
获取,用于读取网络接口上光纤模块(如 SFP 或 QSFP)的 EEPROM 内容。EEPROM(电可擦可编程只读存储器)中通常存储了模块的详细标识信息、制造数据、序列号、以及电气和光学特性等。
if (ioctl(fd, SIOCETHTOOL, &ifr) != 0) ETHTOOL_GMODULEEEPROM
获取驱动程序信息
通过ethtool的请求代码ETHTOOL_GDRVINFO
获取,用于获取网络接口驱动程序的信息,包括驱动程序的名称、版本、固件版本以及总线信息等。
if (ioctl(fd, SIOCETHTOOL, &ifr) == 0) ETHTOOL_GDRVINFO