Y a-t-il un moyen de détecter si un lecteur est un SSD?

je me prépare à libérer un outil qui n'est efficace qu'avec des disques durs réguliers, PAS SSD (solid state drive). En fait, il ne devrait pas être utilisé avec les SSD parce qu'il en résultera beaucoup de lire/écrire sans réelle efficacité.

quelqu'un connaît un moyen de détecter si un lecteur est à l'état solide?

34
demandé sur HEKTO 2009-05-26 01:59:06

8 réponses

la détection des SSD n'est pas aussi impossible que celle de dseifert. Il y a déjà quelques progrès dans la libata de linux (http://linux.derkeiler.com/Mailing-Lists/Kernel/2009-04/msg03625.html), bien qu'il ne semble pas encore prêt à être utilisé.

Et j'ai vraiment comprendre le pourquoi de ce qui doit être fait. C'est essentiellement la différence entre une liste liée et un tableau. La défragmentation et telle est habituellement contre-productive sur un SSD.

3
répondu Matthew Flaschen 2013-06-02 04:42:38

Enfin une solution fiable! Deux d'entre eux, en fait!

Cocher /sys/block/sdX/file/rotation, où sdX est le nom du lecteur. Si c'est 0, Vous avez affaire à un SSD, et 1 signifie vieux HDD.

Je ne peux pas mettre le doigt sur la version Linux où il a été introduit, mais il est présent dans Linux 3.2 D'Ubuntu et dans Linux à la vanille 3.6 et pas présent dans la vanille 2.6.38. Oracle aussi pris à leur Incassable Noyau d'entreprise 5.5, qui est basé sur 2.6.32.

il y a aussi un ioctl pour vérifier si le lecteur est rotatif depuis Linux 3.3, introduit par ce commit. Utiliser sysfs est généralement plus pratique, cependant.

34
répondu Shnatsel 2012-10-19 18:04:58

vous pouvez en fait déterminer assez facilement la latence de rotation -- Je l'ai fait une fois dans le cadre d'un projet universitaire. Elle est décrite dans rapport. Vous voulez passer à la page 7 où vous voyez de beaux graphiques de la latence. Il passe d'environ 9,3 ms à 1,1 ms , soit une baisse de 8,2 ms. Cela correspond directement à 60 s / 8.2 ms = 7317 RPM.

C'est fait avec le code C simple -- voici la partie que les mesures de la entre les positions aet b dans un fichier de travail. Nous avons fait cela avec de plus en plus grande b valeurs jusqu'à ce que nous ayons été égarés tout autour d'un cylindre:

/* 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;
}
8
répondu Martin Geisler 2009-05-25 22:41:24

Vous pourriez avoir de la chance en exécutant

smartctl -i sda

Smartmontools. Presque tous les SSD ont un SSD dans le champ Model. Aucune garantie.

3
répondu Jonas Elfström 2009-05-25 22:22:14

Cette commande lsblk -d -o name,rota Liste vos lecteurs et a un 1 à ROTA si c'est un disque rotatif et un 0 si c'est un SSD. Exemple de sortie :

NAME ROTA
sda     1
sdb     0
3
répondu user3700673 2016-09-07 11:51:15

les périphériques SSD émulent une interface de périphérique de disque dur, de sorte qu'ils peuvent être utilisés comme des disques durs. Cela signifie également qu'il n'existe aucun moyen général de les détecter.

vous pourriez probablement utiliser certaines caractéristiques du lecteur (latence, vitesse, taille), bien que ce ne sera pas précis pour tous les lecteurs. Une autre possibilité pourrait être de regarder les données S. M. A. R. T. et voir si vous pouvez déterminer le type de disque à travers ceci( par nom de modèle, certaines valeurs), cependant à moins que vous ne gardiez un la base de données de tous les disques durs là-bas, ce ne sera pas 100% précis non plus.

0
répondu dseifert 2009-05-26 06:48:34

Mes deux cents pour répondre à cette vieille mais très importante question... Si un disque est accédé via SCSI, alors vous pourrez (potentiellement) utiliser la commande D'enquête SCSI pour demander sa vitesse de rotation. La page VPD (Vital Product Data) pour cela s'appelle Block Device Characteristics et a un nombre 0xB1. Les octets 4 et 5 de cette page contiennent un nombre avec une signification:

  • 0000h "le taux de rotation moyen n'est pas indiqué"
  • 0001h "milieu non rotatif (p.ex. solide de l'état)"
  • 0002h - 0400h "réservé"
  • 0401h-FFFEh "taux de rotation moyen Nominal en rotations par minute (i.e., rpm) (par exemple, 7 200 rpm = 1c20h, 10 000 rpm = 2710h, et 15 000 rpm = 3A98h)"
  • FFFFh "Réservé"

Donc, SSD doit avoir 0001h dans ce domaine. T10.org document sur cette page peuvent être trouvés ici.

cependant, l'état de mise en oeuvre de cette norme n'est pas clair pour moi.

0
répondu HEKTO 2014-07-24 15:56:24

j'ai écrit le code javascript suivant. Je devais déterminer si la machine était ussing SSD drive et si c'était boot drive. La solution utilise L'interface 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();
0
répondu IrocD 2017-05-28 15:10:30