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.
Mục Lục
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.999
Code 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.000
Code 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.conf
Code 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-Token
Code 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 else
Code 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 install
Code 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=true
Code 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-70e6e20adc3c
Code 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): running
Code 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-bd68e85d73d3
Code 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): halted
Code 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-5ed7a582226e
Code 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-bd68e85d73d3
Code 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!
hi bạn, cho mình hỏi trường hợp mình sử dụng Hyper – V trên windows server 2022 thì có cách nào làm tương tự không nếu ký số từ máy ảo
Mình chưa dùng Hyper-V trên Windows Server 2022 bao giờ nên không rành vụ USB Passthrough trên Hyper-V