2009-05-25 9 views
32

Me estoy preparando para lanzar una herramienta que solo es efectiva con discos duros comunes, no SSD (unidad de estado sólido). De hecho, no debe usarse con SSD porque dará como resultado una gran cantidad de lecturas/escrituras sin efectividad real.¿Hay alguna manera de detectar si una unidad es una SSD?

¿Alguien sabe de una forma de detectar si una unidad determinada es de estado sólido?

+0

Esta pregunta tiene [una respuesta en Unix y Linux] (http://unix.stackexchange.com/questions/65595/how-to-know-if-a-disk-is- an-ssd-or-an-hdd/65602 # 65602). – Totor

+0

[¿Cómo comprobar si mi Ubuntu se coloca en SSD?] (Http://askubuntu.com/q/792814/253474) –

Respuesta

3

La detección de unidades SSD no es tan imposible como lo hace Dseifert. Ya hay algún progreso en la libata de linux (http://linux.derkeiler.com/Mailing-Lists/Kernel/2009-04/msg03625.html), aunque todavía no parece estar listo para el usuario.

Y definitivamente entiendo por qué esto debe hacerse. Básicamente es la diferencia entre una lista vinculada y una matriz. La desfragmentación y tal suele ser contraproducente en una SSD.

0

Los dispositivos SSD emulan una interfaz de dispositivo de disco duro, por lo que solo se pueden usar como discos duros. Esto también significa que no hay una forma general de detectar lo que son.

Probablemente pueda utilizar algunas características del disco (latencia, velocidad, tamaño), aunque esto no será preciso para todas las unidades. Otra posibilidad puede ser mirar el S.M.A.R.T. datos y ver si puede determinar el tipo de disco a través de esto (por nombre de modelo, ciertos valores); sin embargo, a menos que mantenga una base de datos de todas las unidades, tampoco será 100% exacto.

+0

Estoy de acuerdo, creo que la única forma es averiguar cómo los fabricantes generan la clave de serie para su SSD dispositivos a diferencia de los HDD. Luego crea una lista de todos los fabricantes y sus patrones de cadena SSD. Solía ​​tener que buscar algunos números de serie de dispositivos para determinar si son adecuados para mis necesidades (iPods para el mercado estadounidense, enrutadores Linksys con Linux fw) – Mihaela

+0

No es correcto decir que la clave de serie es la única forma posible. Algunas unidades informan útilmente su RPM como 1 o 0 (http://linux.derkeiler.com/Mailing-Lists/Kernel/2009-04/msg02562.html) –

+1

Quizás tenga razón, pero no estoy seguro. "Algunas unidades" -> existe el problema, tiene que ser todas las unidades, no hay especulaciones. – Mihaela

8

De hecho, puede determinar con bastante facilidad la latencia rotacional: lo hice una vez como parte de un proyecto universitario. Se describe en this report. Deberá pasar a la página 7, donde verá algunos buenos gráficos de la latencia. Va de aproximadamente 9.3 ms a 1.1 ms - una caída de 8.2 ms. Eso corresponde directamente al 60 s/8.2 ms = 7317 RPM.

Se hizo with simple C code - aquí está la parte que mide la posición entre las posiciones a y b en un archivo reutilizable. Hicimos esto con más y más grandes b valores hasta que se nos ha extraviado todo el camino alrededor de 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

¡Código no C! ¡Jeff nunca podrá manejar eso! PD: ¡Menciona esto en el podcast y podremos beber! – geoffc

+0

Hehe :-) Acabo de ver la etiqueta "delphi" ... lo siento :-) Confío en que chicos chicos para convertirlo en Pascal, no he usado Delphi en muchos años. –

3

Usted podría tener suerte ejecutando

smartctl -i sda 

de Smartmontools. Casi todas las SSD tienen SSD en el campo Modelo. Sin embargo, ninguna garantía.

+0

Quiere decir 'smartctl -i/dev/sda' – EarthMind

29

¡Finalmente una solución confiable! ¡Dos de ellos, en realidad!

Compruebe/sys/block/sdX/cola/rotación, donde sdX es el nombre de la unidad. Si es 0, está lidiando con una SSD, y 1 significa una HDD simple.

No puedo poner mi dedo en la versión de Linux donde se introdujo, pero está presente en Linux 3.2 de Ubuntu y en Linux 3.6 de vanilla y no está presente en 2.6.38 de vanilla. Oracle también lo backported en su kernel Unbreakable Enterprise 5.5, que se basa en 2.6.32.

También hay un ioctl para comprobar si el disco es rotativo desde Linux 3.3, introducido por this commit. Sin embargo, usar sysfs suele ser más conveniente.

+0

También presente en RHEL 6.4. – Raedwald

+6

Intenté esto y mentiras 'rotatorias'. – Flimm

+3

@Flimm por favor [presente un informe de error del kernel] (https://bugzilla.kernel.org/) sobre esto. – Totor

0

Mis dos centavos para responder esta pregunta antigua pero muy importante ... Si se accede a un disco a través de SCSI, entonces (potencialmente) podrá usar el comando SCSI INQUIRY para solicitar su velocidad de rotación.La página VPD (datos de productos vitales) se llama Block Device Characteristics y tiene un número 0xB1. Bytes 4 y 5 de esta página contienen un número con significado:

  • 0000h "velocidad de rotación medio no se informó"
  • 0001h "medio no giratorio (por ejemplo, estado sólido)"
  • 0002h - 0400h "reservado"
  • 0401H - FFFEh "velocidad de rotación medio nominal en rotaciones por minuto (es decir, rpm) (por ejemplo, 7 200 rpm = 1C20h, 10 000 rpm = 2710h, y 15 000 rpm = 3A98h)"
  • FFFFh "Reservado"

Por lo tanto, SSD debe tener 0001h en este campo. El documento T10.org sobre esta página se puede encontrar here.

Sin embargo, el estado de implementación de este estándar no es claro para mí.

0

Escribí el siguiente código de javascript. Necesitaba determinar si la máquina usaba la unidad SSD y si era una unidad de arranque. La solución usa la interfaz WMI de 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

Esto no es una respuesta. – TomSlick

3

Este comando lsblk -d -o name,rota listas de las unidades y tiene un 1 en ROTA si se trata de un disco de rotación y un 0 si se trata de un SSD. Ejemplo de salida :

 
NAME ROTA 
sda  1 
sdb  0 
Cuestiones relacionadas