O guia seguinte vai orientá-lo nos passos para configurar e demonstrar o uso do arranque NVMe sobre TCP (PoC) no Ubuntu, utilizando duas máquinas virtuais (VMs) num sistema host com Ubuntu Desktop 24.04.
Este PoC utiliza o libvirt para gerir as VMs e KVM como hipervisor. É recomendado para sistemas x86_64.
Cenário
A primeira VM (NVMe Target) irá executar o Ubuntu Server 24.04, responsável por expor uma drive NVMe através de TCP. Esta drive NVMe será o disco de instalação da segunda VM.
Nota: O sistema NVMe Target pode não precisar de uma versão específica de Ubuntu, ou até de um sistema operativo específico. Caso tenha um sistema a expor uma drive NVMe via TCP, pode utilizá-lo, desde que cumpra os requisitos básicos listados abaixo:
- Sistema com o daemon qemu-guest-agent.
- Exposição de drive NVMe via TCP na porta 4420.
- Interface de rede nomeada como enp1s0.
- O nome de domínio da VM no libvirt deve ser “ubuntu-nvmeotcp-poc-target”.
A segunda VM (NVMe Initiator) será um sistema sem disco, a correr o Ubuntu Server 24.10, utilizando a drive NVMe exposta pela rede.
Pré-requisitos
Instalar os pacotes necessários no host
Execute o comando seguinte para instalar todas as dependências no sistema host:
sudo apt install \
libvirt-daemon libvirt-clients virtinst virt-viewer virt-manager qemu-system-x86 \
libcap2-bin \
wget \
python3-jinja2 python3-yaml \
fusefat fdisk dosfstools \
git
Descarregar as ISOs de instalação
O Ubuntu 24.04 será instalado na VM NVMe Target, enquanto o Ubuntu 24.10 será instalado na VM NVMe Initiator.
sudo mkdir --parents /srv/iso
sudo chown -- "$UID" /srv/iso
wget https://releases.ubuntu.com/24.04/ubuntu-24.04.1-live-server-amd64.iso --directory-prefix /srv/iso
wget https://cdimage.ubuntu.com/ubuntu-server/daily-live/current/oracular-live-server-amd64.iso --directory-prefix /srv/iso
Clonar o repositório do PoC
Execute o comando abaixo para clonar o repositório:
git clone https://github.com/canonical/nvme-tcp-poc
Navegue até ao diretório do repositório:
cd nvme-tcp-poc
Preparar o pool de libvirt
mkdir --parents pool
virsh --connect qemu:///session pool-define-as ubuntu-nvmeotcp-poc --type dir --target "$PWD/pool"
virsh --connect qemu:///session pool-autostart ubuntu-nvmeotcp-poc
virsh --connect qemu:///session pool-start ubuntu-nvmeotcp-poc
Configurar a rede
Execute o script seguinte para configurar a rede:
./setup-network.sh
Configuração opcional: virt-manager para gerir as VMs
Execute o virt-manager para gerir as VMs via interface gráfica:
virt-manager --connect qemu:///session
Criar as VMs
Criar e configurar a VM Target
O setup da VM Target usa o instalador Subiquity e é completamente automatizado. Execute o comando seguinte para criar a VM Target:
./create-target-vm.py
Após a criação, inicie a VM:
virsh --connect qemu:///session start ubuntu-nvmeotcp-poc-target
Criar e configurar a VM Initiator
Execute o seguinte comando para criar a VM Initiator:
./create-initiator-vm.py
Siga os passos normais de instalação do Ubuntu Server, garantindo que seleciona o layout de armazenamento personalizado e usa a drive NVMe/TCP exposta.
Configurar o firmware na VM Initiator
Após a instalação, configure o firmware da VM Initiator:
./configure-firmware.py
Arrancar a VM Initiator
Sempre que iniciar a VM Initiator, aceda ao menu de configuração do firmware pressionando a tecla ESC repetidamente. Selecione “UEFI NVMeOF Linux” para arrancar a partir da drive NVMe/TCP.
Problemas conhecidos
- Erros de I/O podem ocorrer durante o arranque da VM Initiator, mas um workaround foi implementado no PoC.
- A VM Initiator pode demorar a desligar-se.