Folosind pachetul gratuit USBIP pentru a redirecționa USB în interiorul mașinilor virtuale. Redirecționarea unui disc USB către o mașină virtuală Hyper-V.

Bună ziua, prieteni, mă bucur că ați vizitat site-ul meu, astăzi ne vom uita la întrebarea cum să organizăm USB într-o rețea și cum să-l folosiți în virtualizare. Subiectul este destul de relevant, iar o astfel de sarcină este întâlnită din ce în ce mai des.

usb prin rețea

După cum știți deja, virtualizarea a făcut parte din viața noastră de mult timp. Capacitățile serverelor sunt în creștere și, în mod natural, au apărut tehnologii pentru utilizarea lor rațională, care implică izolarea și utilizarea normală a resurselor, ceea ce a dat naștere mașinilor virtuale, care sunt deja folosite în găzduire și centre de date. Am vorbit deja despre toate acestea, dacă vă interesează, uitați-vă la linkurile din stânga și mai sus.

După cum știți uneori, unele programe licențiate, am nevoie pentru lucru pe usb cheie. Anterior în varianta clasica când eram doar servere fizice, nu au existat probleme cu funcționarea unei astfel de scheme, dar odată cu apariția virtualizării a ieșit la iveală.

Din păcate, unii hipervizori nu au capacitatea de a redirecționa direct de pe server dispozitive USB. Un exemplu este Hyper-V de la Microsoft, care din 208 încă nu are această capacitate, spre deosebire de vMvare, care permite acest lucru și v-am spus deja cum să redirecționați un modem USB către vmware esxi.

Nu vă grăbiți să vă supărați, adepți ai gigantului Redmond, tehnologia vă vine în ajutor USB prin IP sau AnywhereUSB. USB over IP vă permite să vă conectați usb prin rețea.

AnywhereUSB este o rețea mică mufa USB. Mai jos sunt modele de modele de pe piață.

  • AnywhereUSB /2 – 2 porturi USB


  • AnywhereUSB/ 5 – 5 porturi USB


  • AnywhereUSB /14 – 14 porturi USB



Configurarea AnywhereUSB

Să ne uităm la modul în care hardware-ul este configurat pentru a oferi acces USB prin rețea.

Asa va arata.


Există mai multe interfețe pentru configurarea și gestionarea dispozitivului:
Interfață web pentru configurare, monitorizare și administrare;
• Utilitar de configurare AnywhereUSB;
• Interfață de linie de comandă Telnet;
• Protocol simplu de gestionare a rețelei (SNMP).

Pentru a configura dispozitivul, luați în considerare interfața Web - ca fiind cea mai convenabilă și simplă opțiune.

gestionarea adresei IP

Există mai multe opțiuni pentru atribuirea unei adrese IP la AnywhereUSB:
• Adresa IP statică;
• Atribuire IP dinamică - Utilizarea protocolului de configurare dinamică a gazdei (DHCP);
• Adresare IP privată automată (APIPA), cunoscută mai ales ca Auto-IP;

Cum înțelegi cel mai mult Calea cea buna aceasta este o adresă IP statică. Este setat în elementul Configurare rețea.


În același meniu este foarte convenabil să setați serviciile de rețea disponibile pe acesta.



În fila Gestionare conexiuni puteți vizualiza conexiunile curente.



Acum, ce trebuie făcut în continuare pe mașina virtuală, totul este incredibil de logic aici, trebuie să instalați drivere de pe AnywhereUSB acolo și să setați adresa IP a dispozitivului. După cum puteți vedea, l-am conectat deja și are o adresă IP internă.


Prin utilizarea utilitate specială, Anywhere View poate verifica disponibilitatea și gradul de ocupare a tuturor dispozitivelor. Acesta este poate cel mai simplu și metoda de incredere redirecționând jetoane, unități flash și diverse modemuri către mașinile tale virtuale, dispozitivele în sine costă diferit, dar dacă ai cheltuit deja bani pe software și hipervizoare, cred că, dacă este necesar, cumpără și asta :).


Foarte Unealtă puternicăîn mâini capabile. Potrivit diverselor motive tehnice mașina virtuală nu are acces direct implicit pe unitatea USB. În acest articol ne vom da seama cum să transferăm un disc USB pe un virtual Mașină Hyper-V. Implementarea ideii va fi simplă, s-ar putea spune, în două clicuri. Nici unul programe suplimentare, așa cum ne sfătuiesc uneori „gurus” fotoliilor, nu veți avea nevoie de el, ne folosim propriile mâini și nimic mai mult.

IMPORTANT. Nu vom putea transfera dispozitive amovibile, adică dispozitive amovibile în VM, deși există câteva trucuri în acest sens, dar nu este vorba acum despre asta. Algoritmul nostru funcționează numai pentru USB-urile care sunt afișate ca fixe. Nu vom putea face un instantaneu pentru astfel de discuri.

Să începem manipularea




IMPORTANT. Nu este deloc necesar să opriți VM-ul înainte de a adăuga un hard disk. Pentru asta există tehnologie specială adăugarea la cald și îndepărtarea la cald.

  1. Ne conectăm la VM prin rdp sau pur și simplu deschidem consola. Să trecem la managementul discurilor. Dacă cel nou este la locul lui, atunci facem totul bine. Să verificăm dacă este online. Dacă nu, atunci o reparăm, ca și înainte, sunând meniul contextual. Partițiile noastre nu au puncte de montare și litere, acest lucru trebuie corectat. Faceți clic pe oricare dintre secțiuni Click dreaptași selectați „Schimbați litera unității sau calea către aceasta...”. Alegem orice gratuit.

Redirecționarea USB către mașina virtuală Hyper-V este completă, acum o putem folosi în scopurile noastre.

Aceste instrucțiuni sunt corecte începând cu versiunea 2.

Se pare că de ce să scrieți altceva când există instrucțiuni oficiale? Totuși, există ceva aici care nu există.

Există două opțiuni pentru a transfera un dispozitiv USB pe sistem invitat:

  • transferați un anumit dispozitiv către „oaspete”;
  • transferați portul USB la care este conectat acest dispozitiv.

Redirecționarea dispozitivelor USB

Daca este disponibil cheie USB protecție, sau stocare externă, atunci este mai convenabil să transferați dispozitivul în sine direct în sistemul oaspeților, indiferent de portul USB la care este conectat fizic acest dispozitiv. La urma urmei, în timpul întreținerii, îl putem conecta la un alt conector data viitoare.

# lsusb Bus 002 Dispozitiv 002: ID 8087:8000 Intel Corp. Bus 002 Dispozitiv 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 001 Dispozitiv 002: ID 8087:8008 Intel Corp. Bus 001 Dispozitiv 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 004 Dispozitiv 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 003 Dispozitiv 004: ID 051d:0002 American Power Conversion Uninterruptible Power Supply 00003 Dispozitiv 0003 :0002 American Power Conversion Alimentare neîntreruptibilă Bus 003 Dispozitiv 002: ID 046d:c00c Logitech, Inc. Optical Wheel Mouse Bus 003 Dispozitiv 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Găsim dispozitivul de care avem nevoie și îi luăm ID-ul, pe care îl vom folosi.

Sarcina mea a fost să trimit UPS.
(Situația nu este de fapt tipică, este mai degrabă o serie de cum nu ar trebui să fie: către server și hardware de rețea Au fost furnizate 2 dintre cele mai simple surse de alimentare neîntreruptibilă pentru stațiile de lucru. UPS s-a dovedit a fi delicat și a început să țipe cu sau fără motiv. Să le taie repede vocea și să nu se ocupe încă de Control UPS de la Debian și s-a decis să se conecteze două UPS-uri la oaspeții Windows.)

În această etapă, am descoperit că ambele dispozitive de care aveam nevoie aveau același ID... Dar să încercăm.

Dispozitivele redirecționate sunt înregistrate în Fișier de configurare mașina virtuală corespunzătoare.

# nano /etc/pve/qemu-server/101.conf usb0: host=051d:0002

Repornit. Aparatul a fost ridicat, totul părea să fie în regulă. Dar apoi ne amintim că al doilea dispozitiv are același identificator. Cum să le distingem? Și într-adevăr, experiența a arătat că, dacă atribui același identificator la două mașini virtuale, acestea vor lua același dispozitiv una de la cealaltă când sunt pornite. În ciuda faptului că sistemul gazdă are mai multe dispozitive USB cu acest identificator.

Aici ne amintim că există o altă modalitate de transmitere.

Redirecționarea portului USB

Trebuie să stabilim la ce port este conectat dispozitivul de care avem nevoie.

Prima cale:

# lsusb -t /: Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/6p, 5000M /: Bus 03.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/15p, 480M |__ Port 4: Dev 2, If 0, Class=HID, Driver=usbhid, 1.5M |__ Port 7: Dev 3, If 0, Class=HID, Driver=usbfs, 12M |__ Port 8: Dev 4, If 0, Clasa=HID, Driver=usbfs, 12M /: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=ehci_hcd/3p, 480M |__ Port 1: Dev 2, If 0, Class=hub, Driver=hub/ 8p, 480M /: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci_hcd/3p, 480M |__ Port 1: Dev 2, If 0, Class=hub, Driver=hub/6p, 480M

După cum sa dovedit mai târziu, dispozitivele de care aveam nevoie erau pe autobuzul 3, porturile 7 și 8. Dar deocamdată acest lucru nu este evident pentru noi și iată a doua opțiune:

monitor Qm qm> info usbhost Bus 3, Adr 4, Port 8, Speed ​​​​12 Mb/s Class 00: dispozitiv USB 051d:0002, Back-UPS XS 650CI FW:892.R2.I USB FW:R2 Bus 3, Adr 3, Port 7, Viteză 12 Mb/s Clasa 00: Dispozitiv USB 051d:0002, Back-UPS XS 650CI FW: 892.R2.I USB FW:R2 Bus 3, Adr 2, Port 4, Viteză 1,5 Mb/s Clasa 00: Dispozitiv USB 046d:c00c, Mouse optic USB

Aici vedem clar cine este cine. Și acum cu îndrăzneală:

# nano /etc/pve/qemu-server/101.conf usb0: host=3-7

Pentru a completa imaginea, voi completa instrucțiunile cu un exemplu din documentația oficială.

Următoarea opțiune este posibilă:

monitor Qm qm> info usbhost Bus 3 , Adr 2, Port 1.2 , Viteza 1.5 Mb/s Specific furnizor: Dispozitiv USB 0529:0001, HASP 2.17

Astăzi, există destul de multe moduri de a transfera un dispozitiv USB pe un alt computer sau mașină virtuală prin rețea.
Cele mai populare sunt produsele hardware precum AnywhereUSB și produsele pure software, dintre cele pe care le-am încercat eu însumi: USB Redirector și USB/IP.
Aș vrea să vă mai spun un lucru intr-un mod interesant, care funcționează direct cu emulatorul QEMU.
De asemenea, face parte din proiectul de condimente, susținut oficial de RedHat.

UsbRedir este un protocol deschis pentru redirecționarea dispozitivelor USB prin TCP către o telecomandă server virtual, dezvoltat cu sprijinul RedHat ca parte a proiectului spice. Dar după cum se dovedește, îl puteți folosi cu succes fără condimente. Rolul serverului este usbredirserver, care trimite un dispozitiv USB la un anumit port, iar clientul este QEMU însuși, care emulează conectarea unui dispozitiv USB exportat la un anumit controler USB al mașinii tale virtuale. Datorită acestei abordări, absolut orice sistem de operare poate fi folosit ca sistem invitat, deoarece nici măcar nu știe că dispozitivul este transmis de la distanță și toată logica cade pe QEMU.

În primul rând, câteva cuvinte despre soluțiile de mai sus

  • AnywhereUSB este o soluție destul de bună, dar costisitoare și are probleme neplăcute, de exemplu, dacă o unitate flash partajată cade, o puteți reconecta din nou doar prin scoaterea și introducerea fizică a acesteia.
  • USB/IP - proiect OpenSource. Se pare că a fost abandonat. De fapt, este destul de defectuos. Când conexiunea este pierdută, aparatul intră adesea în blocare completă, iar Windows afișează BSOD
  • USB Redirector - Software minunat. Pentru partajarea dispozitivelor de la Linux la Linux este gratuit, în toate celelalte cazuri costă deja bani, nu la fel de mult ca AnywhereUSB, dar nu gratuit pe cât ne-am dori :)
După cum puteți vedea, există multe dintre care să alegeți, dar să încercăm în sfârșit o altă metodă - UsbRedir?

Configurarea unei mașini virtuale

Pentru a avea undeva unde să conectați dispozitivele exportate, trebuie să creați controlerele USB necesare pe mașina virtuală:

  • uhci - pentru USB1.0
  • ehci - pentru USB2.0
  • xhci - pentru USB3.0
Pentru qemu (fără libvirt)

Adăugați opțiuni la comanda de pornire a mașinii virtuale:
-device ich9-usb-ehci1,id=ehci,addr=1d.7,multifunction=on -device ich9-usb-uhci1,id=uhci-1,addr=1d.0,multifunction=on,masterbus=ehci.0 ,firstport=0 -device ich9-usb-uhci2,id=uhci-2,addr=1d.1,multifunction=on,masterbus=ehci.0,firstport=2 -device ich9-usb-uhci3,id=uhci-3 ,addr=1d.2,multifunction=on,masterbus=ehci.0,firstport=4

Pentru libvirt
ÎN fișier sursă configurațiile mașinii virtuale pe gazdă <devices>șterge totul Controlere USBși adăugați următorul bloc:

Apropo, dacă utilizați condiment, atunci prin adăugarea a încă 3 dispozitive speciale la controlere, va fi posibil să redirecționați dispozitive USB de la clientul de condimente la server.

Exemplu sub spoiler

Pentru qemu
Adăugăm următoarele opțiuni la comanda de pornire a mașinii virtuale, în plus față de controlerele pe care le-am definit mai devreme:
-chardev spicevmc,name=usbredir,id=usbredirchardev1 -device usb-redir,chardev=usbredirchardev1,id=usbredirdev1,debug=3 -chardev spicevmc,name=usbredir,id=usbredirchardev2 -device usb-redirchardev2,redirchardev2,redirchardev =usbredirdev2,debug=3 -chardev spicevmc,name=usbredir,id=usbredirchardev3 -device usb-redir,chardev=usbredirchardev3,id=usbredirdev3,debug=3
Pentru libvirt
În fișierul de configurare inițial al mașinii virtuale din nodul <devices>, adăugăm următoarele opțiuni, pe lângă controlerele pe care le-am definit mai devreme:

Acum totul este gata pentru redirecționare.

Pornirea serverului

Pachetul usbredirserver poate fi găsit în depozitele standard în aproape toate distribuții populare linux.

Introduceți unitatea flash USB în computer, uitați-vă la ieșirea dispozitivelor USB:
$ lsusb ... Autobuz 003 Dispozitiv 011: ID 125f:c82a A-DATA Technology Co., Ltd. ...

Vedem că perechea vendorid:prodid este egală cu 125f:c82a, iar nucleul a identificat unitatea flash ca 003-001 usbbus-usbaddr, respectiv.

Acum să-l împărtășim pe portul 4000:

# Utilizarea perechii vendorid:prodid $ usbredirserver -p 4000 125f:c82a # Utilizarea perechii usbbus-usbaddr $ usbredirserver -p 4000 003-011

Conectarea unui dispozitiv la o mașină virtuală

Prin opțiuni la pornirea VM-ului

Dispozitivul care trebuie conectat la VM poate fi specificat la pornire prin adăugarea următoarelor opțiuni la comanda de pornire

Pentru qemu
-chardev socket,id=usbredirchardev1,port=4000,host=192.168.1.123 -device usb-redir,chardev=usbredirchardev1,id=usbredirdev1,bus=ehci.0,debug=4
Pentru libvirt
Acest bloc este plasat înaintea etichetei </dispozitive>, lângă controlerele pe care le-am definit mai devreme:
Poate fi executat și prin comandă dispozitiv de atașare virsh

Sau prin qemu-monitor

Mergem la hypervisor și executăm următoarele comenzi în qemu-monitorul mașinii noastre:
# Adăugați dispozitivul nostru chardev-add socket, id=usbredirchardev1,port=4000,host=192.168.1.123 # Conectați-l la controlerul ehci (USB-2.0) device_add usb-redir,chardev=usbredirchardev1,id=usbredirdev1,bus=ehci 0, depanare=4
Pentru a dezactiva unitatea flash, trebuie doar să utilizați următoarea comandă:
device_del usbredirdev1

Asta e tot, după acești pași VM-ul tău va vedea unitatea flash și va putea lucra cu ea nativ.

Dacă sunt multe dispozitive și toate sunt la fel

Aici a apărut o problemă interesantă: cum să redirecționați mai multe dispozitive identice către diferite VM?
În același timp, este de remarcat faptul că toate dispozitivele au aceeași pereche vendorid:prodid, iar perechea usbbus-usbaddr nu este deloc constantă, de îndată ce scoateți și introduceți dispozitivul, acesta își va schimba imediat usbaddr-ul.

Am rezolvat-o folosind udev.
Apropo, dacă nu înțelegi prea bine cum funcționează udev, există unul grozav pe Debian Wiki

Și deci să începem

În primul rând, trebuie să aflăm numărul de serie al dispozitivului nostru, prin care îl vom identifica în udev:

Să lansăm monitorul udev:
$ udevadm monitor --environment --udev
Și introduceți dispozitivul nostru, după aceea vom vedea imediat o listă de variabile ale acestui dispozitiv pe care udev le-a inițializat cu amabilitate pentru noi:
... UDEV add /devices/virtual/bdi/8:16 (bdi) ACTION=add DEVPATH=/devices/virtual/bdi/8:16 ID_SERIAL_SHORT=11C130317234004B SEQNUM=4352 SUBSYSTEM=bdi USEC_INITIALIZED=14892561489266
Informațiile despre numărul de serie și alte atribute pot fi obținute în alt mod, dar merită să luați în considerare că pentru a scrie regulile vom folosi variabilele din comanda de mai sus, și nu atributele din comanda de mai jos. În caz contrar, declanșatorul de eliminare nu se va declanșa atunci când dispozitivul este deconectat.
$ udevadm info -a -n /dev/bus/usb/003/011 | grep "(serial)"

Acum să creăm un fișier /etc/udev/rules.d/99-usb-serial.rules și să scriem următoarele reguli în el:
ACTION=="add", ENV(ID_SERIAL_SHORT)="11C130317234004B", RUN+="/usr/bin/usbredirserver -p 4000 $attr(busnum)-$attr(devnum)" ACTION=="eliminare", ENV(ID_SERIAL_SHORT )="11C130317234004B", RUN+="/usr/bin/fuser -k 4000/tcp"

Să reîncărcăm regulile udev:
$ udevadm control --reload-rules
Gata, acum când ne conectăm dispozitivul, acesta va căuta automat portul de care avem nevoie, iar când vom deconecta usbredirserver nu va mai funcționa.
Prin analogie, adăugăm alte dispozitive.

Asta e tot. Îți mulțumesc pentru interes:)