cultipi_install - bulck/bulcky GitHub Wiki

Introduction

La procédure suivante permet d'installer manuellement un système Cultipi sur un Raspbery Pi fraîchement acquis.

Installation du système de base

Installation sous Linux /Mac Os X

  • Télécharger l'image Raspbian de base qui servira de système à la Cultipi:
http://files2.linuxsystems.it/raspbian_wheezy_20140726.img.7z
  • Décompresser l'image:
7za x raspbian_wheezy_20130923.img.7z
  • Brancher la carte SD qui va recevoir le système, démonter les partitions déjà présentes puis lancer la commande:
dd bs=4M if=raspbian_wheezy_20130923.img of=/dev/sdX

Remarque: /dev/sdX correspond au device de la carte SD qui va recevoir le système. Il faut préciser le device dans son intégralité et non pas une partition, par exemple: /dev/sdb et non pas /dev/sdb2

  • Une fois la copie terminée, il est possible de redimensionner les partitions pour utiliser tous l'espace de la carte SD. Dans ce cas la il faudra déplacer la partition swap après toutes les autres partitions. Il est possible d'utiliser gparted pour réaliser cela.

  • Réintroduire la carte SD dans le Raspberry et brancher l'alimentation.

  • La connexion sur le Raspberry se fait grâce à un écran/clavier branché ou alors par SSH. Par défaut si vous branchez un câble Ethernet le Raspberry obtiendra une adresse IP depuis votre Box. Il vous est alors possible de vous connecter par SSH ou directement depuis la console:

Login: pi
Password: raspberry

ou

Login: root
Password: raspberry

Installation sous Windows

  • Télécharger l'image Raspbian de base qui servira de système à la Cultipi:
http://files2.linuxsystems.it/raspbian_wheezy_20140726.img.7z
  • Décompresser l'image à l'aide d'un outil (par exemple 7-zip)

  • Pour installer l'image, il faut télécharger Win32DiskImager ( http://sourceforge.net/projects/win32diskimager/) et l’exécuter en administrateur après avoir branché sa carte SD. Une fois exécuté, le logiciel permet de choisir l'image à copier puis la lettre correspondant à la carte SD. Il suffit ensuite de cliquer sur le bouton "write" pour lancer la copie.

  • Une fois la copie terminée, il est possible de redimensionner les partitions pour utiliser tous l'espace de la carte SD. Dans ce cas la il faudra déplacer la partition swap après toutes les autres partitions. Il est possible d'utiliser gparted pour réaliser cela.

  • Réintroduire la carte SD dans le Raspberry et brancher l'alimentation.

  • La connexion sur le Raspberry se fait grâce à un écran/clavier branché ou alors par SSH. Par défaut si vous branchez un câble Ethernet le Raspberry obtiendra une adresse IP depuis votre Box. Il vous est alors possible de vous connecter par SSH ou directement depuis la console:

Login: pi
Password: raspberry

ou

Login: root
Password: raspberry

Personnalisation de l'image

  • Configuration apt avec le dépôt Cultibox:
cat << EOF > /etc/apt/sources.list.d/cultibox.list
deb http://www.greenbox-botanic.com/cultibox/repository/armhf/ binary/
EOF
  • Mise à jour du système:
apt-get update
apt-get upgrade
  • Reconfiguration du clavier, des locales et du timezone:
apt-get install keyboard-configuration	
dpkg-reconfigure locales 
dpkg-reconfigure tzdata
  • Installation des packages utilitaires:
apt-get install sudo localepurge vim libnss-mdns avahi-daemon tcl ifplugd fswebcam bootlogd zip unzip unrar-free ttf-mscorefonts-installer tcl-tls 
  • Modification de cron.daily:

Modifier l'heure de lancement du cron.daily qui servira pour les mises à jours:

vi /etc/crontab

et modifier la ligne du cron.daily comme suit:

25 4    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
  • Configuration de SSH:

Editer le fichier /etc/ssh/sshd_config et décommenter la ligne:

PasswordAuthentication yes

Relancer le service:

service ssh restart

Editer le fichier /etc/ssh/ssh_config et ajouter les lignes suivantes à la fin:

    StrictHostKeyChecking no
    UserKnownHostsFile /dev/null
    ServerAliveInterval 60
  • Ajout de l'utilisateur Cultipi, suppression de l'utilisateur pi:
adduser cultipi
deluser pi
  • Personnalisation des règles udev pour le réseau:
rm /etc/udev/rules.d/70-persistent-net.rules
mv /lib/udev/rules.d/75-persistent-net-generator.rules /lib/udev/75-persistent-net-generator.rules.disabled
  • Configuration du nom de l'hôte:
cat << EOF > /etc/hostname
cultipi
EOF
vi /etc/hosts

Modifier la ligne commençant par 127.0.0.1 pour qu'elle ressemble à ceci:

127.0.0.1 localhost cultipi
  • Désactivation des modules inutiles :
echo "blacklist pcm512x" >> /etc/modprobe.d/fbdev-blacklist.conf
  • Configuration des options du module uvcvideo:
echo "options uvcvideo nodrop=1 timeout=5000 quirks=0x80" > /etc/modprobe.d/uvcvideo.conf
  • Remplacement du système de logs par syslogd qui consomme moins de ressources:
apt-get -y remove --purge rsyslog
apt-get -y install inetutils-syslogd
  • Ajout des modules et utilitaires pour I2C:

Il vous faudra compiler manuellement les i2c-tools. Pour cela récupérer les sources:

apt-get install unzip build-essential
wget https://github.com/groeck/i2c-tools/archive/master.zip
unzip  master.zip

Il vous faudra ensuite modifier le fichier i2cbusses.c pour que les outils i2c puisse utiliser les adresses 0x01 et 0x02 utilisées par les capteurs du Cultipi:

vi i2c-tools-master/tools/i2cbusses.c

Puis modifier la ligne 367:

if (address < 0x03 || address > 0x77) { 

Par:

if (address < 0x01 || address > 0x77) {

Il ne reste plus qu'à compiler les outils:

cd i2c-tools-master
make
make install
ln -s /usr/local/lib/libi2c.so.0 /lib/
echo "i2c-dev" >> /etc/modules
echo "options i2c_bcm2708 baudrate=32000" > /etc/modprobe.d/i2c.conf
echo "dtparam=i2c1=on" >> /boot/config.txt

Puis à faire le ménage:

apt-get remove --purge build-essential unzip
apt-get autoremove
rm -Rf i2c-tools-master

Et à donner les droits à l'utilisateur cultipi et www-data:

adduser cultipi i2c
adduser www-data i2c
  • Ajout du binaire GPIO:

Récupérer l'archive des sources GPIO ici: https://git.drogon.net/?p=wiringPi;a=summary en cliquant sur le lien snapshot et copier le sur le Raspberry (ou copier le lien et utiliser la commande wget pour directement le récupérer sur le Raspberry).

Il faut ensuite installer le logiciel. Dans le répertoire qui contient l'archive téléchargée, taper les commandes suivantes:

tar zxvfp wiringPi-d42e831.tar.gz
cd wiringPi-d42e831
./build
cd ..
rm -Rf wiringPi-*

Pour tester l'installation de GPIO:

gpio -v
gpio readall

Optimisation du Raspberry

  • Gestion de la mémoire:
vi /boot/config.txt

Ajouter gpu_mem=16 pour donner le maximum de mémoire au CPU au détriment du GPU. Décomenter arm_freq=800 pour overclocker le Raspberry (http://elinux.org/RPiconfig)

  • Suppression des consoles inutilisées:
sed -i '/[2-6]:23:respawn:\/sbin\/getty 38400 tty[2-6]/s%^%#%g' /etc/inittab
  • Désactivation de l'ipv6:
echo "blacklist ipv6" >> /etc/modprobe.d/fbdev-blacklist.conf
sed -i '/::/s%^%#%g' /etc/hosts
  • Optimisation de l’ordonnanceur:
sed -i 's/deadline/noop/g' /boot/cmdline.txt
  • Redémarrage du système:
reboot
  • Personnalisation du système des logs:
service inetutils-syslogd stop
for file in /var/log/*.log /var/log/mail.* /var/log/debug /var/log/syslog; do [ -f "$file" ] && rm -f "$file"; done
for dir in fsck news; do [ -d "/var/log/$dir" ] && rm -rf "/var/log/$dir"; done
echo -e "*.*;mail.none;cron.none\t -/var/log/messages\ncron.*\t -/var/log/cron\nmail.*\t -/var/log/mail" > /etc/syslog.conf
mkdir -p /etc/logrotate.d
echo -e "/var/log/cron\n/var/log/mail\n/var/log/messages {\n\trotate 4\n\tweekly\n\tmissingok\n\tnotifempty\n\tcompress\n\tsharedscripts\n\tpostrotate\n\t/etc/init.d/inetutils-syslogd reload >/dev/null\n\tendscript\n}" > /etc/logrotate.d/inetutils-syslogd
service inetutils-syslogd start

Remarque: optimisations issues de : https://extremeshok.com/1081/raspberry-pi-raspbian-tuning-optimising-optimizing-for-reduced-memory-usage/

Installation des services utiles aux logiciels

Installation et configuration de lighttpd et PHP

  • Installation de lighttpd et php:
apt-get -y install lighttpd
apt-get -y install php5-common php5-cgi php5 php-apc
rm /var/www/index.lighttpd.html
lighttpd-enable-mod fastcgi-php

On modifie ensuite le php.ini pour autoriser les uploads des fichiers:

vi /etc/php5/cgi/php.ini

Puis on modifie les directives suivantes:

post_max_size = 128M
upload_max_filesize = 64M
  • Relancement du serveur :
/etc/init.d/lighttpd force-reload 

Remarque: Vous pouvez utiliser la fonction phpinfo() afin de vérifier les composants activés dans PHP

  • Création des certificats pour https:
mkdir -p /etc/lighttpd/ssl
openssl req -new -x509 -keyout cultipi.pem -out server.pem -days 3650 -nodes
chmod -R 600 /etc/lighttpd/ssl
  • Installation et configuration de la mécanique .htaccess:
apt-get install apache2-utils
htdigest -c /etc/lighttpd/.passwd 'Identification' cultipi
    Adding password for cultipi in realm Identification.
    New password: 
    Re-type new password: 
  • Configuration du fichier lighttpd.conf:
vi /etc/lighttpd/lighttpd.conf

Le fichier doit ressembler à cela:

server.modules = (
   "mod_access",
   "mod_alias",
   "mod_compress",
   "mod_redirect",
   "mod_auth"
   #"mod_rewrite",
)

server.document-root        = "/var/www"
server.upload-dirs          = ( "/var/cache/lighttpd/uploads" )
server.errorlog             = "/var/log/lighttpd/error.log"
server.pid-file             = "/var/run/lighttpd.pid"
server.username             = "www-data"
server.groupname            = "www-data"
server.port                 = 80

auth.backend = "htdigest"
auth.backend.htdigest.userfile = "/etc/lighttpd/.passwd"
auth.debug = 2

index-file.names            = ( "index.php", "index.html", "index.lighttpd.html" )
url.access-deny             = ( "~", ".inc" )
static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )

compress.cache-dir          = "/var/cache/lighttpd/compress/"
compress.filetype           = ( "application/javascript", "text/css", "text/html", "text/plain" )

# default listening port for IPv6 falls back to the IPv4 port
include_shell "/usr/share/lighttpd/use-ipv6.pl " + server.port
include_shell "/usr/share/lighttpd/create-mime.assign.pl"
include_shell "/usr/share/lighttpd/include-conf-enabled.pl"


url.redirect = ("^/$" => "/cultibox/")



auth.require = ( "/cultibox/" =>
    (
    "method" => "digest",
    "realm" => "Identification",
    "require" => "valid-user"
    )
)

  • Configuration du fichier lighttpd.conf.https:
vi /etc/lighttpd/lighttpd.conf

Le fichier doit ressembler à cela:

server.modules = (
   "mod_access",
   "mod_alias",
   "mod_compress",
   "mod_redirect",
   "mod_auth"
   #"mod_rewrite",
)

server.document-root        = "/var/www"
server.upload-dirs          = ( "/var/cache/lighttpd/uploads" )
server.errorlog             = "/var/log/lighttpd/error.log"
server.pid-file             = "/var/run/lighttpd.pid"
server.username             = "www-data"
server.groupname            = "www-data"
server.port                 = 80

auth.backend = "htdigest"
auth.backend.htdigest.userfile = "/etc/lighttpd/.passwd"
auth.debug = 2

index-file.names            = ( "index.php", "index.html", "index.lighttpd.html" )
url.access-deny             = ( "~", ".inc" )
static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )

compress.cache-dir          = "/var/cache/lighttpd/compress/"
compress.filetype           = ( "application/javascript", "text/css", "text/html", "text/plain" )

# default listening port for IPv6 falls back to the IPv4 port
include_shell "/usr/share/lighttpd/use-ipv6.pl " + server.port
include_shell "/usr/share/lighttpd/create-mime.assign.pl"
include_shell "/usr/share/lighttpd/include-conf-enabled.pl"

$SERVER["socket"] == ":443" {
  ssl.engine = "enable" 
  ssl.pemfile = "/etc/lighttpd/ssl/cultipi.pem" 
}


$HTTP["scheme"] == "http" {
    # capture vhost name with regex conditiona -> %0 in redirect pattern
    # must be the most inner block to the redirect rule
    $HTTP["host"] =~ ".*" {
        url.redirect = (".*" => "https://%0$0")
    }
}

url.redirect = ("^/$" => "/cultibox/")



auth.require = ( "/cultibox/" =>
    (
    "method" => "digest",
    "realm" => "Identification",
    "require" => "valid-user"
    )
)

Créez le répertoire setup puis relancez le serveur:

mkdir /var/www/setup
/etc/init.d/lighttpd force-reload

Installation et configuration de mysql

  • Installation de mysql:
apt-get install mysql-server php5-mysql

Remarque: configurer le serveur avec l'utilisateur root et appliqué le mot de passe cultibox

  • Configuration de mysql:

Éditer le fichier /etc/mysql/my.cnf et modifier le port utilisé et la définitions des logs:

port        = 3891
general_log_file        = /var/log/mysql/mysql.log
general_log             = 1

Modifier aussi la section [mysql] pour rajouter la ligne suivante:

local-infile= 1
  • Redémarrage du serveur:
/etc/init.d/mysql force-reload

Configuration de motion pour la webcam

Exécuter les commandes suivantes dans un terminal:

sed -i "s/; thread \/usr\/local\/etc\/thread1.conf/thread \/etc\/culticam\/thread1.conf/g" /etc/motion/motion.conf
sed -i "s/; thread \/usr\/local\/etc\/thread2.conf/thread \/etc\/culticam\/thread2.conf/g" /etc/motion/motion.conf
sed -i "s/; thread \/usr\/local\/etc\/thread3.conf/thread \/etc\/culticam\/thread3.conf/g" /etc/motion/motion.conf
sed -i "s/; thread \/usr\/local\/etc\/thread4.conf/thread \/etc\/culticam\/thread4.conf/g" /etc/motion/motion.conf
sed -i "s/daemon off/daemon on/g" /etc/motion/motion.conf
sed -i "s/webcam_localhost on/webcam_localhost off/g" /etc/motion/motion.conf
sed -i "s/start_motion_daemon=no/start_motion_daemon=yes/g" /etc/default/motion
update-rc.d -f motion remove

Configuration du réseau du Cultipi

  • Ajout des firmwares wifi disponibles:
apt-get install atmel-firmware firmware-atheros firmware-brcm80211 firmware-libertas firmware-ralink firmware-realtek libertas-firmware zd1211-firmware
  • Ajout de CRDA
apt-get install crda

Puis configuration de CRDA, editer le fichier de configuration CRDA:

vi /etc/default/crda

et remplacer la ligne:

REGDOMAIN=

Par:

REGDOMAIN=FR

Enfin taper la commande suivante:

iw reg set FR
  • Configuration des interfaces:
ifconfig wlan0 up

Éditer le fichier /etc/network/interfaces afin que le fichier soit identique à cela:

# interfaces(5) file used by ifup(8) and ifdown(8)
#IFACE LO
auto lo
iface lo inet loopback

#IFACE ETH0
allow-hotplug eth0
iface eth0 inet dhcp

#IFACE WLAN0
auto wlan0
allow-hotplug wlan0
iface wlan0 inet static
address 10.0.0.100
netmask 255.0.0.0
post-up /etc/rc.local; /etc/init.d/isc-dhcp-server force-reload; /etc/init.d/dnsmasq force-reload; /etc/init.d/hostapd force-reload

Puis sauvegarder le fichier avec la commande:

cp /etc/network/interfaces /etc/network/interfaces.BASE

Editer le fichier /etc/rc.local et remplacer le fichier par les lignes suivantes:

#!/bin/bash 

#Case of an Access Point:
if [ "`/bin/grep 10.0.0.100 /etc/network/interfaces`" != "" ] && [ "`/sbin/ifconfig wlan0`" != "" ]; then
    #Configuration of the captiv portal if it's not the case yet:
    if [ "`/sbin/iptables -L -t nat | /bin/grep 10.0.0.100`" == "" ]; then
        /sbin/iptables -t nat -A PREROUTING -i wlan0 -p tcp --dport 80 -j DNAT --to-destination 10.0.0.100:80
    fi
else
    #If it's not an Acces Point mode , deleteting captiv portal configuration:
    for i in $(/sbin/iptables -t nat --line-numbers -L | /bin/grep ^[0-9] | /usr/bin/awk '{ print $1 }' | /usr/bin/tac ); do /sbin/iptables -t nat -D PREROUTING $i; done
fi

#To accelerate boot time, eth0 is not configured at boot time (due to the time DHCP uses to respond when a wire is not plugged).
#But we have to configure the interface if a wire is plugged:
if [ "`cat /sys/class/net/eth0/carrier 2>/dev/null`" == "1" ]; then
    /sbin/ifup --force eth0
else
    /sbin/ifdown --force eth0
fi

default="no"
if [ "`cat /sys/class/net/eth0/carrier 2>/dev/null`" == "1" ]; then
    gw="`grep 'post-up /sbin/route add default gw' /etc/network/interfaces|grep eth0|sed -e 's/post-up //g'`"
    if [ "$gw" != "" ]; then
        default="yes"
        eval $gw
    fi
fi

if [ "`/sbin/ifconfig wlan0 2>/dev/null`" != "" ] && [ "$default" == "no" ]; then
    gw="`grep 'post-up /sbin/route add default gw' /etc/network/interfaces|grep wlan0|sed -e 's/post-up //g'`"
    if [ "$gw" != "" ]; then
        eval $gw
    fi
fi

#Configuration of the keymap in FR:
/usr/bin/loadkeys fr

exit 0

Ce morceau de code permettra de générer le nom du réseau adHoc de connexion avec l'adresse Mac de votre module Wifi si votre Raspberry démarre avec un module wifi connecté.

Remarque: les commentaires sont importants, le logiciel de configuration du réseau Cultinet les utilise pour déterminer les blocs liés aux différentes interfaces. Ce fichier de configuration déclare un réseau adHoc sur lequel il sera possible de se connecter afin de configurer son réseau wifi.

Éditer le fichier /etc/default/ifplugd pour qu'il ressemble à cela:

INTERFACES="eth0"
HOTPLUG_INTERFACES=""
ARGS="-q -f -u0 -d10 -w -I"
SUSPEND_ACTION="stop"

Puis éditer le fichier /etc/ifplugd/action.d/ifupdown pour qu'il ressemble à cela:

#!/bin/bash 

logger -t IFPLUGD: $1 $2

#For routes, we have to restart network:

route del default
if [ "$2" == "up" ]; then
    default="no"
    if [ "`cat /sys/class/net/eth0/carrier 2>/dev/null`" == "1" ]; then
        /sbin/ifup --force eth0
        gw="`grep 'post-up /sbin/route add default gw' /etc/network/interfaces|grep eth0|sed -e 's/post-up //g'`"
        if [ "$gw" != "" ]; then
            default="yes"
            eval $gw
        fi
    fi

    if [ "`/sbin/ifconfig wlan0 2>/dev/null`" != "" ] && [ "$default" == "no" ]; then
        gw="`grep 'post-up /sbin/route add default gw' /etc/network/interfaces|grep wlan0|sed -e 's/post-up //g'`"
        if [ "$gw" != "" ]; then
            eval $gw
        fi
    fi
else
    if [ "`/sbin/ifconfig wlan0 2>/dev/null`" != "" ]; then
        /sbin/ifdown --force wlan0
        sleep 1
        /sbin/ifup --force wlan0
    fi
    /sbin/ifdown --force eth0
fi

Le système ifplugd permet de relancer la configuration de l'interface eth0 dès le moment ou un câble est branché/débranché.

Pour finir configurer le module Wifi avec la commande:

echo "options rt2800usb nohwcrypt=1" > /etc/modprobe.d/rt2800usb.conf
  • Installation et configuration d'un serveur DHCP pour le mode AP, de dnsmasq et de hostapd:
apt-get install isc-dhcp-server dnsmasq hostapd
update-rc.d -f dnsmasq remove
update-rc.d -f isc-dhcp-server remove
update-rc.d -f hostapd remove
vi /etc/dhcp/dhcpd.conf

Le fichier de configuration du dhcp doit contenir les directives suivantes:

ddns-update-style none;
option domain-name "local";
option domain-name-servers 10.0.0.100;
default-lease-time 600;
max-lease-time 7200;
authoritative;
log-facility local7;

subnet 10.0.0.0 netmask 255.0.0.0 {
    range 10.0.0.102 10.0.0.254;
    option routers 10.0.0.100;
    option domain-name-servers 10.0.0.100;
}

Editer ensuie le fichier /etc/default/isc-dhcp-server pour activer le serveur sur la bonne interface:

INTERFACES="wlan0"
  • Configuration de dnsmasq:

Editer le fichier /etc/dnsmasq.conf qui doit contenir les directives suivantes:

address=/#/10.0.0.100
interface=wlan0
listen-address=10.0.0.100
no-dhcp-interface=wlan0
  • Configuration de hostapd:

Créer et ajouter les lignes suivantes dans /etc/hostapd/hostapd.conf:

interface=wlan0
ssid=cultipi_network
hw_mode=g
channel=4
auth_algs=1
wmm_enabled=0

Ajouter la ligne suivante dans /etc/default/hostapd:

DAEMON_CONF="/etc/hostapd/hostapd.conf"
  • Redémarrage du serveur DHCP, dnsmasq et hostapd:
/etc/init.d/isc-dhcp-server force-reload
/etc/init.d/dnsmasq force-reload
/etc/init.d/hostapd force-reload
  • Configuration de avahi:

Editer le fichier /etc/avahi/avahi-daemon.conf et changer la directive:

use-ipv6=yes

en:

use-ipv6=no

Relancer ensuite avahi avec la commande:

/etc/init.d/avahi-daemon force-reload
  • Numéro de version de l'image

Pour configurer la version de l'image:

echo "150421" > /VERSION

Ajout du système Cultipi

Pour finir il suffit d'installer les paquets gérant le système Cultipi:

apt-get install cultibox cultipi cultitime cultiraz culticonf culticam cultidoc

Finalisation de l'image

  • Nettoyage de l'image :
apt-get autoremove
apt-get clean
reboot
  • Sauvegarde de l'image:

Insérer la carte SD du Cultipi sur votre ordinateur puis démonter les partitions. Pour sauvegarder l'image du Cultipi, lancer la commande suivante:

dd bs=4M if=/dev/mmcblk0 | gzip > ~/cultipi-`date +%d%m%y`.dd.gz

Vous obtiendrez une image au format RAW gzipée.

Remarque: /deb/mmcblk0 correspond au device contenant la carte SD dans son intégralité et non pas à une partition.

Remarque: La commande rpi-update peut être utilisée pour mettre à jour le Raspberry

⚠️ **GitHub.com Fallback** ⚠️