cat: read error: Operation not supported for /sys/class/net/eth0/phys_*
I customized the system using Kernel 6.4.0 and Busybox, but I don’t know why the three files starting with
phys_ cannot be accessed, and other files in the same folder can.
# pwd /sys/class/net/eth0 # ls addr_assign_type carrier_up_count gro_flush_timeout napi_defer_hard_irqs proto_down tx_queue_len addr_len dev_id ifalias netdev_group queues type address dev_port ifindex operstate speed uevent broadcast device iflink phys_port_id statistics carrier dormant link_mode phys_port_name subsystem carrier_changes duplex mtu phys_switch_id testing carrier_down_count flags name_assign_type power threaded # # # # cat dev_ dev_id dev_port # cat dev_port 0 # cat phys_port_id cat: read error: Operation not supported # # ls -lt dev_port -r--r--r-- 1 root root 4096 Oct 27 14:50 dev_port # ls -lt phys_port_id -r--r--r-- 1 root root 4096 Oct 27 15:36 phys_port_id
None of the files under
/sys are real – they are all representations of values maintained within the kernel.
A list of them under
/sys/class/net is available at https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-class-net
The relevant section for
phys_port_name is this:
What: /sys/class/net/<iface>/phys_port_id Date: July 2013 KernelVersion: 3.12 Contact: email@example.com Description: Indicates the interface unique physical port identifier within the NIC, as a string. What: /sys/class/net/<iface>/phys_port_name Date: March 2015 KernelVersion: 4.0 Contact: firstname.lastname@example.org Description: Indicates the interface physical port name within the NIC, as a string.
As described, these two values provide an identification for the physical port on a card with multiple ports (search for "4 port NIC", for example).
The contents of that
phys_port_id file is generated upon request (when a process reads it) by the
phys_port_id_show() function in the Linux kernel.
You can see that it returns
EOPNOTSUPP if the driver for the network interface doesn’t implement a
ndo_get_phys_port_id operation. If you look for
ndo_get_phys_port_id in the
drivers/net/ethernet directory, you’ll find that not many Ethernet drivers (Broadcom bnx2x, Intel i40e and a handful of others) implement it (probably because not many Ethernet hardware devices provide that information which as detailed by @ChrisDavies is only relevant for NICs with more than one port).
You can tell what driver drives your
eth0 ethernet device with:
ls -l /sys/class/net/eth0/device/driver if the
readlink applet is not enabled in your build of busybox.