Arranque via NVMe/TCP com Ubuntu Server (PoC)

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:

  1. Sistema com o daemon qemu-guest-agent.
  2. Exposição de drive NVMe via TCP na porta 4420.
  3. Interface de rede nomeada como enp1s0.
  4. 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:

Bash
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.

Bash
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:

Bash
git clone https://github.com/canonical/nvme-tcp-poc

Navegue até ao diretório do repositório:

Bash
cd nvme-tcp-poc

Preparar o pool de libvirt

Bash
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:

Bash
./setup-network.sh

Configuração opcional: virt-manager para gerir as VMs

Execute o virt-manager para gerir as VMs via interface gráfica:

Bash
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:

Bash
./create-target-vm.py

Após a criação, inicie a VM:

Bash
virsh --connect qemu:///session start ubuntu-nvmeotcp-poc-target

Criar e configurar a VM Initiator

Execute o seguinte comando para criar a VM Initiator:

Bash
./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:

Bash
./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.

Artigos Relacionados