2009-05-25 8 views
32

Mi sto preparando a rilasciare uno strumento efficace solo con dischi rigidi normali, non SSD (unità a stato solido). In realtà, non dovrebbe essere usato con SSD perché risulterà in molte letture/scritture senza reale efficacia.Esiste un modo per rilevare se un'unità è un SSD?

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

+0

Questa domanda ha [una risposta su Unix e Linux] (http://unix.stackexchange.com/questions/65595/how-to-know-if-a-disk-is- un-SSD-o-an-HDD/65602 # 65602). – Totor

+0

[Come verificare se la mia Ubuntu è posizionata su SSD?] (Http://askubuntu.com/q/792814/253474) –

risposta

3

Rilevare SSD non è impossibile come dseifert lo rileva. Ci sono già alcuni progressi nella libata di Linux (http://linux.derkeiler.com/Mailing-Lists/Kernel/2009-04/msg03625.html), anche se non sembra ancora pronta per l'utente.

E ho sicuramente capito perché questo deve essere fatto. È fondamentalmente la differenza tra una lista collegata e una matrice. La deframmentazione e di solito è controproducente su un SSD.

0

I dispositivi SSD emulano un'interfaccia del dispositivo del disco rigido, quindi possono essere semplicemente utilizzati come dischi rigidi. Ciò significa anche che non esiste un modo generale per rilevare ciò che sono.

Probabilmente è possibile utilizzare alcune caratteristiche dell'unità (latenza, velocità, dimensioni), sebbene ciò non sia accurato per tutte le unità. Un'altra possibilità potrebbe essere quella di guardare al S.M.A.R.T. dati e vedere se è possibile determinare il tipo di disco attraverso questo (in base al nome del modello, determinati valori), tuttavia, a meno che non si tenga un database di tutte le unità là fuori, anche questo non sarà accurato al 100%.

+0

Sono d'accordo, penso che l'unico modo è capire come i produttori generano la chiave seriale per il loro SSD dispositivi rispetto a quelli HDD. Quindi creare un elenco di tutti i produttori e dei relativi modelli di stringhe SSD. Ho dovuto cercare alcuni numeri seriali di dispositivi per determinare se sono adatti alle mie esigenze (iPod per il mercato americano, router Linksys con Linux fw) – Mihaela

+0

Non è corretto affermare che la chiave seriale è l'unico modo possibile. Alcune unità riportano utilmente il loro RPM come 1 o 0 (http://linux.derkeiler.com/Mailing-Lists/Kernel/2009-04/msg02562.html) –

+1

Forse hai ragione, ma non ne sono sicuro. "Alcune unità" -> c'è il problema, devono essere tutte le unità, nessuna speculazione. – Mihaela

8

È possibile determinare in modo abbastanza semplice la latenza di rotazione: l'ho fatto una volta come parte di un progetto universitario. È descritto in this report. Ti consigliamo di saltare a pagina 7 dove vedi alcuni grafici della latenza. Passa da circa 9,3 ms a 1,1 ms - una caduta di 8,2 ms. Ciò corrisponde direttamente a 60 s/8.2 ms = 7317 RPM.

E 'stato fatto with simple C code - ecco la parte che misura le posizioni tra a e in un file zero. L'abbiamo fatto con valori sempre più grandi fino b 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; 
} 
+0

Non codice C! Jeff non sarà mai in grado di gestirlo! PS: prendi questo menzionato nel podcast e prendiamo da bere! – geoffc

+0

Hehe :-) Ho appena visto il tag "delphi" ... mi dispiace per quello :-) Mi fido di voi ragazzi per convertirlo in Pascal, non ho usato Delphi in molti anni. –

3

Si potrebbe ottenere fortunati eseguendo

smartctl -i sda 

da Smartmontools. Quasi tutti gli SSD hanno SSD nel campo Modello. Nessuna garanzia però.

+0

Intendi 'smartctl -i/dev/sda' – EarthMind

29

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

Verifica/sys/block/sdX/queue/rotational, dove sdX è il nome dell'unità. Se è 0, hai a che fare con un SSD, e 1 significa semplicemente vecchio HDD.

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

C'è anche un ioctl per verificare se l'unità è rotazionale da Linux 3.3, introdotto da this commit. L'uso di sysfs di solito è più comodo, comunque.

+0

Presente anche in RHEL 6.4. – Raedwald

+6

Ho provato questo e bugie 'rotazionali'. – Flimm

+3

@Flimm per favore [file un bug report del kernel] (https://bugzilla.kernel.org/) su questo. – Totor

0

I miei due centesimi per rispondere a questa domanda vecchia ma molto importante ... Se si accede a un disco tramite SCSI, sarà (potenzialmente) possibile utilizzare il comando SCSI INQUIRY per richiedere la sua velocità di rotazione.La pagina VPD (Vital Product Data) è denominata Block Device Characteristics e ha un numero 0xB1. Byte 4 e 5 di questa pagina contengono un numero di significato:

  • 0000h "velocità di rotazione medio non viene segnalato"
  • 0001h "medio non rotante (per esempio, stato solido)"
  • 0002H - 0400h "riservato"
  • 0401H - FFFEh "velocità di rotazione medio nominale in giri al minuto (cioè, rpm) (ad 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 può essere trovato here.

Tuttavia, lo stato di implementazione di questo standard non è chiaro per me.

0

Ho scritto il seguente codice javascript. Avevo bisogno di determinare se la macchina stava usando l'unità SSD e se si trattava di un'unità di avvio. La soluzione utilizza l'interfaccia WMI MSFT_PhysicalDisk.

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(); 
+2

Questa non è una risposta. – TomSlick

3

Questo comando lsblk -d -o name,rota liste i dischi 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