<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
	
		<title>philpep's blog - tag script</title>
		<atom:link href="http://blog.philpep.org/feed/tag/script/rss2" rel="self" type="application/rss+xml" />
		<description>philpep&#39;s blog - tag script rss</description>
	<link>http://blog.philpep.org</link>
	<language>fr</language>
		<lastBuildDate>Thu, 23 Jun 2011 00:00:00 GMT</lastBuildDate>
	<generator>Pblog</generator>
		<item>
			<title>Backup zfs</title>
			<link>http://blog.philpep.org/post/backup-zfs</link>
			<guid>http://blog.philpep.org/post/backup-zfs</guid>
			<pubDate>Thu, 23 Jun 2011 00:00:00 GMT</pubDate>
			<description>&lt;p&gt;J&#39;ai mis en place un système de backup de mon serveur FreeBSD (dédié) vers un autre serveur FreeBSD (@home). Les deux machines sont en &lt;code&gt;zfs&lt;/code&gt;, c&#39;était pour moi l&#39;occasion de tester &lt;code&gt;zfs (send|recv)&lt;/code&gt; over &lt;code&gt;ssh&lt;/code&gt;. L&#39;idée c&#39;est qu&#39;on envoie les donnés de manière incrémentale entre un snapshot du jour et un snapshot de la veille. Ce que l&#39;on gagne par rapport à des solutions comme &lt;code&gt;rsync&lt;/code&gt; c&#39;est de la rapidité et moins d&#39;accès disques (&lt;code&gt;zfs&lt;/code&gt; sait exactement ce qui a bougé entre deux snapshot), l&#39;autre avantage c&#39;est sur la machine de backup on a un snapshot par jour, on peut donc facilement retrouver des fichiers supprimés.&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span class=&#34;c&#34;&gt;#!/bin/sh&lt;/span&gt;

&lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; -e

&lt;span class=&#34;c&#34;&gt;# Used in ssh command, example user@host -p 2222&lt;/span&gt;
&lt;span class=&#34;nv&#34;&gt;REMOTE_HOST&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;diophante&amp;quot;&lt;/span&gt;

&lt;span class=&#34;c&#34;&gt;# Source zfs pool&lt;/span&gt;
&lt;span class=&#34;nv&#34;&gt;POOL_SRC&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;tank&amp;quot;&lt;/span&gt;

&lt;span class=&#34;c&#34;&gt;# zfs sets to backup (relative to POOL_SRC)&lt;/span&gt;
&lt;span class=&#34;nv&#34;&gt;SETS&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;usr/local/vmail usr/local/data usr/local/pgsql/backups usr/home usr/local/git var/backups&amp;quot;&lt;/span&gt;

&lt;span class=&#34;c&#34;&gt;# Destination pool&lt;/span&gt;
&lt;span class=&#34;nv&#34;&gt;POOL_DST&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;tank/backup/${REMOTE_HOST}&amp;quot;&lt;/span&gt;

&lt;span class=&#34;c&#34;&gt;# We use ssh connection sharing&lt;/span&gt;
&lt;span class=&#34;nv&#34;&gt;SSH_ARGS&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;-o ControlPath=~/.ssh/%r@%h:%p&amp;quot;&lt;/span&gt;

&lt;span class=&#34;c&#34;&gt;# zfs snapshot prefix =&amp;gt; tank/foo@bck-2011-05-25&lt;/span&gt;
&lt;span class=&#34;nv&#34;&gt;PREFIX&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;bck-&amp;quot;&lt;/span&gt;

&lt;span class=&#34;c&#34;&gt;# Remote zfs command&lt;/span&gt;
&lt;span class=&#34;nv&#34;&gt;REMOTE_ZFS&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;ssh ${SSH_ARGS} ${REMOTE_HOST} sudo zfs&amp;quot;&lt;/span&gt;

&lt;span class=&#34;c&#34;&gt;# Local zfs command&lt;/span&gt;
&lt;span class=&#34;nv&#34;&gt;LOCAL_ZFS&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;sudo zfs&amp;quot;&lt;/span&gt;

&lt;span class=&#34;c&#34;&gt;# Launch master ssh for sharing connections&lt;/span&gt;
ssh -MNn &lt;span class=&#34;k&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;SSH_ARGS&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;REMOTE_HOST&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;}&lt;/span&gt; &amp;amp;
&lt;span class=&#34;nv&#34;&gt;ssh_master_pid&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$!&lt;/span&gt;

&lt;span class=&#34;k&#34;&gt;for &lt;/span&gt;zfs_set in &lt;span class=&#34;k&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;SETS&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;do&lt;/span&gt;
    &lt;span class=&#34;c&#34;&gt;# Test if destination exist&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;LOCAL_ZFS&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;}&lt;/span&gt; list -H &lt;span class=&#34;k&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;POOL_DST&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;}&lt;/span&gt;/&lt;span class=&#34;k&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;zfs_set&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;}&lt;/span&gt; &amp;gt;/dev/null

    &lt;span class=&#34;nv&#34;&gt;date_suffix&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;${PREFIX}`date +%F`&amp;quot;&lt;/span&gt;
    &lt;span class=&#34;nv&#34;&gt;snap&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;${POOL_SRC}/${zfs_set}@${date_suffix}&amp;quot;&lt;/span&gt;
    &lt;span class=&#34;nv&#34;&gt;old_snap&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;REMOTE_ZFS&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;}&lt;/span&gt; list -Ht snapshot 2&amp;gt;/dev/null | grep &lt;span class=&#34;s2&#34;&gt;&amp;quot;^${POOL_SRC}/${zfs_set}@${PREFIX}&amp;quot;&lt;/span&gt; 2&amp;gt;/dev/null| awk -F&lt;span class=&#34;s1&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;{ print $1 }&amp;#39;&lt;/span&gt; 2&amp;gt;/dev/null&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;quot;${old_snap}&amp;quot;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;then&lt;/span&gt;

&lt;span class=&#34;k&#34;&gt;        if&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;quot;${old_snap}&amp;quot;&lt;/span&gt; !&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;quot;`echo ${old_snap} | head -n 1`&amp;quot;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
        &lt;span class=&#34;k&#34;&gt;then&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;quot;[!] Multiple zfs snapshot found: ${old_snap}&amp;quot;&lt;/span&gt;
            &lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;quot;[!] Consider changing PREFIX or fix the issue yourself&amp;quot;&lt;/span&gt;
            &lt;span class=&#34;k&#34;&gt;continue&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;        fi&lt;/span&gt;

&lt;span class=&#34;k&#34;&gt;        if&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;quot;${old_snap}&amp;quot;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;quot;${snap}&amp;quot;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
        &lt;span class=&#34;k&#34;&gt;then&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;quot;[!] ${snap} exists&amp;quot;&lt;/span&gt;
            &lt;span class=&#34;k&#34;&gt;continue&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;        fi&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;    fi&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;REMOTE_ZFS&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;}&lt;/span&gt; snapshot &lt;span class=&#34;s2&#34;&gt;&amp;quot;${snap}&amp;quot;&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;REMOTE_ZFS&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;}&lt;/span&gt; snapshot &lt;span class=&#34;s2&#34;&gt;&amp;quot;${snap}&amp;quot;&lt;/span&gt;

    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;quot;${old_snap}&amp;quot;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;then&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;extra_args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;-i ${old_snap}&amp;quot;&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;extra_args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt;

&lt;span class=&#34;k&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;REMOTE_ZFS&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;}&lt;/span&gt; send &lt;span class=&#34;nv&#34;&gt;$extra_args&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;quot;${snap}&amp;quot;&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;|&amp;#39;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;LOCAL_ZFS&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;}&lt;/span&gt; recv -F &lt;span class=&#34;s2&#34;&gt;&amp;quot;${POOL_DST}/${zfs_set}&amp;quot;&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;REMOTE_ZFS&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;}&lt;/span&gt; send &lt;span class=&#34;nv&#34;&gt;$extra_args&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;quot;${snap}&amp;quot;&lt;/span&gt; | &lt;span class=&#34;k&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;LOCAL_ZFS&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;}&lt;/span&gt; recv -F &lt;span class=&#34;s2&#34;&gt;&amp;quot;${POOL_DST}/${zfs_set}&amp;quot;&lt;/span&gt;

    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;quot;${old_snap}&amp;quot;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;then&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;REMOTE_ZFS&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;}&lt;/span&gt; destroy &lt;span class=&#34;s2&#34;&gt;&amp;quot;${old_snap}&amp;quot;&lt;/span&gt;
        &lt;span class=&#34;k&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;REMOTE_ZFS&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;}&lt;/span&gt; destroy &lt;span class=&#34;s2&#34;&gt;&amp;quot;${old_snap}&amp;quot;&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;done&lt;/span&gt;

&lt;span class=&#34;nb&#34;&gt;kill&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$ssh_master_pid&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Le script est aussi disponible &lt;a href=&#34;https://gist.github.com/1043499&#34;&gt;sous forme de gist github&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Sur mes deux machines j&#39;ai un user &lt;code&gt;backup&lt;/code&gt; qui peut exécuter &lt;code&gt;zfs&lt;/code&gt; avec &lt;code&gt;sudo&lt;/code&gt;, l&#39;user &lt;code&gt;backup&lt;/code&gt; sur la machine de backup peut accéder en &lt;code&gt;ssh&lt;/code&gt; à l&#39;user &lt;code&gt;backup&lt;/code&gt; (vous suivez ?) sur la machine à sauvegarder au moyen d&#39;une clé ssh dédiée sans mot de passe.&lt;/p&gt;
&lt;p&gt;Le script se lance donc sur la machine de backup (en ayant pris soin de créer tous les sets zfs qu&#39;on va sauvegarder). La première fois il va transférer le set en entier, et les jours suivants il va envoyer de l&#39;incrémental, il faut au minimum un jour entre chaque backup mais rien ne vous empêche de mettre l&#39;heure dans le nom du snapshot.&lt;/p&gt;
&lt;p&gt;Commentaires, patchs bienvenus.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;PS&lt;/em&gt;: Ça fait 6 mois que j&#39;ai pas posté sur ce blog, c&#39;est parce que je travaille et même si je trouve encore un peu de temps pour faire mon propre code c&#39;est moins le cas quand il faut le décrire ici. Par contre je maintient une liste de posts à faire sur ce blog, je rattraperais mon retard bientôt.&lt;/p&gt;</description>
		</item>
		<item>
			<title>Ma conf NanoBSD</title>
			<link>http://blog.philpep.org/post/ma-conf-nanobsd</link>
			<guid>http://blog.philpep.org/post/ma-conf-nanobsd</guid>
			<pubDate>Fri, 17 Sep 2010 00:00:00 GMT</pubDate>
			<description>&lt;p&gt;Je suis l&#39;heureux possesseur d&#39;une alix 2D3, un temps elle a tournée sous OpenBSD mais quand est venue la carte wifi non supportée j&#39;ai du changer d&#39;OS pour FreeBSD et les drivers madwifi. Un jour j&#39;en ai eu marre de me battre avec &lt;code&gt;mount -uw /&lt;/code&gt; et les devices &lt;a href=&#34;http://www.freebsd.org/cgi/man.cgi?query=md&#34;&gt;md(4)&lt;/a&gt; et j&#39;y ais mis une &lt;a href=&#34;http://pfsense.org/&#34;&gt;pfsense&lt;/a&gt;, au début l&#39;interface web c&#39;est convi, mais vite on se sent limité, et ne pas éditer mon &lt;a href=&#34;http://www.freebsd.org/cgi/man.cgi?query=pf.conf&#34;&gt;pf.cont(5)&lt;/a&gt; avec vim me rendait malade.&lt;/p&gt;
&lt;p&gt;Puis j&#39;apprends qu&#39;il existe un script dans les sources FreeBSD qui permet de faire une FreeBSD pour l&#39;embarqué (ie, petite taille, lecture seule + ram disk). C&#39;est marqué dans le titre, il s&#39;agit de &lt;a href=&#34;http://www.freebsd.org/cgi/man.cgi?query=nanobsd&#34;&gt;nanobsd(8)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;C&#39;est très bien foutu et on est assez émerveillé  quand on connait pas les techniques de l&#39;embarqué comme moi.&lt;/p&gt;
&lt;p&gt;En gros vous faites un fichier de config en shell, &lt;code&gt;/usr/src/tools/tools/nanobsd/nanobsd.sh&lt;/code&gt; se charge de vous compiler le world et le kernel et mettre tout ça dans une image disque.&lt;/p&gt;
&lt;p&gt;Il y a beaucoup de paramètres customisables, une simple lecture du script vous les donnera tous. Nanobsd génère 2 images, une image disque complete (&lt;em&gt;.disk.full) et une image avec seulement une partition (&lt;/em&gt;.disk.image).
L&#39;image complète comporte 3 partitions, les deux premières sont identiques en tailles et contiennent les mêmes données que &lt;em&gt;.disk.image, lors de la première installation vous utilisez &lt;/em&gt;.disk.full, et pour mettre à jour vous utilisez _.disk.image à écrire sur la partition que vous n&#39;utilisez pas actuellement (comme ça pas besoin de sortir la carte flash pour mettre à jour).&lt;/p&gt;
&lt;p&gt;Nanobsd monte une des deux partitions sur &lt;code&gt;/&lt;/code&gt; (en read-only), et deux ram disk pour &lt;code&gt;/etc&lt;/code&gt; et &lt;code&gt;/var&lt;/code&gt; (&lt;code&gt;/tmp&lt;/code&gt; est linké avec &lt;code&gt;/var/tmp&lt;/code&gt;, &lt;code&gt;/usr/local/etc&lt;/code&gt; sur &lt;code&gt;/etc/local&lt;/code&gt;).
Pour rendre les changements sur &lt;code&gt;/etc&lt;/code&gt; persistants, on utilise la troisième partition qui se monte sur &lt;code&gt;/cfg&lt;/code&gt;, tout les fichiers de &lt;code&gt;/cfg&lt;/code&gt; sont écrits sur &lt;code&gt;/etc&lt;/code&gt; au boot.&lt;/p&gt;
&lt;p&gt;Il y a un script simple pour comparer &lt;code&gt;/etc&lt;/code&gt; et &lt;code&gt;/cfg&lt;/code&gt; pour sauvegarder les changements.&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;% mount /cfg
% touch /cfg/rc.conf # si le fichier n&amp;#39;existe pas dans /cfg il n&amp;#39;est pas copié
% umount /cfg
% sh /root/save_cfg
/etc/rc.conf --&amp;gt; /cfg/rc.conf
%
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Voyez &lt;a href=&#34;http://philpep.org/pub/solo.tgz&#34;&gt;le tgz avec ma config&lt;/a&gt;, vous y trouverez &lt;a href=&#34;http://philpep.org/pub/solo/SOLO.html&#34;&gt;la config kernel&lt;/a&gt;, la &lt;a href=&#34;http://philpep.org/pub/solo/alix.cfg.html&#34;&gt;config nanobsd&lt;/a&gt;, et &lt;a href=&#34;http://philpep.org/pub/solo/Files/&#34;&gt;les fichiers&lt;/a&gt; que j&#39;ai mis dans &lt;code&gt;/usr/src/tools/tools/nanobsd/Files/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Avec en particulier &lt;a href=&#34;http://philpep.org/pub/solo/Files/etc/local/dnsmasq.conf.html&#34;&gt;dnsmasq.conf&lt;/a&gt; qui bloque au niveau dns les publicités (avec une liste updatée tous les jours).&lt;/p&gt;
&lt;p&gt;Mon alix sert donc de routeur, serveur dns/dhcp/impression. Sendmail relaye vers mon serveur interne, et syslog envoie tout à mon serveur.&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;% cd /usr/src/tools/tools/nanobsd/
% cp ~/solo/alix.cfg .
% cp -r ~/solo/Files/* Files/
% cp ~/solo/SOLO /usr/src/sys/i386/conf/
% sh nanobsd.sh -c alix.cfg
% wait
% qemu -hda /usr/obj/nanobsd.solo/_.disk.full -m 512 -no-acpi -nographic -cpu pentium
# Hmm quelque chose ne va pas, mais j&amp;#39;ai pas envie de rebuild world et/ou kernel
% sh nanobsd.sh -h
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Mon script utilise des packages préconstruits, si vous voulez les compiler vous même il y a une fonction pour ça dans &lt;code&gt;nanobsd.sh&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Pour finir (ou commencer),  voici &lt;a href=&#34;http://www.freebsd.org/doc/en/articles/nanobsd/index.html&#34;&gt;la doc nanobsd&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Voilà, ma config est certainement loin d&#39;être parfaite niveau taille système mais ma carte flash fait 4G (donc 2G utilisable pour le système) et c&#39;est largement suffisant pour faire tourner une FreeBSD &#34;pas trop dépouillée&#34;.&lt;/p&gt;
&lt;p&gt;Pour mettre à jours (j&#39;ai gzip mon image avant) en supposant que le système tourne sur la partition 1:&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;% ssh phil@aldo cat /usr/obj/nanobsd.solo/_.disk.image.gz | zcat | sh updatep2
% reboot
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;J&#39;ai modifié updatep{1|2} en ajoutant &lt;code&gt;gpart set -a active -i PARTITION_INDEX ad0&lt;/code&gt; en raison d&#39;un problème que vous aurez peut être (la nouvelle partition est pas marquée active...)&lt;/p&gt;
&lt;p&gt;Si le sujet vous intéresse, il y a un projet linux embarqué sympa qui s&#39;appelle &lt;a href=&#34;http://buildroot.net/&#34;&gt;buildroot&lt;/a&gt; où là on peut carrément construire sa chaîne de compilation croisée (arm, mips etc), et construire un système embarqué très personalisé. Dommage qu&#39;il n&#39;existe pas un tel projet basé sur le kernel BSD (un jour peut être...)&lt;/p&gt;</description>
		</item>
		<item>
			<title>Upgrader ses packages FreeBSD</title>
			<link>http://blog.philpep.org/post/Upgrader-ses-packages-FreeBSD</link>
			<guid>http://blog.philpep.org/post/Upgrader-ses-packages-FreeBSD</guid>
			<pubDate>Mon, 28 Dec 2009 02:41:09 GMT</pubDate>
			<description>&lt;p&gt;J&#39;ai un problème depuis longtemps avec les ports FreeBSD. Dans un premier temps je compilais &lt;em&gt;tout&lt;/em&gt;, puis à la longue c&#39;est assez lassant parce que ça prend du temps, des ressources et sur une machine peu puissante c&#39;est pas franchement conseillé. Donc dans la plupart des cas j&#39;utilise maintenant des paquet binaires compilés et distribués par le projet FreeBSD.&lt;/p&gt;
&lt;p&gt;Je ne vais pas m&#39;attarder à peser le pour et le contre puisqu&#39;en réalité j&#39;utilise aussi bien les ports que les paquets binaires suivant les dépendances du logiciel et le temps de compilation.&lt;/p&gt;
&lt;p&gt;Environnement : FreeBSD 8.0-RELEASE i386 (à vous de changer suivant votre version et votre CPU)&lt;/p&gt;
&lt;p&gt;Déjà une bonne chose à savoir :&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;$ ftp ftp://ftp.fr.freebsd.org/pub/FreeBSD/ports/i386/
....
250-descriptions of each subdirectory.
...
250-packages-*-release directories are built from the ports collection
250-shipped with the release, and are not updated thereafter.
250-
250-packages-*-stable and packages-*-current are updated roughly once a
250-week.
....
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Les paquets qui nous intéressent sont donc dans &lt;code&gt;packages-8-stable&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Pour installer un soft, il suffit d&#39;un&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;# export PACKAGESITE=&amp;quot;ftp://ftp.fr.freebsd.org/pub/FreeBSD/ports/i386/packages-8-stable/Latest/&amp;quot;
# pkg_add -r firefox3
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Pour mettre à jours c&#39;est nettement moins marrant, surtout si vous utilisez conjointement un arbre des ports à jours dans &lt;code&gt;/usr/ports&lt;/code&gt;. Les outils comme &lt;code&gt;portmaster&lt;/code&gt; et &lt;code&gt;portupgrade&lt;/code&gt; sont assez dur à utiliser pour mettre à jours en se basant non pas sur l&#39;INDEX de &lt;code&gt;/usr/ports&lt;/code&gt; mais sur celui du ftp.&lt;/p&gt;
&lt;p&gt;D&#39;ailleurs si quelqu&#39;un à déjà réussi à faire proprement la manip je veux bien son &lt;code&gt;/usr/local/etc/pkgtools.conf&lt;/code&gt; en commentaire de ce billet.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://blog.etoilebsd.net&#34;&gt;bapt&lt;/a&gt; est en train de porter &lt;a href=&#34;http://imil.net/pkgin/&#34;&gt;pkgin&lt;/a&gt; sur FreeBSD, mais il n&#39;est pas encore tout à fait prêt (il le sera bientôt j&#39;espère, je ferrai un billet pour l&#39;occasion).&lt;/p&gt;
&lt;p&gt;Il y a une solution que j&#39;ai trouvé sympatique en attendant pkgin, c&#39;est les &lt;code&gt;bsdadminscripts&lt;/code&gt; avec l&#39;outil &lt;code&gt;pkg_upgrade&lt;/code&gt;. C&#39;est du shell, pas très rapide donc, mais au moins ça marche et c&#39;est facile.&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;# make -C /usr/ports/sysutils/bsdadminscripts install clean
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Ensuite c&#39;est enfantin, pour tout mettre à jours et en mode verbeux :&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;# setenv PACKAGEROOT ftp://ftp.fr.freebsd.org
# setenv BRANCH 8-stable
# pkg_upgrade -av
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Et ça marche ! Il se base sur le md5 du fichier INDEX du ftp pour savoir s&#39;il faut mettre à jours sa base de donnée sur les ports puis compare les version installés avec les versions disponibles.&lt;/p&gt;
&lt;p&gt;La page de man de &lt;code&gt;pkg_upgrade&lt;/code&gt; vous donnera beaucoup d&#39;information sur la manière dont il fonctionne.&lt;/p&gt;</description>
		</item>
		<item>
			<title>Scriptez portable !</title>
			<link>http://blog.philpep.org/post/Scriptez-portable-!</link>
			<guid>http://blog.philpep.org/post/Scriptez-portable-!</guid>
			<pubDate>Sat, 05 Sep 2009 19:31:42 GMT</pubDate>
			<description>&lt;p&gt;Vous avez fait un script pratique que vous partagez avec la communauté mais que ce soit en python, en shell, en perl ou je ne sais quoi encore, sachez que les &lt;a href=&#34;http://fr.wikipedia.org/wiki/Shebang&#34;&gt;shebang&lt;/a&gt; sous ces formes ne sont pas portables :&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span class=&#34;c&#34;&gt;#!/bin/bash&lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;#!/bin/zsh&lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;#!/usr/bin/perl&lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;#!/usr/bin/python&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;En effet, même si ces binaires sont à cet emplacement chez vous, il est possible qu&#39;ils ne le soient pas chez les autres, par exemple les logiciels installées par compilation depuis les ports FreeBSD placent souvent leurs binaires dans &lt;em&gt;/usr/local/bin&lt;/em&gt;, il en est de même quand vous faites un &lt;em&gt;./configure &amp;amp;&amp;amp; make &amp;amp;&amp;amp; make install&lt;/em&gt;. Ainsi si on lance un script mal codé :&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;sr&#34;&gt;/script.sh: bad interpreter: /&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bin&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;zsh:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;no&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;such&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;or&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;directory&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Hum, bon vous me direz, ce n&#39;est pas grave, il suffit de changer la première ligne du script. Mais imaginez un peu le travail à fournir si vous deviez changer cette première ligne sur tous vos script...
La meilleure manière de procéder est d&#39;utiliser un shebang portable , et on peut le faire avec la commande env. Exemples de shebang &lt;em&gt;portables&lt;/em&gt; :&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span class=&#34;c&#34;&gt;#!/usr/bin/env bash&lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;#!/usr/bin/env python&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;em&gt;env&lt;/em&gt; ira chercher le programme là ou il est et l&#39;exécutera. Bon, vous me direz, le problème est le même puisqu&#39;il faut que env soit au même endroit pour tout le monde, ben figurez vous que c&#39;est le cas !! Donc le problème est réglé, et vous pouvez poster votre script sur #freebsd-fr@irc.freenode.org sans vous faire insulter (poil au nez).&lt;/p&gt;</description>
		</item>
	</channel>
</rss>

