Trucs libres

CV Diaspora
en

dimanche 4 janvier 2009

Passer une chaîne en majuscule en Shell

Voici comment passer une chaîne en majuscule en ligne de commande :

echo toto | tr '[a-z]' '[A-Z]'

La commande tr est très utile pour effectuer tout remplacement de caractère.

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 12 août 2008

Afficher l'empreinte SSH d'un système

Pour afficher l’empreinte digitale (fingerprint) d’un système Unix :

ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key

Source : http://ubuntuforums.org/showthread....

mardi 29 juillet 2008

Sauvegarde intelligente avec rsync

rsync est un outil très puissant de copie/transfer/sauvegarde de fichiers sous Unices.

Pour effectuer une sauvegarde triviale, on peut l’utiliser de la manière suivante :

rsync -av MES_DONNEES DOSSIER_SAUVEGARDE

Plutôt que de refaire une copie intégrale de mes données dans le dossier de sauvegarde à chaque sauvegarde, il est plus intelligent d’utiliser rsync combiné avec le système de fichiers ext3 pour faire des sauvegardes incrémentales.

cp -al DOSSIER_SAUVEGARDE_HIER DOSSIER_SAUVEGARDE
rsync -av MES_DONNEES DOSSIER_SAUVEGARDE

Le cp -al recopie le dossier en créant des nouveau répertoire, mais en faisant des liens en dur vers les fichiers. En faisant un rsync par dessus, seuls les fichiers modifiés sont copiés. Ainsi, on utilise de l’espace disque en plus seulement pour les nouveaux fichiers. Le plus fort, c’est qu’on peut accéder à chaque dossier de sauvegarde de manière très rapide car ils sont tous identiques aux originaux. Un mini système de gestion de versions très simple à mettre en place.

Mais le plus fort c’est que rsync peut tout faire à notre place :

rsync -av --link-dest=DOSSIER_SAUVEGARDE_HIER MES_DONNEES DOSSIER_SAUVEGARDE

Des variables variables dans Bash

Dans certains langages, il est possible de faire référence à une variable dont le nom est contenu dans une autre variable.

Ainsi, en PHP :

$toto = 8;
$nomvar = 'toto';
echo $$nomvar;

Affichera 8.

C’est aussi possible en Bash de la manière suivante :

toto=8
nomvar='toto'
echo ${!nomvar}

Source : http://www.seocam.net/how-tos/how-t...

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 :

jeudi 19 juin 2008

Commande screen

La commande screen est très pratique pour lancer des scripts lorsqu’on est connecté en SSH, pour que si une coupure de courant ou un problème survient côté client, le shell client ne soit pas tué ainsi que le script.

Pour lancer un script :

$ screen

Pour le détacher, il faut faire Ctrl+A, puis D.

Enfin, pour récupérer un screen :

$ screen -r

mardi 3 juin 2008

Changer la taille de police de gvim

Je trouve toujours que la taille de la police de gvim est un tantinet trop grande.

Pour une taille plus petite, rajouter ceci dans votre ~/.vimrc :

set guifont=Monospace\ 8

page 2 de 2 -