OC: XEN 6.5
черновик
Если аппаратура не поддерживает IOMMU, то многочисленые иструкции по прокидыванию usb-портов (или pci-устройств) в Xen работать не будут. Тут обсуждение, а это пример мануала.
Решение - USB over IP. Клиент-серверное приложение которое позволяет прокидывать USB на гостевые машины, установив серверную часть непосредственно на Xen или сторонний сервер. Почти все решения платные или со значительными ограничениями.
Первое рассмотренное решение USB Redirector - существует только платная версия. Второе VirtualHere - триальная версия позволяет прокидывать один USB-порт (но без ограничения по времени). Обсуждение на эту тему здесь.
Бесплатный проект The USB/IP Project не рассматривается так как последний релиз под Linux датирован 13.01.2009.
Сделано по этой инструкции с поправкой на 64-х битную архитектуру xen сервера.
Качаем DDK(Driver Development Kit) 6.5.0 https://www.citrix.com/downloads/xenserver/product-software/xenserver-65-standard.html#ctx-dl-eula (нужна учетная запись на citrix.com)
Распаковываем на той машине где установлен Xen Center (или монтируем образ на виртуальный дисковод)
Импортируем виртуальную машину с помощью Xen Center (XenServer -> Import...). В locate указать ova.xml (например J:\ddk\ova.xml). После импорта машина инсталируется (в процессе инсталяции будет запрос пароля для пользователя root)
После логина в консоли DDK делаем следующее:
# wget http://www.incentivespro.com/usb-redirector-linux-x86_64.tar.gz
# tar xzvf usb-redirector-linux-x86_64.tar.gz
# cd usb-redirector-linux-x86_64
# ./installer.sh install-server
# cd ..
# tar czvf usb-redirector-linux-x86_64.tgz usb-redirector-linux-x86_64
# scp usb-redirector-linux-x86_64.tgz root@ip_xen_server:/root
после этого виртуальную машину DDK можно выключить
В консоли Xen делаем следующее:
# cd ~
# tar xzvf usb-redirector-linux-x86_64.tgz
# cd usb-redirector-linux-x86_64
редактируем файл installer.sh
# joe installer.sh
В функции usbsrv_install()
(поиск в joe CTRL+KF) закоментируем:
(must be)
# if [ ! -d $KERNELDIR ]; then
# exit_with_error "Kernel sources or kernel headers directory not found. Please install
# the corresponding package first."
# fi
В функции usbsrv_make_kernel_module() закоментируем:
(must be)
# make KERNELDIR=$KERNELDIR clean; /dev/null 2>1
# make $make_flags $driver_config KERNELDIR=$KERNELDIR $script_dir/buildlog.txt 2>1
Сохраняем и закрываем.
Запускаем инсталятор # ./installer.sh install-server
*** Installing USB Redirector for Linux v3.6
*** Destination dir: /usr/local/usb-redirector
*** Checking installation...
*** Detecting system...
*** distribution: redhat
*** kernel: 3.10.0+2
*** Compiling kernel module...
*** Kernel module successfully compiled
*** Creating directories...
*** Preparing scripts...
*** Copying files...
*** Setting up init script...
*** Starting daemon...
*** Please allow incoming connections on 32032 port for USB Sever to be able to accept
connections from remote clients.
*** INSTALLATION SUCCESSFUL! To uninstall, run /usr/local/usb-redirector/uninstall.sh
Добавляем разрешающее правило в фаервол joe /etc/sysconfig/iptables
(перед правилом REJECT)
-A RH-Firewall-1-INPUT -m conntrack --ctstate NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -m conntrack --ctstate NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -m conntrack --ctstate NEW -m tcp -p tcp --dport 443 -j ACCEPT
(add this)
-A RH-Firewall-1-INPUT -m conntrack --ctstate NEW -m tcp -p tcp --dport 32032 -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT
Посмотреть подключеные устройства можно так:
# usbsrv -list
================= USB SERVER OPERATION SUCCESSFUL ===============
List of local USB devices:
1: Generic USB K/B Composite USB Device
Vid: 13ba Pid: 0017 Port: 2-2
Status: plugged
3: WindowsCE CASIO.
Vid: 07cf Pid: 3303 Port: 1-1
Status: plugged
===================== ======================= ===================
Расшарить так:
usbsrv -s 3
====================== OPERATION SUCCESSFUL =====================
USB device has been shared
===================== ======================= ===================
После этого в гостевой машине следует поставить клиента, указать код лицензии и подключиться к запущеному серверу.
Здесь все намного проще:
/usr/sbin
# cd /tmp
# wget https://www.virtualhere.com/sites/default/files/usbserver/vhusbdx86_64
# chmod +x ./vhusbdx86_64
# mv vhusbdx86_64 /usr/sbin
Добавляем скрипт автозапуска демона при старте системы:
# joe /etc/init.d/vhusbdpin
Сам скрипт:
#!/bin/sh
# chkconfig: - 98 01
# description: VirtualHere USB Sharing
# processname:
# Source function library.
if [ -f /etc/init.d/functions ] ; then
. /etc/init.d/functions
elif [ -f /etc/rc.d/init.d/functions ] ; then
. /etc/rc.d/init.d/functions
else
exit 0
fi
KIND="vhusbdpin"
start() {
echo -n $"Starting $KIND services: "
daemon /usr/sbin/vhusbdx86_64 -b
echo
}
stop() {
echo -n $"Shutting down $KIND services: "
killproc vhusbdx86_64
echo
}
restart() {
echo -n $"Restarting $KIND services: "
killproc vhusbdx86_64
daemon /usr/sbin/vhusbdx86_64 -b
echo
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
*)
echo $"Usage: $0 {start|stop|restart}"
exit 1
esac
exit $?
Делаем исполняемым и добавляем службу в автозапуск:
# cd /etc/init.d
# chmod +x ./vhusbdpin
# chkconfig --add vhusbdpin
# vhusbdpin chkconfig on
Добавляем правило в iptables (перед правилом -A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
)
-A RH-Firewall-1-INPUT -m conntrack --ctstate NEW -m tcp -p tcp --dport 7575 -j ACCEPT
Качаем клиент отсюда и ставим на гостевую машину.