Sau hơn 1 tháng ngắt quãng do bận rộn nghiên cứu PC Hardware nhằm ráp máy tính mới, hôm nay mình quay lại chia sẻ tiếp về chủ đề homelab. Bài viết này sẽ hướng dẫn bạn cách thiết lập USB Passthrough cho máy ảo trên nền tảng ảo hoá XCP-ng.
USB Passthrough là gì?
Trong thế giới ảo hoá, USB Passthrough là tính năng của hypervisor cho phép máy ảo có thể truy xuất trực tiếp vào thiết bị USB được cắm cổng USB của bare metal host (máy chủ vật lý).
Ví dụ: Bạn cắm 2 ổ cứng USB với tên gọi USB-1 (32GB) và USB-2 (16GB) vào 2 cổng USB trên máy chủ. Với thiết lập USB Passthrough, bạn có thể cho phép máy ảo AAA truy xuất trực tiếp vào USB-1 trong khi đó máy ảo BBB truy xuất vào USB-2, hoặc ngược lại.

Với tính năng USB Passthrough, bạn có thể trang bị thêm các kết nối cần thiết cho máy ảo để nó có thể hoạt động hoàn hảo y hệt như một máy tính vật lý. Ví dụ: thêm Bluetooth bằng USB Bluetooth dongle, thêm chữ ký số bằng USB e-Token,…
Dưới đây là hướng dẫn cách thiết lập USB Passthrough dành cho XCP-ng.
1. Truy cập vào XCP-ng Host
Đầu tiên bạn cần truy cập SSH vào Host đang cài đặt XCP-ng, ví dụ IP của host là 192.168.0.999
ssh root@192.168.0.9992. Liệt kê danh sách USB
Trong bài viết này mình sẽ thử nghiệm với USB chữ ký số e-Token của VNPT.
Liệt kê danh sách thiết bị USB đang có bằng lệnh lsusb
[20:39 xcp-ng-1 ~]# lsusbBus 004 Device 003: ID 0a5c:5800 Broadcom Corp. BCM5880 Secure Applications ProcessorBus 004 Device 002: ID 8087:8000 Intel Corp.Bus 004 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hubBus 003 Device 003: ID 0c45:64d0 Microdia Integrated WebcamBus 003 Device 002: ID 8087:8008 Intel Corp.Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hubBus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hubBus 001 Device 002: ID 096e:080a Feitian Technologies, Inc.Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub[20:39 xcp-ng-1 ~]#Mình xác định được thiết bị cần Passthrough có thông số như dưới đây:
Bus 001 Device 002: ID 096e:080a Feitian Technologies, Inc.3. Xác định uuid của thiết bị USB
Sử dụng lệnh xe pusb-list để tìm uuid của thiết bị USB cần Passthrough vào máy ảo
[20:39 xcp-ng-1 ~]# xe pusb-listuuid ( RO) : b54abece-aef3-7c84-aaa4-70e6e20adc3c path ( RO): 1-6 vendor-id ( RO): 096e vendor-desc ( RO): Feitian Technologies, Inc. product-id ( RO): 080a product-desc ( RO): serial ( RO): version ( RO): 1.10 description ( RO): Feitian Technologies, Inc. speed ( RO): 12.0004. Chỉnh sửa cấu hình USB-Policy
Chỉnh sửa file usb-policy.conf
nano /etc/xensource/usb-policy.confThêm dòng này vào trên cùng, chú ý sửa vid và pid lại cho đúng thông số của thiết bị USB của bạn
ALLOW: vid=096e pid=080a # VNPT e-TokenFile usb-policy.conf sẽ tương tự như dưới đây sau khi sửa
# When you change this file, run 'xe pusb-scan' to confirm# the file can be parsed correctly.## Syntax is an ordered list of case insensitive rules where # is line comment# and each rule is (ALLOW | DENY) : ( match )*# and each match is (class|subclass|prot|vid|pid|rel) = hex-number# Maximum hex value for class/subclass/prot is FF, and for vid/pid/rel is FFFF## USB Hubs (class 09) are always denied, independently of the rules in this fileALLOW: vid=096e pid=080a # VNPT e-TokenDENY: vid=17e9 # All DisplayLink USB displaysDENY: class=02 # Communications and CDC-ControlALLOW:vid=056a pid=0315 class=03 # Wacom Intuos tabletALLOW:vid=056a pid=0314 class=03 # Wacom Intuos tabletALLOW:vid=056a pid=00fb class=03 # Wacom DTU tabletDENY: class=03 subclass=01 prot=01 # HID Boot keyboardsDENY: class=03 subclass=01 prot=02 # HID Boot miceDENY: class=0a # CDC-DataDENY: class=0b # SmartcardDENY: class=e0 # Wireless controllerDENY: class=ef subclass=04 # Miscellaneous network devicesALLOW: # Otherwise allow everything elseChạy lệnh xe pusb-scan để xác nhận, bạn cần nhập đúng host-uuid của Host đang chạy XCP-ng.
xe pusb-scan host-uuid=dcc8aef9-f413-4c15-8c60-05aad8fea66fNếu bạn không biết host-uuid của mình là gì, hãy dùng lệnh xe host-list
[20:48 xcp-ng-1 ~]# xe host-listuuid ( RO) : dcc8aef9-f413-4c15-8c60-05aad8fea66f name-label ( RW): xcp-ng-1 name-description ( RW): Default install5. Kích hoạt USB Passthrough
Kích hoạt Passthrough cho thiết bị USB e-Token bằng lệnh xe pusb-param-set, bạn cần nhập uuid của thiết bị tìm ra ở bước 2
xe pusb-param-set uuid=b54abece-aef3-7c84-aaa4-70e6e20adc3c passthrough-enabled=true6. Tìm thông số group uuid
Sử dụng lệnh sau
xe usb-group-list PUSB-uuids=b54abece-aef3-7c84-aaa4-70e6e20adc3cTrong đó, PUSB-uuids chính là uuid của thiết bị USB bạn đang cần passthrough
[20:56 xcp-ng-1 ~]# xe usb-group-list PUSB-uuids=b54abece-aef3-7c84-aaa4-70e6e20adc3cuuid ( RO) : 4e387fef-b4ed-58a5-4ea7-1763a8c36883 name-label ( RW): Group of 096e 080a USBs name-description ( RW):Lưu lại thông số group uuid : 4e387fef-b4ed-58a5-4ea7-1763a8c36883
7. Liệt kê danh sách máy ảo
Sử dụng lệnh xe vm-list
[20:57 xcp-ng-1 ~]# xe vm-listuuid ( RO) : bc6b5474-9548-bc5c-3d73-bd68e85d73d3 name-label ( RW): Windows 10 (64-bit) power-state ( RO): running
uuid ( RO) : 2ab97874-3b6a-d683-01b0-8ea3c1b287d3 name-label ( RW): Debian 11 power-state ( RO): running
uuid ( RO) : 4bb837c9-bc4a-23e2-d7a7-84bca560ff39 name-label ( RW): pfsense power-state ( RO): halted
uuid ( RO) : aaec1190-11b6-60c6-c805-ef75df16c9b6 name-label ( RW): Proxmox power-state ( RO): halted
uuid ( RO) : 0bb0ad85-3ab3-d4a0-1e9b-8139c9609649 name-label ( RW): XOA Community Edition power-state ( RO): running
uuid ( RO) : abb7f2c8-65f4-4386-9372-b6eeec7dc8bc name-label ( RW): Control domain on host: xcp-ng-1 power-state ( RO): runningMình sẽ kết nối USB e-Token vào máy ảo Windows 10 với uuid: bc6b5474-9548-bc5c-3d73-bd68e85d73d3
8. Tắt máy ảo Windows 10
XCP-ng không hỗ trợ kết nối trực tuyến (hot plug) thiết bị USB vào máy ảo. Do đó mình cần phải tắt máy ảo Windows 10 đang chạy (power-state ( RO): running)
xe vm-shutdown uuid=bc6b5474-9548-bc5c-3d73-bd68e85d73d3Kiểm tra lại trạng thái sẽ thấy máy ảo Windows 10 đã tắt (power-state ( RO): halted)
[21:02 xcp-ng-1 ~]# xe vm-listuuid ( RO) : bc6b5474-9548-bc5c-3d73-bd68e85d73d3 name-label ( RW): Windows 10 (64-bit) power-state ( RO): halted9. Kết nối USB vào máy ảo
Sử dụng lệnh xe vusb-create để kết nối USB vào máy ảo, chú ý thay thế 2 thông số group uuid và vm-uuid tương ứng
xe vusb-create usb-group-uuid=4e387fef-b4ed-58a5-4ea7-1763a8c36883 vm-uuid=bc6b5474-9548-bc5c-3d73-bd68e85d73d3Hệ thống sẽ gửi phản hồi lại 1 chuỗi kí tự
[21:02 xcp-ng-1 ~]# xe vusb-create usb-group-uuid=4e387fef-b4ed-58a5-4ea7-1763a8c36883 vm-uuid=bc6b5474-9548-bc5c-3d73-bd68e85d73d31a03945c-70e2-665c-79dc-5ed7a582226e10. Kiểm tra thành quả
Khởi động lại máy ảo Windows 10 bằng lệnh xe vm-start
xe vm-start uuid=bc6b5474-9548-bc5c-3d73-bd68e85d73d3Truy cập vào máy ảo thông qua tính năng Console trên XOA, USB e-Token đã hiện ra ngon lành.


Lưu ý: Bạn chỉ có thể truy cập vào USB e-Token khi kết nối vào máy ảo thông qua Console hoặc Teamviewer / UltraViewer. Còn khi kết nối thông qua RDP (Remote Desktop Protocol), e-Token sẽ không hoạt động.
Vậy là xong. Từ giờ mình đã có thể dành 1 máy ảo riêng biệt để xử lý các công việc báo cáo thuế, khai báo hải quan cho công ty của mình. Yên tâm bảo mật hơn khi các bên dịch vụ kế toán, vận chuyển phải truy cập remote vào máy liên tục để xử lý công việc.
Chúc bạn thiết lập thành công!