คุณจะมั่นใจได้อย่างไรว่าอินเตอร์เฟซเครือข่ายแบบฟิสิคัลจะได้รับชื่ออินเทอร์เฟซเดียวกันตลอดการบูตเครื่องใหม่บนระบบ Linux ที่ฝังอยู่?


13

สำหรับระบบ Linux ที่ฝังตัวหากฉันมีเครือข่ายสองอินเตอร์เฟสขึ้นไปฉันจะมั่นใจได้อย่างไรว่าพวกเขาจะได้รับชื่ออินเทอร์เฟซที่เหมือนกันทุกครั้งที่บูต

กล่าวอีกนัยหนึ่งฉันต้องการยกตัวอย่างเช่น eth0 เพื่อจับคู่กับพอร์ตอีเธอร์เน็ตจริงหนึ่งพอร์ต, eth1 ต่อไป ฯลฯ

Linux "การกระจาย" ของฉันเป็นแบบโฮมเมดและฉันใช้ devtmpfs สำหรับการใส่ข้อมูล / dev ฉันใช้ busybox สำหรับ init (และอื่น ๆ ส่วนใหญ่) พร้อมกับสคริปต์ init ที่กำหนดเองสำหรับการเริ่มต้นและปิดระบบ

ฉันไม่ต้องการสิ่งอำนวยความสะดวก hotplug ของ mdev หรือ udev - ฉันหมายถึงพอร์ตอีเธอร์เน็ต "คงที่"


ฉันคิดว่าจะมีวิธีการระบุสิ่งนี้ในไฟล์ devicetree แต่ฉันไม่สามารถหาวิธีได้

คำตอบ:


7

สิ่งนี้ใช้ได้กับฉันด้วย Linux 3.9.0 บนสถาปัตยกรรม 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

2
จากman nameif: "โปรแกรมนี้ล้าสมัยสำหรับการตรวจสอบการเปลี่ยนip link" นอกจากนี้ยังทราบว่าถ้าระบบที่คุณอยู่ในที่ไม่ใช้udevกลยุทธ์ของคุณจะมีแนวโน้มที่จะล้มเหลว/sys/class/net/eth[whatever]ไม่อาจมีอยู่

2

คุณบอกว่าคุณไม่จำเป็นต้อง udev แต่ถ้าคุณไม่ได้ต่อต้านการติดตั้งแล้วคุณอาจต้องการที่จะต้องพิจารณาใช้biosdevname มีหน้า wikiที่ยอดเยี่ยมบนfreedesktop.orgที่กล่าวถึงปัญหานี้ ดังที่บันทึกไว้ในหน้านั้นหากคุณใช้ udev เวอร์ชั่น 197 ขึ้นไปคุณไม่จำเป็นต้องใช้ biosdevname เพราะ udev จะทำสิ่งที่คุณต้องการอยู่แล้ว

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.