从 sysfs 读取返回 EINVAL

从 sysfs 读取返回 EINVAL
box101:~ # cat /sys/class/net/eno1/carrier
cat: /sys/class/net/eno1/carrier: Invalid argument

什么……?好的,那么怎么strace说呢?

...
open("/sys/class/net/eno1/carrier", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=4096, ...}) = 0
fadvise64(3, 0, 0, POSIX_FADV_SEQUENTIAL) = 0
read(3, 0x19c8000, 65536) = -1 EINVAL (Invalid argument)
...

那么让我说清楚......文件打开完美,但从中读取内容却出现错误?

更烦人的是,在 box103 上,完全相同的命令完美运作!在 box101 上,我可以读取该目录中的每个文件除了 carrier

谁能解释一下是什么地狱这是怎么回事?

答案1

硬件/驱动程序存在一些问题,如上所述这个LKML线。只引用回复邮件的一小部分:

原因是大多数驱动程序甚至不会探测链路或协商链路速度和流量控制,直到设备启动为止。为了节省电力,许多人甚至在设备关闭时不给 PHY 通电。

所以你观察到的行为完全是预料之中的。

即使您有链接(已连接电缆),它也会提示您-EINVAL错误。电源管理配置也可能在已插入并打开的接口上发出此错误。

mii-tool并且ethtool应该更可靠地为您提供有关以太网接口的链接状态的信息(也许ip l l)。

相关内容