disk - util - ssd recomendaciones
¿Hay alguna manera de detectar si una unidad es una SSD? (8)
De hecho, puede determinar con bastante facilidad la latencia rotacional: lo hice una vez como parte de un proyecto universitario. Se describe en este informe . 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 a 60 s / 8.2 ms = 7317 RPM
.
Fue hecho con código C simple - aquí está la parte que mide las posiciones entre b
en un archivo borrador. Hicimos esto con valores de b
más grandes y más grandes hasta que hemos recorrido 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; }
Me estoy preparando para lanzar una herramienta que solo es efectiva con discos duros regulares, 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.
¿Alguien sabe de una forma de detectar si un disco dado es de estado sólido?
Detectar 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 que esté 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.
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();
Este comando lsblk -d -o name,rota
enumera tus unidades y tiene un 1 en ROTA si es un disco rotacional y un 0 si es un disco SSD. Ejemplo de salida:
NAME ROTA sda 1 sdb 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 usar algunas características de la unidad (latencia, velocidad, tamaño), aunque esto no será preciso para todas las unidades. Otra posibilidad puede ser mirar los datos SMART 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, esto no será 100% exacto tampoco.
Mis dos centavos para responder a esta vieja pero muy importante pregunta ... Si se accede a un disco a través de SCSI, entonces (potencialmente) podrá usar el comando SCSI INQUIRY para solicitar su tasa de rotación. La página VPD (Datos del producto vital) se llama Block Device Characteristics
y tiene un número 0xB1
. Los bytes 4 y 5 de esta página contienen un número con significado:
- 0000h "Tasa de rotación media no se informa"
- 0001h "Medio no giratorio (p. Ej., Estado sólido)"
- 0002h - 0400h "Reservado"
- 0401h - FFFEh "Tasa nominal de rotación del medio en rotaciones por minuto (es decir, rpm) (p. Ej., 7 200 rpm = 1C20h, 10 000 rpm = 2710h, y 15 000 rpm = 3A98h)"
- FFFFh "Reservado"
Entonces, 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í.
Podrías tener suerte corriendo
smartctl -i sda
de Smartmontools . Casi todas las SSD tienen SSD en el campo Modelo. Sin embargo, ninguna garantía.
¡Finalmente una solución confiable! Dos de ellos, en realidad!
Compruebe / sys / block / sdX / queue / rotational, 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 presentó, 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 a su kernel 5.5 de Unbreakable Enterprise, que se basa en 2.6.32.
También hay un ioctl para verificar si el disco está girando desde Linux 3.3, introducido por este compromiso . Sin embargo, usar sysfs suele ser más conveniente.