Why is the order of Ethernet nodes different between JP4.6 and JP5.1.2?

On my device, the Ethernet nodes in JP4.6 are:
eth0: nvethernet
eth1: igb i210

But in JP5.1.2, they are:
eth0: igb i210
eth1: nvethernet

Hi,
The deviation may be from different kernel version. JP4.6 is Kernel 4.9 and JP 5.1.2 is K5.10. The order of initializing driver may be different between the two versions.

Just to emphasize, those names are from what @DaneLLL mentions: Order of enumerating. There would be a learning curve, but you could perhaps use the udev system to change names. udev is typically used for things like customizing a USB device name, but it should work on the Ethernet devices. Whatever you read online regarding udev and Ubuntu device naming will apply to the Jetson (it isn’t an “NVIDIA thing” that renamed the devices).

I know how to set up udev, but could you provide tips on how to check or modify the kernel driver order of enumerating that you mentioned?

Thank you for your reply.

This is kind of a backwards way of describing this, but I cannot give an exact answer. What follows might be useful.

The Linux kernel is just a program, like many others. It does run on bare metal, but it isn’t that unusual in the sense that it inherits an environment, and it takes arguments when it runs. The Linux kernel starts out with only one purpose: To run one program. That program is “init”.

On Ubuntu (and many modern systems) init is a symbolic link to systemd. The user accessible method of talking to systemd is via the systemctl program. It is systemd (init), which has PID 1 (the kernel is PID 0). It is systemd that chooses the order to run various startup stages or steps.

systemd tries to make init somewhat more modular. Older init was just a bunch of bash scripts. To see what systemd thinks it is doing:
systemctl list-units

Each unit can be a target or requirement. The multi-user.target is the text-mode multi-user target. Just for kicks, filter for target:
systemctl list-units | grep -i target

One of those will list networking as a requirement. Check:
systemctl list-units | grep -i target | grep -i network

If you find the specific target which initializes the Ethernet, then you have what you want. Be careful though since you might find a PCI device unit as well, and that unit might change order if the network devices are PCI. I don’t know what systemd has as its order, but to directly change the order, you would have to change the correct unit (which udev is designed to do dynamically).

You might also note that files in “/etc/systemd/” are part of how systemd finds the order of accessing parts. Symbolic links are the usual method, and those point to standard versions of files. You could in fact copy the real file into the “/etc/systemd/” location, and then edit the copy. The system would then use your specs. Reverting would require changing back to the symbolic link of the unmodified file. It is “somewhat” safe to edit some of the files in “/etc/systemd/” as long as you are only editing a copy and not the original system file. It is Ubuntu that chose most of what is there.

You can of course enable and disable units. Logs could probably be used to figure out the order of units, but I have never tried (I only enable or disable, stop or start, which does not require editing files).

Overall, the side effect is that the order of enumerating in the kernel picks the number. init (systemd) presents the devices for enumeration, so you’d want to present the devices in a reverse order. Or use udev to edit after the fact.

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.