ifconfig
Команда операційних систем , таких як FreeBSD і OpenBSD був оновлений відповідно з іншою частиною операційної системи. На сьогоднішній день він може налаштувати всі види налаштувань мережевого інтерфейсу для цих операційних систем та обробляти цілий ряд мережевих протоколів. BSD ioctl()
підтримують ці речі.
У світі Linux цього не сталося. Сьогодні є три ifconfig
команди:
ifconfig
від GNU inetutilsjdebp% inetutils-ifconfig -l
enp14s0 enp15s0 lo
jdebp% inetutils-ifconfig lo
lo Link encap: Local Loopback
inet addr: 127.0.0.1 Bcast: 0.0.0.0 Маска: 255.0.0.0
НАГОРОДЖЕННЯ РОЗВ'ЯЗУ MTU: 65536 Метріч: 1
Пакети RX: 9087 помилок: 0 випали: 0 перевитрати: 0 кадр: 0
TX-пакети: 9087 помилок: 0 випало: 0 перевитрат: 0 перевізник: 0
зіткнення: 0 txqueuelen: 1000
RX байт: 51214341 TX байт: 51214341
jdebp%
-
ifconfig
від мережевих інструментів NET-3 jdebp% ifconfig -l
ifconfig: option --help 'дає інформацію про використання.-l' not recognised.
ifconfig:
jdebp% ifconfig lo
lo: flags = 73 <UP, LOOPBACK, RUNNING> mtu 65536
inet 127.0.0.1 маска мережі 255.0.0.0
inet6 :: 1 префікс. 128 області 0x10 <host>
inet6 :: 2 префікс 128, розмір 0x80 <compat, global>
inet6 fe80 :: prefixlen 10 obseid 0x20 <посилання>
петля txqueuelen 1000 (Local Loopback)
RX пакети 9087 байт 51214341 (48,8 МіБ)
Похибки RX 0 впали 0 перевищення 0 кадр 0
TX-пакети 9087 байт 51214341 (48,8 МіБ)
Похибки TX 0 впали 0 перевитрати 0 перевізник 0 зіткнення 0
jdebp%
-
ifconfig
з (версія 1.40) набору інструментів "noh" jdebp% ifconfig -l
enp14s0 enp15s0 lo
jdebp% ifconfig lo
ло
з'єднати циклічне виконання
адреса посилання 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 address :: 2 область 0 префікс 128
inet6 адреса fe80 :: префікс області 1
inet6 address :: 1 область 0 префікс 128
jdebp% sudo ifconfig lo inet4 127.1.0.2 псевдонім
jdebp% sudo ifconfig lo inet6 :: 3/128 псевдонім
jdebp% ifconfig lo
ло
з'єднати циклічне виконання
адреса посилання 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.1.0.2 префікс 32 bdaddr 127.1.0.2
inet4 адреса 127.53.0.1 префікс 8 bdaddr 127.255.255.255
inet6 address :: 3 область 0 префікс 128
inet6 address :: 2 область 0 префікс 128
inet6 адреса fe80 :: префікс області 1
inet6 address :: 1 область 0 префікс 128
jdebp%
Як бачимо, inetutils GNU та мережеві інструменти NET-3 ifconfig
мають деякі помітні недоліки щодо IPv6 щодо інтерфейсів, які мають декілька адрес, та щодо функціональності -l
.
Проблема IPv6 частково є деяким відсутнім кодом у самих інструментах. Але в основному це викликано тим, що Linux не забезпечує (як це роблять інші операційні системи) функціональність IPv6 через ioctl()
інтерфейс. Це лише дозволяє програмам бачити та маніпулювати адресами IPv4 через мережу ioctl()
.
Linux , замість цього забезпечує цю функцію через інший інтерфейс, send()
і recv()
на спеціальному, і трохи дивно, сімейство адрес сокетов, AF_NETLINK
.
GNU та NET-3 ifconfig
s могли бути налаштовані для використання цього нового API. Аргумент проти робити це було те , що він не підходить для інших операційних систем, але ці програми були на практиці вже НЕ стерпні в будь-якому випадку , так що було не так багато аргументів.
Але вони не були налагоджені і залишаються такими, як раніше були показані. (Деякі люди працювали над ними в різні моменти протягом багатьох років, але вдосконалення, як це не сумно сказати, ніколи не входили в програми. Наприклад: Бернд Еккенфельс ніколи не приймав патч, який додав певну можливість API netlink до мережевих інструментів NET-3 ifconfig
, Через 4 роки після написання виправлення.)
Натомість деякі люди повністю винаходили набір інструментів як ip
команду, яка використовувала новий Linux API, мала інший синтаксис та поєднувала кілька інших функцій, що стоять за модним інтерфейсом стилю.command subcommand
Мені потрібен був ifconfig
той, що мав синтаксис командного рядка та стиль випуску FreeBSD ifconfig
(якого немає ні в GNU, ні в NET-3 ifconfig
, і якого, ip
звичайно, немає). Так я написав один. Як доказ того, що можна написати ifconfig
антенну, яка використовує API netlink в Linux, це робить.
Тож отримана мудрість щодо ifconfig
такого, як ви цитуєте, вже не справді. Це в даний час НЕ відповідає дійсності сказати , що « ifconfig
не використовує NetLink.». Ковдра, яка накрила два, не охоплює трьох.
Це завжди було б невірно говорити про те , що «NetLink є більш ефективним». Щодо завдань, з якими ви ifconfig
працюєте, насправді в ньому не так багато, коли справа стосується ефективності між netlink API та ioctl()
API. Один робить однакову кількість викликів API для будь-якого завдання.
Дійсно, кожен виклик API - це два системні виклики у випадку netlink, на відміну від одного в ioctl()
системі. І, мабуть, недолік API netlink має те, що у широко використовуваній системі він явно включає можливість інструменту ніколи не отримувати повідомлення про підтвердження, що інформує його про результат виклику API.
Крім того, неправда сказати, що ip
вона "більш універсальна", ніж GNU та NET-3 ifconfig
s, оскільки вона використовує мережеве посилання . Він більш універсальний, тому що він виконує більше завдань, виконуючи речі в одній великій програмі, яку можна було б зробити з окремими програмами, крім яких ifconfig
. Він не є більш універсальним просто за допомогою фарби API, який він використовує внутрішньо для виконання цих додаткових завдань. Про це нічого не властиве API. Можна було б написати інструмент все-в-одному , який використовував FreeBSD ioctl()
API, наприклад, і в рівній мірі добре , що воно є «більш універсальним» , ніж окремі ifconfig
, route
, arp
і ndp
команд.
Можна писати route
, arp
і ndp
команди для Linux, які також використовували API netlink.
Подальше читання
ip
більш універсальним, тому що всі види класних функцій просто неможливо зробити за допомогою ioctls в Linux (тому що йоктлів немає і, швидше за все, не буде).