50. Como fazer o QEMU / Virt-Manager ler um pendrive?

Então você definiu os parâmetros da sua máquina virtual para rodar o QEMU via linha de comando ou, configurou seu Virt-Manager (interface amigável pro QEMU), mas não consegue fazer sua VM ler aquele seu pendrive físico (real, não-virtual), conectado ao seu PC hospedeiro? Seus problemas acabaram, vou ensinar uma solução simples!
Acesso Pass-Through a um Pendrive USB do Hospedeiro
Pass-through é um recurso do QEMU que permite que uma máquina virtual acesse o hardware físico diretamente, ignorando a camada de virtualização sem nenhuma sobrecarga ou limitação. É útil com dispositivos como placas gráficas, adaptadores de rede ou dispositivos de armazenamento. Ele pode melhorar o desempenho e fornecer acesso a recursos específicos do dispositivo indisponíveis em um ambiente puramente virtual. No caso de uma unidade flash USB, o pass-through é uma maneira de trocar arquivos com o mundo externo.
Primeiro conectamos no nosso PC todos aqueles pendrives que gostaríamos que nossa VM reconhecesse e levantamos algumas informações sobre eles. No meu caso conectei 3 pendrives e um Token de certificado digital
$ lsusb Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 001 Device 002: ID 1bcf:0005 Sunplus Innovation Technology Inc. Optical Mouse Bus 001 Device 003: ID c0f4:01e0 USB usb keyboard Bus 001 Device 004: ID 1a40:0201 Terminus Technology Inc. FE 2.1 7-port Hub Bus 001 Device 005: ID 14cd:168a Super Top Elecom Co., Ltd MR-K013 Multicard Reader Bus 001 Device 030: ID 0781:5567 SanDisk Corp. Cruzer Blade Bus 001 Device 031: ID 090c:1000 Silicon Motion, Inc. - Taiwan (formerly Feiya Technology Corp.) Flash Drive Bus 001 Device 032: ID 0529:0620 Aladdin Knowledge Systems Token JC Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 002 Device 002: ID 0781:5583 SanDisk Corp. Ultra Fit Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 006 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Dá pra ver que tenho muita coisa conectada: hub usb 2.0/3.0, mouse, teclado, leitor de cartões etc. Mas destaquei os 3 pendrives e o token. O que vamos precisar está em azul. Esse valor duplo é o ID do dispositivo, quer dizer vendedor : produto.
O caminho do arquivo do dispositivo é algo como /dev/bus/usb/XXX/YYY
. De acordo com as políticas de nomenclatura do kernel Linux, XXX
é o número do barramento ("Bus"), que geralmente não muda. Enquanto YYY
é o número do dispositivo ("Device"), que muda toda vez que o dispositivo USB é desconectado e reconectado. Dito isso, vamos verificar as permissões do arquivo do dispositivo para entender nosso problema. Vou listar o primeiro pendrive (SanDisk Corp. Cruzer Blade):
$ ls -l /dev/bus/usb/001/030
crw-rw-rw- 1 root root 189, 5 nov 18 13:07 /dev/bus/usb/001/030
Ambos, usuário e grupo, são root. Isso não é bom para o QEMU porque o grupo deve ser kvm para permitir que o convidado acesse o dispositivo. Então, vamos executar os dois comandos a seguir com permissões de superusuário para alterar permanentemente, por meio de uma regra udev, o grupo associado a este dispositivo em particular. (leia Writing udev rules para mais detalhes).
Isso cria o arquivo em branco 99-usb-stick.rules
na pasta /etc/udev/rules.d/
, usando o editor de texto padrão do seu Linux:
$ sudoedit /etc/udev/rules.d/99-usb-stick.rules
Agora vamos acrescentar nesse arquivo vazio todos os pendrives que queremos que sejam identificados como usuário root e grupo kvm sempre que conectados ao PC:
SUBSYSTEM=="usb", ATTR{idVendor}=="0529", ATTR{idProduct}=="0620", OWNER="root", GROUP="kvm", MODE="0666" SUBSYSTEM=="usb", ATTR{idVendor}=="0781", ATTR{idProduct}=="5567", OWNER="root", GROUP="kvm", MODE="0666" SUBSYSTEM=="usb", ATTR{idVendor}=="0781", ATTR{idProduct}=="5583", OWNER="root", GROUP="kvm", MODE="0666" SUBSYSTEM=="usb", ATTR{idVendor}=="090c", ATTR{idProduct}=="1100", OWNER="root", GROUP="kvm", MODE="0666"
Perceba que só alteramos a idVendor e idProduct em cada linha. No mais é definir usuário, grupo e permissões (MODE 0666). Como a regra é a mesma para todos eles, poderíamos simplificar ainda mais:
SUBSYSTEM=="usb", ATTR{idVendor}=="0529|0781|090c", ATTR{idProduct}=="0620|5567|5583|1100", OWNER="root", GROUP="kvm", MODE="0666"
Agora recarregamos as regras:
$ sudo udevadm control --reload-rules && sudo udevadm trigger
Listando novamente o primeiro pendrive (SanDisk Corp. Cruzer Blade):
$ ls -l /dev/bus/usb/001/030
crw-rw-rw- 1 root kvm 189, 5 nov 18 13:07 /dev/bus/usb/001/030
O grupo agora é kvm. Reinicie sua VM e configure para ler o pendrive do hospedeiro, do jeito que você sabe fazer. Dessa vez ele será capaz de reconhecer o pendrive.
NOTA: este artigo foi baseado em conteúdo publicado por:
GALGANI, F. Baeldung Linux, 26 jan. 2024. How To Use QEMU From the Linux Command-Line. Disponível em: <https://www.baeldung.com/linux/qemu-from-terminal>. Acesso em: 18 nov. 2024.
Comentários
Postar um comentário