Como configurar uma SAN NVMe/TCP no Linux para substituir o iSCSI

      Carlos Ornelas 9 min de leitura
      Como configurar uma SAN NVMe/TCP no Linux para substituir o iSCSI

      Aprenda a configurar uma SAN NVMe/TCP no Linux passo a passo. Descubra como criar targets e initiators para reduzir a latência do seu storage e superar os limites do iSCSI.

      Compartilhar:

      O protocolo iSCSI foi o padrão ouro para redes de armazenamento em bloco (SAN) por mais de duas décadas. No entanto, com a ascensão dos discos de estado sólido baseados no barramento PCIe, a arquitetura de fila única do iSCSI tornou-se um gargalo severo. É aqui que entra o NVMe/TCP, uma tecnologia projetada para estender a velocidade massiva e o paralelismo do armazenamento moderno através de redes Ethernet comuns.

      Resumo em 30 segundos

      • O NVMe/TCP permite compartilhar discos NVMe pela rede usando a infraestrutura Ethernet padrão.
      • Substitui o iSCSI oferecendo menor latência e maior IOPS graças ao design de múltiplas filas.
      • A configuração no Linux exige apenas pacotes nativos (nvmetcli e nvme-cli) e módulos do kernel.

      Neste guia, você aprenderá a configurar um servidor Linux como alvo (Target) para exportar um disco físico e outro servidor como cliente (Initiator) para consumir esse armazenamento, criando sua própria SAN de alta performance.

      Entendendo a mudança do iSCSI para o NVMe/TCP

      O protocolo NVMe (Non-Volatile Memory Express) foi criado especificamente para memórias flash. Diferente do SAS ou SATA, ele suporta até 64 mil filas de comandos, com 64 mil comandos por fila. O NVMe-oF (NVMe over Fabrics) é a extensão desse protocolo para a rede.

      A variante NVMe/TCP encapsula esses comandos diretamente em pacotes TCP/IP. Isso significa que você não precisa de switches especiais ou placas de rede caras (como exigido pelo RDMA ou Fibre Channel). Você obtém um desempenho próximo ao de um disco local usando a rede que já possui.

      Abaixo, detalhamos as diferenças cruciais entre as tecnologias:

      Característica iSCSI NVMe/TCP
      Arquitetura de filas Fila única (Single Queue) Múltiplas filas (Multi-Queue)
      Overhead de CPU Alto (gargalo em um núcleo) Baixo (distribuído entre núcleos)
      Hardware de rede Ethernet padrão Ethernet padrão
      Foco principal HDDs e SSDs SATA/SAS SSDs NVMe de alta performance

      Comparativo arquitetural entre a fila única do iSCSI e as múltiplas filas do NVMe/TCP. Figura: Comparativo arquitetural entre a fila única do iSCSI e as múltiplas filas do NVMe/TCP.

      O que vamos construir hoje

      Para este tutorial, utilizaremos dois servidores rodando Ubuntu ou Debian. A topologia será a seguinte:

      • Servidor Target (Alvo): Possui o disco físico. Endereço IP 192.168.1.10.

      • Servidor Initiator (Cliente): Vai montar o disco remoto. Endereço IP 192.168.1.20.

      Certifique-se de que ambos os servidores conseguem se comunicar pela rede e que você possui privilégios de root (ou acesso via sudo).

      Passo 1: Preparando o ambiente e instalando pacotes

      O suporte ao NVMe/TCP está embutido no kernel do Linux desde a versão 5.0. O primeiro passo é instalar as ferramentas de espaço de usuário em ambos os servidores.

      No Servidor Target, instale a ferramenta de gerenciamento de exportação:

      sudo apt update
      sudo apt install nvmetcli
      

      No Servidor Initiator, instale a ferramenta de cliente:

      sudo apt update
      sudo apt install nvme-cli
      

      Agora, precisamos carregar os módulos do kernel responsáveis por gerenciar o tráfego de armazenamento.

      No Target, carregue os módulos de subsistema e transporte TCP:

      sudo modprobe nvmet
      sudo modprobe nvmet-tcp
      

      No Initiator, carregue o módulo de cliente TCP:

      sudo modprobe nvme-tcp
      

      💡 Dica Pro: Para garantir que esses módulos sejam carregados automaticamente após uma reinicialização do servidor, adicione os nomes nvmet-tcp (no Target) e nvme-tcp (no Initiator) ao arquivo /etc/modules.

      Carregamento dos módulos do kernel necessários para o NVMe over Fabrics. Figura: Carregamento dos módulos do kernel necessários para o NVMe over Fabrics.

      Passo 2: Configurando o servidor target para exportar o disco

      Acesse o Servidor Target (192.168.1.10). Vamos supor que você tenha um disco físico não particionado identificado como /dev/nvme0n1. Nosso objetivo é criar um subsistema e atrelar este disco a ele.

      Inicie o utilitário de configuração interativa:

      sudo nvmetcli
      

      Você entrará em um prompt especial. Siga a sequência de comandos abaixo para criar a estrutura.

      Primeiro, crie um subsistema. O nome deve seguir o padrão NQN (NVMe Qualified Name):

      > cd /subsystems
      > create nqn.2024-01.com.exemplo:armazenamento-rapido
      

      Permita que qualquer cliente se conecte a este subsistema (em um ambiente de produção, você restringiria isso por segurança):

      > cd nqn.2024-01.com.exemplo:armazenamento-rapido
      > set attr allow_any_host=1
      

      Agora, crie um namespace (a representação lógica do disco) e aponte para o seu dispositivo físico:

      > cd namespaces
      > create 1
      > set device path=/dev/nvme0n1
      > enable
      

      O próximo passo é criar uma porta de rede para escutar as conexões. O NVMe/TCP usa a porta padrão 4420:

      > cd /ports
      > create 1
      > set addr trtype=tcp
      > set addr traddr=192.168.1.10
      > set addr trsvcid=4420
      

      Por fim, vincule o subsistema que criamos à porta de rede:

      > cd /ports/1/subsystems
      > create nqn.2024-01.com.exemplo:armazenamento-rapido
      

      Salve a configuração e saia do utilitário:

      > cd /
      > saveconfig /etc/nvmet/config.json
      > exit
      

      O seu servidor Target agora está ativamente escutando requisições na porta 4420 e pronto para servir o disco.

      Passo 3: Conectando o cliente initiator ao armazenamento remoto

      Mude para o Servidor Initiator (192.168.1.20). O processo de conexão envolve duas etapas: descobrir o alvo e estabelecer a sessão.

      Execute o comando de descoberta (Discovery) apontando para o IP do Target:

      sudo nvme discover -t tcp -a 192.168.1.10 -s 4420
      

      A saída mostrará os detalhes do subsistema disponível, confirmando que a comunicação de rede está funcionando. Para conectar efetivamente ao disco, use o comando de conexão informando o NQN que criamos no passo anterior:

      sudo nvme connect -t tcp -a 192.168.1.10 -s 4420 -n nqn.2024-01.com.exemplo:armazenamento-rapido
      

      Se o comando retornar silenciosamente, a conexão foi um sucesso.

      Topologia de rede mostrando o initiator consumindo o disco do target via TCP/IP. Figura: Topologia de rede mostrando o initiator consumindo o disco do target via TCP/IP.

      Passo 4: Validando a topologia e formatando o disco

      Ainda no Servidor Initiator, precisamos confirmar se o sistema operacional reconheceu o novo disco de bloco.

      Liste os dispositivos NVMe conectados:

      sudo nvme list
      

      Você verá uma tabela listando o disco, indicando que ele está conectado via rede (TCP). Para ver como o Linux mapeou o dispositivo de bloco, use o comando padrão de listagem:

      lsblk
      

      Você notará um novo dispositivo, geralmente nomeado como /dev/nvme1n1 (o número pode variar dependendo de quantos discos locais você possui). A partir deste ponto, o Linux trata esse disco remoto exatamente como um disco físico local.

      Vamos criar um sistema de arquivos e montá-lo:

      sudo mkfs.ext4 /dev/nvme1n1
      sudo mkdir -p /mnt/dados_remotos
      sudo mount /dev/nvme1n1 /mnt/dados_remotos
      

      ⚠️ Perigo: Se você for adicionar este disco ao arquivo /etc/fstab para montagem automática no boot, é obrigatório usar a opção _netdev. Isso avisa ao Linux para aguardar a inicialização da rede antes de tentar montar o disco, evitando falhas críticas na inicialização do sistema.

      Passo 5: Resolvendo falhas de conexão e erros no dmesg

      Redes de armazenamento podem apresentar desafios. Se o comando nvme connect falhar, a primeira linha de defesa é verificar os logs do kernel.

      Execute o comando abaixo no Initiator para ver as mensagens recentes do sistema:

      dmesg | tail -n 20
      

      Aqui estão os problemas mais comuns e como resolvê-los:

      Erro de "Connection Refused" (Conexão Recusada): Isso geralmente indica um bloqueio de firewall. Verifique se o servidor Target está permitindo tráfego na porta correta. No Ubuntu, você pode liberar a porta com o UFW:

      sudo ufw allow 4420/tcp
      

      Módulo não encontrado (Module not found): Se o comando modprobe falhar, seu kernel pode estar desatualizado ou compilado sem suporte a NVMe-oF. Verifique sua versão com uname -r. É estritamente necessário um kernel versão 5.0 ou superior.

      Latência alta ou desconexões frequentes: O NVMe/TCP é sensível à qualidade da rede. Certifique-se de que não há perda de pacotes entre os servidores usando um simples ping. Em ambientes de produção, é recomendado isolar o tráfego de storage em uma VLAN dedicada e configurar Jumbo Frames (MTU 9000) nas interfaces de rede para reduzir a fragmentação de pacotes.

      A análise de logs do sistema e regras de firewall é o primeiro passo na resolução de problemas. Figura: A análise de logs do sistema e regras de firewall é o primeiro passo na resolução de problemas.

      O futuro do armazenamento em rede

      A transição do iSCSI para o NVMe/TCP não é apenas uma atualização incremental de velocidade. É uma mudança fundamental na forma como os data centers lidam com o armazenamento em bloco. Ao remover a necessidade de hardware de rede especializado e aproveitar o paralelismo nativo das memórias flash, o NVMe/TCP democratiza o acesso a SANs de altíssimo desempenho.

      A recomendação atual para arquitetos de infraestrutura é clara: novos projetos de virtualização, clusters de banco de dados e ambientes de alta disponibilidade devem considerar o NVMe/TCP como o padrão primário para armazenamento em rede. O iSCSI continuará existindo por motivos de legado, mas a eficiência computacional do protocolo NVMe ditará as regras da próxima década em infraestrutura de servidores.

      Qual a principal vantagem do NVMe/TCP sobre o iSCSI? O NVMe/TCP utiliza múltiplas filas de submissão e conclusão, mapeando diretamente para os núcleos do processador. Isso elimina os gargalos de fila única do iSCSI, reduzindo drasticamente a latência e aumentando o IOPS em redes Ethernet padrão.
      Preciso de placas de rede especiais (RDMA) para usar NVMe/TCP? Não. Diferente do NVMe/RoCE ou iWARP, o NVMe/TCP funciona sobre redes Ethernet TCP/IP convencionais, exigindo apenas placas de rede padrão (NICs), o que barateia e simplifica a adoção em data centers.
      O NVMe/TCP suporta autenticação de segurança? Sim, as versões mais recentes do protocolo e do kernel Linux suportam autenticação in-band (como DH-HMAC-CHAP) e criptografia via TLS para proteger os dados em trânsito entre o initiator e o target.
      #nvme-tcp #nvme over fabrics #linux storage #iscsi vs nvme #configuração san linux #nvmetcli #armazenamento de dados
      Carlos Ornelas
      Assinatura Técnica

      Carlos Ornelas

      Mecânico de Datacenter

      "Vivo nos corredores frios instalando racks e organizando cabeamento estruturado. Para mim, a nuvem é feita de metal, silício e ventoinhas que precisam girar sem parar."