Introdução
O Projeto USBIP tem como objetivo disponibilizar um dispositivo USB do sistema compartilhando sobre a rede IP. Para compartilhar dispositivos USB entre computadores com a sua plena funcionalidade o USBIP encapsula "requisições USB" em pacotes IP e
transmite entre computadores. Drivers de dispositivos USB e aplicações podem ser usados também por dispositivos remotos USB sem alteração dos mesmos. Um computador pode utilizar dispositivos remotos USB como se eles estivessem diretamente ligados no computador local, por exemplo:
- Dispositivos de armazenamento USB: fdisk, mkfs, montar/desmontar, operações de arquivo,
reproduzir um filme em DVD e gravar um DVD-R.
- Teclados e mouses USB: o uso com linux console e o Sistema X Window.
- Webcams USB e alto-falantes USB: visualizar webcam , capturar imagens e
tocar algumas músicas.
- Impressoras USB, scanners USB, conversores USB/Serial e interfaces USB/Ethernet.
Aqui vamos colocar a porta USB do Host Xen (Dom0) para as maquinas virtuais criadas no Xen “Guests”, o método de conexão é via protocolo TCP-IP, o pacote USBIP disponibiliza o dispositivo usb para conexão das maquinas clientes pela rede, a distribuição usada é o Centos 5.3 com Xen 3.0.3 instalado conforme o “Tutorial de Instalação do Xen no Centos 5.3” disponível no youtube.
Criamos uma solução paleativa pelo fato da dificuldade que muitos tem de fazer as portas usb se conectarem nas VM's criadas pelo Xen. Recomenda-se que todo o sistema esteja atualizado pelo “yum update” para que a instalação corra da melhor forma possivel, já que foi em cima desses procedimentos que criamos este tutorial, vamos ao que interessa:
Preparando o Ambiente
- Atualize o sistema:
[root@localhost ~]# yum update
- Instale as dependências:
[root@localhost ~]# yum install automake gcc glib2.x86_64 glib2-devel.x86_64 rpm-build redhat-rpm-config unifdef libtool libsysfs-devel-2.0.0-6 hmaccalc
- Baixe os fontes do Kernel:
[root@localhost ~]# wget http://mirror.centos.org/centos/5/updates/SRPMS/kernel-2.6.18-164.6.1.el5.src.rpm
- Crie os diretórios para a instalação dos fontes:
[root@localhost ~]# mkdir -p rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
- Crie o arquivo de caminho das macros das fontes do Kernel:
[root@localhost ~]# echo "%_topdir %(echo $HOME)/rpmbuild" > .rpmmacros
Instale os fontes:
[root@localhost ~]# rpm -Uvh kernel-2.6.18-164.6.1.el5.src.rpm
Compile os fontes:
[root@localhost ~]# cd rpmbuild/SPECS/
[root@localhost SPECS]# rpmbuild -bp --target=`uname -m` kernel-2.6.spec
[root@localhost SPECS]# cd /root/rpmbuild/BUILD/kernel-2.6.18/linux-2.6.18.x86_64/
[root@localhost linux-2.6.18.x86_64]# make oldconfig && make prepare && make scripts
Obs: Verifique no final da compilação se o processo ocorre sem mensagens de erro para o êxito dos próximos passos.
Vá para o home do root:
[root@localhost linux-2.6.18.x86_64]# cd ~
Baixe o pacote de bibliotecas essenciais de vinculador dinâmico GNU libc
[root@localhost ~]# wget ftp://ftp.pbone.net/mirror/ftp.altlinux.ru/pub/distributions/ALTLinux/Compact/2.3/ALTLinux/RPMS.main/glibc-core-2.2.6-alt0.10.i586.rpm
Instale o pacote de bibliotecas:
[root@localhost ~]# rpm -ivh --force --nodeps glibc-core-2.2.6-alt0.10.i586.rpm
Obs: irá aparecer um erro parecido com esse abaixo, IGNORE e vá para o próximo passo.
Preparando... ########################################### [100%]
1:glibc-core aviso: /etc/localtime criado como /etc/localtime.rpmnew
########################################### [100%]
/sbin/glibc_post_upgrade: /lib/ld-linux.so.2: version `GLIBC_PRIVATE' not found (required by /lib/i686/nosegneg/libc.so.6)
/sbin/glibc_post_upgrade: /lib/ld-linux.so.2: version `GLIBC_2.3' not found (required by /lib/i686/nosegneg/libc.so.6)
erro: %post(glibc-core-2.2.6-alt0.10.i586) o scriptlet falhou, status de saída 1
Instalando o Usbip
Baixe o pacote USBIP:
[root@localhost ~]# wget http://downloads.sourceforge.net/project/usbip/usbip/0.1.7/usbip-0.1.7.tar.gz?use_mirror=ufpr
- Descompacte o pacote:
[root@localhost ~]# tar xvzf usbip-0.1.7.tar.gz
- Acesse o caminho
[root@localhost ~]# cd /root/usbip-0.1.7/drivers/2.6.18/
- Após a descompactação teremos de editar o arquivo “stub_rx.c” para que o script ignore uma seção que não nos cabe nessa intalação, para isso comente a linha 374 até a 399, salve e saia conforme abaixo:
[root@localhost 2.6.18]# vim stub_rx.c
- Comente a linha 374 a 399, salve e saia.
/*
#if LINUX_VERSION_CODE <>
static inline int usb_endpoint_xfer_bulk(
[...]
[...]
[...]
return ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
USB_ENDPOINT_XFER_ISOC);
}
#endif
*/
- Compile o USBIP apontando para o caminho dos fontes do kernel:
[root@localhost 2.6.18]# make KSOURCE=/root/rpmbuild/BUILD/kernel-2.6.18/linux-2.6.18.x86_64/
- Acesse os fontes do USBIP:
[root@localhost 2.6.18]# cd /root/usbip-0.1.7/src/
- Execute o script de geração automática dos fontes:
[root@localhost src]# ./autogen.sh
- Execute o script de configuração:
[root@localhost src]# ./configure
- Execute o script de compilação:
[root@localhost src]# make
- Execute o script de Instalação:
[root@localhost src]# make install
- Execute o ldconfig para criar as ligações necessárias e cache para as bibliotecas mais recentes no sistema:
[root@localhost src]# ldconfig
- Acesse o diretório dos módulos do USBIP referente ao Kernel instalado:
[root@localhost src]# cd /root/usbip-0.1.7/drivers/2.6.18/
Carregando módulos e rodando Daemon
- Carregue o módulo de arquivos comuns do USBIP:
[root@localhost 2.6.18]# insmod usbip_common_mod.ko
- Carregue o módulo principal do USBIP:
[root@localhost 2.6.18]# insmod usbip.ko
Execute o Daemon:
[root@localhost 2.6.18]# usbipd -D
- Liste os dispositivos usb disponíveis, ira retornar algo parecido com as linhas abaixo, note que o numero de identificação do dispositivo usb é “3-1”, este número será usado tanto para a exportação do dispositivo na rede, quanto para a conexão do cliente no dispositivo:
[root@localhost 2.6.18]# bind_driver --list
List USB devices
- busid 3-1 (0e40:0001)
3-1:1.0 -> usbip
- Para compartilhar o dispositivo lista no exemplo acima teremos de executa o comando abaixo, retornará a mensagem acompanhada nas linhas abaixo do comando:
[root@localhost 2.6.18]# bind_driver --usbip 3-1
** (process:7181): DEBUG: 3-1:1.0 -> usbip
** (process:7181): DEBUG: unbinding interface
** (process:7181): DEBUG: write "add 3-1" to /sys/bus/usb/drivers/usbip/match_busid
** Message: bind 3-1 to usbip, complete!
O Dispositivo já está disponível, agora precisaremos conectar os clientes que usarão os dispositivos USB exportados.
.