philpep's blog - tag jails philpep's blog - tag jails rss http://blog.philpep.org fr Wed, 06 Jan 2010 20:11:03 GMT Pblog Upgrade FreeBSD 8.0 et jails http://blog.philpep.org/post/Upgrade-FreeBSD-8.0-et-jails http://blog.philpep.org/post/Upgrade-FreeBSD-8.0-et-jails Wed, 06 Jan 2010 20:11:03 GMT <p>J'ai upgradé ma FreeBSD (ce serveur) et ses 4 jails de FreeBSD 7.2-RELEASE vers FreeBSD 8.0-RELEASE, voilà donc le récit de ce qui est toujours une épopée.</p> <p>Dans un premier temps il faut récupérer les sources du système. J'ai fait ça à coup de <code>csup</code> depuis <code>cvsup1.fr.FreeBSD.org</code> (qui n'est autre que <code>cvsup.free.org</code>).</p> <div class="codehilite"><pre># cat /usr/local/etc/stable-supfile *default host=cvsup1.fr.FreeBSD.org *default base=/var/db *default prefix=/usr *default release=cvs tag=RELENG_8_0 *default delete use-rel-suffix *default compress src-all # csup /usr/local/etc/stable-supfile </pre></div> <p>Pendant ce temps au lieu de te tourner les pouces fais toi un <code>/etc/</code><a href="http://www.freebsd.org/cgi/man.cgi?query=src.conf">src.conf(5)</a> pour customiser un peu ce qu'on va compiler dans le world. Moi <a href="/post/Ssmtp-pour-remplacer-sendmail">je n'utilise plus sendmail</a>, authpf, bind (j'ai déjà un bind sur mon routeur), bluetooth, les jeux, IPfilter (j'utilise pf) ni zfs.</p> <div class="codehilite"><pre># cat /etc/src.conf WITHOUT_AUTHPF=YES WITHOUT_BIND=YES WITHOUT_BLUETOOTH=YES WITHOUT_GAMES=YES WITHOUT_IPFILTER=YES WITHOUT_SENDMAIL=YES WITHOUT_ZFS=YES </pre></div> <p>Quand <code>csup</code> à finit son boulot on peut lancer la compilation qui tue :</p> <div class="codehilite"><pre># cd /usr/src # make buildworld </pre></div> <p>Bois une grosse tasse de café et attend sagement en lisant <a href="http://www.freebsd.org/cgi/man.cgi?query=config">config(8)</a> et $EDITOR ta config kernel dans <code>/usr/src/sys/&lt;arch&gt;/conf/LAPIN</code>, sinon le kernel GENERIC marche bien hein :-).</p> <p>Une fois le buildworld terminé lance la compilation de ton kernel :</p> <div class="codehilite"><pre># cd /usr/src/ # make buildkernel KERNCONF=LAPIN </pre></div> <p>Pendant ce temps mettons à jours les jails. Moi j'arrête complètement les jails, je préfère un service injoignable qu'un service qui pourrait planter. Pour que le <a href="http://www.freebsd.org/cgi/man.cgi?query=mergemaster">mergemaster(1)</a> soit moins long j'ai mis quelques options dans <code>/root/.mergemasterrc</code>.</p> <div class="codehilite"><pre># cat /root/.mergemasterrc FREEBSD_ID=yes # /etc/rc.d/jail stop # cd /usr/src # make installworld DESTDIR=/path/to/jail # mergemaster -i -C -D /path/to/jail </pre></div> <p>Réponds aux questions de mergemaster, c'est long mais nécessaire, si ça te parait trop long rajoutes <code>-U</code> aux options de mergemaster.</p> <p>Refait la manip pour toutes tes jails. Enfin installe le nouveau kernel et reboot en <strong>Single user mode</strong>.</p> <div class="codehilite"><pre># cd /usr/src # make installkernel KERNCONF=LAPIN # shutdown -r now ## MAINTENANT EN SINGLE USER MODE ## # adjkerntz -i # mount -a -t ufs # mergemaster -p # cd /usr/src/ # make installworld # mergemaster -i -C # reboot </pre></div> <p>Nous voilà en FreeBSD 8.0-RELEASE-p1, maintenant il faut réinstaller tous les ports pour que les softs soient liés avec les libs de la 8.0. Alors là plusieurs méthodes possibles.</p> <ul> <li>Par compilation =&gt; portupgrade -a (va faire un tour sur google.com pour plus d'info sur les options crousti de portupgrade).</li> <li>En binaire, c'est ce que j'ai fait via un hack plus crade qu'un porno thaïlandais mais qui marche.</li> </ul> <p><strong>Attention lapin !</strong> , ce script va t'installer des packages avec les options de compilation par défaut des ports. Ça va enlever ton support PGSQL de dovecot et te rajouter toute la libx11 :-), à manipuler avec précaution donc.</p> <p>Mon petit script magique <code>pkg_reinstall</code>:</p> <div class="codehilite"><pre><span class="c">#!/bin/sh</span> <span class="c"># Force la réinstallation des</span> <span class="c"># packages pour la nouvelle release</span> <span class="c"># http://blog.philpep.org/post/Upgrade-FreeBSD-8.0-et-jails</span> <span class="c"># Je ne suis pas responsable de la casse éventuelle :-)</span> <span class="c"># Mirroir pour choper les packages voyez pkg_add(1)</span> <span class="c"># section ENVIRONEMENT.</span> <span class="nb">export </span><span class="nv">PACKAGEROOT</span><span class="o">=</span><span class="s2">&quot;ftp://ftp.fr.freebsd.org&quot;</span> <span class="c"># Liste des packages sur la machine</span> <span class="nv">PKG_LIST</span><span class="o">=</span><span class="sb">`</span>pkg_info | cut -d<span class="s1">&#39; &#39;</span> -f1<span class="sb">`</span> <span class="k">for </span>pkg in <span class="nv">$PKG_LIST</span> <span class="k">do</span> <span class="c"># On coupe la version du package</span> <span class="c"># et on force la réinstallation</span> pkg_add -rvF <span class="s2">&quot;${pkg%-*}&quot;</span> <span class="k">done</span> </pre></div> <p>Je lance donc mon script dans un shell de la jail (dont le JID m'est donné par <a href="http://www.freebsd.org/cgi/man.cgi?query=jls">jls(1))</a> :</p> <div class="codehilite"><pre># jexec 1 sh # sh /root/pkg_reinstall </pre></div> <p>Ensuite tu peux normalement supprimer les anciennes libs et anciens fichiers de ta vielle FreeBSD :</p> <div class="codehilite"><pre># cd /usr/src # yes | make delete-old DESTDIR=/path/to/jail # yes | make delete-old-libs DESTDIR=/path/to/jail </pre></div> <p>Tu peux faire pareil pour l'hote maintenant, un coup de <code>pkg_reinstall</code> et <code>yes | make delete-old(|-libs)</code> et te voilà en 8.0 avec un système super clean.</p> <h3>Bonus spécial pour toi lapin !</h3> <p>Personnellement j'aime bien rester avec mes packages de RELEASE, donc je met pratiquement jamais à jours. Par contre l'idée d'avoir des packages avec des failles de sécurité ça m'insupporte. Donc j'utilise le grand <code>portaudit</code> et si il trouve un package foireux je l'upgrade vers les build de STABLE (qui sont plus récents).</p> <div class="codehilite"><pre># export PACKAGEROOT=&quot;ftp://ftp.fr.freebsd.org&quot; # pkg_add -r portaudit # /usr/local/sbin/portautit -Fda Problem found with phplol see http://machintruc.com/64867/php/6764 </pre></div> <p>Et pour tous les packages faillibles :</p> <div class="codehilite"><pre># export PACKAGESITE=&quot;ftp://ftp.fr.freebsd.org/pub/FreeBSD/ports/i386/packages-8-stable/Latest/&quot; # pkg_add -rF phplol </pre></div> <p>Te voilà avec un système très nice nice qui te laissera dormir jusqu'au prochain local root voir même jusqu'à la prochaine release.</p>