Carte mémoire Sony CompactFlash 8 Go – Certifiée 300x

Un sacré moment que je l’attendais cette carte, entre pénurie sur l’ancien modèle et délai de livraison d’une semaine … enfin, elle est arrivé et mon pc silencieux va pouvoir prendre forme !
J’ai ainsi opté pour un disque dur de type SSD du pauvre, à  savoir une carte compact flash …. enfin, du pauvre, 8G pour 190€ ça m’a quand même ramené quelques années en arrière coté tarif. Hors mis ce point, pas de regret, il n’y a pas plus silencieux ni moins gourmand en énergie. La bête est estampillée x300, il faudra comprendre que le débit est de 300 * 150Kb/s soit 45Mb si l’on fait ce calcul, mais seulement 40 selon le constructeur … allez comprendre ! Ça, c’est pour la fiche technique du vendeur. Pour la photo, voyez ci-dessous … mais ça n’a rien de bien hors du commun !

A noter que sur eBay, j’ai trouvé des carte de 8Go autour de 30€, mais aucune informations sur le débit n’était indiqué ; dommage, car ça aurait pu être un très bon plan.

Coté installation dans la machine, aucun soucis, la détection par mon Linux s’est très bien passé, y compris avec un noyau de plus d’un an, j’ai un petit pincement au coeur depuis qu’un collègue m’a dit avoir eu des soucis de compatibilité entre Linux et des compactFlash, mais là , nickel. J’ai donc pu procéder à  quelques tests, rapides, pour voir la performance.
Les 40Mo/s y sont presque puisqu’en pic, la carte atteint 39Mo/s, (mesuré avec un hdparm -t) Le niveau d’un disque dur standard est donc atteint ce qui présente un point très positif dans le cadre d’un remplacement où l’on ne souhaite pas forcement régresser en performance, lorsque l’on vise à  gagner en silence. Là  où le composant se distingue vraiment du lot, c’est en temps d’accès ! L’outil seeker révèle un temps moyen de 0,56ms … à  coté des 15ms d’un disque classique, c’est 30 fois plus rapide !! impressionnant ! et par rapport à  un modèle de compact Flash plus ancien, c’est encore pas loin de 3 fois mieux. Bref, là  dessus, il me semble difficile de faire beaucoup mieux. Du coup, la performance lors d’accès classiques à  des fichiers (et pas en vitesse maxi comme testé avec hdparm -t) est bien meilleur que celle d’un disque classique. Seeker donne un résultat de l’ordre de 8.1Mo/s, loin devant les quelques 500Ko/s d’un disque classique.
En bref, pour la perf, il n’y a rien à  redire à  cette carte. Je me souciai de l’aspect marketing de la chose, on vous annonce x300, vous obtenez bien vos 40Mo ou pas loin avec hdparm et vous tomberiez dans les 100Ko/s lors d’un utilisation normale… et bien NON, ca fonctionne ! 8.1 Mo/s dans les pires conditions… c’est top !
Maintenant, que dire vraiment des x300 … voyons … si l’on considère ma vielle carte 40Mo qui sortait 1.8Mo/s en burst par rapport à  celle-ci, on peut dire que la carte 8G est 21 fois plus rapide alors que sur un accès aléatoire, le gain n’est que de 3.24, mais bon .. franchement … je suis vraiment satisfait

Il ne reste donc qu’une seule inconnue … combien de temps va-t-elle tenir ? La durée de vie d’une compact flash est vraiment moindre de celle d’un disque magnétique classique, les écritures multiples finissent par détruire la carte (le retour des bon vieux secteur défectueux…). C’est particulièrement le cas lorsque le swap d’un Unix est utilisé, j’ai donc choisi une configuration avec pas mal de mémoire RAM pour limiter l’usage du cache ; de même mettre /tmp dans un ram disque pourrait aider à  préserver la flash. Enfin, le /home est particulièrement accédé lui aussi, pour ma part, il est sur un disque réseau, donc pour ce point c’est réglé. A ce sujet, voir un article complémentaire ici.

Autre petit soucis à  corriger avec cette carte, ou plutôt avec les derniers noyau Linux, 2.6.23 et 2.6.24 qui visiblement ne détectent pas correctement la carte et qui par conséquent limite son utilisation à  du simple DMA impliquant des perf pourries (14M au lieu de 40M)… Heureusement, par hasard j’ai trouvé ici (merci whirleyes) la solution. Je vous résume cela en gros :

1. editer le fichier du noyau …/drivers/ata/libata-core.c

2. ajouter vers la ligne 113, après MODULE_PARM_DESC(noacpi,… les lignes suivantes :
int libata_force_cbl = 80;
module_param_named(force_cbl, libata_force_cbl, int, 0644);
MODULE_PARM_DESC(force_cbl, “force PATA cable type (0=keep, 40=40c, 80=80c)”);

Ces lignes permettent d’ajouter un paramètre qui pourra être passé au noyau pour forcer ou non la détection complète de la carte. Ici, le fait de mettre ”libata_force_cbl à  80 force la détection en 80c, il est possible de mettre 40 ou 0 pour une détection automatique 40/80 dans ce cas (solution initiale)

3. Ensuite, vers la ligne 4063, on trouve if (xfer_mask & (0xF8 << ATA_SHIFT_UDMA)) { … tout le bloc if va etre remplacé de :

if (xfer_mask & (0xF8 << ATA_SHIFT_UDMA))
// UDMA/44 or higher would be available
if((ap->cbl == ATA_CBL_PATA40) ||
(ata_drive_40wire(dev->id) &&
(ap->cbl == ATA_CBL_PATA_UNK ||
ap->cbl == ATA_CBL_PATA80))) {
ata_dev_printk(dev, KERN_WARNING,
“limited to UDMA/33 due to 40-wire cable\n”);
xfer_mask &= ~(0xF8 << ATA_SHIFT_UDMA);
}

à

if (xfer_mask & (0xF8 << ATA_SHIFT_UDMA)) {
switch (libata_force_cbl) {
case 40:
/* limit to UDMA/33 */
ata_dev_printk(dev, KERN_INFO, “forcing 40c\n”);
xfer_mask &= ~(0xF8 << ATA_SHIFT_UDMA);
break;
case 80:
/* ignore cable checks */
ata_dev_printk(dev, KERN_INFO, “forcing 80c\n”);
break;
default:
/* UDMA/44 or higher would be available */
if ((ap->cbl == ATA_CBL_PATA40) ||
(ata_drive_40wire(dev->id) &&
(ap->cbl == ATA_CBL_PATA_UNK ||
ap->cbl == ATA_CBL_PATA80))) {
ata_dev_printk(dev, KERN_WARNING,
“limited to UDMA/33 due to 40-wire cable\n”);
xfer_mask &= ~(0xF8 << ATA_SHIFT_UDMA);
}
}
}

4. Il faut ensuite modifier le fichier drivers/ata/libata-eh.c comme suit :
remplacer

(ehc->i.flags & ATA_EHI_DID_RESET))

par

(ehc->i.flags & ATA_EHI_DID_RESET)) { ap->cbl = ap->ops->cable_detect(ap); if (!(ap->flags & ATA_FLAG_SATA) && libata_force_cbl) { switch (libata_force_cbl) { case 40: ata_port_printk(ap, KERN_INFO, “forcing 40c\n”); ap->cbl = ATA_CBL_PATA40; break; case 80: ata_port_printk(ap, KERN_INFO, “forcing 80c\n”); ap->cbl = ATA_CBL_PATA80; break; default: ata_port_printk(ap, KERN_WARNING, “invalid force_cbl value %d\n”, libata_force_cbl); } } }

5. Puis editer libata.h
et après extern int libata_noacpi; ajouter extern int libata_force_cbl;

Il reste enfin à  recompiler, installer le nouveau noyau, nouveau module et reinstaller ce noyau puis rebooter … Le résultat est consultable après le boot en tapant la commande dmesg et en lançant un hdparl -t /dev/sda par exemple qui devrait vous ravir !

Commentaire de Ulhume

Une solution pour augmenter la durée de vie de votre carte flash est celle que l’on utilise pour le Zaurus, à  savoir utiliser un RAMDISK pour les dossiers /var et /tmp, en gros les seuls endroits où les données bougent beaucoup.

Une autre idée, est d’utiliser JFFS2, qui est un filesystem journalisé optimisé pour les flashs, et qui a un algorithme  spécial pour “randomiser” les écritures.

En espérant que cela puisse aider à  faire vivre plus vieille votre carte 🙂

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.