Category Archives: Trucs et Astuces

Installer docker sous debian wheezy

Cet article à pour but de décrire comment installer docker sous debian wheezy. Cela n’est pas aussi facile que prévu (j’ai eu des petits soucis avec cgroup)

1 – Installer un kernel > 3.8
Tout d’abord le noyau de debian wheezy n’est pas assez récent pour supporter docker. Heureusement, les backports sont là pour remédier à cela.
Ajouter la ligne suivante dans le fichier /etc/apt/sources.list puis lancer un aptitude update

deb http://http.debian.net/debian wheezy-backports main contrib non-free

Installer le noyau venant des backports :

aptitude install -t wheezy-backports linux-image-amd64

2 – Installer docker
L’installation s’effectue à partir du binaire docker

wget https://get.docker.com/builds/Linux/x86_64/docker-latest -O docker
chmod +x docker

Installer cgroup :

aptitude install cgroup-bin

3 – Lancer docker au boot
Créer le fichier /etc/init.d/docker avec le contenu ci-dessous :

#!/bin/bash
 # /etc/init.d/docker
 #
 ### BEGIN INIT INFO
 # Provides: docker
 # Required-Start: $local_fs $remote_fs $network vboxdrv
 # Should-Start:
 # Should-Stop:
 # Required-Stop:
 # Default-Start: 2 3 4 5
 # Default-Stop: 0 1 6
 # X-Interactive: true
 # Short-Description: Start docker
 # Description: Start docker
 ### END INIT INFO

 #
 # main part
 #
 #PATH=/sbin:/usr/sbin:/usr/bin:/bin
 LOG=/var/log/mydocker.log
DOCKER_CMD_RUN="PATH_TO_DOCKER_BINARY -d &"

cgroupfs_mount() {
 # see also https://github.com/tianon/cgroupfs-mount/blob/master/cgroupfs-mount
 if grep -v '^#' /etc/fstab | grep -q cgroup \
 || [ ! -e /proc/cgroups ] \
 || [ ! -d /sys/fs/cgroup ]; then
 return
 fi
 if ! mountpoint -q /sys/fs/cgroup; then
 mount -t tmpfs -o uid=0,gid=0,mode=0755 cgroup /sys/fs/cgroup
 fi
 (
 cd /sys/fs/cgroup
 for sys in $(awk '!/^#/ { if ($4 == 1) print $1 }' /proc/cgroups); do
 mkdir -p $sys
 if ! mountpoint -q $sys; then
 if ! mount -n -t cgroup -o $sys cgroup $sys; then
 rmdir $sys || true
 fi
 fi
 done
 )
 }

case "$1" in
 start)
 echo `date` echo "Starting docker" >> $LOG
 cgroupfs_mount
 eval $DOCKER_CMD_RUN
 ;;
 stop)
 echo `date` "Stopping docker" >> $LOG
 killall docker
 ;;
 esac

Le script fourni permet de lancer docker avec SysV init. Il faut l’ajouter au boot via la commande

update-rc.d docker defaults

La fonction cgroupfs_mount permet de monter les filesystems cgroup afin d’éviter l’erreur suivante : docker failed to find the cgroup root

Voir stackoverflow si besoin : https://github.com/docker/docker/issues/8791

Changer le répertoire de mysql sous debian wheezy

Voici un petit script avec quelques explications pour changer le répertoire de mysql (datadir) sous debian wheezy.

Explications :

La ligne permettant de changer le répertoire des données de mysql est la ligne contenant datadir dans le fichier /etc/mysql/my.cnf

datadir  = /app/mysql

Une fois cette ligne modifiée, il faut réinstaller la base de données. Redémarrer simplement mysql ne fonctionne pas. La commande mysql_install_db est prévue à cet effet. Elle crée les fichiers et dossiers nécessaires dans le nouveau répertoire.

Après cela, le redémarrage de mysql fonctionnera. Cependant, un message d’erreur apparaitra. La réinstallation de la base n’a pas conservé l’utilisateur dédié à la maintenance

Message d’erreur au lancement de mysql

ERROR 1045 (28000): Access denied for user 'debian-sys-maint'@'localhost' (using password: YES)

La solution consiste à créer l’utilisateur demandé en récupérant le mot de passe dans le fichier /etc/mysql/debian.cnf

Script shell :

#!/bin/bash
/etc/init.d/mysql stop
# Install database in directory configured in my.cnf
mysql_install_db
# Restart mysql
/etc/init.d/mysql start
#Get password from config file
MYSQL_PWD_DEBIAN=`grep password /etc/mysql/debian.cnf | cut -d= -f2 | head -n 1 | tr -d ' '`
echo "Password for debian-sys-maint = $MYSQL_PWD_DEBIAN"
# Create debian user
mysql -u root -e "GRANT ALL PRIVILEGES ON *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY '$MYSQL_PWD_DEBIAN';"

Couleur dans le shell linux

Voici la configuration que j’utilise pour colorer le promp de mes debian wheezy. Le prompt sera bleu pour un utilisateur et rouge en tant que root.

prompt

Etape 1 : commenter toutes les références à PS1 dans le fichier ~/.bashrc de l’utilisateur
Etape 2 : ajouter à la fin du fichier /etc/bash.bashrc les lignes suivantes :

if [ $EUID == 0 ] ; then
        PS1='\[\033[01;31m\]\u@\h\[\033[01;31m\] \W \$\[\033[00m\] '
else
        PS1='\[\033[01;34m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\] '
fi

Configuration pour rebond ssh (putty, winscp et .config linux)

Voici une configuration pour atteindre la machine B sachant que :

  • il n’existe pas d’accès direct à la machine B depuis l’extérieur
  • la machine B héberge un serveur ssh sur le port 22
  • la machine A dispose d’un accès sur l’extérieur via l’adresse public.no-ip.org
  • la machine A héberge un serveur ssh sur le port 443

rebonds_ssh

Putty

Dans le panel « session », le hostname est l’ip de la machine B vue depuis la machine A. De même pour le port qui est le port du serveur ssh vu depuis la machine A.

putty_session

Dans le panel proxy, le hostname est celui de la machine A vu depuis le client. Idem pour le port.
Commande dans l’input Telnet : C:\Program Files (x86)\PuTTY\plink.exe jerep6@%proxyhost -P %proxyport -agent -nc %host:%portputty_proxy

WinSCP

A l’instar de putty, le nom d’hôte et le port sont les configurations vues depuis la machine A.

winscp_session

Le panel proxy et identique à celui de putty, il représente la configuration de la machine A vue depuis le client.winscp_proxy

Commande dans l’input proxy local : C:\Program Files (x86)\PuTTY\plink.exe jerep6@%proxyhost -P %proxyport -agent -nc %host:%port

Linux

La solution retenue est d’utiliser ProxyCommand dans la configuration de SSH. Il faut que la machine hôte dispose de netcat.

Contenu du fichier ~/.ssh/config du poste client

Host machineA
  User jerep6
  Port 443
  HostName public.no-ip.org

Host machineB
  User jerep6
  ProxyCommand ssh -q svr nc -q0 %h 22

Commande de connexion : ssh machineB

XPEnology

 

Je viens de découvrir que l’OS de Synology est en partie open source. En effet, Synology met a disposition sur sourceforge les sources de ses NAS ainsi que le DSM tool chains. Grâce à cela une build alternative a vu le jour : XPEnology

Installation XPEnology

J’ai installé le DSM 4.3 sur une machine virtuelle (virtualbox). Je ne détaille pas l’installation du DSM car cette dernière est particulièrement bien décrite dans ces tutoriaux :

Néanmoins, voici quelques points importants :

Contenu de l’archive :

  • synoboot-trantor-4.3-3810-v1.0.img : image de boot émulant le hardware d’un NAS synology
  • XPEnology_trantor_v1.0_DSM_DS3612xs_3810.pat : fichier d’installation du DSM

Convertir le fichier .img de l’archive en format virtuelbox :

VBoxManage convertdd fichier.img fichier.vdi

Disque dur de la VM

Il ne faut pas oublier d’allouer un disque à la VM d’une taille supérieure à 5 GO. Ce disque servira à installer le DSM et tous les fichiers nécessaires à son fonctionnement.

Voici le partitionnement qui sera effectué par l’assistant d’installation.

ddgparted

Contenu de /dev/sdb1 (partition contenant le système)dddsmContenu de /dev/sdb3 (partition contenant les données)
dddonnees

 

Sudo et le path

Problème : L’exécution d’une commande par son simple nom via sudo peut parfois provoquer l’erreur suivante : command not found. Cela se produit quand l’éxécutable n’est pas dans le path « standard »

Cas concret : Grâce à l’enrichissement de son path dans le fichier ~/.bashrc, l’utilisateur jerep6 peut exécuter des scripts de situant dans le dossier /home/jerep6/bin/.

PATH=$PATH:$HOME/bin

Exemple :

$ mon_script1 10 50
somme=60

Si l’utilisateur souhaite exécuter ce même script avec sudo, il devra saisir le chemin absolu ou relatif d’accès au fichier.

$ sudo mon_script1 10 50
[sudo] password for jerep6:
sudo: mon_script1: command not found

$ sudo bin/mon_script1 10 50
bin/mon_script1: line 79: mon_script2.sh: command not found

En indiquant le chemin, le script « mon_script1 » est bien exécuté, mais produit une erreur car il appelle « mon_script2 » qui lui n’est pas trouvé. J’ai en effet utilisé le nom de la commande qui est supposée être dans le path.

Explications :
Sudo n’utilise pas le path de l’utilisateur mais son propre path qui ne contient pas /home/jerep6/bin/

Sur debian squeeze, sudo est compilé avec le flag –with-secure-path. Ainsi lorsque l’utilisateur exécute une commande avec sudo, le path pris en compte est le secure-path :
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

Il est possible de le redéfinir en renseignant le fichier /etc/sudoers via la commande visudo :

Defaults        secure_path=/usr/bin

Il existe plusieurs possibilités pour manipuler le path de sudo. Voici celles que j’ai testées :

  1. Désactiver le secure_path. Le path sera celui de l’utilisateur. Cela peut toutefois poser des problèmes si les commandes présentes dans le script ne sont pas dans le path de ce dernier mais dans celui de root (/sbin par exemple).
  2. Modifier le secure_path. Le secure path permet d’avoir un PATH « propre » pour exécuter les applications nécessitant les droits d’administration.
  3. Jouer avec exempt_group. Tous les utilisateurs du groupe spécifié seront déchargés de la saisie du mot de passe et du secure_path
  4. Passer l’argument « -i » à sudo. Cela a pour effet de simuler une connexion. Cela signifie que les fichiers .profile, .bashrc ou .login seront lus par le shell. Les variables DISPLAY et TERM ne sont pas modifiée. En revanche, HOME, MAIL, SHELL, USER, LOGNAME et PATH sont positionnées. Le path est donc celui de l’utilisateur root et pas celui de secure_path
  5. Passer l’argument « -s » provequera l’exécution de /root/.bashrc (idem que -i) mais pas le profile. Le path sera celui de secure_path. Il est donc possible d’enrichir le secure_path dans le .bashrc

Connaitre le path utilisé par sudo :

sudo sh -c 'echo $PATH'
→ path de sudo

La commande précédente donne donne le path de sudo tandis que la suivante renvoie celui de l’utilisateur car le shell évalue (expands) la variable $PATH avant que sudo ne soit exécuté.

sudo echo $PATH
→ path de l'utilisateur et non celui de sudo

Firefox raccourcis de recherche

Voici une petite astuce permettant de rechercher à partir de la barre d’adresse via le pattern suivant : raccourci_moteur_de_recherche mot_recherché

Pour cela, il suffit de :

  1. Placer une recherche en marque page. Par exemple http://www.wordreference.com/enfr/house
  2. Ouvrir les propriétés du marque page
  3. Identifier le mot recherché (ici house) et le remplaçer par %s
  4. Ajouter un mot clé au marque page (ici w)
  5. Sauvegarder le marque page

Vous pouvez à présent chercher sur le site wordreference en tapant dans la barre d’adresse ceci : w road. Vous serez redirigés vers la page suivante.

Exemple d'un marque page de recherche

Deferred in jQuery

Async JavaScript

Sample du livre Async Javascript de Trevor Burnham. Présentation complète des objets différés en jQuery.
Télécharger l’extrait du livre (en) : asyncjs-sample

Advantages of promises

At first glance, calling .done() and .fail() doesn’t seem any more useful than the callback syntax we used previously. However, the promise methods offer several advantages. First, the methods can be called multiple times to add more than one handler if desired. Second, if we store the result of the $.ajax() call in a variable, then we can attach the handlers later if that makes our code structure more readable. Third, the handlers will be invoked immediately if the Ajax operation is already complete when they are attached. Finally, we should not discount the readability advantage of using a syntax that is consistent with other parts of the jQuery library.

source : http://www.packtpub.com/article/learning-jquery

KDM lancer un script / commande avant le login

Besoin : Ralentir le ventilateur de ma carte graphique NVIDIA le plus tôt possible.

Solution : lancer la commande nvlock après le lancement de KDM.
Il faut en effet que le pilote graphique (propriétaire) soit chargé pour que nvlock ait accès à l’extension NV-CONTROL. Le plus simple est d’exécuter nvlock avant le login. Pour cela, il faut rajouter la commande souhaités dans le fichier Xsetup de kdm ; elle sera exécutée en tant que root.

Sous archlinux : vim /usr/share/config/kdm/Xsetup

! /bin/sh
# Xsetup - run as root before the login dialog appears
nvclock -f -F 10

Keybinding bash

Pour que les touches page up/down lancent une recherche dans l’historique bash il faut éditer le fichier /etc/inputrc ou  ~/.inputrc

"\e[5~": history-search-backward 
"\e[6~": history-search-forward