Programmation

Changement d'ABI pour X.org et dirvers NVIDIA

Monday, 03 October 2011
|
Écrit par
Grégory Soutadé

Mise à jour du serveur X.org et donc ... problèmes avec les drivers NVIDIA. Le fichier de log /var/log/Xorg.0.log nous indique un changement de version d'ABI du serveur X. Si la dernière version des pilotes (NVIDIA-Linux-x86_64-280.13) supporte la compilation sous Linux 3.0, ils n'ont pas encore pris en compte ce changement d'ABI (c'est peut être en cours de test).

[    48.968] (II) Loading /usr/lib/xorg/modules/drivers/nvidia_drv.so
[    48.968] (II) Module nvidia: vendor="NVIDIA Corporation"
[    48.968]    compiled for 4.0.2, module version = 1.0.0
[    48.968]    Module class: X.Org Video Driver
[    48.969] ================ WARNING WARNING WARNING WARNING ================
[    48.969] This server has a video driver ABI version of 11.0 that this
driver does not officially support.  Please check
http://www.nvidia.com/ for driver updates or downgrade to an X
server with a supported driver ABI.
[    48.969] =================================================================
[    48.969] (EE) NVIDIA: Use the -ignoreABI option to override this check.
[    48.969] (II) UnloadModule: "nvidia"
[    48.969] (II) Unloading nvidia
[    48.969] (EE) Failed to load module "nvidia" (module requirement mismatch, 0)
[    48.969] (EE) No drivers available.

La solution temporaire, mais fonctionnelle, (les deux version étant assez proche pour tenter cette manip) est d'ignorer la vérification de la version d'ABI lors du lancement du serveur X. Pour cela il faut éditer le fichier /etc/X11/xorg.conf :

Section "ServerFlags"
Option  "IgnoreABI" "True"
EndSection

Script AWStats

Wednesday, 21 September 2011
|
Écrit par
Grégory Soutadé

MAJ du script ici

J'aime bien suivre au jour le jour les statistiques du blog, ça fait passer 5 minutes et parfois cela permet de mieux répondre aux attentes des internautes (quand un mot clé revient régulièrement, mais que l'article proposé ne répond pas forcément à la question). À ce propos mes stats ont été divisés par 2 ou 3 depuis septembre ... Bref elles sont générées via AWStats. Il est un peu lent, mais quand on y est habitué on en tire plein d'informations intéressantes. Le problème principal d'AWStats est qu'il n'est composé que d'un seul fichier PERL de 20 000 lignes, ce qui le rend relativement indigeste et difficile à manipuler pour un néophyte.

L'objectif du jour est d'obtenir les nouvelles phrases clé par rapport à la dernière mise à jour. Pour cela j'ai réalisé un petit script PHP qui va brutalement analyser la sortie HTML d'AWStats et afficher dans un tableau : les nouvelles lignes en vert, les lignes mises à jour en jaune et les lignes supprimées en rouge. Le script est basique, il n'y a pas de gestion de date (si on rafraîchit deux fois dans la même journée), mais fonctionne plutôt bien.

Le script est disponible ici

 

Noyau Linux 3.0 et pilotes Realtek 8192e

Monday, 15 August 2011
|
Écrit par
Grégory Soutadé

En retard sur ma mise à jour (comme d'hab), me voici donc avec un noyau Linux 3.0 fraichement installé ! Comme d'habitude il faut recompiler le pilote graphique NVIDIA et le pilote Wifi Realtek (rtl8192e), sauf que le passage à la version 3.0 perturbe les scripts de compilation, même si les structures internes sont sensiblement identiques aux dernières 2.6.xx.

Les modifications à appliquer à HAL/rtl8192/Makefile sont :

  • Changer la vérification de version 2.6 en 3.0
-ifeq ($(shell uname -r|cut -d. -f1,2), 2.6) +ifeq ($(shell uname -r|cut -d. -f1,2), 3.0)
  • Le chemin de include/linux/autoconf.h a changé
-CONFIG_FILE := $(KSRC)/include/linux/autoconf.h +CONFIG_FILE := $(KSRC)/include/generated/autoconf.h
  • Le chemin de include/linux/modversions.h a changé
-CFLAGS += -DMODVERSIONS -DEXPORT_SYMTAB -include $(KSRC)/include/linux/modversions.h +CFLAGS += -DMODVERSIONS -DEXPORT_SYMTAB -include $(KSRC)/include/config/modversions.h
  • Changer la variable CFLAGS par EXTRA_CFLAGS


Le patch complet est disponible ici

Un petit make "clean && make && make install" et on peut de nouveau profiter du Wifi !

Le pilote rtl8192e est dans la branche stagging depuis 1 an et demi (noyau 2.6.32), ça serait bien qu'il intègre enfin la branche stable, on pourrait peut être enfin profiter d'un Wifi correct ...

Problème de compilation avec le nouveau pilote NVIDIA

Sunday, 17 April 2011
|
Écrit par
Grégory Soutadé

En retard (comme d'habitude), j'ai mis à jour hier ma Debian Wheezy (testing). Je vois dans la liste qu'il y a un nouveau noyau (le 2.6.38), donc c'est une mise à jour périlleuse pour les périphériques qui ne sont pas directement supportés par le noyau, à savoir : le pilote rtl8192e pour le Wifi et le pilote NVIDIA GeForce 330M pour la carte graphique.

Généralement tout se passe bien, enfin généralement... Pour le wifi c'était OK (il suffit de recompiler les pilotes), mais pour la carte graphique, le serveur X ne voulait plus se lancer. C'est un problème fréquent, on retourne via l'ancien noyau sur le site de NVIDIA, on télécharge le nouveau pilote et les headers du noyau puis on redémarre pour le compiler.

Comme d'hab il y a la vérification de gcc qui se règle en préfixant la commande par CC="gcc-4.4", mais cette fois-ci la compilation échoue ! On va voir ce qui se passe dans /var/log/nvidia-installer.log :

kernel/nv.c:426: error: unknown field ‘ioctl’ specified in initializer

C'est la première fois que ça arrive. Ni une, ni deux, j'extraie les sources de NVIDIA-Linux-x86_64-256.53.run avec

./NVIDIA-Linux-x86_64-256.53.run -x

j'ouvre le fichier nv.c, tout semble correct. Sauf qu'en fait le champs ioctl de la structure file_operations a été supprimé depuis 6 mois à cause du BKL (Big Kernel Lock). Arf les bougres ! La modification à réaliser n'est pas compliquée :

--- a/NVIDIA-Linux-x86_64-256.53/kernel/nv.c 2011-04-17 10:22:22.861937886 +0200 +++ b/NVIDIA-Linux-x86_64-256.53/kernel/nv.c 2011-04-17 09:08:21.000000000 +0200 @@ -423,9 +423,10 @@ static struct file_operations nv_fops = { .owner = THIS_MODULE, .poll = nv_kern_poll, - .ioctl = nv_kern_ioctl, #if defined(HAVE_UNLOCKED_IOCTL) .unlocked_ioctl = nv_kern_unlocked_ioctl, +#else + .ioctl = nv_kern_ioctl, #endif #if defined(NVCPU_X86_64) && defined(HAVE_COMPAT_IOCTL) .compat_ioctl = nv_kern_compat_ioctl,

On déplace le champs ioctl dans un #else. On recompile et ça tourne ! Même binaire, les pilotes NVIDIA sont de très bonne qualité, c'est bizarre d'avoir laissé une telle erreur. Je viens de leur envoyer un message (dur de trouver un point d'entrée), j'espère que ce sera corrigé dans la prochaine version.

conversion ISO-8859-1 vers UTF-8 avec iconv

Tuesday, 22 February 2011
|
Écrit par
Grégory Soutadé

Après m'être battu un moment avec iconv, voici un petit exemple de conversion ISO-8859-1 vers UTF-8 :

#include ‹iconv.h› int translate_text(char** text, char free_text) { char* tmp_in, *tmp_out, *original_out; size_t mult_size, size_in, size_out; if (!text || !*text) return 1; converter = iconv_open ("UTF-8", "ISO-8859-1"); if (converter <= 0) return 1; size_in = strlen(*text); mult_size = size_out = size_in*4; // Because UTF8 is bigger thant ISO-XXX tmp_in = *text; original_out = tmp_out = malloc(size_out); iconv(converter, &tmp_in, &size_in, &tmp_out, &size_out); // All variables are modified by iconv original_out[mult_size-size_out] = 0; if (free_text) free(*text); *text = original_out; iconv_close(converter); return 0; }