Các ifconfig
lệnh trên hệ điều hành như FreeBSD và OpenBSD đã được cập nhật phù hợp với phần còn lại của hệ điều hành. Ngày nay, nó có thể cấu hình tất cả các loại cài đặt giao diện mạng trên các hệ điều hành đó và xử lý một loạt các giao thức mạng. BSD cung cấp ioctl()
hỗ trợ cho những điều này.
Điều này đã không xảy ra trong thế giới Linux. Hôm nay, có ba ifconfig
lệnh:
ifconfig
từ GNU inetutilsjdebp% inetutils-ifconfig -l
enp14s0 enp15s0 lo
jdebp% inetutils-ifconfig lo
lo Liên kết mã hóa: Loopback cục bộ
inet addr: 127.0.0.1 Bcast: 0.0.0.0 Mặt nạ: 255.0.0.0
LÊN LOOPBACK CHẠY MTU: 65536 Số liệu: 1
Các gói RX: 9087 lỗi: 0 rớt: 0 tràn: 0 khung: 0
Các gói TX: 9087 lỗi: 0 rớt: 0 tràn: 0 sóng mang: 0
va chạm: 0 txqueuelen: 1000
Các byte RX: 51214341 TX byte: 51214341
jdebp%
-
ifconfig
từ các công cụ mạng NET-3 jdebp% ifconfig -l
ifconfig: tùy chọn --help 'cung cấp thông tin sử dụng.-l' not recognised.
ifconfig:
jdebp% ifconfig lo
lo: flags = 73 <LÊN, LOOPBACK, CHẠY> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 :: 1 tiền tố 128 scopeid 0x10 <host>
inet6 :: 2 tiền tố 128 scopeid 0x80 <compat, global>
inet6 fe80 :: prefixlen 10 scopeid 0x20 <link>
vòng lặp txqueuelen 1000 (Vòng lặp cục bộ)
Gói RX 9087 byte 51214341 (48,8 MiB)
Lỗi RX 0 rớt 0 vượt 0 khung 0
Gói TX 9087 byte 51214341 (48,8 MiB)
Lỗi TX 0 rớt 0 vượt 0 nhà cung cấp 0 va chạm 0
jdebp%
-
ifconfig
từ (phiên bản 1.40 của) bộ công cụ nosh jdebp% ifconfig -l
enp14s0 enp15s0 lo
jdebp% ifconfig lo
lo
liên kết lên loopback chạy
địa chỉ liên kết 00: 00: 00: 00: 00 bdaddr 00: 00: 00: 00: 00: 00
địa chỉ inet4 127.0.0.1 tiền tố 8 bdaddr 127.0.0.1
địa chỉ inet4 127.53.0.1 tiền tố 8 bdaddr 127.255.255.255
địa chỉ inet6 :: 2 scope 0 prefixlen 128
địa chỉ inet6 fe80 :: scope 1 prefixlen 10
địa chỉ inet6 :: 1 scope 0 prefixlen 128
jdebp% sudo ifconfig lo inet4 127.1.0.2 bí danh
jdebp% sudo ifconfig lo inet6 :: bí danh 3/128
jdebp% ifconfig lo
lo
liên kết lên loopback chạy
địa chỉ liên kết 00: 00: 00: 00: 00 bdaddr 00: 00: 00: 00: 00: 00
địa chỉ inet4 127.0.0.1 tiền tố 8 bdaddr 127.0.0.1
địa chỉ inet4 127.1.0.2 tiền tố 32 bdaddr 127.1.0.2
địa chỉ inet4 127.53.0.1 tiền tố 8 bdaddr 127.255.255.255
địa chỉ inet6 :: 3 scope 0 prefixlen 128
địa chỉ inet6 :: 2 scope 0 prefixlen 128
địa chỉ inet6 fe80 :: scope 1 prefixlen 10
địa chỉ inet6 :: 1 scope 0 prefixlen 128
jdebp%
Như bạn có thể thấy, các inetutils GNU và các công cụ mạng NET-3 ifconfig
có một số thiếu sót rõ rệt, liên quan đến IPv6, đối với các giao diện có nhiều địa chỉ và liên quan đến chức năng như -l
.
Vấn đề IPv6 là một phần thiếu mã trong các công cụ. Nhưng nguyên nhân chính là do Linux không (như các hệ điều hành khác làm) cung cấp chức năng IPv6 thông qua ioctl()
giao diện. Nó chỉ cho phép các chương trình xem và thao tác các địa chỉ IPv4 thông qua các mạng ioctl()
.
Thay vào đó, Linux cung cấp chức năng này thông qua một giao diện khác send()
và recv()
trên một nhóm địa chỉ đặc biệt và hơi kỳ lạ AF_NETLINK
.
GNU và NET-3 ifconfig
s có thể đã được điều chỉnh để sử dụng API mới này. Các lập luận chống lại làm như vậy là nó đã không cầm tay để hệ điều hành khác, nhưng các chương trình này là trong thực tế đã không cầm tay nào để là không nhiều của một cuộc tranh cãi.
Nhưng họ không điều chỉnh, và vẫn như trước cho đến ngày nay. (Một số người đã làm việc với họ ở nhiều điểm khác nhau trong nhiều năm qua, nhưng những cải tiến, đáng buồn thay, không bao giờ được đưa vào chương trình. Ví dụ: Bernd Eckenfels không bao giờ chấp nhận bản vá có thêm một số khả năng API netlink cho các công cụ mạng NET-3 ifconfig
, 4 năm sau khi bản vá đã được viết.)
Thay vào đó, một số người hoàn toàn phát minh lại bộ công cụ như một ip
lệnh, sử dụng API Linux mới, có một cú pháp khác và kết hợp một số chức năng khác đằng sau giao diện kiểu thời trang .command subcommand
Tôi cần một ifconfig
cái có cú pháp dòng lệnh và kiểu đầu ra của FreeBSD ifconfig
(cái mà cả GNU và NET-3 ifconfig
đều không có, và cái mà ip
chắc chắn là không có). Vì vậy, tôi đã viết một. Bằng chứng là người ta có thể viết một ifconfig
API sử dụng API netlink trên Linux, nó cũng vậy.
Vì vậy, sự khôn ngoan nhận được về ifconfig
, chẳng hạn như những gì bạn trích dẫn, không thực sự đúng nữa. Nó là hiện nay không đúng sự thật để nói rằng " ifconfig
không sử dụng netlink.". Cái chăn phủ hai cái không che ba cái.
Người ta luôn nói rằng "netlink hiệu quả hơn". Đối với các tác vụ mà người ta thực hiện ifconfig
, thực sự không có nhiều trong đó khi nói đến hiệu quả giữa API netlink và ioctl()
API. Một người thực hiện khá nhiều số lần gọi API cho bất kỳ tác vụ nào.
Thật vậy, mỗi lệnh gọi API là hai lệnh gọi hệ thống trong trường hợp netlink, trái ngược với một cuộc gọi trong ioctl()
hệ thống. Và có thể cho rằng API netlink có nhược điểm là trên một hệ thống được sử dụng nhiều, nó kết hợp rõ ràng khả năng công cụ không bao giờ nhận được thông báo xác nhận thông báo về kết quả của lệnh gọi API.
Nó được, hơn nữa, không đúng sự thật để nói rằng ip
là "linh hoạt hơn" so với GNU và NET-3 ifconfig
s vì nó sử dụng netlink . Nó linh hoạt hơn bởi vì nó thực hiện nhiều nhiệm vụ hơn, thực hiện mọi thứ trong một chương trình lớn mà người ta sẽ làm với các chương trình riêng biệt khác ifconfig
. Nó không linh hoạt hơn chỉ đơn giản là do API sử dụng nội bộ để thực hiện các tác vụ bổ sung đó. Không có gì vốn có của API về điều này. Người ta có thể viết một công cụ all-in-one rằng sử dụng FreeBSD ioctl()
API, ví dụ, và tốt như nhau bang rằng nó là "linh hoạt hơn" so với các cá nhân ifconfig
, route
, arp
, và ndp
các lệnh.
Người ta có thể viết route
, arp
và ndp
lệnh cho Linux mà sử dụng API netlink, quá.
đọc thêm
ip
sự linh hoạt hơn, bởi vì tất cả các loại tính năng thú vị đơn giản là không thể sử dụng ioctls trên Linux (vì ioctls không có ở đó và có khả năng sẽ không bao giờ có).