Ini adalah transkripsi pidato yang disampaikan di Yandex NextHop 2020 - video di akhir halaman
Salam pembuka. Nama saya Alexander Zubkov, saya ingin memberi tahu Anda tentang Linux Switchdev - apa itu Linux dan bagaimana kami tinggal bersamanya di Qrator Labs.
Kami telah menggunakan Switchdev pada sakelar Mellanox selama sekitar 2-3 tahun sekarang. Sakelar berbasis Spektrum Mellanox diklasifikasikan sebagai "kotak putih", yang berarti Anda dapat meletakkan sistem operasi yang berbeda pada sakelar ini. Biasanya vendor menyediakan beberapa SDK untuk ini dan sistem operasi menggunakan SDK ini untuk berinteraksi dengan sakelar. Dan dalam kasus sakelar Mellanox, ada sistem operasi dari Mellanox itu sendiri, ada Cumulus. SAI (Switch Abstraction Interface) juga didukung - ini adalah upaya untuk membuat SDK standar untuk berbagai switch, yang sudah digunakan, pada gilirannya, oleh sistem operasi SONiC. Dan tentu saja Switchdev didukung oleh switch Mellanox.
Switchdev adalah infrastruktur di kernel Linux yang memungkinkan Anda membuat pemetaan dari pengaturan jaringan biasa dari kernel itu sendiri ke datapane, ke perangkat keras sakelar Anda - ini disebut offload. Gambar menunjukkan bahwa merah muda adalah driver sakelar dan biru adalah API dan utilitas untuk mengkonfigurasi ruang pengguna. Switchdev di sini bertindak sebagai perantara: untuk ruang pengguna ini mewakili model sakelar, untuk pengemudi ia menyediakan infrastruktur untuk mengatur tampilan ini.
Kami menggunakan serangkaian fungsi yang cukup standar pada sakelar Mellanox: perutean, ECMP, secara umum, tidak ada yang tidak biasa. Semua ini didukung dengan kemungkinan pembongkaran ke garis data. Satu-satunya hal yang hilang adalah perutean berbasis kebijakan - tidak ada dukungan di driver Mellanox.
Driver Mellanox berada dalam kernel Linux vanilla dengan dukungan Switchdev - tidak diperlukan patch atau driver biner tambahan. Anda dapat mengambil kernel dari distro favorit Anda atau mengkompilasi kernel vanilla sendiri dan menggunakannya. Firmware di sakelar diperbarui oleh driver itu sendiri - Anda hanya perlu memasukkan file yang sesuai, yang biasanya terdapat dalam paket firmware-linux atau yang serupa.
Untuk mengkonfigurasi sakelar itu sendiri, tentu saja, utilitas Linux standar digunakan dalam jumlah besar. Satu set iproute2, ethtool, LLDP-daemon untuk QoS juga digunakan. Dan sysctl untuk beberapa opsi.
Untuk vrf di Linux, ada kedua namespace jaringan. Tetapi ada juga yang disebut subsistem vrf - ini berbeda dari ruang nama jaringan. Dalam kasus ini, semua antarmuka Anda berada di namespace yang sama - saat bekerja dengan vrf. Dan untuk mengontrol perutean, ada aturan khusus dalam aturan ip, yang menentukan vrf mana dari paket itu dan, sesuai dengan ini, mengarahkannya ke tabel perutean tertentu. Untuk mengkonfigurasi ini - vrf di Linux - antarmuka khusus dari tipe vrf dibuat dan tabel ini terikat padanya selama pembuatan. Dan selanjutnya, jika Anda ingin menambahkan beberapa antarmuka ke vrf Anda, kemudian menggunakan perintah ip link Anda mengatur perangkat khusus ini sebagai antarmuka utama untuk antarmuka Anda.Dan karena semua antarmuka ini berada dalam namespace yang sama, Anda dapat secara eksplisit menentukan antarmuka dari vrf lain ke rute dan dengan demikian membuat rute di antara antarmuka.
Misalnya, kami memiliki tugas di mana perutean berbasis kebijakan akan membantu - kami menerima lalu lintas dari uplink dan ingin mengarahkannya sepenuhnya dan tanpa syarat ke beberapa node pemfilteran. Di Cisco atau Arista, kami akan membuat peta rute kebijakan atau beberapa kebijakan layanan, di Linux dan aturan ip Anda dapat melakukannya - tetapi di Linux semua ini, sayangnya, tidak akan diturunkan.
Dan kita harus berbalik. Sebagai contoh kita telah membuat fitur seperti itu - kita telah membagi vrf menjadi dua bagian, yaitu di satu bagian - di bagian luarnya terdapat interface dengan uplink kita, dan di bagian dalam terdapat interface dengan node filtering kita.
Dan seperti inilah tampilan perutean. Di vrf internal, kami memiliki set rute yang kurang lebih standar - yaitu, kami memiliki rute internal di sana dan rute default melalui uplink kami. Dan sudah di antarmuka eksternal, kami hanya memiliki rute default, tetapi terletak melalui node pemfilteran kami. Jadi, kami mendapat Perutean Berbasis Kebijakan semu untuk antarmuka. Semua lalu lintas yang datang melalui antarmuka uplink dirutekan melalui rute yang berbeda.
Dan secara umum, ketika Anda mengonfigurasi sakelar di Switchdev, Anda biasanya harus terlebih dahulu mengonfigurasi port, lalu menghubungkan, lalu menghubungkan ke jembatan, lalu vlans, vrfs, dan di akhir alamat dan rute. Ini terutama ditentukan oleh struktur antarmuka di Linux - bagaimana Anda harus mengkonfigurasi semuanya, nah, ada beberapa batasan lain yang tidak memungkinkan Anda untuk mengubah pengaturan secara sewenang-wenang. Artinya, ini adalah pekerjaan yang agak suram, yang di perusahaan kami awalnya dilakukan oleh skrip init besar yang mengkonfigurasi semua ini. Namun, tentu saja, terkadang kami harus membuat perubahan pada waktu proses, dalam produksi.
Terkadang menyakitkan, karena Anda harus memilah-milah struktur ini hampir dengan tangan - untuk membongkar beberapa antarmuka, memasangnya kembali, dan tentu saja ini semua penuh dengan kesalahan. Saat Anda bekerja di Cisco, Anda mengubah pengaturan dan shell akan menangani semuanya, dan kemudian beberapa jenis pekerjaan tingkat rendah sedang dilakukan.
Terima kasih untuk fakta bahwa kami memiliki Perl - kami menulis skrip mlxrtr yang menggunakan konfigurasi seperti itu dan menghasilkan set perintah untuk mengkonfigurasi jaringan dan yang lainnya. Dan itu juga mendukung perubahan - jika Anda membuat perubahan dan itu akan membaca konfigurasi Anda saat ini di Linux dan melihat apa yang perlu dilakukan untuk membawanya ke keadaan yang Anda inginkan.
Awalnya, jika Anda menjalankan konfigurasi ini akan menghasilkan seperangkat perintah untuk Anda, dan saya juga membuang perintah yang sama.
Ada beberapa perintah, tetapi secara umum, jika Anda memilikinya di skrip init Anda, maka perintah itu bisa lebih atau kurang didukung.
Misalnya, jika Anda perlu mengganti satu port ke koneksi lain, maka Anda perlu memutuskan koneksi port ini dari koneksi lama, memutuskan koneksi baru dari bridge, kemudian menghubungkan port ke koneksi itu, kemudian mengembalikan obligasi ke bridge, mengkonfigurasi ulang vlan di atasnya - dalam secara umum, pekerjaan yang cukup suram dan tidak menyenangkan melakukannya dengan tangan, tentu saja. Skrip melakukan semua ini dengan sendirinya.
Lebih lanjut. ACL dapat dikonfigurasi ... Anda dapat menggunakan iptables, tetapi tidak akan diturunkan - Anda hanya dapat menggunakannya untuk memfilter lalu lintas pesawat kontrol. Dan jika Anda ingin memfilter di baris data, maka Anda perlu menggunakan filter tc dalam kasus Switchdev. Dan di sini perlu diingat bahwa filter tc sudah akan memfilter tidak hanya lalu lintas yang dirutekan, tetapi juga yang diaktifkan. Dan juga filter tc hanya dapat digantung pada port fisik, jadi jika Anda bekerja dengan vlan, Anda perlu melakukan konstruksi yang lebih kompleks di sini. Tetapi ada fitur menarik di sana, misalnya, Anda dapat menggantung blok seperti itu di beberapa antarmuka dan mereka akan meraba-raba (dalam arti berbagi) filter umum. Ada juga operator goto di aturan tc, yang juga cukup keren dan memungkinkan Anda melakukan acls nonlinear, tidak seperti Cisco atau Arista.
Di sini kami juga memiliki utilitas untuk mengkonfigurasi acl - mlxacl. Kami terutama bekerja dengan vlan di tingkat ketiga dan utilitas bekerja sedemikian rupa sehingga untuk setiap vlan itu membuat rantai terpisah dan di rantai utama itu hanya mencocokkan vlan dan pergi ke rantai yang sesuai untuk vlan ini.
Di sini, juga, ada contoh konfigurasi seperti itu - perintah seperti itu adalah hasilnya. Jumlahnya lebih sedikit daripada dalam kasus konfigurasi sakelar itu sendiri, karena satu aturan dipetakan ke sekitar satu perintah - tidak terlalu sulit.
Tetapi jika Anda harus membuat perubahan - dalam hal ini, saya menghapus satu aturan dan utilitas melakukan semuanya sedemikian rupa sehingga ia menulis ulang semua rantai yang telah berubah, setelah itu mengganti nomor dalam rantai-nol-utama sehingga mereka merujuk ke rantai baru. Dan jelas bahwa dalam hal ini dimungkinkan, dengan pekerjaan manual, untuk menyelesaikannya dalam satu perintah.
Tetapi untuk ini pertama-tama kita perlu melihat keadaan saat ini dan seperti inilah tampilan keluaran filter tc - cukup sulit untuk bekerja dengannya.
Saat Anda menangani semua ini, orang-orang yang lewat melihat Anda seperti ini. Oleh karena itu, kami menulis utilitas ini - mlxacl - pertama, karena jauh lebih menyakitkan untuk bekerja dengannya, lalu kata demi kata dan untuk setelan lainnya kami juga menulis utilitas tersebut.
Utilitas ini, yang sudah saya ceritakan, kami mempostingnya ke publik di Gitlab - Anda dapat menggunakannya. Mereka dilisensikan di bawah MIT, dan karenanya tersedia secara gratis.
Wajar saja, tanpa jaminan apapun. Ini adalah beberapa skrip Perl (mengantisipasi pertanyaan Anda - karena saya tahu Perl dan itu hanya berfungsi), relatif kecil, hampir tanpa ketergantungan - ia menggunakan beberapa modul Perl yang ada dalam distribusi Perl standar dan utilitas Linux, tentunya.
Akhirnya, jika Anda telah bekerja sedikit dengan konsol serial, dengan port COM, saya ingin memberikan beberapa saran. Misalnya, jika seseorang mengira itu adalah cara untuk keluar dari Vim, Anda hampir dapat menebaknya.
Untuk beberapa bios, ini setara dengan Ctrl + Alt + Del, karena mereka melihatnya melalui port serial. Artinya, jika bootloader Anda hang, misalnya, dan Anda harus mereboot sakelar, Anda dapat menggunakan.
Lebih lanjut, ketika datang ke kernel, ia secara alami melakukan intersepsi dengan keyboard, jadi di sini Anda sebaiknya meminta kernel SysRq Anda menerima perintah - jika tidak maka akan sulit untuk memulai ulang sakelar. Dan dalam kasus SysRq, ketika Anda bekerja dengan keyboard dan terminal biasa, PrintScreen digunakan di sana, dan dalam kasus konsol serial, dengan port COM, Anda perlu mengirim sinyal break khusus - di minicom itu adalah Ctrl + F, di layar ' e Ctrl + A, Ctrl + B, lalu buat tombol SysRq khusus.
Dan untuk masuk ke bios saat boot - di bios switch, tentu saja, karena sebenarnya, seperti di komputer biasa, ada bios yang biasanya digunakan untuk boot - Anda dapat menekan Ctrl + B.
Itu saja yang ingin saya sampaikan secara singkat. Jika Anda memiliki pertanyaan, saya akan dengan senang hati menjawabnya.
→ Versi bahasa Inggris dari publikasi.