USB/IP-ի սանձահարում

Պարբերաբար առաջանում է տեղական ցանցի միջոցով USB սարքը հեռավոր համակարգչին միացնելու խնդիրը: Կտրվածքի տակ շարադրված է այս ուղղությամբ իմ որոնումների պատմությունը և բաց կոդով նախագծի վրա հիմնված պատրաստի լուծման ճանապարհը USB/IP այս ճանապարհին տարբեր մարդկանց կողմից խնամքով դրված խոչընդոտների, ինչպես նաև դրանք շրջանցելու ուղիների նկարագրությամբ:

Մաս առաջին, պատմ

Եթե ​​մեքենան վիրտուալ է, այս ամենը հեշտ է: Հոսթից դեպի վիրտուալ մեքենա USB փոխանցման ֆունկցիոնալությունը հայտնվել է VMWare 4.1-ում: Բայց իմ դեպքում անվտանգության բանալին, որը ճանաչելի է որպես WIBU-KEY, պետք է տարբեր ժամանակներում միացված լիներ տարբեր մեքենաների, և ոչ միայն վիրտուալների:
Հեռավոր 2009-ի որոնումների առաջին փուլը ինձ հանգեցրեց երկաթի մի կտորի, որը կոչվում էր TrendNet TU2-NU4
Կոալիցիայում:

  • երբեմն դա նույնիսկ աշխատում է

Դեմ:

  • միշտ չէ, որ աշխատում է: Ենթադրենք, որ Guardant Stealth II պաշտպանության բանալին չի սկսվում դրա միջոցով՝ երդվելով «սարքը չի կարող գործարկվել» սխալով։
  • Կառավարման ծրագրակազմը (կարդալ՝ USB սարքերի միացում և ապամոնտաժում) ծայրահեղ խղճուկ է: Հրամանատարի անջատիչներ, ավտոմատացում - ոչ, չեմ լսել: Ամեն ինչ միայն ձեռքով է: Մղձավանջ.
  • Կառավարման ծրագրաշարը որոնում է երկաթի կտորը ցանցում հեռարձակման միջոցով, ուստի այն աշխատում է միայն հեռարձակվող ցանցի մեկ հատվածում: Դուք չեք կարող ձեռքով նշել երկաթի կտորի IP հասցեն: Երկաթի կտոր այլ ենթացանցում. Հետո դու խնդիր ունես.
  • ծրագրավորողները սարքի վրա միավորներ են հավաքել, սխալի մասին հաշվետվություններ ուղարկելն անիմաստ է:

Երկրորդ փուլը տեղի ունեցավ ոչ այնքան հեռավոր ժամանակներում, և ինձ հանգեցրեց հոդվածի թեմային. USB/IP նախագիծ. Գրավում է բացությամբ, հատկապես որ տղաները ReactOS- ը նրանք Windows-ի համար դրայվեր են ստորագրել, այնպես որ հիմա ամեն ինչ աշխատում է նույնիսկ x64-ի վրա՝ առանց թեստային ռեժիմի նման հենակների: Ինչի համար շատ շնորհակալություն ReactOS թիմին: Ամեն ինչ գեղեցիկ է հնչում, փորձենք դա զգալ, իսկապե՞ս այդպես է։ Ցավոք, նախագիծն ինքնին նույնպես լքված է, և դուք չեք կարող հույս դնել աջակցության վրա, բայց որտեղ մերը չվերացավ, աղբյուրը այնտեղ է, մենք դա կպարզենք:

Երկրորդ մաս, սերվեր-linux

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-ը ցանկանում է իմանալ իր Bus ID-ն։ Հարգելի հեռուստադիտողներ, ասպարեզում է ռեյկ թիվ երեքը՝ ավտոբուսի ID-ն, որը մեզ կտա լսուսբ (դա ամենաակնհայտ ձևն է թվում) - դա նրան չի սազում: Փաստն այն է, որ 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 daemon-ի autostart-ը /etc/rc.local-ում

usbipd -D

Մաս երրորդ, հաճախորդի կողմից և շփոթեցնող

Ես փորձեցի միացնել ընդհանուր սարքը ցանցի միջոցով Debian մեքենային անմիջապես նույն սերվերի վրա, և ամեն ինչ լավ միացավ.

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

Անցնենք Windows-ին։ Իմ դեպքում դա Windows Server 2008R2 Standard Edition էր: Պաշտոնական ուղեցույցը ձեզ խնդրում է նախ տեղադրել վարորդը: Պրոցեդուրան հիանալի նկարագրված է windows client-ին կցված 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

Օ՜, օ՜ Ինչ որ բան այնպես չգնաց. Մենք օգտագործում ենք Google-ի հմտությունը: Կան հատվածական նշումներ, որ ինչ-որ բան այն չէ հաստատունների հետ, սերվերի մասում ծրագրավորողները փոխել են արձանագրության տարբերակը 0.2.0 տարբերակին անցնելիս, բայց նրանք մոռացել են դա անել Win հաճախորդում։ Առաջարկվող լուծումը սկզբնական կոդի հաստատունը փոխելն ու հաճախորդը վերակառուցելն է:

Բայց ես իսկապես չեմ ուզում ներբեռնել Visual Studio-ն այս ընթացակարգի համար: Բայց ես ունեմ մի լավ հին 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

Եվ վերջ։ Նույնիսկ ամենահայտնի Google-ը չկարողացավ պատասխանել ինձ: Եվ միևնույն ժամանակ, սերվերում առկա սարքերը ցուցադրելու հրամանը բավականին ճիշտ է ցույց տալիս. ահա այն բանալին, դուք կարող եք տեղադրել այն: Ես փորձում եմ տեղադրել Linux-ի տակից, այն աշխատում է: Իսկ եթե հիմա փորձենք Windows-ի տակից? Oh shit - այն աշխատում է:

Վերջին փոցխը. ինչ-որ բան չի ավելացվել սերվերի կոդում: Սարքը համօգտագործելիս այն չի կարդում դրանից USB նկարագրիչների թիվը: Իսկ սարքը Linux-ի տակից մոնտաժելիս այս դաշտը լրացվում է։ Ցավոք, ես ծանոթ եմ Linux-ի մշակմանը «make && make install» մակարդակում: Հետեւաբար, խնդիրը լուծվում է բավականին կեղտոտ հաքերով` ավելացնելով /etc/rc.local-ին

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

Մասի եզրափակիչ

Մի քիչ ջութակահարելուց հետո այն աշխատում է: Ցանկալի արդյունքը ստացվել է, այժմ բանալին կարող է տեղադրվել ցանկացած համակարգչի վրա (և ապամոնտաժվել, իհարկե, նույնպես), ներառյալ հեռարձակման ցանցի հատվածից դուրս: Եթե ​​ցանկանում եք, կարող եք դա անել՝ օգտագործելով shell script: Ինչ լավ է, հաճույքը բացարձակապես անվճար է:
Հուսով եմ, որ իմ փորձը կօգնի habrazhiteli-ին շրջանցել այն փոցխը, որը դրոշմված է իմ ճակատին։ Շնորհակալություն ուշադրության համար!

Source: www.habr.com

Добавить комментарий