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.
# 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...
#!/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 ;-)
Montage de /tmp, /var/run et /var/log en mémoire plutôt que direct sur disque:
# 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:
#!/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 ;-)