最近想調整 Razer 滑鼠的 DPI,但手邊已經沒有任何 Windows 裝置,所以需要透過虛擬機 USB 直通來達成。目前 Flatpak 版的 GNOME Boxes 尚未支援 USB 直通功能,但我用的是原子鏡像,不想只為了這點小事就添加分層,或切換到具備完整虛擬機功能的開發者鏡像。
幸好在 GNOME Boxes 的儲存庫找到了一個暫時解法 ,實測後的確有效,成功調整了滑鼠設定,也順便更新了幾個裝置的韌體。在這裡記錄一下做法,最後也會附上一個簡單的互動式腳本。
手動操作
開啟終端機,查詢目標 USB 裝置的 Bus 號碼及 Device 號碼:
SHlsusblsusb注意
- 輸出範例:
Bus 003 Device 005: ID 1532:00b6 Razer USA, Ltd Razer DeathAdder V3 Pro - 記下 Bus 號碼
003與 Device 號碼005。
- 輸出範例:
修改裝置檔案存取權限:
SHsudo chown user:user /dev/bus/usb/003/005sudo chown user:user /dev/bus/usb/003/005注意
記得將
user和003/005改為你的實際使用者名稱、Bus 號碼和 Device 號碼。啟動 GNOME Boxes,進入目標虛擬機(如:
win11)。回到終端機,進入 Flatpak 沙盒環境:
SHflatpak run --command="/bin/bash" org.gnome.Boxesflatpak run --command="/bin/bash" org.gnome.Boxes掛載 USB 裝置:
SHvirsh attach-device win11 <(echo "<hostdev mode='subsystem' type='usb' managed='yes'><source><address bus='3' device='5'/></source><alias name='hostdev0'/></hostdev>")virsh attach-device win11 <(echo "<hostdev mode='subsystem' type='usb' managed='yes'><source><address bus='3' device='5'/></source><alias name='hostdev0'/></hostdev>")注意
- 同樣別忘了修改虛擬機名稱、Bus 號碼與 Device 號碼。可使用
virsh list --all查詢虛擬機名稱。 - 執行此步驟後,目標裝置在宿主機上將暫時無法使用。若為鍵鼠,請先準備其他裝置進行操作。
- 同樣別忘了修改虛擬機名稱、Bus 號碼與 Device 號碼。可使用
成功掛載後,在 Windows 虛擬機中完成需要的操作。
自動化腳本
用 LLM 寫了一個簡單的腳本來簡化操作,邏輯和上述的手動操作相同,效果不錯。如果嫌手動操作麻煩可以用用。
#!/bin/bash
set -Eeuo pipefail
mapfile -t usb_list < <(lsusb)
echo "Select the USB device to pass through:"
for i in "${!usb_list[@]}"; do
echo "$((i+1))) ${usb_list[$i]}"
done
read -r -p "Enter a number and press Enter: " choice
usb_choice="${usb_list[$((choice-1))]}"
bus=$(echo "$usb_choice" | awk '{print $2}')
dev=$(echo "$usb_choice" | awk '{print $4}' | tr -d ':')
bus_xml=$((10#$bus))
dev_xml=$((10#$dev))
sudo chown "$USER:$USER" "/dev/bus/usb/$bus/$dev"
echo "Select the target virtual machine:"
mapfile -t vm_list < <(flatpak run --command="virsh" org.gnome.Boxes list --name | awk 'NF')
for i in "${!vm_list[@]}"; do
echo "$((i+1))) ${vm_list[$i]}"
done
read -r -p "Enter a number and press Enter: " choice
vm_choice="${vm_list[$((choice-1))]}"
xml_data="<hostdev mode='subsystem' type='usb' managed='yes'><source><address bus='$bus_xml' device='$dev_xml'/></source></hostdev>"
flatpak run --command="/bin/bash" org.gnome.Boxes -c "virsh attach-device $vm_choice <(echo \"$xml_data\")"注意
- 檔名取為
boxes-usb-passthrough放到~/.local/bin(其實都隨意啦),並允許作為程式執行。 - 須先開啟 GNOME Boxes 並啟動好虛擬機,再呼叫這個腳本。
- 輸入數字選擇目標 USB 裝置→輸入 sudo 密碼(手動操作也需要)→最後輸入數字選擇目標虛擬機就可以了。

復原方法
此方法屬於臨時修改,只需簡單重新啟動電腦即可復原。
以後買周邊,一定挑能夠透過網頁調整的,改個設定還要開虛擬機太麻煩啦。


留言