The ifconfig
perintah pada sistem operasi seperti FreeBSD dan OpenBSD telah diupdate sejalan dengan sisa dari sistem operasi. Saat ini dapat mengkonfigurasi semua jenis pengaturan antarmuka jaringan pada sistem operasi tersebut, dan menangani berbagai protokol jaringan. BSD memberikan ioctl()
dukungan untuk hal-hal ini.
Ini tidak terjadi di dunia Linux. Ada, hari ini, tiga ifconfig
perintah:
ifconfig
dari 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 Mask: 255.0.0.0
MENJALANKAN LOOPBACK MTU: 65536 Metrik: 1
Paket RX: Kesalahan 9087: 0 jatuh: 0 overruns: 0 bingkai: 0
Paket TX: 9087 kesalahan: 0 jatuh: 0 overruns: 0 operator: 0
tabrakan: 0 txqueuelen: 1000
Bita RX: 51214341 Bita TX: 51214341
jdebp%
-
ifconfig
dari NET-3 net-tools jdebp% ifconfig -l
ifconfig: option --help 'memberikan informasi penggunaan.-l' not recognised.
ifconfig:
jdebp% ifconfig lo
lo: flags = 73 <UP, LOOPBACK, RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 :: 1 prefixlen 128 scopeid 0x10 <host>
inet6 :: 2 prefixlen 128 scopeid 0x80 <compat, global>
inet6 fe80 :: prefixlen 10 scopeid 0x20 <link>
loop txqueuelen 1000 (Loopback Lokal)
Paket RX 9087 byte 51214341 (48,8 MiB)
Kesalahan RX 0 turun 0 overruns 0 frame 0
Paket TX 9087 byte 51214341 (48,8 MiB)
Kesalahan TX 0 turun 0 overruns 0 operator 0 tumbukan 0
jdebp%
-
ifconfig
dari (versi 1.40 dari) nosh toolset jdebp% ifconfig -l
enp14s0 enp15s0 lo
jdebp% ifconfig lo
lihat
menghubungkan loopback yang sedang berjalan
alamat tautan 00: 00: 00: 00: 00: bdaddr 00: 00: 00: 00: 00: 00
alamat inet4 127.0.0.1 awalan 8 bdaddr 127.0.0.1
alamat inet4 127.53.0.1 awalan 8 bdaddr 127.255.255.255
alamat inet6 :: 2 scope 0 prefixlen 128
alamat inet6 fe80 :: scope 1 prefixlen 10
alamat inet6 :: 1 scope 0 prefixlen 128
jdebp% sudo ifconfig lo inet4 127.1.0.2 alias
jdebp% sudo ifconfig lo inet6 :: 3/128 alias
jdebp% ifconfig lo
lihat
menghubungkan loopback yang sedang berjalan
alamat tautan 00: 00: 00: 00: 00: bdaddr 00: 00: 00: 00: 00: 00
alamat inet4 127.0.0.1 awalan 8 bdaddr 127.0.0.1
alamat inet4 127.1.0.2 awalan 32 bdaddr 127.1.0.2
alamat inet4 127.53.0.1 awalan 8 bdaddr 127.255.255.255
alamat inet6 :: 3 scope 0 prefixlen 128
alamat inet6 :: 2 scope 0 prefixlen 128
alamat inet6 fe80 :: scope 1 prefixlen 10
alamat inet6 :: 1 scope 0 prefixlen 128
jdebp%
Seperti yang Anda lihat, inetutils GNU dan NET-3 net-tools ifconfig
memiliki beberapa kekurangan, sehubungan dengan IPv6, sehubungan dengan antarmuka yang memiliki banyak alamat, dan sehubungan dengan fungsionalitas seperti -l
.
Masalah IPv6 sebagian adalah beberapa kode yang hilang dalam alat itu sendiri. Tetapi pada dasarnya itu disebabkan oleh fakta bahwa Linux tidak (seperti sistem operasi lain lakukan) menyediakan fungsionalitas IPv6 melalui ioctl()
antarmuka. Itu hanya memungkinkan program melihat dan memanipulasi alamat IPv4 melalui jaringan ioctl()
.
Linux malah menyediakan fungsionalitas ini melalui antarmuka yang berbeda, send()
dan recv()
pada keluarga soket yang khusus, dan agak aneh AF_NETLINK
,.
GNU dan NET-3 ifconfig
s bisa telah disesuaikan untuk menggunakan API baru ini. Argumen yang menentang hal itu adalah bahwa itu tidak portabel untuk sistem operasi lain, tetapi program-program ini dalam praktiknya sudah tidak portabel sehingga toh tidak banyak bertengkar.
Tetapi mereka tidak disesuaikan, dan tetap seperti yang disebutkan sebelumnya sampai hari ini. (Beberapa orang mengerjakannya di berbagai titik selama bertahun-tahun, tetapi perbaikannya, sayangnya, tidak pernah berhasil masuk ke dalam program. Misalnya: Bernd Eckenfels tidak pernah menerima tambalan yang menambahkan beberapa kemampuan API netlink ke NET-3 net-tools ifconfig
, 4 tahun setelah tambalan ditulis.)
Sebagai gantinya, beberapa orang sepenuhnya menciptakan kembali toolset sebagai suatu ip
perintah, yang menggunakan Linux API baru, memiliki sintaks yang berbeda, dan menggabungkan beberapa fungsi lain di belakang antarmuka gaya- modis .command subcommand
Saya membutuhkan ifconfig
yang memiliki sintaks baris perintah dan gaya keluaran dari FreeBSD ifconfig
(yang tidak dimiliki oleh GNU maupun NET-3 ifconfig
, dan yang ip
tentunya tidak memiliki). Jadi saya menulis satu. Sebagai bukti bahwa seseorang dapat menulis sebuah ifconfig
yang menggunakan API netlink di Linux, ia melakukannya.
Jadi kebijaksanaan yang diterima tentang ifconfig
, seperti apa yang Anda kutip, tidak benar lagi. Hal ini sekarang tidak benar untuk mengatakan bahwa " ifconfig
tidak menggunakan netlink.". Selimut yang menutupi dua tidak mencakup tiga.
Itu selalu tidak benar untuk mengatakan bahwa "netlink lebih efisien". Untuk tugas-tugas yang dilakukan seseorang ifconfig
, sebenarnya tidak ada banyak hal terkait efisiensi antara API netlink dan ioctl()
API. Seseorang membuat jumlah panggilan API yang hampir sama untuk setiap tugas yang diberikan.
Memang, setiap panggilan API adalah dua panggilan sistem dalam kasus netlink, berbeda dengan panggilan dalam ioctl()
sistem. Dan bisa dibilang netlink API memiliki kelemahan bahwa pada sistem yang banyak digunakan itu secara eksplisit menggabungkan kemungkinan alat tidak pernah menerima pesan pengakuan yang menginformasikan hasil panggilan API.
Hal ini, lebih jauh lagi, tidak benar untuk mengatakan bahwa ip
adalah "lebih fleksibel" dari GNU dan NET-3 ifconfig
s karena menggunakan netlink . Itu lebih fleksibel karena melakukan lebih banyak tugas, melakukan hal-hal dalam satu program besar yang satu akan dilakukan dengan program terpisah selain ifconfig
. Ini tidak lebih fleksibel hanya dengan berkat API yang digunakan secara internal untuk melakukan tugas-tugas ekstra. Tidak ada yang melekat pada API tentang ini. Satu bisa menulis alat all-in-one yang menggunakan FreeBSD ioctl()
API, misalnya, dan sama-sama baik negara bahwa itu adalah "lebih fleksibel" dari individu ifconfig
, route
, arp
, dan ndp
perintah.
Orang bisa menulis route
,, arp
dan ndp
perintah untuk Linux yang menggunakan API netlink juga.
Bacaan lebih lanjut
ip
lebih fleksibel, karena semua jenis fitur keren tidak mungkin dilakukan dengan menggunakan ioctls di Linux (karena ioctl tidak ada dan kemungkinan tidak akan pernah ada).