رام کردن USB/IP

وظیفه اتصال یک دستگاه USB به یک رایانه از راه دور از طریق یک شبکه محلی به طور مرتب مطرح می شود. در زیر برش، تاریخچه جستجوهای من در این راستا مشخص شده است و مسیر رسیدن به یک راه حل آماده بر اساس یک پروژه منبع باز USB/IP با شرح موانعی که افراد مختلف در این مسیر با دقت تعیین کرده اند و همچنین راه های دور زدن آنها.

بخش اول، تاریخی

اگر دستگاه مجازی است - همه اینها آسان است. عملکرد انتقال USB از یک میزبان به یک ماشین مجازی در VMWare 4.1 ظاهر شد. اما در مورد من، کلید امنیتی که به عنوان WIBU-KEY قابل تشخیص است، باید در زمان‌های مختلف به ماشین‌های مختلف و نه تنها به ماشین‌های مجازی متصل می‌شد.
دور اول جستجو در سال 2009 دور من را به قطعه آهنی به نام TrendNet TU2-NU4
مزایا:

  • گاهی اوقات حتی کار می کند

منفی:

  • همیشه کار نمی کند. فرض کنید کلید حفاظتی Guardant Stealth II از طریق آن شروع نمی شود و با خطای "دستگاه نمی تواند راه اندازی شود" قسم می خورد.
  • نرم افزار مدیریت (بخوانید - نصب و جدا کردن دستگاه های USB) تا حد زیادی رقت انگیز است. سوئیچ های خط فرمان، اتوماسیون - نه، نشنیده ام. همه چیز فقط با دست است. کابوس.
  • نرم افزار کنترل با پخش، خود قطعه آهن را در شبکه جستجو می کند، بنابراین این تنها در یک بخش شبکه پخش کار می کند. نمی توانید آدرس IP قطعه آهن را با دست مشخص کنید. یک تکه آهن در زیرشبکه دیگر؟ اونوقت مشکل داری
  • توسعه دهندگان امتیاز در دستگاه، ارسال گزارش اشکال بی فایده است.

دور دوم در زمان هایی نه چندان دور اتفاق افتاد و من را به موضوع مقاله سوق داد - پروژه USB/IP. با باز بودن جذب می کند، به خصوص از آنجایی که بچه ها از ReactOS آنها یک درایور برای ویندوز امضا کردند، بنابراین اکنون همه چیز حتی در x64 بدون هیچ عصا مانند حالت تست کار می کند. با تشکر فراوان از تیم ReactOS! همه چیز زیبا به نظر می رسد، بیایید سعی کنیم آن را احساس کنیم، آیا واقعا اینطور است؟ متأسفانه، خود پروژه نیز رها شده است، و شما نمی توانید روی پشتیبانی حساب کنید - اما در جایی که پروژه ما ناپدید نشد، منبع آنجاست، ما آن را کشف خواهیم کرد!

بخش دوم، سرور لینوکس

یک سرور USB/IP که دستگاه‌های USB را از طریق شبکه به اشتراک می‌گذارد، فقط می‌تواند روی سیستم‌عامل مبتنی بر لینوکس راه‌اندازی شود. خوب، لینوکس لینوکس است، ما دبیان 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 می خواهد Bus ID آن را بداند. بینندگان عزیز، چنگک شماره سه در عرصه است: شناسه اتوبوس که به ما خواهد داد 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

بخش سوم، سمت مشتری و گیج کننده

من سعی کردم دستگاه مشترک را از طریق شبکه به یک دستگاه Debian بلافاصله در همان سرور متصل کنم، و همه چیز به خوبی وصل شد:

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

بیایید به سراغ ویندوز برویم. در مورد من ویندوز سرور 2008R2 نسخه استاندارد بود. راهنمای رسمی از شما می خواهد که ابتدا درایور را نصب کنید. این روش کاملاً در readme پیوست شده به سرویس گیرنده ویندوز توضیح داده شده است، ما همه چیز را همانطور که نوشته شده است انجام می دهیم، همه چیز درست می شود. در 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 انجام دهند. راه حل پیشنهادی تغییر ثابت در کد منبع و بازسازی مشتری است.

اما من واقعاً به خاطر این روش نمی خواهم ویژوال استودیو را دانلود کنم. اما من یک Hiew قدیمی خوب دارم. در کد منبع، ثابت به عنوان یک کلمه دوگانه اعلام می شود. بیایید در فایل به دنبال 0x00000106 باشیم و آن را با 0x00000111 جایگزین کنیم. به یاد داشته باشید، ترتیب بایت ها معکوس می شود. نتیجه دو مسابقه است، پچ:

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

اییییی... آره!

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

و بس. حتی گوگل دانا هم نتوانست این را برای من پاسخ دهد. و در همان زمان، فرمان نمایش دستگاه های موجود در سرور کاملاً به درستی نشان می دهد - اینجا کلید است، می توانید آن را سوار کنید. من سعی می کنم از زیر لینوکس سوار کنم - کار می کند! و اگر الان از زیر ویندوز امتحان کنید؟ اوه لعنتی - کار می کند!

آخرین رنک: چیزی در کد سرور اضافه نشده است. هنگام اشتراک گذاری یک دستگاه، تعداد توصیفگرهای USB را از آن نمی خواند. و هنگام نصب دستگاه از زیر لینوکس، این فیلد پر می شود. متأسفانه، من با توسعه تحت لینوکس در سطح "ساخت و و نصب" آشنا هستم. بنابراین، مشکل با یک هک نسبتاً کثیف حل می شود - اضافه کردن به /etc/rc.local

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

قسمت نهایی

بعد از کمی تکان دادن، کار می کند. نتیجه دلخواه به دست آمده است، اکنون کلید را می توان بر روی هر رایانه شخصی (و البته غیرقابل نصب) از جمله خارج از بخش شبکه پخش، نصب کرد. اگر بخواهید، می توانید این کار را با استفاده از اسکریپت پوسته انجام دهید. چه خوب است - لذت کاملا رایگان است.
امیدوارم تجربه من به habrazhiteli کمک کند تا چنگکی که روی پیشانی من نقش بسته است را دور بزند. با تشکر از توجه شما!

منبع: www.habr.com

اضافه کردن نظر