Sysfs

從 sysfs 讀取返回 EINVAL

  • March 18, 2015
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.

誰能解釋這裡到底發生了什麼?

如此 LKML執行緒中所述,硬體/驅動程序存在一些問題。引用回复郵件的一小部分:

原因是大多數驅動程序在設備啟動之前甚至不會探測連結或協商連結速度和流量控制。許多人甚至在設備關閉時不啟動 PHY,以節省電力。

所以你觀察到的行為是完全可以預料的。

即使您有連結(連接電纜),它也會提示您-EINVAL錯誤。電源管理配置也可能在已插入並啟動的介面上發出此錯誤。

mii-tool並且ethtool應該更可靠地為您提供有關乙太網介面的連結狀態的資訊(也許ip l l)。

引用自:https://unix.stackexchange.com/questions/190967