<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Florent Peterschmitt</title><link href="https://florent.peterschmitt.fr/" rel="alternate"/><link href="https://florent.peterschmitt.fr/feeds/all.atom.xml" rel="self"/><id>https://florent.peterschmitt.fr/</id><updated>2026-03-09T13:00:00+01:00</updated><entry><title>AMD GPU Power Limits</title><link href="https://florent.peterschmitt.fr/amdgpu-power-limits-en.html" rel="alternate"/><published>2026-03-09T13:00:00+01:00</published><updated>2026-03-09T13:00:00+01:00</updated><author><name>Florent Peterschmitt</name></author><id>tag:florent.peterschmitt.fr,2026-03-09:/amdgpu-power-limits-en.html</id><summary type="html">&lt;p&gt;AMDGPU Power Limits&lt;/p&gt;</summary><content type="html">&lt;h2&gt;LACT&lt;/h2&gt;
&lt;p&gt;The wonderful &lt;a href="https://github.com/ilya-zlobintsev/LACT"&gt;https://github.com/ilya-zlobintsev/LACT&lt;/a&gt; provides a daemon and a UI that can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;set various performance flags and values&lt;/li&gt;
&lt;li&gt;monitor GPU activity&lt;/li&gt;
&lt;li&gt;save and apply profiles&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nonetheless, you will need the Kernel cmdline parameter to expose the interface allowing to set parameters.&lt;/p&gt;
&lt;p&gt;Please follow LACT documentations to set it up.&lt;/p&gt;
&lt;h2&gt;Kernel cmdline parameter&lt;/h2&gt;
&lt;p&gt;Add this kernel cmdline parameter to enable power controls: &lt;code&gt;amdgpu.ppfeaturemask=0xffffffff&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;I added this to the grub configuration:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;cat&lt;span class="w"&gt; &lt;/span&gt;/etc/default/grub&lt;span class="p"&gt;|&lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;ppfea
&lt;span class="nv"&gt;GRUB_CMDLINE_LINUX_DEFAULT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;quiet amdgpu.ppfeaturemask=0xffffffff&amp;quot;&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;grub-mkconfig&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;/boot/grub/grub.cfg
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Then reboot, and verify:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;cat&lt;span class="w"&gt; &lt;/span&gt;/proc/cmdline&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;amdgpu.ppfeaturemask
&lt;span class="nv"&gt;BOOT_IMAGE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/vmlinuz-6.12.73+deb13-amd64&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;root&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;UUID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0162acaf-1924-4e08-8546-22f983a2c9d3&lt;span class="w"&gt; &lt;/span&gt;ro&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;rootflags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;subvol&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;@rootfs&lt;span class="w"&gt; &lt;/span&gt;quiet&lt;span class="w"&gt; &lt;/span&gt;amdgpu.ppfeaturemask&lt;span class="o"&gt;=&lt;/span&gt;0xffffffff
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Automatically set limits at boot without LACT&lt;/h2&gt;
&lt;p&gt;I'm using a systemd unit and a custom script that also sets &lt;code&gt;cpupower&lt;/code&gt;:&lt;/p&gt;
&lt;h3&gt;Systemd&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="na"&gt;$ cat /etc/systemd/system/power-settings.service&lt;/span&gt;
&lt;span class="na"&gt;[Unit]&lt;/span&gt;
&lt;span class="na"&gt;Description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Power Settings&lt;/span&gt;
&lt;span class="na"&gt;After&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;multi-user.target&lt;/span&gt;

&lt;span class="k"&gt;[Service]&lt;/span&gt;
&lt;span class="na"&gt;Type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;oneshot&lt;/span&gt;
&lt;span class="na"&gt;ExecStart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/usr/local/bin/power-settings.sh&lt;/span&gt;
&lt;span class="na"&gt;RemainAfterExit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;yes&lt;/span&gt;

&lt;span class="k"&gt;[Install]&lt;/span&gt;
&lt;span class="na"&gt;WantedBy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;multi-user.target&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;This can conflict with &lt;code&gt;power-profiles-daemon&lt;/code&gt; that will reset your CPU settings.&lt;/strong&gt;
In addition, the powersave mode of power-profiles-daemon is actually setting the max freq higher than the performance mode… it's garbage and i've got it disabled:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;systemctl disable --now power-profiles-daemon
systemctl mask power-profiles-daemon
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Custom script (cpupower + amdgpu)&lt;/h3&gt;
&lt;p&gt;Just in case you miss the link to the kernel documentation: &lt;a href="https://www.kernel.org/doc/html/v6.12/gpu/amdgpu/thermal.html#pp-od-clk-voltage"&gt;v6.12 amdgpu pp-od-clk-voltage&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/usr/bin/env bash&lt;/span&gt;

&lt;span class="nv"&gt;FREQ_CPU&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.0&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="c1"&gt;# GHz&lt;/span&gt;
&lt;span class="nv"&gt;FREQ_GPU&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1925&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# MHz&lt;/span&gt;
&lt;span class="nv"&gt;GOV_CPU&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;powersave&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# i can&amp;#39;t really see any diff between these governors. jic.&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;S&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# MIN&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;FREQ_CPU&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;FREQ_GPU&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1300&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;GOV_CPU&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;powersave
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;M&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# MAX&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;FREQ_CPU&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;.15
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;FREQ_GPU&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2600&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;GOV_CPU&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;performance
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;CPU=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FREQ_CPU&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; GPU=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FREQ_GPU&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; GOV=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;GOV_CPU&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
cpupower&lt;span class="w"&gt; &lt;/span&gt;frequency-set&lt;span class="w"&gt; &lt;/span&gt;-d&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.55GHz&lt;span class="w"&gt; &lt;/span&gt;-u&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FREQ_CPU&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;GHz&lt;span class="w"&gt; &lt;/span&gt;-g&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;GOV_CPU&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;/dev/null

&lt;span class="c1"&gt;# ArchLinux uses card1 for some reason, but Debian 13 on my machine is card0&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/sys/class/drm/card0/device

&lt;span class="c1"&gt;# requires amdgpu.ppfeaturemask=0xffffffff on boot cmdline&lt;/span&gt;
&lt;span class="c1"&gt;# https://www.kernel.org/doc/html/v6.12/gpu/amdgpu/thermal.html#pp-od-clk-voltage&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;manual&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;power_dpm_force_performance_level
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;s 0 500&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;pp_od_clk_voltage
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;s 1 &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FREQ_GPU&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;pp_od_clk_voltage
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;c&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;pp_od_clk_voltage
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I can use this script any time with &lt;code&gt;S&lt;/code&gt; or &lt;code&gt;M&lt;/code&gt; as parameter to change performances.&lt;/p&gt;</content><category term="Informatique"/><category term="amd"/><category term="gpu"/><category term="amdgpu"/><category term="power"/><category term="linux"/></entry><entry><title>Logitech G923 Linux Debian 13</title><link href="https://florent.peterschmitt.fr/logitech-g923-linux-debian-13-dirtrally2.html" rel="alternate"/><published>2026-03-09T12:00:00+01:00</published><updated>2026-03-09T12:00:00+01:00</updated><author><name>Florent Peterschmitt</name></author><id>tag:florent.peterschmitt.fr,2026-03-09:/logitech-g923-linux-debian-13-dirtrally2.html</id><summary type="html">&lt;p&gt;Configurer le Logitech 923 (volant + pédales) sur Linux Debian 13&lt;/p&gt;</summary><content type="html">&lt;p&gt;Ça va aller vite :D&lt;/p&gt;
&lt;h2&gt;Logitech G923 sur Linux Debian 13&lt;/h2&gt;
&lt;h3&gt;USB Modeswitch + udev&lt;/h3&gt;
&lt;p&gt;Lorsque l'on connecte le volant, il faut utiliser &lt;code&gt;usb_modeswitch&lt;/code&gt; pour passer le contrôleur en mode XBox :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;apt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;usb&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;modeswitch&lt;/span&gt;
&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cat&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;udev&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;rules&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;99&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;logitech&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;g923&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rules&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;EOF&lt;/span&gt;
&lt;span class="n"&gt;ACTION&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;add&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;SUBSYSTEM&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;usb&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ATTRS&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;idVendor&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;046d&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ATTRS&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;idProduct&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;c26d&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;RUN&lt;/span&gt;&lt;span class="o"&gt;+=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/usr/sbin/usb_modeswitch -v 046d -p c26d -m 01 -r 01 -C 0x03 -M 0f00010142&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;EOF&lt;/span&gt;
&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;udevadm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;control&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;reload&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rules&lt;/span&gt;
&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;udevadm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;trigger&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;La valeur &lt;code&gt;-M 0f00010142&lt;/code&gt; est documentée dans le document du protocole Logitech Force Feedback V1.6 : &lt;a href="https://opensource.logitech.com/wiki/force_feedback/Logitech_Force_Feedback_Protocol_V1.6.pdf"&gt;https://opensource.logitech.com/wiki/force_feedback/Logitech_Force_Feedback_Protocol_V1.6.pdf&lt;/a&gt; page 44.&lt;/p&gt;
&lt;p&gt;On peut exécuter la commande manuellement bien entendu.&lt;/p&gt;
&lt;p&gt;Lorsque le mode change, la roue va se recalibrer et recentrer à nouveau.&lt;/p&gt;
&lt;h3&gt;Vérification USB&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;lsusb&lt;/code&gt; devrait vous lister au moins cette ligne :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;lsusb&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;-i&lt;span class="w"&gt; &lt;/span&gt;logitech
Bus&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;001&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Device&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;007&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;ID&lt;span class="w"&gt; &lt;/span&gt;046d:c26e&lt;span class="w"&gt; &lt;/span&gt;Logitech,&lt;span class="w"&gt; &lt;/span&gt;Inc.&lt;span class="w"&gt; &lt;/span&gt;G923&lt;span class="w"&gt; &lt;/span&gt;Racing&lt;span class="w"&gt; &lt;/span&gt;Wheel&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Xbox&lt;span class="w"&gt; &lt;/span&gt;One&lt;span class="w"&gt; &lt;/span&gt;and&lt;span class="w"&gt; &lt;/span&gt;PC
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Dirt Rally 2.0 - Steam&lt;/h2&gt;
&lt;h3&gt;Steam&lt;/h3&gt;
&lt;p&gt;On l'installe avec le paquet officiel qui, de mémoire, ajoutera un repo APT.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://store.steampowered.com/about/"&gt;https://store.steampowered.com/about/&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-y&lt;span class="w"&gt; &lt;/span&gt;./steam.deb
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;On devrait alors avoir ceci :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;cat&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;/etc//apt/sources.list.d/steam-stable.list&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="k"&gt;deb&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sx"&gt;[arch=amd64,i386 signed-by=/usr/share/keyrings/steam.gpg]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kp"&gt;https://repo.steampowered.com/steam/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kp"&gt;stable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kp"&gt;steam&lt;/span&gt;
&lt;span class="k"&gt;deb-src&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sx"&gt;[arch=amd64,i386 signed-by=/usr/share/keyrings/steam.gpg]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kp"&gt;https://repo.steampowered.com/steam/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kp"&gt;stable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kp"&gt;steam&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Vérification du support de la wheel avec Steam&lt;/h3&gt;
&lt;p&gt;En partant du principe que vous avez déjà lancé steam, et que les fichiers sont bien présents :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;~/.steam/root/ubuntu12_32/steam-runtime/run.sh&lt;span class="w"&gt; &lt;/span&gt;--&lt;span class="w"&gt; &lt;/span&gt;steam-runtime-input-monitor&lt;span class="p"&gt;|&lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;G923
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;product&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;G923 Racing Wheel for Xbox One and PC&amp;quot;&lt;/span&gt;,
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;DEVLINKS=/dev/input/by-id/usb-Logitech_G923_Racing_Wheel_for_Xbox_One_and_PC_00004fed845c5efb-event-joystick /dev/input/by-path/pci-0000:01:00.0-usb-0:9:1.0-event-joystick /dev/input/by-path/pci-0000:01:00.0-usbv2-0:9:1.0-event-joystick&amp;quot;&lt;/span&gt;,
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ID_MODEL=G923_Racing_Wheel_for_Xbox_One_and_PC&amp;quot;&lt;/span&gt;,
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ID_MODEL_ENC=G923\\x20Racing\\x20Wheel\\x20for\\x20Xbox\\x20One\\x20and\\x20PC&amp;quot;&lt;/span&gt;,
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ID_SERIAL=Logitech_G923_Racing_Wheel_for_Xbox_One_and_PC_00004fed845c5efb&amp;quot;&lt;/span&gt;,
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ID_USB_MODEL=G923_Racing_Wheel_for_Xbox_One_and_PC&amp;quot;&lt;/span&gt;,
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ID_USB_MODEL_ENC=G923\\x20Racing\\x20Wheel\\x20for\\x20Xbox\\x20One\\x20and\\x20PC&amp;quot;&lt;/span&gt;,
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ID_USB_SERIAL=Logitech_G923_Racing_Wheel_for_Xbox_One_and_PC_00004fed845c5efb&amp;quot;&lt;/span&gt;,
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Logitech G923 Racing Wheel for Xbox One and PC&amp;quot;&lt;/span&gt;,
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;product&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;G923 Racing Wheel for Xbox One and PC&amp;quot;&lt;/span&gt;,
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;product&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;G923 Racing Wheel for Xbox One and PC&amp;quot;&lt;/span&gt;,
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Vous pouvez &lt;code&gt;Ctrl+C&lt;/code&gt; car le programme écoute les input continuellement.&lt;/p&gt;
&lt;h3&gt;Problèmes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Le pilote est rudimentaire et ne supporte que le Force Feedback. TRUEFORCE ainsi que les LED ne sont &lt;strong&gt;pas&lt;/strong&gt; supportés...&lt;/li&gt;
&lt;li&gt;Il faudra rebind les pédales dans les jeux.&lt;/li&gt;
&lt;li&gt;Sur Dirt Rally 2.0, les contrôles pour le replay ne peuvent pas être changés. Ainsi le jeu croit que la pédale "brake" est toujours enfoncée, mais ça n'est pas le cas.&lt;/li&gt;
&lt;/ul&gt;</content><category term="Informatique"/><category term="debian"/><category term="linux"/><category term="logitech"/><category term="g923"/><category term="steam"/><category term="dirtrally2"/></entry><entry><title>Namasté Népal (2017) - #6</title><link href="https://florent.peterschmitt.fr/namaste-nepal-6.html" rel="alternate"/><published>2026-03-09T12:00:00+01:00</published><updated>2026-03-09T12:00:00+01:00</updated><author><name>Florent Peterschmitt</name></author><id>tag:florent.peterschmitt.fr,2026-03-09:/namaste-nepal-6.html</id><summary type="html">&lt;p&gt;Voyage au Népal 2017, sixième partie&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="/namaste-nepal-5.html"&gt;Article précédent&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;9 ans plus tard :) C'est toujours en 2017…&lt;/p&gt;
&lt;p&gt;Malheureusement il s'est passé trop de temps pour que je puisse commenter. Il s'agit de temples, palais, quelques photos des rues (avec toujours les cicatrices des tremblements de terre de 2015), de boiseries.&lt;/p&gt;
&lt;p&gt;Prenez le temps, c'est la fin !&lt;/p&gt;
&lt;p&gt;Et si vous êtes du genre à passer la même musique en boucle pour regarder des photos, alors je vous propose &lt;a href="https://www.youtube.com/watch?v=72QAAOaYW2M"&gt;RiveR - Solo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;On commence par Kathmandu, puis Bhaktapur.&lt;/p&gt;
&lt;p&gt;&lt;img alt="bhaktapur" src="/static/images/nepal2017/bhaktapur.png"&gt;&lt;/p&gt;
&lt;h2&gt;Kathmandu - Patan&lt;/h2&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP1909.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP1910.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP1911.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP1912.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP1913.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP1916.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP1917.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP1921.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP1923.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP1924.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP1925.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP1927.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP1932.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP1933.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP1935.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP1937.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP1938.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP1939.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP1940.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP1942.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP1943.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP1948.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP1952.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP1953.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP1956.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP1972.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP1973.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP1974.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP1958.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP1962.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP1965.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP1969.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP1970.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP1976.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP1978.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP1980.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP1988.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP2000.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP2002.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP2003.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP2014.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP2028.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP2038.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP2039.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP2040.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP2042.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP2045.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP2048.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP2049.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP2050.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP2056.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP2059.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP2061.jpeg"&gt;&lt;/p&gt;
&lt;h2&gt;Bhaktapur&lt;/h2&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP2071.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP2077.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP2081.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP2083.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP2085.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP2087.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP2102.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP2103.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP2105.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP2106.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP2109.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP2110.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP2111.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP2112.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP2114.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP2118.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP2119.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP2120.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP2121.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP2123.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP2125.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP2129.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP2131.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP2135.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP2136.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP2140.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP2141.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP2142.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP2143.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP2145.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP2147.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP2149.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP2150.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP2151.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP2158.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2704/IMGP2163.jpeg"&gt;&lt;/p&gt;</content><category term="Nepal"/><category term="nepal"/></entry><entry><title>Namasté Népal (2017) - #5</title><link href="https://florent.peterschmitt.fr/namaste-nepal-5.html" rel="alternate"/><published>2022-01-11T17:00:00+01:00</published><updated>2022-01-11T17:00:00+01:00</updated><author><name>Florent Peterschmitt</name></author><id>tag:florent.peterschmitt.fr,2022-01-11:/namaste-nepal-5.html</id><summary type="html">&lt;p&gt;Photos du Népal en 2017, cinquième partie&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="/namaste-nepal-4.4.html"&gt;Article précédent&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;De retour à Kathmandu, nouvelle exploration à l’est de la ville, près du temple Bouddhiste Swayambunath. &lt;a href="https://goo.gl/maps/Si2J5wg8D6zokhJL6"&gt;Lien google maps&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Quelques photos prises sur le chemin :&lt;/p&gt;
&lt;p&gt;&lt;img alt="marche" src="/static/images/nepal2017/2604/IMGP1907.jpeg"&gt;
&lt;img alt="escaliers" src="/static/images/nepal2017/2604/IMGP1791.jpeg"&gt;
&lt;img alt="porte_bois" src="/static/images/nepal2017/2604/IMGP1792.jpeg"&gt;
&lt;img alt="route" src="/static/images/nepal2017/2604/IMGP1798.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Arrivé au pied :&lt;/p&gt;
&lt;p&gt;&lt;img alt="bas_rue" src="/static/images/nepal2017/2604/IMGP1806.jpeg"&gt;
&lt;img alt="bas_rue_temples" src="/static/images/nepal2017/2604/IMGP1807.jpeg"&gt;
&lt;img alt="bas_duo" src="/static/images/nepal2017/2604/IMGP1815.jpeg"&gt;
&lt;img alt="bas_prayer" src="/static/images/nepal2017/2604/IMGP1808.jpeg"&gt;
&lt;img alt="bas_mariage" src="/static/images/nepal2017/2604/IMGP1811.jpeg"&gt;
&lt;img alt="bas_temples" src="/static/images/nepal2017/2604/IMGP1812.jpeg"&gt;
&lt;img alt="bas_frontal" src="/static/images/nepal2017/2604/IMGP1813.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Et il va falloir monter tout ça.&lt;/p&gt;
&lt;p&gt;&lt;img alt="bas_escaliers" src="/static/images/nepal2017/2604/IMGP1828.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Tout en haut des escaliers !&lt;/p&gt;
&lt;p&gt;&lt;img alt="midway" src="/static/images/nepal2017/2604/IMGP1831.jpeg"&gt;
&lt;img alt="autour1" src="/static/images/nepal2017/2604/IMGP1839.jpeg"&gt;
&lt;img alt="autour_devant" src="/static/images/nepal2017/2604/IMGP1857.jpeg"&gt;
&lt;img alt="autour2" src="/static/images/nepal2017/2604/IMGP1859.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Il y a toujours de la place pour ces yeux pénétrants !&lt;/p&gt;
&lt;p&gt;&lt;img alt="eyes" src="/static/images/nepal2017/2604/IMGP1901.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Temple avec boiseries dorées.&lt;/p&gt;
&lt;p&gt;&lt;img alt="temple" src="/static/images/nepal2017/2604/IMGP1870.jpeg"&gt;
&lt;img alt="dorure1" src="/static/images/nepal2017/2604/IMGP1874.jpeg"&gt;
&lt;img alt="dorure3" src="/static/images/nepal2017/2604/IMGP1875.jpeg"&gt;
&lt;img alt="dorure2" src="/static/images/nepal2017/2604/IMGP1878.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Quelques petits plans panoramiques des alentours.&lt;/p&gt;
&lt;p&gt;&lt;img alt="pano1" src="/static/images/nepal2017/2604/IMGP1898.jpeg"&gt;
&lt;img alt="pano2" src="/static/images/nepal2017/2604/IMGP1796.jpeg"&gt;
&lt;img alt="pano3" src="/static/images/nepal2017/2604/IMGP1862.jpeg"&gt;
&lt;img alt="pano4" src="/static/images/nepal2017/2604/IMGP1865.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Sans oublier les tambours…&lt;/p&gt;
&lt;p&gt;&lt;img alt="tambours1" src="/static/images/nepal2017/2604/montage/IMGP1851.jpeg"&gt;
&lt;img alt="tambours2" src="/static/images/nepal2017/2604/IMGP1841.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;…et leur fidèle gardien :D&lt;/p&gt;
&lt;p&gt;&lt;img alt="tambours3_lion" src="/static/images/nepal2017/2604/IMGP1845.jpeg"&gt;
&lt;img alt="lion" src="/static/images/nepal2017/2604/IMGP1846.jpeg"&gt;
&lt;img alt="mini_temples1" src="/static/images/nepal2017/2604/IMGP1879.jpeg"&gt;
&lt;img alt="mini_temples2" src="/static/images/nepal2017/2604/IMGP1882.jpeg"&gt;
&lt;img alt="mini_temples_profondeur" src="/static/images/nepal2017/2604/IMGP1883.jpeg"&gt;
&lt;img alt="temple_statue" src="/static/images/nepal2017/2604/IMGP1891.jpeg"&gt;
&lt;img alt="mini_temples_colonnes" src="/static/images/nepal2017/2604/IMGP1888.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;En redescendant, quelques statues :&lt;/p&gt;
&lt;p&gt;&lt;img alt="statue" src="/static/images/nepal2017/2604/IMGP1817.jpeg"&gt;
&lt;img alt="fresque" src="/static/images/nepal2017/2604/IMGP1818.jpeg"&gt;
&lt;img alt="statue2" src="/static/images/nepal2017/2604/IMGP1892.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Si on cherche des photos de ce même endroit, on trouvera de nombreux macaques. Pour ma part il n’y en avait pas tant que ça&lt;/p&gt;
&lt;p&gt;&lt;img alt="macaque2" src="/static/images/nepal2017/2604/IMGP1820.jpeg"&gt;
&lt;img alt="macaque1" src="/static/images/nepal2017/2604/IMGP1822.jpeg"&gt;
&lt;img alt="macaque3" src="/static/images/nepal2017/2604/IMGP1823.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;À quelques centaines de mètres de ce temple, je suis passé près d’un artisant décorant des bols et proposant à la vente diverses objets en métal. Sur la dernière photo, on trouve le mari à gauche, son frère à droite et sa femme au milieu.&lt;/p&gt;
&lt;p&gt;On a parlé un peu, le frangin traduisant en anglais pour qu’on s’y retrouve :D&lt;/p&gt;
&lt;p&gt;&lt;img alt="artisant" src="/static/images/nepal2017/2604/IMGP1801.jpeg"&gt;
&lt;img alt="famille" src="/static/images/nepal2017/2604/IMGP1904.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;On s’arrête là pour le moment, il me reste encore des photos à publier :D&lt;/p&gt;</content><category term="Nepal"/><category term="nepal"/></entry><entry><title>Namasté Népal (2017) - #4.4</title><link href="https://florent.peterschmitt.fr/namaste-nepal-4.4.html" rel="alternate"/><published>2022-01-11T16:00:00+01:00</published><updated>2022-01-11T16:00:00+01:00</updated><author><name>Florent Peterschmitt</name></author><id>tag:florent.peterschmitt.fr,2022-01-11:/namaste-nepal-4.4.html</id><summary type="html">&lt;p&gt;Photos du Népal en 2017, quatrième partie&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="/namaste-nepal-4.3.html"&gt;Article précédent&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;On redescend de la montagne à dos de Jeep :)&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/2504/IMGP1726.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2504/IMGP1784.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2504/IMGP1769.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2504/IMGP1755.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2504/IMGP1749.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2504/IMGP1706.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2504/IMGP1782.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2504/IMGP1713.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2504/IMGP1745.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2504/IMGP1773.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2504/IMGP1788.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2504/IMGP1781.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2504/IMGP1724.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2504/IMGP1775.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2504/IMGP1705.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2504/IMGP1777.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2504/IMGP1771.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2504/IMGP1780.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="/namaste-nepal-5.html"&gt;Article suivant&lt;/a&gt;&lt;/p&gt;</content><category term="Nepal"/><category term="nepal"/></entry><entry><title>Namasté Népal (2017) - #4.3</title><link href="https://florent.peterschmitt.fr/namaste-nepal-4.3.html" rel="alternate"/><published>2022-01-11T15:00:00+01:00</published><updated>2022-01-11T15:00:00+01:00</updated><author><name>Florent Peterschmitt</name></author><id>tag:florent.peterschmitt.fr,2022-01-11:/namaste-nepal-4.3.html</id><summary type="html">&lt;p&gt;Photos du Népal en 2017, quatrième partie&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="/namaste-nepal-4.2.html"&gt;Article précédent&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ça faisait longtemps que je m'étais promis de publier le reste de mes photos du Népal, en 2017.&lt;/p&gt;
&lt;p&gt;Nous voici en 2022, cinq ans plus tard (vous avez vu ? je sais compter !)&lt;/p&gt;
&lt;p&gt;Cette fois-ci j'aurai moins à dire… voire pas du tout. Donc, mettez une musique tranquille, et voyagez encore un peu !&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/2404/IMGP1683.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2404/IMGP1684.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2404/IMGP1685.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2404/IMGP1686.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2404/IMGP1687.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2404/IMGP1688.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2404/IMGP1689.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2404/IMGP1690.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2404/IMGP1692.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2404/IMGP1698.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2404/IMGP1699.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2404/IMGP1697.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2404/IMGP1701.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2404/IMGP1703.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="/namaste-nepal-4.4.html"&gt;Article suivant&lt;/a&gt;&lt;/p&gt;</content><category term="Nepal"/><category term="nepal"/></entry><entry><title>Namasté Népal - #4.2</title><link href="https://florent.peterschmitt.fr/namaste-nepal-4.2.html" rel="alternate"/><published>2019-01-20T21:30:00+01:00</published><updated>2019-01-20T21:30:00+01:00</updated><author><name>Florent Peterschmitt</name></author><id>tag:florent.peterschmitt.fr,2019-01-20:/namaste-nepal-4.2.html</id><summary type="html">&lt;p&gt;Voyage au Népal 2017, quatrième partie&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="/namaste-nepal-4.1.html"&gt;Article précédent&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;La suite des photos de montagne, le 23 avril 2017 ^^&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/2304/IMGP1632.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2304/IMGP1636.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2304/IMGP1639.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Notre pote singe blanc de la vielle ? Nah, il y en avait tout de même plusieurs ^^&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/2304/IMGP1644.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2304/IMGP1647.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;La personne en bas à droite c’était mon guide. On parlait tout deux suffisemment d’anglais pour pouvoir discuter de choses et d’autres, de la situation du pays, de sa vie etc…&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/2304/IMGP1649.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2304/IMGP1653.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2304/IMGP1654.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2304/IMGP1656.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2304/IMGP1660.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2304/IMGP1664.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;On commence à sortir de la forêt où la température était écrasante et l’absence de circulation d’air rendait la marche franchement difficile.&lt;/p&gt;
&lt;p&gt;Maintenant c’est tout l’inverse : le vent souffle et il est froid ! Je me suis sévèrement enrhumé à ce moment là d’ailleurs… avec fièvre et tout le tintouin.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/2304/IMGP1665.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2304/IMGP1666.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2304/IMGP1667.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/2304/IMGP1668.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2304/IMGP1669.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2304/IMGP1670.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2304/IMGP1671.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2304/IMGP1674.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2304/IMGP1676.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Sur les prochaines photos, on observe ce qu’il reste de la montagne qui s’est effondrée lors du tremblement de terre du 25 avril 2015 dans le pays.&lt;/p&gt;
&lt;p&gt;Un village d’environ 200 habitants a été rasé et beaucoup y sont morts.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/2304/IMGP1677.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2304/IMGP1678.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2304/IMGP1682.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Le village a été reconstruit plus haut et c’est là qu’on passera la nuit.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/2304/IMGP1680.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="/namaste-nepal-4.3.html"&gt;Article suivant&lt;/a&gt;&lt;/p&gt;</content><category term="Nepal"/><category term="nepal"/></entry><entry><title>Namasté Népal - #4.1</title><link href="https://florent.peterschmitt.fr/namaste-nepal-4.1.html" rel="alternate"/><published>2019-01-13T16:15:00+01:00</published><updated>2019-01-13T16:15:00+01:00</updated><author><name>Florent Peterschmitt</name></author><id>tag:florent.peterschmitt.fr,2019-01-13:/namaste-nepal-4.1.html</id><summary type="html">&lt;p&gt;Voyage au Népal 2017, quatrième partie (avec de la montagne !)&lt;/p&gt;</summary><content type="html">&lt;h1&gt;Récapitulatif&lt;/h1&gt;
&lt;p&gt;Dans l’&lt;a href="/namaste-nepal-3.2.html"&gt;article précédent&lt;/a&gt; j’étais donc à Pokhara et je sortais d’une grotte remplie de chauves-souris. Une fois ressorti j’avais prévu de passer encore une journée sur place, après-demain sera donc le retour vers Kathmandu pour commencer le trekking de la vallée de &lt;strong&gt;Langtang&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Le départ est à Syapru Besi, un village à fond pour les touristes venant marcher dans les montagnes. Rien de très étonnant à vrai dire.&lt;/p&gt;
&lt;p&gt;L’arrivée était prévue à 4500 mètres d’altitudes, je me suis arrêté à environ 3000 mètres, avec de la fièvre (oui, je suis retombé malade…) et le souffle coupé. Comme quoi il faut s’entraîner avant, oui bien être fumeur : d’après mon guide les fumeurs, même sans expérience de la montagne arrivent à aller au bout. Ce qui est compréhensible vu qu’un fumeur a régulièrement un manque d’oxygène dans les poumons !&lt;/p&gt;
&lt;p&gt;J’ai découpé le trek en 4 articles à venir ; les photos sont déjà triées, reste plus qu’à en retoucher quelques unes et à publier.&lt;/p&gt;
&lt;p&gt;Et comme toujours, un peu de shell :D&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;img&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;find&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;*&lt;span class="w"&gt; &lt;/span&gt;-name&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;*.*&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;do&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;![photo](/static/images/nepal2017/&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;img&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;)&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;pics.md
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h1&gt;22 Avril 2017 - Vallée de Langtang&lt;/h1&gt;
&lt;p&gt;&lt;img alt="map-trek" src="/static/images/nepal2017/map-trek.png"&gt;&lt;/p&gt;
&lt;p&gt;Démarrage à 1600 mètres environ !&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/2204/IMGP1566.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2204/IMGP1572.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2204/IMGP1573.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2204/IMGP1576.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2204/IMGP1577.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2204/IMGP1582.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2204/IMGP1583.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2204/IMGP1584.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Sur la gauche de la photo, sur ce flan de montagne effondré, des nids d’abeilles. Elles font un miel qui est récolté.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/2204/IMGP1586.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Premier « singe blanc », qui n’a pas voulu montrer sa tête. Impossible de l’avoir en plus gros, le zoom était déjà à son maximum.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/2204/IMGP1589.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2204/IMGP1590.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2204/IMGP1591.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Arrivé au gîte (guest house) ce pti bonhomme parlait mieux anglais que quand j’avais son âge, et débordait d’énergie ! Il a voulu tester l’appareil photo, je l’ai laissé faire, bon, le résultat était pas probant :D&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/2204/IMGP1609.jpeg"&gt;
&lt;img alt="photo" src="/static/images/nepal2017/2204/IMGP1611.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Des rhododendrons !&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/2204/IMGP1614.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Soir nuageux.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/2204/IMGP1615.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Matin dégagé.&lt;/p&gt;
&lt;p&gt;&lt;a href="/namaste-nepal-4.2.html"&gt;Article suivant&lt;/a&gt;&lt;/p&gt;</content><category term="Nepal"/><category term="nepal"/></entry><entry><title>Namasté Népal - #3.2</title><link href="https://florent.peterschmitt.fr/namaste-nepal-3.2.html" rel="alternate"/><published>2018-06-24T18:00:00+02:00</published><updated>2018-06-24T18:00:00+02:00</updated><author><name>Florent Peterschmitt</name></author><id>tag:florent.peterschmitt.fr,2018-06-24:/namaste-nepal-3.2.html</id><summary type="html">&lt;p&gt;Voyage au Népal, troisième partie&lt;/p&gt;</summary><content type="html">&lt;p&gt;Plus d’un an après le dernier article sur le sujet… alala &lt;code&gt;^^'&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Et comme d’habitude, un peut de shell pour corriger les images :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;i&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;find&lt;span class="w"&gt; &lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;-namae&lt;span class="w"&gt; &lt;/span&gt;*.jpeg&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;do&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;convert&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-auto-orient&lt;span class="w"&gt; &lt;/span&gt;/tmp/out.jpeg
&lt;span class="w"&gt;    &lt;/span&gt;mv&lt;span class="w"&gt; &lt;/span&gt;/tmp/out.jpeg&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="/namaste-nepal-3.1.html"&gt;Article précédent&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;Vadrouille - 17 Avril… 2017, hein :D&lt;/h1&gt;
&lt;p&gt;L’objectif était de visiter le musée Gurkha la grotte « Mahendra », où je me suis rendu compte après coup avoir été correctement plumé… ah bah on est touriste ou on ne l’est pas &lt;code&gt;^_^&lt;/code&gt; !&lt;/p&gt;
&lt;p&gt;Voici donc les photos prises pendant le trajet.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1704/IMGP1361.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1704/IMGP1364.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1704/IMGP1365.jpeg"&gt;&lt;/p&gt;
&lt;h3&gt;Bindabasini Temple&lt;/h3&gt;
&lt;p&gt;Endroit un peu en hauteur, vent frais. Je n’ai pas pris beaucoup de photos car j’ai une vidéo du lieu, trop lourde pour être postée ici malheureusement. J’aurais dû y penser, c’est trop tard maintenant !&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1704/IMGP1375.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1704/IMGP1386.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1704/IMGP1387.jpeg"&gt;&lt;/p&gt;
&lt;h3&gt;Musée Gurkha&lt;/h3&gt;
&lt;p&gt;Étant très mauvais historien, je préfère encore vous rediriger vers &lt;a href="https://fr.wikipedia.org/wiki/Gurkhas"&gt;la page wikipedia&lt;/a&gt; sur les &lt;a href="https://fr.wikipedia.org/wiki/Gurkhas"&gt;Gurkhas&lt;/a&gt; plutôt que de tout recopier :)&lt;/p&gt;
&lt;p&gt;Pour faire simple, les Gurkhas sont des unités armées britanniques, entraînées sur place.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1704/IMGP1393.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1704/IMGP1400.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1704/IMGP1401.jpeg"&gt;&lt;/p&gt;
&lt;h4&gt;Visite officielle et rumeurs...&lt;/h4&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1704/IMGP1407.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1704/IMGP1408.jpeg"&gt;&lt;/p&gt;
&lt;h4&gt;Mousquets Martini Henry et India Pattern&lt;/h4&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1704/IMGP1414.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1704/IMGP1425.jpeg"&gt;&lt;/p&gt;
&lt;h4&gt;Moderne et toujours présent&lt;/h4&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1704/IMGP1426.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1704/IMGP1444.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1704/IMGP1446.jpeg"&gt;&lt;/p&gt;
&lt;h3&gt;En allant vers la grotte&lt;/h3&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1704/IMGP1457.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;À l’intérieur de la grotte, à l’entrée, on trouve une roche ayant l’apparence d’une trompe d’éléphant, rapport à Ganesh, le dieu à tête d’éléphant. Peu de touristes sont présents ici, les personnes se bouscules pour faire une brève prière et s’attirer la bonne fortune.&lt;/p&gt;
&lt;p&gt;Ce qui n’empêche pas l’endroit d’être jonché de bouteilles en plastique.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1704/IMGP1464.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Le guide m’emmène vers le reste de la grotte, où seuls les touristes vont. Il avoue lui-même que les touristes Indiens ne sont pas respectueux des lieus et qu’il ne souhaite pas que cette partie soit publiquement accessible.&lt;/p&gt;
&lt;p&gt;Bon par contre, vous remarquerez que j’ai honteusement dérangé ces charmantes chauves-souris…&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1704/IMGP1473.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1704/IMGP1476.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1704/IMGP1480.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1704/IMGP1482.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1704/IMGP1492.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;À la sortie de la grotte, c’est là que le plumage a eu lieu. En grand champion, j’ai confondu, à l’orale, "1000" et "100" en anglais : le guide a annoncé 8000 roupies, j’ai compris 800. Résultat j’y ai laissé 80€ au lieu de 8 pour la visite… évidemment le guide n’allait pas refuser, et il a eu bien raison d’essayer !&lt;/p&gt;
&lt;p&gt;En somme, une journée bien physique, crapahuter dans la grotte c’était quand même assez chouette, et puis surtout il y faisait bien frais :D&lt;/p&gt;
&lt;p&gt;&lt;a href="/namaste-nepal-4.1.html"&gt;Article suivant&lt;/a&gt;&lt;/p&gt;</content><category term="Nepal"/><category term="nepal"/></entry><entry><title>systemd, hostnamed, networkd et l’option 12 de DHCP</title><link href="https://florent.peterschmitt.fr/systemd-hostnamed-networkd-dhcp-hostname.html" rel="alternate"/><published>2017-06-21T20:54:00+02:00</published><updated>2017-06-21T20:54:00+02:00</updated><author><name>Florent Peterschmitt</name></author><id>tag:florent.peterschmitt.fr,2017-06-21:/systemd-hostnamed-networkd-dhcp-hostname.html</id><summary type="html">&lt;p&gt;Utiliser systemd-networkd pour changer son nom de machine via DHCP sous CentOS 7&lt;/p&gt;</summary><content type="html">&lt;p&gt;Ce soir c’était installation d’un Hyper-V sous Windows 10 pour m’assurer que &lt;code&gt;systemd-networkd&lt;/code&gt;, et plus précisément &lt;code&gt;systemd-hostnamed&lt;/code&gt; peut changer le &lt;code&gt;hostname&lt;/code&gt; d’une machine en le récupérant depuis l’option 12 d’une lease DHCP.&lt;/p&gt;
&lt;p&gt;Tout cela a été fait sur CentOS 7 puisque c’est la cible du moment.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yum install -y systemd-networkd
mkdir /etc/systemd/network
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Pour une interface réseau nommée &lt;code&gt;eth0&lt;/code&gt; :&lt;/p&gt;
&lt;p&gt;Créer le fichier &lt;code&gt;/etc/systemd/network/eth0.network&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[Match]&lt;/span&gt;
&lt;span class="na"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;eth0&lt;/span&gt;

&lt;span class="k"&gt;[Network]&lt;/span&gt;
&lt;span class="na"&gt;DHCP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;yes&lt;/span&gt;

&lt;span class="k"&gt;[DHCP]&lt;/span&gt;
&lt;span class="na"&gt;UseHostname&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Activer le bousin :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;systemctl enable systemd-networkd
systemctl enable systemd-hostnamed
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Ensuite, sur CentOS 7 (systemd-219) et peut-être d’autres distributions, il faudra rajouter une règle PolicyKit :&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bugs.freedesktop.org/show_bug.cgi?id=81626"&gt;https://bugs.freedesktop.org/show_bug.cgi?id=81626&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Créer le fichier &lt;code&gt;/etc/polkit-1/rules.d/00-systemd-hostnamed.rules&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;polkit&lt;/span&gt;.&lt;span class="nv"&gt;addRule&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;function&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;action&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subject&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;{
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;action&lt;/span&gt;.&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;org.freedesktop.hostname1.set-hostname&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nv"&gt;subject&lt;/span&gt;.&lt;span class="nv"&gt;user&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;systemd-network&amp;quot;&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;{
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;polkit&lt;/span&gt;.&lt;span class="nb"&gt;Result&lt;/span&gt;.&lt;span class="nv"&gt;YES&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;}
}&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;La &lt;a href="https://www.freedesktop.org/wiki/Software/systemd/hostnamed/"&gt;documentation de hostnamed&lt;/a&gt; fait mention de l’action PolicyKit.&lt;/p&gt;</content><category term="Informatique"/><category term="systemd"/><category term="hostnamed"/><category term="networkd"/><category term="dhcp"/><category term="hostname"/><category term="centos"/></entry><entry><title>Namasté Népal - #3.1</title><link href="https://florent.peterschmitt.fr/namaste-nepal-3.1.html" rel="alternate"/><published>2017-06-05T21:00:00+02:00</published><updated>2017-06-05T21:00:00+02:00</updated><author><name>Florent Peterschmitt</name></author><id>tag:florent.peterschmitt.fr,2017-06-05:/namaste-nepal-3.1.html</id><summary type="html">&lt;p&gt;Voyage au Népal, troisième partie&lt;/p&gt;</summary><content type="html">&lt;p&gt;Depuis le parc national de Chitwan, remontée vers Pokhara, deuxième plus grande ville du Népal après Kathmandu.&lt;/p&gt;
&lt;p&gt;Vadrouillage libre pendant trois jours complets, entre ville, montagnes environnantes et lac.&lt;/p&gt;
&lt;p&gt;Je découperai cette partie en plusieurs articles à cause du nombre de photos que je souhaite vous exposer, afin d’éviter une page trop lourde :)&lt;/p&gt;
&lt;p&gt;Aussi, j’ai appliqué une modification sur toutes les photos postées jusque maintenant afin de les rendre plus légères.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;convert -strip -interlace Plane -quality 80 in.jpeg out.jpeg
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Voir ici : &lt;a href="https://coderwall.com/p/ryzmaa/use-imagemagick-to-create-optimised-and-progressive-jpgs"&gt;https://coderwall.com/p/ryzmaa/use-imagemagick-to-create-optimised-and-progressive-jpgs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="/namaste-nepal-2.html"&gt;Article précédent&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;Sauraha vers Pokhara - 15 Avril&lt;/h1&gt;
&lt;p&gt;Après une nuit pénible éveillé à se demander combien de litres d’eau pourraient encore déserter, et seulement une maigre demi heure endormi, on tambourine à ma porte. Le garde venait me chercher pour le petit déjeuner et me dire que le départ était prévu à 7h.&lt;/p&gt;
&lt;p&gt;C’est donc les yeux fatigués, la mine décomposée mais le ventre à peu près rétabli que je finis de ranger mes affaires et sortir pour aller prendre le bus. Bus plus gros que le premier, avec plus de place pour les jambes. Il est aussi plus lent et le chauffeur n’hésitera pas à doubler de façon risquée, quitte à faire stopper tout le monde pour forcer le passage.&lt;/p&gt;
&lt;p&gt;Pendant la nuit il a plu, rendant la matinée fraiche et l’air léger. Mais ça ne dure pas, dès que le ciel est dégagé, le soleil sèche tout et le festival de la poussière reprend.&lt;/p&gt;
&lt;p&gt;En arrivant sur la route principale menant à Pokhara, on a droit à une drôle d’illusion d’optique. J’ai cru voire une montagne en demi sphère avec une route tournant autour. J’ai pensé à ces décors surréalistes que l’on peut voir dans certains mangas, m’attendant à une tortue géante se soulevant tout d’un coup.&lt;/p&gt;
&lt;p&gt;Ça a duré un moment, jusqu’à ce que le bus et la montagne ne soient plus alignés et que tout redevienne normal. Une bête montagne et notre route passant devant, au final.&lt;/p&gt;
&lt;p&gt;On arrive en milieu d’après midi à l’arrêt de bus touristique de Pokhara, tout près de « Lake Side » où j’ai mon prochain hotel.&lt;/p&gt;
&lt;p&gt;Je reprends mon sac à dos, brûlant, recouvert de poussière et percé à un endroit. Sur les épaules il paraît encore plus lourd que d’habitude… ne pas avoir mangé ni dormis pendant 24h n’aidant pas.&lt;/p&gt;
&lt;p&gt;Sur le trajet, à ma gauche, le lac de Pokhara, puis une petite montagne recouverte de végétation. Je retiens ça pour plus tard, il doit forcément y avoir un point de vue ou quelque chose à faire là haut.&lt;/p&gt;
&lt;p&gt;La carte du GPS n’est encore pas à jour et je dois demander mon chemin. Pour ça, je rentre dans un autre hotel qui semble avoir pris la place de celui où j’ai réservé et demande.&lt;/p&gt;
&lt;p&gt;En rentrant dans l’hôtel, un des serveurs me salue avant de disparaître dans une autre pièce comme s’il venait de se rappeler de quelque chose d’urgent à faire.&lt;/p&gt;
&lt;p&gt;À l’accueil je demande l’hôtel dont je ne me souviens plus aujourd’hui le nom. Une charmante demoiselle me répond que c’est en bas de la rue avant d’être interrompue par le serveur de tout à l’heure. Il tient son plateau en l’avançant légèrement vers moi, avec un verre de jus de mangue.&lt;/p&gt;
&lt;p&gt;« Sir, do you want a welcome drink? » me dit-il avec un grand sourire. Avant d’accepter je précise que je n’ai pas réservé dans l’hôtel, ce à quoi les trois personnes présentent à ce moment me répondent en même temps qu’il n’y a pas de problème, que c’est offert et que je peux le prendre. Roh, c’est gentil !&lt;/p&gt;
&lt;p&gt;Avant de repartir, étant affamé je demande s’ils proposent des soupes de légumes en leur expliquant rapidement pourquoi. J’y reviendrai le soir, pour l’instant il faut absolument que je pose ce sac, trouve de l’eau et dorme !&lt;/p&gt;
&lt;p&gt;L’hôtel est une maison d’hôtes entourée de verdure, au fond d’une grande allée. Sur le côté, un lavabo fuit, et de l’autre côté de l’eau s’écoule dans l’escalier permettant d’aller à l’étage. J’ai manqué l’accueil qui était juste sur ma droite en rentrant…&lt;/p&gt;
&lt;p&gt;Petit problème de réservation, à mon avantage : au lieu de devoir laver le cochon presque dehors, ça pourra se faire dans une salle de bain fournie avec la chambre ! On est quand même bien content d’avoir son petit confort :)&lt;/p&gt;
&lt;p&gt;Sieste, hydratation forcée, sieste encore et finalement je retourne voir le premier hotel.&lt;/p&gt;
&lt;p&gt;Petite soupe de riz avec quelques légumes juste cuits, accompagné d’un thé au gingembre. Je ne l’avais pas demandé mais il sera très bon pour ce que j’ai.&lt;/p&gt;
&lt;p&gt;La télévision diffuse une émission où des enfants jouent des sketchs. La chaîne s’appelle « color » et est notemment diffusée en Inde. Les serveurs semblent amusés pendant que je me demande bien ce qu’ils peuvent raconter de si drôle. À Mumbai cette même chaîne diffusait un genre de « Plus belle la vie » à base de grandes méchantes sorcières, de mariage saboté et de &lt;em&gt;bisous bisous mon amoureux alala ils sont méchants&lt;/em&gt;, mais à la sauce Indienne.&lt;/p&gt;
&lt;p&gt;Repas à 2.15€ et un accueil chaleureux, je n’en demandais pas tant ! Aller hop. Dodo.&lt;/p&gt;
&lt;h1&gt;Pokhara - Pagode de la paix - 16 Avril&lt;/h1&gt;
&lt;p&gt;Encore des patates en petit dèj. &lt;em&gt;Humpf…&lt;/em&gt; Les jours suivants j’aurai trouvé un restaurant typique… pour les touristes en mal du pays : « Metro », ils y font de divines crêpes, pour tous les repas ! Miôm&lt;/p&gt;
&lt;p&gt;Du coup, la veille j’avais vu sur la carte qu’il est possible de monter au sommet de la montagne, jusqu’à la pagode de la paix. En m’y rendant à pied, je longe la partie touristique du lac. Restaurants, boutiques de vêtements, agence de voyage, tout y est.&lt;/p&gt;
&lt;p&gt;Histoire de changer d’ambiance, j’essaye de trouver un chemin plus proche du lac. Il y en a, traversant quelques parcs et petits cours d’eau.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1604/IMGP1216.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Dans les parcs je croiserai quelques Népalais déjà ivres et quelques rares touristes. Ce chemin bordant le lac donne aussi sur les cours arrières de certains hôtels luxueux, ce qui n’empêche personne de brûler là les déchets et de jeter tout un tas de détritus dans l’eau.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1604/IMGP1219.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1604/IMGP1221.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Les rues sont calmes et bien entretenues, ici les routes sont presque toutes &lt;em&gt;bitumées&lt;/em&gt;, évitant la poussière que l’on connaît à Kathmandu.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1604/IMGP1222.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;En suivant la route pour monter vers la pagode de la paix, je tombe encore sur un guide improvisé. À l’entrée du chemin vers la montagne, il me montrera un panneau indiquant que si les autorités nous voient nous aventurer seuls par là, une amende de 4500 roupies nous attend. C’est le prix d’un permis de trekking au Népal.&lt;/p&gt;
&lt;p&gt;Du coup mon guide m’accompagne et monte à toute vitesse. Je le force à ralentir car de toute façon, je prends mon temps.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1604/IMGP1225.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;L’autre versant de la montagne.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1604/IMGP1226.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Mon guide me dit que le chemin est vraiment très dangereux et que de nombreuses personnes trouvent la mort ici. J’ai vu bien pire et je commence à penser qu’il met en place une petite stratégie à base de peur en espérant me soutirer un peu trop d’argent.&lt;/p&gt;
&lt;p&gt;Au bout de vingt minutes il m’abandonne en m’indiquant vaguement le chemin, mais pas sans me demander le lui laisser quelques dollars ou euros.&lt;/p&gt;
&lt;p&gt;« I collect money, so if you have like 20 euros or dollars… »&lt;/p&gt;
&lt;p&gt;Vingt euros ou dollars pour vingt minutes de marche, en plus en se moquant du monde. Quand je refuse une telle somme il commence à paniquer et à insister sur le fait qu’il collectionne la monnaie. Pour ma part j’insiste sur le fait que c’est vraiment se moquer du monde, et plus ça va, l’émotion monte et il est au bord des larmes.&lt;/p&gt;
&lt;p&gt;Je lui laisse 300 roupies, qu’il refusera dans un premier temps, avant que je ne lui fasse quand même comprendre que refuser est pire que d’avoir moins que la somme espérée. Il prendra l’argent avant de repartir aussi sec.&lt;/p&gt;
&lt;p&gt;Le chemin vers la pagode est très tranquille, entre les arbres et le vent rafraichi par la végétation circule.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1604/IMGP1231.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1604/IMGP1233.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1604/IMGP1235.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1604/IMGP1236.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Certaines statues n’ont pas bien l’air d’origine. Ça fait plastique tout ça.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1604/IMGP1238.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1604/IMGP1241.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;En redescendant d’un étage, on peut avoir une vue sur le lac et la ville de Pokhara.&lt;/p&gt;
&lt;p&gt;Aller, pause miam ! On ne dirait pas comme ça, mais ce petit trajet a bien pris deux à trois heures, tranquillou.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1604/IMGP1246.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1604/IMGP1247.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Sur la terrasse du restaurant, en regardant par la gauche en étant dos à la pagode, vue sur les montagnes et a priori l’Annapurna… pas sûr. Un groupe de français à côté en discutait et ne savait pas non plus.&lt;/p&gt;
&lt;p&gt;Les photos sont grisatres, je n’ai pas trouvé les bons réglages, et pour ne rien arranger, les montagnes sont loin et l’athmosphère est chargée, comme d’habitude.&lt;/p&gt;
&lt;p&gt;Aller, on redescend. Sur le chemin un vieil homme charge de grosses caillasses dans un panier porté sur le dos par une femme, pas beaucoup plus jeune.&lt;/p&gt;
&lt;p&gt;La pente est raide, le chemin arrangé en escaliers. La vue est encombrée mais par moments, on a droit à une petite percée.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1604/IMGP1252.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Arrivé en bas, la seule solution est de prendre un canot, propulsé à la force des bras de petits bonhommes d’une dizaine d’années seulement. Ou alors de remonter.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1604/IMGP1253.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;En attendant le fiston revenant avec deux autres touristes, on prend bien soin de rester les machoîres pendues devant les montagnes.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1604/IMGP1255.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Embarquement immédiat ! Au moins celui-là je ne risque pas de le manquer… et il n’en coûtera que 400 roupies. C’est quand même beaucoup pour trois minutes de trajet jusqu’à l’îlot sur le lac.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1604/IMGP1261.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1604/IMGP1264.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1604/IMGP1267.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Plusieurs petits temples sont présents sur l’île et il y a pas mal de monde.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1604/IMGP1266.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Revenons sur la terre ferme.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1604/IMGP1271.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1604/IMGP1281.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Sur le chemin, un arbre est complètement envahi par ces drôles d’oiseaux ! C’est pas aussi bien que les canards de Wasquehal mais c’est pas mal non plus ;-)&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1604/IMGP1282.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1604/IMGP1284.jpeg"&gt;&lt;/p&gt;
&lt;h2&gt;Plus haut dans la ville…&lt;/h2&gt;
&lt;p&gt;…en se perdant un peu, des maisons se construisent, d’autres sont bien établies, mais toutes sont situées entre des champs ! Et pourtant je n’ai marché que pendant une demi heure.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1604/IMGP1287.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1604/IMGP1286.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Les gens me regardent avec insistance, je suis le seul blanbec recouvert de fringues de toutes les rues que je traverserai. Mais que font les autres touristes quand ils voyagent ? Bien souvent le plus intéressant, à mes yeux, s’est trouvé là où personne n’allait.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1604/IMGP1292.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;On trouve quelques cybercafés dans la ville, et c’est assez drôle de voir la deventure plongée dans le noir en imaginant qu’il y a quand même des machines capables de faire tourner CoD là dedans :D&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1604/IMGP1293.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Mais on retrouvera aussi des habitations plus typiques. D’ailleurs par rapport à Kathmandu, on en croise beaucoup plus.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1604/IMGP1294.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1604/IMGP1295.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1604/IMGP1296.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1604/IMGP1297.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Les temples sont partout, même au dessus d’autres bâtisses !&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1604/IMGP1299.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1604/IMGP1301.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1604/IMGP1303.jpeg"&gt;&lt;/p&gt;
&lt;h2&gt;Sur une petite montagne&lt;/h2&gt;
&lt;p&gt;Un monastère bouddhiste se dresse. Le soleil est bas, je suis arrivé au « Matepani Gumba ». Ou en tout cas, au début des marches !&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1604/IMGP1319.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1604/IMGP1320.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1604/IMGP1326.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Au moment où je prends cette photo je me dis « il faudra que je le prenne de face », et évidemment, j’ai oublié.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1604/IMGP1330.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1604/IMGP1336.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Deux moines assis sur un banc en face de cette entrée discutent. Des enfants jouent à la corde à sauter, à la balle ou à ce qui pourrait être un cache-cache.&lt;/p&gt;
&lt;p&gt;Ils sont tous vêtus de la robe bouddhiste, pourpre ou ocre.&lt;/p&gt;
&lt;p&gt;Petit coin tranquille après le tumulte de la ville. Il faut pourtant y retourner, il est presque 18h, la nuit n’est pas loin.&lt;/p&gt;
&lt;p&gt;Je prendrai un taxi afin d’arriver plus rapidement et d’éviter de marcher la nuit.&lt;/p&gt;
&lt;p&gt;&lt;a href="/namaste-nepal-3.2.html"&gt;Article suivant&lt;/a&gt;&lt;/p&gt;</content><category term="Nepal"/><category term="nepal"/></entry><entry><title>WeeChat et tmux sont dans une unité systemd</title><link href="https://florent.peterschmitt.fr/weechat-tmux-systemd-user-unit.html" rel="alternate"/><published>2017-05-23T20:29:00+02:00</published><updated>2017-05-23T20:29:00+02:00</updated><author><name>Florent Peterschmitt</name></author><id>tag:florent.peterschmitt.fr,2017-05-23:/weechat-tmux-systemd-user-unit.html</id><summary type="html">&lt;p&gt;Démarrer notre client IRC préféré dans une session Tmux, au démarrage de la machine, via une unité systemd pour un utilisateur précis.&lt;/p&gt;
&lt;p&gt;Sur ArchLinux, systemd 232-8 :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;useradd -m -G users florent
su - florent
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Petit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;problème&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;avec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;certaines&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Arch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;certains&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ont&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;corrigé&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;le&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;problème&lt;/span&gt;
&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;en&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;réinstallant&lt;/span&gt;&lt;span class="err"&gt;…&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="err"&gt;’&lt;/span&gt;&lt;span class="n"&gt;est&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sensé&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;être …&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</summary><content type="html">&lt;p&gt;Démarrer notre client IRC préféré dans une session Tmux, au démarrage de la machine, via une unité systemd pour un utilisateur précis.&lt;/p&gt;
&lt;p&gt;Sur ArchLinux, systemd 232-8 :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;useradd -m -G users florent
su - florent
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Petit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;problème&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;avec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;certaines&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Arch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;certains&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ont&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;corrigé&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;le&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;problème&lt;/span&gt;
&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;en&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;réinstallant&lt;/span&gt;&lt;span class="err"&gt;…&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="err"&gt;’&lt;/span&gt;&lt;span class="n"&gt;est&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sensé&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;être&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;géré&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;par&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;le&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;module&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pam_systemd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Essayez&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;de&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;le&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;faire&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sans&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;positionner&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cette&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;variable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;manuellement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;export XDG_RUNTIME_DIR=/run/user/$(id -u)&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;~/&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bashrc&lt;/span&gt;
&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bashrc&lt;/span&gt;

&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Ici&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;logeront&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;vos&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;unités&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;utilisateur&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;mkdir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;~/&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;user&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;

&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="err"&gt;’&lt;/span&gt;&lt;span class="n"&gt;unité&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;en&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;question&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;On&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="err"&gt;’&lt;/span&gt;&lt;span class="n"&gt;assure&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="err"&gt;’&lt;/span&gt;&lt;span class="n"&gt;avoir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;du&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;réseau&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;avant&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;de&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;démarrer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;WeeChat&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sait&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;très&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;bien&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;faire&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;la&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;reconnexion&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mais&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;je&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;préfère&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;cat&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;florent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;user&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;weechat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;EOF&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Unit&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;Description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;WeeChat&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;IRC&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Client&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ow"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tmux&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;After&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;network&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;

&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Service&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;Type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;oneshot&lt;/span&gt;
&lt;span class="n"&gt;RemainAfterExit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;yes&lt;/span&gt;
&lt;span class="n"&gt;ExecStart&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmux&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;session&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;irc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;weechat&lt;/span&gt;
&lt;span class="n"&gt;ExecStop&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmux&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;kill&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;session&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;irc&lt;/span&gt;

&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Install&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;WantedBy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;
&lt;span class="n"&gt;EOF&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Ensuite on pourra tout simplement activer, démarrer et &lt;em&gt;enjoyer&lt;/em&gt; :D&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;systemctl --user enable weechat.service
systemctl --user start weechat.service
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Et quand on voudra récupérer notre WeeChat, &lt;code&gt;tmux a -t irc&lt;/code&gt; et zou ^_^&lt;/p&gt;
&lt;p&gt;Sources :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.mythmon.com/posts/2015-02-15-systemd-weechat.html"&gt;http://www.mythmon.com/posts/2015-02-15-systemd-weechat.html&lt;/a&gt; (je suis très feignant)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bbs.archlinux.org/viewtopic.php?id=201543"&gt;https://bbs.archlinux.org/viewtopic.php?id=201543&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="Informatique"/><category term="systemd"/><category term="weechat"/><category term="tmux"/></entry><entry><title>Namasté Népal - #2</title><link href="https://florent.peterschmitt.fr/namaste-nepal-2.html" rel="alternate"/><published>2017-05-21T19:03:00+02:00</published><updated>2017-05-21T19:03:00+02:00</updated><author><name>Florent Peterschmitt</name></author><id>tag:florent.peterschmitt.fr,2017-05-21:/namaste-nepal-2.html</id><summary type="html">&lt;p&gt;Voyage au Népal, deuxieme partie&lt;/p&gt;</summary><content type="html">&lt;p&gt;Direction le parc national de Chitwan, dans le Terraï. Long voyage, bestioles et bactéries…&lt;/p&gt;
&lt;p&gt;J’en profite pour vous informer que la barre de droite peut être masquée en cliquant sur la séparation. Ça fait plus de place pour les photos.&lt;/p&gt;
&lt;p&gt;&lt;a href="/namaste-nepal-1.html"&gt;Article précédent&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;Kathmandu vers Sauraha - 13 Avril&lt;/h1&gt;
&lt;p&gt;Réveil à 4h15 du matin, ça pique… il fait tout noir, les chiens n’aboient plus et tout est extrèmement calme. Toilette, chaussures, sac à dos et zou. J’ai cinquante minutes de marche devant moi, à travers la ville, avec pour seuls compagnons le GPS et la lampe torche. Quelle grande idée j’ai eu de l’emporter…&lt;/p&gt;
&lt;p&gt;Le portail de l’hôtel était fermé avec un cadenas. J’avais prévenu le staff, ils m’ont dit de les réveiller. Je toque à la porte « STAFF ». Ça ronfle, et fort, mais ça ne bouge pas. Plan B !&lt;/p&gt;
&lt;p&gt;Vu qu’il n’y a personne dans les rues et que tout le monde ronfle manifestement, je passe par dessus la grille, en ayant préalablement accroché les sacs sur les piques de la grilles afin de pouvoir passer sans risquer de riper, et de finir embroché.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Pouarf&lt;/em&gt; l’aterrissage était un peu lourd… c’était haut.&lt;/p&gt;
&lt;h2&gt;La traversée de la mort toute noire qui fait peur&lt;/h2&gt;
&lt;p&gt;Je disais donc, cinquante minutes à marcher dans le noir quasi complet, avec de temps en temps un pauvre lampadaire, mais surtout, oh la la, surtout, des chiens qui se réveillent tout d’un coup et me gueulent dessus ! Il y en a même un qui m’a suivi sur une centaine de metres en grondant derrière.&lt;/p&gt;
&lt;p&gt;Je lui répondais à coup de pinceau de lumière bien éclatant dans la truffe. 300 lumens, je crois que même les chicots on vu le jour ! Quand le faisseau lui passait devant les yeux, il marquait un coup d’arrêt. Il a fini par lâcher l’affaire mais pas sans hurler à la mort et réveiller tous ces potes autour &amp;gt;__&amp;lt; Heureusement, eux, ils n’ont pas eu le courage de bouger.&lt;/p&gt;
&lt;p&gt;Sur le chemin quelques dames marchent, en marmonant des choses. Plus ça allait plus je me posais des questions au sujet de la nature de ces incantations.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Un camion passe.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Je passe en plein milieu d’un petit marché. La faute au GPS dont les cartes ne sont plus exactement à jour. Tout le monde est occupé à marchander des patates, légumes, sacs de riz, épices et bonbonnes d’eau.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Un taxi passe.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Et bizarrement il n’a pas ralenti pour me proposer une course. Le temps passe, je suis à mi chemin et ces cabos me mettent les nerfs à vif.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Un taxi et un bus passent.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Quelques personnes marchent dans les rues, des vélos aussi.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Un camion, un bus, un scout et encore un camion passent.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Ah, ça commence à se réveiller. Il est environ 5h15, la nuit laisse place petit à petit à un pâle jour encore fatigué de la poussière de la veille.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Un camion un bus un taxi un bus un camion un vélo un taxi un bus.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;La ville s’agite, le soleil est levé, et la poussière s’affaire, il est 5h30. Je suis arrivé à l’arrêt de bus indiqué par agenceman.&lt;/p&gt;
&lt;p&gt;Des bus passent. Bizarrement ils ont tous un bandeau « Tourists only » sur le pare-brise. Ça m’inquiète cette histoire. Où qu’y sont les bus ? Ils déboulent tous d’une rue plus haut, après un angle. Je demande l’avis d’un bonhomme, qui me fait effectivement signe de remonter.&lt;/p&gt;
&lt;p&gt;Et Ô magie, des bus, à perte de vue. « Tourists Only », « Deluxe », « Free WiFi » et tout et tout. Mais pas un seul n’a de panneau indiquant la destination, pour ça faut demander.&lt;/p&gt;
&lt;p&gt;Vous voyez Pong ? Ben c’est le même principe, sauf que là, c’est avec les chauffeurs de bus, et il y en a une cinquantaine. Au bout d’un moment ya un vieux bonhomme avec une caisse remplie de gâteries sucrées… alala… j’ai envie… mais ça ne serait pas raisonnable, surtout avec le régime alimentaire relativement sain ^^ Je disais, un bonhomme haut comme trois pomme, qui me hurle, brouhaha oblige, « need help ?? ».&lt;/p&gt;
&lt;p&gt;« Heu, yes, i go to Chitwan, do you know where is this bus? » lui dis-je, avec un superbe accent… Français mais en faisant des efforts, en lui montrant le ticket.&lt;/p&gt;
&lt;p&gt;« Oh, this way, come. » Bon bah on verra bien. Finalement il s’occupe de demander aux chauffeurs et on trouve le bon.&lt;/p&gt;
&lt;p&gt;« Friend, I helped you so… maybe you can help me » qu’il me dit en me montrant avec les mains le contenu de sa caisse. Va donc pour une bouteille d’eau, je crève la soif depuis que je suis debout.&lt;/p&gt;
&lt;p&gt;« One hundred » WHHAAAAAAT, non non, pas moyen, une bouteille c’est maximum 30 roupilles, et la plupart du temps c’est seulement 20. Je lui propose 30, il refuse, propose 70, je maintiens 30, il refuse toujours et propose 60, je monte dans le bus sans bouteille d’eau. Et j’ai bien fais car le ticket comprend deux bouteilles, que le fiston du chauffeur distribuera un peu plus tard aux passagers.&lt;/p&gt;
&lt;h2&gt;8h dans le bus&lt;/h2&gt;
&lt;p&gt;Quelques derniers passagers montent en hâte.&lt;/p&gt;
&lt;p&gt;Les genoux touchent le siège d’en face, ça va être fantastique. On démarre à 5h45, le départ était prévu à 5h40. A priori c’est bien huilé. Dans le guide j’ai lu que les bus tombent en panne, et que c’est quasi inévitable. On se rassure en disant que la figurine de bouddha posée en plein milieu du tableau de bord de la cabine du chauffeur (qui dispose de quelques places pour absorber quelques imprévus) nous portera bonheur.&lt;/p&gt;
&lt;p&gt;Le bus s’extirpe de sa place, difficilement vu le traffic déjà complètement encombré. Ça vrombit, ça tremble, ça fait un vieux bruit de pièce usée, ça fait pouet pouet et d’autres sons impossibles à écrire, et on avaaaaance…&lt;/p&gt;
&lt;p&gt;La route pour sortir de Kathmandu est infernale. Une simple voie en terre, avec des trous partout et des habitations autour qui prennent tellement la poussière qu’on en vient à se demander comment font-ils pour rester ici. Et d’ailleurs, la poussière rentre dans le bus. La veille je me suis procuré un de ces masque à mettre devant le pif et la bouche. Ça empêchera le plus gros.&lt;/p&gt;
&lt;p&gt;Encore une fois, on voit de tout. Impossible de photographier tellement le bus bouge, au mieux la photo est floue, au pire l’objectif se prend un coup. Des gens brûlent des câbles électriques à même le sol, d’autres leurs déchets.&lt;/p&gt;
&lt;p&gt;Un bus arrive en sens inverse, il n’a plus de pare-brise. C’est rassurant !&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1304/IMGP1031.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Ça monte ça monte… péniblement, mais sûrement.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1304/IMGP1033.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;À défaut du bus sans pare-brise, un magnifique camion défoncé ! La photo est floue, c’est pas facile depuis le bus quand on voit tout au dernier moment.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1304/IMGP1034.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;7h20&lt;/strong&gt;, on est tout juste sorti de Kathmandu, de l’autre côté de la vallée. Premier arrêt pour une pause toilette(s) et miam.&lt;/p&gt;
&lt;p&gt;Le trajet sera long et pénible, avec quelques travaux bloquant la circulation pendant dix à quinze minutes à chaque fois.&lt;/p&gt;
&lt;p&gt;Voici quelques photos, prises sur le trajet vers Pokhara depuis Chitwan cependant.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1504/IMGP1192.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1504/IMGP1193.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1504/IMGP1194.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1504/IMGP1195.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1504/IMGP1196.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Vers 12h on fera une pause déjeuner. Sans moi, les bosses du trajet m’ont retourné l’estomac. &lt;/p&gt;
&lt;p&gt;Dans le bus, un groupe d’amis parlent en mélangant Anglais et Népali. Ils jouent à ce genre de jeu où on pose des questions stupides et parfois dérangeantes et si on ne souhaite pas répondre, on a un gage. En l’occurrence, le gage était de devoir partager ses biscuits.&lt;/p&gt;
&lt;h2&gt;Sauraha&lt;/h2&gt;
&lt;p&gt;Ou presque. Le bus s’arrête et annonce qu’il faut changer. Ah ben, c’est que j’en savais rien, ça fait tout bizarre. Je demande quel bus je dois prendre mais là, personne ou presque ne parle anglais, et à ce moment là je n’avais aucune idée du nom exact de l’endroit où je devais me rendre. Ce sont justement les étudiants de tout à l’heure qui m’ont aidé. Il y a toujours quelqu’un pour t’aider, c’est fantastique.&lt;/p&gt;
&lt;p&gt;Je récupère mon sac à dos et… et attends, on doit entrer là dedans ? Ce micro bus déjà plein à craquer ? Mais heu ça va pas être possible avec ce sac !&lt;/p&gt;
&lt;p&gt;Bon en fait si. Tout le monde écrase tout le monde mais tout va bien.&lt;/p&gt;
&lt;p&gt;À côté de moi, un autre touriste a l’air tout aussi paumé, sauf que lui n’a même pas de téléphone pour savoir où il met les pieds. Soit il est plus courageux, soit il a perdu son matériel en route. Je ne lui ai pas demandé car j’étais très occupé à zieuter la route à la recherche d’un panneau indiquant l’hôtel où je suis attendu.&lt;/p&gt;
&lt;p&gt;Au fur et à mesure que le bus avance, encore une fois sur une route complètement défoncée, et là, bonus, boueuse, on voit de grand panneaux avec des noms d’hôtels.&lt;/p&gt;
&lt;p&gt;Du coin de l’œil j’aperçois « Hotel West Wood », ma destination. Je demande au chauffeur de s’arrêter… trois fois et en hurlant car il a l’air un peu dur de la feuille, souhaite bonne chance au collègue touriste, sors du bus… &lt;em&gt;j’ai dis sors du bus… nan mais les gens, je sais que je suis enquiquinant, mais va falloir me laisser passer sinon on va rester planté là pendant des heures.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Le groupe d’étudiants m’adressent un « Good bye » tous en cœur, je leur répond la même chose main levée et grand sourire de couillon heureux d’être au bon endroit.&lt;/p&gt;
&lt;p&gt;Piouh ça y est. Il fait chaud, archi-chaud, et la seule chose que j’ai vu pour le moment ce sont des champs à perte de vue et une forêt au loin. Peu de temps après je comprendrai qu’il n’y a rien à faire, car c’est une zone touristique et qu’en dehors des activités programmées par l’hôtel, on est coincé. Je suis parti seul et à l’arrache pour précisément faire ce que je voulais et me voilà coincé dans un hôtel un peu trop chic, avec un confort dont j’aurais pu me passer et en plus dans un coin sans intérêt.&lt;/p&gt;
&lt;p&gt;C’est tellement prémâché qu’on vient te chercher pour manger. Bon de toute façon, il fait faim. Une demi journée de bus sans manger sous peine de tout renvoyer, ça creuse.&lt;/p&gt;
&lt;p&gt;Repas typique Népalais. Soupe de légumes avec un fromage local, un « Népali set » composé de riz et quelques coupelles de légumes cuits dans diverses épices, une salade de fruit et fromage blanc. C’était bien trop peu épicé pour être un plat typique. Des deux jours à Kathmandu à chaque repas, nez qui coule et yeux qui pleurent des larmes, et là rien. Coin à touriste. Horreur.&lt;/p&gt;
&lt;p&gt;Les autres touristes présents font la gueule et ne relèvent même pas la tête pour dire bonjour quand on les croise. Ambiance.&lt;/p&gt;
&lt;p&gt;Profitons de ce vide pour se reposer, envoyer quelques nouvelles sur Whatsapp et tenter d’extraire quelques photos de l’APN via le Wifi.&lt;/p&gt;
&lt;p&gt;Au soir, on viendra me dire que la « danse culturelle », programmée, est annulée à cause du nouvel an, et qu’on fera ça demain. Soit. Mangeons alors !&lt;/p&gt;
&lt;p&gt;Un des serveur viendra discuter un peu. Anjan, 21 ans, désirant se rendre en europe pour y vivre, sans savoir quoi y faire en pensant que la vie est facile. Je lui ai proposé de discuter de ça avec le patron d’un restaurateur à Lyon, Népalais, via Facebook. De temps en temps, les prestations ça a du bon :)&lt;/p&gt;
&lt;p&gt;En gagnant 70$ par mois, rien que le billet d’avion va lui bouffer d’éventuelles économies, et après il faudra bien avoir un projet, sinon c’est retour à l’envoyeur.&lt;/p&gt;
&lt;p&gt;Je lui demande s’il est possible de se balader dans le quartier la nuit, il me répond qu’avec les tigres présents dans les rues peu fréquentées c’est très dangereux. Et que de toute façon on ne me laisserait pas sortir à cause de ça.&lt;/p&gt;
&lt;h1&gt;Sauraha - 14 Avril&lt;/h1&gt;
&lt;p&gt;Programme du jour :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Canoé sur la rivière, crocodiles, oiseaux.&lt;/li&gt;
&lt;li&gt;Marche dans la jungle, m’a-t-on dit qu’il serait possible de voir des tigres et rinhocéroces. Me dira-t-on plus tard qu’il est nécessaire de se terrer trois jours dans une cabane au fond de la jungle pour avoir une chance d’en voir. Arnaque.&lt;/li&gt;
&lt;li&gt;Visite du centre d’élevage d’éléphants.&lt;/li&gt;
&lt;li&gt;La douche des éléphants. Qui n’aura pas lieu car les éléphants ont servi pendant le nouvel an. Ça m’était sorti de la tête ça, le nouvel an !&lt;/li&gt;
&lt;li&gt;Safari dans la jungle, en jeep.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Mais d’abord, surprise, le gardien rentre dans la chambre pendant que tu es à moitié à poil pour que tu te ramène prendre ton petit déjeuner !&lt;/p&gt;
&lt;p&gt;Petit dej à base de curry de pommes de terre, œufs, fruits.&lt;/p&gt;
&lt;p&gt;Le guide vient me chercher et on part en jeep rejoindre la verte. Il est tôt, le soleil est encore assez bas et masqué par une sorte de brume épaisse. On traverse des champs de maïs, des rizières. Sur le bord de la route, quelques maisons en bois se réveillent et les fours traditionnels en terre cuite chauffent. Vent frais et humide, c’est vraiment, vraiment très agréable.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1404/IMGP1189.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;La seule photo potable que j’ai pu prendre sur le trajet, malheureusement.&lt;/p&gt;
&lt;p&gt;La balade en canoé se fera avec d’autres touristes, sur une embarcation en bois poussée par un perchiste, typique mais néanmoins modernisée : les joints sont fait au goudron. Malheureusement les touristes seront bruillants et feront fuir les oiseaux.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1404/IMGP1100.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1404/IMGP1063.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1404/IMGP1075.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1404/IMGP1069.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1404/IMGP1078.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1404/IMGP1111.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Tranquilles les crocodiles. Ils ne bougeront pas d’un millimètre.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1404/IMGP1116.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;La marche dans la jungle durera à peine deux heures et à part de la végétation, point de tigres ni de rhinos. Et en plus, j’ai mal au ventre. &lt;em&gt;Ah non… je suis pas en train de tomber malade hein ?!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1404/IMGP1121.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1404/IMGP1124.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1404/IMGP1127.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Balèses ces pivers.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1404/IMGP1129.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1404/IMGP1133.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1404/IMGP1142.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Cette plante parasite s’enroule autour des arbres, toujours dans le même sens, et fini par étouffer son partenaire.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1404/IMGP1149.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1404/IMGP1150.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1404/IMGP1151.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;C’est le moment de dire bonjour aux éléphants ! On sort de la jungle pour rejoindre le camps d’élevage. Et… mais qu’est-ce que c’est que ce bricolage ?&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1404/IMGP1160.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Bon, malheureusement, c’est bien ce que j’imaginais : les éléphants sont enchaînés et font du sur place, balançant leur trompe d’avant en arrière pour accompagner leur pattes mimant une marche.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1404/IMGP1162.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1404/IMGP1172.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Seuls les éléphanteaux sont libres de se balader dans le parc. N’étants pas assez forts pour entraîner des dommages aux installations et au personnel et étants dépendants de leur mère, il n’y a aucun intérêt à les maintenir captifs.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1404/IMGP1174.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Les femelles sont tenues captives afin de permettre aux mâles de la jungle de venir s’accoupler avec elles. Le succès n’est pas forcément au rendez-vous en terme de taux de fécondation, le stress induit par la captivité et la fatigue du travail des éléphants afin de transporter leur propre nourriture « en seraient probablement la cause », expliquent les panneaux de présentation du centre.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1404/IMGP1181.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Un groupe d’étudiants (collège / lycée) voudra que je prenne quelques photos avec eux. Une attraction à moi tout seul ! L’appareil photo autour du coup joue pour beaucoup aussi, j’ai cru comprendre que pas mal de monde pense que je suis photographe. &lt;em&gt;Pwahaha s’ils savaient le nombre de photos ratées !&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Évidemment j’accepte, ça leur fait plaisir. Je leur ai demandé d’où ils arrivaient et ils étaient d’une petite ville dans le Terraï, à quelques dizaines de kilomètres d’ici. Petit voyage scolaire.&lt;/p&gt;
&lt;p&gt;Mon guide est pressé par le fameux programme, j’abandonne mes étudiants sans même penser à les prendre en photo…&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1404/IMGP1186.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1404/IMGP1188.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Sur le chemin à pied depuis la rivière passant à proximité du camps, des plantes dégagent une odeur particulière. « Marijuana » me dit le guide. D’après lui, beaucoup en profitent et en abusent. Les plants ne sont pas contrôlés ni détruits, ça pousse là et puis c’est tout.&lt;/p&gt;
&lt;p&gt;Finalement, le safari en jeep sera lui aussi annulé. En fait, ça n’aurait rien changé car je suis tombé malade pour le restant de la journée : diarrhée violente et presque dangereuse vu la quantité d’eau perdue. Si ça vous arrive, demandez urgemment des &lt;strong&gt;sels de réhidratation&lt;/strong&gt; (&lt;em&gt;rehydratation salts&lt;/em&gt;) et des bouteilles d’eau. Mélangez les trois quarts d’un sachet pour 1L d’eau et tâchez de boire plus que ce que vous perdez.&lt;/p&gt;
&lt;p&gt;Ça a continué toute la nuit, vomissements et compagnie… bref, pas cool. Fort heureusement le voyage vers Pokhara se sera bien passé et tout sera rentré dans l’ordre. Violent mais court, heureusement.&lt;/p&gt;
&lt;p&gt;Au final, je pense que si vous voulez découvrir le Terraï il vaut mieux prendre son temps. Les animaux sauvages demandent de la patience et ce n’est pas en deux heures de marche dans la jungle, ou alors avec énormément de chance, qu’on peut espérer voir quelque chose. Prenez garde aux arnaques dans les agences donc.&lt;/p&gt;
&lt;p&gt;Clairement, ce n’étaient pas les meilleurs jours du voyage…&lt;/p&gt;
&lt;p&gt;&lt;a href="/namaste-nepal-3.1.html"&gt;Article suivant&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Édition le 23/05/2017 afin d’adoucir un peu l’ambiance :) Merci TiTi pour la relecture ^^&lt;/p&gt;</content><category term="Nepal"/><category term="nepal"/></entry><entry><title>Namasté Népal - #1</title><link href="https://florent.peterschmitt.fr/namaste-nepal-1.html" rel="alternate"/><published>2017-05-14T19:11:00+02:00</published><updated>2017-05-14T19:11:00+02:00</updated><author><name>Florent Peterschmitt</name></author><id>tag:florent.peterschmitt.fr,2017-05-14:/namaste-nepal-1.html</id><summary type="html">&lt;p&gt;Voyage au Népal, première partie&lt;/p&gt;</summary><content type="html">&lt;h1&gt;Voyage du 11 Avril au 5 Mai 2017&lt;/h1&gt;
&lt;p&gt;Vingt-quatre jours au Népal, seul, avec un sac à dos trop lourd, un appareil photo, mon téléphone et une batterie externe pour seuls gadgets électroniques, et aucune idée de ce que qu’il se passera ni de où j’irai vraiment.&lt;/p&gt;
&lt;p&gt;Je prévois de découper le voyage en plusieurs articles, d’habord pour raconter les différentes étapes principales du voyage, au nombre de 5/6, et éventuellement un article supplémentaire, une sorte de conclusion sur l’ensemble du voyage.&lt;/p&gt;
&lt;p&gt;Un total de 6 à 7 articles à venir. L’ensemble sera écrit après mon retour, je me suis contenté de prendre des notes sur un carnet durant le voyage.&lt;/p&gt;
&lt;p&gt;Au sujet du contenu des articles, ça comprendra la quasi totalité de ce que j’ai pu vivre et voir, y compris des détails qui pourraient paraître insignifiants, mais qui pour moi sur place, étaient significatifs. Veuillez également excuser l’orthographe approximative… et le français approximatif en général.&lt;/p&gt;
&lt;p&gt;Et comme je suis toujours utilisateur de GNU/Linux, les quelques images DNG (format standard RAW) ont été converties en JPEG grâce à dcraw et ImageMagick, voyez plutôt :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/bin/sh&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;i&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;find&lt;span class="w"&gt; &lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;-name&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;*.DNG&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;do&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;imgname&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sed&lt;span class="w"&gt; &lt;/span&gt;-re&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;s/(.*IMGP[0-9]+).DNG$/\1/g&amp;#39;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;jpg&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;imgname&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;.JPG
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;!&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$jpg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;dcraw&lt;span class="w"&gt; &lt;/span&gt;-w&lt;span class="w"&gt; &lt;/span&gt;-T&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;convert&lt;span class="w"&gt; &lt;/span&gt;-quality&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;90&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;imgname&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;.tiff&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;imgname&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;.jpeg&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;rm&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;imgname&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;.tiff
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;i&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;find&lt;span class="w"&gt; &lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;-name&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;*.jpeg&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-or&lt;span class="w"&gt; &lt;/span&gt;-name&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;*.JPG&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;do&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;convert&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-resize&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;30&lt;/span&gt;%&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;.small.jpeg
&lt;span class="k"&gt;done&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;i&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;find&lt;span class="w"&gt; &lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;-name&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;*.small.jpeg&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;do&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;imgname&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sed&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;s/(.*)(\.jpeg|\.JPG)\.small\.jpeg$/\1.jpeg/g&amp;#39;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;mv&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$imgname&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Enfin, n’hésitez pas à me poser des questions en commentaire, c’est fait pour ça ! Et peut-être que ça alimentera l’article final, car il se peut que ça soit intéressant :)&lt;/p&gt;
&lt;h2&gt;Départ - 10 Avril&lt;/h2&gt;
&lt;p&gt;Ben ou pas, déjà ! J’ai raté l’avion. Tant pis, j’en reprends un autre, avec onze heures d’attente à Bombay. Fantastique…&lt;/p&gt;
&lt;p&gt;En survolant Bombay (Mumbai), on void déjà des bidonvilles partout, amassés entre de plus grands bâtiments, qui n’ont de toute façon pas l’air plus en forme que ces bidonvilles.&lt;/p&gt;
&lt;p&gt;L’aéroport est entouré de bidonvilles. Premier choc.&lt;/p&gt;
&lt;p&gt;On attend onze heures et puis, de bon matin, on décolle pour Kathmandu. Trois petites heures d’avion seulement.&lt;/p&gt;
&lt;h2&gt;Kathmandu - 11 Avril&lt;/h2&gt;
&lt;p&gt;« Mais qu’est-ce que je vais faire ici ? Qu’est-ce qu’il m’a pris de venir ici ! »&lt;/p&gt;
&lt;p&gt;Et puis je me souviens que je voulais aller en Asie depuis quelques années, déranger mon petit confort et changer d’air.&lt;/p&gt;
&lt;p&gt;Pour le coup, l’air a bien changé ! Je me fait tout juste embarquer par un taxis que je découvre l’air local : poussiéreux, pollué à l’essence plombée, s’engouffrant dans les rues défoncées et nues de la ville.&lt;/p&gt;
&lt;p&gt;Les routes ont subi le tremblement de terre de 2015 : celles qui étaient faites de macadam sont coupées en deux et les crevasses remplies avec de la terre. Mais ça c’était un grand axe, les routes menant au plus près des habitations sont en terre.&lt;/p&gt;
&lt;p&gt;Ça pique le nez et on a une furieuse envie de cracher cette glaire qui deviendra bientôt l’embryon d’une sculpture en terre cuite. Les Népalais le font, tout le temps.&lt;/p&gt;
&lt;p&gt;C’est fascinnant de se dire qu’on a respiré de la poussière chargée par tous les crachats de la ville. Ça fait les défenses naturelles…&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1104/IMGP0791.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1104/IMGP0792.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Le taxi m’enmène au centre ville après être passé par l’hôtel où je logerai pour quelques nuits.&lt;/p&gt;
&lt;p&gt;On finit donc par arriver au centre, « here is the Thamel » qu’il me dit. Boutiques à touristes, vêtements de trekking sans marque et apparemment contrefaits, selon le taximan. Les rues sont vraiment très serrées, le taxi s’y enfonce, franchement on aurait pu continuer à pied plutôt que d’encombrer le passage.&lt;/p&gt;
&lt;p&gt;Le taxi travaillait avec une agence de trekking, et c’est pour ça qu’on est allé au centre ville. C’était clairement affiché dès le début, pas de souci pour ça. Discussion d’une grosse heure avec le gars de l’agence, et c’est parti pour onze jours organisés : parc national de Chitwan, Pokhara (quatre jours où je fais comme bon me semble) puis un trek de huit jours dans la vallée de Langtang. Départ le 13 Avril.&lt;/p&gt;
&lt;p&gt;Je me fais déposer à l’hôtel, « Dormitory Nepal » si un jour vous comptez y aller. C’est peu cher (5$ la nuit dans le dortoire) et très bien entretenu. Le seul problème c’est qu’il ne faut pas avoir peur de marcher pour rejoindre le centre : cinquante minutes. Comme j’avais prévu de me perdre dans la ville, et donc passer bien plus d’une heure sur les trajets, ça ne me posait pas de problème.&lt;/p&gt;
&lt;p&gt;Le temps de regarder un peu la carte de la ville sur Maps.ME (openstreetmap sous le capot), et zou on va chercher à bouffer. Le repas dans l’avion était suffisant mais à 17h y fait déjà faim.&lt;/p&gt;
&lt;p&gt;Je marche donc. Autour de l’hôtel il y a principalement de grandes maisons individuelles, fermées par des portails, ou de petits appartements à trois, quatre étages maximum, dont on devine les pièces petites et carrées. C’est très calme et ça semble être une zone assez riche de la ville. Ce qui n’empêche pas les routes d’être en terre !&lt;/p&gt;
&lt;p&gt;Je rejoins le même grand axe de tout à l’heure, mais en sens inverse, pour y trouver un restaurant. Il y en a partout, et de différents types. De gros restaurants aseptisés destinés aux touristes, voire touristes fortunés, juste à côtés de petites canfouines, parfois sans vitres, tout ça au bort de la route générant son nuage de poussière.&lt;/p&gt;
&lt;p&gt;Les trottoirs sont hauts et ravagés, mieux vaut regarder où on met les pieds. La circulation est dense et pour traverser, pas de passage piétons ou pas vraiment. Il vaudra mieux attendre une accalmie et traverser gentillement, en n’hésitant pas à s’arrêter en plein milieu de la route pour laisser passer une rafale, avant de continuer. Il faut rester vigilant, les piétons ne semblent pas avoir la priorité.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1104/IMGP0795.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Sur le chemin, un type est en train de refaire l’appentis de son restaurant. Un bout de tôle pliée, qui a manifestement subit un quelconque sévice, auquel était suspendu un gamin afin de maintenir le tout proche d’une poutre en bois, pendant que le père / frère / quelqu’un était en train de marteler sur de gros clous.&lt;/p&gt;
&lt;p&gt;Je trouve une boutique, ça vend des momos, sortes de ravioles en boule fourrées avec divers ingrédients : mélange de légumes épicés ou viande. En l’occurrence, mauvaise pioche, c’était pas très bon et à croire que ça a été mélangé avec du sable. Ah ben c’est ça aussi, on veut faire le malin en bouffant local, et voilà ce qui arrive quand on ne connaît pas !&lt;/p&gt;
&lt;p&gt;Le resto était une simple pièce carrée, avec deux planches fixées au mur en guise de table, et des tabourets tressés pour se reposer sur son arrière train. Mes genoux touchent la table.&lt;/p&gt;
&lt;p&gt;Derrière la seule vitre du petit restaurant, une sorte d’énorme cocotte-minute renferme les momos, cuits à la vapeur. Je n’ai jamais vraiment pensé à faire de belle photo des ustensiles, honte à moi.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1104/IMGP0796.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Ce n’est pas ce resto là, je n’ai pas pris de photo du vrai, mais ça ressemblait à ça, une vitre en moins.&lt;/p&gt;
&lt;p&gt;On me sert donc une assiette, une cuillère, une sauce qui arrache la langue, les gencives et les dents avec, et une bouteille d’eau dont je ne connais pas la provenance, et n’y ai donc pas touché. Dans mon guide papier, il est bien dit qu’il ne faut surtout pas boire autre chose que de l’eau en bouteille, sous scellé (un ruban de plastique autour du bouchon jusqu’à la base du goulot) : il n’y a pas d’eau courante sauf à quelques endroits publiquement accessibles et cette eau là est contaminée par divers germes et métaux lourds.&lt;/p&gt;
&lt;p&gt;Aller hop, on se rentre à l’hôtel, la nuit est tombée. Je manque de me faire renverser par une moto dont le phare n’était pas allumé. Et ce fou furieux m’a hurlé dessus une fois passé derrière moi.&lt;/p&gt;
&lt;p&gt;Avant de se coucher, vu qu’on se sent comme recouvert d’une épaisse couche de crasse, on commence par prendre une douche, mais avant de prendre la douche, on s’adapte : la salle de bain comprend un lavabo, un toilette, un robinet, un pomeau fixe et une évacuation d’eau dans un coin de la pièce, le tout sans aucune espèce de petite cloison ni rideau. Donc déjà, si on ne veut pas innonder ses fringues posées sur le bord du lavabo (à défaut de crochet, paix à son âme), on va prendre sa douche en se contortionnant comme un vers sous le robinet se trouvant à un mètre du sol. Et puis ensuite on découvre que l’eau chaude est un luxe, donc on se grouille parce que c’est froid ! Enfin ça va, on est dans la vallée, la journée il fait chaud. Vous allez voir, lors du quatrième article, que c’est très différent en montagne !&lt;/p&gt;
&lt;p&gt;Je mets ma grosse batterie externe en charge, de crainte de manquer d’électricité un jour ou l’autre. Les hôtels sont pourvus de batteries afin de contourner les phases où l’électricité est coupée, mais on ne sait jamais.&lt;/p&gt;
&lt;p&gt;S’endormir est un peu difficile, la poussière est présente absolument partout et râcle les voies respiratoires. En plus, des chients aboient. Beaucoup. En fait, dans les rues il y a des chiens errants, et la nuit, ils se parlent. J’ai pensé à prendre des bouchons d’oreille, j’ai bien fais. Mission impossible sinon !&lt;/p&gt;
&lt;p&gt;Je suis seul dans le dortoire, pratique.&lt;/p&gt;
&lt;h2&gt;Kathmandu - 12 Avril&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;baille&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;s’étire&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;ouvre les yeux&lt;/em&gt;, il fait jour.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;quelle heure est-il ?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;CINQ HEURES ET DEMI ????? Ah nan… dodo là…&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;À 5h30 environ, il fait jour et toute la ville est debout, les chiens on arrêtés de hurler à la mort et la poussière vous caresse délicatement, mais sûrement, le museau.&lt;/p&gt;
&lt;p&gt;Petit dej à base de pommes de terre, œufs et un jus de fruit, et zou dans la ville, direction le centre, Thamel. Les mêmes scènes qu’hier se déroulent sous mes yeux : poussière, trafic encombré, chiens errants, petites boutiques vendant tout un tas de conneries à bouffer (chips, sodas…) mais surtout des bouteilles d’eau. « Namasté » les mains jointes et un sourire immédiat apparaît. On demande sa bouteille d’eau à 20 roupies, et on repart. Il y a des bâtiments lézardés, voire abandonnés pour certains tellement ils sont habimés. Les bâtiments sont en brique ou en béton, d’ailleurs en survolant KTM on voit énormément de fabriques de briques. Le béton, c’est pour plus tard. Le réseau électrique aussi est dans un état franchement catastrophique. La plupart des potaux portent des fils coupés trainant sur le sol, quand d’autres servent de « routeurs ».&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP0807.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP0809.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;D’ailleurs, rares sont les petites boutiques à avoir de l’électricité, et ce même la nuit. La plupart est plongée dans le noir. Il n’y a que les boutiques à touristes qui sont éclairées.&lt;/p&gt;
&lt;p&gt;Bref, je me promène, de « stupa » en stupa.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP0811.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP0812.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;On me propose de la marijuana, d’acheter des bonnets, des tshirts, des taxis… bref, je suis un touriste et ça se voit. Quand un bonhomme d’une vingtaine d’année me tombe dessus et me propose de me faire visiter la ville. Un peu naïf, j’accepte son aide avant de vite comprendre que ce ne sera pas gratuit. Pourquoi pas après tout, du moment qu’il ne me raconte pas des salades. Il était habillé avec une polaire noire, par temps de plein soleil. Un peu plus tard je découvrirai que c’est bel et bien sa seule fringue disponible. Imaginez-vous une seconde n’avoir tellement rien en revenus que vous ne pourrez porter qu’un seul vêtement toute l’année.&lt;/p&gt;
&lt;p&gt;Du coup on fait un tour dans la ville pendant trois bonnes heures, à différents endroits. Le mélange de temples boudhistes et hindous, d’architecture Newar et médiévale coincée entre des bâtiments de brique est atypique.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP0819.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP0820.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Quand on marche autour de ces temples, il faut impérativement tourner dans le sens horaire afin de ne pas s’attirer d’ennuis. Quand on sait qu’il y a des temples en plein milieu des routes, on est tenté de croire que c’est la raison pour laquelle tout le monde roule à gauche ! Une autre hypothèse serait que la présence des britanniques au Népal par le passé a pu influencer le pays.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP0827.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP0828.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP0829.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Quelques rares maisons ont encore une allure médiévale. Elles ont bien souffert.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP0832.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP0833.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Ça, c’est un petit temple dédié aux dents. Selon mon guide improvisé, Sanjay, les gens venaient ici clouer une pièce en espérant que cela les soigne de leurs maux de dents mais « quand les gens s’aperçoivent que ça ne fonctionne pas, ils vont voir les vrais dentistes, qui sont tous dans la rue juste en face ! » me dit-il avec un sourir un peu moqueur.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP0835.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Un autre temple, avec des boutiques de poteries tout autour.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP0842.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Pour faire une photo sans un panneau publicitaire, c’est difficile… entre ça, les fils électriques et la circulation, on est pas rendu !&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP0844.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP0848.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Une petite ruelle dédiée à ces dames.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP0851.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Oui oui je sais, la photo est bancale.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP0852.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP0853.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;On prend un taxi pour aller voir le plus gros stupa bouddhiste de la ville, dont j’ai eu la bonne idée d’oublier le nom. L’entrée est payante, 250 roupies pour les étrangers et quelque chose comme 30 pour les locaux.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP0867.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Ganesh, divinité Hindou, est un peu partout dans les maisons mais aussi dans les cabines des bus et camions. Je suppose qu’ils en sentent le besoin, vu le chaos qui règne sur la route : on déboite sans regarder ce qu’il se passe derrière, ni vraiment devant en fait, on se double en forçant le doublé à freiner si quelqu’un arrive en face, ça freine, ça reprend… et les accidents arrivent !&lt;/p&gt;
&lt;p&gt;On finit quand même par arriver au stupa, et en un seul morceau :p&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP0868.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP0872.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP0897.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP0871.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP0879.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;On fera tourner cette roue dans le sens horaire en prononçant le mantra « Om mani padme hum », pour s’attirer la bonne chance.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP0898.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP0901.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;J’ai bien plus de photos, mais le volume de 2.5GB fait qu’il sera impossible de tout uploader.&lt;/p&gt;
&lt;p&gt;Sanjay me propose de venir chez lui prendre le thé. À vrai dire je me doute un peu que ça ne sera pas que pour prendre le thé, car au cours de la visite il m’a raconté que depuis la mort de son père, enseveli sous sa propre maison pendant le tremblement de terre, il n’avait plus de revenus suffisants. La mère mendie, sa sœur ne peut pas aller à l’école (~200$ / an, sans compter le matériel et l’uniforme, ce qui est énorme pour eux) et lui ne peut plus y aller. Étudiant en histoire de l’art, il s’improvise guide, avec le risque de finir en prison car il est interdit d’exercer sans une licence.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP0906.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP0913.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP0916.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Évidemment, je ne m’attendais pas à une situation reluisante. L’endroit pue, est envahi par les mouches (qu’on ne voit pas sur la photo), et j’ai eu la bonne surprise de voir une puce grimper sur mon sac à dos. Heureusement pas de piqûre ni d’infestation. Une pompe est disponible pour ce bout de "quartier" pour obtenir de l’eau, polluée sans aucun doute.&lt;/p&gt;
&lt;p&gt;Ensuite, j’ai eu droit à un sketch où ce fameux Sanjay m’a, pour faire simple, demandé 200$ afin de lui acheter une « boîte » pour cirer et réparer les chaussures. Un peu plus tard, je comprendrai qu’il s’agissait d’une arnaque totale. Je lui ai laissé de l’argent pour la visite, et un peu plus, mais certainement pas 200$.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP0924.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP0926.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Bref, je repars, me perds dans les hauts de la ville.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP0932.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP0933.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP0935.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP0936.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP0938.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Oui oui, c’est bien de la viande derrière ce simple grillage à l’air libre ! Mais il y a pire. J’ai vu de la viande directement accessible, ou couverte sous un linge. Les mouches sont omniprésentes dans ces cas là.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP0941.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP0960.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP0964.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP0965.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP0976.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP0979.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP0980.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP0981.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP0984.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP0985.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP0990.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP0992.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP0993.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP0996.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Je passe par la rivière Bagmati, puante et dégueulasse.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP1003.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP1008.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP1009.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;De la poussière, toujours et encore.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP1014.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Les camions de transport au Népal, c’est quelque chose ! Ils sont tous comme ça, décorés de partout et avec des klaxons dignes d’une fanfare ! Certains ont également de la ferronnerie tout le tour de la benne.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP1018.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Une école, avec une phrase écrite au dessus de chaque salle de classe.&lt;/p&gt;
&lt;p&gt;Je finirai la marche par tomber sur une petite famille et quelques amis (à eux évidemment) m’ayant invité à boire un coup. Un alcool blanc, trouble, au goût de Saké. J’étais à quelques minutes de l’hotel, il commençait à faire nuit, quand j’entends un timide « Hello ! » derrière moi. Je me fais violence, me retourne et tente de discuter avec le gaillard, celui tout à gauche sur la photo.&lt;/p&gt;
&lt;p&gt;&lt;img alt="photo" src="/static/images/nepal2017/1204/IMGP1028.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;Ils m’ont également proposé de dormir ici, mais avec le bordel que serait le lendemain, il était plus sage de rentrer meuson. À la lampe torche, vu que le quartier était complètment plongé dans le noir !&lt;/p&gt;
&lt;p&gt;&lt;a href="/namaste-nepal-2.html"&gt;Article suivant&lt;/a&gt;&lt;/p&gt;</content><category term="Nepal"/><category term="nepal"/></entry><entry><title>Les tags de dnsmasq + teaser</title><link href="https://florent.peterschmitt.fr/dnsmasq-tags.html" rel="alternate"/><published>2017-03-27T15:18:00+02:00</published><updated>2017-03-27T15:18:00+02:00</updated><author><name>Florent Peterschmitt</name></author><id>tag:florent.peterschmitt.fr,2017-03-27:/dnsmasq-tags.html</id><summary type="html"/><content type="html">&lt;p&gt;Le sujet du jour : balancer des options DHCP à une machine particulière, via son adresse MAC.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/etc/dnsmasq.conf&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;domain=local
dhcp-host=52:54:00:06:b7:53,set:untag,dahostname
dhcp-option=tag:untag,12,dahostname
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;host&lt;span class="w"&gt; &lt;/span&gt;dahostname.local
dahostname.local&lt;span class="w"&gt; &lt;/span&gt;has&lt;span class="w"&gt; &lt;/span&gt;address&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;.253.1.186
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;L’option &lt;code&gt;12&lt;/code&gt; envoie un nom de machine au client DHCP, qui devra le positionner sur la machine cliente. En tout cas ça fonctionne avec &lt;code&gt;dhclient&lt;/code&gt;. Achtuce : s’il n’y a pas de route par défaut présente, le client ne positionnera pas le nom de la machine. Pas trouvé pourquoi.&lt;/p&gt;</content><category term="Informatique"/><category term="dnsmasq"/></entry><entry><title>Windows 7/2008, Samba 3, Updates</title><link href="https://florent.peterschmitt.fr/windows-kb-samba3.html" rel="alternate"/><published>2016-11-07T19:00:00+01:00</published><updated>2016-11-07T19:00:00+01:00</updated><author><name>Florent Peterschmitt</name></author><id>tag:florent.peterschmitt.fr,2016-11-07:/windows-kb-samba3.html</id><summary type="html"/><content type="html">&lt;p&gt;Des machines Windows 7 et 2008 R2 n’arrivent pas à se connecter à un partage de fichier, alors que d’autres machines sous les mêmes OS et le même réseau le peuvent.&lt;/p&gt;
&lt;p&gt;Dans les logs Samba, on pouvait voir &lt;code&gt;Connection reset by peer&lt;/code&gt; et &lt;code&gt;Server exit (failed to receive smb request)&lt;/code&gt;, alors qu’une connexion réussie ne retourne jamais ce genre d’erreur.&lt;/p&gt;
&lt;p&gt;Pas de résolution en mettant à jour vers la dernière version de Samba 3.5, et pas plus en 3.6. Je n’ai pas pu tester Samba 4 car il était  impossible de l’intégrer chez le client.&lt;/p&gt;
&lt;p&gt;Donc, après avoir épluché :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;les logs&lt;/li&gt;
&lt;li&gt;les firewall&lt;/li&gt;
&lt;li&gt;les jointures au domaine&lt;/li&gt;
&lt;li&gt;les éventuels problèmes d’authentification et être allé jusqu’à la page 2 de Google…&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;…il apparaît que certaines MAJ de Windows sont en cause : en prenant un PC pas à jour, qui arrive à monter le partage, après mise à jour, plus rien ne fonctionne.&lt;/p&gt;
&lt;p&gt;Sauf que trouver et supprimer les MAJ ne résoud rien. Modifier certaines clefs de registre (je ne sais plus lesquelles) ne résoud rien non plus.&lt;/p&gt;
&lt;p&gt;J’ai en revanche trouvé l’option samba qui permet de remettre les choses en fonctionnement, en parcourant la doc de Samba 3 de haut en bas :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[global]&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;server signing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;auto&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;En passant cette option à &lt;code&gt;disabled&lt;/code&gt;, je reproduis mon impossibilité d’accès au partage, et ce même après reboot des clients entre chaque changement de l’option —jouuur, nuit, jouuur, nuit, jouuur, nuit—.&lt;/p&gt;
&lt;h2&gt;Tips&lt;/h2&gt;
&lt;p&gt;Un petit truc qui m’a permit de récupérer facilement les informations sur les MAJ windows des machines :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;Get&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;WmiObject&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;Class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;win32_quickfixengineering&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;Select&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Property&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;Description&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;HotfixID&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;@{&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;InstalledOn&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Expression&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="err"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;DateTime&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;InstalledOn&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="n"&gt;ToLocalTime&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="err"&gt;}}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Puis :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;$(&lt;/span&gt;&lt;span class="nt"&gt;cat&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;hotfixes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;sed&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-rn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;s/.*KB(&lt;/span&gt;&lt;span class="cp"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="cp"&gt;]&lt;/span&gt;&lt;span class="s1"&gt;+).*/\1/gp&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;do&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;chromium&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;https://support.microsoft.com/en-us/kb/$i&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;read&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Ensuite jouez du clavier… je n’ai pas poussé l’automatisation, mais ça fait déjà gagner un temps certain.&lt;/p&gt;</content><category term="Informatique"/><category term="windows"/><category term="kb"/><category term="update"/><category term="samba"/></entry><entry><title>ArchLinux - Kernel custom</title><link href="https://florent.peterschmitt.fr/archlinux-kernel-custom.html" rel="alternate"/><published>2016-10-05T10:59:00+02:00</published><updated>2016-10-05T10:59:00+02:00</updated><author><name>Florent Peterschmitt</name></author><id>tag:florent.peterschmitt.fr,2016-10-05:/archlinux-kernel-custom.html</id><summary type="html"/><content type="html">&lt;p&gt;C’est pas nouveau, le kernel d’ArchLinux est géré d’une manière foireuse et certaines options ne sont pas présentes pour des raisons… mouais, bon.&lt;/p&gt;
&lt;p&gt;Pour ma part, j’ai besoin du framework AUDIT, qui n’est pas compilé pour une raison que je trouve &lt;a href="https://bugs.archlinux.org/task/42954"&gt;un peu légère&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;En plus de ça, je pourrai passer d’un kernel &lt;code&gt;PREEMPT&lt;/code&gt; à un kernel &lt;code&gt;SMP&lt;/code&gt; classique car le module de la carte Wifi broadcom ne supporte que ce mode. Avec &lt;code&gt;PREEMPT&lt;/code&gt;, on se retrouve à avoir des freeze du scheduler…&lt;/p&gt;
&lt;p&gt;Mais bon peu importe : ce n’est pas compliqué de construire un kernel maison et packagé en prime !&lt;/p&gt;
&lt;h2&gt;Go&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="go"&gt;pacman -S abs&lt;/span&gt;
&lt;span class="go"&gt;abs&lt;/span&gt;
&lt;span class="go"&gt;cp -ar /var/abs/core/linux /tmp/ # je build dans /tmp car j’ai de la RAM&lt;/span&gt;
&lt;span class="go"&gt;cd /tmp/linux/&lt;/span&gt;

&lt;span class="go"&gt;makepkg --skippgpcheck -o # telechargement + extraction des sources&lt;/span&gt;

&lt;span class="go"&gt;sed -i PKGBUILD -e &amp;#39;s/^pkgbase=linux/pkgbase=linux-custom/&amp;#39; # changer le nom parce ce qu&amp;#39;on veut&lt;/span&gt;

&lt;span class="go"&gt;cd src/linux-4.7&lt;/span&gt;

&lt;span class="go"&gt;make menuconfig # ou cp de sa configuration...&lt;/span&gt;

&lt;span class="go"&gt;cd ../..&lt;/span&gt;
&lt;span class="go"&gt;makepkg -e&lt;/span&gt;
&lt;span class="go"&gt;pacman -U linux-custom-*.pkg.tar*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Ensuite on est prêt pour mettre à jour GRUB, évidemment :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="go"&gt;grub-mkconfig -o /boot/grub/grub.cfg&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Les modules gérés par DKMS seront pris en charge avec ce nouveau kernel.&lt;/p&gt;</content><category term="Informatique"/><category term="archlinux"/><category term="kernel"/></entry><entry><title>Linux Kernel Network Namespaces et dnsmasq</title><link href="https://florent.peterschmitt.fr/linux-kernel-network-namespaces-dnsmasq.html" rel="alternate"/><published>2016-09-20T16:58:00+02:00</published><updated>2016-09-20T16:58:00+02:00</updated><author><name>Florent Peterschmitt</name></author><id>tag:florent.peterschmitt.fr,2016-09-20:/linux-kernel-network-namespaces-dnsmasq.html</id><summary type="html"/><content type="html">&lt;p&gt;&lt;em&gt;Modification du 28/06/2017 :&lt;/em&gt; utilisation de la fonctionnalité intégrée pour la gestion du &lt;code&gt;resolv.conf&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Bien souvent, nos clients nous mettent à disposition des VPN pour pouvoir les aider à distance pour les cas de support.&lt;/p&gt;
&lt;p&gt;Parmis ces VPN, on a Juniper Network Connect, qui touche aux routes et ne permet pas de les modifier (il les remet comme il le souhaite).&lt;/p&gt;
&lt;p&gt;Du coup aujourd’hui je suis obligé de passer par une VM/conteneur. C’est peu pratique, mais on va voir comment s’en sortir avec les namespaces réseau et dnsmasq.&lt;/p&gt;
&lt;h1&gt;Network Namespaces&lt;/h1&gt;
&lt;p&gt;Un &lt;a href="http://blog.scottlowe.org/2013/09/04/introducing-linux-network-namespaces/"&gt;article&lt;/a&gt; très intéressant détail ce que sont les namespaces, et je vous en recommande la lecture avant de lire la suite ici. Car en bonne feignasse... voilà.&lt;/p&gt;
&lt;p&gt;En gros :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;With network namespaces, you can have different
and separate instances of network interfaces and
routing tables that operate independent of each other.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Un peu de théorie&lt;/h2&gt;
&lt;p&gt;L’objectif est d’avoir un environnement réseau indépendant du reste du système, pour que la connexion VPN puisse y vivre sa vie, sans venir m’enquiquiner sur le reste de mes connexions.&lt;/p&gt;
&lt;p&gt;Pour y arriver, j’ai choisi d’utiliser une configuration natée (le VPN est ipv4 uniquement) avec une interface virtuelle qui servira de pont entre mon interface physique et l’interface du namespace.&lt;/p&gt;
&lt;h2&gt;Mise en place du namespace&lt;/h2&gt;
&lt;p&gt;Création du namespace :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;ip netns add juniper
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Mais où sont passées nos interfaces ! ;-)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;ip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;netns&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;exec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;juniper&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;l&lt;/span&gt;
&lt;span class="nv"&gt;ip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;netns&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;exec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;juniper&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;iptables&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;nL&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;On créer une paire d’interfaces :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;jun1 : interface dédiée au namespace&lt;/li&gt;
&lt;li&gt;jun0 : pont entre le lien physique (eth0) et l’interface du namespace (jun1)&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nx"&gt;ip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;link&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;add&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;jun0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;veth&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;peer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;jun1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;On migre jun1 dans le namespace :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;ip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;link&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;jun1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;netns&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;juniper&lt;/span&gt;
&lt;span class="nv"&gt;ip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;netns&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;exec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;juniper&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;l&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;#&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Oooooh&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;On configure le réseau comme on le ferait avec n’importe quel système.
Note : j’utilise ip mais on pourrait utiliser ifconfig...&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;ip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;netns&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;exec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;juniper&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;add&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;.&lt;span class="mi"&gt;252&lt;/span&gt;.&lt;span class="mi"&gt;0&lt;/span&gt;.&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dev&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;jun1&lt;/span&gt;
&lt;span class="nv"&gt;ip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;netns&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;exec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;juniper&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;l&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;jun1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;up&lt;/span&gt;
&lt;span class="nv"&gt;ip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;netns&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;exec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;juniper&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;r&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;add&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;default&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;via&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;.&lt;span class="mi"&gt;252&lt;/span&gt;.&lt;span class="mi"&gt;0&lt;/span&gt;.&lt;span class="mi"&gt;254&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dev&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;jun1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;On positionne jun0 comme passerelle :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;ip a add 10.252.0.254/24 dev jun0
ip l set jun0 up
iptables -t nat -A POSTROUTING -s 10.252.0.0/24 ! -d 10.253.0.0/24 -j MASQUERADE
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Voilà, notre &lt;code&gt;namespace&lt;/code&gt; réseau &lt;code&gt;juniper&lt;/code&gt; est configuré et actif. Maintenant on va pouvoir lancer notre VPN dans ce namespace :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;ip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;netns&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;exec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;juniper&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;openconnect&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nv"&gt;juniper&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;endpoint&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h1&gt;Une histoire de résolution&lt;/h1&gt;
&lt;h2&gt;Nouvelle version&lt;/h2&gt;
&lt;p&gt;Merci à &lt;a href="https://schnouki.net/posts/2014/12/12/openvpn-for-a-single-application-on-linux/"&gt;Schnouki&lt;/a&gt; de m’avoir notifié de cette fonctionnalité, bien, bien plus simple :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;mkdir -p /etc/netns/juniper
touch /etc/netns/juniper/resolv.conf
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;juniper&lt;/code&gt; est à remplacer par le nom de votre namespace évidemment :)&lt;/p&gt;
&lt;p&gt;Et voilà c’est fini !&lt;/p&gt;
&lt;h2&gt;Vieille version&lt;/h2&gt;
&lt;p&gt;Le problème avec ce VPN, c’est le fichier &lt;code&gt;/etc/resolv.conf&lt;/code&gt; qui sera écrasé par &lt;code&gt;openconnect&lt;/code&gt;. Hé oui, on a isolé le réseau, mais rien de plus. Donc on va toujours pouvoir faire ping 8.8.8.8, mais par contre pour la résolution... ça va être compliqué.&lt;/p&gt;
&lt;p&gt;Ou pas : avec dnsmasq, on peut faire ce qu’on veut !&lt;/p&gt;
&lt;p&gt;Du coup, comme &lt;code&gt;/etc/resolv.conf&lt;/code&gt; est partagé pour tous les namespaces… mais que chaque namespace dispose de sa propre pile réseau… on va pouvoir lancer un &lt;code&gt;dnsmasq&lt;/code&gt; sur le système hôte, et un autre dans le namespace : chacun écoutera sur le port 53 de son namespace, et n’entrera pas en conflict avec son voisin !&lt;/p&gt;
&lt;p&gt;Le but du jeu, c’est que le &lt;code&gt;dnsmasq&lt;/code&gt; du namespace fasse les résolutions DNS pour ce qui concerne notre VPN, et l’autre fasse les résolutions habituelles.&lt;/p&gt;
&lt;p&gt;En imaginant que mon VPN me donne accès à un réseau &lt;code&gt;10.0.0.0/8&lt;/code&gt;, que le serveur DNS "du VPN" soit &lt;code&gt;10.9.8.253&lt;/code&gt; et que le domaine soit &lt;code&gt;domaine.prive&lt;/code&gt; :&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/etc/dnsmasq.conf&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;server=/domaine.prive/10.9.8.253
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;/etc/resolv.conf :
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;nameserver 127.0.0.1
nameserver &amp;lt;votre DNS public favoris&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Avec cette conf, dnsmasq va tout seul comprendre qu’il faudra forwarder les requêtes auxquels il ne peut répondre aux autres serveurs DNS configurés (resolv.conf), mais va en revanche contacter les serveurs DNS pour les domaines précisés, ici &lt;code&gt;domaine.prive&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Une fois qu’on a fait ça, on démarre dnsmasq sur notre "hôte", et dans le namespace :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;#&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;on&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;se&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;met&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;bien&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dans&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;notre&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;namespace&lt;/span&gt;
&lt;span class="nv"&gt;ip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;netns&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;exec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;juniper&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;bash&lt;/span&gt;
&lt;span class="nv"&gt;ip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;add&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;127&lt;/span&gt;.&lt;span class="mi"&gt;0&lt;/span&gt;.&lt;span class="mi"&gt;0&lt;/span&gt;.&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dev&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;lo&lt;/span&gt;
&lt;span class="nv"&gt;ip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;l&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;lo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;up&lt;/span&gt;
&lt;span class="nv"&gt;dnsmasq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;On pourra même se targuer d’un chattr +i /etc/resolv.conf pour que personne ne vienne casser la conf. Et là, on est royal :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;netns&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;exec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;juniper&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;su&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;wrk&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;export DISPLAY=:0; firefox&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Notre firefox est lancé dans un namespace réseau, donc il est dans le VPN juniper, pendant que le reste de notre système vit sa vie.&lt;/p&gt;
&lt;h2&gt;Un petit schéma peut-être ?&lt;/h2&gt;
&lt;p&gt;&lt;img alt="schema" src="/static/images/kernel-network-namespaces-dnsmasq-vpn.png"&gt;&lt;/p&gt;</content><category term="Informatique"/><category term="linux"/><category term="network namespace"/><category term="dnsmasq"/></entry><entry><title>ActiveSync avec Z-Push, le mail</title><link href="https://florent.peterschmitt.fr/activesync-zpush.html" rel="alternate"/><published>2016-08-13T21:33:00+02:00</published><updated>2016-08-13T21:33:00+02:00</updated><author><name>Florent Peterschmitt</name></author><id>tag:florent.peterschmitt.fr,2016-08-13:/activesync-zpush.html</id><summary type="html"/><content type="html">&lt;p&gt;&lt;a href="http://z-push.org"&gt;Z-Push&lt;/a&gt; est une implémentation en PHP du protocol &lt;a href="https://en.wikipedia.org/wiki/ActiveSync"&gt;ActiveSync&lt;/a&gt; de Microsoft. Il permet de synchroniser ses mails, calendriers et contacts. Pour l’instant je ne couvrirai que le mail, le calendrier viendra plus tard éventuellement.&lt;/p&gt;
&lt;p&gt;Le &lt;a href="https://wiki.z-hub.io/display/ZP/Installation"&gt;guide d’installation&lt;/a&gt; est assez spartiate.&lt;/p&gt;
&lt;p&gt;Comme d’hab, je fais mes install sur CentOS 7 et avec PHP-FPM.&lt;/p&gt;
&lt;h2&gt;PHP&lt;/h2&gt;
&lt;p&gt;Déjà, installez PHP 5.6. Ça ne fonctionnera pas du tout avec PHP 7, pour le moment en tout cas. J’ai testé, laissez tomber l’idée. À moins d’avoir du temps pour dev, mais si eux n’ont pas encore sorti une version "PHP 7 proof", c’est que ça n’est sans doute pas si simple.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://webtatic.com/packages/php56/"&gt;https://webtatic.com/packages/php56/&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;IMAP et SMTP&lt;/h2&gt;
&lt;p&gt;Avoir un serveur IMAP et SMTP disponible et déjà configuré.&lt;/p&gt;
&lt;p&gt;Normalement ces deux bouzins là sont assez connus pour qu’Internet soit truffé de tutos…&lt;/p&gt;
&lt;h2&gt;Paquets&lt;/h2&gt;
&lt;p&gt;Les paquets ne sont pas signés malheureusement :/&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/etc/yum.repos.d/z-push.repo&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[z-push]&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Z-Push noarch Enterprise Linux 7 - $basearch&lt;/span&gt;
&lt;span class="na"&gt;baseurl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;http://repo.z-hub.io/z-push:/final/RHEL_7&lt;/span&gt;
&lt;span class="na"&gt;failovermethod&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;priority&lt;/span&gt;
&lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
&lt;span class="na"&gt;gpgcheck&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yum makecache
yum install z-push-common z-push-backend-imap z-push-ipc-sharedmemory
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;On pourra utiliser &lt;code&gt;z-push-ipc-memcached&lt;/code&gt; à la place de &lt;code&gt;sharedmemory&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Nginx et PHP-FPM&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;/etc/nginx/conf.d/peterschmitt.fr.conf&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="err"&gt;server_name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;peterschmitt.fr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="err"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;/Microsoft-Server-ActiveSync&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="err"&gt;fastcgi_split_path_info&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;^(.+?\.php)(/.*)$&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="err"&gt;include&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;fastcgi_params_z-push&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="err"&gt;fastcgi_param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;SCRIPT_FILENAME&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;/usr/share/z-push/index.php&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="err"&gt;fastcgi_param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;DOCUMENT_ROOT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;/usr/share/z-push/&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="err"&gt;fastcgi_pass&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;unix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;srv&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;php-fpm&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;socks&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;z-push&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;La configuration automatique tente de joindre le domaine de l’adresse mail à configurer, sur la &lt;code&gt;location&lt;/code&gt; détaillée ici.&lt;/p&gt;
&lt;p&gt;J’ai récupéré cette information depuis la configuration Apache de Z-Push.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/etc/php-fpm.d/z-push.conf&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[z-push]&lt;/span&gt;
&lt;span class="na"&gt;access.log&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;access.log&lt;/span&gt;
&lt;span class="na"&gt;listen&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/srv/php-fpm/socks/z-push&lt;/span&gt;
&lt;span class="na"&gt;listen.owner&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;nginx&lt;/span&gt;
&lt;span class="na"&gt;listen.group&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;nginx&lt;/span&gt;
&lt;span class="na"&gt;listen.mode&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;0660&lt;/span&gt;

&lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;z-push&lt;/span&gt;
&lt;span class="na"&gt;group&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;z-push&lt;/span&gt;

&lt;span class="na"&gt;pm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;dynamic&lt;/span&gt;
&lt;span class="na"&gt;pm.max_children&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;50&lt;/span&gt;
&lt;span class="na"&gt;pm.start_servers&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;5&lt;/span&gt;
&lt;span class="na"&gt;pm.min_spare_servers&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;5&lt;/span&gt;
&lt;span class="na"&gt;pm.max_spare_servers&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;35&lt;/span&gt;

&lt;span class="na"&gt;slowlog&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;www-slow.log&lt;/span&gt;

&lt;span class="na"&gt;chdir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/usr/share/z-push&lt;/span&gt;

&lt;span class="na"&gt;catch_workers_output&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;yes&lt;/span&gt;

&lt;span class="na"&gt;php_flag[display_errors]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;on&lt;/span&gt;
&lt;span class="na"&gt;php_admin_value[error_log]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;php-error.log&lt;/span&gt;
&lt;span class="na"&gt;php_admin_flag[log_errors]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;on&lt;/span&gt;

&lt;span class="na"&gt;php_value[session.save_handler]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;files&lt;/span&gt;
&lt;span class="na"&gt;php_value[session.save_path]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/session&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Système&lt;/h2&gt;
&lt;p&gt;Les paquets sont configurés pour l’utilisateur &lt;code&gt;apache&lt;/code&gt;, car il existe un paquet embarquant de la conf Apache. On adapte tout ça :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;useradd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;push&lt;/span&gt;
&lt;span class="n"&gt;chgrp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;push&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;push&lt;/span&gt;&lt;span class="o"&gt;/*&lt;/span&gt;
&lt;span class="n"&gt;chown&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;push&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;push&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;log&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;push&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="n"&gt;chown&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;push&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;push&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;push&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="n"&gt;systemctl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;restart&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;php&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fpm&lt;/span&gt;
&lt;span class="n"&gt;systemctl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;restart&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;nginx&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Configuration&lt;/h2&gt;
&lt;p&gt;Faire in tour dans &lt;code&gt;/etc/z-push/imap.conf.php&lt;/code&gt; et adapter les dossiers IMAP en fonction de ce qui est actif sur le serveur IMAP, puis passer la &lt;em&gt;define&lt;/em&gt; &lt;code&gt;IMAP_FOLDER_CONFIGURED&lt;/code&gt; à &lt;code&gt;true&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Configurez-y aussi la connexion au serveur IMAP.&lt;/p&gt;
&lt;p&gt;Pour SMTP, cherchez la variable &lt;code&gt;$imap_smtp_params&lt;/code&gt;. Le fichier de configuration est très bien documenté, l’idéal étant une configuration du type :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class="nv"&gt;$imap_smtp_params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s1"&gt;&amp;#39;host&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;ssl://smtp.peterschmitt.fr&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;&amp;#39;port&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;465&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;&amp;#39;auth&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;&amp;#39;localhost&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;smtp.peterschmitt.fr&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;&amp;#39;username&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;imap_username&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;&amp;#39;password&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;imap_password&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Test&lt;/h2&gt;
&lt;p&gt;Accéder à &lt;a href="http://localhost/Microsoft-Server-ActiveSync"&gt;http://localhost/Microsoft-Server-ActiveSync&lt;/a&gt; et tester l’authentification.&lt;/p&gt;
&lt;p&gt;Si déjà ça a fonctionné, vous pouvez passer à la suite, à savoir configurer un client mail voulant causer ActiveSync, comme un client mail mobile par exemple.&lt;/p&gt;
&lt;p&gt;Enfin, testez l’envoi de mail en scrutant les logs de votre serveur mail.&lt;/p&gt;</content><category term="Informatique"/><category term="activesync"/><category term="zpush"/></entry><entry><title>Let's Encrypt, Certbot et Naemon</title><link href="https://florent.peterschmitt.fr/letsencrypt-certbot-naemon.html" rel="alternate"/><published>2016-08-11T13:01:00+02:00</published><updated>2016-08-11T13:01:00+02:00</updated><author><name>Florent Peterschmitt</name></author><id>tag:florent.peterschmitt.fr,2016-08-11:/letsencrypt-certbot-naemon.html</id><summary type="html"/><content type="html">&lt;p&gt;Ou comment automatiser le renouvellement des certificats avec la supervision.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.naemon.org/"&gt;Naemon&lt;/a&gt; est simple donc pour mon petit serveur, pourquoi pas.&lt;/p&gt;
&lt;p&gt;En fait peu importe la méthode de supervision : il s’agit en fait de déclencher la génération des certificats en peu en avance, sur détection de l’expiration.&lt;/p&gt;
&lt;p&gt;Alors, oui, je sais qu’on peut simplement demander à &lt;a href="https://certbot.eff.org/"&gt;Certbot&lt;/a&gt; de mettre à jour et il va se débrouiller pour savoir si le certificat est sur le point d’expirer. Mais autant les graphes c’est cool, et je m’en fiche, autant un truc qui ne va se mettre en route que quand il y en a vraiment besoin, c’est d’autant plus cool =D&lt;/p&gt;
&lt;h2&gt;Principe&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;On met de la sup sur son certificat. Chez moi la vérification passe par un plugin qui check directement le service, ici un &lt;a href="http://nginx.org/en/"&gt;nginx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;On configure un &lt;a href="http://www.naemon.org/documentation/usersguide/eventhandlers.html"&gt;event handler&lt;/a&gt; sur cette sup&lt;/li&gt;
&lt;li&gt;L’event handler va lancer &lt;code&gt;certbot&lt;/code&gt;, via &lt;code&gt;sudo&lt;/code&gt; et relancer les services qui ont besoin de prendre en compte les nouveaux certificats&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Conf&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;/etc/sudoers.d/naemon&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Defaults    !requiretty
naemon      ALL=(ALL) NOPASSWD: /opt/cert-renew.sh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;/etc/naemon/conf.d/sup.cfg&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;define&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;command_name&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="n"&gt;evth_sudo_cert_renew&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;command_line&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;evth&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;cert&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;renew&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sh&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;$SERVICESTATE&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;define&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="w"&gt;                  &lt;/span&gt;&lt;span class="n"&gt;certbot&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;domain&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;use&lt;/span&gt;&lt;span class="w"&gt;                   &lt;/span&gt;&lt;span class="n"&gt;generic&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;max_check_attempts&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mh"&gt;1&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;check_interval&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="mh"&gt;720&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;conformement&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;la&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;certbot&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;on&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;check&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;toutes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;les&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;12&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;heures&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;event_handler_enabled&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;1&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;event_handler&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;evth_sudo_cert_renew&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;register&lt;/span&gt;&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="mh"&gt;0&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;define&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;service_description&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nl"&gt;Web:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;https:&lt;/span&gt;&lt;span class="c1"&gt;//peterschmitt.fr&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;host_name&lt;/span&gt;&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="n"&gt;localhost&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;use&lt;/span&gt;&lt;span class="w"&gt;                   &lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;check_command&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;check_http&lt;/span&gt;&lt;span class="o"&gt;!-&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;H&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;peterschmitt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;403&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;define&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;service_description&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nl"&gt;x509:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;peterschmitt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;host_name&lt;/span&gt;&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="n"&gt;localhost&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;use&lt;/span&gt;&lt;span class="w"&gt;                   &lt;/span&gt;&lt;span class="n"&gt;certbot&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;domain&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;check_command&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;check_ssl_expiry&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;peterschmitt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;443&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;la&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;commande&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;qui&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;vous&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;plaira&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pour&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;la&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;verif&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;des&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;certificats&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;define&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;servicedependency&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;host_name&lt;/span&gt;&lt;span class="w"&gt;                     &lt;/span&gt;&lt;span class="n"&gt;localhost&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;service_description&lt;/span&gt;&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="nl"&gt;Web:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;https:&lt;/span&gt;&lt;span class="c1"&gt;//peterschmitt.fr&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;dependent_host_name&lt;/span&gt;&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="n"&gt;localhost&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;dependent_service_description&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;x509:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;peterschmitt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;execution_failure_criteria&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Scripts&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;/opt/evth-cert-renew.sh&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/bin/sh&lt;/span&gt;
&lt;span class="c1"&gt;#echo &amp;quot;evth $0: args: $*&amp;quot; &amp;gt;&amp;gt; /tmp/evth&lt;/span&gt;
&lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;CRITICAL&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;#echo &amp;quot;evth $0: cert-renew.sh&amp;quot; &amp;gt;&amp;gt; /tmp/evth&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;/opt/cert-renew.sh&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;/tmp/evth
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;#echo &amp;quot;evth $0: rcode: $?&amp;quot; &amp;gt;&amp;gt; /tmp/evth&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="k"&gt;esac&lt;/span&gt;
&lt;span class="nb"&gt;exit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;/opt/cert-renew.sh&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/bin/sh&lt;/span&gt;
certbot&lt;span class="w"&gt; &lt;/span&gt;renew&lt;span class="w"&gt; &lt;/span&gt;--force-renewal
cat&lt;span class="w"&gt; &lt;/span&gt;/etc/letsencrypt/live/peterschmitt.fr/privkey.pem&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;/etc/nginx/ssl/peterschmitt.fr.key.pem
cat&lt;span class="w"&gt; &lt;/span&gt;/etc/letsencrypt/live/peterschmitt.fr/fullchain.pem&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;/etc/nginx/ssl/peterschmitt.fr.crt.pem
systemctl&lt;span class="w"&gt; &lt;/span&gt;restart&lt;span class="w"&gt; &lt;/span&gt;nginx
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Pour les tests on pourra ajouter &lt;code&gt;--dry-run&lt;/code&gt; à la commande &lt;code&gt;certbot renew&lt;/code&gt; pour, il me semble, éviter de consommer le nombre max d’essais par jour.&lt;/p&gt;
&lt;h2&gt;Améliorations possibles&lt;/h2&gt;
&lt;p&gt;Ici, dès la première erreur, on lance la génération et ça sera seulement au prochain check qu’on saura si tout va bien.&lt;/p&gt;
&lt;p&gt;On pourrait plutôt mettre deux retry, se servir de &lt;a href="http://www.naemon.org/documentation/usersguide/statetypes.html"&gt;l’état&lt;/a&gt; &lt;code&gt;SOFT&lt;/code&gt; pour déclencher le renouvellement, et si lors du prochain check on passe en &lt;code&gt;HARD&lt;/code&gt;, ce qui veut dire que le renouvellement a échoué, on envoie une notification.&lt;/p&gt;
&lt;p&gt;Pour faire ça il faudra se servir de la macro &lt;a href="http://www.naemon.org/documentation/usersguide/macrolist.html#servicestatetype"&gt;$SERVICESTATETYPE$&lt;/a&gt; dans le script de l’&lt;code&gt;event handler&lt;/code&gt;.&lt;/p&gt;</content><category term="Informatique"/><category term="naemon"/><category term="certbot"/><category term="letsencrypt"/><category term="automation"/></entry><entry><title>Vieux Centreon et réplica MySQL/MariaDB : objectif MAJ</title><link href="https://florent.peterschmitt.fr/upgrade-centreon-mysql-mariadb-replica.html" rel="alternate"/><published>2016-08-05T11:22:00+02:00</published><updated>2016-08-05T11:22:00+02:00</updated><author><name>Florent Peterschmitt</name></author><id>tag:florent.peterschmitt.fr,2016-08-05:/upgrade-centreon-mysql-mariadb-replica.html</id><summary type="html"/><content type="html">&lt;p&gt;Il sera question ici de la migration d’un vieux Centreon tout moisi, fonctionnant avec du Nagios et NDOUtils, vers un Centreon 2.7.6, un peu mieux, avec du Centreon Engine et Centreon Broker.&lt;/p&gt;
&lt;p&gt;Je ne vais pas détailler le processus de MAJ de Centreon, ni son installation, la documentation de Centreon se suffit à elle-même, et je vais aussi partir du principe que vous connaissez les fichiers de configuration de Centreon, ainsi que les merdouilles liées au processus d’upgrade (modifier les fichiers de migration SQL à la main, tout ça...).&lt;/p&gt;
&lt;p&gt;Ici on va parler réplication MySQL / MariaDB et reprise de service en douceur.&lt;/p&gt;
&lt;h1&gt;État des lieux&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;CentOS 6.x x86_64&lt;/li&gt;
&lt;li&gt;Base de données MySQL 5.1&lt;/li&gt;
&lt;li&gt;Centreon 2.3.3 installé avec les sources&lt;/li&gt;
&lt;li&gt;Nagios 3.x + NDOUtils compatible avec Centreon&lt;/li&gt;
&lt;li&gt;5 pollers dont un local (sur la machine BDD + Web)&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Objectif et étapes&lt;/h1&gt;
&lt;p&gt;L’objectif est de migrer la totalité des composants vers des outils 100% made in Centreon, et avec le moins de temps de coupure possible, et le must, sans faire de trous dans les graphes \o/&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CentOS 6.x x86_64&lt;/li&gt;
&lt;li&gt;Base de donnée MariaDB 5.5 packagée par CES (Centreon)&lt;/li&gt;
&lt;li&gt;Centreon 2.7.6 installé par les paquets&lt;/li&gt;
&lt;li&gt;Centreon Broker Daemon, ou &lt;code&gt;cbd&lt;/code&gt;, remplace &lt;code&gt;ndo2db&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Centreon Engine + Centreon Broker Module, remplace Nagios et &lt;code&gt;ndomod&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Réinstallation de l’instance BDD + Web sur une autre machine, ainsi que son poller local&lt;/li&gt;
&lt;li&gt;Installation de Centreon Engine en parallèlle des Nagios.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La ré-installation de la BDD + Web sur une autre machine est en fait facultative, ici c’était parce que le client avec des thunes à mettre dans une grosse machines avec des gros SSD dégoulinants d’amour tout plein.&lt;/p&gt;
&lt;p&gt;Aussi, pour passer facilement de Nagios à Centreon Engine, on va devoir utiliser temporairement la version 2.6.6 de Centreon, qui est la dernière version à prendre en charge Nagios et NDO. Au delà, le support est largué au profit de Centreon* uniquement.&lt;/p&gt;
&lt;h2&gt;Réplication de la BDD&lt;/h2&gt;
&lt;p&gt;La première étape, c’est de répliquer tranquillement les données en base. Centreon fonctionne quasi exclusivement avec sa BDD MySQL. On s’assure ainsi un dump complet de la base, et une récupération de l’état courant sans jamais oublier personne en chemin.&lt;/p&gt;
&lt;p&gt;Note : même si on peut voir des modules InfluxDB apparaître pour Centreon-Broker, je ne l’ai pas testé (et Centreon n’étant pas une techno qui m’intéresse particulièrement, j’ai pas trop envie de m’y coller) et de toute façon le client n’aurait pas forcément souhaité installer grafana en plus.&lt;/p&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;Déjà, il vous faut, de préférence, une base MySQL identique à la première : même configuration et même version.&lt;/p&gt;
&lt;p&gt;Ensuite, on va configurer comme suit notre MySQL "master", qui est la base qui contient présentement les données :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[mysqld]&lt;/span&gt;
&lt;span class="na"&gt;net_write_timeout&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;3600&lt;/span&gt;
&lt;span class="na"&gt;max_allowed_packet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;1G&lt;/span&gt;
&lt;span class="na"&gt;log-bin&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;mysqld-log-bin&lt;/span&gt;
&lt;span class="na"&gt;server_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
&lt;span class="na"&gt;open-files-limit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;32000&lt;/span&gt;
&lt;span class="na"&gt;binlog_format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;MIXED&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Et sur notre MySQL "slave", qui ne contient rien du tout pour le moment :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[mysqld]&lt;/span&gt;
&lt;span class="na"&gt;relay-log&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;mysqld-log-relay&lt;/span&gt;
&lt;span class="na"&gt;net_write_timeout&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;3600&lt;/span&gt;
&lt;span class="na"&gt;max_allowed_packet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;1G&lt;/span&gt;
&lt;span class="na"&gt;server_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;2&lt;/span&gt;
&lt;span class="na"&gt;read-only&lt;/span&gt;
&lt;span class="na"&gt;open-files-limit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;32000&lt;/span&gt;
&lt;span class="na"&gt;slave-skip-errors&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;1062&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Pour la réplication, un utilisateur dédié est nécessaire. Le/les slave(s) vont se connecter au master via cet utilisateur.&lt;/p&gt;
&lt;p&gt;Création sur le master :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;create&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;user&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;replication_user&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;%&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;identified&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;by&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;the_super_password&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;grant&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;replication&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;slave&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;on&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;replication_user&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;flush&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;privileges&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Enfin il ne coûte rien de vérifier que nos MySQL vont pouvoir causer entre eux :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;mysql
&lt;span class="go"&gt;MariaDB [(none)]&amp;gt; show variables like &amp;#39;skip_networking&amp;#39;;&lt;/span&gt;
&lt;span class="go"&gt;+-----------------+-------+&lt;/span&gt;
&lt;span class="go"&gt;| Variable_name   | Value |&lt;/span&gt;
&lt;span class="go"&gt;+-----------------+-------+&lt;/span&gt;
&lt;span class="go"&gt;| skip_networking | OFF   |&lt;/span&gt;
&lt;span class="go"&gt;+-----------------+-------+&lt;/span&gt;
&lt;span class="go"&gt;1 row in set (0.00 sec)&lt;/span&gt;


&lt;span class="gp"&gt;$ &lt;/span&gt;netstat&lt;span class="w"&gt; &lt;/span&gt;-laputen&lt;span class="p"&gt;|&lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3306&lt;/span&gt;
&lt;span class="go"&gt;tcp        0      0 0.0.0.0:3306                0.0.0.0:\*                   LISTEN&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Et là on peut redémarrer nos deux MySQL pour prendre en compte la configuration.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;service mysqld restart
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Initialisation&lt;/h3&gt;
&lt;p&gt;Cette étape consiste à charger un gros dump en live dans notre slave, pour ensuite lui dire de rejouer les &lt;code&gt;binlog&lt;/code&gt; à partir d’un certain point.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Attention :&lt;/strong&gt; il vous faut impérativement vérifier l’espace disque disponible sur vos machines, et estimer le temps que ce dump va mettre. Sinon vous risquez de ne plus avoir de place pour les binlog, et je ne vous fait pas un dessin : ça va tout planter !&lt;/p&gt;
&lt;p&gt;Bon, déjà, je n’ai pas vraiment trouvé de bonne méthode pour faire ça très proprement, vous allez voir.&lt;/p&gt;
&lt;p&gt;Sur le master, on va exécuter ça :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;mysqldump -uroot -ppassword --all-databases --skip-lock-tables --single-transaction --flush-logs --master-data=1 --quick | head -n 30|grep &amp;#39;^CHANGE MASTER TO&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;On va se prendre un &lt;code&gt;Got errno 32 on write&lt;/code&gt;, ce qui est normal vu qu’avec &lt;code&gt;head&lt;/code&gt; on a fermé &lt;code&gt;stdin&lt;/code&gt; alors que &lt;code&gt;mysqldump&lt;/code&gt; contiuait à écrire. C’est la même erreur qu’on se prendrait en cas de fulldisk si je ne m’abuse.&lt;/p&gt;
&lt;p&gt;Retenez cette valeur : &lt;code&gt;MASTER_LOG_POS=XXX&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Exemple de retour : CHANGE MASTER TO MASTER_LOG_FILE='mariadb-log-bin.000018', MASTER_LOG_POS=106;&lt;/p&gt;
&lt;p&gt;Dans l’exemple, la valeur à retenir est &lt;code&gt;106&lt;/code&gt;. On va s’en servir pour faire démarrer notre slave à la bonne position de départ dans le prochain &lt;code&gt;log-bin&lt;/code&gt; qui va être créé quand on démarrera le dump.&lt;/p&gt;
&lt;p&gt;Pour les options utilisées dans la commande &lt;code&gt;mysqldump&lt;/code&gt;, je vous laisse &lt;code&gt;man mysqldump&lt;/code&gt;, c’est très bien expliqué.&lt;/p&gt;
&lt;p&gt;Bien, maintenant on va réellement lancer le dump. Préparez deux shell : un dans un &lt;code&gt;screen&lt;/code&gt; ou &lt;code&gt;tmux&lt;/code&gt;, et l’autre sur la console MySQL de votre master.&lt;/p&gt;
&lt;p&gt;Dans le premier, faites feu :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;mysqldump&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;uroot&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ppassword&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;--all-databases --skip-lock-tables --single-transaction --flush-logs --master-data=1 --quick | gzip | ssh root@host_slave &amp;quot;zcat | mysql -uroot&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Sans attendre, dans le second :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;mysql&amp;gt; SHOW MASTER STATUS\G
&lt;span class="k"&gt;...&lt;/span&gt; bla bla bla ...
Master_Log_File: mysqld-log-bin.XXXXXX
&lt;span class="k"&gt;...&lt;/span&gt; bla bla bla ...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Ça les amis, c’est le fichier à partir duquel notre slave va devoir rejouer les instructions, pour commencer la récupération.&lt;/p&gt;
&lt;p&gt;Donc on se retrouve au final avec ces deux infos :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;MASTER_LOG_POS=106
MASTER_LOG_FILE=mysqld-log-bin.XXXXXX
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Ah ouais, heu, &lt;code&gt;XXXXXX&lt;/code&gt;, ça va être des chiffres. Mettons, pour la suite, que ce nombre est &lt;code&gt;000002&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;Mise en marche du slave&lt;/h3&gt;
&lt;p&gt;Déjà, attendez que votre &lt;code&gt;mysqldump&lt;/code&gt; ai terminé et &lt;strong&gt;sans erreur&lt;/strong&gt;. À la moindre coupure, vous pouvez tout recommencer.&lt;/p&gt;
&lt;p&gt;Si ça arrive, sachez que vous pouvez supprimer les &lt;code&gt;binlog&lt;/code&gt; du master qui ne sont plus en activité : ils ne servent plus à rien.&lt;/p&gt;
&lt;p&gt;Par contre, si tout va bien, ne supprimez rien du tout, car naturellement, on va en avoir besoin.&lt;/p&gt;
&lt;p&gt;Ouvrez une console MySQL sur le slave, on va changer sa configuration et lancer le processus de réplication.&lt;/p&gt;
&lt;p&gt;Exécutez cette commande, en adaptant avec vos valeur pour &lt;code&gt;MASTER_LOG_POS&lt;/code&gt; et &lt;code&gt;MASTER_LOG_FILE&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;CHANGE MASTER TO
  MASTER_HOST=&amp;#39;host_master&amp;#39;,
  MASTER_USER=&amp;#39;replication_user&amp;#39;,
  MASTER_PASSWORD=&amp;#39;the_super_password&amp;#39;,
  MASTER_PORT=3306,
  MASTER_CONNECT_RETRY=10,
  MASTER_LOG_FILE=&amp;#39;mysqld-log-bin.000002&amp;#39;,
  MASTER_LOG_POS=106;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Vous pouvez vérifier que les infos ont bien été prises en compte avec la commande &lt;code&gt;SHOW SLAVE STATUS\G&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Quand tout va bien, exécutez &lt;code&gt;SLAVE START;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Tout au long de la récupération du slave sur le master, on devra avoir quelque chose comme ça :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;show slave status \G;
&lt;span class="gh"&gt;#&lt;/span&gt; On ne doit pas trouver d’erreur :
    Last_IO_Errno: 0
    Last_IO_Error: 
    Last_SQL_Errno: 0
    Last_SQL_Error:
    Slave_IO_Running: Yes
    Slave_SQL_Running: Yes

&lt;span class="gh"&gt;#&lt;/span&gt; Le compteur de retard ne doit pas sans cesse s’incrémenter :
    Seconds_Behind_Master: XXXXX
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Le compteur &lt;code&gt;Seconds_Behind_Master&lt;/code&gt; va devoir tendre vers 0 avec le temps. Il pourra momentanément augmenter, mais s’il ne fait que d’augmenter, alors vous avez un problème : votre slave n’est pas capable d’absorber la charge ou votre master ne répond pas assez vite, ou les deux.&lt;/p&gt;
&lt;p&gt;Vous vous souvenez de l’option &lt;code&gt;slave-skip-errors = 1062&lt;/code&gt; dans la configuration ? Visitez directement ce lien : http://www.ducea.com/2008/02/13/mysql-skip-duplicate-replication-errors/&lt;/p&gt;
&lt;p&gt;Ça va vous arriver, en tout cas avec Centreon. Je n’ai pas eu le temps d’investiguer sur le pourquoi du comment, en revanche je sais qu’il n’y a pas réellement de problème et qu’il n’y aura pas de corruption. Ce genre d’erreur est à confronter avec votre environnement et la/les application(s) qui utilisent vos bases.&lt;/p&gt;
&lt;p&gt;En tout cas, il est nécessaire de zapper cette erreur, sinon vous vous retrouverez à devoir manuellement, ou scriptemochement, sauter les erreurs. MySQL a déjà une option pour ça, utilisons la.&lt;/p&gt;
&lt;p&gt;Quand le compteur &lt;code&gt;Seconds_Behind_Master&lt;/code&gt; tombe à zéro, on pourra poursuivre la migration.&lt;/p&gt;
&lt;h2&gt;Transfert du master vers le slave (arrêt du master)&lt;/h2&gt;
&lt;p&gt;On va maintenant reconfigurer notre slave pour être utilisé en temps que master, et abandonner le master actuel.&lt;/p&gt;
&lt;p&gt;Connectez-vous sur votre Centreon et modifiez la conf des &lt;code&gt;ndomod&lt;/code&gt; (ou faites le à la main, je m’en fiche du moment que c’est fait) pour qu’ils aient un fichier de rétention en cas d’injoignabilité de &lt;code&gt;ndo2db&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Modifiez aussi la configuration &lt;code&gt;ndo2db&lt;/code&gt; pour pointer sur la BDD slave. Ne relancez surtout pas &lt;code&gt;ndo2db&lt;/code&gt; pour le moment.&lt;/p&gt;
&lt;p&gt;Appliquez cette conf, et faites un petit test pour vous assurer que le fichier est bien créé consommé lorsqu’une règle &lt;code&gt;iptables&lt;/code&gt; empêche notre Nagios de causer avec &lt;code&gt;ndo2db&lt;/code&gt;, puis consommé quand on la retire.&lt;/p&gt;
&lt;p&gt;Arrêtez tous les services Centreon (&lt;code&gt;centcore&lt;/code&gt; et &lt;code&gt;centstorage&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Quand c’est fait, coupez vos instances de &lt;code&gt;ndo2db&lt;/code&gt;. Et là encore, attention à l’espace disque sur les pollers : il ne s’agirait pas de faire un full parce que &lt;code&gt;/var&lt;/code&gt; est taillé à la serpe.&lt;/p&gt;
&lt;p&gt;Avant toute chose, vérifiez que votre slave a bien fini de se synchroniser avec le master.&lt;/p&gt;
&lt;p&gt;Arrêtez l’instance de MySQL sur le master.&lt;/p&gt;
&lt;p&gt;Ensuite, avec MySQL 5.1, on va devoir redémarrer le slave une fois pour repasser en mode "normal".&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Supprimez la configuration qui a été ajoutée pour le slave&lt;/li&gt;
&lt;li&gt;Exécutez sur le slave &lt;code&gt;slave stop; reset slave;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Redémarrez &lt;code&gt;mysqld&lt;/code&gt; du slave&lt;/li&gt;
&lt;li&gt;Vérifiez avec &lt;code&gt;show slave status\G&lt;/code&gt; que vous n’obtenez plus rien. Si ce n’est pas le cas, je me suis vautré dans les commandes précédentes \^_\^&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Eh bah là on est bon les enfants. On va pouvoir redémarrer &lt;code&gt;ndo2db&lt;/code&gt;, qui, avec sa nouvelle conf, va venir peupler notre nouvelle base, et modifier les fichiers de configuration Centreon pour que &lt;code&gt;centcore&lt;/code&gt; et &lt;code&gt;centstorage&lt;/code&gt; viennent taper sur notre nouvelle base.&lt;/p&gt;
&lt;p&gt;Les fichiers de conf sont normalement dans &lt;code&gt;/etc/centreon&lt;/code&gt;, mais si c’est une installation par les sources, vous les avez peut-être dans &lt;code&gt;/usr/local/centreon/etc/&lt;/code&gt;. Adaptez la conf des bases.&lt;/p&gt;
&lt;h2&gt;Reprise de service&lt;/h2&gt;
&lt;p&gt;Redémarrez donc &lt;code&gt;ndo2db&lt;/code&gt;, &lt;code&gt;centcore&lt;/code&gt; et &lt;code&gt;centstorage&lt;/code&gt;. Constatez la bonne reprise du service.&lt;/p&gt;
&lt;p&gt;Pour l’instant, seule la base SQL a été migrée. On va pouvoir passer aux choses sérieuses avec la MAJ.&lt;/p&gt;
&lt;h2&gt;MAJ&lt;/h2&gt;
&lt;p&gt;Coupez encore une fois &lt;code&gt;ndo2db&lt;/code&gt;, &lt;code&gt;centcore&lt;/code&gt; et &lt;code&gt;centstorage&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Débrouillez-vous pour passer en version 2.6.6. Avec &lt;code&gt;yum-plugin-versionlock&lt;/code&gt;, voici le &lt;code&gt;versionlock.list&lt;/code&gt; approprié :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;centreon-2.6.6-5.el6.noarch
centreon-base-2.6.6-5.el6.noarch
centreon-base-config-nagios-2.6.6-5.el6.noarch
centreon-common-2.6.6-5.el6.noarch
centreon-installed-2.6.6-5.el6.noarch
centreon-perl-libs-2.6.6-5.el6.noarch
centreon-web-2.6.6-5.el6.noarch
centreon-plugins-2.6.6-5.el6.noarch
centreon-plugin-meta-2.6.6-5.el6.noarch
centreon-trap-2.6.6-5.el6.noarch
ndoutils-1.4b9-6.el6.x86_64
centreon-broker-2.10.5-2.el6.x86_64
centreon-broker-cbmod-2.10.5-2.el6.x86_64
centreon-broker-core-2.10.5-2.el6.x86_64
centreon-broker-cbd-2.10.5-2.el6.x86_64
centreon-broker-storage-2.10.5-2.el6.x86_64
ndoutils-1.4b9-6.el6.x86_64
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Installez Centreon en utilisant &lt;code&gt;centreon&lt;/code&gt; et &lt;code&gt;centreon-base-config-nagios&lt;/code&gt;, copiez les fichiers de conf Centreon, puis passez le processus de MAJ de Centreon.&lt;/p&gt;
&lt;p&gt;Vous pouvez maintenant redémarrer vos &lt;code&gt;ndo2db&lt;/code&gt;, &lt;code&gt;centcore&lt;/code&gt; et &lt;code&gt;centstorage&lt;/code&gt;, et vérifier que ça marche.&lt;/p&gt;
&lt;h2&gt;Passage en Centreon-Engine + Centreon Broker&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Installer &lt;code&gt;centreon-engine&lt;/code&gt; et &lt;code&gt;centreon-broker-cbmod&lt;/code&gt; sur les pollers&lt;/li&gt;
&lt;li&gt;Installer &lt;code&gt;centreon-broker-daemon&lt;/code&gt; sur votre Central&lt;/li&gt;
&lt;li&gt;Configurez chaque future instance de &lt;code&gt;centreon-engine&lt;/code&gt;, ainsi que &lt;code&gt;centreon-broker-module&lt;/code&gt; et &lt;code&gt;centreon-broker-daemon&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Copiez le &lt;code&gt;~/.ssh&lt;/code&gt; de l’utilisateur &lt;code&gt;centreon&lt;/code&gt; sur votre nouvelle machine, c’est nécessaire pour joindre les pollers&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Pour cela, la &lt;a href="https://documentation.centreon.com/"&gt;documentation&lt;/a&gt; de centreon devrait suffire, sinon il y a d’autres tutos qui expliquent comment configurer tout ce beau monde.&lt;/p&gt;
&lt;p&gt;Une fois que vous avez tout configuré, poussez vous conf mais ne démarrez rien.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Démarrez &lt;code&gt;cbd&lt;/code&gt; sur le central, vérifiez qu’il tourne bien et accepte les connexions&lt;/li&gt;
&lt;li&gt;Arrêtez &lt;code&gt;ndo2db&lt;/code&gt;, votre supervision continueras de tourner et en cas de pépin, la reprise de service avec NDO est faisable simplement en relançant le service&lt;/li&gt;
&lt;li&gt;Configurez Centreon pour utiliser Centreon Broker. Ça se trouve dans les paramètres d’administration&lt;/li&gt;
&lt;li&gt;De là vous ne devriez plus avoir de status, car &lt;code&gt;cbd&lt;/code&gt; écrit dans &lt;code&gt;centreon_storage&lt;/code&gt;, alors que NDO écrit dans &lt;code&gt;centreon_status&lt;/code&gt;. Le fait d’avoir configuré Centreon en mode &lt;code&gt;Centreon Broker&lt;/code&gt; fait qu’il regarde dans &lt;code&gt;centreon_storage&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Lancer vos Centreon Engine. Les status devraient montés quasi immédiatement. Si ça n’est pas le cas (du style le compte d’hôte qui passe de 0 à 100, puis re à 0, puis à 200, puis à 0 etc... vous vous êtes viandé dans la conf des instances de pollers)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;À partir de là, si tout fonctionne, arrêtez vos Nagios&lt;/p&gt;
&lt;h2&gt;MAJ version Centreon 2.7.x&lt;/h2&gt;
&lt;p&gt;Ben là ya pas plus simple : on arrête les services Centreon du central, on retire le &lt;code&gt;versionlock.list&lt;/code&gt;, on upgrade tout le monde (pollers compris, centreno-engine et cbmod), et on relance.&lt;/p&gt;
&lt;p&gt;Vous devrez aussi lancer une reconstruction des graphes à partir des données en base. Les migrations des RRD n’ont jamais bien fonctionné, même avec les &lt;code&gt;rrddump&lt;/code&gt; et &lt;code&gt;rrdrestore&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Aussi faites gaffe, vous aurez peut-être besoin de faire du nettoyage pour certaines métriques inexistantes :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;use&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;centreon_storage&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;adapter&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="k"&gt;delete&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;metrics&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;where&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;data_bin&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;where&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id_metric&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;metric_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="Informatique"/><category term="centreon"/><category term="mysql"/><category term="mariadb"/><category term="replica"/></entry><entry><title>check_vmware_api.pl et Timeout</title><link href="https://florent.peterschmitt.fr/check_vmware_api.pl.html" rel="alternate"/><published>2016-01-07T21:36:00+01:00</published><updated>2016-01-07T21:36:00+01:00</updated><author><name>Florent Peterschmitt</name></author><id>tag:florent.peterschmitt.fr,2016-01-07:/check_vmware_api.pl.html</id><summary type="html"/><content type="html">&lt;p&gt;Si jamais ça arrive, que &lt;code&gt;check_vmware_api.pl&lt;/code&gt; vous rende un vilain &lt;code&gt;timeout&lt;/code&gt;, c’est sans doute que certaines libs perl ne sont pas dans la bonne version.&lt;/p&gt;
&lt;p&gt;Donc, pour installer &lt;a href=""&gt;check_vmware_api.pl&lt;/a&gt;, il vous faudra :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Une saloperie de compte chez VMWare.&lt;/li&gt;
&lt;li&gt;Un VMware-vSphere-Perl-SDK que l’on peut trouver &lt;a href="https://developercenter.vmware.com/web/sdk/60/vsphere-perl"&gt;ici. là.&lt;/a&gt;, pour vSphere 6.0, 5.5 et 5.1.&lt;/li&gt;
&lt;li&gt;&lt;a href="libwww-perl"&gt;http://search.cpan.org/dist/libwww-perl/&lt;/a&gt; en version &lt;code&gt;5.x&lt;/code&gt;, en tout cas pour ce qui est de la version &lt;code&gt;5.5&lt;/code&gt; du SDK Perl de VMWare. Sinon… samarchpa.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Et en gros :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gh"&gt;#&lt;/span&gt; Installer les libs perl suivantes : Crypt::SSLeay, Data::Dumper, Class::MethodMaker, XML::LibXML, LWP, UUID, SOAP::Lite
apt-get install -y libcrypt-ssleay-perl libclass-methodmaker-perl libxml-libxml-perl libuuid-perl libsoap-lite-perl
tar xf VMware-vSphere-Perl-SDK-5.5.0-2043780.x86_64.tar.gz
cd vmware-vsphere-cli-distrib
perl Makefile.PL &amp;amp;&amp;amp; make install
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Et si notre distro pas préférée, genre, Debian Jessie, ne propose pas &lt;code&gt;libwww-perl&lt;/code&gt; dans la bonne version… j’ai envie de dire qu’on va se contenter d’une installe en mode gros porc dégueulasse :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;wget&lt;span class="w"&gt; &lt;/span&gt;http://search.cpan.org/CPAN/authors/id/G/GA/GAAS/libwww-perl-5.837.tar.gz
tar&lt;span class="w"&gt; &lt;/span&gt;xf&lt;span class="w"&gt; &lt;/span&gt;libwww-perl-5.837.tar.gz
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;libwww-perl-5.837
perl&lt;span class="w"&gt; &lt;/span&gt;Makefile.PL&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;make&lt;span class="w"&gt; &lt;/span&gt;install
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Normalement elle sera chargée en priorité sur un &lt;code&gt;libwww-perl&lt;/code&gt;. Pour savoir si ça sera bien le cas, exécuter ceci :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;perl&lt;span class="w"&gt; &lt;/span&gt;-e&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;print join &amp;quot;\n&amp;quot;, @INC&amp;#39;&lt;/span&gt;
/etc/perl
/usr/local/lib/x86_64-linux-gnu/perl/5.20.2
/usr/local/share/perl/5.20.2
/usr/lib/x86_64-linux-gnu/perl5/5.20
/usr/share/perl5
/usr/lib/x86_64-linux-gnu/perl/5.20
/usr/share/perl/5.20
/usr/local/lib/site_perl
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="Informatique"/><category term="check_vmware_api"/><category term="perl"/><category term="timeout"/><category term="debian"/></entry><entry><title>journald et rsyslog sont dans un serveur</title><link href="https://florent.peterschmitt.fr/systemd-journald-rsyslog.html" rel="alternate"/><published>2015-09-17T22:08:00+02:00</published><updated>2015-09-17T22:08:00+02:00</updated><author><name>Florent Peterschmitt</name></author><id>tag:florent.peterschmitt.fr,2015-09-17:/systemd-journald-rsyslog.html</id><summary type="html"/><content type="html">&lt;p&gt;Dans mon &lt;a href="/systemd-btrfs-journald-flush.html"&gt;précédent billet&lt;/a&gt;, j’avais défragmenté &lt;code&gt;/var/log/journald&lt;/code&gt; pour récupérer un temps de démarrage correct avec journald.&lt;/p&gt;
&lt;p&gt;Maintenant, j’ai récupéré un temps de démarrage normal en le dégageant :&lt;/p&gt;
&lt;p&gt;Un petit coup de &lt;code&gt;man journald.conf&lt;/code&gt;, puis édition de &lt;code&gt;/etc/systemd/journald.conf&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[Journal]&lt;/span&gt;
&lt;span class="na"&gt;Storage&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;none&lt;/span&gt;
&lt;span class="na"&gt;ForwardToSyslog&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;On installe, active et démarre &lt;code&gt;rsyslog&lt;/code&gt; (ou &lt;code&gt;syslog-ng&lt;/code&gt;, peu importe), et on redémarre &lt;code&gt;journald&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;rsyslog
systemctl&lt;span class="w"&gt; &lt;/span&gt;restart&lt;span class="w"&gt; &lt;/span&gt;rsyslog
systemctl&lt;span class="w"&gt; &lt;/span&gt;restart&lt;span class="w"&gt; &lt;/span&gt;systemd-journald
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Si on veut pouvoir conserver journald, mais pour la durée de vie de l’uptime en cours, &lt;code&gt;volatile&lt;/code&gt; pourra être utilisé à la place de &lt;code&gt;none&lt;/code&gt; pour l’option &lt;code&gt;Storage&lt;/code&gt;.&lt;/p&gt;</content><category term="Informatique"/><category term="systemd"/><category term="btrfs"/><category term="journald"/></entry><entry><title>systemd + btrfs + journald flush = long boot time</title><link href="https://florent.peterschmitt.fr/systemd-btrfs-journald-flush.html" rel="alternate"/><published>2015-09-12T10:27:00+02:00</published><updated>2015-09-12T10:27:00+02:00</updated><author><name>Florent Peterschmitt</name></author><id>tag:florent.peterschmitt.fr,2015-09-12:/systemd-btrfs-journald-flush.html</id><summary type="html"/><content type="html">&lt;p&gt;À chaque démarrage de ma machine, &lt;a href="http://www.freedesktop.org/software/systemd/man/systemd.unit.html"&gt;l’unité&lt;/a&gt; &lt;code&gt;systemd-journal-flush.service&lt;/code&gt; (&lt;code&gt;Flush Journal to Persistent Storage&lt;/code&gt;) mouline pendant plus de 30 secondes. Je veux bien mais… la machine vient seulement de démarrer, il n’y a normalement pas grand chose à écrire sur le disque… et il est sollicité comme jamais.&lt;/p&gt;
&lt;p&gt;Ceci dit, je n’ai jamais remarqué le problème avec &lt;code&gt;ext4&lt;/code&gt;, et il est rencontré sur des Fedora, &lt;a href="https://bugzilla.redhat.com/show_bug.cgi?id=1006386"&gt;voir #1006386 chez RedHat&lt;/a&gt; alors que je suis sur Gentoo et n’est pas récent.&lt;/p&gt;
&lt;p&gt;À la fin du post, on trouve ceci :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;btrfs&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;fi&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;defrag&lt;span class="w"&gt; &lt;/span&gt;/var/log/journal/*/*
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Eh beh ça fonctionne…&lt;/p&gt;
&lt;p&gt;La cause n’est pas la multiplicité des fichiers, pas plus que leur taille :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="go"&gt;┌(amidala)─(0)──(/home/wrk)&lt;/span&gt;
&lt;span class="go"&gt;└─&amp;gt; tree /var/log/journal/&lt;/span&gt;
&lt;span class="go"&gt;/var/log/journal/&lt;/span&gt;
&lt;span class="go"&gt;├── 39608e9264f183478332d7ff55b7cdf2&lt;/span&gt;
&lt;span class="go"&gt;│   ├── system.journal&lt;/span&gt;
&lt;span class="go"&gt;│   ├── user-1000.journal&lt;/span&gt;
&lt;span class="go"&gt;│   ├── user-1001.journal&lt;/span&gt;
&lt;span class="go"&gt;│   ├── user-1002.journal&lt;/span&gt;
&lt;span class="go"&gt;│   ├── user-1003@83a1f3012ae34bd1b86fd5dac6689c05-000000000001ce49-00051ed86d1efb13.journal&lt;/span&gt;
&lt;span class="go"&gt;│   └── user-1003.journal&lt;/span&gt;
&lt;span class="go"&gt;└── remote&lt;/span&gt;

&lt;span class="go"&gt;2 directories, 6 files&lt;/span&gt;
&lt;span class="go"&gt;┌(amidala)─(0)──(/home/wrk)&lt;/span&gt;
&lt;span class="go"&gt;└─&amp;gt; ls -lh /var/log/journal/39608e9264f183478332d7ff55b7cdf2/&lt;/span&gt;
&lt;span class="go"&gt;total 107M&lt;/span&gt;
&lt;span class="go"&gt;-rw-r-----. 1 root systemd-journal  64M Sep 12 10:40 system.journal&lt;/span&gt;
&lt;span class="go"&gt;-rw-r-----+ 1 root systemd-journal 8.0M Aug 10 15:00 user-1000.journal&lt;/span&gt;
&lt;span class="go"&gt;-rw-r-----+ 1 root systemd-journal 8.0M Sep 11 23:58 user-1001.journal&lt;/span&gt;
&lt;span class="go"&gt;-rw-r-----+ 1 root systemd-journal 8.0M Sep 12 10:30 user-1002.journal&lt;/span&gt;
&lt;span class="go"&gt;-rw-r-----+ 1 root systemd-journal 8.0M Sep  3 19:11 user-1003@83a1f3012ae34bd1b86fd5dac6689c05-000000000001ce49-00051ed86d1efb13.journal&lt;/span&gt;
&lt;span class="go"&gt;-rw-r-----+ 1 root systemd-journal 8.0M Sep  3 19:12 user-1003.journal&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;En revanche, &lt;a href="https://btrfs.wiki.kernel.org/index.php/Problem_FAQ#Defragmenting_a_directory_doesn.27t_work"&gt;le wiki de btrfs&lt;/a&gt; nous apprend que ce type de défragmentation ne s’intéresse qu’aux métadonnées. Hum. Affaire à suivre.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Édition du 17/09/2015 : &lt;a href="/systemd-journald-rsyslog.html"&gt;la suite ici&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;</content><category term="Informatique"/><category term="systemd"/><category term="btrfs"/><category term="journald"/><category term="slow"/></entry><entry><title>systemd-networkd v219 et au delà</title><link href="https://florent.peterschmitt.fr/systemd-networkd-nat.html" rel="alternate"/><published>2015-04-27T22:53:00+02:00</published><updated>2015-04-27T22:53:00+02:00</updated><author><name>Florent Peterschmitt</name></author><id>tag:florent.peterschmitt.fr,2015-04-27:/systemd-networkd-nat.html</id><summary type="html"/><content type="html">&lt;p&gt;Un petit billet pour dire que si tout d’un coup, après passage en version 219 ou supérieure de &lt;em&gt;systemd&lt;/em&gt; vous vous retrouvez avec vos interfaces virtuelles et bridges ne pouvant plus faire de &lt;em&gt;NAT&lt;/em&gt;, et que vous gérez ces mêmes interfaces avec &lt;em&gt;networkd&lt;/em&gt;, alors il vous faudra faire un peu plus de configuration.&lt;/p&gt;
&lt;p&gt;Prenons par exemple un fichier &lt;strong&gt;lxcbr0.network&lt;/strong&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[Match]&lt;/span&gt;
&lt;span class="na"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;lxcbr0&lt;/span&gt;

&lt;span class="k"&gt;[Network]&lt;/span&gt;
&lt;span class="na"&gt;Address&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;10.2.2.254/24&lt;/span&gt;
&lt;span class="na"&gt;IPForward&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;yes&lt;/span&gt;
&lt;span class="na"&gt;IPMasquerade&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;yes&lt;/span&gt;

&lt;span class="k"&gt;[Route]&lt;/span&gt;
&lt;span class="na"&gt;Gateway&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;10.2.2.254/24&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Le bout de ChangeLog qui nous intéresse :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;networkd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;gained&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;support&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;configuring&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;bridge&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;forwarding&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="n"&gt;database&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;entries&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fdb&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;network&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;

&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;networkd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;network&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;gained&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;support&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;configuring&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="n"&gt;per&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;IPv4&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;IPv6&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;packet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;forwarding&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;well&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;IPv4&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="n"&gt;masquerading&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;This&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;is&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;by&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;turned&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;on&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;veth&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;links&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="n"&gt;containers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;registered&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;by&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;nspawn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;This&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;means&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;that&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="n"&gt;nspawn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;containers&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;with&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;network&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;veth&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;will&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="k"&gt;automatic&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;routed&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;access&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;networks&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;without&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;any&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="n"&gt;further&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;configuration&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;or&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;long&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;networkd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;runs&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;on&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Et le bout de man correspondant :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;NETWORK&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;SECTION&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;OPTIONS&lt;/span&gt;

&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;bla&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;bla&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;bla&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;bla&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;bla&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;bla&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;

&lt;span class="n"&gt;IPForward&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;Configures&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;IP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;forwarding&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;network&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;interface&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;If&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;enabled&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;incoming&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;packets&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;on&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;network&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;interface&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;will&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;be&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;forwarded&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;other&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;interfaces&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;according&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;routing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;table&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;Takes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;either&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;boolean&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;argument&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;or&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;values&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;ipv4&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;or&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;ipv6&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;which&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;only&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;enables&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;IP&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;forwarding&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;specified&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;family&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;

&lt;span class="n"&gt;IPMasquerade&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;Configures&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;IP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;masquerading&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;network&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;interface&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;If&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;enabled&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;packets&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;forwarded&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;network&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;interface&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;will&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;be&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;appear&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;coming&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;host&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Takes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;boolean&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;argument&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;Implies&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;IPForward&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;yes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Si je ne me trompe pas, dans le cas de l’utilisation d’interface de type &lt;em&gt;veth&lt;/em&gt;, avec LXC par exemple (;-P), les paquets entrants seront transférés à l’interface vethBLAH appartenant au conteneur.&lt;/p&gt;
&lt;p&gt;Et la seconde option nous sert pour faire notre SNAT.&lt;/p&gt;
&lt;p&gt;Tout cela avec &lt;code&gt;sysctl net.ipv4.ip_forward=1&lt;/code&gt; et &lt;code&gt;iptables -t nat -A POSTROUTING -j MASQUERADE&lt;/code&gt;, un coup de &lt;code&gt;systemctl restart systemd-networkd&lt;/code&gt; et pouf.&lt;/p&gt;
&lt;p&gt;Notez qu’avec Ubuntu 15.04, c’est systemd 219 qui est embarqué.&lt;/p&gt;</content><category term="Informatique"/><category term="systemd"/><category term="networkd"/><category term="nat"/><category term="ubuntu"/><category term="archlinux"/><category term="iptables"/></entry><entry><title>Backups avec BURP, LXC, LUKS et un montage réseau</title><link href="https://florent.peterschmitt.fr/backup-burp-luks-cifs-lxc.html" rel="alternate"/><published>2015-04-15T16:54:00+02:00</published><updated>2015-04-15T16:54:00+02:00</updated><author><name>Florent Peterschmitt</name></author><id>tag:florent.peterschmitt.fr,2015-04-15:/backup-burp-luks-cifs-lxc.html</id><summary type="html"/><content type="html">&lt;p&gt;Petite problématique de sauvegarde chiffrée à travers le réseau, dans un conteneur. Au programme :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;LUKS&lt;/code&gt; pour le chiffrement&lt;/li&gt;
&lt;li&gt;Configuration &lt;code&gt;LXC&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mknod&lt;/code&gt; (obscure)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;BURP&lt;/code&gt; (BackUp and Restore Program)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Contraintes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Stockage délégué à l’hébergeur via un stockage réseau SFTP ou CIFS&lt;/li&gt;
&lt;li&gt;Minimisation de l’espace occupé via de la sauvegarde incrémentale (ça coûte des sous, hein)&lt;/li&gt;
&lt;li&gt;Installation du système de backup isolée dans un conteneur LXC&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Configuration LXC&lt;/h2&gt;
&lt;p&gt;Dans le fichier &lt;code&gt;config&lt;/code&gt; de votre machine LXC, ajouter ces lignes :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;# &lt;/span&gt;/dev/loop0
&lt;span class="go"&gt;lxc.cgroup.devices.allow = b 7:0 rwm&lt;/span&gt;
&lt;span class="gp"&gt;# &lt;/span&gt;/dev/mapper/control
&lt;span class="go"&gt;lxc.cgroup.devices.allow = c 10:236 rwm&lt;/span&gt;
&lt;span class="gp"&gt;# &lt;/span&gt;/dev/mapper/&amp;lt;votre&lt;span class="w"&gt; &lt;/span&gt;luks&amp;gt;
&lt;span class="go"&gt;lxc.cgroup.devices.allow = b 253:* rwm&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Redémarrez le conteneur mais pas avec &lt;code&gt;reboot&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Une fois que c’est fait, il vous faudra avoir chargé le module &lt;code&gt;loop&lt;/code&gt; sur la machine hôte et créé le &lt;em&gt;node&lt;/em&gt; &lt;code&gt;loop0&lt;/code&gt; dans le conteneur :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;mknod&lt;span class="w"&gt; &lt;/span&gt;/dev/loop0&lt;span class="w"&gt; &lt;/span&gt;b&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;7&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;LUKS&lt;/h2&gt;
&lt;p&gt;Premièrement, montons notre stockage réseau. Pour cela j’ai une entrée &lt;code&gt;fstab&lt;/code&gt; avec le point de montage. On oubliera pas de peupler le fichier &lt;code&gt;backup-credentials&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;//backup-host/backup /root/srv-backup-cifs cifs iocharset=utf8,rw,credentials=/root/backup-credentials,uid=root,gid=root,file_mode=0600,dir_mode=0700,noauto 0 0&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;/etc/fstab
mkdir&lt;span class="w"&gt; &lt;/span&gt;/root/srv-backup-cifs
mount&lt;span class="w"&gt; &lt;/span&gt;/root/srv-backup-cifs
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Création d’un fichier &lt;code&gt;sparse&lt;/code&gt; de 1Tio. Je n’ai pas cet espace de stockage, mais si un jour il y en a besoin, le fichier est déjà prêt. Bon enfin c’est juste pour faire joujou hein.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/root/srv-backup-cifs
dd&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/zero&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;of&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;luks.backup.raw&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;seek&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1024G
cryptsetup&lt;span class="w"&gt; &lt;/span&gt;luksFormat&lt;span class="w"&gt; &lt;/span&gt;luks.backup.raw&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# passez les options que vous souhaitez pour chiffrer votre conteneur&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Une fois que c’est fait, on va pouvoir ouvrir notre LUKS et y créer un système de fichier afin de stocker normalement nos fichiers :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;cryptsetup&lt;span class="w"&gt; &lt;/span&gt;luksOpen&lt;span class="w"&gt; &lt;/span&gt;luks.backup.raw&lt;span class="w"&gt; &lt;/span&gt;luks_backup&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# --key-file vous sera utile pour stocker une passphrase dans un fichier afin de monter le volume sans intervention manuelle. À conserver à l’abrit des regards indiscrets…&lt;/span&gt;

mkfs.ext4&lt;span class="w"&gt; &lt;/span&gt;/dev/mapper/luks_backup
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;BURP&lt;/h2&gt;
&lt;p&gt;Cette solution de sauvegarde et restauration est simple, légère (129KB!) , en mode client/serveur, gère les sauvegardes incrémentales et leur restauration, utilise SSL pour les communications, se configure très facilement… et tout un tas d’autres choses, j’en parlerai une autre fois.&lt;/p&gt;
&lt;p&gt;Et voici un exemple de configuration qui va bien :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="nt"&gt;burp_server_clients&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt; cname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;01-mail&amp;#39;&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;&lt;span class="nt"&gt; password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;secret&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;}&lt;/span&gt;

&lt;span class="nt"&gt;burp_server_timer_args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;1s&amp;#39;&lt;/span&gt;

&lt;span class="nt"&gt;burp_server_script_pre&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;/root/mount-backup.sh&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;En tout cas, par défaut, BURP sauvegarde dans &lt;code&gt;/var/spool/burp&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Bon bah, il ne nous reste plus qu’à faire notre montage :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;mount&lt;span class="w"&gt; &lt;/span&gt;/dev/mapper/luks_backup&lt;span class="w"&gt; &lt;/span&gt;/var/spool/burp
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Voici la configuration serveur BURP qui nous intéresse :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="go"&gt;mode = server&lt;/span&gt;
&lt;span class="go"&gt;directory = /var/spool/burp&lt;/span&gt;
&lt;span class="go"&gt;working_dir_recovery_method = delete&lt;/span&gt;
&lt;span class="go"&gt;user=root&lt;/span&gt;
&lt;span class="go"&gt;group=root&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Tous les fichiers seront stockés en &lt;code&gt;root:root&lt;/code&gt; dans le répertoire vu plus haut. Et voici la configuration d’un client :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="go"&gt;mode = client&lt;/span&gt;
&lt;span class="go"&gt;server = host-backup-burp.local&lt;/span&gt;
&lt;span class="go"&gt;cname = 01-mail&lt;/span&gt;
&lt;span class="go"&gt;user=root&lt;/span&gt;
&lt;span class="go"&gt;group=root&lt;/span&gt;
&lt;span class="go"&gt;include = /var/vmails/&lt;/span&gt;
&lt;span class="go"&gt;exclude_fs = sysfs&lt;/span&gt;
&lt;span class="go"&gt;exclude_fs = tmpfs&lt;/span&gt;
&lt;span class="go"&gt;min_file_size = 0 Mb&lt;/span&gt;
&lt;span class="go"&gt;max_file_size = 0 Mb&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Une fois que nous aurons lancé un backup sur le client et que celui-ci sera terminé (&lt;code&gt;burp -a b&lt;/code&gt;), nous aurons un petit nouveau dans &lt;code&gt;/var/spool/burp&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="go"&gt;├── 01-mail&lt;/span&gt;
&lt;span class="go"&gt;│   ├── 0000001 2015-04-15 16:28:36&lt;/span&gt;
&lt;span class="go"&gt;│   │   └── data&lt;/span&gt;
&lt;span class="go"&gt;│   │       └── t&lt;/span&gt;
&lt;span class="go"&gt;│   │           └── var&lt;/span&gt;
&lt;span class="go"&gt;│   │               └── vmails&lt;/span&gt;

&lt;span class="go"&gt;... bla bla bla bla bla bla bla bla bla bla bla ...&lt;/span&gt;

&lt;span class="go"&gt;│   └── current -&amp;gt; 0000001 2015-04-15 16:28:36&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Si je recommance un backup un peu plus tard, un nouveau dossier daté sera créé et le pointeur &lt;code&gt;current&lt;/code&gt; sera déplacé sur ce nouveau dossier. Et je n’aurai en tout que le différentiel du backup.&lt;/p&gt;
&lt;h3&gt;Scripter BURP&lt;/h3&gt;
&lt;p&gt;Pour s’assurer que nos backup seront bien faits sur notre luks, et pas notre machine locale, ajoutons un script qui se lancera à chaque connexion d’un client :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="go"&gt;server_script_pre=/root/mount-backup.sh&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;mount-backup.sh&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/bin/sh&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;!&lt;span class="w"&gt; &lt;/span&gt;-e&lt;span class="w"&gt; &lt;/span&gt;/dev/loop0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;mknod&lt;span class="w"&gt; &lt;/span&gt;/dev/loop0&lt;span class="w"&gt; &lt;/span&gt;b&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;7&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;exit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;mount&lt;span class="p"&gt;|&lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/var/spool/burp&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;-v&lt;span class="w"&gt; &lt;/span&gt;grep&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;mount&lt;span class="w"&gt; &lt;/span&gt;/root/srv-backup-cifs&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;exit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;cryptsetup&lt;span class="w"&gt; &lt;/span&gt;luksOpen&lt;span class="w"&gt; &lt;/span&gt;/root/srv-backup-cifs/luks.backup.rawdisk&lt;span class="w"&gt; &lt;/span&gt;luks_backup&lt;span class="w"&gt; &lt;/span&gt;--key-file&lt;span class="w"&gt; &lt;/span&gt;/root/luks_backup_keyfile&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;exit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;mount&lt;span class="w"&gt; &lt;/span&gt;/dev/mapper/luks_backup&lt;span class="w"&gt; &lt;/span&gt;/var/spool/burp&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;exit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;already mounted&amp;quot;&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;C’est un peu moche et pas franchement résistant à la panne… que se passe-t-il si coupure réseau ? Le mieux serait de démonter notre "disque" à chaque fin de backup si possible (= pas d’autre backup en cours).&lt;/p&gt;
&lt;p&gt;Je ne sais pas si une unité &lt;code&gt;systemd&lt;/code&gt; serait plus efficace dans ce genre de job, en tout cas ça serait à tester.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Il me semble n’avoir rien oublié, aussi si ça ne fonctionne pas, un petit mail et je corrige.&lt;/p&gt;</content><category term="Informatique"/><category term="burp"/><category term="backup"/><category term="lxc"/><category term="luks"/><category term="cifs"/></entry><entry><title>Ansible (&gt;=1.9) et LXC</title><link href="https://florent.peterschmitt.fr/ansible-lxc.html" rel="alternate"/><published>2015-03-26T21:07:00+01:00</published><updated>2015-03-26T21:07:00+01:00</updated><author><name>Florent Peterschmitt</name></author><id>tag:florent.peterschmitt.fr,2015-03-26:/ansible-lxc.html</id><summary type="html"/><content type="html">&lt;h1&gt;Ansible ton conteneur !&lt;/h1&gt;
&lt;p&gt;On va pouvoir créer de A à Z notre environnement à base de conteneurs LXC, grâce au module &lt;code&gt;lxc_container&lt;/code&gt; maintenant supporté par Ansible 1.9.&lt;/p&gt;
&lt;p&gt;Pour cela, je vais faire une mise en œuvre assez simple, se basant sur l’inventaire ansible pour créer un conteneur à partir d’un template.&lt;/p&gt;
&lt;h2&gt;Prérequis&lt;/h2&gt;
&lt;p&gt;Premièrement, soit vous installez à la mode gros porc, soit vous utilisez les paquets, soit il n’y a pas de paquet et vous utilisez &lt;code&gt;virtualenv&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Je vais vous montrer l’installation via un environnement virtuel, car c’est la moins simple et que je ne veux pas traiter la méthode dégueue concistant à pourrir sciemment son système.&lt;/p&gt;
&lt;p&gt;Déjà, débrouillez-vous pour installer, selon votre distribution, &lt;code&gt;virtualenv&lt;/code&gt; pour Python 2. Car c’est avec cette version que Ansible fonctionne. Pour Debian/Ubuntu et CentOS/RedHat, le paquet devrait s’appeler &lt;code&gt;python2-virtualenv&lt;/code&gt; ou &lt;code&gt;python-virtualenv&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Ensuite, suivez le guide :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="go"&gt;virtualenv pyvenv-ansible&lt;/span&gt;
&lt;span class="go"&gt;source pyvenv-ansible/bin/activate&lt;/span&gt;
&lt;span class="go"&gt;pip install ansible&lt;/span&gt;
&lt;span class="go"&gt;git clone https://github.com/lxc/python2-lxc.git&lt;/span&gt;
&lt;span class="go"&gt;cd python2-lxc&lt;/span&gt;
&lt;span class="go"&gt;python setup.py install&lt;/span&gt;
&lt;span class="go"&gt;cd ../&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Inventaire&lt;/h2&gt;
&lt;p&gt;Disons que nous avons trois machines :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Celle qui exécute Ansible et qui va donc héberger les conteneurs.&lt;/li&gt;
&lt;li&gt;Une machine qui n’existe encore pas et que nous allons LXC-ifier.&lt;/li&gt;
&lt;li&gt;Une autre machine mais qui n’est pas sous LXC.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;À partir de là, nous aurons donc besoin de faire un rôle un peu "intelligent" capable de dire si oui ou non nous allons créer la machine avec LXC.&lt;/p&gt;
&lt;p&gt;Déjà, commençons par notre inventaire :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# hosts&lt;/span&gt;

&lt;span class="p p-Indicator"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;setuplxc&lt;/span&gt;&lt;span class="p p-Indicator"&gt;]&lt;/span&gt;
&lt;span class="l l-Scalar l-Scalar-Plain"&gt;localhost ansible_connection=local ansible_python_interpreter=python2 mytype=&amp;#39;physical&amp;#39;&lt;/span&gt;

&lt;span class="l l-Scalar l-Scalar-Plain"&gt;[blabla]&lt;/span&gt;
&lt;span class="l l-Scalar l-Scalar-Plain"&gt;01-mail mytype=&amp;#39;lxc&amp;#39; mytemplate=&amp;#39;debian&amp;#39;&lt;/span&gt;
&lt;span class="l l-Scalar l-Scalar-Plain"&gt;02-web mytype=&amp;#39;kvm&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Quelques explications sur les variables de &lt;code&gt;localhost&lt;/code&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ansible_connection=local&lt;/code&gt; : permet de ne pas lancer de connexion SSH.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ansible_python_interpreter&lt;/code&gt; : il se peut que votre &lt;code&gt;$ python&lt;/code&gt; soit un Python 3. Pour utiliser l’interpréteur de votre choix, et de préférence un qui fonctionnera, je précise ici &lt;code&gt;python2&lt;/code&gt;. C’est le cas de ArchLinux par exemple.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Playbook&lt;/h2&gt;
&lt;p&gt;Le playbook quant à lui se passera d’explications :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;localhost-site.yml&lt;/span&gt;
&lt;span class="l l-Scalar l-Scalar-Plain"&gt;- hosts&lt;/span&gt;&lt;span class="p p-Indicator"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;localhost&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;roles&lt;/span&gt;&lt;span class="p p-Indicator"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;setuplxc&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Heu oui enfin, quand même, tu le sors d’où ton rôle &lt;code&gt;setuplxc&lt;/code&gt; ?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Chhhhhhh… laissez-moi finir.&lt;/p&gt;
&lt;h2&gt;Rôle&lt;/h2&gt;
&lt;p&gt;Bon… je disais… oui, le rôle &lt;code&gt;setuplxc&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Bien, on attaque la partie un poil poilue, le filtrage de notre inventaire pour ne garder que les machines devant tourner sous LXC.
Ce n’est pas spécialement compliqué une fois qu’on est tombé sur le bon bout de documentation permettant d’utiliser les variables :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;roles/setuplxc/tasks/main.yml&lt;/span&gt;
&lt;span class="l l-Scalar l-Scalar-Plain"&gt;- name&lt;/span&gt;&lt;span class="p p-Indicator"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;setup containers&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;lxc_container&lt;/span&gt;&lt;span class="p p-Indicator"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;item&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;container_log&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;hostvars[item][&amp;#39;mytemplate&amp;#39;]&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;started&lt;/span&gt;
&lt;span class="w w-Error"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;when&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;hostvars[item][&amp;#39;mytype&amp;#39;] == &amp;#39;lxc&amp;#39;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;with_items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;groups[&amp;#39;all&amp;#39;]&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Vous l’aurez sans doute compris, &lt;code&gt;groups&lt;/code&gt; contient tous les groupes d’hôtes disponibles dans l’inventaire.&lt;/p&gt;
&lt;p&gt;Nous appelons ici le group spécial &lt;code&gt;all&lt;/code&gt;, et nous bouclons sur toutes les entrées pour en trouver qui aient leur variable &lt;code&gt;mytype&lt;/code&gt; à la valeur &lt;code&gt;lxc&lt;/code&gt;. Le seul problème ici, c’est qu’une entrée n’ayant pas la variable va un peu faire planter le bouzin. Mais un peu de rigueur ne fait pas de mal, donc mettez cette variable, un point c’est tout.&lt;/p&gt;
&lt;p&gt;Ensuite bah, on utilise tout simplement le module &lt;code&gt;lxc_container&lt;/code&gt; ! Je pense que les quelques paramètres présents sont limpides, aussi je vous laisser aller lire la &lt;strong&gt;documentation&lt;/strong&gt; du module que vous pourrez trouver en &lt;code&gt;find pyvenv-ansible -name lxc_container.py -exec $EDITOR {} \;&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;Exécution | FIRE!&lt;/h2&gt;
&lt;p&gt;Bon, là, il faut soit passer en root directement, soit demander à ansible d’exécuter la tâche en root via un &lt;code&gt;sudo: yes \ sudo_user: root&lt;/code&gt;, mais je vous laisse faire.&lt;/p&gt;
&lt;p&gt;Puis, en toute simplicité :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="go"&gt;ansible-playbook -i hosts localhost-site.yml&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="Informatique"/><category term="lxc"/><category term="ansible"/><category term="automation"/></entry><entry><title>LXC Autostart / lxc-autostart / lxc.conf</title><link href="https://florent.peterschmitt.fr/lxc-autostart-conf.html" rel="alternate"/><published>2015-03-25T19:00:00+01:00</published><updated>2015-03-25T19:00:00+01:00</updated><author><name>Florent Peterschmitt</name></author><id>tag:florent.peterschmitt.fr,2015-03-25:/lxc-autostart-conf.html</id><summary type="html"/><content type="html">&lt;h1&gt;Démarrer ses conteneurs LXC&lt;/h1&gt;
&lt;p&gt;Je ferai peut-être un jour un article plus conséquent sur la configuration complète d’un conteneur LXC, mais pour le moment on va s’intéresser à ceci : le démarrage automatique des conteneurs.&lt;/p&gt;
&lt;p&gt;Ici, c’est LXC 1.0 qui est utilisé.&lt;/p&gt;
&lt;h2&gt;La commande lxc-autostart&lt;/h2&gt;
&lt;p&gt;Cette commande va permettre de démarrer tous les conteneurs ayant été configurés pour démarrer automatiquement. Les autres seront ignorés.&lt;/p&gt;
&lt;p&gt;On pourra déjà utiliser cette commande pour voir l’état de notre configuration :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;lxc-autostart -L # liste les conteneurs restant à démarrer, avec leur ordre
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Et pour démarrer les conteneurs restant à démarrer automatiquement :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;lxc-autostart # zatsaul bro&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;La configuration de nos conteneurs&lt;/h2&gt;
&lt;p&gt;Ici, rien de magique, juste un peu de de RTF^W lecture &lt;em&gt;attentive&lt;/em&gt; du manuel :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;man lxc.conf
man lxc.container.conf
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Et voici les options qui nous intéressent :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;lxc.start.auto = 0|1
lxc.start.order = num relatif
lxc.start.delay = num secondes
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Et voici comment les utiliser :&lt;/p&gt;
&lt;p&gt;Pour &lt;code&gt;lxc.start.auto&lt;/code&gt;, tout va bien, &lt;code&gt;0&lt;/code&gt; indique qu’on ne démarrera pas automatiquement ce conteneur, et un &lt;code&gt;1&lt;/code&gt; fera l’inverse.&lt;/p&gt;
&lt;p&gt;Et maintenant, un peu d’ordre : &lt;code&gt;lxc.start.order&lt;/code&gt;. Plus le nombre est grand, plus votre conteneur démarrera tôt. Pour faire simple, celui qui a la plus grosse gagne. Pour des numéros égaux, ça démarrera en "même temps".&lt;/p&gt;
&lt;p&gt;Enfin, on complète notre série avec &lt;code&gt;lxc.start.delay&lt;/code&gt;. Cette variable va &lt;em&gt;intercaller&lt;/em&gt; un délais &lt;em&gt;avant&lt;/em&gt; le démarrage du &lt;em&gt;prochain&lt;/em&gt; conteneur sur la liste.&lt;/p&gt;
&lt;h1&gt;Exemple pratique&lt;/h1&gt;
&lt;p&gt;J’ai trois conteneurs, disons &lt;code&gt;dns&lt;/code&gt;, &lt;code&gt;postgresql&lt;/code&gt; et &lt;code&gt;prosody&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Comme j’adresse tous mes conteneurs entre eux via le DNS, il vaut mieux qu’il fonctionne. Donnons lui une conf qui va lui permettre, par rapport aux autres, de démarrer le premier, et on s’assurera que les conteneurs suivants auront le DNS directement accessible lors de leur démarrage respectif avec un petit délais :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;# lxc.name = dns
lxc.start.auto = 1
lxc.start.order = 9000
lxc.start.delay = 20
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;On démarre &lt;code&gt;dns&lt;/code&gt;, puis on attend 20 secondes avant de démarrer le prochain.&lt;/p&gt;
&lt;p&gt;Ensuite, on aura remarqué que prosody dans sa branche &lt;code&gt;0.9.x&lt;/code&gt; ne réessaye pas de se connecter à sa base SQL configurée. Du coup, on va horriblement contourner le problème de la sorte :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;# lxc.name = postgresql
lxc.start.auto = 1
lxc.start.order = 1000
lxc.start.delay = 30
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;# lxc.name = prosody
lxc.start.auto = 1
lxc.start.order = 100
lxc.start.delay = 0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Et voilà qui est fait. Le conteneur &lt;code&gt;prosody&lt;/code&gt; ayant une priorité plus basse que le conteneur &lt;code&gt;postgresql&lt;/code&gt;, et comme nous avons configuré un délais de 30 secondes entre les conteneurs de priorité 1000 et ceux de priorité inférieure, PostgreSQL aura le temps de démarrer correctement et prosody d’avoir une base lancée à laquelle se connecter.&lt;/p&gt;</content><category term="Informatique"/><category term="lxc"/><category term="autostart"/><category term="config"/></entry><entry><title>GitLab - Version de Ruby alternative sans RVM</title><link href="https://florent.peterschmitt.fr/gitlab-ruby-sans-rvm.html" rel="alternate"/><published>2014-07-28T18:10:00+02:00</published><updated>2014-07-28T18:10:00+02:00</updated><author><name>Florent Peterschmitt</name></author><id>tag:florent.peterschmitt.fr,2014-07-28:/gitlab-ruby-sans-rvm.html</id><summary type="html"/><content type="html">&lt;p&gt;&lt;em&gt;Testé pour la version 7.1 avec la distribution Debian Wheezy.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Installation par les sources avec MySQL.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Sous Debian&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;build-essential&lt;span class="w"&gt; &lt;/span&gt;zlib1g-dev&lt;span class="w"&gt; &lt;/span&gt;libyaml-dev&lt;span class="w"&gt; &lt;/span&gt;libssl-dev&lt;span class="w"&gt; &lt;/span&gt;libgdbm-dev&lt;span class="w"&gt; &lt;/span&gt;libreadline-dev&lt;span class="w"&gt; &lt;/span&gt;libncurses5-dev&lt;span class="w"&gt; &lt;/span&gt;libffi-dev&lt;span class="w"&gt; &lt;/span&gt;curl
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Compilation de Ruby&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;GRV&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;2.1.2&amp;quot;&lt;/span&gt;
wget&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;http://cache.ruby-lang.org/pub/ruby/&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;GRV&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sed&lt;span class="w"&gt; &lt;/span&gt;-rn&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;s/(.*)\.[0-9]*$/\1/p&amp;#39;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;/ruby-&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;GRV&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.tar.gz&amp;quot;&lt;/span&gt;
tar&lt;span class="w"&gt; &lt;/span&gt;xf&lt;span class="w"&gt; &lt;/span&gt;ruby-&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;GRV&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;.tar.gz
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ruby-&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;GRV&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
./configure&lt;span class="w"&gt; &lt;/span&gt;--prefix&lt;span class="o"&gt;=&lt;/span&gt;/opt/ruby-&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;GRV&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--disable-install-rdoc
make&lt;span class="w"&gt; &lt;/span&gt;-j3
make&lt;span class="w"&gt; &lt;/span&gt;install
ln&lt;span class="w"&gt; &lt;/span&gt;-sf&lt;span class="w"&gt; &lt;/span&gt;/opt/ruby-&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;GRV&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/opt/ruby
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Environnement&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;export PATH=&amp;quot;/opt/ruby/bin:$PATH&amp;quot;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;/etc/default/gitlab&lt;span class="w"&gt;    &lt;/span&gt;
sed&lt;span class="w"&gt; &lt;/span&gt;-e&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;1s@.*@#!/opt/ruby/bin/ruby@g&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-i&lt;span class="w"&gt; &lt;/span&gt;/home/git/gitlab-shell/hooks/update
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Installation des gems pour GitLab&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;/opt/ruby/bin/gem&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;bundle
su&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;git
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/home/git/gitlab
ruby&lt;span class="w"&gt; &lt;/span&gt;-v&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# vérifier qu’on a bien la bonne version…&lt;/span&gt;
bundle&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;--without&lt;span class="w"&gt; &lt;/span&gt;development&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;postgres&lt;span class="w"&gt; &lt;/span&gt;--deployment&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# adapter la commande selon qu’on utilise postgres…&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;GO&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;service&lt;span class="w"&gt; &lt;/span&gt;gitlab&lt;span class="w"&gt; &lt;/span&gt;restart
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="Informatique"/><category term="gitLab"/><category term="ruby"/></entry><entry><title>Un cluster MongoDB avec redondance et répartition de charge</title><link href="https://florent.peterschmitt.fr/mongodb-cluster-replicas.html" rel="alternate"/><published>2013-09-15T21:10:00+02:00</published><updated>2013-09-15T21:10:00+02:00</updated><author><name>Florent Peterschmitt</name></author><id>tag:florent.peterschmitt.fr,2013-09-15:/mongodb-cluster-replicas.html</id><summary type="html"/><content type="html">&lt;h2&gt;Buts de la réplication avec MongoDB&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Assurer la résistance à la panne d’au moins une machine.&lt;/li&gt;
&lt;li&gt;Permettre des accès en lecture plus rapides.&lt;/li&gt;
&lt;li&gt;Dans un environnement géographiquement étendu, réduit les latences réseau si l’application utilisant la base n’a pas besoin des informations de dernière date.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Choix d’architecture&lt;/h2&gt;
&lt;p&gt;Le premier (et nécessaire pour le second) est une architecture simple avec un maître (primaire) et des esclaves (secondaires).&lt;/p&gt;
&lt;p&gt;Les écritures sont contrôlées par le primaire et retransmises aux secondaires (qui peuvent être plus que deux).&lt;/p&gt;
&lt;p&gt;C’est l’architecture de « réplicats » :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="go"&gt;               Clients&lt;/span&gt;
&lt;span class="go"&gt;               Driver&lt;/span&gt;
&lt;span class="go"&gt;                 ||&lt;/span&gt;
&lt;span class="go"&gt;                 ||&lt;/span&gt;
&lt;span class="go"&gt;              Primaire                 }&lt;/span&gt;
&lt;span class="go"&gt;        /-----^      ^-----\           } base mongodb&lt;/span&gt;
&lt;span class="go"&gt;Réplica1                    Réplica2   }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Le problème de cette architecture étant la répartition de la charge sur de grosses bases. Si une base subit plus de transactions que la machine ne peut en satisfaire (limitation des disques, CPU…), il devient intéressant d’utiliser une architecture en « shards » :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="go"&gt;                            Clients&lt;/span&gt;
&lt;span class="go"&gt;                            Driver&lt;/span&gt;
&lt;span class="go"&gt;                              ||&lt;/span&gt;
&lt;span class="go"&gt;                              ||&lt;/span&gt;
&lt;span class="go"&gt;                            Routeur_________&lt;/span&gt;
&lt;span class="go"&gt;                               |            \_____Serveurs de configuration (&amp;gt;1)&lt;/span&gt;
&lt;span class="go"&gt;                      _________|____________/&lt;/span&gt;
&lt;span class="go"&gt;                     |      |     |      |           }&lt;/span&gt;
&lt;span class="go"&gt;                     |      |     |      |           } base mongodb&lt;/span&gt;
&lt;span class="go"&gt;                    Shard Shard Shard  Shard (&amp;gt;0)    }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Le routeur se chargera de communiquer avec les serveurs de configuration pour pouvoir trouver les données et les donner aux bons shards.&lt;/p&gt;
&lt;p&gt;Les shards peuvent être des bases mongo seules mais seront plutôt des réplicats.&lt;/p&gt;
&lt;p&gt;En production, MongoDB recommande d’utiliser trois serveurs de configuration pour assurer la continuité de service. Le choix du nombre de shards est une science que je n’ai pas encore apprise.&lt;/p&gt;
&lt;p&gt;Pour se connecter à une base MongoDB, nous devons utiliser un « driver » qui est en fait une brique logicielle qui nous utiliserons dans toute application voulant utiliser MongoDB. J’ai choisi le driver en Python pour réaliser les tests.&lt;/p&gt;
&lt;p&gt;L’architecture en shards est ce qu’on pourrait appeler une extension bigrement essentielle des réplicats et permettent de distribuer le travail au travers de multiples machines.&lt;/p&gt;
&lt;h2&gt;Environnement de travail&lt;/h2&gt;
&lt;p&gt;Trois machines virtuelles hébergeront chacune une instance de mongod, une base MongoDB.&lt;/p&gt;
&lt;p&gt;Machines :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Debian sid&lt;/li&gt;
&lt;li&gt;MongoDB 2.4.5&lt;/li&gt;
&lt;li&gt;Heartbeat 3.0.5 installé et configuré. Fichier haresourses vide.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Réseau :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Réseau privé 192.168.56.0/24&lt;/li&gt;
&lt;li&gt;hôte     : .1&lt;/li&gt;
&lt;li&gt;mongodb0 : .2&lt;/li&gt;
&lt;li&gt;mongodb1 : .3&lt;/li&gt;
&lt;li&gt;mongodb2 : .4&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Faire&lt;/h2&gt;
&lt;p&gt;Nous allons voir comment mettre en place un « replica set », la réplication simple avec la répartition de charge que peut offrir les secondaires en lecture.&lt;/p&gt;
&lt;h3&gt;1. Configurer Heartbeat sur toutes les machines&lt;/h3&gt;
&lt;p&gt;/etc/ha.d/ha.cf&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="go"&gt;bcast eth1&lt;/span&gt;
&lt;span class="go"&gt;deadtime 5&lt;/span&gt;
&lt;span class="go"&gt;keepalive 2&lt;/span&gt;
&lt;span class="go"&gt;mcast eth0 239.0.0.1 694 1 0&lt;/span&gt;
&lt;span class="go"&gt;node mongodb2.localhost mongodb1.localhost mongodb0.localhost&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;/etc/ha.d/authkeys&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="go"&gt;auth 1&lt;/span&gt;
&lt;span class="go"&gt;1 md5 cacc670d1040becee271a4be61cf303d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;/etc/ha.d/haresources&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="go"&gt;-vide-&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;2. Configurer les DNS&lt;/h3&gt;
&lt;p&gt;Nous devons avoir des hôtes suivant ce schéma :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;mongodb0.localhost # primaire&lt;/li&gt;
&lt;li&gt;mongodb1.localhost # secondaire1&lt;/li&gt;
&lt;li&gt;mongodb2.localhost # secondaire2&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. Sur chaque machine&lt;/h3&gt;
&lt;p&gt;Configurer la base MongoDB :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;EDITOR&lt;span class="w"&gt; &lt;/span&gt;/etc/mongodb.conf
&lt;span class="go"&gt;: replSet = rs0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;replSet sert à indiquer à notre base à quel « replica set » elle appartient. Le nom est donc arbitraire mais doit être identique pour toutes les bases voulant appartenir au même groupe, évidemment.&lt;/p&gt;
&lt;p&gt;Lancer la base MongoDB si ce n’est pas déjà fait (Debian prend soin de tout lancer à notre place, même quand on ne le veut pas…).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;service&lt;span class="w"&gt; &lt;/span&gt;mongodb&lt;span class="w"&gt; &lt;/span&gt;start
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;4. Sur la machine maître, ou primaire&lt;/h3&gt;
&lt;p&gt;S’y connecter :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;mongo
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Initier la réplication :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="go"&gt;&amp;gt; rs.initiate()&lt;/span&gt;
&lt;span class="go"&gt;{&lt;/span&gt;
&lt;span class="go"&gt;    &amp;quot;info2&amp;quot; : &amp;quot;no configuration explicitly specified -- making one&amp;quot;,&lt;/span&gt;
&lt;span class="go"&gt;    &amp;quot;me&amp;quot; : &amp;quot;mongodb0.localhost:27017&amp;quot;,&lt;/span&gt;
&lt;span class="go"&gt;    &amp;quot;info&amp;quot; : &amp;quot;Config now saved locally.  Should come online in about a minute.&amp;quot;,&lt;/span&gt;
&lt;span class="go"&gt;    &amp;quot;ok&amp;quot; : 1&lt;/span&gt;
&lt;span class="go"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;MongoDB va générer une configuration pour la réplication, nous pouvons l’afficher :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="go"&gt;&amp;gt; rs.config()&lt;/span&gt;
&lt;span class="go"&gt;{&lt;/span&gt;
&lt;span class="go"&gt;    &amp;quot;_id&amp;quot; : &amp;quot;rs0&amp;quot;,&lt;/span&gt;
&lt;span class="go"&gt;    &amp;quot;version&amp;quot; : 1,&lt;/span&gt;
&lt;span class="go"&gt;    &amp;quot;members&amp;quot; : [&lt;/span&gt;
&lt;span class="go"&gt;        {&lt;/span&gt;
&lt;span class="go"&gt;            &amp;quot;_id&amp;quot; : 0,&lt;/span&gt;
&lt;span class="go"&gt;            &amp;quot;host&amp;quot; : &amp;quot;mongodb0.localhost:27017&amp;quot;&lt;/span&gt;
&lt;span class="go"&gt;        }&lt;/span&gt;
&lt;span class="go"&gt;    ]&lt;/span&gt;
&lt;span class="go"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Ajouter les secondaires :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="go"&gt;&amp;gt; rs.add(&amp;#39;mongodb1.localhost&amp;#39;)&lt;/span&gt;
&lt;span class="go"&gt;{ &amp;quot;ok&amp;quot; : 1 }&lt;/span&gt;
&lt;span class="go"&gt;&amp;gt; rs.add(&amp;#39;mongodb2.localhost&amp;#39;)&lt;/span&gt;
&lt;span class="go"&gt;{ &amp;quot;ok&amp;quot; : 1 }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Statut de la réplication (des champs ont été retirés) :&lt;/p&gt;
&lt;p&gt;mongodb0 :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;rs0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;PRIMARY&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;set&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;rs0&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;date&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ISODate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;2013-09-14T15:00:44Z&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;myState&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;members&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;_id&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;mongodb0.localhost:27017&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;stateStr&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;PRIMARY&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;self&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="o"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;_id&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;mongodb1.localhost:27017&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;stateStr&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;SECONDARY&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;syncingTo&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;mongodb0.localhost:27017&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="o"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;_id&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;mongodb2.localhost:27017&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;stateStr&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;SECONDARY&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;syncingTo&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;mongodb0.localhost:27017&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ok&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Un peut d’attente est nécessaire pour que l’élection se fasse, de l’ordre de quelques secondes. Nous voyons que mongodb1 et mongodb2 se synchronisent sur mongodb0, car c’est le primaire.&lt;/p&gt;
&lt;p&gt;Les serveurs secondaires doivent voir chacun de leurs copains :&lt;/p&gt;
&lt;p&gt;mongodb1 :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;rs0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;SECONDARY&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;set&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;rs0&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;date&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ISODate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;2013-09-14T15:03:06Z&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;myState&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;syncingTo&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;mongodb0.localhost:27017&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;members&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;_id&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;mongodb0.localhost:27017&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;stateStr&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;PRIMARY&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;pingMs&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="o"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;_id&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;mongodb1.localhost:27017&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;stateStr&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;SECONDARY&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;self&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="o"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;_id&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;mongodb2.localhost:27017&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;stateStr&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;SECONDARY&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;pingMs&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;syncingTo&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;mongodb0.localhost:27017&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ok&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Statut des bases à ce stade :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;mongodb0 -&amp;gt; primaire&lt;/li&gt;
&lt;li&gt;mongodb1 -&amp;gt; secondaire&lt;/li&gt;
&lt;li&gt;mongodb2 -&amp;gt; secondaire&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5. Tester l’élection&lt;/h3&gt;
&lt;p&gt;Coupons le primaire (mongodb0) (brutalement ou pas) :&lt;/p&gt;
&lt;p&gt;mongodb1 :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;rs0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;PRIMARY&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;set&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;rs0&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;date&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ISODate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;2013-09-14T15:14:53Z&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;myState&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;members&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;_id&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;mongodb0.localhost:27017&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;stateStr&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;(not reachable/healthy)&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="o"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;_id&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;mongodb1.localhost:27017&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;stateStr&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;PRIMARY&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;errmsg&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;db exception in producer: 10278 dbclient error communicating with server: mongodb0.localhost:27017&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;self&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="o"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;_id&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;mongodb2.localhost:27017&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;stateStr&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;SECONDARY&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;syncingTo&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;mongodb1.localhost:27017&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ok&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Le champs "stateStr" nous indique que mongodb0 n’est plus existante. Aussi, un nouveau primaire a été élu, il s’agit de mongodb1. De ce fait, mongodb2 se synchronise sur mongodb1. On pourra voir –presque– la même chose sur la machine restée secondaire.&lt;/p&gt;
&lt;p&gt;Redémarrons maintenant l’ancienne machine primaire (mongodb0) :&lt;/p&gt;
&lt;p&gt;mongodb1 :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;rs0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;PRIMARY&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;set&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;rs0&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;date&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ISODate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;2013-09-14T15:15:44Z&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;myState&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;members&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;_id&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;mongodb0.localhost:27017&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;stateStr&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;SECONDARY&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;syncingTo&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;mongodb1.localhost:27017&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="err"&gt;…&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Nous voyons maintenant que la base mongodb0 se synchronise avec la nouvelle machine primaire mongodb1.&lt;/p&gt;
&lt;p&gt;Désormais, nous avons :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;mongodb0 -&amp;gt; secondaire&lt;/li&gt;
&lt;li&gt;mongodb1 -&amp;gt; primaire&lt;/li&gt;
&lt;li&gt;mongodb2 -&amp;gt; secondaire&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;6. Tester la réplication&lt;/h3&gt;
&lt;p&gt;J’ai réalisé un petit script pour faciliter les essais. Le script écrit et lit dans la base « test » et la collection « posts ».&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/usr/bin/env python&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;datetime&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;time&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;signal&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;argparse&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;inspect&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;sys&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;pymongo&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MongoDBTest&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;CONTW&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;sigtrap_int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;signum&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;MongoDBTest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CONTW&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;readsec&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;servers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="s1"&gt;&amp;#39;mongodb0.localhost:27017&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;&amp;#39;mongodb1.localhost:27017&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;&amp;#39;mongodb2.localhost:27017&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]):&lt;/span&gt;

        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pymongo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MongoReplicaSetClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="s1"&gt;&amp;#39;mongodb://&lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="s1"&gt;/&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;servers&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
                &lt;span class="n"&gt;replicaSet&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;rs0&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;connectTimeoutMS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;socketTimeoutMS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;test&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;rpref&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pymongo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read_preferences&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ReadPreference&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;readsec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="c1"&gt;# read from secondaries&lt;/span&gt;
            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read_preference&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rpref&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SECONDARY&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read_preference&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rpref&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PRIMARY&lt;/span&gt;

        &lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SIGINT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sigtrap_int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;insert_post&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;date&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strftime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;%H:%M:%S&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;posts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;insert_post&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;oid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;oid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;oid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;posts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find_one&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;_id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;posts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;oid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;printall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;header&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#### &lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="s1"&gt; : &lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="s1"&gt; | Secondaries: &lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="s1"&gt;Master: &lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="s1"&gt; ####&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;
        &lt;span class="n"&gt;poststr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;id: &lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="s1"&gt; | date: &lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;

        &lt;span class="n"&gt;secs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;secondaries&lt;/span&gt;
        &lt;span class="n"&gt;secstr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;
        &lt;span class="n"&gt;primary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;None&amp;#39;&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;primary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;primary&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;TypeError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;pass&lt;/span&gt;
        &lt;span class="n"&gt;posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;posts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strftime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;%H:%M:%S&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;caller&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;inspect&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;sec&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;secs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;secstr&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sec&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39; &amp;#39;&lt;/span&gt;

        &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;header&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;caller&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;secstr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;primary&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;post&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;poststr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;_id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;date&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
        &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;flush&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;drop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;post&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;posts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;_id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c1"&gt;############## TESTS ##############&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_fill_roll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;parser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;argparse&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ArgumentParser&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;--init&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dest&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;init&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;store_true&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;--add&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dest&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;add&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;store_true&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;--show&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dest&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;show&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;store_true&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;--test-fill-roll&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dest&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;test_fr&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;store_true&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;--read-sec&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dest&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;readsec&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;store_true&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;--forever&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dest&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;forever&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;store_true&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parse_args&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="n"&gt;mtest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MongoDBTest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;readsec&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;MongoDBTest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CONTW&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;init&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;mtest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;drop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;mtest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;test_fr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;mtest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;test_fill_roll&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;mtest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;printall&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;forever&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;break&lt;/span&gt;
            &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;pymongo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;errors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AutoReconnect&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stderr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Cannot auto-reconnect&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# should not exists, but 20% cooler for tests&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;pymongo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;errors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ConnectionFailure&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stderr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Cannot connect to a master&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# should not exists, but 20% cooler for tests&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;ConnectionRefusedError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;pass&lt;/span&gt;
            &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# should not exists, but 20% cooler for tests&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;AssertionError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;pass&lt;/span&gt;
            &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# should not exists, but 20% cooler for tests&lt;/span&gt;
        &lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stderr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;flush&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Vider la base y écrire des données et les afficher (lecture depuis le primaire) :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="go"&gt;python mongotest.py --init --add --show&lt;/span&gt;

&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="c1"&gt;### 19:15:09 : main | Secondaries: mongodb1.localhost mongodb2.localhost Master: mongodb0.localhost ####&lt;/span&gt;
&lt;span class="go"&gt;id: 5235eb1dbb45f954fea1a8ec | date: 19:15:09&lt;/span&gt;
&lt;span class="go"&gt;id: 5235eb1dbb45f954fea1a8ed | date: 19:15:09&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Éteindre le nœud primaire, attendre l’élection d’un nouveau primaire et tenter de lire les données. Elles doivent être identiques.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="go"&gt;python mongotest.py --show&lt;/span&gt;

&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="c1"&gt;### 19:16:46 : main | Secondaries: mongodb1.localhost Master: mongodb2.localhost ####&lt;/span&gt;
&lt;span class="go"&gt;id: 5235eb1dbb45f954fea1a8ec | date: 19:15:09&lt;/span&gt;
&lt;span class="go"&gt;id: 5235eb1dbb45f954fea1a8ed | date: 19:15:09&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Ajouter des données et vérifier leur présence :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="go"&gt;python mongotest.py --add --show&lt;/span&gt;

&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="c1"&gt;### 19:17:15 : main | Secondaries: mongodb1.localhost Master: mongodb2.localhost ####&lt;/span&gt;
&lt;span class="go"&gt;id: 5235eb1dbb45f954fea1a8ec | date: 19:15:09&lt;/span&gt;
&lt;span class="go"&gt;id: 5235eb1dbb45f954fea1a8ed | date: 19:15:09&lt;/span&gt;
&lt;span class="go"&gt;id: 5235eb9abb45f956252e2a26 | date: 19:17:14&lt;/span&gt;
&lt;span class="go"&gt;id: 5235eb9bbb45f956252e2a27 | date: 19:17:15&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Rallumez le précédent nœud (mongodb0), attendez sa synchronisation puis éteignez le nouveau nœud primaire (mongodb2), les données du premier et second ajout (--add) doivent être présentes :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="go"&gt;python mongotest.py --show&lt;/span&gt;

&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="c1"&gt;### 19:21:22 : main | Secondaries: mongodb1.localhost Master: mongodb0.localhost ####&lt;/span&gt;
&lt;span class="go"&gt;id: 5235eb1dbb45f954fea1a8ec | date: 19:15:09&lt;/span&gt;
&lt;span class="go"&gt;id: 5235eb1dbb45f954fea1a8ed | date: 19:15:09&lt;/span&gt;
&lt;span class="go"&gt;id: 5235eb9abb45f956252e2a26 | date: 19:17:14&lt;/span&gt;
&lt;span class="go"&gt;id: 5235eb9bbb45f956252e2a27 | date: 19:17:15&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Voyons ce qu’il se passe quand nous voulons écrire, puis lire depuis les secondaires :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="go"&gt;python mongotest.py --test-fill-roll --show --forever --read-sec&lt;/span&gt;

&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="c1"&gt;### 17:56:22 : test_fill_roll | Secondaries: mongodb2.localhost Master: mongodb0.localhost ####&lt;/span&gt;
&lt;span class="go"&gt;id: 5235d8a3bb45f943f54f71dd | date: 17:56:19&lt;/span&gt;
&lt;span class="go"&gt;id: 5235d8a4bb45f943f54f71de | date: 17:56:20&lt;/span&gt;
&lt;span class="go"&gt;id: 5235d8a5bb45f943f54f71df | date: 17:56:21&lt;/span&gt;
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="c1"&gt;### 17:56:23 : test_fill_roll | Secondaries: mongodb2.localhost Master: mongodb0.localhost ####&lt;/span&gt;
&lt;span class="go"&gt;id: 5235d8a4bb45f943f54f71de | date: 17:56:20&lt;/span&gt;
&lt;span class="go"&gt;id: 5235d8a5bb45f943f54f71df | date: 17:56:21&lt;/span&gt;
&lt;span class="go"&gt;id: 5235d8a6bb45f943f54f71e0 | date: 17:56:22&lt;/span&gt;
&lt;span class="go"&gt;id: 5235d8a7bb45f943f54f71e1 | date: 17:56:23&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;test-fill-roll supprime le premier enregistrement (le plus vieux) et ajoute un enregistrement immédiatement après. Une pause d’une seconde est faite entre chaque.&lt;/p&gt;
&lt;p&gt;On voit ici qu’un insertion n’a pas eu le temps de percer jusqu’au secondaire et il se trouve que nous avons lu depuis ce secondaire, d’où un enregistrement manquant. Quand on lit depuis le primaire, nous n’avons pas ce problème, les données reçues sont celles écrites récemment.&lt;/p&gt;
&lt;p&gt;Amusons nous à couper le maître, par exemple. Ici une extinction brutale de la VM ne posera pas de problème, mais on peut aussi le faire plus doucement avec l’ACPI.&lt;/p&gt;
&lt;p&gt;Nous obtiendrons cela, par exemple :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="go"&gt;python mongotest.py --test-fill-roll --show --forever&lt;/span&gt;

&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="c1"&gt;### 18:37:59 : main | Secondaries: mongodb2.localhost mongodb0.localhost Master: mongodb1.localhost ####&lt;/span&gt;
&lt;span class="go"&gt;id: 5235e264bb45f94e2c774f1c | date: 18:37:56&lt;/span&gt;
&lt;span class="go"&gt;id: 5235e265bb45f94e2c774f1d | date: 18:37:57&lt;/span&gt;
&lt;span class="go"&gt;id: 5235e266bb45f94e2c774f1e | date: 18:37:58&lt;/span&gt;
&lt;span class="go"&gt;id: 5235e267bb45f94e2c774f1f | date: 18:37:59&lt;/span&gt;
&lt;span class="go"&gt;Cannot auto-reconnect&lt;/span&gt;
&lt;span class="go"&gt;Cannot auto-reconnect&lt;/span&gt;
&lt;span class="go"&gt;Cannot auto-reconnect&lt;/span&gt;
&lt;span class="go"&gt;Cannot auto-reconnect&lt;/span&gt;
&lt;span class="go"&gt;Cannot auto-reconnect&lt;/span&gt;
&lt;span class="go"&gt;Cannot auto-reconnect&lt;/span&gt;
&lt;span class="go"&gt;Cannot auto-reconnect&lt;/span&gt;
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="c1"&gt;### 18:38:11 : main | Secondaries: mongodb2.localhost Master: mongodb0.localhost ####&lt;/span&gt;
&lt;span class="go"&gt;id: 5235e265bb45f94e2c774f1d | date: 18:37:57&lt;/span&gt;
&lt;span class="go"&gt;id: 5235e266bb45f94e2c774f1e | date: 18:37:58&lt;/span&gt;
&lt;span class="go"&gt;id: 5235e267bb45f94e2c774f1f | date: 18:37:59&lt;/span&gt;
&lt;span class="go"&gt;id: 5235e273bb45f94e2c774f20 | date: 18:38:11&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Le temps pendant lequel nous ne pouvons pas nous connecter dure quelques secondes, dépendant de la configuration Heartbeat.&lt;/p&gt;
&lt;h3&gt;7. L’accès en lecture seule&lt;/h3&gt;
&lt;p&gt;Très simple, lancer les trois bases et le test de lecture seule, puis éteindre le primaire :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="go"&gt;python mongotest.py --show --forever --read-sec&lt;/span&gt;

&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="c1"&gt;### 20:34:55 : main | Secondaries: mongodb0.localhost mongodb2.localhost Master: mongodb1.localhost ####&lt;/span&gt;
&lt;span class="go"&gt;id: 5235eb1dbb45f954fea1a8ec | date: 19:15:09&lt;/span&gt;
&lt;span class="go"&gt;id: 5235eb1dbb45f954fea1a8ed | date: 19:15:09&lt;/span&gt;
&lt;span class="go"&gt;id: 5235eb9abb45f956252e2a26 | date: 19:17:14&lt;/span&gt;
&lt;span class="go"&gt;id: 5235eb9bbb45f956252e2a27 | date: 19:17:15&lt;/span&gt;
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="c1"&gt;### 20:34:56 : main | Secondaries: mongodb2.localhost Master: mongodb0.localhost ####&lt;/span&gt;
&lt;span class="go"&gt;id: 5235eb1dbb45f954fea1a8ec | date: 19:15:09&lt;/span&gt;
&lt;span class="go"&gt;id: 5235eb1dbb45f954fea1a8ed | date: 19:15:09&lt;/span&gt;
&lt;span class="go"&gt;id: 5235eb9abb45f956252e2a26 | date: 19:17:14&lt;/span&gt;
&lt;span class="go"&gt;id: 5235eb9bbb45f956252e2a27 | date: 19:17:15&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Aucune action d’écriture n’est réalisée dans cet essai. Pendant le temps où aucun primaire n’a été ré-élu, on a continué à lire les donnés présentes et la reprise s’est faite sans aucun problème. Pas de coupure non plus lors de l’extinction du primaire.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;La réplication avec MongoDB est presque magique, après quelques heures de documentation et essais on arrive à une installation pleinement fonctionnelle.&lt;/p&gt;
&lt;p&gt;J’ai préféré mettre l’accent sur des démonstrations plutôt que de me lancer dans une architecture à shards, bien que le principale soit fait avec les réplicats. À suivre dans un prochain épisode.&lt;/p&gt;
&lt;p&gt;À propos de ce qui est fait :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La configuration est très simple, j’ai même cru à un piège concernant Heartbeat.&lt;/li&gt;
&lt;li&gt;Viandage au début, écrire sur la base « local » n’est pas une bonne idée car contenant la configuration de la base…&lt;/li&gt;
&lt;li&gt;La reprise de service (élection d’un nouveau primaire) est tout de même longue : 10 secondes environ.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;À faire/tester :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Éloignement géographique.&lt;/li&gt;
&lt;li&gt;Sauvegarder une base MongoDB.&lt;/li&gt;
&lt;li&gt;Les bases en « shards », avec les routeurs et serveurs de configuration.&lt;/li&gt;
&lt;li&gt;Comparer avec d’autres bases, comme CouchDB par exemple, qui propose une réplication à double sens.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Une petite vidéo (qui vaut le coup d’installer flash) : &lt;a href="http://www.youtube.com/watch?v=jyx8iP5tfCI"&gt;http://www.youtube.com/watch?v=jyx8iP5tfCI&lt;/a&gt;&lt;/p&gt;</content><category term="Informatique"/><category term="mongodb"/></entry><entry><title>Installer Debian sur un volume LUKS/LVM existant</title><link href="https://florent.peterschmitt.fr/installer-debian-sur-un-volume-lukslvm-existant.html" rel="alternate"/><published>2013-08-21T13:37:00+02:00</published><updated>2013-08-21T13:37:00+02:00</updated><author><name>Florent Peterschmitt</name></author><id>tag:florent.peterschmitt.fr,2013-08-21:/installer-debian-sur-un-volume-lukslvm-existant.html</id><summary type="html"/><content type="html">&lt;p&gt;L'installation de Debian sur un volume LUKS &lt;strong&gt;existant&lt;/strong&gt; n'est manifestement pas prit en charge par l'installateur et une petite manipulation s'impose.&lt;/p&gt;
&lt;p&gt;Mon disque dur est partitionné de cette façon :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="go"&gt;Linux Boot ext2 -&amp;gt; sda1&lt;/span&gt;
&lt;span class="go"&gt;LUKS -&amp;gt; sda3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Et dans le LUKS, un gros volume physique LVM2, un VG (nommé linux chez moi) et des LV. Rien de bien extraordinaire donc.&lt;/p&gt;
&lt;h2&gt;Démarrage&lt;/h2&gt;
&lt;p&gt;Démarrer l'installation et aller jusqu'à l'étape de partitionnement et entrer en manuel.&lt;/p&gt;
&lt;h2&gt;Ouvrir (ou déverouiller) le volume LUKS&lt;/h2&gt;
&lt;p&gt;Continuer le partitionnement en mode manuel, sélectionner la partition censée être chiffrée et l'utiliser en temps que volume chiffré. À partir de là, l'installateur va charger les composants de cryptsetup. Désactivez le formattage.&lt;/p&gt;
&lt;p&gt;Revenez en arrière deux fois pour atterrir sur le menu de sélection des étapes d'installation.&lt;/p&gt;
&lt;p&gt;Allez dans une TTY et ouvrez votre disque avec cryptsetup :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="go"&gt;cryptsetup luksOpen /dev/sda3 [un nom au pif]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Bien, ben maintenant on peut activer les volumes logiques LVM :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="go"&gt;vgchange -ay linux&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;On revient dans notre installateur et on va à l'étape « Détecter les disques ».&lt;/p&gt;
&lt;p&gt;TADAAAM ! Nos volumes sont là !&lt;/p&gt;
&lt;h2&gt;Configurer et installer&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Le disque chiffré doit être marqué d'un K (comme &lt;em&gt;Keep&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;Pour le reste, eh bien allez-y, configurez les volumes que vous voulez pour l'installation de Debian.&lt;/li&gt;
&lt;li&gt;N'oubliez pas non plus de configurer le disque pour &lt;code&gt;/boot&lt;/code&gt;…&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Et maintenant ?
On attend. Parce que c'est long. Si si.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;On installe le boot-loader et on redémarre. On choisi alors sa Debian toute fraîchement installée, on a les erreurs "normales" à propos des LVM non trouvés, par contre après atteinte d'un timeout de quelques secondes, l'initramfs rendra la main.&lt;/p&gt;
&lt;h2&gt;Le drâme&lt;/h2&gt;
&lt;p&gt;Ben le drâme c'est qu'après avoir fait tout ça, Debian n'a pas configuré un initramfs pour notre configuration LUKS. Pourtant on lui a bien précisé d'utiliser le disque LUKS. Non ? Si, mais il n'a pas donné de nom au volume et n'a pas généré le &lt;code&gt;/etc/crypttab&lt;/code&gt; correspondant.&lt;/p&gt;
&lt;p&gt;Donc quand l'initramfs nous rend la main, on pourra ouvrir manuellement le volume LUKS et activer les volumes logiques :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="go"&gt;cryptsetup luksOpen /dev/sda3 [nom au pif]&lt;/span&gt;
&lt;span class="go"&gt;vgchange -ay linux&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Ensuite on exit et ça démarre. Ouf.&lt;/p&gt;
&lt;p&gt;Pour avoir fait une installation « from scratch » en VM, le fichier n'est pas sensé être vide et doit contenir ceci, sachant que mon volume LUKS est sur &lt;code&gt;/dev/sda3&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="go"&gt;sda3_crypt /dev/sda3 none luks&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Après avoir man crypttab on se rend compte qu'il faut utiliser en target (le premier champ du fichier) le nom sous lequel est ouvert notre volume LUKS dans &lt;code&gt;/dev/mapper/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;En essayant de générer l'initrd, on obtient un &lt;em&gt;warning&lt;/em&gt; qui nous donne cet nom.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="go"&gt;cryptsetup: WARNING: invalid line in /etc/crypttab for cryptroot -&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;cryptroot&lt;/code&gt; est ici notre cible, que nous allons utiliser dans &lt;code&gt;/etc/crypttab&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="go"&gt;crypttab /dev/sda3 none luks&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Et on peut enfin régénérer notre initrd :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="go"&gt;update-initramfs -u&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Et tout doit rouler.&lt;/p&gt;</content><category term="Informatique"/><category term="debian"/><category term="luks"/><category term="lvm"/></entry><entry><title>Firewall – VLC – RTP – FreePlayer</title><link href="https://florent.peterschmitt.fr/firewall-vlc-rtp-freeplayer.html" rel="alternate"/><published>2013-08-14T23:15:00+02:00</published><updated>2013-08-14T23:15:00+02:00</updated><author><name>Florent Peterschmitt</name></author><id>tag:florent.peterschmitt.fr,2013-08-14:/firewall-vlc-rtp-freeplayer.html</id><summary type="html"/><content type="html">&lt;p&gt;Pour ceux qui ne sont pas intimes avec le FAI Free, on peut accéder à la télévision via le « freeplayer » grâce à l'adresse « mafreebox.freebox.fr », pointant sur l'IP 212.27.38.253. Le protocole RTP, pour Real Time Protocol, permet la diffusion temps réelle d'un flux d'informations, tel la vidéo ou le son par exemple.&lt;/p&gt;
&lt;p&gt;Je précise que j'ai utilisé iptables (pouah), mais que le principe est évidemment le même pour tout le monde…&lt;/p&gt;
&lt;h2&gt;RTP&lt;/h2&gt;
&lt;p&gt;Le protocole va demander au client d'ouvrir un port UDP et TCP. Le port TCP choisi sera le port UDP + 1. Si 1024 a été choisi pour l'UDP, on aura le port 1025 pour TCP.&lt;/p&gt;
&lt;h2&gt;FreePlayer&lt;/h2&gt;
&lt;p&gt;Une connexion sur le port 554, RTSP pour Real Time Streaming Protocol, est nécessaire en sortie. C'est rare de filtrer la sortie pour son propre poste, mais pour ceux qui le font… voilà.&lt;/p&gt;
&lt;p&gt;Il faudra également autoriser la réception en UDP sur le port 15947, un paquet sera émis sur l'adresse multicast 228.67.43.91. Je n'ai pas saisi tout de suite la spécificité de cette adresse… &lt;a href="http://fr.wikipedia.org/wiki/Multicast#Adresses_multicast_IPv4_r.C3.A9serv.C3.A9es"&gt;un petit lien ouistitipédia&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;La capture tcpdump (avec wireshark ça marche aussi) :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="go"&gt;IP sidious.15947 &amp;gt; 228.67.43.91.15947: UDP, length 11&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Faïeurwhale, qu'il est beau&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="go"&gt;*filter&lt;/span&gt;
&lt;span class="go"&gt;:INPUT DROP [0:0]&lt;/span&gt;
&lt;span class="go"&gt;:FORWARD DROP [0:0]&lt;/span&gt;
&lt;span class="go"&gt;:OUTPUT ACCEPT [349:27582]&lt;/span&gt;
&lt;span class="go"&gt;-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT&lt;/span&gt;
&lt;span class="go"&gt;-A INPUT -p icmp -j ACCEPT&lt;/span&gt;
&lt;span class="go"&gt;-A INPUT -i lo -j ACCEPT&lt;/span&gt;
&lt;span class="go"&gt;-A INPUT -p udp -m udp --dport 31336 -j ACCEPT&lt;/span&gt;
&lt;span class="go"&gt;-A INPUT -p tcp -m tcp --dport 31337 -j ACCEPT&lt;/span&gt;
&lt;span class="go"&gt;-A INPUT -p udp -m udp --dport 15947 -j ACCEPT&lt;/span&gt;
&lt;span class="go"&gt;-A INPUT -s 212.27.38.253/32 -p udp -m udp --dport 40000:50000 -j ACCEPT&lt;/span&gt;
&lt;span class="go"&gt;-A INPUT -j REJECT --reject-with icmp-proto-unreachable&lt;/span&gt;
&lt;span class="go"&gt;COMMIT&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Le but étant de ne pas accepter n'importe qui en entrée, on drop tout en entrée et sur le &lt;em&gt;forwarding&lt;/em&gt; et bon, on est pas des bêtes, on laisse tout passer en sortie.&lt;/p&gt;
&lt;p&gt;Comme on peut le voir, j'autorise bien l'entrée en UDP sur le port 31336 qui correspond au port choisi par VLC pour faire sa tambouille (on peut en choisir un autre bien entendu), et j'ai donc ouvert le port 31337 en TCP, comme demandé par le protocole RTP.&lt;/p&gt;</content><category term="Informatique"/><category term="tcp"/><category term="udp"/><category term="firewall"/><category term="iptables"/></entry><entry><title>Utiliser gpg-agent pour ssh</title><link href="https://florent.peterschmitt.fr/utiliser-gpg-agent-pour-ssh.html" rel="alternate"/><published>2013-08-13T18:30:00+02:00</published><updated>2013-08-13T18:30:00+02:00</updated><author><name>Florent Peterschmitt</name></author><id>tag:florent.peterschmitt.fr,2013-08-13:/utiliser-gpg-agent-pour-ssh.html</id><summary type="html"/><content type="html">&lt;h2&gt;gpg-agent&lt;/h2&gt;
&lt;p&gt;Lancez l'agent GPG dans votre console, ou votre session X.org (via le fichier &lt;em&gt;.xsession&lt;/em&gt; pour ceux qui l'utilisent), pour ça on pourra faire indifféremment du type de session :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;eval&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;gpg-agent&lt;span class="w"&gt; &lt;/span&gt;--daemon&lt;span class="w"&gt; &lt;/span&gt;--enable-ssh-support&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;On pourra ajouter l'option suivante pour avoir une zolie interface fort pratique pour nous demander la passphrase, qu'on souhaite mémoriser, de la clef GPG ou SSH voulue :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;--pinentry-program&lt;span class="w"&gt; &lt;/span&gt;USRBINDIR/pinentry&lt;span class="o"&gt;(&lt;/span&gt;-gtk&lt;span class="p"&gt;|&lt;/span&gt;-qt4&lt;span class="p"&gt;|&lt;/span&gt;-ncurses&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Pour SSH, petite manip'&lt;/h2&gt;
&lt;p&gt;Le manuel de &lt;em&gt;gpg-agent&lt;/em&gt; stipule qu'il faudra exécuter un premier &lt;strong&gt;ssh-add&lt;/strong&gt; pour que le support des clefs SSH soit effectif.&lt;/p&gt;
&lt;h2&gt;Enjoy&lt;/h2&gt;</content><category term="Informatique"/><category term="ssh"/><category term="gpg"/></entry><entry><title>DDOS via torrent pourravé ?</title><link href="https://florent.peterschmitt.fr/ddos-via-torrent-pourrave.html" rel="alternate"/><published>2013-08-12T11:46:00+02:00</published><updated>2013-08-12T11:46:00+02:00</updated><author><name>Florent Peterschmitt</name></author><id>tag:florent.peterschmitt.fr,2013-08-12:/ddos-via-torrent-pourrave.html</id><summary type="html"/><content type="html">&lt;p&gt;Aujourd'hui j'ai voulu mettre à télécharger une ISO d'ArchLinux sur le serveur. Rien d'anormal jusque là, et c'était &lt;em&gt;vraiment&lt;/em&gt; un torrent de l'image d'ArchLinux, prise sur &lt;a href="https://www.archlinux.org"&gt;archlinux.org&lt;/a&gt; et tout et tout.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ajout du torrent sur Transmission, okay.&lt;/li&gt;
&lt;li&gt;Attente de quelques secondes pour voir le torrent apparaître dans la liste, …&lt;/li&gt;
&lt;li&gt;Heu… syn ? syn ? syn ? … ping ?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;ALAAAAAAARM !&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Remonter le temps : qu'ai-je fais avant que tout cela n'arrive ?&lt;/li&gt;
&lt;li&gt;Installé /usr/libexec/mail.local via les sources car après &lt;a href="http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/jails-intro.html"&gt;&lt;em&gt;jailage&lt;/em&gt;&lt;/a&gt; de postfix, il vaut mieux réinstaller le sendmail de base. Ce que je n'ai pas fait et donc ce programme était manquant.&lt;/li&gt;
&lt;li&gt;Ajouté ce torrent.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Comme j'utilise FreeBSD 9.2-RC1 avec ZFS en système de fichier, je n'ai pas pu utiliser le rescue-pro fourni pour OVH car la version de ZFS est trop récente. Erf. Et ils ne proposent plus le vKVM. Re-erf.&lt;/p&gt;
&lt;p&gt;À ce moment là je ne pensais pas que transmission pouvait être en cause, et je suis donc parti sur mail.local, vu qu'il a été compilé via les sources et qu'il ne provenait donc pas des tarbaballes de base. À part un segfault il n'aurait pas pu faire grand chose d'autre… mais peu importe.&lt;/p&gt;
&lt;p&gt;Redémarrage bourrin via l'interface de gestion d'OVH, les yeux rivés sur le ping 5.135.177.31, un ssh katana rm -rf /usr/libexec/mail.local prêt à bondir dès que le serveur répond et… la commande s'exécute… puis plus rien. Le ping ne trouve plus de pong, ça n'était donc pas ça.&lt;/p&gt;
&lt;h2&gt;À nous deux, face de torrent&lt;/h2&gt;
&lt;p&gt;(Re)²boot, ssh katana service transmission stop&lt;/p&gt;
&lt;p&gt;La magie opère, le problème venait donc de là. Dans les logs on trouvera :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="go"&gt;Aug 12 11:26:16 katana kernel: Limiting closed port RST response from 543 to 200 packets/sec&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;RST&lt;/h2&gt;
&lt;p&gt;Avec TCP, reset, permet de mettre fin à une connexion. C'est ce qui va se passer quand on veut joindre un port fermé par exemple, la connexion est fermée avec RST. Donc ça veut dire quoi, qu'on a floodé le serveur sur un port fermé jusqu'à ce qu'il crève sous les réponses à envoyer ?&lt;/p&gt;
&lt;p&gt;Malheureusement je n'ai pas d'informations à ce sujet, ou du moins pas encore, &lt;a href="http://www.openbsd.org/faq/pf/fr/logging.html&amp;quot;"&gt;pflog (oui, en français)&lt;/a&gt; va bien me cracher quelque chose.&lt;/p&gt;
&lt;h2&gt;Des sysctl sympatiques&lt;/h2&gt;
&lt;p&gt;En plus d'un &lt;em&gt;firewall&lt;/em&gt;, on peut se prémunir de ce genre d'attaque en utilisant les sysctl suivantes :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="go"&gt;net.inet.tcp.blackhole&lt;/span&gt;
&lt;span class="go"&gt;net.inet.udp.blackhole&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Avec la valeur 1 ou 2. Voir &lt;a href="http://www.freebsd.org/cgi/man.cgi?query=blackhole&amp;amp;manpath=FreeBSD+9.1-stable"&gt;man blackhole&lt;/a&gt; pour plus d'informations (a priori FreeBSD only)&lt;/p&gt;</content><category term="Informatique"/><category term="freebsd"/><category term="tcp"/><category term="ddos"/></entry><entry><title>Portal premier du nom sous GNU/Linux</title><link href="https://florent.peterschmitt.fr/portal-premier-du-nom-sous-gnu-linux.html" rel="alternate"/><published>2013-05-10T19:38:00+02:00</published><updated>2013-05-10T19:38:00+02:00</updated><author><name>Florent Peterschmitt</name></author><id>tag:florent.peterschmitt.fr,2013-05-10:/portal-premier-du-nom-sous-gnu-linux.html</id><summary type="html"/><content type="html">&lt;p&gt;Ça marche bien, quelques freeze habituels avec les jeux Valve sous Linux (liés à ma carte graphique Intel HD3000 sans doute) mais… un nouveau joueur verrait ses parties gâchées par quelques glitchs. Voyez plutôt :&lt;/p&gt;
&lt;p&gt;&lt;a href="/static/images/portal_opengl/portal_1.png"&gt;&lt;img alt="portal 1" src="/static/images/portal_opengl/portal_1.png"&gt;&lt;/a&gt;
&lt;a href="/static/images/portal_opengl/portal_2.png"&gt;&lt;img alt="portal 2" src="/static/images/portal_opengl/portal_2.png"&gt;&lt;/a&gt;
&lt;a href="/static/images/portal_opengl/portal_3.png"&gt;&lt;img alt="portal 3" src="/static/images/portal_opengl/portal_3.png"&gt;&lt;/a&gt;
&lt;a href="/static/images/portal_opengl/portal_4.png"&gt;&lt;img alt="portal 4" src="/static/images/portal_opengl/portal_4.png"&gt;&lt;/a&gt;&lt;/p&gt;</content><category term="Informatique"/><category term="jeux"/><category term="linux"/></entry><entry><title>L'IPv6 sur FreeBSD 9-STABLE</title><link href="https://florent.peterschmitt.fr/l-ipv6-sur-freebsd-9-stable.html" rel="alternate"/><published>2013-05-09T20:19:00+02:00</published><updated>2013-05-09T20:19:00+02:00</updated><author><name>Florent Peterschmitt</name></author><id>tag:florent.peterschmitt.fr,2013-05-09:/l-ipv6-sur-freebsd-9-stable.html</id><summary type="html"/><content type="html">&lt;p&gt;Les variables ipv6_enable et ipv6_prefer sont &lt;em&gt;dépréciées&lt;/em&gt; sur FreeBSD 9.1-RELEASE et encore plus sur 9-STABLE, et après un long moment à me demander pourquoi le serveur perdait sa route par défaut, qui en plus était mauvaise, un peut de &lt;em&gt;man rc.conf&lt;/em&gt; et j'ai fini par trouver comment bien faire.&lt;/p&gt;
&lt;p&gt;Un prérequis pour toutes les confs :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;ipv6_activate_all_interfaces&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;yes&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# pour activer l&amp;#39;ipv6 sur toutes les interfaces&lt;/span&gt;
&lt;span class="nv"&gt;ipv6_network_interfaces&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;em0&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# em0 pour l&amp;#39;interface sur laquelle on souhaite activer l&amp;#39;ipv6 si on en veut pas partout&lt;/span&gt;
&lt;span class="nv"&gt;ip6addrctl_policy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ipv6_prefer&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Configuration statique :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;ifconfig_em0_ipv6&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;inet6 abcd:ef01:2345:6789::1 prefixlen 64&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;ipv6_defaultrouter&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;abcd:ef01:2345:6789:ff:ff:ff:ff&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Configuration automatique :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;ifconfig_em0_ipv6&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;inet6 accept_rtadv&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Une définition d'alias sur une interface :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;ifconfig_em0_alias0&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;inet6 2001:41d0:8:b81f::2 prefixlen 128&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Exécuter le script /etc/netstart pour que la configuration soit prise en compte sans redémarrage. Attention à ne pas se tromper, ça pourrait bien couper la connexion SSH :)&lt;/p&gt;</content><category term="Informatique"/><category term="freebsd"/><category term="ipv6"/><category term="conf"/></entry><entry><title>Xen et le QuelquechoseBridge d'Intel</title><link href="https://florent.peterschmitt.fr/gentoo-xen-sandybridge.html" rel="alternate"/><published>2013-03-22T22:55:00+01:00</published><updated>2013-03-22T22:55:00+01:00</updated><author><name>Florent Peterschmitt</name></author><id>tag:florent.peterschmitt.fr,2013-03-22:/gentoo-xen-sandybridge.html</id><summary type="html"/><content type="html">&lt;p&gt;Pour le projet tuteuré de cette année de licence pro Administration de Systèmes, Réseaux et Applications à base de Logiciels Libres, nous sommes trois à travailler sur la virtualisation. J'ai une Gentoo comme machine personnelle et un SandyBridge en guise de processeur/carte graphique, ainsi qu'une nVidia collée aux fesses de la carte Intel embarquée dans le processeur.&lt;/p&gt;
&lt;h2&gt;Le sujet&lt;/h2&gt;
&lt;p&gt;La carte nVidia n'est &lt;em&gt;pas&lt;/em&gt; une carte dédiée, pour l'utiliser il faut lui demander de calculer un rendu, qui sera donné à la carte Intel qui refilera ensuite l'image à l'écran (pour simplifier). Cette carte nVidia, quand bien même inactive, consomme masse d'énergie pour rien sous Linux. Il existe un module permettant de la désactiver, faisant partie du projet &lt;a href="http://bumblebee-project.org/"&gt;bumblebee&lt;/a&gt;. Ce module s'appelle &lt;a href="https://github.com/Bumblebee-Project/bbswitch"&gt;bbswitch&lt;/a&gt;. Vous le chargez, un :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;OFF&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;/proc/acpi/bbswitch
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;et voilà que la carte est désactivée, votre ordinateur retrouvant sa sérénité.&lt;/p&gt;
&lt;h2&gt;Le problème&lt;/h2&gt;
&lt;p&gt;Le dæmon &lt;a href="http://wiki.xensource.com/xenwiki/XendInternals"&gt;xend&lt;/a&gt; ne semble pas aimer cette extinction forcée et voici ce qu'on peut trouver dans les logs :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="go"&gt;PciDeviceParseError: Looped capability chain: 0000:01:00.0&lt;/span&gt;
&lt;span class="go"&gt;[2013-03-22 22:54:17 8579] INFO (SrvDaemon:227) Xend stopped due to signal 15.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;0000:01:00.0 correspond à l'adresse PCI de la carte nVidia. Visiblement, xend tente d'en tirer des informations et il semblerait que la désactivation de la carte soit à l'origine de ce problème.&lt;/p&gt;
&lt;h2&gt;Solution ou « workaround »&lt;/h2&gt;
&lt;p&gt;Fort simple, il ne faut pas désactiver la carte avant le démarrage de xend. Le chargement du module ne gêne aucunement. Il est possible de désactiver à nouveau la carte &lt;em&gt;après&lt;/em&gt; le démarrage de xend, pour le plus grand bonheur de tous ceux ayant une carte aussi moisie que celle-ci.&lt;/p&gt;
&lt;h2&gt;Persistance&lt;/h2&gt;
&lt;p&gt;Dans /etc/modprobe.d/bbswitch.conf :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="go"&gt;options bbswitch load_state=0 unload_state=1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Cela permet de charger de module en lui disant de désactiver la carte au chargement, et de la réactiver au déchargement.
Il faut aussi mettre dans le fichiers /etc/modules-load.d/bbswitch.conf :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="go"&gt;bbswitch&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Bon et bien entendu, peu importe le nom du fichier, il faut juste qu'il porte l'extention .conf.&lt;/p&gt;</content><category term="Informatique"/><category term="xen"/><category term="virtualisation"/><category term="intel"/></entry><entry><title>Apache mod_proxy</title><link href="https://florent.peterschmitt.fr/apache-mod-proxy-securite.html" rel="alternate"/><published>2013-03-09T00:17:00+01:00</published><updated>2013-03-09T00:17:00+01:00</updated><author><name>Florent Peterschmitt</name></author><id>tag:florent.peterschmitt.fr,2013-03-09:/apache-mod-proxy-securite.html</id><summary type="html"/><content type="html">&lt;h2&gt;mod_proxy pour les nuls&lt;/h2&gt;
&lt;p&gt;J'utilise le module mod_proxy d'Apache pour « proxyfier » une application web &lt;em&gt;standalone&lt;/em&gt; et qui écoute sur un port donné par défaut et ne dispose pas du ssl.&lt;/p&gt;
&lt;p&gt;Comme je souhaite que l'application ne soit pas directement accessible ainsi qu'un accès ssl, je passe donc par un proxy Apache :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;ProxyRequests&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;On&lt;/span&gt;
&lt;span class="nb"&gt;ProxyPreserveHost&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;Off&lt;/span&gt;
&lt;span class="nb"&gt;ProxyPass&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sx"&gt;/truc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;http://127.0.0.1:1234
&lt;span class="nb"&gt;ProxyPassReverse&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sx"&gt;/truc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;http://127.0.0.1:1234
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Oui mais&lt;/h2&gt;
&lt;p&gt;Oui mais voilà, si on ne prend pas garde à ce qu'on fait (comme moi) on se retrouve très vite avec des logs du genre :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="go"&gt;216.244.93.124 - - [09/Mar/2013:00:24:34 +0100] &amp;quot;GET http://ib.adnxs.com/tt?id=1074619&amp;amp;size=300x250 HTTP/1.0&amp;quot; 200 251 &amp;quot;http://freddyo.com/photos-rihanna-vacations-in-itty-bitty-tiny-bikini/photos/&amp;quot; &amp;quot;Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; Alexa Toolbar)&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Que se passe-t-il ici ?&lt;/p&gt;
&lt;p&gt;Eh bien on essaye tout simplement de se connecter à un autre site en se faisant passer pour le serveur ayant reçu la requête, c'est à dire nous-même. Outre le fait que Rihanna en bikini, &lt;a href="http://www.dico-des-mots.com/definitions/je-men-tamponne-loreille-avec-une-babouche.html"&gt;je m'en tamponne l'oreille avec une babouche&lt;/a&gt;, c'est parfaitement dangereux pour vous et très mauvais pour Internet.&lt;/p&gt;
&lt;h2&gt;Comment savoir ?&lt;/h2&gt;
&lt;p&gt;Comment pouvez-vous savoir si votre serveur est un « open relay » ?&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;telnet&lt;span class="w"&gt; &lt;/span&gt;monserveur.fr&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;80&lt;/span&gt;
&lt;span class="gp"&gt;$ &lt;/span&gt;GET&lt;span class="w"&gt; &lt;/span&gt;http://www.google.fr/&lt;span class="w"&gt; &lt;/span&gt;HTTP/1.1
&lt;span class="gp"&gt;$ &lt;/span&gt;Host:&lt;span class="w"&gt; &lt;/span&gt;www.google.fr
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Si la totalité du site vous revient, c'est que vous avez un joli serveur docile à toutes les demandes. Dans le cas contraire, je ne vois pas pourquoi vous lisez cet article ;-)&lt;/p&gt;
&lt;h2&gt;Solution&lt;/h2&gt;
&lt;p&gt;Elle est toute simple. Il suffit de ne pas autoriser tout le monde à utiliser votre proxy :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;Proxy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;Order&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;deny,allow
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;Deny&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;from&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;all&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/Proxy&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;On peut bien entendu affiner avec une authentification ou une liste d'IP, un sous-réseau…&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;Proxy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;http://127.0.0.1:1234&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;Order&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;deny,allow
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;Require&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ip&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1.2.3.4&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/Proxy&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Dans ces deux cas, un client non autorisé aura une réponse 403&lt;/p&gt;
&lt;p&gt;Mieux encore, si vous n'utilisez mod_proxy qu'en interne, c'est à dire que seul le serveur fera des requêtes et pas les clients, légitimes ou pas :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;ProxyRequests&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;Off&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Et là c'est un 404 qui sera répondu.&lt;/p&gt;
&lt;p&gt;À bon entendeur, salut !&lt;/p&gt;
&lt;p&gt;Source : &lt;a href="httpd.apache.org/docs/2.2/fr/mod/mod_proxy.html"&gt;doc apache&lt;/a&gt;&lt;/p&gt;</content><category term="Informatique"/><category term="mod_proxy"/><category term="apache"/></entry><entry><title>ZFS - FreeBSD 9.0-RELEASE - MAJ : 9.1</title><link href="https://florent.peterschmitt.fr/zfs-freebsd-9-0-release.html" rel="alternate"/><published>2013-02-19T13:18:00+01:00</published><updated>2013-02-19T13:18:00+01:00</updated><author><name>Florent Peterschmitt</name></author><id>tag:florent.peterschmitt.fr,2013-02-19:/zfs-freebsd-9-0-release.html</id><summary type="html"/><content type="html">&lt;p&gt;Il se peut que l'article ne soit pas très clair. J'étais jeune et si vous me le demandez (on sait jamais), je pourrai le clarifier plus tôt que prévu :)&lt;/p&gt;
&lt;p&gt;UFS, c'est bien beau, mais c'est vieux et ça ne permet plus de faire ce qu'on veut. Ce système de fichier antique, hérité de 4.2BSD ne correspond plus à ce qu'on peut attendre d'un système de fichier aujourd'hui, à savoir la prise en charge native des volumes logiques, des quotas, de la compression à la volée et j'en passe. En plus, UFS est poussif. ZFS est maintenant supporté sous FreeBSD, depuis sa version 6, et je souhaite vous faire partager mon installation de FreeBSD sur un disque ZFS. La prouesse n'a rien d'original car on trouve facilement de la documentation partout sur internet, mais pour ceux qui ne veulent pas formater tout leur disque pour avoir une unique partition gpart (geom), cela pose problème. Dans un premier temps, je vous expliquerai le script original trouvé sur internet, puis la modification que j'y ai apporté pour pouvoir utiliser ZFS, en tout cas partiellement, afin de palier (plus ou moins salement) à l'impossibilité pour gpart de faire une partition GPT sur ada0s1 quand ada0 est en MBR.&lt;/p&gt;
&lt;h1&gt;Commencer une installation à partir de zéro&lt;/h1&gt;
&lt;p&gt;Attention, cette méthode n'est adaptée que si vous êtes prêt à effacer votre disque dur tout entier. Lisez quand même à titre informatif, car une bonne partie des informations présentes ici ne seront pas répétées dans l'autre méthode. Lancez votre installateur de FreeBSD, faites comme si vous vouliez faire une installation classique, mais sortez de là quand il vous propose de partitionner vos disque, puisque nous allons le faire nous-même. Entrez dans le shell. et chargez le module zfs.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;kldload&lt;span class="w"&gt; &lt;/span&gt;zfs
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h1&gt;Script original&lt;/h1&gt;
&lt;p&gt;Voici la marche à suivre qu'on peut trouver sur une vidéo Youtube (lien plus bas), ou même sur la documentation en ligne. Pour simplifier, tout ce qui existe sur notre disque (ada0) est détruit, puis on créer une partition GPT avec gpart, dans laquelle on va y mettre une partition freebsd-boot de quelques Kio, un SWAP (de la taille que vous voulez) et enfin tout le reste sera alloué à ZFS. En effet, comme ZFS supporte la gestion des volumes logiques de façon native (et que c'est même la meilleure façon de faire ses disques), nul besoin de séparer les points de montage. Sauf s'il y a une raison particulière, comme changer quelques points de montage sur un autre disque physique. La séparation de partitions sur un même disque dur ne présente, à mon avis, plus d'intérêt face aux volumes logiques qui sont bien plus souples. Sauf dans le cas où on va se servir d'un espace d'échange entre deux OS et qu'on ne voudrait pas que notre partition soit corrompue. La partition ZFS aura un label nommé FBSD-ZROOT, ce qui est optionnel, mais je vous le conseil pour la suite. La mini partition de démarrage, freebsd-boot, est remplie de zéros, parce que nous allons y écrire un code qui fait moins que la taille de cette partition, et par mesure de précaution, il est préférable de tout effacer. A proprement parler, on sort dd est on y écrit nos zeros, ensuite avec gpart on inscrit notre « bootcode ». Maintenant que l'espace est alloué, que la partition de démarrage est écrite, tout le reste doit être écrit, mais sur du ZFS. C'est là que zpool entre en jeu, puis zfs :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;zpool&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;-&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;créer&lt;span class="w"&gt; &lt;/span&gt;un&lt;span class="w"&gt; &lt;/span&gt;«&lt;span class="w"&gt; &lt;/span&gt;disque&lt;span class="w"&gt; &lt;/span&gt;»&lt;span class="w"&gt; &lt;/span&gt;ZFS
$&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt;  &lt;/span&gt;-&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;préciser&lt;span class="w"&gt; &lt;/span&gt;sur&lt;span class="w"&gt; &lt;/span&gt;quel&lt;span class="w"&gt; &lt;/span&gt;périphérique
$&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;none&lt;span class="w"&gt; &lt;/span&gt;-&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;pas&lt;span class="w"&gt; &lt;/span&gt;de&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;mountpoint&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;pour&lt;span class="w"&gt; &lt;/span&gt;l&lt;span class="s1"&gt;&amp;#39;instant&lt;/span&gt;
&lt;span class="s1"&gt;$ -o altroot=/mnt -&amp;gt; on met notre pool sur /mnt, là où l&amp;#39;&lt;/span&gt;installation&lt;span class="w"&gt; &lt;/span&gt;sera&lt;span class="w"&gt; &lt;/span&gt;faite
$&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cachefile&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/tmp/zpool.cache&lt;span class="w"&gt; &lt;/span&gt;-&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Le&lt;span class="w"&gt; &lt;/span&gt;fichier&lt;span class="w"&gt; &lt;/span&gt;de&lt;span class="w"&gt; &lt;/span&gt;cache&lt;span class="w"&gt; &lt;/span&gt;des&lt;span class="w"&gt; &lt;/span&gt;pool&lt;span class="w"&gt; &lt;/span&gt;ne&lt;span class="w"&gt; &lt;/span&gt;s&lt;span class="s1"&gt;&amp;#39;installera pas où il voudra, au moins on est sûr de trouver le bon&lt;/span&gt;
&lt;span class="s1"&gt;$ tank -&amp;gt; donnez le nom que vous voulez, mais à chaque fois que vous verrez &amp;quot;tank&amp;quot;, remplacez par celui que vous avez donné. Il s&amp;#39;&lt;/span&gt;agit&lt;span class="w"&gt; &lt;/span&gt;du&lt;span class="w"&gt; &lt;/span&gt;nom&lt;span class="w"&gt; &lt;/span&gt;de&lt;span class="w"&gt; &lt;/span&gt;notre&lt;span class="w"&gt; &lt;/span&gt;pool
$&lt;span class="w"&gt; &lt;/span&gt;gpt/FBSD-ZROOT&lt;span class="w"&gt; &lt;/span&gt;-&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;vous&lt;span class="w"&gt; &lt;/span&gt;vous&lt;span class="w"&gt; &lt;/span&gt;souvenez,&lt;span class="w"&gt; &lt;/span&gt;le&lt;span class="w"&gt; &lt;/span&gt;label&lt;span class="w"&gt; &lt;/span&gt;?&lt;span class="w"&gt; &lt;/span&gt;Cette&lt;span class="w"&gt; &lt;/span&gt;donnée&lt;span class="w"&gt; &lt;/span&gt;sert&lt;span class="w"&gt; &lt;/span&gt;à&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;Une&lt;span class="w"&gt; &lt;/span&gt;fois&lt;span class="w"&gt; &lt;/span&gt;ceci&lt;span class="w"&gt; &lt;/span&gt;fait,&lt;span class="w"&gt; &lt;/span&gt;créons&lt;span class="w"&gt; &lt;/span&gt;alors&lt;span class="w"&gt; &lt;/span&gt;nos&lt;span class="w"&gt; &lt;/span&gt;volumes&lt;span class="w"&gt; &lt;/span&gt;logiques&lt;span class="w"&gt; &lt;/span&gt;à&lt;span class="w"&gt; &lt;/span&gt;l&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;intérieur&lt;span class="w"&gt; &lt;/span&gt;de&lt;span class="w"&gt; &lt;/span&gt;notre&lt;span class="w"&gt; &lt;/span&gt;pool
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Une pool (ne pond pas d’œuf ici) s'apparente à un disque physique, et nos volumes logiques à des partitions physiques. Sauf qu'ici, et c'est là tout l'intérêt, c'est que c'est virtuel. Bienvenu dans la matrize. Je pense que vous allez comprendre ce qu'il se passe, et je ne vous expliquerai pas que zfs create -o mountpoint=/truc tank/trucmuch créer un volume logique dans notre pool tank avec le nom trucmuch, à sa racine, et que le tout sera monté sur /truc de notre partition racine. Vala vala. Z'êtes contents ? Bon bah, c'est pas tout, mais il faut dire où on va démarrer ! zpool set bootfs=tank/root tank, c'est pas sorcier ! Voilà toutes les commandes :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;gpart&lt;span class="w"&gt; &lt;/span&gt;destroy&lt;span class="w"&gt; &lt;/span&gt;ada0
$&lt;span class="w"&gt; &lt;/span&gt;gpart&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;-s&lt;span class="w"&gt; &lt;/span&gt;gpt&lt;span class="w"&gt; &lt;/span&gt;ada0
$&lt;span class="w"&gt; &lt;/span&gt;gpart&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;freebsd-boot&lt;span class="w"&gt; &lt;/span&gt;-s&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;128&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ada0
$&lt;span class="w"&gt; &lt;/span&gt;gpart&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;freebsd-swap&lt;span class="w"&gt; &lt;/span&gt;-s&lt;span class="w"&gt; &lt;/span&gt;4G&lt;span class="w"&gt; &lt;/span&gt;ada0
$&lt;span class="w"&gt; &lt;/span&gt;gpart&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;freebsd-zfs&lt;span class="w"&gt; &lt;/span&gt;-l&lt;span class="w"&gt; &lt;/span&gt;FBSD-ZROOT&lt;span class="w"&gt; &lt;/span&gt;ada0
$&lt;span class="w"&gt; &lt;/span&gt;dd&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/zero&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;of&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/ada0p1&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;560&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;bs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;512&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;gpart&lt;span class="w"&gt; &lt;/span&gt;bootcode&lt;span class="w"&gt; &lt;/span&gt;-b&lt;span class="w"&gt; &lt;/span&gt;/boot/pmbr&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;/boot/gptzfsboot&lt;span class="w"&gt; &lt;/span&gt;-i&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ada0
$&lt;span class="w"&gt; &lt;/span&gt;zpool&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;none&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;altroot&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/mnt&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cachefile&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/tmp/zpool.cache&lt;span class="w"&gt; &lt;/span&gt;tank&lt;span class="w"&gt; &lt;/span&gt;gpt/FBSD-ZROOT&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;#si vous ne mettez pas de label à la commande précédente, utilisez /dev/ada0p3 pour indiquer la partition ZFS.&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;zfs&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;atime&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;off&lt;span class="w"&gt; &lt;/span&gt;tank&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# qui s&amp;#39;inquiète de l&amp;#39;accès temporel aux fichiers ? Pas moi en tout cas. Attention, ceci fera que tous les volumes dépendants de tank héritent de cette propriété&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;zfs&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mountpoint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/&lt;span class="w"&gt; &lt;/span&gt;tank/root&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;#obligatoire, le reste peut se faire selon votre convenance.&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;zfs&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mountpoint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr&lt;span class="w"&gt; &lt;/span&gt;tank/root/usr
$&lt;span class="w"&gt; &lt;/span&gt;zfs&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mountpoint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/var&lt;span class="w"&gt; &lt;/span&gt;tank/root/var
$&lt;span class="w"&gt; &lt;/span&gt;zfs&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mountpoint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/tmp&lt;span class="w"&gt; &lt;/span&gt;tank/root/tmp
$&lt;span class="w"&gt; &lt;/span&gt;zfs&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mountpoint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/local&lt;span class="w"&gt; &lt;/span&gt;tank/root/usr/local
$&lt;span class="w"&gt; &lt;/span&gt;zfs&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mountpoint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/ports&lt;span class="w"&gt; &lt;/span&gt;tank/root/ports&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;#très facultatif. Vous pouvez aussi mettre /usr/src.&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;zfs&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mountpoint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/home&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;atime&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;off&lt;span class="w"&gt; &lt;/span&gt;tank/root/usr/home
$&lt;span class="w"&gt; &lt;/span&gt;zpool&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;bootfs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;tank/root&lt;span class="w"&gt; &lt;/span&gt;tank
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Quittez le shell, vous reviendrez au processus d'installation qui va extraire les paquets. Faites ce qu'il vous demande de faire par la suite (mot de passe root, etc.), ne discutez pas et admirez. Mais SURTOUT, ne redémarrez PAS. Ca n'est pas finit, et il vous faut encore paramétrer votre installation toute fraîche pour qu'il comprenne que, oui, vous êtes un bon et donc vous utilisez ZFS. Comme on va tout mettre sur notre partition ZFS, il ne reste que notre SWAP à monter, car ça ne se met pas sur du ZFS. Sortez de l'installateur, et quand il vous demande si vous voulez configurer manuellement votre système, répondez Oui.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/dev/ada0p2 none swap sw 0 0&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;/etc/fstab
$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;zfs_enable=&amp;quot;YES&amp;quot;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;/etc/rc.conf
$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;opensolaris_load=&amp;quot;YES&amp;quot;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;/boot/loader.conf
$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;zfs_load=&amp;quot;YES&amp;quot;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;/boot/loader.conf
$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;vfs.root.mountfrom=&amp;quot;zfs:tank/root&amp;quot;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;/boot/loader.conf
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Le "vfs.root.mountfrom...blablabla", vous comprendrez qu'on indique clairement qu'on veut que notre partition racine soit tank/root, et que notre très aimé noyau FreeBSD trouvera son bonheur là dedans.
Sortez du chroot et choisissez enfin le mode Live CD proposé. Ensuite, on « déconnecte » notre pool (comme quoi, les poules pondeuses automatiques, ça n'est pas pour dans longtemps) pour pouvoir y copier proprement notre cache de pool. Vous sentez venir la blague foireuse ? Quand les poules jouent à cache cache sur la route, gare aux tanks. Bon et enfin on copie notre cache de pool là où il va être utilisé dans notre système installé. A savoir, /boot/zfs, ce qui devient /mnt/boot/zfs dans le cas présent.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;zpool&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;tank
$&lt;span class="w"&gt; &lt;/span&gt;zpool&lt;span class="w"&gt; &lt;/span&gt;import&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;altroot&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/mnt&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cachefile&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/tmp/zpool.cache&lt;span class="w"&gt; &lt;/span&gt;tank
$&lt;span class="w"&gt; &lt;/span&gt;cp&lt;span class="w"&gt; &lt;/span&gt;/tmp/zpool.cache&lt;span class="w"&gt; &lt;/span&gt;/mnt/boot/zfs/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Redémarrez, c'est prêt !&lt;/p&gt;
&lt;h1&gt;Installation partielle UFS/ZFS, pour ceux qui en ont gros sur le disque dur&lt;/h1&gt;
&lt;p&gt;Voilà voilà, Windows 7, un Linux (inutile de dire lequel, tous les six mois ça change. Ok, OpenSUSE, Mandriva, ArchLinux, Debian, Ubuntu, Fedora, dans différentes versions. Je crois que c'est tout pour le moment), ben ça ne colle pas avec gpart, qui veut tout. Tout. Donc un disque entier. Et ça ne fonctionne pas si on lui demander de faire son nid sur un ada0sX par exemple, non. Bref, passons à l'action, il n'y en a plus pour longtemps. Allez, c'est tipar ! Lancez donc toujours l'installateur de FreeBSD, allez jusqu'à partitionnement (et partitionnez cette fois) pour arriver à cela :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;-&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;ada0sX&lt;span class="w"&gt; &lt;/span&gt;BSD
-&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;ada0sXa&lt;span class="w"&gt; &lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;freebsd-ufs,&lt;span class="w"&gt; &lt;/span&gt;minimum&lt;span class="w"&gt; &lt;/span&gt;4Go&lt;span class="w"&gt; &lt;/span&gt;si&lt;span class="w"&gt; &lt;/span&gt;vous&lt;span class="w"&gt; &lt;/span&gt;choisissez&lt;span class="w"&gt; &lt;/span&gt;l&lt;span class="s1"&gt;&amp;#39;option sécurité, sinon 2G. mountpoint : /&lt;/span&gt;
&lt;span class="s1"&gt;-&amp;gt; ada0sXb : freebsd-swap&lt;/span&gt;
&lt;span class="s1"&gt;-&amp;gt; ada0sXc : freebsd-zfs, pas de point de montage. Prenez tout l&amp;#39;&lt;/span&gt;espace&lt;span class="w"&gt; &lt;/span&gt;disque&lt;span class="w"&gt; &lt;/span&gt;restant.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Concernant ce que j'appelle « l'option sécurité », il s'agit d'installer les sources sur cette partition UFS. Vous allez voir que, si vous vous bricolez un noyau personnalisé, le jour où vous oublierez ZFS ou un module dépendant, vous serez vraiment HEUREUX d'avoir les sources à disposition, ainsi que le compilateur et tout le tralala ! Finish him ! Quand il vous proposer de vous mettre en chroot (manual configuration) dans le système, allez-y, les modifications seront bien plus facile à faire et il n'y aura pas de transfert de cache et ainsi de suite. Chargez le module zfs, et nous voilà prêts. Bien, maintenant, créez une pool sur ada0sXc (&amp;lt;- adaptez les numéros et les lettres bien entendu) que vous nommerez par exemple... TheRoot. Comprendra qui pourra. C'est connu pourtant. Sans rire, nous allons la nommer tank, c'est plus simple à écrire.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;zpool&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;tank&lt;span class="w"&gt; &lt;/span&gt;/dev/ada0sXc
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Avant de vous jeter sur zfs create -o mountpoint=/truc tank/truc, dites vous bien que si vous essayez de faire zfs create -o mountpoint=/ tank/root, vous allez droit dans le mur ! De même que si vous essayez de monter un quelconque dossier du système de base comme /bin, /usr/bin ou /sbin, /usr/sbin dans votre tank. Le montage étant immédiat, d'une vous ne pourrez plus rien faire de votre chroot, et au prochain redémarrage vous vous apercevrez bien vite que vous pourrez recommencer l'installation. Donc nous allons tricher en ne montant que le nécessaire et en jouant, un peu forcé, la carté sécurité (vous vous souvenez, laisser le système de base sur un disque USF prit en charge par le noyau sans oubli de module et tout et tout). Faites donc un peu cela, par exemple :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;zfs&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;atime&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;off&lt;span class="w"&gt; &lt;/span&gt;tank
$&lt;span class="w"&gt; &lt;/span&gt;zfs&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mountpoint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/var&lt;span class="w"&gt; &lt;/span&gt;tank/var&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# attention à cela tout de même, si ZFS n&amp;#39;est pas chargé à un moment donné, vous risquez de perdre des informations en remontant le volume ZFS.&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;zfs&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mountpoint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/tmp&lt;span class="w"&gt; &lt;/span&gt;tank/tmp
$&lt;span class="w"&gt; &lt;/span&gt;zfs&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mountpoint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/local&lt;span class="w"&gt; &lt;/span&gt;tank/usr.local
$&lt;span class="w"&gt; &lt;/span&gt;zfs&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mountpoint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/home&lt;span class="w"&gt; &lt;/span&gt;tank/usr.home
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Vous pouvez aussi séparer vos ports :&lt;/p&gt;
&lt;p&gt;$ zfs create -o mountpoint=/usr/ports tank/usr.ports&lt;/p&gt;
&lt;p&gt;Et tout ce que vous voudrez, mais PAS le système de base. Point important : vous ne pouvez pas faire tank/usr/home car cela suppose d'avoir un volume tank/usr. Vous pouvez le faire, alors il ne vous faudra pas donner de point de montage. Dans le cas présent, je trouve plus judicieux de séparer /usr/local de /usr/home. Bien, maintenant n'oubliez pas d'éditer /boot/loader.conf, /etc/rc.conf et /etc/fstab comme suit :&lt;/p&gt;
&lt;p&gt;/boot/loader.conf :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# krpc_load=&amp;quot;YES&amp;quot; # je vous conseil d&amp;#39;ajouter &amp;quot;options KRPC&amp;quot; dans le fichier de configuration de votre noyau, car c&amp;#39;est une dépendance de ZFS.&lt;/span&gt;
&lt;span class="c1"&gt;# opensolaris_load=&amp;quot;YES&amp;quot; # ligne non nécessaire, mais au moins on est fixé. # zfs_load=&amp;quot;YES&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;/etc/rc.conf :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# zfs_enable=&amp;quot;YES&amp;quot; # cela autorise le montage automatique des volumes ZFS. Mieux vaut le mettre, non ?&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;/etc/fstab :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# /dev/ada0sXa /    ufs  rw,noatime 0 0 # ces deux lignes devraient être présentes. # /dev/ada0sXb none swap sw 0 0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Dans le cas où vous oubliez de modifier loader.conf et rc.conf, pas d'inquiétude, votre système de base étant sur de l'UFS, vous aurez tout le loisir d'effectuer la manipulation une fois le système démarré sans aucun problème, mais en mode mono-utilisateur pour garantir un accès minimum aux fichiers. Cependant, n'oubliez pas de le faire avant d'installer des ports, de créer des utilisateurs et ainsi de suite. Pensez aussi à faire un backup de /var (tar -cf /var.tar /var), pour le décompresser dans votre nouvelle partition logique ZFS tank/var correspondante (toujours dans l'hypothèse où vous avez oublié de modifier lesdits fichiers).
Mise à jour du système de base, déplacement des sources.
Maintenant vous vous posez la question de savoir comment mettre vous sources sur un volume ZFS tank/usr.src, sans pour autant délaisser votre bien aimé /usr/src sur UFS. Ben, en fait c'est simple :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;zfs&lt;span class="w"&gt; &lt;/span&gt;unmount&lt;span class="w"&gt; &lt;/span&gt;tank/usr.src,&lt;span class="w"&gt; &lt;/span&gt;et&lt;span class="w"&gt; &lt;/span&gt;voilà,&lt;span class="w"&gt; &lt;/span&gt;vous&lt;span class="w"&gt; &lt;/span&gt;avez&lt;span class="w"&gt; &lt;/span&gt;de&lt;span class="w"&gt; &lt;/span&gt;nouveau&lt;span class="w"&gt; &lt;/span&gt;accès&lt;span class="w"&gt; &lt;/span&gt;à&lt;span class="w"&gt; &lt;/span&gt;/usr/src.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Et comment accéder de nouveau à tank/usr.src ? Devinez.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;zfs&lt;span class="w"&gt; &lt;/span&gt;mount&lt;span class="w"&gt; &lt;/span&gt;tank/usr.src
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Pour la mise à jour de votre système de base, faites comme d'habitude, mais veillez à ce que les deux emplacements (tank/usr.src et /usr/src) soient en synchronisme. Si vous ne voulez pas télécharger toutes les sources sur la partition UFS, mettez au moins src-sys, src-contrib, src-crypto et src-base (pas dans l'ordre, mais ce n'est pas grave). Dans contrib se trouve ZFS. Il serait donc intelligent de ne pas l'oublier.&lt;/p&gt;</content><category term="Informatique"/><category term="zfs"/><category term="freebsd"/></entry></feed>