Trucs libres

CV
en

jeudi 3 juin 2010

Problèmes de performance 3D avec KMS

Avec la dernière mouture d’Ubuntu Lucid 10.04 vient un nouveau module pour gérer le graphique : KMS ou Kernel-based Mode-Setting.

Si comme moi vous rencontrez des problème de performance dans certains jeux en 3D comme Quake 3 ou TCE / Enemy Territory, essayez de désactiver KMS. Le problème peut aussi se manifester sur la souris par de forte lenteurs, du retard, ou un manque de précision.

Grub 2

Ajoutez nomodeset dans /etc/default/grub puis lancer la commande update-grub.

vi /etc/default/grub
GRUB_CMDLINE_LINUX="nomodeset"
update-grub

Grub 1

Ajoutez nomodeset à la fin de la ligne # kopt puis lancer update-grub.

vi /boot/grub/menu.lst
# kopt=root=/dev/sda1 ro nomodeset
update-grub

On m’a raconté aussi que désactiver KMS corrigeait certains problèmes de lenteur Javascript sous Firefox (Yahoo Mail...).

jeudi 3 décembre 2009

Pour un Thinkpad silencieux

Certains Thinkpads, dont le T43, ont plusieurs problèmes de chaleur et de ventilation.

Sur une installation Linux par défaut, le processeur de mon T43 fait 46°C en moyenne, et le GPU 49°C pour une température extérieure de 19°C.

L’algorithme de gestion du ventilateur par le BIOS est très mauvais, si bien qu’après un démarrage à froid, le ventilateur se met à tourner sans arrêt après quelques minutes d’utilisation.

Fort heureusement, il est possible d’utiliser des programmes pour prendre le contrôle du ventilateur à la place du BIOS.

Pour commencer, le module thinkpad_acpi doit nous autoriser à changer la vitesse du ventilo :

# vi /etc/modprobe.d/thinkpad.conf
options thinkpad_acpi fan_control=1 experimental=1

Au choix, vous pouvez recharger le module, ou relancer votre système.

# rmmod thinkpad_acpi
# modprobe thinkpad_acpi

Vous pouvez désormais prendre le contrôle de votre ventilo :

# cat /proc/acpi/ibm/fan
# echo level 0 > /proc/acpi/ibm/fan
# echo level 7 > /proc/acpi/ibm/fan # pleine puissance !!
# echo level auto > /proc/acpi/ibm/fan # retour à la normale, on laisse le BIOS prendre la main

Maintenant, rendez-vous ici et copiez le contenu du script dans /usr/local/bin/tp-fancontrol.

# mv index.php /usr/local/bin/tp-fancontrol
# chmod a+x /usr/local/bin/tp-fancontrol

Ensuite, pour tester le script :

# tp-fancontrol
# tp-fancontrol -s 5 # pour un ventilo qui démarre plus tard

Afin de lancer le script au démarrage, on récupère aussi, sur la même page, le script tp-fancontrol.init.debian. On l’ajoute au démarrage du système.

# mv index.php /etc/init.d/tp-fancontrol
# chmod a+x /etc/init.d/tp-fancontrol
# vi /etc/init.d/tp-fancontrol
DAEMON=/usr/sbin/fancontrol
# /etc/init.d/tp-fancontrol start
# /etc/init.d/tp-fancontrol stop
# update-rc.d tp-fancontrol defaults # note : on peux aussi n'ajouter que les liens "start"

La touche finale est de modifier le script afin de changer les seuils minimum de déclenchement du ventilateur, de manière à ce qu’il se déclenche plus tard quand le système commence à chauffer :

# vi /usr/local/bin/tp-fancontrol
MIN_THRESH_SHIFT=5
INTERVAL=10 # on peut aussi augmenter l'intervalle de mise à jour de la vitesse

Une augmentation de 5 secondes permet au ventilateur de redevenir silencieux quand l’ordinateur ne fait plus rien.

Références :

mercredi 18 novembre 2009

[Screen] No more PTYs. Sorry, could not find a PTY.

Si vous obtenez les erreurs suivantes en lançant screen en tant qu’utilisateur :

No more PTYs.
Sorry, could not find a PTY.
[screen is terminating]

Il faut changer les droits du fichier /dev/ptmx :

# ls -l /dev/ptmx 
crw-r--r-- 1 root root 5, 2 nov 18 23:28 /dev/ptmx
# chmod a+w /dev/ptmx
# ls -l /dev/ptmx 
crw-rw-rw- 1 root root 5, 2 nov 18 23:34 /dev/ptmx

Sous Ubuntu, le problème était absent, les droits étant déjà positionnés :

$ ls -l /dev/ptmx 
crw-rw-rw- 1 root tty 5, 2 2009-11-18 23:37 /dev/ptmx

Références :

  • man ptmx
  • ubuntu$ ls -l /dev/ptmx

mercredi 21 octobre 2009

Format du sujet des mail de cron

J’ai cherché un moyen de modifier le format des courriels envoyés par la crontab. J’aurais espéré une syntaxe similaire à MAILTO=

Réponse : C’est impossible.

Avec le programme cron par défaut sous Debian, c’est codé en dûr dans le code de cron :

Dans le fichier source do_command.c :

fprintf(mail, "From: root (Cron Daemon)\n");
fprintf(mail, "To: %s\n", mailto);
fprintf(mail, "Subject: Cron <%s@%s> %s\n",
  usernm, first_word(hostname, "."),
  e->cmd);

mardi 30 décembre 2008

Casser un RAID/LVM logiciel

Vous disposez sur votre système d’une batterie de disques configurés avec du RAID1 logiciel (/dev/md0). L’espace de stockage est géré par LVM.

Vos deux disques étant en mirroir, il peut être utile de « casser » le RAID pour pouvoir disposer librement du stockage sur le deuxième disque, ou encore, dans le cadre d’une refonte, d’installer un tout nouveau système sur le deuxième disque, qui remplacera le premier à l’avenir.

En premier lieu, quelques commandes utiles en tout temps pour le diagnostic :

mdadm, le couteau suisse du RAID logiciel :

cat /proc/mdstat
mdadm --detail /dev/md0

La batterie de commandes LVM2 :

pvdisplay
pvs
vgdisplay
vgs
lvdisplay
lvs

La manipulation ne coule pas de source. En voici les étapes :

cat /proc/mdstat montre les deux disques actifs (U pour Up). On marque le deuxième disque (/dev/hdc1) comme défectueux puis on l’enlève de la séquence de RAID pour pouvoir l’utiliser librement :

mdadm --manage --set-faulty /dev/md0 /dev/hdc1
mdadm -r /dev/md0 /dev/hdc1

L’objectif maintenant est de remonter la deuxième moitié du RAID/LVM de manière indépendante, mais sans perdre les données dupliquées présentes.

Il faut donc créer une nouvelle séquence RAID identique à la première en partant du deuxième disque. L’initialisation de /dev/md1 se fait comme suit :

mdadm --create --verbose /dev/md1 --level=mirror --force --raid-devices=1 /dev/hdc1

cat /proc/mdstat doit montrer les deux séquences.

La difficulté désormais est de faire en sorte que le système voie les deux VGs de manière indépendante, car toute commande LVM affiche désormais un avertissement du style :

Found duplicate PV LbpGyrR4uvsZivUwqnJQMYoZbCPTCpgu: using /dev/md1 not
/dev/md0

Le soucis est que les deux PVs sur les deux raids possèdent le même UUID, du coup LVM utilise le PV qui n’est pas celui du système actuel. Le problème est ici assez insoluble. Le seul moyen de s’en sortir est d’utiliser la commande pvcreate pour attribuer un nouveau UUID. D’autre part, impossible d’utiliser cette commande sur un PV qui contient des LVs actifs (pvcreate refuse).

Ajouter des filtres sur /dev/md0 ou /dev/md1 dans /etc/lvm/lvm.conf ne donne rien non plus car pvcreate ne les verra pas.

Voici donc la manipulation :

Vérifiez la présence d’un fichier /etc/lvm/backup/NOM_DU_VG, ou faite en une sauvegarde à l’aide de la commande vgcfgbackup.

Initialisez un volume physique (PV) vierge sur /dev/md1 en forçant la création :

pvcreate -ff /dev/md1

Puis un VG :

vgcreate vg2 /dev/md1

Copiez le fichier /etc/lvm/backup/NOM_DU_VG et éditez le :

cp /etc/lvm/backup/vg /tmp/vg2
vi /tmp/vg2

Modifiez tous les UUID du fichier de sauvegarde. Il suffit par exemple, dans chaque UUID, de modifier un chiffre. Modifiez aussi le nom du vg. Pour le UUID du PV, mettez celui du PV récemment initialisé sur /dev/md1 (commande pvdisplay).

Il est maintenant possible de restaurer la sauvegarde :

vgcfgrestore --file /tmp/vg2 vg2

Si tout s’est bien passé, on peut ensuite activer les LVs puis les monter :

vgchange -a y vg2
mount /dev/vg2/LV /mnt/test/

samedi 22 novembre 2008

Bidouilles resolv.conf

Problème

La Livebox que j’utilise pour me connecter en Wifi me pose le problème suivant :

Le serveur DHCP envoie sa propre adresse 192.168.1.1 comme serveur DNS... logique, me direz-vous, sauf que la boîboîte est incapable de répondre aux requêtes DNS inverses, utilisées par pas mal d’applications. Dès qu’une de ces requêtes est envoyées, donc, l’application en question gèle pendant quelques secondes jusqu’à un certain délai.

$ time nslookup 74.125.43.147 192.168.1.1
;; connection timed out; no servers could be reached

real    0m15.028s
user    0m0.016s
sys     0m0.000s

Alors qu’en utilisant un serveur DNS qui fonctionne :

$ nslookup 74.125.43.147 80.10.246.2
Server:         80.10.246.2
Address:        80.10.246.2#53

Non-authoritative answer:
147.43.125.74.in-addr.arpa      name = bw-in-f147.google.com.

Authoritative answers can be found from:

Jusqu’à maintenant, j’avais ajouté les serveurs DNS à la main dans /etc/dhcp3/dhclient.conf en utilisant la directive prepend domain-name-servers 80.10.246.2.

Oui mais voila, à chaque fois que me connecte sur un autre réseau Wifi non Livebox, les serveurs DNS (du réseau Livebox) ne sont plus accessibles, et du coup il fallait modifier le resolv.conf à la main pour retirer lesdits serveurs DNS.

Solution

Ajouter un script bien placé, qui vérifie si on est derrière une Livebox pour modifier le fichier resolv.conf comme il se doit.

Le script est à placer dans /etc/network/if-up.d/fixdns avec le contenu suivant :

#!/bin/sh
# script pour ajouter d'autres serveurs dns derrière une livebox
# si on reconnait la livebox, on fait la modif dans le resolv.conf
 
if arp "$DHCP4_DHCP_SERVER_IDENTIFIER" | grep -q 00:1b:bf:3d:21:49
then
        cp /etc/resolv.conf.livebox /etc/resolv.conf
fi

Et voila, le tour est joué ! Cette solution a le mérite de fonctionner avec NetworkManager, qui n’exécute pas les scripts de /etc/dhcp3/dhclient-enter-hooks.d/.

jeudi 13 novembre 2008

Tablette Aiptek sous Ubuntu Intrepid

J’ai récemment récupéré une tablette Trust TB-2100 :

$ lsusb
Bus 002 Device 005: ID 08ca:0021 Aiptek International, Inc. APT-2 Tablet

J’ai enfin réussi à faire fonctionner la bête.

Il faut installer le pilote xorg :

sudo aptitude install xserver-xorg-input-aiptek

Ensuite créer le fichier /etc/udev/rules.d/61-aiptek.rules pour ajouter le périphérique dans udev :

BUS=="usb", DRIVER=="aiptek", KERNEL=="event[0-9]*", SYMLINK+="input/aiptektablet"
KERNEL=="event[0-9]*", SYSFS{vendor_id}=="0x08ca", SYMLINK+="input/aiptektablet"
SUBSYSTEMS=="usb", DRIVERS=="aiptek", ATTRS{size}=="3000x2250", ATTRS{model_code}=="0x0064", SYMLINK+="input/aiptektablet"

Dans Ubuntu Intrepid, la configuration Xorg des périphérique d’entrée ne se fait plus dans xorg.conf, mais dans HAL. On ajoute un fichier /etc/hal/fdi/policy/10-aiptek.fdi contenant :

<?xml version="1.0" encoding="ISO-8859-1" ?>
<deviceinfo version="0.2">
<device>
<match key="info.product" contains="Aiptek">
<merge key="input.x11_driver" type="string">aiptek </merge>
<merge key="input.x11_options.SendCoreEvents" type="string">true </merge>
<merge key="input.x11_options.Type" type="string">stylus </merge>
<merge key="input.x11_options.Mode" type="string">absolute </merge>
</match>
</device>
</deviceinfo>

Enfin, on redémarre le système et on prie pour que ça marche. Je n’ai pas réussi en redémarrant simplement HAL et Xorg.

Commandes utiles pour déboguer :

xinput
hal-device
udevinfo -a -p $devpath # on trouve devpath dans dmesg

Sources :

mardi 11 novembre 2008

Démarrer avec le bluetooth désactivé

Pour démarrer avec le bluetooth désactivé au démarrage sous Ubuntu Intrepid :

Dans /etc/init.d/bluetooth, placez :

BLUETOOTH_ENABLED=0

jeudi 18 septembre 2008

Désactiver le haut parleur interne du PC

Assez d’entendre les bips intempestifs de votre PC sous Linux.

rmmod pcspkr
echo "blacklist pcspkr" >> /etc/modprobe.d/blacklist

mardi 8 juillet 2008

Trop de fichiers ouverts

Si un jour vous vous retrouvez dans l’impossibilité de vous loger et que vous obtenez le message d’erreur :

/bin/bash: Too many open files

Ouille ouille. Moi j’ai été obligé de faire un Ctrl+Alt+Suppr pour redémarrer.

Quelques astuces :

Pour obtenir la limite max de nombre de fichiers ouverts :

cat /proc/sys/fs/file-max

Pour changer cette limite :

sysctl -a | grep file-max
echo fs.file-max=200000 >> /etc/sysctl.conf
sysctl -p

Les limites par utilisateur sont présentes dans /etc/security/limits.conf

Enfin, cerise sur le gâteau, pour obtenir les processus qui mangent le plus de descripteurs :

lsof +c 15 | awk '{printf("%15s  (%s)\n", $1, $2)}' | sort | uniq -c | sort -rn

Sources :