La shell di Linux è sorprendente, e spesso si possono sommare alcune tecniche per poter ampliare virtualmente all’infinito le possibilità. Nell’esempio odierno vediamo come utilizzare il comando dd che serve per masterizzare da linea di comando (è utilizzato ad esempio per scrivere una chiavetta usb da una immagine ISO).
Il comando dd ha pochi parametri:
dd if=/mnt/file.iso of=/dev/sdb bs=4096
Nell’esempio appena mostrato stiamo masterizzando il file.iso sul device /dev/sdb scrivendo a blocchi di 4096 byte per volta.
Ora possiamo ampliare questo comando passandolo a SSH
dd if=/dev/sda | ssh username@servername "dd of=/tmp/file.iso"
Come si può notare abbiamo utilizzato il disco locale come interfaccia di entrata (if) e passato il dato via ssh ad un server remoto per compilare un file iso come interfaccia di uscita (of). Questa modalità ovviamente si avvantaggia della connessione criptata tipica di SSH, ma allo stesso tempo è svantaggiata proprio da questa funzione nella velocità globale poiché dovrà criptare e decriptare tutti i dati.
Se non è nostro interesse una sicurezza assoluta del dato in transito possiamo cambiare la modalità di utilizzo da SSH a NetCat, magari utilizzando la compressione dati per cercare di ottenere il massimo delle performance. Per poter ottenere questo risultato andremo a “spaccare” l’operazione nei due distinti server, ovvero lanceremo if nel server di partenza e of nel server di destinazione.
Mettiamo che vogliamo clonare il disco del server A con device /dev/sda nel server B con device /dev/sdb.
Nel server destinazione ci metteremo in ascolto con il comando:
nc -l 1999|bzip2 -d|dd bs=16M of=/dev/sdb
NetCat si mette in ascolto sulla porta 1999 con compressione tipo bzip2. I blocchi da trasferire via dd saranno da 16 mega l’unto, e poi alla fine il device fisico che sarà masterizzato.
Ora nel server di partenza, quello dove attingeremo i dati, andiamo ad eseguire lo script
dd bs=16M if=/dev/sda|bzip2 -c|nc 192.168.1.10 1999
In questo caso ripetiamo il parametro dei blocchi a 16 mega, indichiamo il device di origine e poi indichiamo a netcat il server di destinazione e la porta sui cui esso è in ascolto.
In sostanza andiamo a superare il problema di non avere spazio disco ove masterizzare i dati potendo copiarli direttamente su una macchina nuova. Va da se che la connessione di rete debba essere il più ottimale possibile, come potrebbe esserlo una rete locale. Nulla vieta di fare lo stesso con un server sulla rete Internet, ma dovrete mettere in conto potenziali problemi esterni e non controllabili che potrebbero inficiare la riuscita del lavoro.