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.
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 (
nvmetclienvme-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 |
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) envme-tcp(no Initiator) ao arquivo/etc/modules.
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.
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/fstabpara 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.
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.
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."