On se tutoie ?

Aller au contenu | Aller au menu | Aller à la recherche

vendredi, mai 23 2008

Garder son serveur GNU / Linux à l'heure atomique

Rester dans les temps

C'est une bonne idée de conserver son serveur à l'heure, surtout quand celui ci doit communiquer avec le reste du monde.

Sous GNU / Linux il existe ntpdate qui permet de réajuster l'heure à un moment donné en se basant sur des serveurs de temps.
Ce paquet est pratique pour une utilisation ponctuelle et réfléchie.

Toutefois c'est une mauvaise idée d'utiliser ntpdate dans un cron pour conserver sa machine à l'heure.
En effet les décalages de temps, même minces, risque d'entraîner des perturbations (parfois invisible) au niveau des processus en cours.

Nombreux sont les programmes qui utilisent des timestamp ou se base sur l'horloge système pour planifier d'autres tâches.
Si un programme planifie une tache à n+1 et qu'à la prochaine mise à jour de temps ton serveur passe à n+2, certaines tâches ne seront pas éxécutées.

Le programme dovecot par exemple, s'arrête complètement à chaque mise à jour de temps avec ntpdate.

Utiliser un démon pour garder l'heure à jour

Pour garder sa machine à l'heure il existe un programme qui tourne en tache de fond : ntpd (paquet ntp).
Ntp ne se contente pas de réajuster l'heure avec les risques que cela comprend.
Lorsque le serveur est en retard il accélère l'horloge système afin de rattraper son retard.
Le temps va donc passer plus vite mais sans perte.
À l'inverse il va décélérer l'horloge si la machine est en avance.

Pour l'installer il te suffit d'utiliser ton gestionnaire de paquet favoris, par exemple :

aptitude install ntp

ou d'utiliser le paquet qui va bien sur le site officiel.

Une fois installé le serveur se lance en démon.
J'ai juste changé les serveurs du /etc/ntp.conf de n.debian.pool.ntp.org vers n.fr.pool.ntp.org pour avoir les serveurs de temps les plus proches.

mardi, septembre 11 2007

Tips #1

J'inaugure aujourd'hui une nouvelle catégorie de billets, j'ai nommé : les tips

Les tips regroupent des petites astuces glannées au fil des jours dont l'intérêt n'est pas assez important pour mériter un billet entier mais qui valent quand même le détour.

Les tips fonctionneront donc par lot de 10, ce qui m'évitera d'en poster trop souvent, car le contenu est assez brut de fonderie.

L'intérêt est donc clairement de lister toutes ces petites choses dont on a régulièrement besoin mais qu'on oublie, faute d'intérêt ou de pratique et que l'on perd un temps fou à rechercher lorsque l'on en a besoin.

Voilà donc la première salve :

  1. Ecrire du code dans dotclear : /// avec la syntaxe wiki
  2. Générateur de mot de passe «intelligent» sous debian : apg (Automatic Password Generator)
  3. Encrypter une archive en ligne de commande sous linux : zip -e foo.zip foo.txt foo2.txt
  4. Editer la liste des applications à lancer au démarrage sous xfce : xfce4-autostart-editor
  5. Visualiser plus d'informations sur ses périphériques usb qu'avec le classique lsusb : usbview (nécessite X11)
  6. Faire des opérations complexes sur les dates en shell, comme avoir la date d'il y a un mois (ce qui évitera bien des cauchemars pour les cas particuliers) :
    $ date --date '1 month ago'
    Qui a dit que le shell était has been ?
  7. Pour retourner à la page précédente avec la touche backspace sous firefox, il faut éditer la configuration. Tapes about:config dans ton navigateur, cherches la variable browser.backspace_action et passes la à 0. Sinon le raccourci 'standard' c'est ALT + left.
  8. Convertir une image de type jpeg en png : convert file.jpeg file.png (nécessite l'installation du puissant imagemagick). Note : Il est possible de faire des choses beaucoup plus élaborée : convert file.jpeg -resize 50% file.png, convert -rotate 90 file.jpg file2.jpg etc...
  9. Faire des calculs en shell : $((2 - 1))
  10. Lancer une commande shell depuis vim : :!macommande ; ex : :! echo 'hello world'. Ca peut être pratique pour exécuter et tester un script que l'on édite sans avoir à utiliser ctrl + z.

lundi, juillet 23 2007

svn: decompression failure

Si comme moi tu as rencontré ce problème (svn: decompression_failure: remotely generated; fatal), sache qu'il ne vient pas de subclipse comme on pourrait le penser logiquement mais en fait de java.

Pour le résoudre j'ai installé la version de sun de java, en remplacement de gij (javac remplacera gcj).
La version longue (sous debian) consiste à aller chercher le bin sur le site de sun et en faire un .deb.

En effet l'installer directement à partir du bin n'est globalement pas une bonne idée puisque ton gestionnaire de paquet n'aura pas connaissance de sa présence, et qu'il va sûrement aller s'installer dans /opt.
Bref, pas très clean.

Une fois le bin récupéré on peut donc en faire un .deb ainsi :
$ fakeroot make-jpkg jdk-6u2-linux-i386.bin

Une fois terminé tu hérites d'un joli .deb installable directement avec dpkg :
# dpkg -i jdk_6u2_linux_i386.deb

L'avantage est d'avoir une version de java up-to-date (on connaît la rapidité légendaire de disponibilité des paquets sous debian :-p).

Ah et sinon la version courte (bah oui je préfère la donner après sinon on ne lit pas la longue :-p ) :

$ aptitude search jdk | grep sun
# aptitude install sun-java6-jdk

Comme expliqué précédemment tu risques d'avoir une version légèrement moins à jour de cette manière.

Toutefois l'installation du paquetage en tant que tel ne suffit pas. Ne râles pas, c'est parce que ton OS est bien fichu.
En effet, debian se base sur des alternatives, c'est à dire que cette version de java ne vas pas écraser la précédente, regardons ça en détail :

$ which java
/usr/bin/java

$ file /usr/bin/java
/usr/bin/java: symbolic link to `/etc/alternatives/java'

$ file /etc/alternatives/java
/etc/alternatives/java: symbolic link to `/usr/lib/jvm/java-gcj/jre/bin/java'

Le binaire java dans /usr/bin linke donc sur /etc/alternatives/java qui linke sur la version de java.
Cela permet une bonne généricité, on a par exemple la même chose pour editor.

Maintenant utilisons la version de java que l'on souhaite.

La mauvaise idée c'est de changer ces liens symboliques à grand coup de ln -s.
La bonne c'est d'utiliser les outils mis à disposition sur debian

Soit :

# update-alternatives --config java

 Sélection    Alternative

       1    /usr/bin/gij-wrapper-4.1
*+     2    /usr/lib/jvm/java-gcj/jre/bin/java
       3    /usr/lib/jvm/java-6-sun/jre/bin/java

On choisit le 3 et on valide.

Ou :

# update-java-alternatives -s java-6-sun

Cette solution est la meilleure puisqu'elle va mettre à jour les plugins ainsi que jar, appletviewer et compagnie, alors qu'il faudrait le faire à la main sinon (avec tous les risques que ça comporte).

Avec tout ça on en oublierait presque le souci de départ, maintenant les commit et autre update svn ne devrait plus te poser de problèmes dans ton eclipse.

Note: Pour exécuter des programmes java un jre suffit, inutile de sortir l'artillerie lourde si tu ne souhaites pas développer.

jeudi, juin 7 2007

Sésame, réveille toi !

J'ai récemment subi une petite mésaventure. Pourtant tout partait d'une bonne intention. Réactif à la campagne incessante de sauvegarde de la planète je me suis dit :”Shutdown your computer, save the world”, et j'ai donc pris le parti d'éteindre mon PC desktop quand c'était réalisable.

Seulement voilà, une fois parti en week end, il m'a manqué ce document complètement indispensable que j'avais pris beaucoup trop de temps à réaliser.
Bien entendu rsync n'avait pas eu le temps de backuper ce document sur mon serveur avant que j'éteigne mon poste. D'habitude en trois coups de ssh - scp bien placé j'aurai pu le récupèrer facilement, même non archivé.

Alors que faire ? Fallait-il mettre de côté ma récente bonne habitude ? Bien sûr que non.
J'ai donc fini par trouver la solution à mon problème : wakeonlan.

Le Wake-on-LAN est une technologie permettant à un ordinateur d'être démarré à distance par l'envoi d'un "magic-packet" sur la carte réseau supportant le Wake-on-LAN.
Bref avec ça je peux démarrer mon poste, à partir de mon serveur, auquel j'ai accès en ssh.

Comment mettre cela en place ?

Sur la machine à démarrer à distance :

Tout d'abord il faut commencer par récupérer ethtool, disponible aussi bien sous debian que sous arch.

# pacman -S ethtool 
ou
# aptitude install ethtool

Ensuite on va vérifier que notre carte supporte le wake on lan :

# ethtool eth0 | grep Wake
        Supports Wake-on: g
        Wake-on: d

Cela signifie que le WOL est supporté mais pas activé. Si pour vous le support est sur 'd' vous avez sûrement une option à activer dans le bios, sinon votre carte réseau est peut-être simplement trop ancienne. Si la carte le supporte activons le WOL :

# ethtool -s eth0 wol g

Et on vérifie :

# ethtool eth0 | grep Wake
        Supports Wake-on: g
        Wake-on: g

Avant d'éteindre ce poste, repéres son adresse MAC et notes là (ou retiens là de tête voir :-) ):

$ ifconfig | grep HWaddr
eth0 Link encap:Ethernet HWaddr xx:xx:xx:xx:xx:xx

Sur la machine qui enverra le paquet magique :

Il faut installer wakeonlan ou etherwake. Le premier permet de redémarrer l'ordinateur en passant par le net contrairement au second.

Sur debian(-like) :

# aptitude install wakeonlan

Sur arch il n'existe de paquet ni pour l'un ni pour l'autre. Dans mon cas l'appelant est sous debian, ce n'est donc pas génant mais si vraiment vous devez faire l'appel depuis arch vous pouvez récupérer les sources ... depuis une debian par exemple :-) :

$ cd /tmp && apt-get source wakeonlan

Vous pouvez ensuite déplacer et utiliser le script (extrait dans /tmp/wakeonlan-0.41/wakeonlan) directement sous arch ou autre, puisqu'il est écrit en perl.

Une fois cela réalisé vous pouvez redémarrer votre client :

$ wakeonlan xx:xx:xx:xx:xx:xx

Si vous n'avez pas essayé de retenir l'adresse de tête (dans ce cas vous redémarrez sûrement à la main :p), votre ordinateur devrez commencer à ronronner !

Attention il reste toutefois une petite manipulation. En effet, une fois booté le Wake-on sera de nouveau désactivé sur eth0.

Certains recommandent d'activer l'option par un script à l'arrêt de l'interface réseau avec tous les soucis que ça comporte :

  • Un halt coupe les connexions violemment sans éxécuter les scripts pre-down
  • Un arrêt encore plus violent en appuyant sur le bouton ne permettra pas de réveiller la machine la prochaine fois

Partant de ce constat je préfère éxécuter la commande au démarrage. J'ai donc mis la commande précédente dans un script (/etc/rc.d/starter) :

#!/bin/sh -e
[ -x $(which ethtool) ] && ethtool -s eth0 wol g

que le lance au démarrage (en modificant le rc.conf) DAEMONS=(.... starter)

Voilà, finis les soucis !

jeudi, mars 1 2007

Compiler son kernel sous debian

Ce document me sert avant tout de mémo et est amené à évoluer, il existe des dizaines de sites expliquant plus en détails comment compiler son kernel.

L'intérêt de compiler son noyau est de bénéficier des dernières avancées, de drivers plus à jour etc ... De plus sous debian, les derniers kernels en date ne sont pas forcément fournis sous forme de paquets (linux-image). Il faut souvent attendre un peu (même en unstable ou testing). Enfin une compilation personnelle vous permet de choisir et charger uniquement les options dont vous avez besoin (inutile d'avoir les drivers de matériel que vous ne possédez pas), ce qui optimise les performances de manière significative. Rentrons donc dans le vif du sujet.

Mise en garde :

Gardes toujours au moins un noyau sur lequel tu sais que tu pourras booter sans soucis, ce qui t'éviteras quelques nuits blanches en cas de kernel panic.

Pré requis :

  1. Posséder une distribution de type debian, ou debian-like (ubuntu ...)
  2. Avoir les packages suivants installés :
  • fakeroot
  • kernel-package, pour bénéficier de la commande make-kpkg
  • libc-dev (dans mon cas libc6-dev)
  • libncurses-dev (dans mon cas libncurses5-dev)
  • initrd-tools

Installation :

Récupération du noyau à compiler :

$ cd /tmp && wget -c ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.20.1.tar.bz2

Extraction du noyau à compiler :

$ tar jxf linux-2.6.20.1.tar.bz2 && cd linux-2.6.20.1

Une fois que tout est prêt il nous reste à choisir ce que l'on souhaite activer dans notre nouveau noyau. Pour cela on a le choix entre deux solutions :

  • Partir à la découverte des multiples options disponibles dans le noyau
  • Utiliser la configuration de son noyau précédent

Pour rapatrier la configuration du dernier noyau on effectue un :

$ cp /boot/config-2.6.19 .config ( le dossier courant à ce stade devrait être /tmp/linux-2.6.20.1 )

Ici le config-2.6.19 correspond à la configuration de mon noyau précédent, vous devez choisir le votre.

Ensuite on lance le make menuconfig (qui ouvre une interface semi-graphique en ncurses) :

$ make menuconfig

Si tu as copié ton .config les options de ton précédent noyau seront chargés, sinon bonne chance dans les différents menus ; tu pourras choisir d'activer ou désactiver différentes options, voir de les utiliser sous forme de modules.

Choisis ensuite exit et acceptes de sauvegarder ta configuration.

Compiler son noyau

Ton noyau fraîchement configuré, tu vas enfin pouvoir le compiler :

$ make-kpkg - -rootcmd fakeroot - -initrd - -append-to-version=tontexte - -revision=2.6.20.1 kernel-image

Attention il n'y a pas d'espaces entre les tirets, il faut juste que je trouve la syntaxe wiki pour les afficher sinon cela me donne un texte barré sous dotclear.

Le paramètre --rootcmd fakeroot permet d'obtenir les droits root, ce qui est nécessaire pour la création du .deb du noyau.

Note : on aurait aussi pu utiliser --rootcmd sudo

Le paramètre --initrd permet de créer un fichier initrd. Cela est particulièrement utile pour utiliser des modules du noyau dès l'amorçage de l'image de celui-ci.

Le paramètre --append-to-version permet de rajouter un texte personnalisé qui appraitra en bout de chaine, lors du choix du noyau dans grub. Si c'est ta première compilation et que tu te sens un brin mégalo à l'idée d'avoir compilé ton noyau, rien ne t'empêche d'ajouter un texte du style -martin-ce-super-héros.

Toutefois au fil du temps, l'excitation retombant tu te cantonneras certainement à quelquechose de plus sobre comme la date :-)

Une fois la commande lancée et 3-4 cafetières vides plus loin tu devrais te retrouver avec un package de la sorte : kernel-image-2.6.20.1-tontexte.deb

Si la compilation échoue n'essaies surtout pas d'aller plus loin, il se peut que tu ais fais des erreurs de configuration, qu'il te manques des packages parmis ceux évoqués en début de tutoriel ou plein d'autres bonnes raisons. Dans tous les cas une recherche sur ton moteur de recherche préféré devrait vite t'apporter des éléments de réponse.

Une fois le package debian généré, tu prendras soin de faire un clean dans l'arborescence des sources:

$ make-kpkg clean

Dans le cas où tout s'est bien passé tu peux installer le paquet comme un package traditionnel :

# dpkg -i kernel-image-2.6.20.1.tontexte.deb

Note : le # désigne un shell ouvert en root, cela revient à lancer la commande précédée de sudo, un accès root étant généralement déconseillé.

dpkg va donc installer le nouvau noyau en :

  • Installant les modules dans /lib/modules/2.6.20.1-tontexte
  • Créant System.map-2.6.20.1-tontexte, /boot/config-2.6.20.1-tontexte et /boot/vmlinuz-2.6.20.1-tontexte
  • Ajoutant le nouveau noyau dans /boot/grub/menu.lst en première position dans la liste

Une fois que tu as vérifié que tout s'était bien passé, tu peux redémarrer ta machine:

  1. reboot ( ou shutdown -r now mais c'est plus long :-p )

Le boot se fera normalement sur le premier noyau de la liste c'est à dire celui que tu viens d'installer.

Problèmes potentiels au boot :

Table des partitions avancée :

Il peut arriver que le noyau Linux ne reconnaisse pas le disque si la table des partitions avancée est activée dans le fichier .config.

On a alors droit à un kernel panic en règle :

VFS: Cannot open root device "hda1" or unknown block (0,0) Kernel panic - not syncing: VFS Unable to mount root fs on unknow block (0,0)

Dans ce cas, après make menuconfig, édites le fichier .config en changeant:

CONFIG_PARTITION_ADVANCED=y en

  1. CONFIG_PARTITION_ADVANCED

Le # a pour effet de mettre la ligne en commentaire.

Utilisation d'initrd

L'installation du noyau sans créer de fichier d'init peut poser quelques problèmes, aussi n'oublies pas l'option --initrd sur la ligne de commande make-kpkg.

Désinstaller un noyau :

Si ton nouveau noyau fonctionne correctement, ce que tu verras à l'usage, tu pourras supprimer le plus ancien, en veillant à en avoir au moins toujours un autre en plus du courant. Personnellement j'aime bien en avoir toujours 3 dans ma liste donc une fois le nouveau installé et après quelques jours à le tester je supprime le plus ancien avec la commande :

# apt-get remove --purge kernel-image-version-a-supprimer

ou

# dpkg --purge kernel-image-version-a-supprimer

Voilà, c'est fini, ce n'était pas si compliqué !

Liens connexes :