Linux Switchdev Mellanox على غرار

هذا نسخ من خطاب ألقاه في Yandex NextHop 2020 - فيديو في نهاية الصفحة






تحية طيبة. اسمي الكسندر زوبكوف ، أريد أن أخبرك عن Linux Switchdev - ما هو وكيف نعيش معه في Qrator Labs.







نحن نستخدم Switchdev على مفاتيح Mellanox منذ حوالي 2-3 سنوات حتى الآن. يتم تصنيف المفاتيح المستندة إلى Spectrum من Mellanox على أنها "المربع الأبيض" ، مما يعني أنه يمكنك وضع أنظمة تشغيل مختلفة على هذه المفاتيح. عادة ما يوفر البائع بعض SDK لهذا وأنظمة التشغيل تستخدم SDK هذا للتفاعل مع المحول. وفي حالة مفاتيح Mellanox ، يوجد نظام تشغيل من Mellanox نفسها ، هناك Cumulus. يتم أيضًا دعم SAI (واجهة تجريد التبديل) - هذه محاولة لإنشاء SDK قياسي لمفاتيح مختلفة ، والتي يتم استخدامها بالفعل ، بدورها ، بواسطة نظام تشغيل SONiC. وبالطبع فإن Switchdev مدعوم بمفاتيح Mellanox.







Switchdev عبارة عن بنية أساسية في Linux kernel تتيح لك إنشاء تعيين لإعدادات الشبكة المعتادة للنواة نفسها إلى datapane ، إلى أجهزة المحول الخاص بك - وهذا ما يسمى offload. توضح الصورة أن اللون الوردي هو محرك التبديل والأزرق هو واجهة برمجة التطبيقات والأدوات المساعدة لتكوين مساحة المستخدم. يعمل Switchdev هنا كوسيط: بالنسبة لمساحة المستخدم ، فهو يمثل نموذج التبديل ، وبالنسبة للسائق ، فإنه يوفر البنية التحتية لتنظيم هذا العرض.







نحن نستخدم مجموعة قياسية من الوظائف على مفاتيح Mellanox: التوجيه ، ECMP ، بشكل عام ، لا شيء غير عادي. كل هذا مدعوم بإمكانية التفريغ إلى خط البيانات. الشيء الوحيد المفقود هو التوجيه المستند إلى السياسة - لا يوجد دعم في برنامج تشغيل Mellanox.







برنامج التشغيل Mellanox موجود في نواة لينكس الفانيليا مع دعم Switchdev - لا حاجة إلى تصحيحات أو برامج تشغيل ثنائية إضافية. يمكنك عمليا أخذ النواة من التوزيعة المفضلة لديك أو تجميع نواة الفانيليا بنفسك واستخدامها. يتم تحديث البرنامج الثابت في المحول بواسطة برنامج التشغيل نفسه - ما عليك سوى إدخال الملف المقابل ، والذي يوجد عادةً في حزمة البرامج الثابتة linux أو شيء مشابه.







لتكوين المحول نفسه ، بالطبع ، تُستخدم أدوات Linux القياسية بكميات كبيرة. يتم أيضًا استخدام مجموعة من iproute2 و ethtool و LLDP-daemon for QoS. و sysctl لبعض الخيارات.







بالنسبة إلى vrf في Linux ، توجد مساحات أسماء للشبكات. ولكن هناك أيضًا ما يسمى بالنظام الفرعي vrf - وهو يختلف عن مساحات أسماء الشبكة. في هذه الحالة ، تكون جميع واجهاتك في نفس مساحة الاسم - عند العمل مع vrf. ومن أجل التحكم في التوجيه ، توجد قاعدة خاصة في قاعدة IP ، والتي تحدد vrf تنتمي الحزمة ، ووفقًا لهذا ، توجهها إلى جدول توجيه محدد. لتكوين هذا - vrf في Linux - يتم إنشاء واجهة خاصة من نوع vrf ويرتبط هذا الجدول بها أثناء الإنشاء. علاوة على ذلك ، إذا كنت ترغب في إضافة بعض الواجهة إلى vrf الخاص بك ، فعندئذٍ باستخدام الأمر ip link ، يمكنك تعيين هذا الجهاز الخاص كواجهة رئيسية لواجهتك.ونظرًا لأن جميع هذه الواجهات موجودة في نفس مساحة الاسم ، فيمكنك تحديد واجهة صريحة من vrf أخرى إلى المسار وبالتالي إنشاء مسارات بين الواجهات.







على سبيل المثال ، لدينا مهمة يساعد فيها التوجيه المستند إلى السياسة - نتلقى حركة المرور من ارتباط صاعد ونريد توجيهها بالكامل وغير مشروط إلى بعض عقد التصفية. في Cisco أو Arista ، سنضع خرائط مسار السياسة أو بعض سياسات الخدمة ، في Linux وقاعدة IP يمكنك القيام بذلك - ولكن في Linux ، كل هذا ، للأسف ، لن يتم إلغاء تحميله.







وعلينا أن نستدير. على سبيل المثال ، قمنا بعمل مثل هذه الميزة - لقد قسمنا vrf إلى جزأين ، أي في جزء واحد - في الجزء الخارجي ، توجد واجهة مع الوصلة الصاعدة الخاصة بنا ، وفي الجزء الداخلي توجد واجهات مع عقد التصفية الخاصة بنا.







وهذا كيف يبدو التوجيه. في vrf الداخلي ، لدينا مجموعة قياسية إلى حد ما من المسارات - أي ، لدينا مسارات داخلية هناك وطريق افتراضي عبر الوصلة الصاعدة الخاصة بنا. وبالفعل في الواجهة الخارجية ، لدينا مسار افتراضي فقط ، لكنه يقع من خلال عقد التصفية الخاصة بنا. وبالتالي ، حصلنا على توجيه يستند إلى سياسة زائفة للواجهات. يتم توجيه كل حركة المرور التي تأتي من خلال واجهة الوصلة الصاعدة على طول مسار مختلف.







وبشكل عام ، عندما تقوم بتكوين مفتاح على Switchdev ، عادة ما يتعين عليك أولاً تكوين المنافذ ، ثم الرابط ، ثم الاتصال بالجسر ، ثم vlans ، و vrfs ، وفي نهاية العنوان والمسارات. هذا تمليه أساسًا بنية الواجهات في Linux - كيف يجب عليك تكوين كل شيء ، حسنًا ، هناك بعض القيود الأخرى التي لا تسمح لك بتغيير الإعدادات بشكل تعسفي. وهذا يعني أن هذا عمل كئيب إلى حد ما ، والذي تم تنفيذه في البداية في شركتنا بواسطة نص برمجي كبير قام بتهيئة كل هذا. لكن ، بالطبع ، يتعين علينا أحيانًا إجراء تغييرات في وقت التشغيل وفي الإنتاج.







يكون الأمر مؤلمًا في بعض الأحيان ، لأنه يتعين عليك فرز هذه البنية يدويًا تقريبًا - لتفكيك بعض الواجهات وإعادة تجميعها ، وهذا كله محفوف بالأخطاء بالطبع. عندما تعمل في Cisco ، تقوم بتغيير الإعدادات وستتولى shell بكل شيء ، ومن ثم يتم إجراء نوع من العمل منخفض المستوى.







حسنًا ، شكرًا لحقيقة أن لدينا Perl - لقد كتبنا نصًا برمجيًا mlxrtr يأخذ مثل هذا التكوين ويولد مجموعات أوامر لتكوين الشبكة وكل شيء آخر. كما أنه يدعم التغييرات - إذا قمت بإجراء أي تغييرات وسيقرأ التكوين الحالي الخاص بك في Linux ويرى ما يجب القيام به لإحضاره إلى الحالة التي تريدها.







في البداية ، إذا قمت بتشغيل هذا التكوين ، فسيؤدي ذلك إلى إنشاء مثل هذه المجموعة من الأوامر لك ، كما أنني ألقيت نفس الأوامر.











هناك عدد غير قليل من الأوامر ، ولكن بشكل عام ، إذا كان لديك في البرنامج النصي الخاص بك ، فيمكن أن يكون أكثر أو أقل دعمًا.







على سبيل المثال ، إذا كنت بحاجة إلى تبديل منفذ إلى سند آخر ، فأنت بحاجة إلى فصل هذا المنفذ عن السند القديم ، وفصل السند الجديد من الجسر ، ثم توصيل المنفذ بذلك السند ، ثم إعادة السند إلى الجسر ، وإعادة تكوين شبكات vlans الموجودة عليه - في بشكل عام ، عمل كئيب إلى حد ما ومن غير السار أن تفعله بيديك بالطبع. يقوم البرنامج النصي بكل هذا بنفسه.







بالإضافة إلى ذلك. ACL قابل للتكوين ... يمكنك استخدام iptables ، لكن لن يتم إلغاء تحميله - يمكنك استخدامه فقط لتصفية التحكم في حركة مرور الطائرة. وإذا كنت تريد التصفية في خط البيانات ، فأنت بحاجة إلى استخدام مرشح tc في حالة Switchdev. وهنا تجدر الإشارة إلى أن مرشح tc سوف يقوم بالفعل بتصفية ليس فقط حركة المرور الموجهة ، ولكن أيضًا تلك التي تم تبديلها. وأيضًا لا يمكن تعليق مرشح tc إلا على المنافذ المادية ، لذلك إذا كنت تعمل مع vlans ، فأنت بحاجة إلى إنشاء المزيد من الإنشاءات المعقدة هنا. ولكن هناك ميزات مثيرة للاهتمام ، على سبيل المثال ، يمكنك تعليق مثل هذا الكتلة على عدة واجهات وسوف يتعثرون (بمعنى المشاركة) في مرشح مشترك. يوجد أيضًا عامل goto في قواعد tc ، وهو أيضًا رائع جدًا ويسمح لك بعمل قوائم تحكم غير خطية ، على عكس Cisco أو Arista.







هنا لدينا أيضًا أداة مساعدة لتكوين acl - mlxacl. نحن نعمل بشكل أساسي مع vlans على المستوى الثالث وتعمل الأداة بطريقة تجعل لكل شبكة محلية ظاهرية سلسلة منفصلة وفي السلسلة الرئيسية تتطابق ببساطة مع شبكات vlans وتنتقل إلى السلسلة المقابلة لشبكة vlan هذه.







هنا ، أيضًا ، هناك مثال على مثل هذا التكوين - هذه الأوامر هي النتيجة. يوجد عدد أقل منها في حالة تكوين المحول نفسه ، لأنه يتم تعيين قاعدة واحدة لأمر واحد تقريبًا - ليس بهذه الصعوبة.







ولكن إذا كان لابد من إجراء بعض التغييرات - في هذه الحالة ، قمت بحذف قاعدة واحدة وتقوم الأداة بكل شيء بطريقة تعيد كتابة جميع السلاسل التي تغيرت ، وبعد ذلك يتم إعادة ترقيمها في سلسلة الصفر - الرئيسية - بحيث تشير إلى سلاسل جديدة. ومن الواضح أنه في هذه الحالة سيكون من الممكن ، بالعمل اليدوي ، حلها بأمر واحد.







لكن لهذا ، نحتاج أولاً إلى إلقاء نظرة على الحالة الحالية وهذا هو الشكل الذي يبدو عليه إخراج مرشح tc - من الصعب جدًا التعامل معه.







عندما تعمل مع كل هذا ، فإن الناس المارة ينظرون إليك هكذا. لذلك ، كتبنا هذه الأداة المساعدة - mlxacl - أولاً ، لأنه كان العمل معها أكثر إيلامًا ، ثم كتبنا كلمة بكلمة وبقية الإعدادات أيضًا.







هذه المرافق التي أخبرتك عنها ، قمنا بنشرها للجمهور على Gitlab - يمكنك استخدامها. تم ترخيصها بموجب MIT ، وبالتالي فهي متاحة مجانًا.







بطبيعة الحال ، دون أي ضمان. هذا زوجان من نصوص Perl (توقعًا لأسئلتك - لأنني أعرف Perl وهو يعمل فقط) ، صغير نسبيًا ، تقريبًا بدون تبعيات - يستخدم زوجًا من وحدات Perl الموجودة في توزيع Perl القياسي وأدوات Linux المساعدة بالطبع.







أخيرًا ، إذا كنت قد عملت قليلاً مع وحدة تحكم تسلسلية ، مع منافذ COM ، فأنا أريد تقديم بعض النصائح. على سبيل المثال ، إذا اعتقد شخص ما أنها طريقة للخروج من Vim ، فقد خمنت ذلك تقريبًا.







بالنسبة لبعض السير ، هذا يعادل Ctrl + Alt + Del ، حيث يرونه من خلال المنفذ التسلسلي. بمعنى ، إذا توقف برنامج bootloader الخاص بك ، على سبيل المثال ، وتحتاج إلى إعادة تشغيل المفتاح بطريقة أو بأخرى ، فيمكنك استخدام.



علاوة على ذلك ، عندما يتعلق الأمر بالنواة ، فإنه يعترض بشكل طبيعي العمل باستخدام لوحة المفاتيح ، لذلك من الأفضل أن يكون لديك هنا SysRq kernel يقبل الأوامر - وإلا فسيكون من الصعب إعادة تشغيل المفتاح. وفي حالة SysRq ، عند العمل باستخدام لوحة مفاتيح وطرف عادي ، يتم استخدام PrintScreen هناك ، وفي حالة وحدة التحكم التسلسلية ، مع منفذ COM ، تحتاج إلى إرسال إشارة فاصل خاصة - في minicom يكون Ctrl + F ، في الشاشة ' e Ctrl + A ، Ctrl + B ، ثم قم بعمل مفتاح SysRq خاص.



ومن أجل الدخول في السير عند التشغيل - في السير الخاص بالمفتاح ، بالطبع ، لأنه في الواقع ، كما هو الحال في الكمبيوتر العادي ، هناك سير يتم تشغيله من خلاله عادةً - يمكنك الضغط على Ctrl + B.



هذا كل ما أردت أن أخبرك به باختصار. إذا كان لديك أي أسئلة ، فسأكون سعيدًا بالإجابة.







النسخة الإنجليزية من المنشور.



All Articles