Bagaimana Anda memastikan antarmuka jaringan fisik selalu mendapatkan nama antarmuka yang sama di seluruh reboot pada sistem Linux yang tertanam?

13

Untuk sistem Linux tertanam, jika saya memiliki dua atau lebih antarmuka jaringan, bagaimana cara memastikan bahwa mereka selalu mendapatkan nama antarmuka yang sama setiap boot

Dengan kata lain, saya ingin, misalnya, eth0 untuk selalu memetakan ke satu port Ethernet fisik, eth1 ke yang berikutnya, dll.

"Distribusi" Linux saya adalah buatan sendiri, dan saya menggunakan devtmpfs untuk mengisi / dev. Saya menggunakan busybox untuk init (dan hampir semua yang lainnya), bersama dengan skrip init khusus untuk startup dan shutdown sistem.

Saya tidak memerlukan fasilitas hotplug dari mdev atau udev - saya mengacu pada port Ethernet "diperbaiki".

Patrick
sumber
Saya berasumsi akan ada beberapa cara untuk menentukan ini dalam file devicetree, tetapi saya belum dapat menemukan caranya.

Jawaban:

7

Ini berfungsi untuk saya dengan Linux 3.9.0 pada arsitektur x86_64.

#!/bin/sh

# This assumes the interfaces come up with default names of eth*.
# The interface names may not be correct at this point, however.
# This is just a way to get the PCI addresses of all the active
# interfaces.
PCIADDRLIST=
for dir in /sys/class/net/eth* ; do
  [ -e $dir/device ] && {
    PCIADDRLIST="`readlink -f $dir/device` ${PCIADDRLIST}"
  }
done

# Now assign the interface names from an ordered list that maps
# to the PCI addresses of each interface.

# IFNAMES could come from some config file.  "dummy" is needed because of
# my limited tr- and awk-fu.
IFNAMES="eth0 eth1 eth2 dummy"

for dir in `echo ${PCIADDRLIST} | tr " " "\n" | sort` ; do
  [ -e $dir/net/*/address ] && {
    MACADDR=`cat $dir/net/*/address`
    IFNAME=`echo $IFNAMES | awk '{print $1}'`
    IFNAMES=`echo $IFNAMES | awk '{ for (i=2; i<=NF; i++) printf "%s ", $i; }'`
    echo -n "$IFNAME "
    nameif $IFNAME mac=$MACADDR
  }
done
Patrick
sumber
2
Dari man nameif: "Program ini sudah usang. Untuk pemeriksaan penggantian ip link." Perhatikan juga bahwa jika sistem yang Anda gunakan tidak digunakan udev, strategi Anda akan cenderung gagal karena /sys/class/net/eth[whatever]mungkin tidak ada.
2

Anda menyebutkan bahwa Anda tidak perlu udev tetapi jika Anda tidak menentang untuk menginstalnya maka Anda mungkin ingin mempertimbangkan untuk menggunakan biosdevname . Ada halaman wiki yang bagus di freedesktop.org yang membahas masalah ini. Seperti disebutkan di halaman itu, jika Anda menggunakan udev versi 197 atau lebih tinggi maka Anda bahkan tidak perlu biosdevname karena udev sudah akan melakukan apa yang Anda butuhkan.

Olek Wojnar
sumber