Affichage des articles dont le libellé est Raspberry PI. Afficher tous les articles
Affichage des articles dont le libellé est Raspberry PI. Afficher tous les articles

dimanche, janvier 12, 2014

Economisez les écritures sur la SDCard de votre Raspberri Pi (sous NetBSD)

Voilà en pratique, ce que j'utilise pour économiser les écritures, et éviter de dégrader trop vite la SDCard (ou la clé USB) de mon RPI.

  • Montage de /tmp, /var/run et /var/log en mémoire plutôt que direct sur disque:

1. Editer le fichier /etc/fstab comme suit (ne touchez pas aux lignes en italique, elles peuvent être différentes sur votre RPI, regardez les lignes en bleu):

# NetBSD /targetroot/etc/fstab
# See /usr/share/examples/fstab/ for more examples.
/dev/ld0a        /        ffs      rw,noatime,nodevmtime    1 1

/dev/ld0b        none     swap     sw,dp                    0 0
/dev/ld0e        /boot    msdos    rw                       0 0
kernfs           /kern    kernfs   rw
ptyfs            /dev/pts ptyfs    rw
procfs           /proc    procfs   rw
/dev/cd0a        /cdrom   cd9660   ro,noauto

#M# Un TMPFS pour /var/run /var/log
tmpfs            /var/shm    tmpfs    rw,-m1777,-sram%5
tmpfs            /var/log    tmpfs    rw,-sram%10
tmpfs            /var/run    tmpfs    rw,-sram%


2. Créer un script de peuplement de /var/log et le lancer au démarrage:

Le répertoire /var/log étant désormais (enfin, au prochain reboot) en mémoire vive, il sera effacé à chaque redémarrage. Donc un script de peuplement doit être créé, et lancé à chaque démarrage avant le lancement des différents démons. Ce qui implique que vous n'utiliserez pas rc.conf pour contrôler les démons, mais que vous séquencerez le démarrage dans /etc/rc.local (le pilote de lancement des programmes, démons, et paramètres locaux).

Donc dans /etc/rc/conf, paramétrez "syslogd=NO" (si ce n'est pas déjà fait), et chassez les démons (services) que vous avez ajouté et qui sont à YES pour les passer à NO. Vous les lancerez plus tard via rc.local.

Dans /etc/rc.local (voir les lignes en bleu):
#    $NetBSD: rc.local,v 1.32 2008/06/11 17:14:52 perry Exp $
#    originally from: @(#)rc.local    8.3 (Berkeley) 4/28/94
#
# This file is (nearly) the last thing invoked by /etc/rc during a
# normal boot, via /etc/rc.d/local.
#
# It is intended to be edited locally to add site-specific boot-time
# actions, such as starting locally installed daemons.
#
# An alternative option is to create site-specific /etc/rc.d scripts.
#

echo -n 'Starting local daemons:'

# Add your local daemons here, eg:
#
#if [ -x /path/to/daemon ]; then
#    /path/to/daemon args
#fi

echo '.'

#M# Peupler /var/log et lancer à la main

/usr/local/bin/pop_var_tmpfs.sh 
/etc/rc.d/syslogd onestart



Et voilà le contenu du script pop_var_tmpfs.sh à placer dans /usr/local/bin/ (il vous faudra créer ces répertoires: mkdir /usr/local ; mkdir /usr/local/bin): Cliquez ici pour le télécharger.

#!/bin/sh
ROOT_DIR=/var
wheel_files="authlog cron lpd-errs maillog messages rdist secure xferlog"
utmp_files="lastlog lastlogx wtmp wtmpx"
run_dirs="dovecot lvm"
vartmp_dirs="vi.recover"
wheel_dirs="rdist"

echo -n "Mking tmp root dirs..."
mkdir $ROOT_DIR/log/tmp
chmod 777 $ROOT_DIR/log/tmp
chmod +t  $ROOT_DIR/log/tmp
echo "done."

echo -n "Mking symlinks..."
[ -e /tmp ] || ln -s /var/log/tmp /tmp
[ -e /var/tmp ] || ln -s /var/log/tmp /var/tmp
echo "done"

if [ ! -d $ROOT_DIR ]; then
  echo "$ROOT_DIR not found"
  exit 1
fi

echo -n "Populating $ROOT_DIR..."

for dir in $wheel_dirs; do
  mkdir $ROOT_DIR/log/$dir
  chown root:wheel $ROOT_DIR/log/$dir
  echo -n "[d]$dir..."
done

for file in $wheel_files; do
  touch $ROOT_DIR/log/$file
  chown root:wheel $ROOT_DIR/log/$file
  chmod 600        $ROOT_DIR/log/$file
  echo -n "[f]$file..."
done

for file in $utmp_files; do
  touch $ROOT_DIR/log/$file
  chown root:utmp $ROOT_DIR/log/$file
  chmod 600       $ROOT_DIR/log/$file
  echo -n "[f]$file..."
done

for dir in $run_dirs; do
  mkdir $ROOT_DIR/run/$dir
  chown root:wheel $ROOT_DIR/run/$dir
  echo -n "[d]$dir..."
done

for dir in $vartmp_dirs; do
  mkdir $ROOT_DIR/tmp/$dir
  chown root:wheel $ROOT_DIR/tmp/$dir
  chmod 777 $ROOT_DIR/tmp/$dir
  echo -n "[d]$dir..."
done

echo "done."


Puis chmod +x /usr/local/bin/pop_var_tmpfs.sh pour qu'il soit eXécutable bien sur...

  • Lister les fichiers ouverts en écriture ou lecture/écriture sous NetBSD:

Le script showDiskWrites.sh (cliquez ici pour le télécharger) fait un peu de tri dans la sortie de la conmmande fstat pour ne montrer que les fichiers ouverts intéressants:

#!/bin/sh
#
# Show files open on "write" ou "read/write" mode on a NetBSD system.
#
# Mathieu Lubrano
# (BSD licence, 2013).
#
fstat | grep -v "/dev" | grep -v null | grep -v console | grep -v pipe > /tmp/fstat.tmp
cat /tmp/fstat.tmp | grep ".*w$"
cat /tmp/fstat.tmp | grep " w "
rm -f /tmp/fstat.tmp


Et oui, ce script écrit dans un fichier temporaire dans /tmp... donc dans un monde idéal, vous avez un /tmp en tmpfs ;-)

dimanche, mai 12, 2013

Installation de NetBSD (evbarm) sur un Raspberry Pi


Voilà une recette de cuisine pour installer NetBSD sur un Raspberry Pi modèle B (v2, 512Mo), en Français.



Tout ceci est largement inspiré de ce post de la mailing list port-arm NetBSD et cet article sur le wiki de NetBSD.org mais illustré de quelques photos d'écrans, et poussé un peu plus loin qu'un simple boot, l'idée étant d'arriver à un système utilisable en mode texte (avec le "userland").

Tout ce déroulé suppose que vous utilisez votre RPI sans clavier/écran, donc simplement branché au réseau. 
C'est la "méthode dure"... qui vous rappellera l'Informatique des années 80. 
La "méthode douce" consiste à brancher un clavier/écran (via la sortie RCA, pour donner une seconde vie à votre téléviseur cathodique si branché à un adaptateur RCA-Péritel ou direct RCA, ou via la sortie HDMI sur votre écran LED 16/9ème 24 pouces...).

  • Pré-requis:
    • Un accès internet,
    • Un serveur DHCP (votre Livebox, Freebox ou autre le fait très bien),
    • Un logiciel pour flasher l'image d'installation sur une carte mémoire SDCard (ex: USBWriter) 
    • Une image d'installation de NetBSD pour Raspberry (ex: allez sur http://nyftp.netbsd.org/pub/NetBSD-daily/HEAD/ puis choisissez le répertoire le plus récent, par exemple au moment de l'écriture de ce billet c'est 201305102100Z puis continuez pour aller dans evbarm/binary/gzimg/ pour télécharger le fichier rpi_inst.img.gz Soit au final un lien de téléchargement qui ressemble à ça : http://nyftp.netbsd.org/pub/NetBSD-daily/HEAD/201305102100Z/evbarm/binary/gzimg/rpi_inst.img.gz )
    • Un client ssh pour se connecter en mode texte à NetBSD/Raspberry (ex: putty).

  • Liste de matériel: Exemple ICI sur Amazon.fr
    • 1 carte mère Raspberry Pi modèle B
    • 1 carte mémoire SDCard (ou micro sd avec son adaptateur)
    • 1 boitier pour un peu de sécurité vs les chocs électriques

  • Flash de l'image d'installation sur la SDCard 
    • Dézipper rp_inst.img.gz (ex : avec winrar sous windows).
    • Flasher rp_inst.img sur la SDCard (attention à ne pas confondre les noms de lecteurs ou d'unités où vous allez déposer l'image, visez bien la SDCard !)

  • Boot sur l'image d'installation
    • Connecter la SDCard sur le Raspberry
    • Connecter le Raspberry au réseau, et éventuellement à un écran ou télé en HDMI si vous voulez voir ce qui se passe
    • Allumer le Raspberry et retrouver l'adresse IP que votre serveur DHCP (box) lui a attribué
    • Se connecter en ssh à cette adresse avec l'utilisateur "sysinst" mot de passe "netbsd"
Voilà, arrivé ici normalement vous êtes sur l'écran d’accueil de l'installeur NetBSD. 
Vous avez fait ce qui diffère le plus d'une installation sur un PC ou serveur "classique", le reste devrait paraître assez facile.
  • Etapes d'installation 
    • Voilà quelques copies d'écran intéressantes pendant la phase d'installation
La table des partitions, à la mode BSD ça donne ceci, une partition dos (/boot) suite au flashage de l'image d'installation sur votre SDCard, et le reste dédié à NetBSD:



La carte SDCard est le device "ld0", si comme moi vous avez en plus mis une clé USB (Kingston) vous verrez un autre device "sd0" mais ne le choisisez pas, le firmware du Raspberry amorse le système d'exploitation depuis la SDCard...

Installation type "b", en mode texte uniquement (choix personnel)

Géométrie: garder les valeurs par défaut


Etape intéressante: le partitionnement.
Ici un gros / un petit swap et un /tmp en mémoire.
En fait il faudrait se passer de la partition de swap, pour éviter de trop écrire et donc d'user la carte mémoire (chaque écriture endommage petit à petit les mémoires flash/ssd/usb etc... c'est comme ça :-(
Et /tmp sera de type mfs (Memory File System, donc prendra un peu de votre précieuse RAM pour y créer une partition éphémère). 
Pour éviter de faire trop d'accès en écriture sur la carte mémoire, monter les volumes avec les options suivantes: noatime, nodevmtime (sur le /).
Notez qu'il faut laisser la partition /boot tel quel, au format msdos, qui est nécessaire pour que le firmware du Raspberry puisse ammorcer le système.

Il vous faudra indiquer où sont les paquets d'installation en cohérence avec la version que vous installez, soit dans cet exemple:



Après un petit moment (téléchargement, install, etc...), lorsque l'installeur est terminé vous rebootez et si tout s'est bien passé vous pouvez vous connecter au système:

  • Etapes supplémentaires
Définir la variable PKG_PATH qui permet de faire pointer le gestionnaire de paquets vers un dépot adéquat, ex pour la version 6.1 actuelle:
export PKG_PATH="ftp://ftp.fr.netbsd.org/pub/pkgsrc/packages/NetBSD/evbarm/6.1/All/

Gagner un peu de mémoire vive (RAM) si vous n'utilisez votre Raspberry qu'a distance, en déplaçant la limite du partage CPU/GPU de la mémoire, qui par défaut est à 64Mb (64Mb pour le GPU -carte graphique- et 512-64=448Mb pour le CPU et donc l'OS, NetBSD...).
Cette petite quantité de mémoire n'est pas forcément cruciale, tant NetBSD est resté économique face à une installation Linux classique aujourd'hui (là je regarde vers CentOS et consort, et je ne pense même pas, non, à Windows Serveur 2012 ;-). Mais, rappelez-vous que vous devez éviter à tout prix d'utiliser la partition de swap (cf. la SDCard). 
Donc voilà :
    echo "gpu_mem=16" >> /boot/config.txt

Le "Userland" : Commencer à télécharger les paquets qui vous sont utiles. La commande est "pkg_add ", qui par analogie avec les dépôts (repository) sous Linux, se base sur pkgsrc. Pour  vous faciliter la vie installez en premier le programme "pkgin" qui est un gestionnaire un peu moins rustique que les commandes de base de gestion des paquets, soit "pkg_add pkgin" puis un petit "pkgin --help" vous montrera quoi faire (ex: "pkgin avail" liste tous les paquets disponibles et pré-compilés pour votre Raspberry, soit 4366 actuellement).
Je recommande "pkgin install wget nano free vim lynx irssi screen bash curl sudo" pour que vous retrouviez un environnement familier à la Linux. Après ça lancez /usr/pkg/bin/bash et vous comprendrez ;-)

Eviter de trop écrire sur la SDCard: Déplacer /var/log dans un mfs (tmpfs) donc en mémoire, ou comme moi pour aller au plus simple en attendant, arrêter quelques démons et tâches automatisées (cronées):
  syslogd: echo "syslogd=NO" >> /etc/rc.conf 
  la mise à jour des manpages: echo "manpagedb=NO" >> /etc/rc.conf 
  la création des core dump : echo "savecore=NO" >> /etc/rc.conf 
  la création de fichier de récupération sous VI : echo "virecover=NO" >> /etc/rc.conf

Forcer la réparation (si nécessaire) du système de fichier au démarrage, pour améliorer la résilience du système, car dans la le cas où votre RPI est utilisé sans clavier/écran, il restera figé au démarrage dans l'attente de votre action manuelle pour réparer le système de fichier. Alors qu'en paramétrant dans rc.conf la variable fsck_flags comme ceci, vous répondez "yes" aux questions posées par l'fsck lancé au démarrage :
  echo "fsck_flags="-P -p -y" >> /etc/rc.conf

Amusez vous bien, et ne restez pas bloqué à la première difficulté : NetBSD est un projet très bien documenté, un système très concis donc à la fois simple d'accès mais peu "assisté". 
Les manpages remplaceront avantageusement les wizards et autres assistants, qui font tout et souvent n'importe quoi.