<?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 alix</title>
		<atom:link href="http://blog.philpep.org/feed/tag/alix/rss2" rel="self" type="application/rss+xml" />
		<description>philpep&#39;s blog - tag alix rss</description>
	<link>http://blog.philpep.org</link>
	<language>fr</language>
		<lastBuildDate>Sat, 18 Dec 2010 00:00:00 GMT</lastBuildDate>
	<generator>Pblog</generator>
		<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>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>Jouons avec kvm</title>
			<link>http://blog.philpep.org/post/Jouons-avec-kvm</link>
			<guid>http://blog.philpep.org/post/Jouons-avec-kvm</guid>
			<pubDate>Sat, 13 Feb 2010 02:31:41 GMT</pubDate>
			<description>&lt;p&gt;J&#39;ai codé un petit programme tout simple qui fait clignoter les leds de mon routeur dès qu&#39;un service est par terre. Ma méthode (qui ne doit pas être la meilleure mais je m&#39;en fout un peu) consiste à regarder régulièrement la liste des processus et détecter l&#39;arrêt d&#39;un service quand le processus associé n&#39;existe plus. J&#39;ai commencé avec un script shell, puis étant assez mauvais pour tout ce qui ressemble de près ou de loin à du script j&#39;ai décidé de le faire en C (langage d&#39;excellence n&#39;est ce pas...?).&lt;/p&gt;
&lt;p&gt;Je me suis volontairement compliqué la tache en utilisant des fonctions très proches du système, ainsi s&#39;il est possible d&#39;obtenir une liste de processus via &lt;a href=&#34;http://www.freebsd.org/cgi/man.cgi?query=ps&#34;&gt;ps(1)&lt;/a&gt; avec un &lt;a href=&#34;http://www.freebsd.org/cgi/man.cgi?query=popen&#34;&gt;popen(3)&lt;/a&gt; super crade ou encore &lt;a href=&#34;http://www.freebsd.org/cgi/man.cgi?query=sysctl&amp;amp;sektion=3&#34;&gt;sysctl(3)&lt;/a&gt; j&#39;ai voulu utiliser &lt;a href=&#34;http://www.freebsd.org/cgi/man.cgi?query=kvm&#34;&gt;kvm(3)&lt;/a&gt; &lt;code&gt;kernel memory interface&lt;/code&gt; qui est en programmation système la méthode la plus appropriée (d&#39;ailleurs &#39;ps&#39; est codé avec ça), c&#39;est juste une interface qui va nous permettre d&#39;accéder au données du kernel (une copie bien entendu), ici la liste des processus en cours.&lt;/p&gt;
&lt;p&gt;Le hic c&#39;est que si les fonctions de kvm sont très standard l&#39;implémentation est très différente suivant les systèmes, comme à peu près toute implémentation, l&#39;important c&#39;est que l&#39;interface soit standard. Ainsi à la lecture de la structure qui décrit les processus &lt;code&gt;kinfo_proc&lt;/code&gt; de &lt;a href=&#34;http://svn.freebsd.org/viewvc/base/head/sys/sys/user.h?view=markup&#34;&gt;sys/user.h&lt;/a&gt; on se dit chouette pleins d&#39;info à disposition, sauf que sur OpenBSD c&#39;est pas du tout la même forme (ni le même fichier d&#39;ailleurs). D&#39;où l&#39;importance d&#39;une interface riche et c&#39;est ce que nous promet &lt;code&gt;kvm&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Assez causé passons au code (je n&#39;explique pas ou peu le code en dehors des fonctions kvm)&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span class=&#34;cp&#34;&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;#include &amp;lt;string.h&amp;gt;&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;#include &amp;lt;unistd.h&amp;gt;&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;#include &amp;lt;err.h&amp;gt;&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;#include &amp;lt;libgen.h&amp;gt;&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;#include &amp;lt;fcntl.h&amp;gt;&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;#include &amp;lt;limits.h&amp;gt;&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;#include &amp;lt;paths.h&amp;gt;&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;#include &amp;lt;kvm.h&amp;gt;&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;#include &amp;lt;sys/param.h&amp;gt;&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;#include &amp;lt;sys/sysctl.h&amp;gt;&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;#include &amp;lt;sys/wait.h&amp;gt;&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;#include &amp;lt;sys/user.h&amp;gt;&lt;/span&gt;

&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;
&lt;span class=&#34;nf&#34;&gt;start_leds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&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;cm&#34;&gt;/* Ici on execute /usr/sbin/gioctl -q gpio0 led3 (on|off)&lt;/span&gt;
&lt;span class=&#34;cm&#34;&gt;     * suivant la parité du conteur statique &amp;#39;i&amp;#39;&lt;/span&gt;
&lt;span class=&#34;cm&#34;&gt;     * 60 fois avec une pause d&amp;#39;une seconde. */&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;static&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;switch&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fork&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;k&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;:
            &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;fork&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
            &lt;span class=&#34;k&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
        &lt;span class=&#34;k&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;:
            &lt;span class=&#34;n&#34;&gt;execl&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;/usr/sbin/gpioctl&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;gpioctl&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;-q&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;gpio0&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
                    &lt;span class=&#34;s&#34;&gt;&amp;quot;led3&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;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&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;s&#34;&gt;&amp;quot;on&amp;quot;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;off&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;kt&#34;&gt;char&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;nb&#34;&gt;NULL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
            &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;execl&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
            &lt;span class=&#34;k&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
        &lt;span class=&#34;nl&#34;&gt;default:&lt;/span&gt;
            &lt;span class=&#34;n&#34;&gt;wait&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;NULL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
            &lt;span class=&#34;k&#34;&gt;break&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;n&#34;&gt;sleep&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;60&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;start_leds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;return&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;kt&#34;&gt;int&lt;/span&gt;
&lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;argc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;char&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;argv&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;n&#34;&gt;kvm_t&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;kd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;kt&#34;&gt;char&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;berr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;_POSIX2_LINE_MAX&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;kinfo_proc&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p&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;procs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;j&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;k&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;found&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;kt&#34;&gt;char&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;**&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pargv&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;

    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;argc&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
        &lt;span class=&#34;n&#34;&gt;errx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;Usage check_proc procs ...&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;

    &lt;span class=&#34;cm&#34;&gt;/* On accède aux données du kernel qui tourne actuellement (NULL) */&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;if&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;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;kd&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;kvm_open&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;NULL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;NULL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;NULL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;O_RDONLY&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;berr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))&lt;/span&gt;
        &lt;span class=&#34;n&#34;&gt;errx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;%s&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;berr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;

    &lt;span class=&#34;cm&#34;&gt;/* On demande la liste des processus, kinfo_proc est décrite&lt;/span&gt;
&lt;span class=&#34;cm&#34;&gt;     * dans sys/sysctl.h sur OpenBSD et sys/user.h sur FreeBSD.&lt;/span&gt;
&lt;span class=&#34;cm&#34;&gt;     * Il nous la donne dans un tableau continu de pointeurs de&lt;/span&gt;
&lt;span class=&#34;cm&#34;&gt;     * taille qu&amp;#39;on récupère dans &amp;#39;n&amp;#39;. */&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;if&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;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;procs&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;kvm_getprocs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;kd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;KERN_PROC_ALL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))&lt;/span&gt;
        &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;kvm_getprocs: %s&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;kvm_geterr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;kd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;

    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;k&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;k&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;argc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;k&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;p&#34;&gt;{&lt;/span&gt;
        &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;j&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;p&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;procs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;j&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;j&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;n&#34;&gt;p&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;p&#34;&gt;{&lt;/span&gt;
            &lt;span class=&#34;cm&#34;&gt;/* On accède à la liste des arguments du programme qui a&lt;/span&gt;
&lt;span class=&#34;cm&#34;&gt;             * généré le processus courant. */&lt;/span&gt;
            &lt;span class=&#34;n&#34;&gt;pargv&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;kvm_getargv&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;kd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
            &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pargv&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pargv&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt;
                    &lt;span class=&#34;n&#34;&gt;strstr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pargv&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;argv&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;k&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;n&#34;&gt;found&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;k&#34;&gt;break&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;span class=&#34;p&#34;&gt;}&lt;/span&gt;

    &lt;span class=&#34;k&#34;&gt;if&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;mi&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;kvm_close&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;kd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
        &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;kvm_close&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;

    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;found&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;argc&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
        &lt;span class=&#34;n&#34;&gt;start_leds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;

    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&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;Et l&#39;exécution, on veut tester si un processus du nom de &#39;dhcpd&#39; tourne sur le système, si ce n&#39;est pas le cas on lance le clignotement de la led pendant une minute :&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;# gcc -o check_proc check_proc.c -lkvm
# ./check_proc dhcpd
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Le mien s&#39;exécute dans un cron toute les minutes :&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;* * * * * /root/bin/check_proc named dhcpd adsuck ntpd
&lt;/pre&gt;&lt;/div&gt;</description>
		</item>
		<item>
			<title>Alix fail et OpenWrt</title>
			<link>http://blog.philpep.org/post/Alix-fail-et-OpenWrt</link>
			<guid>http://blog.philpep.org/post/Alix-fail-et-OpenWrt</guid>
			<pubDate>Mon, 08 Feb 2010 14:46:46 GMT</pubDate>
			<description>&lt;p&gt;Ce week end j&#39;ai essuyé pas mal  d&#39;échecs en tout genres, j&#39;ai une superbe &lt;a href=&#34;/tag/alix&#34;&gt;alix&lt;/a&gt; qui tourne sur &lt;a href=&#34;/tag/OpenBSD&#34;&gt;OpenBSD&lt;/a&gt; et j&#39;ai une carte wifi en minipci dessus qui marche passablement mal sur OpenBSD (tous les modes ne marchent pas et beaucoup de pertes de paquets quand ça marche).&lt;/p&gt;
&lt;p&gt;Du coup je me mis en tête le fait que ça tournera mieux sous un autre OS, j&#39;ai donc essayé dans l&#39;ordre &lt;a href=&#34;/tag/FreeBSD&#34;&gt;FreeBSD&lt;/a&gt;, Debian et &lt;a href=&#34;http://openwrt.org&#34;&gt;OpenWrt&lt;/a&gt;. Aucuns n&#39;a su faire tourner ma carte même avec les derniers drivers, j&#39;avais même pas d&#39;interface, comme quoi le support matériel sur OpenBSD est pas aussi mauvais qu&#39;on le pense.&lt;/p&gt;
&lt;p&gt;Donc si quelqu&#39;un à réussi à faire tourner convenablement la carte &lt;a href=&#34;http://linitx.com/viewproduct.php?prodid=11331&#34;&gt;Engenius NMP-8602+ 400mW a/b/g miniPCI&lt;/a&gt; sur un OS libre merci de me faire signe.&lt;/p&gt;
&lt;p&gt;J&#39;ai donc remis OpenBSD dessus et enlevé la carte wifi (si quelqu&#39;un est intéressé je suis prêt à la céder d&#39;ailleurs, toute neuve jamais servie :&amp;gt;)&lt;/p&gt;
&lt;p&gt;J&#39;ai quand même beaucoup joué avec le boot pxe sur sortie série Linux/BSD donc je suis bien rodé là dessus maintenant. Et surtout j&#39;ai découvert OpenWrt, une toute petite distribution linux pour l&#39;embarqué, faite à la base pour flasher les firmware proprio sur les routeurs du marché elle tourne aussi bien sur tout autre matériel et c&#39;est un projet très dynamique et original. L&#39;installation par pxe est super simple, il suffit de compiler un &lt;a href=&#34;http://en.wikipedia.org/wiki/RAM_disk&#34;&gt;ramdisk&lt;/a&gt; et de démarrer dessus.&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;$ ls -l /usr/local/pxe/
total 1796
-rw-r--r--  1 phil  phil   1786396 Feb  7 15:41 openwrt-x86-vmlinuz
-rwxr-xr-x  1 root  wheel    16466 Feb  6 21:31 pxelinux.0
drwxr-xr-x  2 root  wheel      512 Feb  7 15:41 pxelinux.cfg
$ cat /usr/local/pxe/pxelinux.cfg/default
# Simplement spécifier la vitesse du port série
# 38400 ici
serial 0 38400 0
console 0
label linux
kernel openwrt-x86-vmlinuz
append init=/etc/preinit console=tty0 console=ttyS0,38400n8 reboot=bios
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Après c&#39;est du pxe classique, tftp et dhcpd et ça démarre :&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;openwrt&#34; src=&#34;/static/pub/openwrt.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Après il suffit d&#39;envoyer l&#39;image sur le disque dur (soit la votre, soit celle qui est distribuée) :&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;root@Solo:/# wget http://downloads.openwrt.org/kamikaze/8.09.2/x86/openwrt-x86-squashfs.image
root@Solo:/# dd if=openwrt-x86-squashfs.image of=/dev/hda
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Et &lt;em&gt;c&#39;est tout&lt;/em&gt; !&lt;/p&gt;
&lt;p&gt;À coté de ça vous avez une interface de configuration web convi, un petit sshd &lt;a href=&#34;http://matt.ucc.asn.au/dropbear/dropbear.html&#34;&gt;dropbear&lt;/a&gt; et pleins de packages disponible (très orienté réseau bien sûr). Ça doit être encore plus réjouissant quand on flashe un routeur wifi proprio :)&lt;/p&gt;
&lt;p&gt;Mais bon, alix mérite qu&#39;on l&#39;exploite plus que ça, j&#39;aime bien l&#39;interface web mais j&#39;aime mieux éditer mon &lt;a href=&#34;/tag/Packet%20Filter&#34;&gt;pf.conf&lt;/a&gt; avec &lt;a href=&#34;/tag/vim&#34;&gt;vim&lt;/a&gt;.&lt;/p&gt;</description>
		</item>
		<item>
			<title>Controler les leds sur ALIX 2D3</title>
			<link>http://blog.philpep.org/post/Controler-les-leds-sur-ALIX-2D3</link>
			<guid>http://blog.philpep.org/post/Controler-les-leds-sur-ALIX-2D3</guid>
			<pubDate>Mon, 02 Nov 2009 21:30:58 GMT</pubDate>
			<description>&lt;p&gt;Il y a 4 leds sur le devant, la première est réservée par l&#39;alimentation et la dernière par la carte minipci, mais les deux autres sont à disposition pour nos amis scripteur. Ces deux leds se contrôlent sur les broches 25 et 27 du gpio.&lt;/p&gt;
&lt;p&gt;Il faut les activer avant que securelevel passe à 1. Dans &lt;code&gt;/etc/rc.securelevel&lt;/code&gt; :&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;# Configuring the leds
echo -n &amp;quot;Configuring the leds : &amp;quot;
/usr/sbin/gpioctl gpio0 25 set out led2
/usr/sbin/gpioctl gpio0 27 set out led3
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Un petit reboot, et vous pouvez controler vos leds (q = quiet) avec :&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;gpioctl -q gpio0 led2 off
gpioctl -q gpio0 led2 on
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;A vous de scripter ce que vous voulez derrière, style un script qui fait clignoter la led si la passerelle est accessible etc.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.lekermeur.net/?page_id=565&#34;&gt;Exemple de script&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
		</item>
		<item>
			<title>Install OpenBSD 4.6 sur alix 2D3</title>
			<link>http://blog.philpep.org/post/Install-OpenBSD-4.6-sur-alix-2D3</link>
			<guid>http://blog.philpep.org/post/Install-OpenBSD-4.6-sur-alix-2D3</guid>
			<pubDate>Mon, 26 Oct 2009 01:22:48 GMT</pubDate>
			<description>&lt;p&gt;Je viens d&#39;acquérir une &lt;a href=&#34;http://www.pcengines.ch/alix2d3.htm&#34;&gt;carte ALIX 2D3&lt;/a&gt; pour m&#39;en servir
comme routeur et pour faire tourner certains services critiques à la place de mon serveur qui
pourrait décider de tomber en panne un jour. Cette machine n&#39;ayant pas de cartes graphique
il y a deux méthodes pour installer un OS sur la carte flash :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Installer un OS depuis un autre ordinateur en y branchant la carte flash.&lt;/li&gt;
&lt;li&gt;Boot par PXE (réseau) et communication via le port série.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si comme moi vous n&#39;avez aucuns adaptateur pour brancher la carte flash sur une autre machine
il faut le faire en PXE, vous allez voir que même si ça parait compliqué c&#39;est (après coup)
assez facile à faire.&lt;/p&gt;
&lt;p&gt;Nous allons installer &lt;a href=&#34;http://www.openbsd.org&#34;&gt;OpenBSD&lt;/a&gt; 4.6 par PXE depuis une machine FreeBSD 7.2
mais n&#39;importe quelle autre machine pourvue d&#39;une interface réseau ferra l&#39;affaire (je vous laisse le soin
de trouver la documentation approprié pour votre OS).&lt;/p&gt;
&lt;p&gt;Déjà il faut activer le boot PXE dans le bios de la carte alix, donc il vous faudra un cable null-modem (et
pas un mini gender changer comme j&#39;ai eu le malheur de faire). Si vous n&#39;avez pas de port série, il vous faut
un adaptateur série/USB. Ensuite pour causer au port série j&#39;ai utilisé &lt;a href=&#34;http://www.freshports.org/comms/picocom/&#34;&gt;comms/picocom&lt;/a&gt;,
lançons le avec la vitesse indiquée dans &lt;a href=&#34;http://www.philpep.org/pub/alix2.pdf&#34;&gt;la doc&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;picocom -b38400 -fx /dev/ttyU0
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Pendant le memcheck tapez sur &lt;code&gt;s&lt;/code&gt; pour afficher l&#39;état du bios. Ensuite &lt;code&gt;e&lt;/code&gt; pour activer le boot PXE et &lt;code&gt;q&lt;/code&gt; pour enregistrer
et quitter.&lt;/p&gt;
&lt;p&gt;Pour booter sur le réseau il faut trois choses :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Un serveur dhcp&lt;/li&gt;
&lt;li&gt;Un serveur tftp&lt;/li&gt;
&lt;li&gt;Que alix et le serveur soient branchées ensembles.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Pour le branchement je me suis pas trop cassé la tête vu que les interfaces de la freebox sont sur le même layer.
Il suffit donc de brancher alix sur la freebox (avec l&#39;interface à coté de l&#39;alimentation, je ne sais pas si les autres sont
capables de démarrer en PXE).&lt;/p&gt;
&lt;p&gt;Ensuite installez le serveur dhcp, moi j&#39;ai utilisé &lt;a href=&#34;http://www.freshports.org/net/isc-dhcp30-server&#34;&gt;net/isc-dhcp30-server&lt;/a&gt;.
Ça se configure dans &lt;code&gt;/usr/local/etc/dhcpd.conf&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;ddns-update-style none;
shared-network LOCAL-NET {
    # Mon DNS cache, utilisez ceux de votre FAI si vous n&amp;#39;en avez pas
    option  domain-name-servers 192.168.0.3;

    # On attribue une adresse sur le réseau de la freebox
    subnet 192.168.0.0 netmask 255.255.255.0 {
            # C&amp;#39;est la freebox qui sert de routeur pour l&amp;#39;instant
            option routers 192.168.0.254;
            filename &amp;quot;pxeboot&amp;quot;;
            range 192.168.0.200 192.168.0.202;
            next-server 192.168.0.2; # IP sur serveur de boot PXE
            default-lease-time 86400;
            max-lease-time 90000;
    }
}
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Et maintenant le serveur tftp, juste une ligne à décommenter dans &lt;code&gt;/etc/inetd.conf&lt;/code&gt; :&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;p&gt;Maintenant il faut mettre les bons fichiers au bon endroit :&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;mkdir /tftpboot &amp;amp;&amp;amp; cd /tftpboot
ftp ftp://ftp.fr.openbsd.org/pub/OpenBSD/4.6/i386/pxeboot
ftp ftp://ftp.fr.openbsd.org/pub/OpenBSD/4.6/i386/bsd.rd
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Maintenant démarrez votre serveur de boot PXE :&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;echo dhcpd_enable=\&amp;quot;YES\&amp;quot; &amp;gt;&amp;gt; /etc/rc.conf
echo inetd_enable=\&amp;quot;YES\&amp;quot; &amp;gt;&amp;gt; /etc/rc.conf
/usr/local/etc/rc.d/isc-dhcpd start
/etc/rc.d/inetd start
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Relancez picocom et redémarrez votre alix. Elle va chercher un serveur DHCP, donc si elle ne trouve pas le votre mais plutôt celui de la freebox, désactivez le dhcp de la freebox momentanément.&lt;/p&gt;
&lt;p&gt;Ensuite vous voyez le prompt de boot OpenBSD qui echoue parce
qu&#39;il ne trouve pas de fichier &lt;code&gt;bsd&lt;/code&gt; sur le serveur tftp. Et heureusement parce qu&#39;on a des options à passer au boot
(remarque: on aurrait pu les mettre dans /tftpboot/etc/boot.conf, mais je connais pas parfaitement la syntaxe de ce fichier).
Il faut lui dire qu&#39;on est sur un terminal série et lui donner la vitesse de celui ci :&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span class=&#34;n&#34;&gt;boot&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;stty&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;com0&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;38400&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;boot&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tty&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;com0&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;boot&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bsd&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rd&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Là il va chercher le bsd.rd et démarre l&#39;installateur OpenBSD et vous pouvez suivre &lt;a href=&#34;http://www.openbsd.org/faq/fr/faq4.html#Install&#34;&gt;la documentation&lt;/a&gt;.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Remarque0 : Au moment où j&#39;écris ces lignes la doc d&#39;install n&#39;est pas à jours pour OpenBSD 4.6 , en fait l&#39;installateur est beaucoup plus
simple maintenant.&lt;/li&gt;
&lt;li&gt;Remarque1 : Au moment où il pose la question &#34;Change the default console to com0?&#34; répondez oui, ça évitera de le faire plus tard.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Voilà, sinon j&#39;en suis très heureux de cette petite alix qui me sert maintenant de routeur, j&#39;ai mis un proxy http (privoxy) transparent pour
 filtrer les pubs sur le web, déplacé le serveur DNS dessus en cas de panne de mon autre machine, un &lt;a href=&#34;/tag/Packet%20Filter&#34;&gt;pf&lt;/a&gt;, un dhcpd etc
.&lt;/p&gt;
&lt;p&gt;Enjoy.&lt;/p&gt;</description>
		</item>
	</channel>
</rss>

