Speed your life, Linux & SSD

Je viens de monter un SSD à la place de mon ancien disque classique sur mon macbook vieux de 3 ans. Voici un bref retour d’expérience.

Afin d’avoir quelques chiffres, avant d’installer le SSD, j’ai installé bonnie++ qui est un logiciel de benchmark de disque.

Pour le lancer, voici une commande permettant de prendre en compte facilement la quantité de RAM disponible sur votre PC  ( je ne sais plus trop d’où elle vient, merci à son auteur en tout cas 😉

sudo bonnie++ -n 0 -u 0 -r `free -m | grep 'Mem:' | awk '{print $2}'` -s $(echo "scale=0;`free -m | grep 'Mem:' | awk '{print $2}'`*2" | bc -l) -f -b -d /home

Cette commande nous donne un résultat brut assez peu lisible.

Using uid:0, gid:0.
Writing intelligently...done
Rewriting...done
Reading intelligently...done
start 'em...done...done...done...
Version 1.03e       ------Sequential Output------ --Sequential Input- --Random-
                    -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Machine        Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP  /sec %CP
EquinoxeFR    7366M           40652   5 18250   2           61482   4  70.7   0
EquinoxeFR,7366M,,,40652,5,18250,2,,,61482,4,70.7,0,,,,,,,,,,,,,

Heureusement, bonnie++ est fourni avec des scripts permettant de mettre en forme les données.

echo "EquinoxeFR,7366M,,,40652,5,18250,2,,,61482,4,70.7,0,,,,,,,,,,,,," |  bon_csv2html > bonnie_results.html

Ce qui nous donne un tableau HTML de ce type.

Maintenant que nous avons les chiffres de notre disque classique, nous pouvons installer le SSD. Afin de faciliter la migration des données, j’ai monté le SSD dans le portable et placé l’ancien DD dans un boitier USB. La copie des partitions existantes a été faite à l’aide de Clonezilla lancé depuis le LiveCD « parted magic« .

Voilà, les données sont copiés, nous redémarrons la machine en à peine 10 sec !!! ( de grub à l’invite de login GDM )

Visiblement le gain de performance est bien là et le silence est absolu, pas une pièce en mouvement, quel plaisir.

Afin d’améliorer encore l’utilisation du SSD, voici quelques optimisations:

Tout d’abord, changeons le « I/O Scheduler » qui est contre productif en mode « cfq » avec un disque SSD. Dans /boot/grub/menu.lst, il faut placer elevator=deadline dans les paramètres du kernel.

# (0) Arch Linux
title  Arch Linux
root   (hd0,0)
kernel /boot/vmlinuz-linux root=/dev/sda1 elevator=deadline ro quiet vga=773
initrd /boot/initramfs-linux.img

Ce qui après un redémarrage nous donne

[pierre@EquinoxeFR ~]$ cat /sys/block/sda/queue/scheduler
noop [deadline] cfq
[pierre@EquinoxeFR ~]$

Ensuite, réglons quelques paramètres pour le montage de nos partitions:

[pierre@EquinoxeFR ~]$ cat /etc/fstab
#
# /etc/fstab: static file system information
#
#
devpts /dev/pts devpts defaults 0 0
shm /dev/shm tmpfs nodev,nosuid 0 0
/dev/sda1 / ext4 noatime,discard,data=writeback,errors=remount-ro 0 1
/dev/sda2 swap swap defaults 0 0
/dev/sda3 /home ext4 noatime,discard,data=writeback,errors=remount-ro 0 1
  • noatime: désactive la mise à jour de l’heure d’accès aux fichiers. Ca n’a que peu d’intérêt et ça use le SSD inutilement.
  • discard: active le TRIM pour préserver au maximum la durée de vie du SSD
  •  data=writeback: journalise uniquement les métadatas avec EXT4. Attention il faut faire un tune2fs -o journal_data_writeback /dev/sda1 depuis un CD bootable sur la partition root sous peine de ne pas pouvoir redémarrer…

 

Voilà, après ces quelques optimisations, nous avons un système très réactif ( le jour et la nuit 🙂 même si je suis un peu étonné que les chiffres ne soit pas plus parlants. J’ai un SSD SATA III alors que mon portable ne supporte que le SATA II mais qui peut le plus, peut le moins… Ceci dit, j’ai quand même l’impression d’avoir des résultats en dessous de ce que l’on peut trouver sur le net. Peut-être que ça vient du contrôleur du macbook… sur OSX, beaucoup ont des problèmes de « link speed » sur le bus SATA avec de nombreux SSD.

 

Update 5/02:

Les résultats avec le scheduleur sur noop

nouveaux résultats avec AHCI Mode = SATA

J’ai mis à jour ArchWiki pour l’activition du mode SATA sur un macbook 5.1

Archlinux: J’ai cassé mon kernel !

A la suite d’une fausse manip lors d’une mise à jour, mon PC ne démarre plus avec archlinux. Après expertise, il s’avère que l’installation du paquet de mise à jour du noyau n’est pas allée à son terme. Le noyau ( Vmlinuz ) est à jour mais le initrd lui est trop ancien.

Pour s’en sortir, rien de très compliqué:

Démarrer l’installable d’Archlinux sur un CD ou une clef USB.

Réglez votre clavier correctement avec la commande km, c’est plus facile ensuite 😉

Montez votre partition root

mkdir /recup
mount /dev/sda1 /recup

Mettez à jour le mtab de la partition root

grep -v rootfs /proc/mounts > /recup/etc/mtab

Montez ensuite les filesystem spéciaux

mount -o bind /proc /recup/proc
mount -o bind /dev /recup/dev
mount -o bind /sys /recup/sys

Un petit chroot

chroot /recup
mount -a

Vous pouvez retrouver les derniers paquets installés dans /var/cache/pacman/pkg/ et en réinstaller un avec pacman -U XXX.pkg.tar.gz, pour moi se sera linux-3.1.7-1-x86_64.pkg.tar.xz

Bingo ! Un redémarrage plus tard, tout refonctionne. J’ai trouvé après coup une doc similaire ici http://wiki.archlinux.fr/Install_chroot

Compilation de RPM et erreur « *** ERROR: No build ID note found »

Si vous avez des erreurs « *** ERROR: No build ID note found » lors de la construction de paquets RPM ( J’utilise ici une Centos 6.2 x64 ) ça vient du script find-debuginfo.sh

+ /usr/bin/install -d /home/build/rpm/BUILDROOT/vmware-vsphere-sdk-4.0.0.161974-2.el6.x86_64/usr/local/vmware-sdk-install
+ /bin/cp -R ./FILES ./Makefile.PL ./apps ./bin ./doc ./etc ./installer ./lib ./man ./resources ./vmware-install.pl ./yes /home/build/rpm/BUILDROOT/vmware-vsphere-sdk-4.0.0.161974-2.el6.x86_64/usr/local/vmware-sdk-install
+ /usr/lib/rpm/find-debuginfo.sh --strict-build-id /home/build/rpm/BUILD/vmware-vsphere-sdk-4.0.0.161974
*** ERROR: No build ID note found in /home/build/rpm/BUILDROOT/vmware-vsphere-sdk-4.0.0.161974-2.el6.x86_64/usr/local/vmware-sdk-install/lib/XML-LibXML-1.63/lib/auto/XML/LibXML/LibXML.so
erreur: Mauvais status de sortie pour /home/build/rpm/tmp/rpm-tmp.3M3FWw (%install)
    Mauvais status de sortie pour /home/build/rpm/tmp/rpm-tmp.3M3FWw (%install)
Exécution_de(%prep): /bin/sh -e /home/build/rpm/tmp/rpm-tmp.ilG9fL

Vous pouvez passer outre en ajoutant la directive

%undefine _missing_build_ids_terminate_build

au début de votre fichier SPEC. Voici un extrait de mon fichier:

%undefine _missing_build_ids_terminate_build
Name:           vmware-vsphere-sdk
Version:        4.0.0.161974
Release:        2%{?dist}
Summary:       Vmware SDK for Perl

L’erreur précédente devient qu’un simple Warning sans incidence.

+ /usr/bin/install -d /home/build/rpm/BUILDROOT/vmware-vsphere-sdk-4.0.0.161974-2.el6.x86_64/usr/local/vmware-sdk-install
+ /bin/cp -R ./FILES ./Makefile.PL ./apps ./bin ./doc ./etc ./installer ./lib ./man ./resources ./vmware-install.pl ./yes /home/build/rpm/BUILDROOT/vmware-vsphere-sdk-4.0.0.161974-2.el6.x86_64/usr/local/vmware-sdk-install
+ /usr/lib/rpm/find-debuginfo.sh /home/build/rpm/BUILD/vmware-vsphere-sdk-4.0.0.161974
*** WARNING: No build ID note found in /home/build/rpm/BUILDROOT/vmware-vsphere-sdk-4.0.0.161974-2.el6.x86_64/usr/local/vmware-sdk-install/lib/XML-LibXML-1.63/lib/auto/XML/LibXML/LibXML.so
*** WARNING: No build ID note found in /home/build/rpm/BUILDROOT/vmware-vsphere-sdk-4.0.0.161974-2.el6.x86_64/usr/local/vmware-sdk-install/lib/Compress-Raw-Zlib-2.005/lib/auto/Compress/Raw/Zlib/Zlib.so
*** WARNING: No build ID note found in /home/build/rpm/BUILDROOT/vmware-vsphere-sdk-4.0.0.161974-2.el6.x86_64/usr/local/vmware-sdk-install/lib/Data-Dumper-2.121/lib/auto/Data/Dumper/Dumper.so
*** WARNING: No build ID note found in /home/build/rpm/BUILDROOT/vmware-vsphere-sdk-4.0.0.161974-2.el6.x86_64/usr/local/vmware-sdk-install/lib/UUID-0.03/lib/auto/UUID/UUID.so
*** WARNING: No build ID note found in /home/build/rpm/BUILDROOT/vmware-vsphere-sdk-4.0.0.161974-2.el6.x86_64/usr/local/vmware-sdk-install/lib/bin/libcrypto.so.0.9.8
*** WARNING: No build ID note found in /home/build/rpm/BUILDROOT/vmware-vsphere-sdk-4.0.0.161974-2.el6.x86_64/usr/local/vmware-sdk-install/lib/bin/libssl.so.0.9.8
*** WARNING: No build ID note found in /home/build/rpm/BUILDROOT/vmware-vsphere-sdk-4.0.0.161974-2.el6.x86_64/usr/local/vmware-sdk-install/lib/Class-MethodMaker-2.10/lib/auto/Class/MethodMaker/MethodMaker.so
*** WARNING: No build ID note found in /home/build/rpm/BUILDROOT/vmware-vsphere-sdk-4.0.0.161974-2.el6.x86_64/usr/local/vmware-sdk-install/lib/XML-LibXML-Common-0.13/lib/auto/XML/LibXML/Common/Common.so

 

Agent d’inventaire OCS-NG et clients légers

Depuis quelques années nous utilisons des clients légers HP pour lesquels nous avons développé une image sous linux (t5tux). Cette drôle d’idée présente de nombreux avantages:

  • On ne dépend de personne pour les mises à jour des client ( RDP, Citrix et autres… ).
  • Cette image a été faite quand HP ne proposait pas linux sur ses clients légers.
  • La même image fonctionne sur plusieurs générations de clients.
  • La config est téléchargée en TFTP.
  • L’image se met à jour toute seule avec PXE.
  • On apprend plein de choses…

Bref… l’histoire continue avec un nouveau problème: inventorier ces postes avec OCS-NG.

OCS dispose d’un agent d’inventaire pour linux mais celui-ci est assez lourd. De plus, il dispose d’un grand nombre de fonctionnalités inutiles dans notre cas. Nous souhaitons un minimum d’infos: numéro de série, model, ip, mac…

La communication entre l’agent et le serveur se fait avec un fichier XML compressé ou non avec ZLIB et transmis dans une reqûete de type POST. Pourquoi ne pas générer un XML minimaliste et l’envoyer nous même ?

Un simple script bash, épaulé de quelques utilitaires: dmidecode, busybox, wget fera l’affaire.


#! /bin/sh

model=`/usr/local/sbin/dmidecode -s system-product-name`
type=`/usr/local/sbin/dmidecode -s baseboard-product-name`
bytes=`free -k | grep Mem | awk '{ print $2 }'`
memory=$(($bytes/1024))
bytes=`fdisk -l | grep Disk | grep da | cut -f2 -d, | awk '{ print $1 }'`
disk=$(($bytes/1024/1024))
serial=`/usr/local/sbin/dmidecode -s system-serial-number`
hwaddr=`ifconfig eth0 | grep HWaddr | sed "s/.*HWaddr \(.*\)/\1/"`
ip=`ifconfig eth0 | grep "inet addr" | sed "s/.*addr:\(.*\) B.*/\1/"`
tag=`hostname | cut -f1 -d-`
hostname=`hostname`

echo "Model: $model"
echo "Ram: $memory"
echo "Disk: $disk"
echo "Serial: $serial"
echo "Mac: $hwaddr"
echo "ip: $ip"
echo "tag: $tag"
echo "hostname: $hostname"

cat << EOF > /tmp/inventory.xml


  
    
      TAG
      $tag
    
    
      $serial
      Hewlett-Packard
      Hewlett-Packard
      $serial
      Hewlett-Packard
      $model - $type
      $serial
    
    
      131071
      $memory
      $hostname
      T5TUX
      t5tux
      Physical
    
    
      eth0
      $ip
      $hwaddr
      Ethernet
    
    
      FLASH
      $disk
      disk
    
  
  $hostname-9999-01-01-01-01-01
  INVENTORY


EOF

wget --post-file=/tmp/inventory.xml http://ocs-ng.xxxx.fr/ocsinventory

Quelques astuces:

  • wget avec un « –post-file monfichier » ou curl avec un « –binary-data @monfichier » permettent de poster des données.
  • le CHECKSUM à 131071 indique que toutes les données sont modifiées. J’ai trouvé cette info sur un forum mais pas dans la doc officielle.
  • Le client léger est en lecture seule du coup le DEVICEID ne peut être stocké. La date servant à sa génération est falsifiée: « 9999-01-01-01-01-01 »

Très simple et pas forcément très élégant mais ça marche très bien !