O que são namespaces nvme? Como eles funcionam?

18

Recentemente, comecei a oferecer suporte ao Linux instalado em dispositivos com ssds nvme internos. Notei que os arquivos do dispositivo tinham um número extra, além de um número que identifica o número da unidade e o número da partição. As unidades IDE / SATA / SCSI normalmente têm apenas uma letra e um número de partição.

Por exemplo: / dev / nvme0n1p2

Eu comecei a me perguntar qual era a parte n1 e, depois de um pouco de pesquisa, parece que isso identifica um 'namespace' do nvme. As definições para ele eram meio vagas: "Um espaço para nome NVMe é uma quantidade de memória não volátil (NVM) que pode ser formatada em blocos lógicos".

Portanto, isso funciona como uma partição definida no nível do controlador de hardware, e não em uma tabela de partição MBR ou GPT? Um espaço para nome pode abranger vários ssd nvme físicos? Por exemplo, você pode criar um namespace que agrupe o armazenamento de vários ssds em um único namespace lógico, semelhante ao RAID 0?

O que você faria com um namespace NVME que ainda não é possível usando tabelas de partição ou LVM ou um sistema de arquivos que pode gerenciar vários volumes (como ZFS, Btrfs, etc)?

Além disso, por que parece que a numeração do namespace começa em 1 em vez de 0? Isso é algo a ver com o modo como o NVME rastreia os números do namespace em um nível baixo (por exemplo, as partições também começam em 1, e não em 0, porque é assim que o padrão para números de partição foi definido, para que o kernel do Linux use apenas o número da partição que está armazenado no disco é - acho que o nvme funciona da mesma maneira?)

JeffFromOhio
fonte

Respostas:

17

No NVM Express e nos padrões relacionados, os controladores dão acesso ao armazenamento dividido em um ou mais namespaces. Os espaços para nome podem ser criados e excluídos por meio do controlador, desde que haja espaço para eles (ou o armazenamento subjacente suporte o provisionamento thin), e vários controladores podem fornecer acesso a um espaço para nome compartilhado. Como o armazenamento subjacente é organizado não é especificado pelo padrão, pelo que sei.

No entanto, os SSDs NVMe típicos não podem ser combinados, pois cada um deles fornece seu próprio armazenamento e controlador conectados a uma porta PCI Express, e o ponto de acesso é o controlador, acima dos espaços para nome - portanto, um espaço para nome não pode agrupar vários controladores (vários controladores podem fornecer acesso a um espaço para nome compartilhado). É melhor pensar nos namespaces como algo semelhante aos LUNs SCSI usados ​​no armazenamento corporativo (SANs etc.).

A numeração do namespace começa em 1, porque é assim que os identificadores de namespace por controlador funcionam. Os espaços para nome também têm identificadores mais longos e exclusivos globalmente.

Os espaços para nome podem ser manipulados usando o nvmecomando, que fornece suporte para recursos NVMe de baixo nível, incluindo:

  • formatação, que executa um formato de baixo nível e permite o uso de vários recursos (exclusão segura, seleção de formato LBA ...);
  • anexar e desanexar, que permite que os controladores sejam anexados ou desanexados de um espaço para nome (se eles o suportarem e o espaço para nome permitir).

Anexar e desanexar não é algo que você encontrará nas unidades NVMe de laptop ou desktop. Você o usaria com compartimentos de armazenamento NVMe, como os vendidos pela Dell EMC, que substituem as SANs iSCSI do passado.

Veja os padrões do NVM Express para obter detalhes (eles são relativamente fáceis de ler) e esta apresentação tutorial do NVM Express para uma boa introdução.

Stephen Kitt
fonte
Notei que o comando 'nvme' do Linux, além de oferecer suporte para excluir / criar espaços para nome, também fornece conceitos de anexar / desanexar e formatar um espaço para nome (que parece ser separado da operação de formatação de um sistema de arquivos gravando no espaço para nome). Você pode fornecer informações sobre o que são essas operações?
JeffFromOhio 21/05/19
3
Veja minha resposta atualizada.
Stephen Kitt