lindev.fr

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

16 nov. 2012

At

horloge.jpg Programmer une tâche à une heure et une date bien précise. Voilà un petit billet très simple, parfait pour cette fin de semaine.

At

Imaginez que l'on vous demande de couper vos serveurs proprement à 3h00 du matin, un dimanche . Personne ( en tout cas pas moi ) n'a envie de se lever à cette heure pour couper un à un les serveurs .. même à distance.

Pas envie non plus de créer une règle Cron pour une action qui ne sera exécuté qu'une fois !

C'est là que la commande at vous simplifie la vie . Elle vous permet de lancer des actions batch à une date et heure précise.

Et contrairement à Crontab, ses enregistrements sont volatiles. ( disparait après exécution ).

Utilisation

Nous souhaitons donc arrêter notre serveur ce Dimanche à 3h00.

Nous entrons ( en root ) la commande at en spécifiant l'heure et la date, suivie de la commande à exécuter.

Enfin, Crtl + D pour valider et quitter .

at 03:00 18.11.2012
warning: commands will be executed using /bin/sh
at> halt -n
at> <EOT>
job 4 at Sun Nov 18 03:00:00 2012

Pour passer un script ( fichier bash ) à exécuter, il vous faudra utiliser l'option -f

at -f /chemin/vers/mon/script.sh 03:00 18.11.2012
job 5 at Sun Nov 18 03:00:00 2012

Pour lister les tâches, utiliser la commande atq

atq
4	Sun Nov 18 03:00:00 2012 a root
5	Sun Nov 18 03:00:00 2012 a root

Les scripts réellement exécutés sont stockés dans /var/spool/cron/atjobs/

ls /var/spool/cron/atjobs/
a0000301581a50	a0000401582338

Enfin, pour supprimer une tâche, il vous suffit d'utiliser la commande atrm suivie du numéro de la tâche

atrm 4

Les droits

root n'a évidemment pas de problème pour créer ce genre de tâche , pour les autres utilisateurs, cela va dépendre de deux fichiers ( s'ils existent )

  • /etc/at.allow
  • /etc/at.deny

Si /etc/at.allow est présent, seuls les utilisateurs listés à l'intérieur seront autorisés à utiliser la commande at. S'il est absent, une recherche du fichier /etc/at.deny est faite pour autoriser tous les comptes sauf ceux présents dans ce fichier l'utilisation de at. Enfin

1342786540_alert-square-red.png Si les deux fichiers sont absents , seul root peut utiliser la commande.

08 oct. 2012

App Node.js persistante

Nous allons voir dans ce billet comment rendre votre application Node.js persistante dans le temps, c'est à dire

  • Démarrer l'app automatiquement au démarrage du système
  • Restart en cas de crash du process
  • ...

Les dépendances

Pour mener à bien cette fonction, nous allons utiliser le module forever

Installation en tant que module global ( disponible depuis n'importe quelle app )

sudo npm -g install forever


Je travail actuellement sur la version 0.8.11 de Node.js et la version 0.10.0 de forever

Capture_d_ecran_2012-10-08_a_13.10.46.png

Capture_d_ecran_2012-10-08_a_13.10.19.png



init.d

Nous allons créer un script de démarrage ( définition de service ) pour notre application

cd /etc/init.d
vim MonAppNode

Voici le contenu :

#!/bin/bash

# Source function library.
. /lib/lsb/init-functions

#############PARAMETRES A CONFIGURER################

NAME=app.js                 # Nom de votre application
PORT=1234                   # Port (dans le cas ou votre app utilise process.env.PORT pour définir le port)
INSTANCE_DIR=/var/nodelab/monappnode/$NAME         # emplacement de votre application
SOURCE_NAME=MonAppNode       # Nom donné au process

user=www-data
pidfile=/var/run/$SOURCE_NAME.pid
logfile=/var/log/$SOURCE_NAME.log
forever_dir=/var/run/forever # chemin d'execution de forever.

###################FIN#########################

export PATH=$PATH:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/game

node=node
forever=forever
awk=awk

start() {
    echo "Starting $NAME node instance: "

    if [ "$id" = "" ]; then
        # Create the log and pid files, making sure that the target use has access to them
        touch $logfile
        chown $user $logfile

        touch $pidfile
        chown $user $pidfile

        # Launch the application
        start_daemon
            $forever start -p $forever_dir --pidFile $pidfile -l $logfile -a -d $INSTANCE_DIR $SOURCE_NAME
        RETVAL=$?
    else
        echo "Instance already running at pid $id"
        RETVAL=0
    fi
}

restart() {
    echo -n "Restarting $NAME node instance : "
    if [ "$id" != "" ]; then
        $forever restart -p $forever_dir $id
        RETVAL=$?
    else
        start
    fi
}

stop() {
    echo -n "Shutting down $NAME node instance PID : `cat $pidfile` "
    if [ "$id" != "" ]; then
        $forever stop -p $forever_dir $id
    else
        echo "Instance is not running";
    fi
    RETVAL=$?
}

status(){
    pid=`cat $pidfile`
    $forever list -p $forever_dir | $awk "\$8 && \$8 == \"$pid\" { print \$0; };"
    #forever list -p /var/run/forever | awk '$8 && $8 == "27567" { print $0; };'
}

getForeverId() {
    pid=`cat $pidfile` 
    $forever list -p $forever_dir | $awk "\$8 && \$8 == \"$pid\" { gsub(/[\[\]]/, \"\", \$2); print \$2; };"
    #forever list -p /var/run/forever | awk '$7 == "27270" { gsub(/[\[\]]/, "", $2); print $2; };'
}
id=$(getForeverId);


case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    status)
        status 
        ;;
    restart)
        restart
        ;;
    *)
        echo "Usage:  {start|stop|status|restart}"
        exit 1
        ;;
esac
exit $RETVAL

On le rends exécutable

chmod +x MonAppNode

Enfin on déclare le service dans init.d

update-rc.d MonAppNode defaults

Utilisation

Comme chaque script de démarrage, il répond aux commandes

service MonAppNode start
service MonAppNode stop
service MonAppNode status
service MonAppNode restart

Pour ce qui est de la surveillance du process node, tout est gérer par forever .

Conclusion

Voilà une méthode parmi d'autres, le script ci-dessus a été fait depuis une version plus ancienne trouvé sur le net ( je ne sais plus ou désolé ) que j'ai adapté .

Ch.

20 juil. 2012

LTSP V5 lts.conf

Configurer les clients PXE

Dans le précédent billet nous avons installé notre serveur, avec tout ce qu'il faut pour un fonctionnement standard ..

Maintenant regardons de plus prés ce que nous pouvons faire au niveau des clients .. ( login automatique, activer le son, permettre le montage de clef usb/cdrom .., etc ... )

Pour gérer la configuration globale pour pour un poste précisément, tout se passe dans le fichier lts.conf que vous devrez créer à l'emplacement suivant

vim /srv/tftp/ltsp/classique/lts.conf

1342786540_alert-square-red.png il faut savoir que les modifications de ce fichier, ne seront validés qu’après une mise à jour de l'image, via la commande

//ltsp-update-image -a <nom de votre espace chroot> dans notre cas:
ltsp-update-image -a classique

Lts.conf

Je ne vais pas détailler toutes les options de ce fichier, si vous le souhaitez, regardez le man ( après avoir installé le paquet ltsp-docs )

apt-get install ltsp-docs
man lts.conf

Configuration générale

Nous allons commencer par entrer la configuration qui sera partagée / par défaut à tout les clients PXE, on va donc créer dans le fichier lts.conf la section default

[default]
    LOCALDEV=True
    SOUND=True
    NBD_SWAP=True
    SYSLOG_HOST=10.0.0.136
    XKBLAYOUT=fr
    SCREEN_02=shell
    SCREEN_03=shell
    SCREEN_04=shell
    SCREEN_05=shell
    SCREEN_06=shell
    SCREEN_07=ldm
    LDM_DIRECTX=True
    LDM_SYSLOG=True
    LDM_AUTOLOGIN=False
    #LDM_USERNAME=
    #LDM_PASSWORD=

Bon faisons un point

  • LOCALDEV active la gestion des supports de la station PXE , comme les lecteurs CD , clefs USB etc ...
  • SOUND active le son coté client PXE
  • NBD_SWAP active le swap par le réseau , sur le serveur LTSP , si vous l'activez , il ne faut pas oublier d'ajouter dans le fichier /etc/hosts.allow la ligne nbdswapd: ALL: keepalive
  • SYSLOG_HOST Permet de spécifier un serveur SYSLOG autre que le serveur hôte. par défaut, c'est le serveur Hôte
  • XKBLAYOUT Spécifie la disposition du clavier
  • SCREEN_0x Permet de définir le type de session par tty
  • LDM_DIRECTX Permet de limiter le chiffrement qu'au moment de l’authentification de la session ( permet de meilleurs perfs et stabilité )
  • LDM_SYSLOG Log les ouvertures de sessions dans le fichier SYSLOG à la place du fichier ldm.log
  • LDM_AUTOLOGIN Active ou non l'authentification automatique
  • LDM_USERNAME login utilisé pour l'authentification automatique
  • LDM_PASSWORD mot de passe utilisé pour l'authentification automatique

Voilà ... pas forcément besoin de plus d'infos ... la page de man est clair .

Configuration vip

Il est possible d'appliquer différents paramètres en fonction des clients PXE.

Pour les identifier, il faut spécifier une nouvelle section avec l'adresse MAC ( matériel ) du client concerné .

Par exemple, pour ma station Linutop ayant pour adresse mac 00:14:0b:80:33:68, nous allons créer une section comme ceci ( toujours dans le fichier lts.conf )

[00:14:0b:80:33:68]
        LDM_AUTOLOGIN=True
        LDM_USERNAME=login
        LDM_PASSWORD=mdp

Voilà l'authentification automatique sera effective sur cette station uniquement , les autres paramètres de la section default sont évidemment repris pour cette station.

1342786540_alert-square-red.png L'adresse mac de l'exemple peut normalement aussi s'écrire :14b:b80:33:68 mais ne sera pas valide pour ltsp, il faut absolument indiquer les 0

Bien après avoir modifier notre fichier lts.conf i lne nous reste plus qu'à mettre à jour l'image

ltsp-update-image -a classique

Mets du son!!

Bien que ce ne soit pas toujours nécessaire, il peut-être intéressant de pouvoir utiliser la sortie son de son client PXE.

Comme nous l'avons activé, dans le fichier lts.conf, autant en profiter.

Commençons par vérifier que le paquet pulseaudio est bien installé sur le serveur LTSP ( normalement oui si vous avez suivi le précédent tutoriel )

apt-get install pulseaudio

Enfin, nous allons nous chrooter dans la distrib minimaliste ( chargé sur le client PXE ) afin d'y installer quelques paquets .

chroot /opt/ltsp/classique
apt-get install libasound2 libesd-alsa0 alsa-oss alsa-base linux-sound-base aumix alsa-utils esound-clients libasound2-plugins

Un peu de configuration

cd /etc
touch aumixrc
echo "vol:84:84:P pcm:85:85:P line:0:0:P mic:0:0:P cd:0:0:P pcm2:85:85:P igain:0:0:P line1:0:0:P dig1:0:0:P" > aumixrc

Et on quitte le chroot

exit

Et voilà .. à vous la dernière PL de "David Guetta" ... ou pas ;)

Monte ta clef

Très pratique les clef USB, nous allons pas nous en priver ... Pour cela, comme le précise la doc, il nous faut utiliser fuse, installons le !

Toujours sur le serveur LTSP

 
apt-get install fuse-utils libfuse2 libx11-protocol-perl

On active le module

modprobe fuse

On peut vérifier la présence du module comme ceci :

lsmod fuse

Bien maintenant, il faut autoriser un ou plusieurs utilisateurs à utiliser fuse ( à monter des clef usb ou cd ) .

Imaginons, notre utilisateur toto, doit pouvoir monter sa clef ... il suffit juste de l'ajouter au groupe fuse comme ceci :

adduser toto fuse

Et voilà toto peut monter sa clef sur sa session de n'importe ou .

Conclusion

Bien, je vais en rester là pour cet article, j’espère qu'il servira plus d'un, n'hésitez pas à laisser un commentaire sur le sujet,

A bientôt ,

Ch.

12 juil. 2012

LTSP V5 et Debian Squeeze

logo-ltsp.png

LTSP ( Linux Terminal Server Project )

J'ai pour mission d'informatiser une zone de production de prés de 7000m2, après le câblage de la zone ( RJ45 10/100/1000 ), il m'a fallu trouver un moyen économique / facile à maintenir et surtout résistant à un environnement de production.

Installer des machines autonomes ( PC standard ) n'est donc pas la meilleure solution.

J'ai donc opté pour un système client-serveur, ou les clients dit (léger) n'ont besoin que d'une interface réseau compatible PXE, et d'une carte/chip. graphique pour l'affichage sur l’écran. ( et évidemment , le trio Ecran/clavier/souris ).

Pour ce qui est de la puissance nécessaire, la station gérant uniquement l'affichage ( dans mon cas ) un cpu type atom peut suffire ( C'est l'occasion de recycler les vielles machines qui trainent), n'importe quel client léger peut faire l'affaire .

Je parle, je parle , mais c'est quoi exactement LTSP ....

le principe est simple, d'un coté il y a un serveur ( relativement puissant, cette variante va dépendre du nombre de clients à gérer ), sur lequel vous devrez créer les comptes utilisateurs. De l'autre les clients léger, qui ne sont là que pour déporter l'affichage de la session utilisateur, enfin entre les deux parties un réseau 100/1000.

Plusieurs avantages à ce principe:

  • installation ou mise à jour à un seul endroit, pour l'enssemble des clients
  • Maintenant aisé ( juste un remplacement de matériel, pas de restauration necessaire )
  • Backup simplifié ( une seule origine )

Le Fonctionnement

Avant de vous expliquer comment monter un tel serveur, je vais vous présenter rapidement comment cela se passe entre le client et le serveur.

Commençons par un petit schéma de notre infra .. j'adore les schémas

ltsp-1.png

Nous avons donc un réseau avec un parc de clients légers, un serveur DHCP déjà existant, et enfin notre serveur LTSP, le tout, évidemment relié à l'aide d'un concentrateur de qualité 10/1000/1000.

Bon très bien, quand j'appuie sur le bouton "power" de mon client léger ... il se passe quoi

ltsp-2.png

Bon , détaillons tout ça ..

  1. La carte mère est alimentée, elle détecte ses périphériques, le bios indique que le boot commence via le LAN , ok je balance donc sur le réseau une requête afin que quelqu'un me réponde avec une IP à me donner et les instructions nécessaires à mon Boot système.
  2. Notre serveur DHCP reçoit évidemment cette requête ( comme toute les autres machines présentes sur le réseau ) lui attribut une adresse IP libre ainsi que les paramètres supplémentaires ( Adresse sur Serveur LTSP, Fichier image à charger ... ) que nous détaillerons plus tard
  3. Super nous voilà connecté et identifié sur le réseau, nous pouvons maintenant contacter le serveur LTSP et charger le fichier image via le protocole tftp ( ftp en mode udp )
  4. Le fichier image reçu ( avec les fichiers de conf qui vont avec ), il est chargé en mémoire ( en RAM ) et on continue notre chemin en lançant le système fraichement chargé .
  5. Le système chargé ( distribution debian minimaliste ) nous avons droit à un superbe écran de connexion ( graphisme customisable au passage ). Bien! identifions nous .. login ... mot de passe, notre système minimaliste tente donc à distance de se connecter avec le couple login mot de passe ( tout se fait en SSH, donc rien ne passe en clair à ce moment sur le réseau )
  6. L’authentification réussi on peut voir sur notre client léger, la session (Gnome par exemple) s'afficher. Il nous est alors possible de lancer n'importe quelle application avec la puissance du serveur, tout en étant sur une machine de plus de 10 ans.

Voilà grosso modo comment cela fonctionne avec LTSP . Bien! nous allons maintenant pouvoir aborder la mise en place du serveur, avec plus de facilité.

Environnement Graphique

Et oui .. fatalement il nous faut un environnement graphique sur notre serveur .. n'en n'ayant jamais installé sur aucun de mes serveurs, il m'a fallu commencer par là ...

apt-get install gnome gdm

Continuons ...

LTSP Server

Deux solutions s'offrent à nous à ce stade, soit nous installons le paquet ltsp-server-standalone, soit le paquet ltsp-server ...

Quelle est la différence vous aller me dire ...

C'est très simple, le paquet ltsp-server-standalone est un paquet "tout en un" c'est à dire qu'en plus de vous installer le serveur ltsp, il va aussi installer un serveur DHCP, et TFTP . Ayant dans mon cas un serveur DHCP en place, je vais installer le second paquet ltsp-server.. ( si vous n'en n'avez pas, installer le premier, la seule différence va être que votre DHCP sera sur la même machine que le serveur LTSP ).

Donc ( avec les paquets suggérés ):

apt-get install ltsp-server dnsmasq libasound2-plugins ltspfs ldm-server sdm pulseaudio-esound-compat esound-clients nas-bin ltsp-docs qemu-user-static syslinux-common

Système de fichier NFS

Le système de fichier de notre distribution minimaliste étant situé sur le serveur LTSP ( il n'est pas chargé en RAM ), ce dernier est monté nia NFS, il nous faut donc l'installer et configurer le fichier /etc/exports afin d'y ajouter le répertoire contenant notre système de fichiers.

apt-get install nfs-kernel-server
vim /etc/exports

Nous allons y ajouter la ligne suivante

/opt/ltsp *(ro,no_root_squash,async,no_subtree_check)

Nous pouvons ensuite relancer le service NFS

invoke-rc.d nfs-kernel-server restart

Tftp

Tout à l'heure j'ai parlé du serveur TFTP, utiliser par le client PXE pour charger le noyau minimaliste, et les quelques fichiers de conf ..

Installons le :

apt-get install atftpd

La configuration par défaut n'est pas valide, nous allons donc le reconfigurer.

Commençons par supprimer la ligne suivante du fichier /etc/inetd.conf

tftp            dgram   udp4    wait    nobody /usr/sbin/tcpd /usr/sbin/in.tftpd --tftpd-timeout 300 --retry-timeout 5 --mcast-port 1758 --mcast-addr 239.239.239.0-255 --mcast-ttl 1 --maxthread 100 --verbose=5 /srv/tftp

Puis reconfigurons le

dpkg-reconfigure atftpd

Gardez toutes les valeurs par défaut, sauf au moment ou il vous demande de spécifier la plage réseau ( indiquer la votre )

atftpd.png

Enfin, nous pouvons le relancer ...

invoke-rc.d openbsd-inetd restart

Ip Forwarding

Notre serveur va relayer les paquets de nos clients léger, nous devons donc activer l'ip forwarding

Pour le faire en "one shoot", sans redémarrer

echo "1" > /proc/sys/net/ipv4/ip_forward

Et pour que ce soit ... durable

mettez à 1 le paramètre net.ipv4.ip_forward du fichier /etc/sysctl.conf

L'image minimale

Bien maintenant que tout nos services sont Ok, on va pouvoir créer notre image minimale ainsi que le système de fichier, qui sera utiliser par notre client léger.

Pour accomplir cette tâche nous allons utiliser la commande

ltsp-build-client --arch i386 --chroot classique
  • --arch permet de spécifier une architecture pour notre client ( attention à ne pas l'oublier si votre serveur tourne avec une debian 64Bits et votre client en 32, par défaut l'architecture du serveur sera utilisé, tout comme la version du noyau linux à charger )
  • --chroot permet de nommer notre environnement minimaliste, par défaut le nom de l'architecture est utilisé "i386" ( vous noterez qu'il est possible d'utiliser plusieurs images différentes, avec des noms différents pour tel ou tel client léger )

Je vous laisse le loisir de parcourir la page de man de la commande pour le reste des paramètres, qui permettent par exemple de charger un noyau linux de la branche unstable, ou testing ou autre ... bref mettre la version de vôtre choix ( par défaut elle est identique à celle du serveur , squeeze dans mon cas ).

Une fois terminé, nous allons mettre à jour les clefs SSH entre notre serveur et l'environnement fraichement créé ( utilisé pour la liaison réseau client - serveur )

ltsp-update-sshkeys

DHCP

Et oui je ne vous ai pas encore parlé de cette partie essentiel au bon fonctionnement .

Comme nous l'avons vu, un client léger commence par chercher un serveur DHCP sur le réseau pour passer à la suite.

Dans mon exemple, le serveur LTSP possède l'adresse 10.0.0.221, et le serveur DHCP 10.0.0.8

Afin de structurer la configuration au niveau du DHCP, nous allons créer un fichier spécifique pour les clients léger , puis le déclarer dans le fichier de configuration principale du serveur DHCP

Commençons par créer ce fameux fichier

touch /etc/ltsp/dhcpd.conf

Puis on le déclare dans notre configuration principale du DHCP

vim /etc/dhcp3/dhcpd.conf

Et on y ajoute à la fin :

include "/etc/ltsp/dhcpd.conf";

Bien, revenons au contenu du fichier /etc/ltsp/dhcpd.conf

Nous allons créer un groupe afin de pouvoir déclarer des paramètres pour l'enssemble des clients, voici un exemple que vous pouvez utiliser en adaptant les ip et adresses MAC:

group {
#Système de fichier à monter
option root-path "/opt/ltsp/classique";
#Adresse du serveur LTSP
next-server     10.0.0.221;
#Fichier image à charger
if substring( option vendor-class-identifier, 0, 9 ) = "PXEClient" {
filename "/ltsp/classique/pxelinux.0";
} else {
filename "/ltsp/classique/nbi.img";
}
#Client leger Dell
host pxeDell {
hardware ethernet 00:14:0b:80:e5:1a;
fixed-address   10.0.0.101;
}
#Client leger HP
host pxeHP {
hardware ethernet 00:16:17:5e:57:ec;
fixed-address   10.0.0.102;
}
#Client de test
host pxeTest {
hardware ethernet 00:14:67:e5:57:ab;
fixed-address   10.0.0.103;
filename "/ltsp/unstable/pxelinux.0";
option root-path "/opt/ltsp/unstable";
}
}

Dans ce groupe nous commençons par spécifier le système de fichier par défaut à monter, l'image à charger et l'adresse du serveur LTSP , vient ensuite la déclaration des clients PXE, identifié par un nom , une ip et une adresse MAC.

Il est possible de spécifier une autre image ou un autre système de fichier à monter pour un poste particulier, ex : host unstable qui chargera l'image nommée unstable ( souvenez-vous , l'option --chroot de la commande ltsp-build-client )

Nous n'avons plus qu'à redémarrer notre serveur DHCP, et tester avec un des client léger paramétré ci-dessus.

invoke-rc.d dhcp3-server restart

Premier Test

Il suffit d'appuyer sur le bouton "power" et normalement .... vous devriez découvrir ceci

N'hésitez à poster vos commentaires sur le sujet, nous verrons dans le prochain article, comment monter une clef usb ou un CD à partir du client léger, ou encore y faire passer le son, nous verrons aussi comment configurer les client PXE de façon globale ou pour un client unique.

Bref ... vous n'avez pas fini avec ce sujet :) restez à l'écoute .

Ch.

17 juin 2012

la calme dans mon terminal

Stop aux bips

Si vous aussi souhaitez ne plus entendre le "bip" lorsque depuis vôtre terminal vous générez un caractère « \a » (ASCII=7), par exemple lorsque vous appuyez plusieurs fois sur la touche Tab pour l'auto-complétion, alors voilà une solution toute simple et efficace .

cd ~
echo "set bell-style none">> ~/.inputrc

Voilà pour ce micro billet du dimanche :)

Christophe.

- page 2 de 8 -