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.999Code language: Nginx (nginx)
2. 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 ~]# lsusb Bus 004 Device 003: ID 0a5c:5800 Broadcom Corp. BCM5880 Secure Applications Processor Bus 004 Device 002: ID 8087:8000 Intel Corp. Bus 004 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 003 Device 003: ID 0c45:64d0 Microdia Integrated Webcam Bus 003 Device 002: ID 8087:8008 Intel Corp. Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 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 ~]#Code language: CSS (css)
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.Code language: CSS (css)
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-list uuid ( 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.000Code language: YAML (yaml)
4. Chỉnh sửa cấu hình USB-Policy
Chỉnh sửa file usb-policy.conf
nano /etc/xensource/usb-policy.confCode language: Nginx (nginx)
Thê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-TokenCode language: YAML (yaml)
File 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 file ALLOW: vid=096e pid=080a # VNPT e-Token DENY: vid=17e9 # All DisplayLink USB displays DENY: class=02 # Communications and CDC-Control ALLOW:vid=056a pid=0315 class=03 # Wacom Intuos tablet ALLOW:vid=056a pid=0314 class=03 # Wacom Intuos tablet ALLOW:vid=056a pid=00fb class=03 # Wacom DTU tablet DENY: class=03 subclass=01 prot=01 # HID Boot keyboards DENY: class=03 subclass=01 prot=02 # HID Boot mice DENY: class=0a # CDC-Data DENY: class=0b # Smartcard DENY: class=e0 # Wireless controller DENY: class=ef subclass=04 # Miscellaneous network devices ALLOW: # Otherwise allow everything elseCode language: YAML (yaml)
Chạ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-05aad8fea66f Code language: Nginx (nginx)
Nế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-list uuid ( RO) : dcc8aef9-f413-4c15-8c60-05aad8fea66f name-label ( RW): xcp-ng-1 name-description ( RW): Default installCode language: Dockerfile (dockerfile)
5. 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=trueCode language: Nginx (nginx)
6. Tìm thông số group uuid
Sử dụng lệnh sau
xe usb-group-list PUSB-uuids=b54abece-aef3-7c84-aaa4-70e6e20adc3cCode language: PHP (php)
Trong đó, 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-70e6e20adc3c uuid ( RO) : 4e387fef-b4ed-58a5-4ea7-1763a8c36883 name-label ( RW): Group of 096e 080a USBs name-description ( RW):Code language: Dockerfile (dockerfile)
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-list uuid ( 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): runningCode language: Dockerfile (dockerfile)
Mì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-bd68e85d73d3Code language: Nginx (nginx)
Kiể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-list uuid ( RO) : bc6b5474-9548-bc5c-3d73-bd68e85d73d3 name-label ( RW): Windows 10 (64-bit) power-state ( RO): haltedCode language: Dockerfile (dockerfile)
9. 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-bd68e85d73d3 Code language: Nginx (nginx)
Hệ 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-bd68e85d73d3 1a03945c-70e2-665c-79dc-5ed7a582226eCode language: Bash (bash)
10. 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-bd68e85d73d3Code language: Nginx (nginx)
Truy 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!