ifconfig
คำสั่งบนระบบปฏิบัติการเช่น FreeBSD และ OpenBSD ได้รับการปรับปรุงให้สอดคล้องกับส่วนที่เหลือของระบบปฏิบัติการ ทุกวันนี้สามารถกำหนดค่าการตั้งค่าอินเทอร์เฟซเครือข่ายได้ทุกประเภทบนระบบปฏิบัติการเหล่านั้นและจัดการโปรโตคอลเครือข่ายที่หลากหลาย BSD ให้ioctl()
การสนับสนุนสิ่งเหล่านี้
สิ่งนี้ไม่ได้เกิดขึ้นในโลก Linux มีสามifconfig
คำสั่งในวันนี้:
ifconfig
จากGNU inetutilsjdebp% inetutils-ifconfig -l
enp14s0 enp15s0 แท้จริง
jdebp% inetutils-ifconfig แท้จริง
lo Link encap: Local Loopback
inet addr: 127.0.0.1 Bcast: 0.0.0.0 รูปแบบ: 255.0.0.0
การเรียกใช้ LOOPBACK RUNNING MTU: 65536 ตัวชี้วัด: 1
RX แพ็กเก็ต: 9087 ข้อผิดพลาด: 0 ลดลง: 0 overruns: 0 เฟรม: 0
แพ็กเก็ต TX: 9087 ข้อผิดพลาด: 0 ลดลง: 0 overruns: 0 ผู้ให้บริการ: 0
การชน: 0 txqueuelen: 1,000
จำนวนไบต์: 51214341 TX ไบต์: 51214341
jdebp%
-
ifconfig
จากNET-3 เครื่องมือสุทธิ jdebp% ifconfig -l
ifconfig: ตัวเลือก- ช่วย 'ให้ข้อมูลการใช้งาน-l' not recognised.
ifconfig:
jdebp% ifconfig แท้จริง
lo: ค่าสถานะ = 73 <ขึ้นไป, วนกลับ, การวิ่ง> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 :: คำนำหน้า 1 128 ขอบเขตid 0x10 <host>
inet6 :: คำนำหน้า 2 128 ขอบเขตid 0x80 <compat, global>
inet6 fe80 :: คำนำหน้า 10 ขอบเขตid 0x20 <link>
loop txqueuelen 1000 (Local Loopback)
RX แพ็คเก็ต 9087 ไบต์ 51214341 (48.8 MiB)
ข้อผิดพลาดของ RX 0 ลดลง 0 เกิน 0 เฟรม 0
แพ็คเก็ต TX 9087 ไบต์ 51214341 (48.8 MiB)
ข้อผิดพลาดของ TX 0 ลดลง 0 เกิน 0 ผู้ให้บริการ 0 ชน 0
jdebp%
-
ifconfig
จาก (เวอร์ชัน 1.40 จาก) ชุดเครื่องมือ nosh jdebp% ifconfig -l
enp14s0 enp15s0 แท้จริง
jdebp% ifconfig แท้จริง
ดูเถิด
เชื่อมโยงการทำงานลูปแบ็ค
ที่อยู่ลิงก์ 00: 00: 00: 00: 00: 00 bdaddr 00: 00: 00: 00: 00: 00
ที่อยู่ inet4 127.0.0.1 คำนำหน้า 8 bdaddr 127.0.0.1
ที่อยู่ inet4 127.53.0.1 คำนำหน้า 8 bdaddr 127.255.255.255
ที่อยู่ inet6 :: 2 ขอบเขต 0 คำนำหน้า 128
ที่อยู่ inet6 fe80 :: คำนำหน้า 1 ขอบเขต 10
ที่อยู่ inet6 :: 1 ขอบเขต 0 คำนำหน้า 128
jdebp% sudo ifconfig แท้จริง inet4 127.1.0.2 นามแฝง
jdebp% sudo ifconfig แท้จริง inet6 :: 3/128 นามแฝง
jdebp% ifconfig แท้จริง
ดูเถิด
เชื่อมโยงการทำงานลูปแบ็ค
ที่อยู่ลิงก์ 00: 00: 00: 00: 00: 00 bdaddr 00: 00: 00: 00: 00: 00
ที่อยู่ inet4 127.0.0.1 คำนำหน้า 8 bdaddr 127.0.0.1
inet4 address 127.1.0.2 คำนำหน้า 32 bdaddr 127.1.0.2
ที่อยู่ inet4 127.53.0.1 คำนำหน้า 8 bdaddr 127.255.255.255
ที่อยู่ inet6 :: 3 ขอบเขต 0 คำนำหน้า 128
ที่อยู่ inet6 :: 2 ขอบเขต 0 คำนำหน้า 128
ที่อยู่ inet6 fe80 :: คำนำหน้า 1 ขอบเขต 10
ที่อยู่ inet6 :: 1 ขอบเขต 0 คำนำหน้า 128
jdebp%
อย่างที่คุณเห็น GNU inetutils และ NET-3 net-tools ifconfig
s มีข้อบกพร่องบางอย่างเกี่ยวกับ IPv6 ที่เกี่ยวกับส่วนต่อประสานที่มีที่อยู่หลายแห่งและเกี่ยวกับหน้าที่การใช้งานเช่น-l
เดียวกัน
ปัญหา IPv6 เป็นส่วนหนึ่งของรหัสที่หายไปในเครื่องมือด้วยตนเอง แต่โดยหลักแล้วมันเกิดจากข้อเท็จจริงที่ว่า Linux ไม่ได้ (เช่นระบบปฏิบัติการอื่น) ให้การทำงานของ IPv6 ผ่านทางioctl()
อินเตอร์เฟส มันช่วยให้โปรแกรมดูและจัดการที่อยู่ IPv4 ผ่านเครือข่ายioctl()
s เท่านั้น
ลินุกซ์แทนให้ฟังก์ชันการทำงานนี้ผ่านอินเตอร์เฟซที่แตกต่างกันsend()
และในวันที่พิเศษและค่อนข้างแปลกครอบครัวอยู่ของซ็อกเก็ตrecv()
AF_NETLINK
แอฟริกาและ NET-3 ifconfig
s อาจได้รับการปรับเปลี่ยนให้ใช้ API ใหม่นี้ ข้อโต้แย้งเกี่ยวกับการทำเช่นนั้นคือมันไม่สามารถพกพาไปยังระบบปฏิบัติการอื่น ๆ ได้ แต่โปรแกรมเหล่านี้ในทางปฏิบัติแล้วไม่ได้พกพาอยู่แล้วดังนั้นจึงไม่ได้มีข้อโต้แย้งมากมาย
แต่พวกเขาก็ไม่ได้ปรับตัวและยังคงเป็นเหมือนวันนี้ (บางคนทำงานกับพวกเขาที่จุดต่าง ๆ ในช่วงหลายปีที่ผ่านมา แต่การปรับปรุงเศร้าที่จะพูดไม่เคยทำมันเข้าไปในโปรแกรมตัวอย่าง: Bernd Eckenfels ไม่เคยยอมรับแพทช์ที่เพิ่มขีดความสามารถ netlink API ให้กับ NET-3 net-tools ifconfig
4 ปีหลังจากที่แพทช์ได้ถูกเขียนขึ้น)
แต่บางคนคิดค้นชุดเครื่องมือใหม่ทั้งหมดเป็นip
คำสั่งซึ่งใช้ Linux API ใหม่มีไวยากรณ์ที่แตกต่างกันและรวมฟังก์ชั่นอื่น ๆ อีกหลายอย่างไว้เบื้องหลังอินเทอร์เฟซแบบสไตล์ที่ทันสมัยcommand subcommand
ฉันต้องการสิ่งifconfig
ที่มีไวยากรณ์บรรทัดคำสั่งและรูปแบบการส่งออกของ FreeBSD ifconfig
(ซึ่ง GNU หรือ NET-3 ifconfig
ไม่มีและที่ip
แน่นอนที่สุดไม่มี) ดังนั้นฉันจึงเขียนหนึ่ง เป็นข้อพิสูจน์ว่าเราสามารถเขียนifconfig
ที่ใช้ netlink API บน Linux ได้
ดังนั้นปัญญาที่ได้รับifconfig
เช่นสิ่งที่คุณพูดไม่เป็นความจริงอีกต่อไป ตอนนี้มันไม่จริงที่จะบอกว่า " ifconfig
ไม่ใช้ netlink" ผ้าห่มที่ครอบคลุมสองไม่ครอบคลุมสาม
มันไม่จริงเสมอที่จะบอกว่า "netlink มีประสิทธิภาพมากขึ้น" สำหรับงานที่ทำifconfig
มีไม่มากจริง ๆ เมื่อพูดถึงประสิทธิภาพระหว่าง netlink API และioctl()
API หนึ่งทำให้การเรียก API จำนวนเท่ากันสำหรับงานที่กำหนด
แท้จริงแล้วการเรียก API แต่ละครั้งเป็นการเรียกสองระบบในกรณี netlink ซึ่งตรงข้ามกับการเรียกหนึ่งครั้งในioctl()
ระบบ และเนื้อหาที่ว่า netlink API นั้นมีข้อเสียที่บนระบบที่ใช้งานอย่างหนักมันได้รวมเอาความเป็นไปได้ของเครื่องมืออย่างชัดเจนโดยไม่เคยได้รับข้อความตอบรับเพื่อแจ้งให้ทราบถึงผลของการเรียก API
มันเป็นเรื่องที่ยิ่งจริงที่จะบอกว่าip
เป็น "มากกว่าอเนกประสงค์" กว่า GNU และ NET-3 ifconfig
s เพราะมันใช้ netlink ก็จะมากขึ้นหลากหลายเพราะมันไม่งานมากขึ้นการทำสิ่งที่ยิ่งใหญ่ในโปรแกรมหนึ่งที่หนึ่งจะทำอย่างไรกับโปรแกรมแยกอื่นที่ไม่ใช่ ifconfig
มันไม่ได้มีความหลากหลายมากขึ้นเพียงแค่ใช้ API ที่ใช้ภายในเพื่อดำเนินงานพิเศษเหล่านั้น API ไม่มีอะไรเกี่ยวข้องกับเรื่องนี้ หนึ่งสามารถเขียนเป็นเครื่องมือทั้งหมดในหนึ่งเดียวที่ใช้ FreeBSD ioctl()
API สำหรับตัวอย่างและเท่าเทียมกันทั้งรัฐว่ามันคือ "อเนกประสงค์" กว่าบุคคลifconfig
, route
, arp
และndp
คำสั่ง
หนึ่งสามารถเขียนroute
, arp
และndp
คำสั่งสำหรับลินุกซ์ที่ใช้ API netlink เกินไป
อ่านเพิ่มเติม
ip
หลากหลายมากขึ้นเพราะคุณสมบัติเจ๋ง ๆ ทุกชนิดนั้นเป็นไปไม่ได้เลยที่จะใช้ ioctls บน Linux (เพราะ ioctls ไม่ได้อยู่ในนั้น