Chuyên mục
Virtualization

[XCP-ng] Hướng dẫn thiết lập USB Passthrough cho máy ảo

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.

Sơ đồ minh hoạ USB Passthrough

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 vidpid 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 uuidvm-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.

Thiết bị chữ ký số eToken hiện ra trong Device Manager
Chữ ký số được nhận thành công trong ứng dụng quản lý VNPT CA

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!

Nếu bài viết của mình mang đến thông tin, kiến thức hữu ích cho bạn, đừng ngại mời mình ly bia để có thêm động lực chia sẻ nhiều hơn nữa. Cám ơn bạn!

Lưu ý: Nếu bạn cần hỗ trợ kỹ thuật, vui lòng gửi câu hỏi trực tiếp ở phần Thảo luận bên dưới, mình sẽ trả lời sớm. Đừng mò vào hỏi trong fanpage Yêu Chạy Bộ, sẽ không có phản hồi đâu!

Bởi Thuận Bùi

Runner at Yêu Chạy Bộ. Blogger at Ba Lô & Dép Lào. Web Developer at TB's Blog.
Follow me: Facebook / Instagram

2 trả lời trong “[XCP-ng] Hướng dẫn thiết lập USB Passthrough cho máy ảo”

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *