Il "vero" transfer rate dal CD-ROM all'hard disk

Introduzione

Lo script che presento in questa pagina si basa su un'idea molto semplice per misurare la velocità di trasferimento continua dal lettore CD-ROM o dal masterizzatore all'hard disk.
Alla base di tutto sta la possibilità di effettuare la copia byte per byte di un intero CD-ROM con estrema facilità.
Infatti, supponendo che /dev/hdc corrisponda al lettore CD-ROM e il disco da cui si sta operando abbia abbastanza spazio libero, con il semplice comando
		dd if=/dev/hdc of=immagine-iso.raw
		
si copia l'intero contenuto del CD-ROM nel file 'immagine-iso.raw', byte per byte.
Tale file può essere utilizzato come se fosse il CD-ROM stesso, ovvero montato e smontato come un normale disco.
Per provare ciò, supponendo di essere root e di disporre della directory /mnt/disk, basta digitare:
		mount -o loop immagine-iso.raw /mnt/disk
		
A questo punto, il comando
		ls /mnt/disk
		
visualizzerà il contenuto del CD-ROM come se fosse stato inserito fisicamente nel lettore.

Lo script

Veniamo al punto.
La copia byte a byte di un intero CD-ROM prescinde da qualsiasi organizzazione dei file sul disco. Ciò significa che un CD-ROM per Macintosh, per Unix o per Windows verranno trattati allo stesso modo: come un flusso ininterrotto di byte.
In questo modo la testina del lettore non deve effettuare alcuno spostamento supplementare oltre a quello richiesto per leggere le tracce dati. Non dovendo leggere directory, file e altre informazioni accessorie normalmente non contigue, non viene sprecato tempo a spostare la testina (tempo che normalmente è molto elevato in rapporto alla pura velocità di lettura dei dati); il flusso di byte è perciò continuo e proporzionale alla velocità di rotazione del disco.
L'idea alla base dello script è molto semplice: si "misura" ogni secondo la dimensione del file immagine ('immagine-iso.raw' nell'esempio precedente), si calcola la differenza tra due valori successivi e si trova in tal modo la quantità di dati trasferita dal CD-ROM al file (quindi all'hard-disk) in un secondo.
Naturalmente questo metodo è piuttosto rudimentale, tuttavia fornisce una indicazione complessiva che comprende non solo le caratteristiche del CD-ROM, ma dell'intero sottosistema di I/O (CD-ROM, hard disk, controller EIDE della scheda madre).
Inoltre, fornendo un dato ogni secondo permette di vedere come la velocità di trasferimento varia nel tempo, e di scoprire quindi eventuali difetti e/o inefficienze del lettore CD-ROM in funzione della posizione della testina.

Lo scrip è il seguente:

#!/bin/bash
attuale=`ls -l $1 | gawk '{print $5}'`
prec=$attuale;
while test 1 ; do 
        attuale=`ls -l $1 | gawk '{print $5}'`
	let t_rate=$attuale-$prec
	prec=$attuale
	echo Actual size of file $1: $attuale
	echo Tranfser rate: $t_rate B/s
	sleep 1; 
done
Il suo utilizzo è molto semplice. Supponendo di salvarlo nel file trate.bash (ricordatevi di renderlo eseguibile con il comando 'chmod u+x trate.bash'), basta lanciarlo con:
./trate.bash <nome del file da monitorare>

Spiegazione riga per riga

La prima riga è un commento speciale, che indica all'interprete dei comandi quale shell utilizzare per eseguire lo script (in questo caso bash).
La seconda inizializza la variabile attuale con la dimensione del file al momento del lancio dello script. '$1' viene sostituito con il nome del file fornito come argomento dello script.
La variabile prec memorizza la dimensione del file nel secondo precedente.
La condizione di stop del ciclo while è costante, quindi lo script 'gira' finchè non si preme CTRL-C.
La prima istruzoine del ciclo è identica alla prima riga dello script, e aggiorna la variabile attuale.
Il comando let premette di far effettuare alla bash operazioni aritmetiche, in questo caso la differenza tra le due dimensioni del file.
La variabile prec deve poi essere posta uguale al valore attuale. In questo modo quando viene effettuata la differenza tra attuale e prec, quest'ultima ha sempre il valore che la prima aveva nel ciclo precedente.
La prima istruzione echo può essere tranquillamente rimossa, in quanto mostra solo la dimensione attuale del file, unitamente al suo nome.
La seconda istruzione echo stampa la differenza calcolata precedentemente.
L'istruzione sleep sospende lo script per un secondo. In tal modo, l'aggiornamento della variabile attuale avviene (circa) ogni secondo. Perciò la differenza calcolata con let corrisponde (circa) alla quantità di dati scritta nel file in un secondo.

Note