Domanda

Mi sto preparando a rilasciare uno strumento che è efficace solo con hard disk regolari, non SSD (Solid State Drive). In realtà, non deve essere usato con SSD perché si tradurrà in un sacco di lettura / scrive con alcuna reale efficacia.

Qualcuno sa di un modo di rilevare se una data unità è a stato solido?

È stato utile?

Soluzione

Rilevamento SSD non è impossibile come dseifert fa fuori. C'è già qualche progresso nella libata di Linux ( http: // linux .derkeiler.com / mailing-list / kernel / 2009-04 / msg03625.html ), anche se non sembra dall'utente ancora pronto.

E io sicuramente capisco perché questo deve essere fatto. E 'fondamentalmente la differenza tra una lista collegata e un array. Deframmentazione e tale è di solito controproducente su uno SSD.

Altri suggerimenti

Finalmente una soluzione affidabile! Due di loro, in realtà!

Controlla / sys / block / sdX / coda / rotazione, dove sdX è il nome dell'unità. Se è 0, hai a che fare con uno SSD, e 1 significa pianura vecchio HDD.

Non riesco a mettere il dito sulla versione di Linux in cui è stato introdotto, ma è presente in Ubuntu Linux 3.2 e vaniglia Linux 3.6 e non presente in vaniglia 2.6.38. Oracle ha anche backport a proprio kernel Enterprise Unbreakable 5.5, che si basa su 2.6.32.

C'è anche un ioctl per verificare se l'unità è a rotazione dal momento che Linux 3.3, introdotto da questo commit . Utilizzando sysfs è di solito più conveniente, però.

Si può effettivamente determinare abbastanza facilmente la latenza di rotazione - L'ho fatto una volta come parte di un progetto universitario. E 'descritto in questo rapporto . Avrai voglia di andare a pagina 7 in cui si vedono alcune belle grafici della latenza. Si va da circa 9,3 ms a 1,1 ms - un calo di 8,2 ms. Ciò corrisponde direttamente al 60 s / 8.2 ms = 7317 RPM.

E 'stato fatto con semplice codice C - ecco la parte che le misure la tra posizioni a band in un file di zero. L'abbiamo fatto con i valori b sempre più grandi fino a quando abbiamo vagato tutto intorno un cilindro:

/* Measure the difference in access time between a and b.  The result
 * is measured in nanoseconds. */
int measure_latency(off_t a, off_t b) {
  cycles_t ta, tb;

  overflow_disk_buffer();

  lseek(work_file, a, SEEK_SET);
  read(work_file, buf, KiB/2);

  ta = get_cycles();
  lseek(work_file, b, SEEK_SET);
  read(work_file, buf, KiB/2);
  tb = get_cycles();

  int diff = (tb - ta)/cycles_per_ns;
  fprintf(stderr, "%i KiB to %i KiB: %i nsec\n", a / KiB, b / KiB, diff);
  return diff;
}

Questa lsblk -d -o name,rota comando elenca le unità e ha un 1 a ROTA se si tratta di un disco di rotazione e un 0 se si tratta di uno SSD. uscita Esempio:

NAME ROTA
sda     1
sdb     0

Si potrebbe ottenere fortunati eseguendo

smartctl -i sda

smartmontools . Quasi tutte le unità SSD ha SSD nel campo Modello. Nessuna garanzia però.

dispositivi SSD emulano un'interfaccia periferica di disco rigido, in modo che possano essere usati solo come dischi rigidi. Questo significa anche che non esiste un modo generale di rilevare quello che sono.

Probabilmente potrebbe usare alcune caratteristiche del drive (latenza, velocità, dimensioni), anche se questo non sarà accurato per tutte le unità. Un'altra possibilità potrebbe essere quella di guardare il S.M.A.R.T. dati e vedere se è possibile determinare il tipo di disco attraverso questo (dal nome del modello, certi valori), ma a meno che non si mantiene un database di tutte le unità là fuori, questo non sta andando essere accurato al 100% sia.

I miei due centesimi a rispondere a questa vecchia ma molto importante domanda ... Se un disco è accessibile tramite SCSI, quindi si (potenzialmente) in grado di utilizzare il comando SCSI INCHIESTA richiedere il suo tasso di rotazione. VPD (dati vitali prodotto) la pagina per questo si chiama Block Device Characteristics e ha un numero 0xB1. Byte 4 e 5 di questa pagina contengono un numero di significato:

  • 0000h "velocità di rotazione mezzo non è stato riferito"
  • 0001h "medio non rotante (per esempio, stato solido)"
  • 0002H - 0400H "riservato"
  • 0401H - FFFEh "velocità di rotazione medio nominale in giri al minuto (cioè, rpm) (per esempio, 7 200 rpm = 1C20h, 10 000 rpm = 2710H, e 15 000 rpm = 3A98h) "
  • FFFFh "Riservato"

Quindi, SSD deve avere 0001h in questo campo. Il documento T10.org su questa pagina si possono trovare rel="nofollow"> .

Tuttavia, lo stato di attuazione di tale principio non mi è chiaro.

ho scritto il seguente codice javascript. Avevo bisogno di determinare se macchina è stata ussing drive SSD e se fosse unità di avvio. La soluzione utilizza l'interfaccia MSFT_PhysicalDisk WMI.

function main()
{
    var retval= false;
    // MediaType - 0 Unknown, 3 HDD, 4 SSD
    // SpindleSpeed - -1 has rotational speed, 0 has no rotational speed (SSD)
    // DeviceID - 0 boot device
    var objWMIService = GetObject("winmgmts:\\\\.\\root\\Microsoft\\Windows\\Storage");
    var colItems = objWMIService.ExecQuery("select * from MSFT_PhysicalDisk");  
    var enumItems = new Enumerator(colItems);
    for (; !enumItems.atEnd(); enumItems.moveNext()) 
    {
        var objItem = enumItems.item();
        if (objItem.MediaType == 4 && objItem.SpindleSpeed == 0)
        {
            if (objItem.DeviceID ==0)
            {
                retval=true;
            }
        }
    }
    if (retval)
    {
        WScript.Echo("You have SSD Drive and it is your boot drive.");
    }
    else
    {
        WScript.Echo("You do not have SSD Drive");
    }
    return retval;
}
main();

file di testo di scrittura
leggere file di testo

ripetere 10000 volte ...

10000/elapsed

per uno SSD sarà molto più alto, python3:

def ssd_test():

    doc = 'ssd_test.txt'
    start = time.time()
    for i in range(10000):
        with open(doc, 'w+') as f:
            f.write('ssd test')
            f.close()
        with open(doc, 'r') as f:
            ret = f.read()
            f.close()
    stop = time.time()
    elapsed = stop - start
    ios = int(10000/elapsed)
    hd = 'HDD'
    if ios > 6000: # ssd>8000; hdd <4000
        hd = 'SSD'
    print('detecting hard drive type by read/write speed')
    print('ios', ios, 'hard drive type', hd)
    return hd
scroll top