it-swarm.com.de

Gibt es eine Möglichkeit, festzustellen, ob es sich bei einem Laufwerk um eine SSD handelt?

Ich bereite mich darauf vor, ein Tool zu veröffentlichen, das nur mit normalen Festplatten funktioniert, nicht mit SSD (Solid State Drive). Tatsächlich sollte es nicht mit SSDs verwendet werden, da dies zu vielen Lese-/Schreibvorgängen ohne wirkliche Effektivität führt.

Kennt jemand eine Möglichkeit, festzustellen, ob ein bestimmtes Laufwerk im Solid-State-Modus ist?

34
smartins

Das Erkennen von SSDs ist nicht so unmöglich, wie es Dseifert herausstellt. In der libata von linux ( http://linux.derkeiler.com/Mailing-Lists/Kernel/2009-04/msg03625.html ) sind bereits einige Fortschritte zu verzeichnen, obwohl dies noch nicht für den Benutzer geeignet erscheint.

Und ich verstehe definitiv, warum dies getan werden muss. Es ist im Grunde der Unterschied zwischen einer verknüpften Liste und einem Array. Defragmentierung und dergleichen sind auf SSDs normalerweise kontraproduktiv.

3

Endlich eine zuverlässige Lösung! Zwei davon eigentlich!

Überprüfen Sie/sys/block/sdX/queue/rotation, wobei sdX der Laufwerkname ist. Wenn es 0 ist, haben Sie es mit einer SSD zu tun, und 1 steht für eine alte Festplatte.

Ich kann mich nicht auf die Linux-Version beziehen, in der sie eingeführt wurde, aber sie ist in Ubuntu Linux 3.2 und Vanilla Linux 3.6 und nicht in Vanilla 2.6.38 vorhanden. Oracle auch backported es zu ihrem Unbreakable Enterprise-Kernel 5.5, der auf 2.6.32 basiert.

Es gibt auch ein Ioctl, mit dem überprüft werden kann, ob sich das Laufwerk seit Linux 3.3, das durch this commit eingeführt wurde, dreht. Die Verwendung von sysfs ist jedoch in der Regel bequemer.

36
Shnatsel

Die Rotationslatenz kann man ziemlich leicht bestimmen - das habe ich einmal im Rahmen eines Universitätsprojekts gemacht. Es ist in diesem Bericht beschrieben. Sie sollten auf Seite 7 weitergehen, wo Sie einige Nice-Diagramme der Latenz sehen. Sie geht von etwa 9,3 ms auf 1,1 ms - ein Abfall von 8,2 ms. Das entspricht direkt 60 s / 8.2 ms = 7317 RPM.

Es wurde mit einfachem C-Code - hier ist der Teil, der die Zwischenpositionen aund b in einer Scratch-Datei misst. Wir haben dies mit größeren und größeren b-Werten gemacht, bis wir einen ganzen Zylinder herumgewandert sind:

/* Messen Sie die Differenz der Zugriffszeit zwischen a und b. Das Ergebnis 
 * Wird in Nanosekunden gemessen. */
 int measure_latency (off_ta, off_tb) {
 Zyklen_t ta, tb; 
 
 overflow_disk_puffer (); 
 
 lseek (work_file, a, SEEK_SET); 
 read (work_file, buf, KiB/2); 
 
 ta = get_cycles (); 
 lseek (work_file , b, SEEK_SET); 
 read (Arbeitsdatei, Buf, KiB/2); 
 tb = get_cycles (); 
 
 int diff = (tb - ta )/cycle_per_ns; 
 fprintf (stderr, "% i KiB bis% i KiB:% i nsec\n", a/KiB, b/KiB, diff); 
 return diff; 
} 
8
Martin Geisler

Dieser Befehl lsblk -d -o name,rota listet Ihre Laufwerke auf und hat eine 1 bei ROTA, wenn es sich um eine Rotationsdiskette handelt, und eine 0, wenn es sich um eine SSD handelt. Beispielausgabe:

 NAME ROTA 
 Sda 1 
 Sdb 0 
3
user3700673

Sie könnten Glück haben, wenn Sie laufen

smartctl -i sda

von Smartmontools . Fast alle SSDs haben SSD im Feld Model. Keine Garantie.

3
Jonas Elfström

Meine zwei Cents zur Beantwortung dieser alten, aber sehr wichtigen Frage ... Wenn auf eine Festplatte über SCSI zugegriffen wird, können Sie (möglicherweise) den SCSI-Befehl INQUIRY verwenden, um die Rotationsrate anzufordern. Die VPD (Vital Product Data) -Seite dafür heißt Block Device Characteristics und hat eine Nummer 0xB1. Die Bytes 4 und 5 dieser Seite enthalten eine Zahl mit der Bedeutung:

  • 0000h "Mittlere Rotationsrate wird nicht gemeldet"
  • 0001h "Nichtrotierendes Medium (z. B. fester Zustand)"
  • 0002h - 0400h "Reserviert"
  • 0401h - FFFEh Nominale Medium-Umdrehungsrate in Umdrehungen pro Minute (d. H. U/min.) (Z. B. 7.200 U/min = 1C20h, 10.000 U/min = 2710h und 15.000 U/min = 3A98h)
  • FFFFh "Reserviert"

SSD muss also 0001h in diesem Feld haben. Das T10.org-Dokument zu dieser Seite finden Sie hier .

Der Implementierungsstatus dieses Standards ist mir jedoch nicht klar. 

0
HEKTO

Ich habe den folgenden Javascript-Code geschrieben. Ich musste feststellen, ob der Computer ein SSD-Laufwerk verwendet und ob es sich um ein Startlaufwerk handelt. Die Lösung verwendet die WMI-Schnittstelle 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();
0
IrocD

SSD-Geräte emulieren eine Festplattengeräteschnittstelle, sodass sie wie Festplatten verwendet werden können. Dies bedeutet auch, dass es keine generelle Möglichkeit gibt, herauszufinden, was sie sind.

Sie könnten wahrscheinlich einige Eigenschaften des Laufwerks (Latenzzeit, Geschwindigkeit, Größe) verwenden, obwohl dies nicht für alle Laufwerke genau ist. Eine andere Möglichkeit könnte darin bestehen, die S.M.A.R.T. -Daten zu überprüfen und festzustellen, ob Sie den Datenträgertyp hierüber bestimmen können (anhand des Modellnamens, bestimmter Werte). Sofern Sie jedoch keine Datenbank aller Laufwerke haben, ist dies der Fall ist auch nicht 100% ig genau.

0
dseifert