Installation Asterisk sur Raspberry Pi

Introduction

Un certain nombre de motivations peuvent vous inciter à installer un système téléphonique PBX Asterisk à la maison:

Ce document se propose donc de fournir une description, parmi tant d'autres, d'une installation du logiciel asterisk sur une carte, tout à fait adaptée à ce genre d'exercice, comme le Raspberry PI.

Le choix du matériel

Le choix du matériel dépend du besoin qui est relativement limité dans une maison d'habitation avec une ligne RTC, une ligne SIP, un à 2 postes téléphoniques, un en haut et un en bas, ceci se réduit en un poste avec un téléphone DECT à plusieurs combinés. On pourrait penser à héberger tout cela sur un modem/routeur qui reste allumé en permanence, mais en fait cette solution n'est pas très adaptée car les modems sont déjà bien chargés, pas toujours ouverts, et vraiment limités par rapport à une carte comme le Raspberry Pi.

Le choix s'est fixé sur un Raspberry Pi parce qu'il est facile à approvisionner, que pour l'instant je n'ai pas trouvé moins cher et que je pensais trouver quelque chose de nouveau, mais de ce coté on nage vraiment en terrain connu.

Maintenant il existe des solutions d'IP-PBX toutes faites et prêtes à l'emploi comme IcallDroid, AtCom, etc...Il peut être utile de les considérer si ne veut pas passer trop de temps et mettre les mains dans le cambouis. Mais ce n'est pas mon cas et je ne choisis pas forcément la solution la plus simple...

La méthode pour Asterisk

Un logiciel comme Asterisk présente toujours une complexité, surtout si c'est la première fois qu'on l'aborde, il faut commencer par comprendre les concepts pour mieux les utiliser. Pour cela, un livre comme Asterisk: the definitive guide (fourth edition) est très utile, si ce n'est indispensable.

Le livre s'appuye sur la version 11 du logiciel. Eh oui, il y a aussi un certain nombre de versions, de quoi dérouter. On va donc s'installer la version 11. Mais avant, il faut faire le choix de l'OS, le livre décrit l'installation sur RHEL et Ubuntu, on va donc choisir Archlinux.

Ici encore on aurait pu choisir une solution plus compléte comme raspbx qui est une association de Raspian, Asterisk et Free-Pbx qui est une interface pour configurer Asterisk. Mais comment voulez vous configurer un produit que vous ne connaissez pas avec une interface que vous ne connaissez pas, qui n'est pas documentée sous prétexte que tout ce qui est présenté sur un écran est intuitif. On essaie de cacher un problème et on ramène un autre. Personnellement je préfére modifier la valeur des champs avec un éditeur de texte dans un fichier documenté, que des champs non documenté sur une page d'écran.

L'Operating System: choix et préparation du disque

Avant d'installer Asterisk, il faut, bien sûr, installer l'operating system et ici, pour une fois, on a le choix entre Linux et Linux et encore pas tous. L'architecture du processeur étant de l'ARMv6 n'est pas supportée par toutes les distributions entre autres RHEL et Ubuntu du livre. Par contre elle est supportée par Archlinux une distribution sobre, bien documentée et ne modifiant pas les fichiers de configurations des applications.

La première chose à faire, c'est de télécharger une image ArchLinuxARM-2014.01-rpi.img.zip (vous ne trouverez sans doute pas celle-ci, mais une plus récente) soit sur le site http://www.raspberrypi.org/downloads/ soit http://os.archlinuxarm.org/os/rpi/.

Sachant qu'une image est la copie d'un disque mise dans un fichier, l'installation consiste, après un unzip, à copier le contenu du fichier sur le disque cible qui est la carte SD qui va s'insérer dans le support du Raspberry Pi.

unzip ArchLinuxARM-2014.01-rpi.img.zip
dd if=ArchLinuxARM-2014.01-rpi.img of=/dev/sdb

Ceci se fait sur PC linux. Vous n'avez pas Linux, votre OS a certainement une commande pour faire la même opération. La première commande décompresse (unzip) le fichier, la deuxième copie l'image vers le disque (ici /dev/sdb pour l'exemple, à remplacer impérativement par le nom de votre disque). Copier l'image veut dire partitionner le disque et y copier les fichiers en une seule commande. Cette commande écrase le contenu précédent du disque. Sur linux, il y a toujours une incertitude sur le nom du disque inséré, il est prudent de le vérifier avec la commande dmesg ou blkid. Ici une erreur est fatale pour le contenu du disque. Une autre erreur à éviter: il faut donner le nom du disque /dev/sdb et non pas le nom de la partition /dev/sdb1.

Pendant que l'on y est, il y a une autre manipulation à faire pour récupérer le volume inutilisé de la carte SD. Après la copie de l'image seul 2 Go sont utilisés, si votre carte fait 8 Go, vous en perdez les 3 / 4. Voici l'état du disque:

# fdisk /dev/sdb

Welcome to fdisk (util-linux 2.24.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): p
Disk /dev/sdb: 7.3 GiB, 7803174912 bytes, 15240576 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x417ee54b

Device    Boot     Start       End  Blocks  Id System
/dev/sdb1           2048    186367   92160   c W95 FAT32 (LBA)
/dev/sdb2         186368   3667967 1740800   5 Extended
/dev/sdb5         188416   3667967 1739776  83 Linux

La manipulation consiste à supprimer la dernière partition puis à créer une nouvelle avec les valeurs par défaut. Ceci se fait avec le commande fdisk. Rien n'est modifié, tant qu'on n'a pas appuyé sur w.

fdisk /dev/sdb
d                # tapez d suivi d'entrée suppression de la partition
5                # la partition 5 est proposée appuyer sur entrée 
d                # tapez d suivi d'entrée suppression de la partition
2                # la partition 2 est proposée appuyer sur entrée 
n                # tapez n suivi d'entrée création d'une nouvelle partition
e                # tapez e suivi d'entrée création d'une partition étendue
2                # la partition 2 est proposée appuyer sur entrée 
186368           # le block de départ est proposé appuyer sur entrée
15240575         # le block de fin est proposé appuyer sur entrée
n                # tapez n suivi d'entrée création d'une nouvelle partition
l                # tapez l suivi d'entrée  partition logique
5                # la partition 5 est proposée appuyer sur entrée
188416           # le block de départ est proposé appuyer sur entrée
15240575         # le block de fin est proposé appuyer sur entrée
w                # tapez w suivi d'entrée  écriture de la table sur le disque

On a modifié la table des partitions, il faut encore redimensionner le filesystem.

resize2fs /dev/sdb5

finition de l'installation de Archlinux

La carte SD peut être installée sur la carte Raspberry Pi. On connecte la carte au réseau ethernet par un cable rj45. On alimente la carte et elle boote en quelques secondes, elle s'adresse au routeur pour avoir une adresse ip. Vous pouvez consulter le routeur pour connaitre cette adresse. On se connecte alors à la carte avec la commande ssh sur le compte root avec le mot de passe root:

ssh 192.168.1.65 -l root

Nous voila connecté au Pi avec seulement 2 accessoires: la carte SD et le cordon rj45, bravo et merci ArchLinux. Mais il reste quelques ajustages à faire.

Changer le mot de passe root
passwd
Créer un fichier swap
fallocate -l 200M /var/swap
chmod 600 /var/swap
mkswap /var/swap
swapon /var/swap

Rajouter la ligne suivante dans le fichier /etc/fstab:

/var/swap       swap            swap    defaults        0       0
Positionner l'heure locale
ln -sf /usr/share/zoneinfo/Europe/Paris /etc/localtime
Positionner les paramètres régionnaux

Sélectionner les locales utilisées dans le fichier /etc/locale.gen et les générer:

locale-gen
Fixer l'adresse IP de la carte

La carte obtient son adresse IP par dhcp sur le réseau. C'est très bien, laissons le continuer, mais en se connectant sur la page DHCP du modem/routeur on peut affecter une adresse IP fixe à une adresse MAC donnée.

Le modem routeur utilise dnsmasq comme relai et cache dns pour le réseau local. Dnsmasq lit le fichier /etc/hosts au démarrage. Donc si on introduit dans ce fichier /etc/hosts les adresses ip et les noms des machines correspondantes du réseau local, la résolution des noms se fera pour ces machines.

Créer quelques utilisateurs

Un compte pour soi et un pour asterisk. On en profite pour installer le répertoire ~/.ssh et la clé publique permettant l'accés à distance sans mot de passe.

useradd asterisk
passwd asterisk

Installation d'Asterisk

Le livre recommande d'installer Asterisk à partir des sources. C'est ce que l'on va faire.

Le système de compilation natif est, sans doute, préférable au système de compilation croisé. En effet le Raspberry Pi est suffisemment puissant pour fournir un temps de compilation décent.

En se logguant root, il est peut être nécessaire de compléter le système, si ce n'est pas déja fait, pour la compilation d'asterisk:

# pacman -Syu
# pacman -S gcc make wget subversion libxml2 ncurses openssl sqlite \
           libnewt linux-raspberrypi-headers

Créer un répertoire et y installer les derniers sources de la version 11 qui est recommandée par le livre. Dans le livre, on trouvera un topo sur le versionnement de Asterisk qu'il est utile de comprendre.

$ mkdir -p ~/src/asterisk-complete/asterisk
$ cd ~/src/asterisk-complete/asterisk
$ svn co http://svn.asterisk.org/svn/asterisk/branches/11

Lancer la compilation qui dure un moment, puis l'installation:

$ cd ~/src/asterisk-complete/asterisk/11
$ ./configure

$ make
$ sudo make install
$ sudo make config

Changer les droits des répertoires utilisés par asterisk:

# chown -R asterisk.asterisk /var/lib/asterisk/ \
        /var/spool/asterisk/ /var/log/asterisk/ /var/run/asterisk/

# mkdir -p /etc/asterisk
# chown asterisk.asterisk /etc/asterisk

# cp ~/src/asterisk-complete/asterisk/11/configs/indications.conf.sample \
       /etc/asterisk/indications.conf
# cp ~/src/asterisk-complete/asterisk/11/configs/asterisk.conf.sample \
      /etc/asterisk/asterisk.conf

Il est recommandé de positionner les variables suivantes du fichier /etc/asterisk/asterisk.conf:

runuser = asterisk
rungroup = asterisk

En suivant les indications du livre créer les fichiers:

Afin de permettre le démarrage automatique de Asterisk au démarrage du système, créer un fichier asterisk.service dans le répertoire /etc/systemd/system avec les informations suivantes:

Description=Asterisk PBX
Documentation=man:asterisk(8)
Wants=network.target
After=network.target

[Service]
Type=forking
PIDFile=/var/run/asterisk/asterisk.pid
ExecStart=/usr/sbin/asterisk
Restart=on-abort

[Install]
WantedBy=multi-user.target

Activer le service avec la commande:

# systemctl enable asterisk.service

Les voix en français

L'installation des voix en français semble indispensable, la majorité des utilisateurs parlant le français. Pour cela, il existe un paquet archive Prompt.FR.AF.Ver.2.1.GSM.Released.tar.gz que l'on peut télécharger sur ce lien et qui contient les messages vocaux d'Asterisk en français. Ces messages sont d'une qualité remarquable et ont été enregistrées par Aurélie Bassart, que je remercie au passage.

Si vous installez l'archive, il y aura quelques manipulations à faire sur les répertoires. Pour éviter cela, je mets une copie à télécharger (voir dans le paragraphe Download plus bas) et extraire dans le répertoire /var/lib/asterisk/sounds.

Pour écouter les fichiers .gsm sur son PC Linux, on peut utiliser la commande play du paquet sox.

play day-4.gsm

Il peut être nécessaire d'éditer un message vocal. On pourrait, bien sûr, l'enregistrer, mais pour rester homogène avec les autres messages, on peut découper des morceaux dans les fichiers existants, puis les réassembler, avec un outil comme audacity. Mais audacity ne sait pas lire directement les fichiers .gsm, il faut d'abord les convertir en .wav. Les 2 commandes suivantes permettent de convertir de gsm à wav, puis de wav à gsm:

sox day-4.gsm -e signed-integer day-4.wav
sox -t ul day-4.ulaw -c1 -r 8000 day-4.gsm

Configurer Asterisk

Tout ce qui a été fait jusqu'à présent permet de démarrer Asterisk, mais il ne fera pas grand chose, il faut encore le configurer et c'est l'objet de la page configuration d'asterisk.

Le boitier

C'est bien d'avoir une carte Raspberry Pi. C'est mieux quand on peut le ranger. Voici donc un beau boitier sorti tout droit de la poubelle juste au bon moment. C'est un adaptateur TNT que je n'ai même pas testé. L'alimentation, fonctionnant correctement, sert donc à alimenter le Pi, car croyant avoir des adaptateurs avec le bon connecteur, je n'ai pas acheté l'alimentation spéciale pour le Pi. Et je vous laisse deviner que mes connecteurs ne convenaient pas au moment de les brancher.

Le circuit imprimé du boitier d'origine a été débarrassé de ses composants, excepté ceux de l'alimentation. Pour ce faire, un pistolet à air chaud, genre décolleur de peinture, fait très bien l'affaire.

L'alimentation se trouve à gauche sur la photo.

Vient ensuite la carte de décodage de téléinformation du compteur d"électricité. Bien que n'ayant rien à voir avec Asterisk, elle est là pour être couplée au Raspberry Pi et fonctionner en permanence Cette carte est décrite dans le document carte de décodage de téléinformation

Reset du Raspberry Pi

Il faut noter que l'arrêt du Raspberry Pi est assez délicat. L'arrêt par coupure de l'alimentation peut être désastreux pour le contenu de la carte SD.

Pour l'arrêt en temps normal, il est conseillé d'utiliser la commande systemctl stop puis couper l'alimentation.

Pour les cas d'urgence, il est conseillé d' utiliser le reset du Raspberri Pi situé sur le connecteur P6-1 (RP B, pin la plus près du bord de la carte) que l'on aura relié à un bouton poussoir accessible, l'autre pôle du poussoir étant relié au 0 Volt. En effet, après une coupure de courant, le RPi ne démarre pas tout seul, il faut alors appuyer sur la touche reset.

schéma de l'alimentation

Quelques consommations

Vous trouverez la comsommation du Rasperry Pi et de son alim sur cette page: Quelques consommations d'appareils domestiques.

Download

Références

Les sites et documents traitant de l'installation d'Asterisk sont assez nombreux. En voici quelques uns qui m'ont inspirés.

  1. Asterisk for Raspberry Pi on ArchLinux.
  2. Configuration des équipements Linksys type SPA3102, PAP2, PAP2T et ASTERISK (ELASTIX distribution)..
  3. Asterisk France, si vous aimez chercher..