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 ;-)

Aucun commentaire: