<?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 FreeBSD</title>
		<atom:link href="http://blog.philpep.org/feed/tag/FreeBSD/rss2" rel="self" type="application/rss+xml" />
		<description>philpep&#39;s blog - tag FreeBSD 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>Mon réseau</title>
			<link>http://blog.philpep.org/post/mon-reseau</link>
			<guid>http://blog.philpep.org/post/mon-reseau</guid>
			<pubDate>Sat, 18 Dec 2010 00:00:00 GMT</pubDate>
			<description>&lt;p&gt;Ça faisait un petit moment que je devais refaire &lt;a href=&#34;http://philpep.org&#34;&gt;ma homepage&lt;/a&gt;. C&#39;est chose faite (rechargez la page si vous avez encore l&#39;ancienne en cache, c&#39;est full statique avec un trèèèès long ttl).&lt;/p&gt;
&lt;p&gt;J&#39;y décris un peu ce qui se passe dans les trois serveurs que j&#39;administre, pour moi, pour les amis, pour des logiciels libres comme &lt;a href=&#34;http://wmfs.info&#34;&gt;wmfs&lt;/a&gt; et pour les causes que je défends avec une association, &lt;a href=&#34;http://cerf-gresigne.org&#34;&gt;le cerf de grésigne&lt;/a&gt; et &lt;a href=&#34;http://wikileaks.philpep.org&#34;&gt;un miroir wikileaks&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;En modifiant ma map nagios j&#39;ai réussi à faire quelque chose de pas mal pour mieux visualiser la chose :&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;network&#34; src=&#34;http://philpep.org/philpep.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Ça fait maintenant deux ans que l&#39;aventure a commencée, objectif auto-hébergement et auto-formation à l&#39;administration systèmes. Je dois dire que ça a plutôt bien marché puisque l&#39;infrastructure et mes connaissances n&#39;ont cessés de progresser.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fin 2008 Pendant les 3 premiers mois philpep.org n&#39;existait que sur mon portable (sous gentoo, allumé 24h/24), c&#39;était un serveur git pour partager mon code.&lt;/li&gt;
&lt;li&gt;Début 2009 j&#39;ai récupéré un vieux pentium III gracieusement donné par une association Toulousaine sur lequel j&#39;ai installé FreeBSD (7.0 puis 7.1) qui a commencé à faire du mail.&lt;/li&gt;
&lt;li&gt;Mai 2009 je récupère un pentium 4 avec plus de RAM.&lt;/li&gt;
&lt;li&gt;Fin 2009 je m&#39;achète une &lt;a href=&#34;http://www.pcengines.ch/alix2d3.htm&#34;&gt;alix2d3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Début 2010 je prends une machine virtuelle chez lost-oasis (sous FreeBSD puis Debian) pour fournir un MX et DNS secondaire.&lt;/li&gt;
&lt;li&gt;Juillet 2010 je m&#39;achète une nouvelle machine avec plus de RAM et qui consomme moins&lt;/li&gt;
&lt;li&gt;Fin 2010, la machine virtuelle est maintenant chez Hetzner, et sous FreeBSD 8.1 avec un vpn entre mes deux locations.&lt;/li&gt;
&lt;/ul&gt;</description>
		</item>
		<item>
			<title>Installer et booter une FreeBSD zfs on root depuis Debian/Grub2</title>
			<link>http://blog.philpep.org/post/installer-et-booter-une-freebsd-zfs-on-root-depuis-debiangrub2</link>
			<guid>http://blog.philpep.org/post/installer-et-booter-une-freebsd-zfs-on-root-depuis-debiangrub2</guid>
			<pubDate>Mon, 29 Nov 2010 00:00:00 GMT</pubDate>
			<description>&lt;p&gt;J&#39;ai une partition primaire de libre sur mon laptop sous Debian , je comptais y installer une FreeBSD full zfs. Le problème c&#39;est que mon laptop n&#39;a pas (plus) de lecteur cd, et que je me voyais mal faire une installation zfs un peu ardue en pxe et sans avoir la doc dans $BROWSER.&lt;/p&gt;
&lt;p&gt;Alors je me dis qu&#39;installer FreeBSD sur la partition libre depuis ma Debian testing avec zfs-fuse est possible. Évidement pas de chroot possible, mais y&#39;a même pas besoin. Le plus dur ça a été de démarrer la FreeBSD avec grub2, mais je suis tombé sur &lt;a href=&#34;http://grub.enbug.org/GRUB2FreeBSDZFS&#34;&gt;la bonne doc&lt;/a&gt;. Voilà la manip sans attendre que qemu se lance.&lt;/p&gt;
&lt;p&gt;On installe les petits (gros) tools qu&#39;il nous faut (zfs-fuse est dans testing ou sid) :&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;sudo apt-get install bsdtar zfs-fuse lftp
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;On récupère une distribution binnaire de FreeBSD (ici 8.1-RELEASE i386)&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;mkdir ~/freebsd &amp;amp;&amp;amp; cd ~/freebsd
lftp -c &amp;quot;open ftp://ftp.fr.freebsd.org/pub/FreeBSD/releases/i386/8.1-RELEASE/; mirror base&amp;quot;
lftp -c &amp;quot;open ftp://ftp.fr.freebsd.org/pub/FreeBSD/releases/i386/8.1-RELEASE/; mirror kernels&amp;quot;
# Et si vous voulez les man
lftp -c &amp;quot;open ftp://ftp.fr.freebsd.org/pub/FreeBSD/releases/i386/8.1-RELEASE/; mirror manpages&amp;quot;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Ensuite on crée sa pool zfs sur la partition cible (en forçant la version en 14, version de zfs sur FreeBSD)&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;sudo zpool create -o version=14 tank /dev/sda3
sudo zfs create tank/root
# Ici on peut créer tous les datasets qu&amp;#39;il nous faut
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;On extract tout ça :&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;cd ~/freebsd/base &amp;amp;&amp;amp; cat base.?? | sudo bsdtar --unlink -xpzf - -C /tank/root
cd ~/freebsd/kernels &amp;amp;&amp;amp; cat generic.?? | sudo bsdtar --unlink -xpzf - -C /tank/root/boot
cd ~/freebsd/manpages &amp;amp;&amp;amp; cat manpages.?? | sudo bsdtar --unlink -xpzf - -C /tank/root
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Les finitions :&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;# On utilisera le kernel GENERIC
sudo rmdir /tank/root/boot/kernel &amp;amp;&amp;amp; sudo mv /tank/root/boot/GENERIC /tank/root/boot/kernel

# On copie le cache zpool pour que la freebsd retrouve &amp;quot;tank&amp;quot;
sudo cp /var/lib/zfs/zpool.cache /tank/root/boot/zfs/

# On évite un warning
sudo touch /tank/root/etc/fstab

# On se fait un rc.conf
cat &amp;lt;&amp;lt; EOF | sudo tee /tank/root/etc/rc.conf
hostname=&amp;quot;shen.philpep.org&amp;quot;
keymap=&amp;quot;fr.iso.acc&amp;quot;
zfs_enable=&amp;quot;YES&amp;quot;
EOF

# On met mountpoint / pour tank/root (comme ça tank/root/... se montera à partir de /)
sudo zpool export tank
sudo zpool import -R /mnt tank
sudo zpool set mountpoint=/ tank/root
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Et maintenant le plus dur, grub2 :&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;menuentry &amp;#39;FreeBSD&amp;#39; {
    insmod zfs
    search -s -l tank
    kfreebsd /root@/boot/kernel/kernel
    kfreebsd_module_elf /root@/boot/kernel/opensolaris.ko
    kfreebsd_module_elf /root@/boot/kernel/zfs.ko
    kfreebsd_module /root@/boot/zfs/zpool.cache type=/boot/zfs/zpool.cache
    set kFreeBSD.vfs.root.mountfrom=zfs:tank/root
}
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Donc avec cette syntaxe on peut charger des modules au boot et écrire dans des variables sysctl (chose qu&#39;on fait dans /boot/loader.conf avec le bootloader de FreeBSD).&lt;/p&gt;
&lt;p&gt;Ça juste marche, et je trouve ça bien pratique, surtout qu&#39;on peut se servir du pool zfs depuis Debian, et on peut aussi monter l&#39;ext3 depuis FreeBSD.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;EDIT: Je ne peut pas garantir que ce soit très fiable tout ça. Prudence donc. Si vous avez des problèmes au boot de FreeBSD (truc du style &#34;alloc magic is broken&#34;) vous pouvez essayer de remplacer &lt;code&gt;search -s -l tank&lt;/code&gt; par &lt;code&gt;set root=(hd0,3)&lt;/code&gt; (avec la pool en /dev/sda3 chez moi).&lt;/strong&gt;&lt;/p&gt;</description>
		</item>
		<item>
			<title>NSD pour remplacer BIND</title>
			<link>http://blog.philpep.org/post/nsd-pour-remplacer-bind</link>
			<guid>http://blog.philpep.org/post/nsd-pour-remplacer-bind</guid>
			<pubDate>Wed, 17 Nov 2010 18:31:30 GMT</pubDate>
			<description>&lt;p&gt;Je loue une machine virtuelle chez lost-oasis à (12€ par mois, 256Mo de RAM) pour faire du monitoring nagios, du mx/dns secondaire et du mirror http pour mes autres machines dans mon appart. Elle tourne sur Debian (en paravirtualisation kvm, virtio etc), avec de l&#39;openvz par dessus. 256Mo ça fait pas beaucoup, et en browsant sur mon &lt;code&gt;top&lt;/code&gt;, j&#39;ai remarqué que c&#39;était &lt;code&gt;bind&lt;/code&gt; qui prenait le plus de mémoire (loin devant postgresql et php-cgi).&lt;/p&gt;
&lt;p&gt;Je me met donc à la recherche d&#39;un serveur dns qui serait plus léger que bind et qui fasse aussi bien dns primaire et secondaire pour mes 5 petites zones et je me souviens avoir vu passer &lt;a href=&#34;http://www.gcu-squad.org/2010/10/je-voudrais-le-22-a-asnieres/&#34;&gt;une news&lt;/a&gt; à propos de l&#39;intégration récente de &lt;a href=&#34;http://www.nlnetlabs.nl/projects/nsd/&#34;&gt;nsd&lt;/a&gt; dans OpenBSD-Current. Ni une ni deux je dégaine mon &lt;code&gt;apt-get install nsd3&lt;/code&gt; et après quelques jours d&#39;utilisation j&#39;en suis très content.&lt;/p&gt;
&lt;p&gt;Ce qu&#39;il faut savoir à propos de &lt;code&gt;nsd&lt;/code&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;C&#39;est un serveur authoritative only (contrairement à bind qui fait aussi cache et récursion)&lt;/li&gt;
&lt;li&gt;Il est utilisé par quelques uns des root dns servers (on peut donc lui louer une certaine robustesse)&lt;/li&gt;
&lt;li&gt;Il sait lire les même fichiers de zones que bind&lt;/li&gt;
&lt;li&gt;La configuration est extrêmement simple&lt;/li&gt;
&lt;li&gt;Il est bien plus léger en RAM que bind même configuré pour faire la même chose.&lt;/li&gt;
&lt;li&gt;Il fonctionne très bien avec bind en master (j&#39;ai pas testé dans l&#39;autre sens)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Que du bon donc, laisser moi vous montrer un bout de config comme c&#39;est simple :&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;server:
    hide-version: yes

# Une config master avec deux slaves 
zone:
    name: &amp;quot;philpep.org&amp;quot;
    zonefile: &amp;quot;master/philpep.org&amp;quot;

    notify: 217.70.177.40 NOKEY
    provide-xfr: 217.70.177.40 NOKEY

    notify: 212.85.155.53 NOKEY
    provide-xfr: 212.85.155.53 NOKEY

# Une config slave avec un master
zone:
    name: &amp;quot;philpep.org&amp;quot;
    zonefile: &amp;quot;slave/philpep.org&amp;quot;

    allow-notify: 82.229.137.130 NOKEY
    request-xfr: AXFR 82.229.137.130 NOKEY

# Apparemment nsd master ne gère que les transferts de zone AXFR (et pas IXFR)
# Ça n&amp;#39;a pas d&amp;#39;incidence l&amp;#39;un est testé puis l&amp;#39;autre si ça marche pas. Mais vous pouvez éviter
# un message de log en mettant AXFR dans request-xfr dans le cas d&amp;#39;un nsd master et slave.
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Les zones sont strictement les mêmes que celles de bind.&lt;/p&gt;
&lt;p&gt;Bien sûr il est possible de faire des config bien plus velues avec des clés pour faire des zones dynamiques, du chroot etc, voyez  &lt;a href=&#34;http://linux.die.net/man/5/nsd.conf&#34;&gt;nsd.conf(5)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Il y a aussi un utilitaire bien convi pour controler le serveur : &lt;a href=&#34;http://linux.die.net/man/8/nsdc&#34;&gt;nsdc(8)&lt;/a&gt;. Avant de démarrer le serveur pour la première fois, il faut compiler les zones avec &lt;code&gt;nsdc rebuild&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;J&#39;ai trouvé nsd tellement pratique que je l&#39;ai aussi installé en master sur mon serveur FreeBSD  (&lt;code&gt;dns/nsd&lt;/code&gt;), bind sert toujours pour le cache,récursion et mes zones en local, mais je vais certainement le remplacer par un &lt;a href=&#34;http://cr.yp.to/djbdns.html&#34;&gt;djbdns&lt;/a&gt; ou un &lt;a href=&#34;http://www.thekelleys.org.uk/dnsmasq/doc.html&#34;&gt;dnsmasq&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Le script rc de nsd sur FreeBSD &lt;code&gt;/usr/local/etc/rc.d/nsd&lt;/code&gt; est pas terrible, utilisez plutôt &lt;code&gt;nsdc&lt;/code&gt; ou attendez que &lt;a href=&#34;http://www.freebsd.org/cgi/query-pr.cgi?pr=152331&#34;&gt;mon patch&lt;/a&gt; soit accepté :-)&lt;/p&gt;</description>
		</item>
		<item>
			<title>NanoBSD avec / en nfs</title>
			<link>http://blog.philpep.org/post/nanobsd-avec-en-nfs</link>
			<guid>http://blog.philpep.org/post/nanobsd-avec-en-nfs</guid>
			<pubDate>Wed, 03 Nov 2010 00:00:00 GMT</pubDate>
			<description>&lt;p&gt;Dans &lt;a href=&#34;http://blog.philpep.org/post/ma-conf-nanobsd&#34;&gt;un précédent post&lt;/a&gt; j&#39;expliquais comment utiliser le script &lt;code&gt;/usr/src/tools/tools/nanobsd.sh&lt;/code&gt; des sources FreeBSD pour construire un système FreeBSD pour l&#39;embarqué.&lt;/p&gt;
&lt;p&gt;Dans le processus de création d&#39;un tel système, il peut être utile de tester son système sans utiliser la carte flash. On peut adapter le système en le testant sur NFS et n&#39;écrire l&#39;image finale sur la carte flash que quand on a fini.&lt;/p&gt;
&lt;h1&gt;kernel&lt;/h1&gt;
&lt;p&gt;Il faut compiler le kernel avec support NFS et NFS comme système de fichier racine&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;options NFSCLIENT
options NFS_ROOT
&lt;/pre&gt;&lt;/div&gt;


&lt;h1&gt;dhcpd.conf&lt;/h1&gt;
&lt;p&gt;Avec l&#39;option root-path on spécifie le path du montage nfs au client dhcp.&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;filename &amp;quot;pxeboot&amp;quot;;
next-server 192.168.0.20; # le serveur tftpd
option root-path &amp;quot;192.168.0.20:/usr/obj/nanobsd.solo/_.w; # le montage NFS
&lt;/pre&gt;&lt;/div&gt;


&lt;h1&gt;inetd.conf&lt;/h1&gt;
&lt;p&gt;Le bootloader pxeboot est récuperé via tftp, lui même activé par inetd&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;tftp    dgram   udp     wait    root    /usr/libexec/tftpd      tftpd -l -s /tftpboot
&lt;/pre&gt;&lt;/div&gt;


&lt;h1&gt;pxeboot&lt;/h1&gt;
&lt;p&gt;On compile pxeboot avec un baud de 115200 sur la sortie série.&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;cd /usr/src/sys/boot
make BOOT_PXELDR_ALWAYS_SERIAL=1 BOOT_COMCONSOLE_SPEED=115200
mkdir /tftpboot
cp i386/pxeldr/pxeboot /tftpboot
&lt;/pre&gt;&lt;/div&gt;


&lt;h1&gt;nfs&lt;/h1&gt;
&lt;p&gt;Juste une ligne dans &lt;code&gt;/etc/exports&lt;/code&gt;, 192.168.0.1 étant l&#39;IP donnée par mon serveur dhcp à la machine cible.&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;/usr/obj/nanobsd.solo/_.w -alldirs -maproot=root 192.168.0.1
&lt;/pre&gt;&lt;/div&gt;


&lt;h1&gt;rc.conf&lt;/h1&gt;
&lt;p&gt;On active tout ça dans &lt;code&gt;/etc/rc.conf&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt; inetd_enable=&amp;quot;YES&amp;quot;
 nfs_server_enable=&amp;quot;YES&amp;quot;
 rpcbind_enable=&amp;quot;YES&amp;quot;
 mountd_flags=&amp;quot;-r&amp;quot;
 dhcpd_enable=&amp;quot;YES&amp;quot;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Et on démarre les services :&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt; /usr/local/etc/rc.d/isc-dhcpd start
 /etc/rc.d/inetd start
 /etc/rc.d/rpcbind start
 /etc/rc.d/nfsd start
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Maintenant il faut modifier le système généré par NanoBSD car il s&#39;attend à avoir la carte flash comme système de fichier.&lt;/p&gt;
&lt;p&gt;J&#39;ai juste crée une fonction dans ma config nanobsd (fonction à enlever quand on crée les images disques bien entendu) :&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;post_nfsroot {
    rm ${NANO_WORLDDIR}/etc/fstab
    rm ${NANO_WORLDDIR}/conf/default/etc/remount
    echo &amp;quot;&amp;quot; &amp;gt; ${NANO_WORLDDIR}/conf/base/etc/fstab
}

late_customize_cmd post_nfsroot
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Voilà, n&#39;oubliez pas l&#39;option &lt;code&gt;-i&lt;/code&gt; pour gagner le temps de construction des images disques et bon debug :)&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>Réplication de tables PostgreSQL avec londiste</title>
			<link>http://blog.philpep.org/post/replication-de-tables-postgresql-avec-londiste</link>
			<guid>http://blog.philpep.org/post/replication-de-tables-postgresql-avec-londiste</guid>
			<pubDate>Sat, 14 Aug 2010 00:00:00 GMT</pubDate>
			<description>&lt;p&gt;Je me suis mis un petit mx secondaire, ce n&#39;est &lt;a href=&#34;http://www.bortzmeyer.org/mx-secondaire.html&#34;&gt;pas vraiment utile dans mon cas&lt;/a&gt;, mais j&#39;ai des pulsions d&#39;admin en ce moment je ne peux pas résister.&lt;/p&gt;
&lt;p&gt;Et j&#39;ai même fait pire en termes de simplicité, ma liste d&#39;adresse n&#39;étant pas très mouvante répliquer les tables postgresql est vraiment inutile dans mon cas. Mais le sujet m&#39;intéresse alors allons y.&lt;/p&gt;
&lt;p&gt;Les besoins :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;master/slave (pas d&#39;écriture sur la table répliquée)&lt;/li&gt;
&lt;li&gt;Quand le master tombe (même pendant plusieurs jours) on doit pouvoir lire sur le slave&lt;/li&gt;
&lt;li&gt;Quand le slave tombe, ça ne doit pas empêcher d&#39;écrire sur le master&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Donc il me fallait un système asynchrone, facile à utiliser et à resynchroniser quand un des deux serveurs tombe.&lt;/p&gt;
&lt;p&gt;En gros pour répondre à ces besoins il y a deux systèmes de réplication PostgreSQL, &lt;a href=&#34;http://www.slony.info/&#34;&gt;slony&lt;/a&gt; et &lt;a href=&#34;http://wiki.postgresql.org/wiki/Londiste_Tutorial&#34;&gt;londiste&lt;/a&gt;. Slony m&#39;avait l&#39;air assez complexe à utiliser, et la resynchronisation après une panne risquée, londiste fait partie des &lt;a href=&#34;http://wiki.postgresql.org/wiki/Skytools&#34;&gt;Skytools&lt;/a&gt; un ensemble d&#39;utilitaires en python, dont PGQ un système de réplication des résultats basés sur les &lt;a href=&#34;http://docs.postgresqlfr.org/8.4/plpgsql-trigger.html&#34;&gt;trigger&lt;/a&gt; postgresql.&lt;/p&gt;
&lt;p&gt;Quand on écrit sur le master, via les trigger ça met dans une queue, et un daemon s&#39;occupe de donner les résultat de la queue aux slaves qui le demandent (tout ce fait à travers postgresql).
Du coup en termes de réseau, il faut juste que les slaves aient accès aux tables répliquées.&lt;/p&gt;
&lt;p&gt;Une utilisation sympa de londiste, c&#39;est pour migrer de version postgresql. Si la base est grosse, faire un pg_dump/pg_restore prend du temps et si l&#39;application est critique et fait beaucoup d&#39;écritures, le dump est déjà obsolète quand il est fait. Pour éviter d&#39;avoir à bloquer l&#39;application pendant la migration, on peut faire une réplication (vers un slave avec la nouvelle version de PostgreSQL), qui prendra son temps mais une fois finie, on aura deux  base identiques (à quelques secondes près). Alors on peut faire une basculement sur le slave et la coupure du service ne dure que quelques minutes.&lt;/p&gt;
&lt;p&gt;Moi je veux juste répliquer une table (les alias de postfix), entre mon mx primaire et secondaire, avec deux serveurs sous FreeBSD, il faut installer skytools (sur les deux) :&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;[root] % portmaster databases/skytools
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Ensuite créer un utilisateur (ou utiliser un déjà existant).&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;[pgsql] % createuser -S -D -R -P replication
Enter password for new role: rirififiloulou
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;On va répliquer la table alias de la base postfix, il faut créer la base et la table sur le slave et donner des droits sur le master. La base et la table peuvent avoir des noms différents sur les deux serveurs (ce n&#39;est pas le cas ici).&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;[pgsql] % psql -d postfix
postfix# GRANT ALL ON alias TO replication;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Autoriser la connexion du slave vers le master. (à faire sur le master naturellement)&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;[root] % $EDITOR ~pgsql/data/pg_hba.conf
host    postfix    replication    IP_SLAVE/32    md5
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Faites en sorte que le firewall laisse passer tout ça&lt;/p&gt;
&lt;p&gt;Depuis le slave, créez la base et copiez le schéma de la table, on en profite pour rajouter une entrée dans le ~pgsql/.pgpass pour ne plus avoir besoin du password :&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;[pgsql] % cat &amp;gt;&amp;gt; .pgpass &amp;lt;&amp;lt; EOF
MASTER:PORT:postfix:replication:rirififiloulou
EOF
[pgsql] % createdb postfix
[pgsql] % pg_dump -h MASTER -p PORT -U replication -d postfix -t alias -s | pgsql -d postfix
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Ensuite créez la configuration du daemon pgq (à lancer sur le master, avec l&#39;user pgsql), dans ~pgsql/postfix.ini&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;[pgqadm]
job_name = postfix_ticker

db = dbname=postfix
# how often to run maintenance [seconds]
maint_delay = 600

# how often to check for activity [seconds]
loop_delay = 0.1
logfile = ~/%(job_name)s.log
pidfile = ~/%(job_name)s.pid
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Install de pgq sur la base et lancement du daemon :&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;[pgsql] % pgqadm.py postfix.ini install
[pgsql] % pgqadm.py postfix.ini ticker -d
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Maintenant sur le slave, configuration de londiste (toujours avec l&#39;user pgsql), postfix.ini&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;[londiste]
job_name = postfix_alias

provider_db = dbname=postfix port=PORT host=MASTER user=replication
subscriber_db = dbname=postfix port 5432 host=localhost
pgq_queue_name = postfix
logfile = ~/%(job_name)s.log
pidfile = ~/%(job_name)s.pid
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;On installe (qu&#39;une seule fois) et on lance le daemon londiste (toujours depuis le slave) :&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;[pgsql] % londiste.py postfix.ini provider install
[pgsql] % londiste.py postfix.ini subscriber install
[pgsql] % londiste.py postfix.ini replay -d
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Ensuite on peut ajouter des tables à la réplication (aussi des séquences avec add-sec) :&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;[pgsql] % londiste.py postfix.ini provider add public.alias
[pgsql] % londiste.py postfix.ini subscriber add public.alias
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Et voilà la réplication lancée, il y a un tas d&#39;autres commandes sympa, notamment repair/compare qui permet une resynchronisation.&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;% man pgqadm
% man londiste
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Et un &lt;a href=&#34;http://wiki.postgresql.org/wiki/Londiste_Tutorial&#34;&gt;tuto&lt;/a&gt; bien sympa ainsi qu&#39;une &lt;a href=&#34;http://www.dalibo.org/hs44_londiste_la_replicaton_vue_par_skype&#34;&gt;publication&lt;/a&gt; dans GNU/Linux magazine.&lt;/p&gt;</description>
		</item>
		<item>
			<title>installation serveur git avec gitosis, lighttpd et cgit</title>
			<link>http://blog.philpep.org/post/installation-serveur-git-avec-gitosis-lighttpd-et-cgit</link>
			<guid>http://blog.philpep.org/post/installation-serveur-git-avec-gitosis-lighttpd-et-cgit</guid>
			<pubDate>Wed, 11 Aug 2010 03:35:42 GMT</pubDate>
			<description>&lt;p&gt;Pour faire revivre un peu ce blog déserté (en particulier par moi même), un petit billet sur la config de mon serveur git.&lt;/p&gt;
&lt;p&gt;Les dépôts git peuvent se trouver sous deux formes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Une forme pour le développeur/contributeur, c&#39;est ce qu&#39;on obtient avec git clone&lt;/li&gt;
&lt;li&gt;Une forme pour le serveur, que l&#39;on a avec git clone --bare&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En fait on clone toujours depuis un dépôt bare, de la même manière on push sur un dépôt bare.&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;% git clone --bare git://git.wmfs.info/wmfs.git
Initialized empty Git repository in /tmp/wmfs.git/
remote: Counting objects: 5011, done.
remote: Compressing objects: 100% (1096/1096), done.
remote: Total 5011 (delta 3909), reused 5011 (delta 3909)
Receiving objects: 100% (5011/5011), 844.06 KiB, done.
Resolving deltas: 100% (3909/3909), done.

% ls wmfs.git
branches  config  description  HEAD  hooks  info  objects  packed-refs  refs

% git clone ./wmfs.git
Initialized empty Git repository in /tmp/wmfs/.git/

% ls wmfs
CMakeLists.txt  cmake_uninstall.cmake.in  COPYING  rc  README  src  TODO  wmfs.1  wmfs.desktop  wmfs.doxygen.in  wmfsrc.in
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Dans ce dépôt bare il y a tout un tas de choses, notamment les hooks qui permettent de lancer des commandes avant/après un push et tout autre sortes d&#39;événements.&lt;/p&gt;
&lt;p&gt;Git permet de cloner/pusher depuis/vers des dépôts bare d&#39;au moins trois manières différentes.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Par ssh&lt;/li&gt;
&lt;li&gt;Par le protocole git (sur le port 9418 par défaut)&lt;/li&gt;
&lt;li&gt;Par http&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pour ssh, si la sécurité nécessite d&#39;avoir des droits par utilisateurs on peut utiliser &lt;a href=&#34;http://eagain.net/gitweb/?p=gitosis.git&#34;&gt;gitosis&lt;/a&gt; qui va créer un utilisateur git avec un ~git/.ssh/authorized_keys qui limite l&#39;accès aux utilisateurs.&lt;/p&gt;
&lt;p&gt;L&#39;install et l&#39;utilisation est simplisme, voyez la doc de gitosis pour faire des choses plus velues :&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;% make -C /usr/ports/devel/py-gitosis install
% sudo -H -u git gitosis-init &amp;lt; /votre/clef/ssh/publique/id_rsa.pub
% git clone git@serveur:gitosis-admin.git
% cd gitosis-admin    
% &amp;gt;&amp;gt; gitosis.conf
[repo foo]
daemon = yes
^D
% git commit -a -m &amp;quot;Ajout depot foo&amp;quot; &amp;amp;&amp;amp; git push
% mkdir /tmp/foo &amp;amp;&amp;amp; cd /tmp/foo
% echo &amp;quot;foo&amp;quot; &amp;gt; bar
% git init
% git add bar
% git remote add origin git@serveur:foo.git
% git push origin master:refs/heads/master
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Et voilà votre premier dépot git.&lt;/p&gt;
&lt;p&gt;Bon là par ssh, seuls les utilisateurs autorisés pourront cloner. Il nous faut un moyen public pour permettre à quiconque de cloner.&lt;/p&gt;
&lt;p&gt;Par le protocole git c&#39;est très facile :&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;% &amp;gt;&amp;gt; /etc/rc.conf
git_daemon_enable=&amp;quot;YES&amp;quot;
git_daemon_directory=&amp;quot;--base-path=/usr/local/git/repositories&amp;quot;
^D
% /usr/local/etc/rc.d/git_daemon start
# Testons par le protocole git
% git clone git://serveur/foo.git
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Mais si vous voulez offrir un service un peu plus complet comme &lt;a href=&#34;http://github.com&#34;&gt;github&lt;/a&gt;, il faut permettre le clone par http parce que si les utilisateurs sont derrière un firewall nazi qui laisse passer que le port 80 sortant ils ne pourrons pas contribuer à vos softs.&lt;/p&gt;
&lt;p&gt;Pour celà il suffit de configurer le serveur web qui sert /usr/local/git/repositories, ainsi nos amis nazis pourront faire du git clone http://serveur/foo.git.&lt;/p&gt;
&lt;p&gt;Allons y avec &lt;a href=&#34;http://lighttpd.net&#34;&gt;lighttpd&lt;/a&gt; puisqu&#39;il faut faire un choix.&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;% &amp;gt;&amp;gt; /usr/local/etc/lighttpd.conf
$HTTP[&amp;quot;host&amp;quot;] == &amp;quot;serveur&amp;quot; {
    server.document-root = &amp;quot;/usr/local/git/repositories&amp;quot;
}
% /usr/local/etc/rc.d/lighttpd reload
% git clone http://serveur/foo.git
# Arf ça marche pas, permission denied
% cd /usr/local/git/repositories
% chmod o+rx foo.git
% git clone http://serveur/foo.git
# Arf, ça marche toujours pas, il me cause d&amp;#39;un git update-server-info
% cd /usr/local/git/repositories/foo.git
% git update-server-info
% cp hooks/post-update.sample hooks/post-update
% git clone http://serveur/foo.git
\o/
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Bon et pour faire un peu plus &#34;pro&#34;, il nous faut un gitweb celui par défaut en perl me plait pas trop, je préfère nettement &lt;a href=&#34;http://hjemli.net/git/cgit/&#34;&gt;cgit&lt;/a&gt;&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span class=&#34;c&#34;&gt;% make -C /usr/ports/devel/cgit&lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;% &amp;gt;&amp;gt; /usr/local/etc/cgitrc&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;clone&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;prefix&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;git&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;serveur&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;virtual&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;root&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;snapshots&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tar&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;gz&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tar&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bz2&lt;/span&gt;

&lt;span class=&#34;n&#34;&gt;repo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;foo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;git&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;repo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;usr&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;local&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;git&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;repositories&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;foo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;git&lt;/span&gt;
^&lt;span class=&#34;n&#34;&gt;D&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Comme on est malins, on va le mettre sur le même virtualhost. Et on va faire même encore plus fort, on va le mettre le gitweb ET le clone sur &lt;a href=&#34;http://serveur/foo.git&#34;&gt;http://serveur/foo.git&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Pour ça il faut matcher le client git dans la conf lighttpd :&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span class=&#34;nb&#34;&gt;$HTTP&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;host&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;quot;serveur&amp;quot;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;server.document-root&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;quot;/usr/local/git/repositories&amp;quot;&lt;/span&gt;
    &lt;span class=&#34;c1&#34;&gt;# Et si ce n&amp;#39;est pas le client git&lt;/span&gt;
    &lt;span class=&#34;nb&#34;&gt;$HTTP&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;useragent&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;!~&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;quot;^git&amp;quot;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
         &lt;span class=&#34;k&#34;&gt;server.document-root&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;quot;/usr/local/www/cgit/&amp;quot;&lt;/span&gt;
         &lt;span class=&#34;k&#34;&gt;index.file.name&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;cgit.cgi&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
         &lt;span class=&#34;k&#34;&gt;cgi.assign&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;cgi.git&amp;quot;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
         &lt;span class=&#34;k&#34;&gt;server.error-handler-&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;404&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;quot;cgit.cgi&amp;quot;&lt;/span&gt;
         &lt;span class=&#34;k&#34;&gt;url.rewrite-once&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;^/([^?/]+/[^?]*)?(?:\?(.*))?$&amp;quot;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;quot;/cgit.cgi?url=$1&amp;amp;$2&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
     &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;(D&#39;ailleurs je me demande si y&#39;a pas un morceau de code qui fait ça tout seul dans cgit... à voir).&lt;/p&gt;
&lt;p&gt;Voilà, mettez vos petits softs sur le nainternet et attendez les contributions ;)&lt;/p&gt;
&lt;p&gt;Si vous voulez aller encore plus loin, mettez &lt;a href=&#34;http://blog.philpep.org/post/Un-bot-IRC-a-la-CIA-en-python&#34;&gt;un bot irc qui parle quand ça push sur le dépôt git&lt;/a&gt;.&lt;/p&gt;</description>
		</item>
		<item>
			<title>IPV6 step one two</title>
			<link>http://blog.philpep.org/post/IPV6-step-one-two</link>
			<guid>http://blog.philpep.org/post/IPV6-step-one-two</guid>
			<pubDate>Thu, 04 Mar 2010 22:13:28 GMT</pubDate>
			<description>&lt;p&gt;La semaine dernière, j&#39;expliquais &lt;a href=&#34;http://blog.philpep.org/post/IPV6-step-1&#34;&gt;comment j&#39;avais intégré l&#39;IPV6&lt;/a&gt; dans mon réseau. Depuis la donne à fortement changé puisque j&#39;ai mis ma freebox en mode &lt;strong&gt;non&lt;/strong&gt; routeur, et donc mon propre routeur sous FreeBSD (ma nouvelle carte wifi marche pas sous OpenBSD).&lt;/p&gt;
&lt;p&gt;Du coup on en arrive au problème de la freebox qui se comporte en routeur IPV6 même en mode &lt;strong&gt;non&lt;/strong&gt; routeur, voyez plutôt &lt;a href=&#34;http://www.mail-archive.com/frnog@frnog.org/msg03947.html&#34;&gt;cette discussion FRNOG&lt;/a&gt; ou on nous explique que ça va peut être changer bientôt. En attendant, pas moyen de router proprement l&#39;IPV6 de Free sans passer par un proxy ndp ou un bridge logiciel, sans compter qu&#39;il n&#39;est pas possible d&#39;avoir un reverse DNS avec l&#39;IPV6 de Free.&lt;/p&gt;
&lt;p&gt;Grâce à sieur &lt;a href=&#34;http://blog.bsdsx.fr/&#34;&gt;bsdsx&lt;/a&gt; j&#39;ai découvert &lt;a href=&#34;http://tunnelbroker.net/&#34;&gt;tunnelbrocker.net&lt;/a&gt; qui est un service type &lt;a href=&#34;http://en.wikipedia.org/wiki/Tunnel_broker&#34;&gt;tunnel broker&lt;/a&gt; en gros les paquet IPV6 sont encapsulés dans de l&#39;IPV4 entre chez vous et le bout du tunnel (plusieurs sont disponibles suivant votre localisation), ils fournissent un /64 ou un /48 et surtout la possibilité d&#39;avoir un reverse DNS.&lt;/p&gt;
&lt;p&gt;Sachez qu&#39;il y a encore une troisième façon d&#39;avoir une connectivité IPV6, basé sur la &lt;a href=&#34;http://www.ietf.org/rfc/rfc3068.txt&#34;&gt;RFC 3068&lt;/a&gt; ou encore &lt;a href=&#34;http://fr.wikipedia.org/wiki/6to4&#34;&gt;6to4&lt;/a&gt;, qui permet à n&#39;importe qui d&#39;obtenir un /48 sans demander rien à personne (c&#39;est la passerelle 6to4 la plus proche de vous qui prend en charge le routage de votre traffic), le prefixe est calculé à partir de votre IPV4 publique.&lt;/p&gt;
&lt;p&gt;J&#39;ai grosso modo donné les 3 manière communes d&#39;accéder au réseau IPV6 quand on est abonné chez Free. Chaque méthode à son avantage (ou pas), vous pouvez lire &lt;a href=&#34;http://www.culte.org/listes/linux-31/2008-08/msg00011.html&#34;&gt;ce mail&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Perso j&#39;ai choisi le tunnel broker Huricane Electrics qui marche bien, il suffit de créer un compte et un tunnel, ils donnent même la config pour FreeBSD mais pour fixer ça en dur dans &lt;a href=&#34;http://www.freebsd.org/cgi/man.cgi?query=rc.conf&#34;&gt;rc.conf&lt;/a&gt; :&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;ipv6_enable=&amp;quot;YES&amp;quot;
ipv6_gateway_enable=&amp;quot;YES&amp;quot;
gif_interfaces=&amp;quot;gif0&amp;quot;
gifconfig_gif0=&amp;quot;82.229.137.130 216.66.84.46&amp;quot; # Mon IP publique suivie de l&amp;#39;IP du tunnel
ipv6_ifconfig_gif0=&amp;quot;2001:470:1f14:7bf::2 2001:470:1f14:7bf::1 prefixlen 128&amp;quot;
ipv6_defaultrouter=&amp;quot;2001:470:1f14:7bf::1&amp;quot;
# On relie le réseau local (sur l&amp;#39;interface vr1 chez moi)
ipv6_ifconfig_vr1=&amp;quot;2001:470:1f15:7bf:dead:c0de::1 prefixlen 96&amp;quot;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;La conf pf qui va avec :&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;ext_if = &amp;quot;vr0&amp;quot;
int_if  = &amp;quot;vr1&amp;quot;
gif_if  = &amp;quot;gif0&amp;quot;
tun_end = &amp;quot;216.66.84.46&amp;quot; # Le bout du tunnel

localnet = $int_if:network

block log all
pass inet proto icmp all icmp-type { echoreq unreach }
pass inet6 proto icmp6 all icmp6-type { echoreq unreach timex toobig neighbrsol neighbradv }
pass out proto { tcp udp } all
pass out on $ext_if from $ext_if to $tun_end
# On peut filtre ici (là tout passe sans filtrage)
pass in on $gif_if inet6 proto { tcp udp icmp6 } to $localnet
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;En cas de doutes, vous pouvez faire des nmap depuis l&#39;interface web de tunnelbroker.net.&lt;/p&gt;
&lt;p&gt;Pour la config du reverse DNS c&#39;est pas plus compliqué qu&#39;en IPV4 (juste plus long) :&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;; master/local6.rev
$TTL 3600 ; 1 heure
f.b.7.0.5.1.f.1.0.7.4.0.1.0.0.2.ip6.arpa.   IN  SOA ns.philpep.org. root.philpep.org. (
            2010022601  ; serial
            8H          ; refresh
            4H          ; retry
            4W          ; expire
            1D )        ; Min TTL

@       IN       NS ns.philpep.org.
1.0.0.0.0.0.0.0.e.d.0.c.d.a.e.d     IN      PTR solo.philpep.org.
; et named.conf
zone &amp;quot;f.b.7.0.5.1.f.1.0.7.4.0.1.0.0.2.ip6.arpa&amp;quot; {
    type master;
    file &amp;quot;master/local6.rev&amp;quot;;
};
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Autre chose à savoir, l&#39;IPV6 c&#39;est pas encore ça puisqu&#39;on est encore obligé à un moment ou un autre d&#39;encapsuler l&#39;IPV6 dans l&#39;IPV4 et de passer par des tunnels plus ou moins loin, la connectivité sortante en souffre énormément (allez faire un tour sur youtube.com en IPV6 en passant par un tunnel broker...), du coup ça peut être une bonne idée de préférer l&#39;IPV4 sur la machine où il y a le browser :&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;/etc/rc.d/ip6addrctl prefer_ipv4
# ou alors QUE pour firefox about:config
network.dns.disableIPv6
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Si quelqu&#39;un à déjà mis en place son réseau IPV6 en 6to4 avec &lt;a href=&#34;http://www.freebsd.org/cgi/man.cgi?query=stf&#34;&gt;stf(4)&lt;/a&gt;, j&#39;ai lu que la connectivité entrante était moins fiable qu&#39;avec un tunnel broker, je voudrais que quelqu&#39;un m&#39;explique ??&lt;/p&gt;
&lt;p&gt;Quelques liens :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://www.gcu-squad.org/2006/02/aaah-mais-si-mais-ah-ah-bien-sur-mais-oui-savait/&#34;&gt;Découverte du 6to4 chez gcu.info&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://fr.wikipedia.org/wiki/6to4&#34;&gt;6to4 wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://en.wikipedia.org/wiki/Tunnel_broker&#34;&gt;Tunnel broker wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://en.wikipedia.org/wiki/List_of_IPv6_tunnel_brokers&#34;&gt;Liste de Tunnel Broker wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.mail-archive.com/frnog@frnog.org/msg03947.html&#34;&gt;Il a free mais il a pas tout compris FRNOG&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.culte.org/listes/linux-31/2008-08/msg00011.html&#34;&gt;IPV6 au CULTE&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
		</item>
		<item>
			<title>Astuce pf du jour</title>
			<link>http://blog.philpep.org/post/Astuce-pf-du-jour</link>
			<guid>http://blog.philpep.org/post/Astuce-pf-du-jour</guid>
			<pubDate>Tue, 23 Feb 2010 14:09:07 GMT</pubDate>
			<description>&lt;p&gt;J&#39;ai la chance d&#39;avoir une bibliothèque avec un rayon informatique bien rempli dans mon Université, dernièrement j&#39;y ai emprunté &lt;a href=&#34;http://www.eyrolles.com/Informatique/Livre/le-livre-de-packet-filter-9782212125160&#34;&gt;ce bouquin&lt;/a&gt;. Là dedans j&#39;y ai vu une syntaxe pour décrire le réseau local que j&#39;avais raté quand j&#39;ai lu &lt;a href=&#34;http://www.openbsd.org/faq/pf/fr/index.html&#34;&gt;la doc&lt;/a&gt; :&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;ext_if = &amp;quot;rl0&amp;quot;
# Au lieu de
localnet = &amp;quot;{ 192.168.0.0/24, 2a01:e35:2e58:9820::/64 }&amp;quot;
# On peut mettre
localnet = $ext_if:network
# Ou encore
localnet = rl0:network
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;a href=&#34;http://blog.philpep.org/tag/Packet%20Filter&#34;&gt;Pf&lt;/a&gt; va lui même calculer le réseau local à l&#39;aide de l&#39;IP du netmask et du prefixe.&lt;/p&gt;
&lt;p&gt;Attention tout de même si vous avez plusieurs IP (v4 et v6) sur l&#39;interface, ça peut produire des règles redondantes, en cas de doute :&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;pfctl -sr
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;EDIT (27/02/10) : En fait quand il y a des alias sur l&#39;IP il va les évaluer mais pour ne spécifier que l&#39;adresses (sans les alias) on peut mettre $ext_if:network:0 &lt;/p&gt;</description>
		</item>
	</channel>
</rss>

