NVMe over TCP: cambia tutto per clonare dischi attraverso la rete alla massima velocità

Cos'è NVMe over TCP e come consente di trasferire dati da un dispositivo di memorizzazione all'altro in rete locale o comunque su reti TCP/IP, alla massima velocità possibile.

Ratificato ufficialmente a fine 2018, NVMe over TCP (Non-Volatile Memory Express over TCP) è un protocollo ancora oggi davvero poco conosciuto che permette la comunicazione tra dispositivi di archiviazione basati su NVMe tramite reti TCP/IP. Scusate se è poco!

L’idea alla base di NVMe over TCP è quella di estendere le capacità di NVMe al di là delle connessioni PCIe, consentendo alle unità di archiviazione di essere accessibili tramite reti TCP/IP standard. Il vantaggio è, ovviamente, quello di poter trasferire dati alla massima velocità possibile riducendo la latenza e migliorando le prestazioni.

NVMe over TCP permette di sfruttare le reti esistenti, come reti Ethernet e WiFi, per l’accesso alle unità di archiviazione NVMe, eliminando la necessità di infrastrutture hardware specializzate come switch o schede di rete compatibili NVMe-oF (NVMe over Fabrics). Questi ultimi apparati, tra le altre cose, richiedono cavi in fibra ottica come mezzo di trasporto dei dati.

Clonare dischi e trasferire dati alla massima velocità con NVMe over TCP

È un ingegnere software, Vasudeva Kamath, a raccontare com’è riuscito a clonare un’unità NVMe da 512 GB su un nuovo notebook, collegato in rete locale, senza disconnettere fisicamente e ricollegare alcun supporto di memorizzazione.

Esponendo l’unità SSD NVMe PCIe da clonare attraverso NVMe over TCP, diventa molto semplice trasferire i dati da un vecchio a un nuovo disco appoggiandosi alla LAN. Specie se si può contare su una Multigigabit Ethernet. Se così non fosse, trasportare i dati attraverso la rete resta comunque cosa fattibilissima, seppur beneficiando di prestazioni inferiori.

Configurare l’unità di memorizzazione NVMe per l’accesso tramite rete TCP/IP

Come spiega Kamath, il trucco consiste nell’utilizzare una distribuzione Linux live (l’ingegnere ha utilizzato GRML) quindi impartire una serie di comandi dalla finestra del terminale sul sistema di origine (quello da cui si desiderano copiare i dati). Spieghiamo nel dettaglio i comandi che trovate al paragrafo “Exporting Disk over NVMe TCP“:

1. modprobe nvemt-tcp: Carica il modulo del kernel `nvmet-tcp`, che è responsabile della gestione della comunicazione NVMe over TCP.

2. cd /sys/kernel/config/nvmet: Si sposta nella directory che contiene le impostazioni del modulo NVMe over TCP e NVMe-oF.

3. mkdir ports/0: Crea una porta NVMe (port 0) per accettare le connessioni dei client NVMe.

4. cd ports/0: Si sposta nella directory virtuale corrispondente alla porta di comunicazione appena creata.

5. echo "ipv4" > addr_adrfam: Imposta il tipo di indirizzo su IPv4 per la porta NVMe.

6. echo 0.0.0.0 > addr_traaddr: Imposta l’indirizzo di trasporto su 0.0.0.0, che significa che la porta accetta connessioni da qualsiasi indirizzo IP.

7. echo 4420 > addr_trsvcid: Imposta la porta di servizio (service port) su 4420, che è la porta predefinita per NVMe over TCP.

8. echo tcp > addr_trtype: Imposta il tipo di trasporto su TCP.

9. cd /sys/kernel/config/nvmet/subsystems: Si sposta nella directory contenente il file del sottosistema NVMe.

10. mkdir testnqn: Crea un nuovo sottosistema NVMe chiamato testnqn.

11. echo 1 > testnqn/allow_any_host: Consente a qualsiasi host di connettersi a questo sottosistema senza autenticazione.

12. mkdir testnqn/namespaces/1: Crea un namespace (spazio dei nomi) nel sottosistema testnqn.

13. cd testnqn: Si sposta nella directory del sottosistema testnqn.

14. echo "/dev/nvme0n1" > namespaces/1/device_path: Specifica il percorso del dispositivo NVMe (/dev/nvme0n1) che sarà esportato come spazio dei nomi 1.

15. echo 1 > namespaces/1/enable: Abilita il namespace 1 all’interno del sottosistema testnqn.

16. ln -s "../../subsystems/testnqn" /sys/kernel/config/nvmet/ports/0/subsystems/testnqn: Crea un link simbolico dalla directory della porta al sottosistema testnqn, consentendo alla porta NVMe di servire il sottosistema specificato.

Stabilire la connessione con il dispositivo di storage dal quale copiare i dati

Usando sempre la stessa distribuzione Linux live sul dispositivo di destinazione, è possibile eseguire i comandi seguenti per effettuare la ricerca del supporto di memorizzazione di origine quindi stabilire la connessione tramite NVMe over TCP:

nvme discover -t tcp -a <ip> -s 4420
nvme connectl-all -t tcp -a <> -s 4420
nvme list

L’indicazione <ip> va sostituita con l’indirizzo IP del sistema; l’ultimo comando mostra il dispositivo collegato con il nuovo notebook, sul quale si vogliono trasferire i dati.

Clonare il disco e ridimensionare la partizione

Per copiare i dati da un’unità di memorizzazione all’altra via NVMe over TCP, è possibile clonare il disco con l’utilità dd. La sintassi da usare è la seguente:

dd if=/dev/nvme2n1 of=/dev/nvme0n1 status=progress bs=40M

  • if=/dev/nvme2n1: Specifica il file di input (if sta per “input file“) da cui verranno letti i dati. All’interno del comando, /dev/nvme2n1 rappresenta il dispositivo di archiviazione di origine da cui i dati saranno letti.
  • of=/dev/nvme0n1: Specifica il file di output (of sta per “output file“): /dev/nvme0n1 rappresenta il dispositivo di archiviazione di destinazione sul quale i dati saranno scritti.
  • status=progress: Questa opzione abilita la visualizzazione di un messaggio di avanzamento che indica lo stato dell’operazione di copia. Mostra informazioni come quanti byte sono stati copiati finora e a quale velocità.
  • bs=40M: Specifica la dimensione del blocco di lettura/scrittura. In questo caso, 40M indica che il comando utilizzerà blocchi di dati di dimensione 40 MB per leggere e scrivere i dati. Impostare una dimensione del blocco adeguata può ottimizzare le prestazioni della copia dei dati, specialmente quando si lavora con grandi quantità di dati.

Come ultimo passo, Kamath ha semplicemente ridimensionato la partizione creata sul disco di destinazione in modo da occupare lo spazio pari a 1 Terabyte disponibile sull’unità di destinazione.

Credit immagine in apertura: Copilot Designer.

Ti consigliamo anche

Link copiato negli appunti