Как прокинуть USB без IOMMU

Как прокинуть USB без IOMMU

OC: XEN 6.5

черновик

Что такое IOMMU.

Если аппаратура не поддерживает IOMMU, то многочисленые иструкции по прокидыванию usb-портов (или pci-устройств) в Xen работать не будут. Тут обсуждение, а это пример мануала.

Решение - USB over IP. Клиент-серверное приложение которое позволяет прокидывать USB на гостевые машины, установив серверную часть непосредственно на Xen или сторонний сервер. Почти все решения платные или со значительными ограничениями.

Первое рассмотренное решение USB Redirector - существует только платная версия. Второе VirtualHere - триальная версия позволяет прокидывать один USB-порт (но без ограничения по времени). Обсуждение на эту тему здесь.

Бесплатный проект The USB/IP Project не рассматривается так как последний релиз под Linux датирован 13.01.2009.

USB Redirector

Сделано по этой инструкции с поправкой на 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
    ===================== ======================= ===================
    
  • После этого в гостевой машине следует поставить клиента, указать код лицензии и подключиться к запущеному серверу.

VirualHere

Здесь все намного проще:

  • Качаем сервер под нужную архитектуру, в случае xen это x86_64, делаем файл исполняемым и переносим в /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
    
  • Качаем клиент отсюда и ставим на гостевую машину.

results for ""

    No results matching ""