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?
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.
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.
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 a
et 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; }
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
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.
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:
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.
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();
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.