web-dev-qa-db-fra.com

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

Je me prépare à lancer un outil qui ne fonctionne que sur les disques durs ordinaires, pas sur les disques SSD (Solid State Drive). En fait, il ne devrait pas être utilisé avec les disques SSD car il en résulterait beaucoup de lectures/écritures sans réelle efficacité.

Tout le monde connaît un moyen de détecter si un lecteur donné est à l'état solide?

34
smartins

Détecter des disques SSD n’est pas aussi impossible que Dseifert l’affirme. Il y a déjà quelques progrès dans libata de Linux ( http://linux.derkeiler.com/Mailing-Lists/Kernel/2009-04/msg03625.html ), bien qu'il ne semble pas encore prêt pour l'utilisateur.

Et je comprends vraiment pourquoi cela doit être fait. C'est fondamentalement la différence entre une liste chaînée et un tableau. La défragmentation et ainsi de suite est généralement contre-productive sur un disque SSD.

3
Matthew Flaschen

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

Vérifiez/sys/block/sdX/queue/rotation, où sdX est le nom du lecteur. Si la valeur est 0, vous utilisez un disque SSD et 1 signifie un disque dur ancien.

Je ne peux pas mettre le doigt sur la version Linux où elle a été introduite, mais elle est présente dans Ubuntu Linux 3.2 et dans Vanilla Linux 3.6 et non dans Vanilla 2.6.38. Oracle a également backported it sur son noyau Unbreakable Enterprise 5.5, basé sur 2.6.32.

Il y a aussi un ioctl pour vérifier si le disque est en rotation depuis Linux 3.3, introduit par this commit . L'utilisation de sysfs est généralement plus pratique.

36
Shnatsel

En fait, vous pouvez assez facilement déterminer la latence de rotation - je l’ai fait une fois dans le cadre d’un projet universitaire. Il est décrit dans ce rapport . Vous voudrez vous rendre à la page 7 où vous verrez quelques beaux graphiques de la latence. Cela passe d'environ 9,3 ms à 1,1 ms - une chute de 8,2 ms. Cela correspond directement à 60 s / 8.2 ms = 7317 RPM.

Cela a été fait avec du code C simple - voici la partie qui mesure entre les positions aet b dans un fichier de travail. Nous avons fait cela avec des valeurs b de plus en plus grandes jusqu'à ce que nous ayons erré autour d'un cylindre:

/* Mesurer la différence de temps d’accès entre a et b. Le résultat
 * est mesurée en nanosecondes. */
 int measure_latency (off_t a, off_t b) {
 cycles_t ta, tb; 

 overflow_disk_buffer (); 

 lseek (fichier_travail, a, SEEK_SET); 
 read (fichier_travail, buf, KiB/2); 

 ta = get_cycles (); 
 lseek (fichier_travail, b, SEEK_SET); 
 read (fichier_travail, buf, KiB/2); 
 tb = get_cycles (); 

 int diff = (tb - ta)/cycles_per_ns; 
 fprintf (stderr, "% i KiB à% i KiB:% i nsec\n", a/KiB, b/KiB, diff); 
 return diff; 
} 
8
Martin Geisler

Cette commande lsblk -d -o name,rota liste vos disques et a un 1 chez ROTA s'il s'agit d'un disque en rotation et un 0 s'il s'agit d'un SSD .

 NOM ROTA 
 Sda 1 
 Sdb 0 
3
user3700673

Vous pourriez avoir de la chance en courant

smartctl -i sda

de Smartmontools . Presque tous les disques SSD ont un disque SSD dans le champ Modèle. Aucune garantie cependant.

3
Jonas Elfström

Mes deux cents pour répondre à cette question ancienne mais très importante ... Si un disque est accessible via SCSI, vous pourrez (potentiellement) utiliser la commande SCSI INQUIRY pour demander son taux de rotation. La page VPD (Vital Product Data) pour cela s'appelle Block Device Characteristics et porte le numéro 0xB1. Les octets 4 et 5 de cette page contiennent un nombre ayant une signification:

  • 0000h "Le taux de rotation moyen n'est pas signalé"
  • 0001h "Milieu non rotatif (par exemple, à l'état solide)"
  • 0002h - 0400h "Réservé"
  • 0401h - FFFEh "Vitesse de rotation nominale moyenne en tours par minute (c'est-à-dire, Tpm) (par exemple, 7 200 tpm = 1C20h, 10 000 tpm = 2710h et 15 000 tpm = 3A98h)"
  • FFFFh "Réservé"

Donc, SSD doit avoir 0001h dans ce champ. Le document T10.org concernant cette page peut être trouvé ici .

Cependant, l'état de mise en œuvre de cette norme n'est pas clair pour moi. 

0
HEKTO

J'ai écrit le code javascript suivant. Je devais déterminer si la machine utilisait un lecteur SSD et si c'était un lecteur d'amorçage. La solution utilise l'interface 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();
0
IrocD

Les périphériques SSD émulent une interface de disque dur, ils ne peuvent donc être utilisés que comme des disques durs. Cela signifie également qu'il n'y a pas de moyen général de détecter ce qu'ils sont.

Vous pouvez probablement utiliser certaines caractéristiques du lecteur (latence, vitesse, taille), bien que cela ne soit pas précis pour tous les lecteurs. Une autre possibilité consiste à examiner les données S.M.A.R.T. pour voir si vous pouvez déterminer le type de disque utilisé (par nom de modèle, certaines valeurs). Toutefois, à moins de conserver une base de données de tous les lecteurs, ce n'est pas le cas. ça va être 100% exact non plus.

0
dseifert