smbclient e NT_STATUS_IO_TIMEOUT

A volte capita di dover trasferire file da macchine Windows a macchina Linux. In questi casi uno degli strumenti che si possono utilizzare è smbclient, che accede da Linux ad una cartella condivisa della macchina Windows e trasferisce file bidirezionalmente.

Nel caso che il trasferimento sia lento si può rilevare un timeout con il messaggio d’errore «parallel_read returned NT_STATUS_IO_TIMEOUT».

smb> get nomefile
parallel_read returned NT_STATUS_IO_TIMEOUT

La parte interessante di questo messaggio è «parallel», difatti da quanto ho capito, smbclient fa 10 richieste in parallelo per leggere 10 porzioni successive del file che si trasferisce, e attende un certo periodo per riceverle tutte e 10. Se una delle 10 non arriva, scatta il timeout e il trasferimento viene interrotto.

Il timeout non ha una durata modificabile tramite parametri, ma lo ha la dimensione della porzione di file da leggere: questa dimensione ha un valore predefinito che è dato dal server, ma può essere regolato con il comando «iosize» di smbclient. La pagina di manuale di smbclient dice che ci può impostare un valore qualsiasi tra 0 e 16776960, ma il valore minimo è in realtà 16384. Se si imposta un valore minore si ottiene questo errore:

smb> iosize 8192
iosize out of range (min = 16384 (0x4000), max = 16776960 (0xFFFF00)

Impostando il valore minimo si ottiene il trasferimento di pacchetti dati più piccoli, che presumibilmente verranno trasferiti senza fare scattare il timeout.

Con il valore 16348 ho trasferito con successo parecchi file tramite linea ADSL con velocità inferiore ai 7mbit/s.