การตั้งชื่อมาตรฐานการประชุมสำหรับอีเธอร์เน็ตและอินเตอร์เฟซ Wi-Fi บนเครื่อง Linux


12

อะไรคือมาตรฐานการตั้งชื่อสำหรับการเชื่อมต่อ Ethernet และ Wi-Fiบนเครื่อง Linux?

เรากำลังพัฒนาเครื่องมือที่ควรแสดงเฉพาะอินเทอร์เฟซ Ethernet และ Wi-Fi ของเครื่อง Linux และสถานะปัจจุบัน

ตัวอย่างเช่นด้านล่างคือรายการของอินเทอร์เฟซเครือข่าย (ทั้งแบบกายภาพและเสมือน) บนเครื่อง Linux (Ubuntu) ของฉัน:

docker0, enp0s25, lo,wlp3s0

เมื่อฉันเรียกใช้เครื่องมือด้านล่างเป็นผลลัพธ์ที่ฉันได้รับ:

enp0s25, wlp3s0

เราได้เขียนโค้ดด้วยตรรกะที่อินเตอร์เฟส Ethernet ทั้งหมดเริ่มต้นด้วยตัวอักษรeและอินเตอร์เฟส Wi-Fi เริ่มต้นด้วยตัวอักษรwเสมอ

ตรรกะนั้นถูกต้องหรือไม่ ถ้าไม่เราจะจัดการเรื่องนี้ได้อย่างไร


เกี่ยวข้อง: unix.stackexchange.com/a/179931/117549
Jeff Schaller

ฉันจะดูว่าiwconfigจะกรองการเชื่อมต่อ WiFi จากคนอื่น ๆ ได้อย่างไร
Patrick Mevzek

1
มีเหตุผลไหมทำไมคุณไม่ลองมองอย่าง lshw? ตรวจสอบเนื้อหาของlshw -class networkบางทีโดยเฉพาะ? มองหาทุกอย่างที่เป็นcapabilities: ethernet physical? อาจมองหาความสามารถอื่น ๆ ด้วยบ้างไหม?
Zoredache

หากต้องการจัดการกับความท้าทายของเฟรมที่ยกมาโดย @dirkt คำถามที่ดีกว่านั้นก็คือ: "ฉันจะรับประเภทของอินเทอร์เฟซเครือข่ายบน Linux (หรือ macOS หรืออื่น ๆ ... ) ได้อย่างไร"
Roger Lipscombe

คำตอบ:


40

อินเตอร์เฟสเครือข่ายสามารถตั้งชื่ออะไรก็ได้ดังนั้นไม่ว่าคุณจะทำอะไรคุณจะพบกับสถานการณ์ที่ (1) มีอินเตอร์เฟซเครือข่าย "ทางกายภาพ" ที่มีชื่อที่ไม่ตรงกับรูปแบบของคุณหรือ (2) มี อินเตอร์เฟสเครือข่าย "ทางกายภาพ" ที่จะตรงกับรูปแบบของคุณ

ยิ่งไปกว่านั้นถ้าฉันเป็นผู้ใช้เครื่องมือของคุณช่วงเวลาที่เครื่องมือของคุณไม่อนุญาตให้ฉันทำบางสิ่งที่ฉันต้องการเพราะฉันมีส่วนต่อประสานเครือข่ายที่ "เสมือน" แต่ควรพิจารณาถึงการใช้งานจริง " ทางกายภาพ "ในการตั้งค่าของฉันฉันจะเริ่มสาปแช่งเสียงดังและแรงที่แอพของคุณและจะไม่ใช้มันอีกเลย

อินเทอร์เฟซเครือข่ายทางกายภาพและเสมือนทั้งหมดใช้ API ร่วมกันเป็นสิ่งหนึ่งที่ทำให้ Linux มีความยืดหยุ่นจริงๆ โปรดอย่าพยายามดูแลผู้ใช้ของคุณและนำสิ่งนั้นออกจากเขาหรือเธอ ผู้ใช้ของคุณจะขอบคุณ


11
คุณยังไม่ได้ตอบคำถามจริงๆ คุณใช้เวลา 3 ย่อหน้าเพื่อท้าทายบริบทเบื้องหลังของคำถาม ในขณะที่ฉันรู้ว่าคำตอบการท้าทายกรอบเป็นสิ่งที่ไม่รู้สึกเหมือนหนึ่งในกรณีเหล่านี้ ... โดยเฉพาะอย่างยิ่งเนื่องจากผู้ใช้ 4556274 ให้คำตอบสั้น ๆ สำหรับคำถามตามที่ถาม
Mike Ounsworth

18
@MikeOunsworth: ปัญหาคือว่าคำตอบของผู้ใช้ 4556274 ไม่สามารถใช้งานได้ในกรณีทั่วไปมันจะทำงานได้ก็ต่อเมื่อชื่ออินเทอร์เฟซเป็นชื่ออินเตอร์เฟสที่คาดเดาได้จริง ๆ ซึ่งง่าย ๆip link set ... name ...สามารถเปลี่ยนแปลงได้ และใช่ฉันสามารถระบุชื่อส่วนต่อประสานที่คาดเดาได้ด้วยตัวเอง คำตอบสำหรับคำถามเดิมคือ "โปรดอย่าทำอย่างนั้น" เพราะไม่ว่าคุณจะไปทางไหนมันก็ไม่ทำงาน
dirkt

@ fpmurphy1 ไม่ฉันคิดว่าเขาหมายถึงชื่ออินเทอร์เฟซที่คาดเดาได้ ไม่สำคัญว่าจะเป็น systemd แบบดั้งเดิม (ethN) การประชุมเฉพาะของ บริษัท ของคุณหรือมาตรฐานอื่น ๆ ที่ทำให้ชื่อสามารถคาดเดาได้
slebetman

12
@ MikeOunsworth: คำตอบอยู่ในอนุประโยคแรกของประโยคแรกของย่อหน้าแรก: "อินเตอร์เฟสเครือข่ายสามารถตั้งชื่ออะไรก็ได้ [... ]" ดังนั้นสิ่งที่ OP ถามถึงเป็นไปไม่ได้และไม่สามารถทำได้ . คุณไม่สามารถตรวจสอบประเภทของอินเทอร์เฟซเครือข่ายตามมาตรฐานการประชุมการตั้งชื่อเพราะไม่มีมาตรฐานการประชุมการตั้งชื่อและทุกคนสามารถตั้งชื่ออินเตอร์เฟสใด ๆ ที่พวกเขาต้องการ ยกตัวอย่างเช่นเราเตอร์ลินุกซ์เก่าของฉันฉันมุ่งหน้าสติกเกอร์สีบนหลังและอินเตอร์เฟซอีเธอร์เน็ตทางกายภาพถูกตั้งชื่อred, และblue green
Jörg W Mittag

1
@ JörgWMittagแน่นอนว่าคุณสามารถตรวจจับพวกมันได้ตามมาตรฐานหากคุณรู้ว่ามีการใช้มาตรฐาน (และคุณคาดหวังว่าคนที่ส่งออกข้อมูลนั้นจะเป็นชื่อนั้นในตอนแรก) เรารู้ว่าsystemd มีมาตรฐานสำหรับการตั้งชื่ออินเตอร์เฟสเครือข่ายดังนั้นจึงไม่มีประโยชน์ที่จะบอกว่าไม่มีอยู่
ilkkachu

27

สำหรับชื่ออินเตอร์เฟสที่คาดเดาได้ของ systemd คำนำหน้าสามารถเห็นได้ในudev-builtin-net_id.c:

* Two character prefixes based on the type of interface:
*   en — Ethernet
*   ib — InfiniBand
*   sl — serial line IP (slip)
*   wl — wlan
*   ww — wwan

ดังนั้นสำหรับทั้งการethXตั้งชื่อแบบดั้งเดิมและการตั้งชื่อ systemd ที่ใหม่กว่าตัวอักษรเริ่มต้นeควรเป็นอินเตอร์เฟสอีเธอร์เน็ตสำหรับชื่ออินเตอร์เฟสใด ๆ ที่สร้างขึ้นโดยอัตโนมัติ อินเทอร์เฟซ wifi ทั้งหมดควรเริ่มต้นด้วยwในทั้งสองโครงร่างแม้ว่าอินเตอร์เฟสทั้งหมดที่ขึ้นต้นด้วยwจะไม่ใช่ wifi ทั้งหมด

ถ้าเครื่องมือนี้มีการทำงานในสภาพแวดล้อมที่พล (มากกว่าเพียงแค่ในสภาพแวดล้อมภายในที่คุณสามารถควบคุม) ทราบว่าผู้ใช้อาจเปลี่ยนชื่ออินเตอร์เฟซบนระบบลินุกซ์ที่มีชื่อพลเช่น [ wan0, lan0, lan1, dmz0] ซึ่งจะทำลายสมมติฐานใด ๆ เกี่ยวกับตัวอักษรเริ่มต้น .


7
และบางส่วนของเราเป็นผู้แก้ระบบอย่างแข็งขัน
chrylis -on strike-

1
โปรดทราบว่าการแก้ปัญหานี้จะไม่ทำงานบนระบบที่ใช้สำหรับการตั้งชื่ออินเตอร์เฟซที่อินเตอร์เฟซอีเธอร์เน็ตสามารถตั้งชื่อเช่นbiosdevname p3p7วิธีนี้เป็นรุ่นก่อนของชื่อที่คาดเดาได้ systemd ใหม่และแม้ว่าตอนนี้จะเลิกใช้แล้วใน distros ทั่วไปจะยังคงมีหลายระบบที่รับมันเมื่อมันเริ่มต้นไม่กี่ปีที่ผ่านมา
TooTea

systemd ช่วยเรียกหนึ่งในอินเตอร์เฟส ethernet ของฉันว่า 'rename3' อันไหนที่มันสามารถแตกต่างกันถอนหายใจ :(
user1908704

1
@ user1908704: โดยปกตินี่หมายความว่า udev ได้รับคำสั่งให้ตั้งชื่อเดียวกันกับหลายอินเตอร์เฟส (บางทีคุณอาจมีไฟล์ "ชื่อถาวร" ที่สร้างขึ้นโดยอัตโนมัติใน /etc/udev/rules.d?) ที่กล่าวว่ากระบวนการเปลี่ยนชื่อนั้นได้รับการแก้ไขใน v187ให้เป็นแบบเต็มอะตอม (ไม่ว่าจะสำเร็จหรือย้อนกลับ) และrename%uรูปแบบไม่มี ' มีอยู่ในซอร์สโค้ดตั้งแต่ 2555 ฉันต้องการถอนการติดตั้งซอฟต์แวร์ของคุณซึ่งล้าสมัยไปแล้วหกปี
user1686

1
@grawity นี่คือ Ubuntu 18.04 ปรากฎว่ามาเธอร์บอร์ดโดยเฉพาะมี NIC สองตัวที่มีรายการ ACPI เดียวกันทำให้ทั้งคู่มี eno1 เนื่องจากไม่สามารถเกิดขึ้นได้หนึ่งในนั้นจึงถูกเรียกว่า ฉันไม่ได้ทำตามตรรกะของผู้ชนะการแข่งขันอย่างเต็มที่ แต่การเปลี่ยนแปลงใด ๆ สามารถรบกวนการแข่งขันและทำให้คนอื่นเปลี่ยนชื่อ 3
user1908704

8

ประชุมการตั้งชื่อก็คือการเชื่อมต่อ LAN มีการตั้งชื่อeth0, eth1... และว่าการเชื่อมต่อ WLAN จะถูกตั้งชื่อwlan0, wlan1...

สิ่งที่คุณเห็นคือ "ชื่อที่คาดเดาได้" ที่ systemd แนะนำ ในทางปฏิบัติสิ่งเหล่านี้เป็นสิ่งที่คาดเดาได้และสามารถเปลี่ยนแปลงได้แม้เมื่อมีการเปลี่ยนแปลงฮาร์ดแวร์ซึ่งเป็นปัญหาที่พวกเขาควรหลีกเลี่ยง

สำหรับการคาดเดาอักษรเริ่มต้นอาจดีพอ บางอินเตอร์เฟสโดยเฉพาะ WLAN มีคำแนะนำใน/sys/class/net/*/uevent:

DEVTYPE=wlan

น่าเสียดายที่ไม่มีเช่นDEVTYPEสำหรับอินเตอร์เฟส LAN


2
ชื่ออุปกรณ์จะเปลี่ยนไปเมื่อการเปลี่ยนแปลงฮาร์ดแวร์ไม่ใช่ชื่ออินเตอร์เฟสที่คาดเดาได้และพยายามหลีกเลี่ยง ชื่ออินเตอร์เฟซที่คาดเดาได้หลีกเลี่ยงชื่อการเปลี่ยนแปลงเมื่อฮาร์ดแวร์จะไม่เปลี่ยนแปลง นี่เป็นปัญหาเมื่อตรวจพบอุปกรณ์ฮาร์ดแวร์ตามลำดับแบบสุ่ม
Johan Myréen

@ JohanMyréenผิด: "... ว่าพวกเขา (ชื่ออินเตอร์เฟส) ยังคงได้รับการแก้ไขแม้ว่าฮาร์ดแวร์จะถูกเพิ่มหรือลบ" freedesktop.org/wiki/Software/systemd/ …
RalfFriedl

แรงจูงใจในการแนะนำชื่ออินเทอร์เฟซที่คาดเดาได้คือการตรวจสอบไม่ได้กำหนดไว้และ "การกำหนดชื่อ" eth0 "," eth1 "และไม่ได้รับการแก้ไขอีกต่อไปและอาจเกิดขึ้นได้ดีว่า" eth0 "ในการบูตครั้งเดียว "eth1" ในวันถัดไป " มันเป็นโบนัสหากชื่อที่คาดเดาได้สามารถรอดชีวิตจากการเปลี่ยนแปลงฮาร์ดแวร์ แต่นี่ไม่ใช่เหตุผลหลักสำหรับพวกเขา
Johan Myréen

1
ชนะบางคนสูญเสียบางอย่าง - ในบางสถานการณ์มันเป็นที่ต้องการมากถ้าฮาร์ดแวร์ที่ถูกเปลี่ยนคลิกอย่างน่าเชื่อถือใน "ช่องการตั้งชื่อ" เดียวกัน :)
rackandboneman

@ JohanMyréenรูปแบบเก่าของการกำหนดชื่ออินเทอร์เฟซตาม MAC หรือคุณสมบัติอื่น ๆ ทำงานได้อย่างน่าเชื่อถือมากขึ้นเมื่อเพิ่มอินเทอร์เฟซโดยไม่ต้องวุ่นวายกับชื่อใหม่
RalfFriedl

5

ข้อแม้หนึ่งคำตอบของฉัน (นำไปใช้กับคนอื่น ๆ ส่วนใหญ่ด้วย): ฉันไม่รู้วัตถุประสงค์ของการสมัครของคุณ หากเป็นแอพพลิเคชั่นที่ใช้ในการแก้ไขปัญหาหนึ่งปัญหาหรือทำความเข้าใจกับระบบเครือข่ายให้ดีขึ้นไม่ควรใช้อีกครั้งการใช้ตัวอักษรตัวแรกของอินเทอร์เฟซอาจเป็นตัวเลือกที่รวดเร็วและสกปรก หากคุณวางแผนที่จะเขียนคู่แข่งรายต่อไปที่ Wireshark หรือ tcpdump คุณต้องแน่ใจว่าคุณทำถูกต้องสำหรับเคสขอบทุกประเภท

และหากแอปพลิเคชันที่คุณกำลังเขียนอยู่ตรงไหนระหว่างสุดขั้วเหล่านั้นมีเพียงคุณ (และลูกค้าของคุณ) เท่านั้นที่จะรู้ว่าคุณจำเป็นต้องใช้ตรรกะอย่างรอบคอบเพียงใด

คนอื่น ๆ ได้ชี้ให้เห็นแล้วว่าชื่อไม่น่าเชื่อถือด้วยเหตุผลหลายประการ ปัญหาขั้นสุดท้ายคือปัญหาที่พบบ่อยมากในซอฟต์แวร์: ข้อสันนิษฐานที่ยากต่อการเข้ารหัสแทนที่จะอาศัยข้อเท็จจริงที่ทราบ / บันทึกไว้

ปัญหาที่สองที่ไม่ได้กล่าวถึงนั้นขึ้นอยู่กับข้อสมมติเกี่ยวกับความต้องการของคุณ: รายการอินเตอร์เฟสที่คุณต้องการแสดงรายการนั้นมักจะเป็น "ฮาร์ดแวร์อีเธอร์เน็ตอินเตอร์เฟส" และ "อินเตอร์เฟซ wifi" เสมอ

ปัญหาที่สามยังเป็นข้อสันนิษฐานอีกข้อหนึ่งว่าอินเทอร์เฟซทั้งหมดจะอยู่ในหมวดหมู่ที่คุณนึกออกในตอนนี้ วิธีการเกี่ยวกับ Infiniband ตามที่ระบุไว้โดย @ user4556274 วิธีการเกี่ยวกับทันเนลอินเตอร์เฟสสำหรับ VPN? อินเตอร์เฟซบริดจ์ วิธีการเกี่ยวกับการเชื่อมต่อบริดจ์ที่รวมทางกายภาพและตรรกะอินเตอร์เฟซ

แต่อาจมีตัวเลือกในการบรรลุสิ่งที่คุณกำลังมองหา ก่อนอื่นให้กำหนดสิ่งที่เป็นลักษณะเฉพาะของส่วนต่อประสานที่คุณต้องการแสดงรายการและส่วนที่คุณไม่ต้องการ

ในกรณีส่วนใหญ่คุณลักษณะหนึ่งที่คุณวางใจได้คือตารางเส้นทาง (อย่างไรก็ตามนี่จะทำงานได้ตราบเท่าที่อินเทอร์เฟซทำงานดังนั้นมันอาจไม่ใช่สิ่งที่คุณกำลังมองหา)

อินเทอร์เฟซใด ๆ ที่มีเส้นทางเริ่มต้น (เช่นเส้นทางไป 0.0.0.0) มีแนวโน้มที่จะเป็นเส้นทางที่คุณกำลังมองหา

โปรดทราบว่าแม้สิ่งนี้จะยังคงอยู่บนสมมุติฐาน แต่ก็มีความน่าเชื่อถือมากกว่านั่นก็คือเป็นไปได้ว่าระบบได้รับการกำหนดค่าให้จัดเส้นทางการรับส่งข้อมูลขาออกทั้งหมดผ่านเครื่องเสมือนหรือคอนเทนเนอร์นักเทียบท่า (เช่นหากมีคอนเทนเนอร์ที่ใช้ไฟร์วอลล์ ) และสิ่งที่ตรงกันข้ามก็เป็นจริงเช่นกัน: ระบบดูแลระบบอาจล็อคการจราจรภายนอกโดยการลบเส้นทางเริ่มต้น

ตัวเลือกอื่นคือไปตามฮาร์ดแวร์จริงและดูว่าจะใช้ไดรเวอร์ใด จากนั้นคุณสามารถยกเว้นไดรเวอร์บางตัวที่เป็นที่รู้จัก


4

คุณไม่ได้รวมอินเทอร์เฟซที่ถูกผูกมัดหรือเป็นทีมอย่างชัดเจนหรือไม่? ค่าเริ่มต้นของเราที่นี่คือการใช้bond0หรือteam0สำหรับอินเทอร์เฟซหลักสำหรับเซิร์ฟเวอร์ของเรา

ฉันคิดว่าคุณต้องคิดตรรกะของคุณใหม่ อาจลองทำซ้ำแม้ว่าอินเทอร์เฟซเครือข่ายที่กำหนดไว้ทั้งหมดในระบบที่กำหนดแบ่งพวกเขาระหว่างอีเธอร์เน็ต, wifi, infiband, ซีเรียล, ฯลฯ และทำเวทมนต์ของคุณ


3

อย่า hardcode หรือรูปแบบการจับคู่ชื่อฮาร์ดแวร์ สิ่งนี้ใช้ได้กับอุปกรณ์ทั้งหมด พึ่งพาเครื่องมือที่จัดทำโดย udev เพื่อกำหนดรายการอุปกรณ์และดำเนินการที่เหมาะสม ดูการตั้งชื่ออุปกรณ์ถาวร 16.7จากนั้นอ่านเอกสารทั้งหมดนั้นโดยเฉพาะ 16.2 และ 16.3 โปรดทราบว่า udev คือผู้ไม่เชื่อเรื่องพระเจ้าและเป็นผู้เริ่มต้นที่ไม่เชื่อเรื่องพระเจ้าเพราะ udev ปัจจุบันเป็นวิธีที่นิยมใช้สำหรับการจัดการอุปกรณ์ใน linux

ขอให้สังเกตว่า @ user4556274, พาดพิงถึงในคำตอบของเขาเมื่อพูดถึงudev-builtin-net-id.cซึ่งหมายสั้น ๆ udevว่าการจับคู่แบบที่คุณกำลังพยายามที่จะบรรลุเป็นส่วนหนึ่งในตัวของ

การอ้างอิงPredictableNetworkInterfaceNames :

ด้วย systemd 197 เราได้เพิ่มการสนับสนุนดั้งเดิมสำหรับนโยบายการตั้งชื่อที่แตกต่างกันจำนวนมากใน systemd / udevd ที่เหมาะสมและสร้างรูปแบบคล้ายกับ biosdevname (แต่โดยทั่วไปมีประสิทธิภาพมากกว่า โครงร่างการตั้งชื่อที่แตกต่างกันต่อไปนี้สำหรับอินเตอร์เฟสเครือข่ายได้รับการสนับสนุนโดย udev โดยกำเนิด:

  1. ชื่อที่รวมเฟิร์มแวร์ / BIOS ระบุหมายเลขดัชนีสำหรับอุปกรณ์ออนบอร์ด (ตัวอย่าง: eno1)
  2. ชื่อที่รวมเฟิร์มแวร์ / BIOS มาพร้อมกับหมายเลขดัชนีสล็อต PCI Express hotplug (ตัวอย่าง: ens1)
  3. ชื่อที่รวมสถานที่ตั้งทางกายภาพ / ภูมิศาสตร์ของตัวเชื่อมต่อของฮาร์ดแวร์ (ตัวอย่าง: enp2s0)
  4. ชื่อที่รวมที่อยู่ MAC ของอินเทอร์เฟซ (ตัวอย่าง: enx78e7d1ea46da) คลาสสิกการตั้งชื่อเคอร์เนลเนทีฟ ethX ที่ไม่สามารถคาดเดาได้ (ตัวอย่าง: eth0)

ตามค่าเริ่มต้น systemd v197 จะตั้งชื่ออินเทอร์เฟซตามนโยบาย 1) หากข้อมูลจากเฟิร์มแวร์นั้นสามารถใช้งานได้และพร้อมใช้งานการถอยกลับไปที่ 2) หากข้อมูลจากเฟิร์มแวร์นั้นสามารถใช้ได้และพร้อมใช้งาน 5) ในกรณีอื่น ๆ ทั้งหมด นโยบาย 4) ไม่ได้ใช้งานตามค่าเริ่มต้น แต่จะสามารถใช้ได้หากผู้ใช้เลือก

นโยบายรวมนี้จะใช้เป็นทางเลือกสุดท้ายเท่านั้น ซึ่งหมายความว่าหากระบบมีการติดตั้ง biosdevname ระบบจะมีความสำคัญกว่า หากผู้ใช้เพิ่มกฎ udev ซึ่งเปลี่ยนชื่อของอุปกรณ์เคอร์เนลสิ่งเหล่านี้จะมีความสำคัญกว่าด้วย นอกจากนี้รูปแบบการตั้งชื่อเฉพาะการแจกจ่ายโดยทั่วไปจะมีความสำคัญกว่า


2

อย่างที่คนอื่นพูดคุณไม่สามารถพึ่งพาชื่อได้อย่างเต็มที่

ในกรณีของฉันดูเหมือนว่าไร้สาย/sys/class/net/<ifacename>/จะมีไดเรกทอรีที่เรียกว่า "ไร้สาย" ในนั้นถ้ามันเป็นอินเตอร์เฟซไร้สาย:

# kbrandt @ kbrandtlx in /sys/class/net [9:47:43] C:130
$ ls
br-b293588ecdae  enp11s0  lo    veth6061cd8  virbr0-nic
docker0          enp12s0  ppp0  virbr0       wlp13s0

# kbrandt @ kbrandtlx in /sys/class/net [9:47:44] 
$ echo  /sys/class/net/*/wireless
/sys/class/net/wlp13s0/wireless
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.