Outrun: نفذ أمرًا محليًا باستخدام قوة المعالجة لجهاز Linux آخر

3

يتيح لك Outrun تنفيذ أمر محلي باستخدام قوة المعالجة لجهاز Linux آخر.

  • لا داعي لتثبيت الأمر أولاً على الجهاز الآخر.
  • مرجع الملفات والمسارات المحلية كما تفعل عادة.
  • يعمل عبر توزيعات Linux مختلفة تمامًا ، مثل Ubuntu و Alpine.

المحتويات

  • تثبيت
  • الاستخدام
  • كيف يعمل
  • القيود
  • الأسئلة الشائعة
  • رخصة تطوير

تثبيت

يتطلب Outrun Python 3.7 ويمكن تثبيته ببساطة باستخدام نقطة:

 تثبيت pip3 outrun

 

يجب تثبيته على جهازك الخاص وأي أجهزة ستستخدمها لتشغيل الأوامر. على تلك الأجهزة الأخرى ، يجب التأكد من تثبيتها عالميًا ، بحيث يمكن أن تبدأ بأمر مثل ssh user @ host outrun .

بالإضافة إلى تجاوز نفسه ، عليك أيضًا تثبيت مكتبة FUSE 3.x. معظم توزيعات Linux تدرجه في حزمة تسمى ببساطة fuse3 .

 الاستخدام

المتطلبات الأساسية

يجب أن يكون لديك حق الوصول إلى الجذر إلى الجهاز الآخر ، إما من خلال القدرة على الدخول إلى SSH مباشرة باعتباره


جذر

أو بامتلاك sudo التمكن من. يعد هذا ضروريًا لأن outrun يستخدم chroot.

نظرًا لأن الجهاز البعيد سيكون له حق الوصول الكامل إلى نظام الملفات المحلي كمستخدم حالي ، تأكد من استخدام الأجهزة التي تثق بها فقط .

مثال

إذا كنت تشغل عادة:


ffmpeg -i المدخلات .mp4 -vcodec libx265 -crf 28 output.mp4

ثم يمكنك السماح للخروج بتنفيذ نفس الأمر باستخدام قوة المعالجة user @ host

مثل هذا:


تجاوز المستخدم @ host ffmpeg -i input.mp4 -vcodec libx265 -crf 28 output.mp4

لا يحتاج FFMPEG للتثبيت على الجهاز الآخر و input.mp4 / output.mp4

ستتم قراءتها من القرص الصلب المحلي وكتابتها كما تتوقع.

 

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

إعدادات

مشاهدة إخراج outrun –help

للحصول على نظرة عامة على الخيارات المتاحة لتخصيص السلوك. يمكن تكوين ذاكرة التخزين المؤقت الدائمة على كل جهاز بعيد عن طريق إنشاء ~ / .outrun / config ملف مثل هذا:


 

المسار=~ / .outrun / ذاكرة التخزين المؤقت max_entries =1024 اقصى حجم=21474836480

# بايت -> 20 جيجا بايت

كيف تعمل

عمل أمر على جهاز مختلف

دعونا ننظر في ffmpeg

الأمر من المثال وتقييم ما هو ضروري لتشغيله على الجهاز الآخر كما لو كان يعمل محليًا.

نحتاج أولاً إلى طريقة ما لتشغيل الأوامر ومراقبة س utput على جهاز آخر في المقام الأول ، لذلك يبدأ كل شيء بجلسة SSH عادية. حاول تشغيل ssh -tt user @ host htop وستلاحظ أنه من السهل تشغيل برنامج تفاعلي عن بُعد باستخدام SSH يوفر تجربة مشابهة جدًا لبرنامج قيد التشغيل محليًا.

بالطبع ، لسنا مهتمين بتشغيل البرامج المثبتة على

أخرى

بل آلة ) ffmpeg برنامج على موقعنا

تملك آلة

. الطريقة المباشرة للبدء هي scp / usr / bin / ffmpeg قابل للتنفيذ على الجهاز الآخر ومحاولة تشغيله هناك. للأسف ستجد على الأرجح أن ما يلي سيحدث عندما تحاول تنفيذه:

 $ ./ffmpeg ./ffmpeg: غير موجود 

هذا لأن الملف التنفيذي مرتبط ديناميكيًا ويحاول تحميل تبعيات مكتبته من نظام الملفات ، والذي لا يوجد على الجهاز الآخر. يمكنك استخدام ldd لمعرفة المكتبات المشتركة التي يعتمد عليها ملف ELF التنفيذي مثل هذا على:


$ ldd `الذي ffmpeg` linux-vdso.so.1 (0x00007fffb7796000) libavdevice.so.58=> /usr/lib/libavdevice.so .58 (0x00007f2407f2a000) libavfilter.so.7=> /usr/lib/libavfilter.so.7 (0x00007f2407be0000) libavformat.so.58=> /usr/lib/libavformat.so.58 (0x00007f2407977000) libavc=> /usr/lib/libavcodec.so.58 (0x00007f2406434000) libpostproc.so.55=> /usr/lib/libpostproc.so.55 (0x00007f2406414000) libswresample.so.3=> /usr/lib/libswresample.so .3 (0x00007f24063f4000) …

يمكننا أيضًا نسخ كل هذه المكتبات بشق الأنفس ، ولكن هذا لن يكون بالضرورة نهاية الأمر. برنامج مثل Blender ، على سبيل المثال ، يحمل أيضًا الكثير من التبعيات الأخرى مثل ملفات Python بعد بدء تشغيله. حتى لو قمنا بفوضى نظام الملفات البعيد بكل هذه التبعيات ، فلن نتمكن من تشغيل الأمر الأصلي منذ

input.mp4

غير موجود على الجهاز الآخر.

للتعامل مع الواقع الحتمي المتمثل في أن البرامج قد تحتاج إلى الوصول إلى أي ملف في نظام الملفات المحلي ، فإن التجاوز ببساطة يعكس نظام الملفات الكامل للجهاز المحلي عن طريق تثبيته عبر الشبكة. يتم ذلك عن طريق تركيب نظام ملفات FUSE على الجهاز البعيد الذي يعيد توجيه جميع عملياته ، مثل سرد الملفات في دليل ، إلى خدمة RPC على الجهاز المحلي. تعرض خدمة RPC هذه ببساطة وظائف مثل readdir () و stat ()

للتفاعل مع نظام الملفات المحلي.

قد تتساءل لماذا لا نستخدم حل نظام ملفات الشبكة الحالي مثل NFS أو SSHFS. تكمن المشكلة في أنه من الصعب أتمتة الإعداد السريع للجلسات المخصصة. يحتاج NFS إلى الإعداد باستخدام ملفات التكوين ويتطلب SSHFS أن تتمكن الآلة البعيدة من إعادة SSH إلى الجهاز المحلي. في المقابل ، نظام ملفات RPC المضمن هو خادم TCP خفيف الوزن مع رمز مميز لكل جلسة يمكن نقله بأمان عبر جلسة SSH التي نستخدمها بالفعل. إن وجود حل مخصص يفتح أيضًا فرصًا لكثير من التحسينات كما سنرى لاحقًا.

لنفترض أننا قمنا بتركيب نظام ملفات الجهاز المحلي على / tmp / local_fs

. يمكننا الآن الوصول بسهولة إلى FFMPEG على / tmp / local_fs / usr / bin / ffmpeg

وجميع تبعيات مكتبتها في / tmp / local_fs / usr / lib . لسوء الحظ ، لا يبدو أننا قد أحرزنا تقدمًا كبيرًا حتى الآن:

 $ / tmp / local_fs / usr / bin / ffmpeg / tmp / local_fs / usr / bin / ffmpeg: غير موجود 

المشكلة أننا لا تزال تبحث عن تبعياتها في / usr / lib على الجهاز البعيد. يمكننا حل هذه المشكلة من خلال اللعب بمتغيرات البيئة مثل $ LD_LIBRARY_PATH لجعل FFMPEG يبحث عن مكتبات في / tmp / local_fs / usr / lib

، ولكن بعد ذلك عدنا للتو لحل مشكلة صغيرة واحدة في كل مرة. لا داعي للقلق بشأن هذا إذا كان بإمكاننا التظاهر بأن / tmp / local_fs يكون نظام ملفات الجذر بحيث / usr / lib يعيد التوجيه تلقائيًا إلى / tmp / local_fs / usr / lib بدلاً من ذلك. يمكننا فعل ذلك بالضبط باستخدام chroot.

 $ chroot / tmp / local_fs / bin / bash # ffmpeg -i input.mp4 -vcodec libx265 -crf 28 output.mp4 ffmpeg version n4.2.3 حقوق النشر (c) 2000-2020 the FFmpeg للمطورين ... input.mp4: لا يوجد مثل هذا الملف أو الدليل 

إنها تعمل! حسنًا ، تقريبًا. ما زلنا نفتقد بعض السياق الذي كان من المقرر تنفيذ الأمر الأصلي فيه. لتتمكن من إيجاد input.mp4

ولتخزين الإخراج. mp4

في المكان المناسب ، نحتاج أيضًا إلى التبديل إلى دليل العمل الأصلي نفسه.

 # cd / home / user / videos # ffmpeg -i input.mp4 -vcodec libx265 -crf 28 output.mp4 ... # ls input.mp4 output.mp4

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

 

$ HOME

قد يؤثر على مكان تحميل ملفات التكوين من و $ LANG قد يؤثر على لغة عرض بعض البرامج.

إذا كنت ستعود الآن إلى جهازك الخاص وتلقي نظرة على الأصل

/ home / user / videos ، سوف انظر أن output.mp4

هناك كما لو أننا لم نشغل FFMPEG على جهاز مختلف تمامًا!

الاقوي

بينما يعمل هذا النهج ، يترك الأداء الكثير مما هو مرغوب فيه. إذا كنت تتصل بخادم عبر الإنترنت ، حتى لو كان في منطقة قريبة منك ، فمن المحتمل أن يكون زمن انتقالك إليه 20 مللي ثانية على الأقل. هذا أيضًا هو الوقت الذي ستستغرقه كل عملية من عمليات نظام الملفات وهذا يزيد بسرعة. على سبيل المثال ، يحتوي FFMPEG على 110 مكتبة مشتركة يجب تحميلها على جهازي ، مما يعني أن مجرد البحث عن سماتها سيستغرق 2.2 ثانية! إذا اضطررنا إلى القيام بكل عملية نظام ملفات على الشبكة بسذاجة مثل هذه ، فلن يكون التجاوز أمرًا ممكنًا حقًا. لهذا السبب يأتي نظام ملفات شبكة outrun بنوعين من التحسينات: التخزين المؤقت والجلب المسبق.

يخزن Outrun باستمرار جميع الملفات التي تتم قراءتها من دلائل النظام مثل / البيرة / بن و / lib ، والمعروف أنها تحتوي على تطبيقات و التبعيات. يُفترض أن تظل هذه الدلائل دون تغيير طوال مدة جلسة الفائض. ستتحقق كل جلسة جديدة من تغيير أي من الملفات المخزنة مؤقتًا وتحديثها حسب الضرورة. هذه الإستراتيجية البسيطة كافية لجعل نفس البرنامج يبدأ بشكل أسرع في المرة الثانية ، وغالبًا ما يساعد أيضًا برامج أخرى حيث يتم مشاركة العديد من التبعيات مثل glibc. تُستخدم سياسة ذاكرة التخزين المؤقت LRU للتخلص من الملفات التي لم يتم استخدامها منذ فترة.

بالنسبة للأدلة الأخرى ، يتيح outrun للنواة إجراء تحسينات أساسية مثل قراءة الملفات في الأجزاء الكبيرة والتخزين المؤقت للكتابات الصغيرة في عملية كتابة واحدة كبيرة ، مثل NFS.

حيث ينحرف نظام ملفات outrun حقًا عن أنظمة ملفات الشبكة العامة هو نهجها القوي للجلب المسبق. على سبيل المثال ، عندما يكون ملف تنفيذي مثل / usr / bin / ffmpeg ، ومن المحتمل جدًا أن يتم تنفيذه وسيتم تحميل مكتباته المشتركة بعد ذلك. لذلك عند يفتح دعوة لـ / usr / bin / ffmpeg

، فلن يقوم فقط بنقل هذا الملف القابل للتنفيذ بالكامل في وقت مبكر ، ولكن أيضًا ينقل جميع مكتباته المشتركة البالغ عددها 110 وبيانات تعريف نظام الملفات المرتبطة بها في عملية واحدة. إذا كان هذا الافتراض صحيحًا ، والذي سيكون كذلك بشكل عام ، فقد قمنا بتخفيض المئات من stat () / readlink () /افتح()/اقرأ()/أغلق() لمكالمة RPC واحدة مع 20 مللي ثانية زائدة لمرة واحدة.

مثال آخر على مثل هذا الجلب المسبق هو افتراض أنه إذا كان . py

تم الوصول إليه ، ومن المحتمل أن يتم تفسيره وستبحث Python قريبًا عن تجميعه . pyc رفيق. لذلك يتم إرسال هذا الملف على الفور معه. إذا لم يكن الدليل __ pycache __ غير موجود ، ثم نقوم ببساطة بإحضار الموجود

الذي قد ينتج عن محاولة الوصول إليه بدلاً من ذلك.

نظرًا لأن الملفات المترجمة تميل إلى الضغط جيدًا ، فإن جميع محتويات الملفات التي تتم قراءتها بالكامل هي أيضًا نقل بضغط LZ4 لتوفير عرض النطاق الترددي. توثيق

إذا كنت ترغب في قراءة المزيد من التفاصيل حول التجاوز وقرارات التصميم الخاصة به ، فقم بإلقاء نظرة على الكود المصدري. تحتوي كل وحدة (نظام الملفات ، RPC ، تنسيق التشغيل) على وثائق أكثر تحديدًا في سلاسلها.

القيود

هناك عدة أمور يجب وضعها في الاعتبار أثناء استخدام outrun:

  • لا يزال أداء نظام الملفات يمثل عنق الزجاجة ، لذا فإن أحمال العمل الأكثر ملاءمة تكون حسابية المهام المقيدة مثل تتبع الأشعة وتشفير الفيديو. استخدام outrun لشيء مثل git status يعمل ، لكن لا يوصى به.
  • نظرًا لأن البرنامج المراد تنفيذه يتم نسخه من جهازك الخاص إلى الجهاز البعيد ، يجب أن يكون متوافقًا مع النظام الثنائي. لا يمكن إعداد جلسة من جهاز x86 إلى جهاز ARM ، على سبيل المثال.
  • سيستخدم الأمر الأمر الشبكة وتاريخ / وقت الآلة البعيدة.
    • إذا كنت تريد الوصول إلى نقاط النهاية المحلية ، فيجب إعادة توجيهها صراحةً باستخدام معلمة إشارات SSH لإعداد إعادة التوجيه عن بُعد.

التعليمات

    • هل يدعم التجاوز عدة جلسات في نفس الوقت؟
      • نعم ، يمكنك تشغيل البرنامج على العديد من الأجهزة المختلفة في وقت واحد. يمكن أن تدعم كل آلة بعيدة أيضًا العديد من الأجهزة المختلفة التي تتصل بها في نفس الوقت بأنظمة ملفات مختلفة تمامًا.
    • لماذا تم تجاوزه بلغة بايثون؟
      • تمت كتابة النموذج الأولي الأصلي لـ outrun بلغة C ++ ، ولكن اتضح أن Python ومكتبتها القياسية تجعل الأمر أسهل كثيرًا صمغ تنسيق العمليات وتفاعلات نظام التشغيل. فيما يتعلق بأداء نظام الملفات ، فإنه لا يحدث فرقًا كبيرًا نظرًا لأن زمن انتقال الشبكة هو إلى حد بعيد العقبة الأكبر.

 

تطوير

 التحليل الثابت وأسلوب الكود

 

تمت كتابة Outrun للاعتماد بشكل كبير على تلميحات الكتابة لأغراض التوثيق وللسماح بالتحليل الثابت باستخدام mypy. بالإضافة إلى ذلك ، يتم استخدام flake8 لفرض نمط الكود ويستخدم pylint للقبض على مشاكل إضافية.


تجاوز mypy flake8 pylint outrun

اختبارات

يأتي Outrun مع مجموعة اختبار لجميع الوحدات الفردية بناءً على pytest.


pytest – فتيل – cov=تجاوز / تجاوز الاختبارات

نظرًا لأن الكثير من الوظائف في تجاوز يعتمد على تفاعل نظام التشغيل ، فإن مجموعة الاختبار الخاصة به يتضمن أيضًا اختبارات تكامل كاملة تحاكي الاستخدام مع جهاز افتراضي متصل بجهاز افتراضي آخر. تم إعداد هذه باستخدام Vagrant ويمكن تشغيلها عن طريق تضمين – المتشرد علم:

 pytest - vagrant --cov=تجاوز / تجاوز الاختبارات

 

الترخيص

Outrun مرخص بموجب الإصدار 2.0 من ترخيص Apache.