Thuần hóa USB/IP

Nhiệm vụ kết nối thiết bị USB với PC từ xa thông qua mạng cục bộ thường xuyên phát sinh. Theo phần cắt, lịch sử tìm kiếm của tôi theo hướng này được đặt ra và đường dẫn đến giải pháp làm sẵn dựa trên dự án nguồn mở USB/IP với mô tả về các chướng ngại vật được nhiều người đặt ra cẩn thận trên con đường này, cũng như các cách để vượt qua chúng.

Phần một, lịch sử

Nếu máy ảo - tất cả điều này thật dễ dàng. Chức năng chuyển tiếp USB từ máy chủ sang máy ảo đã xuất hiện trong VMWare 4.1. Nhưng trong trường hợp của tôi, khóa bảo mật, có thể nhận dạng là WIBU-KEY, phải được kết nối vào các thời điểm khác nhau với các máy khác nhau chứ không chỉ các máy ảo.
Vòng tìm kiếm đầu tiên vào năm 2009 xa xôi đã đưa tôi đến một mảnh sắt gọi là TrendNet TU2-NU4
Ưu điểm:

  • đôi khi nó thậm chí còn hoạt động

Nhược điểm:

  • không phải lúc nào cũng hoạt động. Giả sử khóa bảo vệ Guardant Stealth II không khởi động được thông qua nó, chửi thề với lỗi “không thể khởi động thiết bị”.
  • Phần mềm quản lý (đọc - gắn và ngắt kết nối thiết bị USB) cực kỳ thảm hại. Công tắc dòng lệnh, tự động hóa - không, chưa nghe thấy. Mọi thứ chỉ bằng tay. Cơn ác mộng.
  • phần mềm điều khiển tìm kiếm mảnh sắt trong mạng bằng cách phát sóng, vì vậy phần mềm này chỉ hoạt động trong một phân đoạn mạng phát sóng. Bạn không thể chỉ định địa chỉ IP của mảnh sắt bằng tay. Một miếng sắt trong mạng con khác? Sau đó, bạn có một vấn đề.
  • các nhà phát triển đã ghi điểm trên thiết bị, việc gửi báo cáo lỗi là vô ích.

Vòng thứ hai diễn ra trong thời gian không xa lắm, và dẫn tôi đến chủ đề của bài báo - Dự án USB/IP. Thu hút với sự cởi mở, đặc biệt là kể từ khi những kẻ đến từ Phản ứng họ đã ký một trình điều khiển cho Windows, vì vậy bây giờ mọi thứ hoạt động ngay cả trên x64 mà không cần bất kỳ sự cố nào như chế độ thử nghiệm. Cảm ơn nhóm ReactOS rất nhiều! Mọi thứ nghe có vẻ đẹp đẽ, hãy thử cảm nhận xem, có thực sự như vậy không? Thật không may, bản thân dự án cũng bị bỏ rơi và bạn không thể tin tưởng vào sự hỗ trợ - nhưng nếu dự án của chúng tôi không biến mất, nguồn ở đó, chúng tôi sẽ tìm ra nó!

Phần hai, máy chủ-linux

Máy chủ USB/IP chia sẻ thiết bị USB qua mạng chỉ có thể được thiết lập trên HĐH dựa trên Linux. Thôi thì Linux là Linux nên cài trên máy ảo Debian 8 ở cấu hình tối thiểu, chuẩn tay máy:

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

Định cư. Hơn nữa, Internet gợi ý rằng bạn sẽ cần tải xuống mô-đun usbip, nhưng - xin chào, lần cào đầu tiên. Không có mô-đun như vậy. Và tất cả bởi vì hầu hết các hướng dẫn trên mạng đều đề cập đến nhánh cũ hơn 0.1.x và trong 0.2.0 mới nhất, các mô-đun usbip có các tên khác nhau.

Do đó:

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

Chà, hãy thêm các dòng sau vào /etc/modules để tải chúng tự động khi khởi động hệ thống:

usbip-core
usbip-host
vhci-hcd

Hãy bắt đầu máy chủ usbip:

sudo usbipd -D

Hơn nữa, tâm trí chung cho chúng ta biết rằng usbip đi kèm với các tập lệnh cho phép chúng ta quản lý máy chủ - hiển thị thiết bị nào nó sẽ chia sẻ qua mạng, xem trạng thái, v.v. Tại đây, một công cụ làm vườn khác đang chờ chúng tôi - một lần nữa, các tập lệnh này trong nhánh 0.2.x đã được đổi tên. Bạn có thể nhận được một danh sách các lệnh với

sudo usbip

Sau khi đọc mô tả của các lệnh, rõ ràng là để chia sẻ thiết bị USB cần thiết, usbip muốn biết Bus ID của nó. Người xem thân mến, cào số ba đang ở trong đấu trường: ID xe buýt sẽ cung cấp cho chúng tôi lsusb (có vẻ như đó là cách rõ ràng nhất) - nó không phù hợp với cô ấy! Thực tế là usbip bỏ qua phần cứng như USB hub. Do đó, chúng tôi sẽ sử dụng lệnh tích hợp:

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

Lưu ý: sau đây trong danh sách, tôi sẽ mô tả mọi thứ bằng cách sử dụng ví dụ về khóa USB cụ thể của mình. Tên phần cứng và cặp VID:PID của bạn có thể và sẽ khác nhau. Của tôi có tên là Wibu-Systems AG: BOX/U, VID 064F, PID 0BD7.

Bây giờ chúng ta có thể chia sẻ thiết bị của mình:

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

Hoan hô các đồng chí!

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)

Ba tiếng hoan hô, các đồng chí! Máy chủ đã chia sẻ mảnh sắt qua mạng và chúng tôi có thể kết nối nó! Nó chỉ còn lại để thêm tính năng tự động khởi động của daemon usbip vào /etc/rc.local

usbipd -D

Phần ba, phía khách hàng và khó hiểu

Tôi đã thử kết nối thiết bị dùng chung qua mạng với máy Debian ngay trên cùng một máy chủ và mọi thứ đều được kết nối tốt:

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

Hãy chuyển sang Windows. Trong trường hợp của tôi, đó là Windows Server 2008R2 Standard Edition. Hướng dẫn chính thức yêu cầu bạn cài đặt trình điều khiển trước. Quy trình được mô tả hoàn hảo trong readme đính kèm với ứng dụng khách windows, chúng tôi làm mọi thứ như được viết, mọi thứ đều ổn. Trên XP, nó cũng hoạt động mà không gặp bất kỳ sự cố nào.

Sau khi giải nén ứng dụng khách, chúng tôi cố gắng gắn khóa của mình:

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

Ồ ồ. Đã xảy ra sự cố. Chúng tôi sử dụng kỹ năng của Google. Có những đề cập rời rạc rằng có gì đó không ổn với các hằng số, trong phần máy chủ, các nhà phát triển đã thay đổi phiên bản giao thức khi chuyển sang phiên bản 0.2.0, nhưng họ lại quên làm điều này trong ứng dụng khách Win. Giải pháp được đề xuất là thay đổi hằng số trong mã nguồn và xây dựng lại máy khách.

Nhưng tôi thực sự không muốn tải xuống Visual Studio vì mục đích của quy trình này. Nhưng tôi có một Hiew cũ tốt. Trong mã nguồn, hằng số được khai báo là một từ kép. Hãy xem tệp 0x00000106, thay thế nó bằng 0x00000111. Hãy nhớ rằng, thứ tự byte bị đảo ngược. Kết quả là hai trận đấu, vá:

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

Eeeee... vâng!

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

Điều này có thể đã kết thúc bài thuyết trình, nhưng âm nhạc không chơi lâu. Sau khi khởi động lại máy chủ, tôi thấy rằng thiết bị trên máy khách không được gắn kết!

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

Và thế là xong. Ngay cả Google biết tất cả cũng không thể trả lời điều này cho tôi. Đồng thời, lệnh hiển thị các thiết bị có sẵn trên máy chủ hiển thị khá chính xác - đây là chìa khóa, bạn có thể gắn nó. Tôi cố gắng gắn kết từ Linux - nó hoạt động! Và nếu bây giờ hãy thử từ bên dưới Windows? Oh chết tiệt - nó hoạt động!

Lần cào cuối cùng: mã máy chủ không được thêm vào một thứ gì đó. Khi chia sẻ một thiết bị, nó không đọc số lượng bộ mô tả USB từ thiết bị đó. Và khi gắn thiết bị từ Linux, trường này sẽ được lấp đầy. Thật không may, tôi đã quen với việc phát triển trên Linux ở cấp độ “tạo && tạo cài đặt”. Do đó, vấn đề được giải quyết bằng một bản hack khá bẩn - thêm vào /etc/rc.local

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

phần cuối cùng

Sau một số nghịch ngợm, nó hoạt động. Đã thu được kết quả mong muốn, giờ đây khóa có thể được gắn vào bất kỳ PC nào (và tất nhiên là cả những PC chưa được gắn kết), kể cả những PC bên ngoài phân khúc mạng quảng bá. Nếu muốn, bạn có thể làm điều đó bằng tập lệnh shell. Điều gì là tốt đẹp - niềm vui là hoàn toàn miễn phí.
Tôi hy vọng rằng kinh nghiệm của tôi sẽ giúp habrazhiteli vượt qua vết cào đã hằn trên trán tôi. Cám ơn vì sự quan tâm của bạn!

Nguồn: www.habr.com

Thêm một lời nhận xét