No Debian bullseye, estou iniciando máquinas virtuais usando QEMU / KVM por linha de comando (ou seja, sem virsh
ou outros auxiliares / wrappers). Uma dessas VMs começa a partir de um dispositivo de bloco declarado da seguinte forma:
-blockdev driver=file,node-name=q1,filename=/dev/loop0 \
Ainda hoje, notei acidentalmente que o QEMU deu o seguinte aviso ao iniciar essa VM:
Opening a block device as a file using the 'file' driver is deprecated
Um pouco de pesquisa mostrou que esse aviso é conhecido e que existem soluções para ele, por exemplo, a resposta aceita de @Stephen Kitt aqui , que propõe a seguinte blockdev
declaração:
-blockdev node-name=q1,driver=raw,file.driver=host_device,file.filename=/dev/loop0 \
Esta solução sem dúvida funciona, mas não consegui encontrar nenhuma documentação para file.driver=host_device
. Portanto, testei algumas outras opções e cheguei à seguinte solução que também parece funcionar:
-blockdev driver=host_device,node-name=q1,filename=/dev/loop0 \
Alguém poderia explicar brevemente qual é a diferença entre essas duas declarações? Notavelmente, espera-se que um deles supere o outro em termos de latência ou taxa de transferência?
Como uma pergunta bônus, alguém sabe onde host_device
está a documentação? Na outra pergunta/resposta vinculada acima, há um link para o commit que provavelmente implementou esse driver. No entanto, também não consegui encontrar nenhuma documentação por trás desse link.
De acordo com o QEMU changelog , a descontinuação do
file
driver ao acessar os dispositivos de bloco do host e a introdução dohost_device
driver ocorreram com o QEMU versão 3.0.A apresentação em PDF da resposta de Stephen Kitt a que você se referiu (consulte as páginas 20...24) indica que a maneira mais exaustiva de definir o armazenamento para QEMU significaria primeiro configurar o local dos dados (
file
ouhost_device
) com umnode_name=
, então usar outra--blockdev
opção com umfile=<previously_defined_node_name>
para adicionar outra camada em cima da primeira para especificar o formato de dados (por exemplo,raw
ouqcow2
por exemplo). Isso dá excelente controle ao usuário, mas é um exagero para a maioria dos casos básicos.No repositório de código-fonte do QEMU, o
qemu-options.hx
arquivo parece ter a melhor descrição das-blockdev
opções que vi até agora.Há um parágrafo que pode fornecer algum esclarecimento sobre o
file.<something>=<something>
mistério:Portanto, a
file.<something>=
sintaxe é essencialmente uma forma abreviada de especificar outra-blockdev
declaração, evitando, ao mesmo tempo, sobrecarregar onode_name
namespace com nomes de "nós intermediários".Então, a declaração de Stephen Kitt
blockdev
:parece ser equivalente a uma forma expandida:
A diferença entre isso e sua declaração
é um assunto mais complicado e precisa de um pouco de mergulho no código-fonte do QEMU para esclarecer.
-blockdev
Drivers do QEMUfile
e têm várias versões para diferentes arquiteturas de hosthost_device
.host_cdrom
Para Linux, o aplicável está localizado emblock/file-posix.c
. Pesquise instâncias de stringBlockDriver bdrv_
e você encontrará cada uma delas. (Você também descobrirá que existe uma definição totalmente separadahost_cdrom
para FreeBSD por algum motivo.)Cada um
BlockDriver
parece ser definido por uma estrutura de (principalmente) ponteiros de função. Esses ponteiros podem apontar para uma função específica do driver ou referir-se a uma implementação comum compartilhada com outro driver.O
file
driver é definido assim:Portanto, é essencialmente um clone do
raw
driver, referindo-se a ele em quase todas as funções.A
host_device
definição é um pouco mais complexa:Ele também se refere ao
raw
driver para grande parte de sua funcionalidade, mas tem suas próprias funções dedicadas para coisas como:Algumas dessas
host_device
funções específicas apenas executam uma verificação de erro extra e, em seguida, chamam a função equivalente doraw
driver. Mas são provavelmente os últimos que fornecem a maior parte do valor dohost_device
driver: permite que a VM veja explicitamente o tamanho real do bloco e a geometria (se aplicável) do dispositivo host. Passar por comandos SCSI genéricos permite que a VM tenha acesso a coisas como robôs de biblioteca de fitas, unidades de fita de alta capacidade e gravadores de DVD... e muitas outras coisas.Sua declaração mais curta funciona porque a
host_device
declaração recai inerentemente nas funções doraw
driver na maioria das coisas.Observe que o descrito acima se aplica apenas a sistemas operacionais no estilo POSIX: se você executar o QEMU no Windows, o acesso ao dispositivo pode ser completamente diferente do acesso regular a arquivos e sua declaração mais curta pode não funcionar. Pode ser que a distinção entre
file
ehost_device
tenha sido criada principalmente para permitir a portabilidade do QEMU para outras arquiteturas de sistema, onde o acesso ao dispositivo é muito diferente dos arquivos regulares.Você estava preocupado com o desempenho, mas eu esperaria que fosse essencialmente idêntico, já que todos os três drivers acabam chamando exatamente o mesmo trecho de código para implementar a funcionalidade principal , as funções
bdrv_co_preadv
e .bdrv_co_pwritev
Ao sobrepor drivers uns sobre os outros, seria muito simples detectar se um determinado driver usa exatamente a mesma função que o driver que será sobreposto e otimizar a duplicação. Meu primeiro palpite seria que tal otimização seria realmente muito necessária, para evitar vários tipos de comportamentos tolos. Portanto, se a configuração acabar fazendo exatamente a mesma coisa, espero que ela faça o mesmo, não importa como seja declarada.