ترويض USB / IP

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

الجزء الأول تاريخي

إذا كانت الآلة افتراضية - كل هذا سهل. ظهرت وظيفة إعادة توجيه USB من مضيف إلى جهاز افتراضي في برنامج VMWare 4.1. ولكن في حالتي ، كان يجب توصيل مفتاح الأمان ، المعروف باسم WIBU-KEY ، في أوقات مختلفة بأجهزة مختلفة ، وليس فقط الأجهزة الافتراضية.
قادتني الجولة الأولى من البحث في عام 2009 البعيد إلى قطعة حديد تسمى تريند نت TU2-NU4
الايجابيات:

  • في بعض الأحيان يعمل

سلبيات:

  • لا يعمل دائما. لنفترض أن مفتاح الحماية Guardant Stealth II لا يبدأ من خلاله ، فالقسم مع ظهور الخطأ "لا يمكن بدء تشغيل الجهاز".
  • برنامج الإدارة (قراءة - تركيب وفك أجهزة USB) مثير للشفقة إلى أقصى الحدود. مفاتيح سطر الأوامر ، والأتمتة - لا ، لم أسمع. كل شيء باليد فقط. كابوس.
  • يبحث برنامج التحكم عن قطعة الحديد نفسها في الشبكة عن طريق البث ، لذلك يعمل هذا فقط ضمن قطاع شبكة بث واحد. لا يمكنك تحديد عنوان IP الخاص بقطعة الحديد يدويًا. قطعة حديد في شبكة فرعية أخرى؟ ثم لديك مشكلة.
  • سجل المطورون على الجهاز ، فلا فائدة من إرسال تقارير الأخطاء.

الجولة الثانية حدثت في أوقات ليست بعيدة ، وقادتني إلى موضوع المقال - مشروع USB / IP. يجذب بانفتاح ، خاصة وأن الرجال من رياكت قاموا بتوقيع برنامج تشغيل لنظام Windows ، لذا فإن كل شيء يعمل الآن حتى على x64 بدون أي عكازات مثل وضع الاختبار. لذلك شكراً جزيلاً لفريق ReactOS! كل شيء يبدو جميلًا ، دعنا نحاول أن نشعر به ، هل هو كذلك حقًا؟ لسوء الحظ ، تم أيضًا التخلي عن المشروع نفسه ، ولا يمكنك الاعتماد على الدعم - ولكن في حالة عدم اختفاء دعمنا ، يكون المصدر موجودًا ، وسنكتشفه!

الجزء الثاني ، خادم لينكس

لا يمكن إعداد خادم USB / IP الذي يشارك أجهزة USB عبر شبكة إلا على نظام تشغيل قائم على Linux. حسنًا ، Linux هو Linux ، نقوم بتثبيت Debian 8 على جهاز افتراضي في الحد الأدنى من التكوين ، حركة اليد القياسية:

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install usbip

تسوية. علاوة على ذلك ، يقترح الإنترنت أنك ستحتاج إلى تنزيل وحدة USBip ، ولكن - مرحبًا ، أشعل النار أولاً. لا توجد مثل هذه الوحدة. وكل ذلك لأن معظم الأدلة الموجودة على الشبكة تشير إلى الفرع الأقدم 0.1.x ، وفي الإصدار الأخير 0.2.0 ، تحمل وحدات USBip أسماء مختلفة.

وبناء عليه:

sudo modprobe usbip-core
sudo modprobe usbip-host
sudo lsmod | grep usbip

حسنًا ، دعنا نضيف الأسطر التالية إلى / etc / modules لتحميلها تلقائيًا عند بدء تشغيل النظام:

usbip-core
usbip-host
vhci-hcd

لنبدأ خادم usbip:

sudo usbipd -D

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

sudo usbip

بعد قراءة وصف الأوامر ، يتضح أنه من أجل مشاركة جهاز USB المطلوب ، يريد usbip معرفة معرف الناقل الخاص به. أعزائي المشاهدين ، أشعل النار رقم ثلاثة في الساحة: معرف الحافلة الذي سيعطينا lsusb (تبدو الطريقة الأكثر وضوحا) - لا تناسبها! الحقيقة هي أن USBip يتجاهل الأجهزة مثل محاور USB. لذلك ، سوف نستخدم الأمر المضمن:

user@usb-server:~$ sudo usbip list -l
 - busid 1-1 (064f:0bd7)
   WIBU-Systems AG : BOX/U (064f:0bd7)

ملاحظة: فيما يلي في القوائم ، سأصف كل شيء باستخدام مثال مفتاح USB الخاص بي. يمكن أن يختلف اسم الجهاز و VID: زوج PID وسيختلف. المنجم يسمى Wibu-Systems AG: BOX / U ، VID 064F ، PID 0BD7.

الآن يمكننا مشاركة أجهزتنا:

user@usb-server:~$ sudo usbip bind --busid=1-1
usbip: info: bind device on busid 1-1: complete

مرحى أيها الرفاق!

user@usb-server:~$ sudo usbip list -r localhost
Exportable USB devices
======================
 - localhost
        1-1: WIBU-Systems AG : BOX/U (064f:0bd7)
           : /sys/devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb1/1-1
           : Vendor Specific Class / unknown subclass / unknown protocol (ff/00/ff)

ثلاث هتافات ايها الرفاق! شارك الخادم قطعة الحديد عبر الشبكة ويمكننا توصيلها! يبقى فقط لإضافة التشغيل التلقائي لبرنامج usbip الخفي إلى /etc/rc.local

usbipd -D

الجزء الثالث ، جانب العميل ومربك

حاولت توصيل الجهاز المشترك عبر الشبكة بجهاز دبيان على الفور على نفس الخادم ، وكل شيء متصل جيدًا:

sudo usbip attach --remote=localhost --busid=1-1

دعنا ننتقل إلى Windows. في حالتي كان Windows Server 2008R2 Standard Edition. يطلب منك الدليل الرسمي تثبيت برنامج التشغيل أولاً. يتم وصف الإجراء بشكل مثالي في الملف التمهيدي المرفق بعميل windows ، ونحن نفعل كل شيء كما هو مكتوب ، كل شيء يعمل. على XP يعمل أيضًا دون أي مشاكل.

بعد تفريغ العميل ، نحاول تثبيت مفتاحنا:

C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
usbip err: usbip_network.c: 121 (usbip_recv_op_common) recv op_common, -1
usbip err: usbip_windows.c: 756 (query_interface0) recv op_common
usbip err: usbip_windows.c: 829 (attach_device) cannot find device

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

لكنني حقًا لا أريد تنزيل Visual Studio من أجل هذا الإجراء. ولكن لدي هيو القديمة الجيدة. في الكود المصدري ، يُعلن عن الثابت ككلمة مزدوجة. دعونا ننظر في ملف 0x00000106 ، واستبداله بـ 0x00000111. تذكر ، يتم عكس ترتيب البايت. والنتيجة هي مطابقتان ، التصحيح:

[usbip.exe]
00000CBC: 06 11
00000E0A: 06 11

Eeeee ... نعم!

C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
new usb device attached to usbvbus port 1

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

C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
usbip err: usbip_windows.c: 829 (attach_device) cannot find device

و هذا كل شيء. حتى جوجل التي تعرف كل شيء لم تستطع الإجابة عن هذا السؤال بالنسبة لي. وفي الوقت نفسه ، يظهر أمر عرض الأجهزة المتوفرة على الخادم بشكل صحيح تمامًا - هنا ، المفتاح ، يمكنك تحميله. أحاول التثبيت من نظام Linux - إنه يعمل! وإذا حاولت الآن من تحت Windows؟ أوه القرف - إنه يعمل!

الخليع الأخير: لم يتم إضافة شيء ما في كود الخادم. عند مشاركة جهاز ، فإنه لا يقرأ عدد واصفات USB منه. وعند تركيب الجهاز من نظام Linux ، يتم ملء هذا الحقل. لسوء الحظ ، أنا على دراية بالتطوير في نظام Linux على مستوى "make && make install". لذلك ، يتم حل المشكلة باختراق سيئ إلى حد ما - إضافة إلى /etc/rc.local

usbip attach --remote=localhost --busid=1-1
usbip port
usbip detach --port=00

الجزء النهائي

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

المصدر: www.habr.com

إضافة تعليق