jeudi 21 août 2014

News ResEl

Modification de la cotisation

Bonjour, suite au Conseil d'Administration du 17 Mars 2014, il a été voté l'augmentation de la cotisation à 25€ à partir de l'année scolaire 2014-2015.Cette augmentation va permettre le renouvellement du parc de switch et l'achat de nouveaux serveurs afin de proposer de nouveaux services et d'améliorer la qualité de ceux déjà existants. Alex, pour le ResEl

21/08/2014 à 22:00.

samedi 16 août 2014

Peck - Benoît Peccatte

Apache FTP like

Niveau :      
Résumé : alias / /%{username}

Aujourd'hui je voudrais faire un serveur web qui se comporterait comme un serveur FTP ou SFTP. Lorsqu'un utilisateur unix se connecte à un serveur FTP avec un login et un mot de passe, il lui est présenté un contenu qui lui est propre (son $HOME par exemple).

Comment faire l'équivalent avec apache ?

Dit autrement, je voudrais que les 2 commandes suivantes renvoient un contenu différent :

$ wget http://userA@www.monserveur.com/ # répertoire A
$ wget http://userB@www.monserveur.com/ # répertoire B

Pour cela il faut jouer avec les RewriteRules, mais c'est plus balaise que ça en a l'air.

Premièrement il faut une authentification. J'ai choisi ldap, mais prenez la méthode que vous préférez : http://httpd.apache.org/docs/2.2/mo... tout ce qui commence par mod_authn est valable. Voici comment on la met en place :

<Location />
        AuthType basic
        AuthName "My server"
        AuthBasicProvider ldap
        AuthLDAPURL ldap://serveur.ldap.com/dc=domaine,dc=com?uid?sub
        AuthLDAPBindDN cn=user,ou=technical,dc=domaine,dc=com
        AuthLDAPBindPassword password
        Require valid-user
</Location>

Ensuite on joue avec RewriteRule, les variables s'appellent sous la forme %{ENV:VARIABLE}

# utilisez %{ENV:USER_AUTH} pour ceux qui n'ont pas choisi l'authent LDAP
RewriteRule ^(.*) /%{ENV:AUTHENTICATE_uid}/$1

Mais ça ne marche pas. Tout d'abord on apprend qu'il faut mettre les règles dans le Location sinon les variables d'authentification ne sont pas disponibles. Ensuite on a oublié d'activer le rewrite engine. Et enfin dans un location (ou un directory) on ne matche plus la request uri mais le chemin créé à partir de cette uri. Cela qui une fois corrigé nous donne quelque chose comme ça :

<Location />
        RewriteEngine On
        # le résultat sera automatiquement préfixé par le DocumentRoot si on ne le fait pas nous même
        # notez l'absence du / initial dans le pattern ...
        RewriteRule ^var/www/html/(.*) /%{ENV:AUTHENTICATE_uid}/$1 
</Location>

Mais ça ne marche toujours pas. En effet, le rewrite engine d'apache est réentrant, quelle que soit la modification et quel que soit le flag utilisé, si une url est modifiée, apache fait une redirection interne et relance toute la machinerie (dont les redirections). Pour les petits malins, non [L] n'est pas fait pour ça, par contre la doc évoque un [END] qui aurait cette fonctionnalité mais je ne l'ai pas trouvé.

Il nous faut donc un moyen de détecter qu'une url a déjà été transformée par une RewriteRule. Malheureusement les variables (comme %{ENV:AUTHENTICATE_uid}) ne sont valables que dans la partie gauche de RewriteCond ou dans la partie droite de RewriteRule ce qui nous limite sévèrement. On ne peut pas matcher le chemin en pour détecter qu'il contient le répertoire de l'utilisateur. De plus on ne peut pas utiliser une autre racine, apache ajouterait automatiquement le DocumentRoot en cours.

J'ai essayé en utilisant des variables d'environnement temporaire (avec [E=VAR:VALUE]), mais le rewrite engine l'évalue trop tard et ne détecte pas la nouvelle valeur de la variable modifiée par lui-même.

Ma solution est donc de mettre en place un unique répertoire contenant les utilisateurs avec un nom improbable car il ne pourra pas être utilisé comme nom de répertoire dans les répertoires utilisateurs. Et d'utiliser ce nom de répertoire comme marqueur d'url déjà traitée. Ce qui nous donne :

        # mon répertoire s'appelle ____data____
        RewriteRule ^var/www/html/(?!____data____/)(.*) /____data____/%{ENV:AUTHENTICATE_uid}/$1

C'est bien joli, mais ça n'empercherait pas un utilisateur d'aller voir dans le répertorie de son voisin. En effet, ce ne sont que des rewrite rules, pas des droits d'accès. Puisqu'on ne peut pas utiliser les noms de répertoire utilisateur dans les require pour le matcher avec les nom d'utilisateur (on se mordrait la queue (et ça fait mal (au dos))). Il nous faut donc le garantir d'une autre façon, en forçant tout utilisateur a n'accéder qu'à son répertoire avec une autre règle.

        # ce qu'on veut c'est éviter l'utilisateur qui voudrait bypasser la première règle avec un http://www.monserveur.com/____data____/userX
        RewriteRule ^var/www/html/____data____/.*?/(.*) /var/www/html/____data____/%{ENV:AUTHENTICATE_uid}/$1
        # et on voudrait ausst éviter que l'utilisateur puisse scanner la racine
        RewriteRule ^var/www/html/____data____/?$ /var/www/html/____data____/%{ENV:AUTHENTICATE_uid}/

Notez l'ajout de /var/www/html dans les chaines de remplacement, c'est pour éviter qu'apache pense qu'on a modifié le chemin si on n'a rien changé.

Et c'est gagné, on a enfin trouvé !

Je vous laisse donc profiter du résultat :
Edit : la version finale minimise l'appel aux règles, prend en compte les chemins qui se terminent par / et les tentatives d'accès à des répertoires non autorisés.

<Location />
        AuthType basic
        AuthName "My server"
        AuthBasicProvider ldap
        AuthLDAPURL ldap://serveur.ldap.com/dc=domaine,dc=com?uid?sub
        AuthLDAPBindDN cn=user,ou=technical,dc=domaine,dc=com
        AuthLDAPBindPassword password
        Require valid-user

        # make http behave like ftp
        RewriteEngine On
        # create home dir var
        RewriteRule .* - [E=USER_ROOT:/var/www/html/____data____/%{ENV:AUTHENTICATE_homeDirectory}]
        RewriteCond %{ENV:USER_ROOT} !-d
        RewriteRule .* - [E=USER_ROOT:/var/www/html/forbidden]

        # redirection vers les repertpoires utilisateur
        RewriteCond %{REQUEST_FILENAME} !^/var/www/html/____data____
        RewriteRule ^var/www/html/(.*) %{ENV:USER_ROOT}/$1 [L,DPI]

        # impossibilite de lire la racine
        RewriteCond %{REQUEST_FILENAME} ^/var/www/html/____data____/?$
        RewriteRule .* %{ENV:USER_ROOT} [L,DPI]

        # impossibilite de lire le repertoire d'un autre
        RewriteCond %{ENV:AUTHENTICATE_homeDirectory}|%{REQUEST_FILENAME} !^(.*?)\|/var/www/html/____data____/\1
        RewriteRule ^var/www/html/____data____/?[^/]*/?(.*) %{ENV:USER_ROOT}/$1 [L,DPI]
</Location>

<Directory /var/www/html/forbidden>
        deny from all
</Directory>

Note : et pour ceux qui voudraient vraiment faire du FTP avec apache il y a mod_ftp.

Tags:, , ,

Par peck, le 16/08/2014 à 22:06.

mercredi 13 août 2014

Peck - Benoît Peccatte

J’ai pété

... désolé

Niveau :      

Résumé : gdisk /dev/sda

Le format GPT

Guid partition table est un format de partitionnement de disque.

Il ne faut pas confondre un format de partitionnement avec le formatage d'une partition avec système de fichier. Il y a de nombreux formats de système de fichier : ext4, swap, xfs ... Mais il n'existe que peu de format de partitionnement, les plus connus étant :

  • MBR : format utilisé par les premiers PC sous DOS et encore en usage sur la beaucoup de vos machines
  • disklabel : utilisé sur solaris et BSD
  • GPT : apparu récemment (il y a environ 15 ans) pour les besoins de l'itanium

Ce format a pour but de palier les différents problèmes de son prédécesseur direct le MBR :

  • stockage de la table en double et checksum du contenu : la table étant une structure très importante, on peut enfin se dire qu'on ne la perdra plus
  • stockage des offset en LBA sur 64 bits : on arrête de parler de CHS obsolètes depuis longtemps et on espère pouvoir tenir assez longtemps la croissance des tailles de disques : 9 milliards de téra octets avec des secteurs de 512 octets
  • on dépasse donc la limite des 2To supportés par le format MBR, si vous avez un disque de plus de 2Tio il est a peu près certain qu'il a déjà du GPT
  • tous les identifiants sont des UUID : garantis uniques, on peut en créer autant qu'on veut (2^128) et il y en a partout
  • la table fait au minimum 16kio : on n'a plus de question de table primaire/logique/étendue et on peut stocker au moins 128 partitions sans se poser de question
  • accessoirement on peut stocker des noms de partition directement dans la table

Attention, on stocke des adresses de secteur (LBA comme en MBR depuis un certain temps) et non d'octets, et la taille d'un secteur peut varier d'un disque à l'autre, il faut faire attention à ne pas copier les tables GPT trop littéralement.

GPT est indiqué comme nécessaire pour le support du boot sur EFI, bien qu'il soit théoriquement possible de faire sans.

Partitionner en GPT

Pour partitionner en GPT vous avez le choix entre deux familles d'outil :

  • parted et gparted
  • gdisk, sgdisk et cgdisk (remplaçants de la famille fdisk)

Le moins dangereux est de ne partitionner que vos nouveaux disques en GPT, mais il y a moyen de refaire la table de partition d'anciens disques s'il y a suffisament de place pour stocker la table GPT (16kio en début et en fin de disque plus le MBR). Si l'espace est disponible, c'est simple, il vous suffit de reporter les adresses de début et de fin de chaque partition du MBR vers le GPT.

Choix des partitions

Tout d'abord je vous recommande d'aligner vos partition sur 1Mio, le minimum recommandé étant de 4kio. Le minimum de 4ko s'explique par le fait que de plus en plus de disques ont des secteurs de 4ko, et si vos écritures ne sont pas alignées sur 4kio vous allez voir vos performances dégringoler.

Il faut ajouter que de plus en plus de disques sont des SSD. Les SSD ont des pages sur lesquelles il est aussi intéressant de se caler et elles peuvent aller jusqu'à 1Mio.

Donc ne vous posez plus la question et prenez la valeur par défaut de l'outil qui aligne sur le Mio.

  1. Si vous avez un boot sur EFI, vous devez faire une partition EFI (type ESP), ne soyez pas radin, mettez-y au moins 100Mo
  2. Si vous avez un boot sur un BIOS d'origine, il est conseillé de faire une partition de type bios. Certaines personnes indiquent que celle-ci est indispensable car GPT ne laisse pas de place caché pour le bootloader. C'est faux puisqu'il suffit d'aligner les partitions pour faire apparaître de la place. Mais puisqu'on en en est à faire des trucs propres, profitez-en pour faire ce qui aurait du être fait depuis très longtemps et faites de la place pour stocker un bon grub2 avec tous ses modules (1Mo)
  3. Si vous voulez permettre l'hibernation de votre machine (ou si vous avez peu de ram) n'oubliez pas d'inclure une partition de swap.
  4. Pensez à séparer système et données sur deux partitions différentes. La partition de données est naturellement /home pour une particulier, mais sur un serveur c'est plus flou : /var /srv /home sont des répertoire de données.

Compatibilité MBR

Dans la notion de MBR (un unique secteur de 512 octets) il faut différencier le code et la table des partitions.

Si vous utilisez un BIOS classique, le code du MBR restera le même (grub/lilo/boot windows ...).

Si vous utilisez EFI, le code du MBR peut être vide (ce que fait en général gdisk), mais il peut être intéressant de mettre un code fonctionnel avec un avertissement.

La table des partitions du MBR doit elle être protégée pour éviter à un outil d'édition de cette table de tenter d'y faire des modifications et d'effacer vos précieuses données. C'est pour cela qu'on y inscrit un "protective MBR" qui indique que le disque est entièrement utilisé par une partition unique de type GPT.

Tags:, , ,

Par peck, le 13/08/2014 à 21:30.

vendredi 24 janvier 2014

Peck - Benoît Peccatte

Passer une auditions

Niveau :      
Résumé :

Aucun tag pour cet article.

Par peck, le 24/01/2014 à 11:31.

mercredi 22 janvier 2014

Peck - Benoît Peccatte

Nouveautés ext4

Niveau :      
Résumé : stats

Howdy ho !

Savez-vous ce qu'il y a de nouveau dans ext4 ?

Tout le monde sait à peu près qu'il y a moyen de stocker plus de fichiers et des fichiers plus gros que dans ext3. Bon c'est gentil, mais quand on ne s'appelle pas google ou la NSA, stocker des fichiers de plus de 2To n'est pas vraiment notre priorité.

De plus l'usage des extents, qui permet ce genre de choses, a l'avantage de réduire la fragmentation. Bien.

Passons à des choses plus sympathiques, savez-vous que ext4 peut stocker la liste des blocs inutilisés ? Ça n'a l'air de rien, mais du coup la durée de fsck n'est plus proportionnelle à la taille du volume, mais à la quantité de données stockées ! Enfin une bonne nouvelle.

Ext4 supporte la méthode discard, c'est à dire l'indication au block device que certains blocs ne sont plus utilisés. Cette fonctionnalité est indispensable pour conserver les performances des SSD sur le long terme.

Parlons des dates maintenant. Le format de stockage des dates a changé, ce qui veut dire deux choses : on est maintenant Y2038 safe et on peut maintenant stocker des dates précises à la nanoseconde.

De plus il est possible de stocker une date supplémentaire : la date de création (crtime). Cette information était un gros manque pour les habitués du système de Microsoft. En effet, il est trop facile et fréquent de toucher aux fichiers et par là même mettre à jour les dates du fichier. La date de création elle est immuable et permet de savoir quand est apparu un fichier.

Des nouveaux timestamps !

Ceux-ci dépendent d'une nouvelle fonctionnalité d'ext4 : les inodes de 256 octets. On ne peut donc avoir les timestamps à la nanoseconde et la date de création que sur des systèmes de fichiers fraîchement créés et pas sur des systèmes upgradés depuis ext3 s'ils avaient été créés avec la taille par défaut.

Pour pouvoir les stocker, il faut passer l'option -I 256 à la création du système de fichier.

$ mkfs.ext4 -I 256 /dev/sdXY

Et pour les utiliser ?
Sachant qu'il s'agit de fonctionnalités d'un système de fichiers, il faut passer par le VFS pour les utiliser. Le problème c'est que le VFS n'avait pas prévu ce cas. Il y a donc de nombreuses modifications à faire avant de les voir arriver dans ls : modifier le VFS pour avoir une fonction permettant de récupérer ces données, modifier l'appel système stat, modifier la libc, modifier ls et ses amis pour qu'ils affichent l'information.

C'est trop bête, nous avons l'information sur le disque et nous n'y avons pas accès. Heureusement, si on est root, un disque ça se lit, il suffit juste de savoir où est l'info et d'aller la chercher.

Lire la date de création d'un fichier

Je rappelle que les autres dates directement disponibles avec stat sont : atime (dernier accès), mtime (dernière modification du contenu) et ctime (dernière modification de métadonnées).

On récupère l'inode du fichier

$ stat -c%i fichier

On récupère la partition sur laquelle est stockée le fichier

$ df fichier | awk 'NR==1 {next} {print $1; exit}'

Et enfin on lit les infos directement sur le disque avec debugfs (il faut être root)

$ debugfs -R "stat <$inode>" /dev/sdaX

Ce qui agrégé en une ligne de commande donne pour le fichier $file :

$ file=/bin/ls; debugfs -R "stat <$(stat -c%i "$file")>" $(df "$file" | awk 'NR==1 {next} {print $1; exit}')  | grep time
Tags:,

Par peck, le 22/01/2014 à 15:54.

lundi 13 janvier 2014

flo - Florent Fourcot

Résoudre les problèmes de mémoire sur les cartes mv643xx_eth

Les cartes réseaux mv643xx_eth c'est ce qui équipe des équipements comme les GuruPlug, les DreamPlugs, probablement les SheevaPlugs et d'autres équipements du même genre.

Malheureusement, ces cartes ont un problème de pilote dans le noyau Debian Wheezy. Le problème se déclare lors d'utilisation de paquets encapsulés (IPSec, GRE, 6to4, et plein d'autres trucs) avec un peu de charge réseau (1,5Mb/s suffit chez moi à poser des soucis). On obtient dans ce cas là une belle trace kernel commençant environ par :

swapper: page allocation failure: order:8, mode:0x20

Hormis ça, le reste semble marcher. On a de la perte de paquets (logique, celui qui déclenche la trace est détruit). Une analyse plus fine montre quand même que le Kernel prend une mémoire folle (plus de 80Mo de RAM pour un simple flux IPSec), et que le débit n'est idéal alors que la bande passante n'est pas saturé et le processeur loin surchargé... J'avais déjà enquêté sur le problème en août, mais je n'avais pas trouvé de solution. Le Kernel semblait allouer des pages contiguës énormes pour un simple paquet (on peut monter jusqu'à un order:10 si on défragmente la mémoire avant), sans aucun lien avec les ressources normalement nécessaires. J'avais tout de même réussi à isoler ce commit, mais par manque de temps et de piste j'avais abandonné (et j'avais configuré mon tunnel IPSec pour utiliser un autre serveur). Les joies d'utiliser du matériel un peu exotique, pour des utilisations très exotiques.

J'ai trouvé aujourd'hui un peu par hasard la solution, ici. Et il y a même le patch qui va bien. J'ai testé ce patch en l'appliquant sur mv643xx_eth.c uniquement, dans l'objectif de recompiler que le module. Et ça a marché :) Plus d'erreurs mémoire, un débit logique, plus d'utilisation incompréhensible de la RAM, tout va pour le mieux.

Et grand merci à Cyril pour son soutien pendant mes recherches en août. Et pour avoir résolu un autre problème très emmerdant sur un autre ordinateur.

Par flo, le 13/01/2014 à 14:31.

lundi 11 novembre 2013

News ResEl

Hommage

Bonjour, une petite news pour exprimer les condoléances du ResEl pour la mort de Cédric Blancher, alias Sid. Sid était un membre historique du ResEl entre 1997 et 2000, et un expert reconnu en sécurité informatique. Il est décédé dimanche dernier dans un accident de parachute, à l'âge de 37 ans. Toutes nos pensées vont vers ses proches. Arnaud, pour le ResEl

11/11/2013 à 23:00.

dimanche 03 novembre 2013

News ResEl

Maintenance IRC

Bonjour, le serveur IRC subira une maintenance ce dimanche 10/11, qui devrait entraîner une indisponibilité pendant quelques minutes. Cette maintenance a pour but de changer de serveur IRC afin de pouvoir supporter l'utilisation de l'IPv6 et d'éliminer certains bugs récurrents. Arnaud, pour le ResEl

03/11/2013 à 23:00.

mardi 15 octobre 2013

flo - Florent Fourcot

SSD m4 de Crucial : le bug de l'obsolescence programmée

J'ai la chance d'avoir un SSD dans mon ordinateur de travail, ce qui permet de gagner énormément de temps par rapport à un disque dur. Ça c'est pour la théorie, car j'ai perdu des heures la semaine dernière sur un bug assez curieux. Les symptômes étaient assez simples : le système perdait le contact avec le disque, rendant l'ordinateur totalement inutilisable et forçant un redémarrage électrique.

J'ai d'abord cru à un problème matériel, la connexion entre le disque et la carte mère n'étant pas très solide sur mon ordinateur portable. Un faux contact est vite arrivé (et s'était déjà produit), et j'ai ouvert et nettoyé tout ça. Sans changement. J'étais d'autant plus circonspect qu'un démarrage se déroulait toujours parfaitement bien, alors qu'un faux contact devrait se manifester dans toutes les situations.

J'ai donc ensuite songé à un problème logiciel, en constatant au passage que mon ordinateur plantait après 3600 secondes d'utilisation environ, soit une heure. Mais revenir sur un ancien noyau ne changeait rien, hormis que le système plantait encore plus violemment. Rien du côté de l'historique SMART, rien de clair dans les logs systèmes, aucun programme qui se lance une heure après le démarrage. J'ai testé beaucoup de choses.

Cette piste logicielle était pourtant la bonne, mais à un niveau en-dessous. Les SSD de Crucial sont en effet victimes d'un bug des 5184 heures. Il n'est pas précisé pourquoi 5184 heures (c'est 3 au cube multiplié par 2 puissance 6). Il est bien entendu impossible de savoir s'il s'agit de réelle incompétence, ou d'une volonté d'obsolescence programmée. Après tout, qui parmi le grand public va penser à aller chercher sur le site du constructeur les correctifs ? D'autant plus qu'aucun historique des versions n'est disponible, et que le site actuel du fabricant ne mentionne absolument pas ce bug ? Il faut fouiller les forums obscurs pour reconstruire l'historique des versions, et trouver l'annonce de la mise à jour 0309 (version qui suit la 0009, et précède la version 000F, histoire vraie...). Après avoir trouvé ça, il faut suivre la procédure de mise à jour qui est bien entendu surtout prévue pour un système WIndows. Quelle est donc la proportion de mise à jour par rapport au nombre de SSD vendus ?

C'est typique pour moi du risque de l'ajout d'intelligence dans les composants matériels. On se met à la merci du constructeur, qui fait ce qu'il veut dans son coin, avec du code complètement obscur. En allant chercher les annonces de chaque nouvelle version, c'est édifiant de voir des améliorations de performances et des corrections de bugs, pour un matériel qui lui ne change évidemment pas. Le genre de lignes d'historique que j'aimerai voir dans une nouvelle version du noyau Linux, pas sur le forum d'un fabricant de matériel. Jugez-vous même :

0309

  • Correct a condition where an incorrect response to a SMART counter will cause the m4 drive to become unresponsive after 5184 hours of Power-on time. The drive will recover after a power cycle, however, this failure will repeat once per hour after reaching this point. The condition will allow the end user to successfully update firmware, and poses no risk to user or system data stored on the drive.

000F

  • Improved compatibility with certain SAS expanders and peripheral RAID cards.
  • Improved throughput stability under extremely heavy workloads.
  • Improved data protection in the event of unexpected, asynchronous power loss.

010G

  • Improved Trim response time
  • Improved power-on-to-ready time (known as POR, or TTR for Time-to-ready)
  • Improved resume-time from low power modes, and improved reliability of warm reboot
  • Improved power consumption by disabling HIPM (Host Initiated Power Management)

040H

  • Improved robustness in the event of an unexpected power loss. Significantly reduces the incidence of long reboot times after an unexpected power loss.
  • Corrected minor status reporting error during SMART Drive Self Test execution (does not affect SMART attribute data).
  • Streamlined firmware update command for smoother operation in Windows 8.
  • Improved wear leveling algorithms to improve data throughput when foreground wear leveling is required.

070H

  • Resolved a power-up timing issue that could result in a drive hang, resulting in an inability to communicate with the host computer. The hang condition would typically occur during power-up or resume from Sleep or Hibernate. Most often, a new power cycle will clear the condition and allow normal operations to continue. The failure mode has only been observed in factory test. The failure mode is believed to have been contained to the factory. This fix is being implemented for all new builds, for all form factors, as a precautionary measure. The fix may be implemented in the field, as desired, to prevent occurrence of this boot-time failure. To date, no known field returns have been shown to be related to this issue. A failure of this type would typically be recoverable by a system reset.

Par flo, le 15/10/2013 à 14:13.

vendredi 27 septembre 2013

News ResEl

Problème d'envois d'e-mails

Bonjour, il semblerait qu'AOL bloque les mails en provenance du ResEl. Cela veut dire que si vous êtes abonné a une mailing-liste avec une adresse AOL vous ne recevrez pas les messages. Nous travaillons actuellement sur la résolution du problème. Pierre, pour le ResEl

27/09/2013 à 22:00.

mardi 03 septembre 2013

flo - Florent Fourcot

Weboob dans Linux Pratique

Weboob fait la une du magazine Linux Pratique (même si ce n'est pas précisé, c'est bien de ça dont parle l'encart Web). À l'intérieur, 6 pages parlant du logiciel, ainsi qu'une mention dans l'édito.

Hormis une étape bizarre dans la description de l'installation, le contenu est bon. On regrettera cependant que l'auteur n'ait pas pris contact avec les développeurs, on aurait peut-être pu aider (ou au moins ne pas le découvrir par hasard).

Par flo, le 03/09/2013 à 16:07.

mardi 27 août 2013

News ResEl

Perte du lien extérieur

Bonjour, suite à quelques problèmes avec notre passerelle, nous avons perdu le lien vers l'extérieur. Cela explique pourquoi nous n'avons plus d'accès à l'internet. L'équipe du ResEl est sur le coup et nous espérons réparer le problème d'ici ce soir. Veuillez nous excuser pour la gêne occasionnée. Garrik, pour le ResEl

27/08/2013 à 22:00.

samedi 15 décembre 2012

Fred - Frédéric Perrin

Tunnels IPv6 pour la maison

J'ai voulu avoir de l'IPv6 à la maison. Mon opérateur Internet ne fournit que de l'IPv4, il faut donc tunneller d'une façon ou d'une autre. J'ai une Kimsufi à disposition, avec un accès IPv6 natif, j'ai donc voulu l'utiliser comme point de sortie.

Bien sûr, une solution est d'utiliser un fournisseur de tunnel comme HE ou SixXS, mais où est l'intérêt de ne pas faire les choses soi-même ?

Creusage de tunnels

Beaucoup de technologies qui permettent de faire des tunnels IPv6 à travers un réseau IPv4 :

Nom Type Usage
6in4 Routeur - Routeur Un lien IPv6 (typiquement entre routeurs) explicitement configuré entre les deux extrémités
GRE Routeur - Routeur Une technique d'encapsulation générique Cisco (depuis normalisée) avec quelques fonctionnalités en plus
6to4 Routeur - Internet Un lien IPv6, les adresses sont dans 2002::⁄32 et on inclut dans l'adresse IPv6 l'adresse IPv4 (publique !) du routeur. Il y a besoin de relais sur l'Internet (pour le sens Internet -> Routeur)
ISATAP Hôte - Hôte Deux hôtes (éventuellement routeurs pour leurs réseaux respectifs) qui peuvent se parler en IPv4, avec quelques options d'autoconfiguration. Prévu pour un réseau local.
6over4 Hôte - Hôte Comme ISATAP, mais les hôtes doivent se parler en IPv4 multicast (typiquement, ils sont sur le même LAN). Pas intéressant par rapport à ISATAP, mais historiquement le premier.
Teredo Hôte - Internet Un hôte (éventuellement derrière un NAT) qui accède à l'Internetv6
IPsec Routeur - Routeur Initialement prévu pour créer un tunnel sécurisé entre deux réseaux

Quand on a un point de sortie, la technique idéale est 6in4, ou éventuellement IPsec en mode authentification (le chiffrement est peu intéressant, puisque couvrant uniquement la partie du trafic de la maison au point de sortie, et uniquement pour l'IPv6…).

Plan du réseau

Le serveur / point de sortie utilise lui-même des adresses IPv6. Le réseau côté maison a besoin d'au moins deux préfixes, pour le Wifi et pour le filaire. Or, OVH ne fournit aux kimsufi qu'un seul /64… Il va donc falloir découper en plusieurs morceaux. J'ai choisi /80, attribué comme suit :

../images/tunnel-ip6.png

Schéma réseau

Où :

  • 2001:db8:a:b::/64 est le préfixe attribué au point de sortie ;
  • le premier /80 est attribué aux différents services qui tournent sur la machine ;
  • les /80 suivants pour la maison ;
  • en vert le tunnel entre le routeur Wifi à la maison et le point de sortie ;

J'ai utilisé des adresses ULA pour les extrémités du tunnels, mais en fait il n'y en a pas vraiment besoin : une fois qu'on a commencé à découper notre /64, autant aller jusqu'au bout. Ça permet juste de bien reconnaître les adresses dans les fichiers de configuration et dans les tcpdump.

Problèmes

Il y a deux problèmes avec cette façon de faire. Le premier est évident : on utilise des préfixes qui font plus que /64. Cela nous fait essentiellement perdre les mécanismes d'auto-configuration sur les réseaux de la maison.

Le deuxième est un peu plus subtile. Le /64 fournit par OVH n'est pas vraiment routé jusqu'à nous. Si c'était le cas, tous les paquets à destination du /64 seraient livrés à 2001:db8:a:b::1 (par exemple), et notre routage interne avec les /80 lui serait transparent. À la place, le dernier routeur s'attend à être directement connecté à ce /64, et à pouvoir faire directement un NS et recevoir une réponse pour chaque adresse. Il va donc falloir mettre en place sur l'interface externe un proxy NDP, qui fera croire au routeur que toutes les adresses sont directement connectées.

Implémentation

Routage sur le point de sortie

On va configurer les adresses que l'on utilise sur la machine comme des /128 (ou éventuellement comme des /80, enfin bref), créer le tunnel, et ajouter les routes statiques vers la maison.

Quelques lignes dans rc.conf :

ifconfig_nfe0="inet 203.0.113.197/24"
defaultrouter="203.0.113.254"
ifconfig_nfe0_ipv6="inet6 auto_linklocal"
# entree statique pour le routeur :
# http://travaux.ovh.net/?do=details&id=6819
#rtsold_enable="YES"
ipv6_defaultrouter="fe80::5:73ff:fea0:0%nfe0"
ifconfig_nfe0_alias0="inet6 2001:db8:a:b::1/128"
ifconfig_nfe0_alias1="inet6 2001:db8:a:b::22/128"
ifconfig_nfe0_alias2="inet6 2001:db8:a:b::25/128"
ifconfig_nfe0_alias3="inet6 2001:db8:a:b::80/128"

# tunnel vers la maison
gif_interfaces="gif0"
gifconfig_gif0="203.0.113.197 198.51.100.56"
ifconfig_gif0="mtu 1480"
ifconfig_gif0_ipv6="inet6 -auto_linklocal"
ifconfig_gif0_alias0="fd93:1:2:3::1/127"

ipv6_gateway_enable="YES"
ipv6_static_routes="home_wifi home_wired"
ipv6_route_home_wifi="2001:db8:a:b:1:: -prefixlen 80 fd93:1:2:3::"
ipv6_route_home_wired="2001:db8:a:b:2:: -prefixlen 80 fd93:1:2:3::"

Si pf(4) tourne, on ajoutera :

table <home_nets>  const persist { 2001:db8:a:b:1::/80 2001:db8:a:b:2::/80 }
extif = "nfe0"
tunif = "gif0"
# Tunnel 6in4 vers maison
pass on $extif proto ipv6
pass from <home_nets> to any
pass from any to <home_nets>

# Éventuellement des règles plus restrictives pour contrôler ce qui
# arrive à la maison

Configuration du routeur wifi

Le routeur est un Cisco 877W qui fait tourner 15.1(3)T4. En 12.2, j'ai vu que parfois, le routeur décide de ne pas répondre aux NS, ce qui est un peu gênant. On utilise DHCPv6 pour distribuer les adresses. L'interface Wi-Fi ne peut pas être configurée en IPv6, mais on peut la placer dans un bridge qui, lui, peut être configuré avec IPv6.

ipv6 unicast-routing
ipv6 cef
!
interface Dot11Radio0
 description wireless
 bridge-group 1
 ssid Coloc
!
interface BVI 1
 description bridge pour wireless
 ipv6 mtu 1480
 ipv6 address 2001:DB8:A:B:1::1/80
 ipv6 nd autoconfig default-route
 ipv6 nd managed-config-flag
 ipv6 dhcp server HOME_WLANv6
!
interface Vlan20
 description vlan wired
 ipv6 mtu 1480
 ipv6 address 2001:DB8:A:B:2::1/80
 ipv6 nd managed-config-flag
 ipv6 dhcp server HOME_WIREDv6
!
interface range FastEthernet 0 - 2
 switchport mode access
 switchport access vlan 20
 description wired (vlan 20)
 spanning-tree portfast
!
interface Vlan10
 description vlan internet
 ip address dhcp
!
interface FastEthernet3
 description internet (vlan 10)
 switchport access vlan 10
!
interface Tunnel0
 description tunnel vers serveur
 no ip address
 ipv6 address FD93:1:2:3::/127
 tunnel source Vlan10
 tunnel destination 203.0.113.197
 tunnel mode ipv6ip
!
ipv6 dhcp pool HOME_WIREDv6
 address prefix 2001:DB8:A:B:2::/80
 dns-server 2001:DB8:A:B::53
!
ipv6 dhcp pool HOME_WLANv6
 address prefix 2001:DB8:A:B:1::/80
 dns-server 2001:DB8:A:B::53
!
ipv6 route ::/0 FD93:1:2:3::1/127

Les interfaces Fa 0 - 2, utilisées pour le LAN filaire, sont mises en portfast. Sans le portfast, il faut ≈45 secondes à STP pour accepter que je n'ai pas créé de boucle en branchant mon portable. NetworkManager envoie n RS avec un timeout de t secondes pour la réponse RA. Avec n = 3, t = 1 seconde (RFC2461), NetworkManager a le temps d'abandonner plusieurs fois… Donc on passe en portfast.

Proxy NDP

Comme mentionné plus haut, l'un des soucis est que le routeur devant la KS s'attend à voir le /64 complètement à plat. Il faut donc un proxy NDP qui réponde à la place des machines qui sont à la maison.

Ça fait environ 300 lignes pour un programme qui écoute avec libpcap les NS sur l'interface externe et qui envoie les NA correspondants. Le code est dans un dépôt git (ou interface gitweb). Avec le réseau montré plus haut, j'appelle ndp6 avec les options :

ndp6 -i nfe0 -p 2001:db8:a:b:1::/80 -p 2001:db8:a:b:2::/80

Les gens qui utilisent Linux sur le point de sortie seront intéressés par ndppd. Parmi les linuxeries, il y a la lecture de /proc/net/ipv6_route pour mettre à jour les réseaux proxifiés, l'utilisation d'une socket AF_PACKET pour écouter les paquets qui ne nous sont pas destinés.

Soucis rencontrés

Clients DHCP

Avec ISC dhclient, lorsqu'une adresse est configurée par DHCPv6, elle est installée avec un préfixe en /64. C'est un bug dans le client DHCP (les annonces DHCP ne contiennent qu'une adresse, pas d'informations sur le lien local). La RFC 5942, section 5 explique le problème, disant que c'est ce qui arrive quand « the IPv6 subnet model is not understood by the implementers of several popular host operating systems ».

Le bug Debian #684009 contient un patch pour ISC dhclient (apparemment remonté upstream). De son côté, Network Manager ne fait ples confiance aux préfixes annoncé par les clients DHCPv6.

Le client WIDE dhcp6c a le bon comportement (à condition de lui dire de demander une adresse…), je n'ai pas testé son intégration avec Network Manager.

Le Windows 7 du boulot semble avoir le bon comportement.

Bizarrerie sur le DHCP côte WAN

Les serveurs DHCP de chez Virgin Media se comportent bizarrement. En particulier, après une coupure de courant, le routeur ne reçoit pas d'adresse jusqu'à ce que le modem câble se fasse rebooter. Pas quelque chose que je peux corriger de mon côté…

15/12/2012 à 0:03.

jeudi 29 novembre 2012

flo - Florent Fourcot

Les nuances de gris, ça flash sur le blanc


Warning: Parameter 1 to rsExtPost::getExcerpt() expected to be a reference, value given in /srv/web/flo.fourcot.fr/public/inc/clearbricks/dblayer/dblayer.php on line 618

Warning: Parameter 1 to rsExtPost::getContent() expected to be a reference, value given in /srv/web/flo.fourcot.fr/public/inc/clearbricks/dblayer/dblayer.php on line 618

Par : Parameter 1 to rsExtPost::getAuthorCN() expected to be a reference, value given in on line, le 29/11/2012 à 15:16.

dimanche 03 juin 2012

Fred - Frédéric Perrin

ZFS pour des mises à jour sereines

Avec FreeBSD 9.0 qui est sorti il y a presque six mois, il est grand temps de se mettre à jour. On ne peut pas à la fois prétendre au status de cyborg, et utiliser autre chose que la dernière version de son OS préféré !

Dans un épisode précédent on avait installé son serveur avec ZFS, justement pour pouvoir faire des mises à jour avec une solution de repli si les choses tournent mal. On a deux solutions : faire un snapshot puis mettre à jour, avec la possibilité de faire un rollback plus tard ; ou alors installer dans un nouveau volume et pointer le bootloader sur le nouvel environnement. J'ai exploré la deuxième option. Cette deuxième option permet de ne pas tout perdre s'il faut revenir en arrière. On verra dans la suite si cela devait se révéler utile…

Préparation

Histoire d'avoir les ports déjà construits, on installe poudriere, la configuration se résume à pointer sur un FTP proche de chez nous. Ensuite on prépare un environnement pour 9.0 :

poudriere jail  -c -v 9.0-RELEASE -a amd64 -j poudre90
poudriere ports -c

On récupère la liste des ports installés, et tant qu'on y est on récupère aussi leur configuration pour que poudriere reconstruise les ports avec les bonnes options.

(pkg_version -o; jexecall pkg_version -o) >portlist
sort <portlist| uniq >portlistuniq
cut -d' ' -f1 <portlistuniq >portlist
cp -r /srv/jails/*/var/db/ports/* /usr/local/etc/poudriere.d/options
poudriere bulk -f portlist

Le système de base

Pendant que poudriere mouline, on installe FreeBSD 9.0 sur un système de fichiers à part.

zfs create zroot/slash90
zfs set mountpoint=/slash90 zroot/slash90
zfs create zroot/slash90/usr

cd /slash90
fetch http://ftp.fr.freebsd.org/pub/FreeBSD/releases/amd64/amd64/9.0-RELEASE/{base,kernel,src}.txz
tar -xpf base.txz
tar -xpf kernel.txz
tar -xpf src.txz

Pour les fichiers de configuration, on va copier la configuration depuis notre environnement actuel vers l'installation toute fraîche, puis lancer un coup de mergemaster(8) :

cd /slash90/etc
cp -a /etc/ .
chroot /slash90
mergaster -FUvi

On profite également d'être dans un chroot dans /slash90 pour installer les ports qu'on vient de construire.

La configuration réseau a un peu changé. Une configuration avec plusieurs addresses dans chaque famille ressemble à :

ifconfig_nfe0="inet 203.0.113.13/24"
defaultrouter="203.0.113.254"
ifconfig_nfe0_ipv6="inet6 2001:db8:1:8248::1/64 accept_rtadv"
rtsold_enable="YES" # ou ipv6_defaultrouter="fe80::f00:baa%nfe0"

ifconfig_nfe0_alias0="inet  198.51.100.43/32"
ifconfig_nfe0_alias1="inet6 2001:db8:1:8248::25"
ifconfig_nfe0_alias2="inet6 2001:db8:1:8248::53"

ipv6_network_interfaces n'est plus nécessaire.

On copie également /usr/local/etc dans /slash90.

Bascule vers 9.0

Pour basculer d'un environnement vers l'autre, il suffit 1 de faire :

zfs set canmount=noauto zroot/slash82
zfs set canmount=noauto zroot/slash82/usr

vi /slash90/boot/loader.conf
# Ajouter : zfs_load="YES"
# et : vfs.root.mountfrom="zfs:zroot/slash90"
zfs unmount zroot/slash90
zfs unmount zroot/slash90/usr
zfs set mountpoint=/ zroot/slash90
zfs set mountpoint=/usr zroot/slash90/usr
zpool set bootfs=zroot/slash90 zroot

Dans mon cas, l'environnement actuel est installé dans zroot/slash82, avec /usr qui est dans zroot/slash82/usr. Si la racine du système est directement à la racine du pool ZFS, il y aura quelques subtilités, si on passe zroot en noauto il faudra penser à modifier les autres points de montage par exemple. De plus, chez moi /var est dans zroot/var, monté automatiquement par ZFS, donc il n'y a pas besoin de le déplacer.

Au premier essai, ma kimsufi n'a pas démarré. Un peu d'investigation via le le mode rescue-pro d'OVH (un simple netboot avec les disques accessibles) ne donne rien. Un zpool import -o altroot=/mnt plus tard, on refait la bascule dans l'autre sens (en utilisant zroot/slash82), et on retrouve une machine qui boote.

Le lendemain, je retente l'opération, cette fois en vKVM (une machine virtuelle qui démarre sur le disque dur du serveur), et là… le démarrage se passe correctement. Je ne sais pas pourquoi au premier essai, les choses se sont bloquées au boot.

Après un peu d'exploration, on voit qu'il y a certaines choses qui ont été « perdues » :

  • ce qui est dans /root (un script de sauvegarde, par exemple) ;
  • ce qui est dans /usr/local. J'ai pensé aux ports et à leur configuration, mais j'ai laissé de côté le RTM d'OVH, les dossiers de données de poudriere… ;
  • /home (qui ne contenait guère que ~fred/.ssh/authorized_keys d'intéressant).

Il suffit de monter zroot/slash82 (qui est actuellement en canmount=noauto) pour avoir accès à ses données et les réinstaller.

Les jails

On pourrait tout à fait adopter la même procédure : installer dans un système de fichiers à part, y compris les ports, rapatrier les configurations, et pointer ezjail vers la nouvelle installation. La mise à jour en place semble plus simple, et tellement moins risquée que pour la machine hôte…

ezjail-admin update -s 8.2-RELEASE -U

Attention, freebsd-update essaie de mettre à jour le noyau, il faut le relancer à la main une deuxième fois.

Malheureusement, il faut lancer à la main mergemaster pour chacune des jails (et tant qu'on y pense, mettre à jour le gabarit d'ezjail).

Pour les ports, grâce à la préparation faite plus haut, on a déjà des packages binaires à jour pour nos jails, et il suffit de lancer un jexecall portmaster -a pour tout mettre à jour.

Conclusion

Le passage à 9.0 n'a pas été aussi facile qu'attendu. En particulier, je ne sais pas pourquoi le premier démarrage n'a pas réussi du premier coup, et si c'est dû à l'utilisation de ZFS ou pas. De plus, la méthode que j'ai suivie n'était pas idéale —je suppose qu'en ayant de vraies procédures de backup-restore, je n'aurais pas oublié RTM ou les scripts qui traînent dans /root. D'un autre côté, le paramètre bootfs plus jouer un peu avec les points de montage permet de basculer facilement d'une installation à l'autre ; c'était une promesse de ZFS, et cette promesse est tenue. Au premier essai, c'est ce qui m'a permis de revenir sur une configuration fonctionnelle.

Je regrette de ne pas avoir adopté poudriere plus tôt.

Footnotes:

1 Il serait certainement possible de laisser /usr hériter de zroot/slashXX, et ainsi il n'y aurait qu'un seul point de montage à déplacer.

03/06/2012 à 14:00.

ZFS pour des mises à jour sereines

Avec FreeBSD 9.0 qui est sorti il y a presque six mois, il est grand temps de se mettre à jour. On ne peut pas à la fois prétendre au status de cyborg, et utiliser autre chose que la dernière version de son OS préféré !

Dans un épisode précédent on avait installé son serveur avec ZFS, justement pour pouvoir faire des mises à jour avec une solution de repli si les choses tournent mal. On a deux solutions : faire un snapshot puis mettre à jour, avec la possibilité de faire un rollback plus tard ; ou alors installer dans un nouveau volume et pointer le bootloader sur le nouvel environnement. J'ai exploré la deuxième option. Cette deuxième option permet de ne pas tout perdre s'il faut revenir en arrière. On verra dans la suite si cela devait se révéler utile…

Préparation

Histoire d'avoir les ports déjà construits, on installe poudriere, la configuration se résume à pointer sur un FTP proche de chez nous. Ensuite on prépare un environnement pour 9.0 :

poudriere jail  -c -v 9.0-RELEASE -a amd64 -j poudre90
poudriere ports -c

On récupère la liste des ports installés, et tant qu'on y est on récupère aussi leur configuration pour que poudriere reconstruise les ports avec les bonnes options.

(pkg_version -o; jexecall pkg_version -o) >portlist
sort <portlist| uniq >portlistuniq
cut -d' ' -f1 <portlistuniq >portlist
cp -r /srv/jails/*/var/db/ports/* /usr/local/etc/poudriere.d/options
poudriere bulk -f portlist

Le système de base

Pendant que poudriere mouline, on installe FreeBSD 9.0 sur un système de fichiers à part.

zfs create zroot/slash90
zfs set mountpoint=/slash90 zroot/slash90
zfs create zroot/slash90/usr

cd /slash90
fetch http://ftp.fr.freebsd.org/pub/FreeBSD/releases/amd64/amd64/9.0-RELEASE/{base,kernel,src}.txz
tar -xpf base.txz
tar -xpf kernel.txz
tar -xpf src.txz

Pour les fichiers de configuration, on va copier la configuration depuis notre environnement actuel vers l'installation toute fraîche, puis lancer un coup de mergemaster(8) :

cd /slash90/etc
cp -a /etc/ .
chroot /slash90
mergaster -FUvi

On profite également d'être dans un chroot dans /slash90 pour installer les ports qu'on vient de construire.

La configuration réseau a un peu changé. Une configuration avec plusieurs addresses dans chaque famille ressemble à :

ifconfig_nfe0="inet 203.0.113.13/24"
defaultrouter="203.0.113.254"
ifconfig_nfe0_ipv6="inet6 2001:db8:1:8248::1/64 accept_rtadv"
rtsold_enable="YES" # ou ipv6_defaultrouter="fe80::f00:baa%nfe0"

ifconfig_nfe0_alias0="inet  198.51.100.43/32"
ifconfig_nfe0_alias1="inet6 2001:db8:1:8248::25"
ifconfig_nfe0_alias2="inet6 2001:db8:1:8248::53"

ipv6_network_interfaces n'est plus nécessaire.

On copie également /usr/local/etc dans /slash90.

Bascule vers 9.0

Pour basculer d'un environnement vers l'autre, il suffit 1 de faire :

zfs set canmount=noauto zroot/slash82
zfs set canmount=noauto zroot/slash82/usr

vi /slash90/boot/loader.conf
# Ajouter : zfs_load="YES"
# et : vfs.root.mountfrom="zfs:zroot/slash90"
zfs unmount zroot/slash90
zfs unmount zroot/slash90/usr
zfs set mountpoint=/ zroot/slash90
zfs set mountpoint=/usr zroot/slash90/usr
zpool set bootfs=zroot/slash90 zroot

Dans mon cas, l'environnement actuel est installé dans zroot/slash82, avec /usr qui est dans zroot/slash82/usr. Si la racine du système est directement à la racine du pool ZFS, il y aura quelques subtilités, si on passe zroot en noauto il faudra penser à modifier les autres points de montage par exemple. De plus, chez moi /var est dans zroot/var, monté automatiquement par ZFS, donc il n'y a pas besoin de le déplacer.

Au premier essai, ma kimsufi n'a pas démarré. Un peu d'investigation via le le mode rescue-pro d'OVH (un simple netboot avec les disques accessibles) ne donne rien. Un zpool import -o altroot=/mnt plus tard, on refait la bascule dans l'autre sens (en utilisant zroot/slash82), et on retrouve une machine qui boote.

Le lendemain, je retente l'opération, cette fois en vKVM (une machine virtuelle qui démarre sur le disque dur du serveur), et là… le démarrage se passe correctement. Je ne sais pas pourquoi au premier essai, les choses se sont bloquées au boot.

Après un peu d'exploration, on voit qu'il y a certaines choses qui ont été « perdues » :

  • ce qui est dans /root (un script de sauvegarde, par exemple) ;
  • ce qui est dans /usr/local. J'ai pensé aux ports et à leur configuration, mais j'ai laissé de côté le RTM d'OVH, les dossiers de données de poudriere… ;
  • /home (qui ne contenait guère que ~fred/.ssh/authorized_keys d'intéressant).

Il suffit de monter zroot/slash82 (qui est actuellement en canmount=noauto) pour avoir accès à ses données et les réinstaller.

Les jails

On pourrait tout à fait adopter la même procédure : installer dans un système de fichiers à part, y compris les ports, rapatrier les configurations, et pointer ezjail vers la nouvelle installation. La mise à jour en place semble plus simple, et tellement moins risquée que pour la machine hôte…

ezjail-admin update -s 8.2-RELEASE -U

Attention, freebsd-update essaie de mettre à jour le noyau, il faut le relancer à la main une deuxième fois.

Malheureusement, il faut lancer à la main mergemaster pour chacune des jails (et tant qu'on y pense, mettre à jour le gabarit d'ezjail).

Pour les ports, grâce à la préparation faite plus haut, on a déjà des packages binaires à jour pour nos jails, et il suffit de lancer un jexecall portmaster -a pour tout mettre à jour.

Conclusion

Le passage à 9.0 n'a pas été aussi facile qu'attendu. En particulier, je ne sais pas pourquoi le premier démarrage n'a pas réussi du premier coup, et si c'est dû à l'utilisation de ZFS ou pas. De plus, la méthode que j'ai suivie n'était pas idéale —je suppose qu'en ayant de vraies procédures de backup-restore, je n'aurais pas oublié RTM ou les scripts qui traînent dans /root. D'un autre côté, le paramètre bootfs plus jouer un peu avec les points de montage permet de basculer facilement d'une installation à l'autre ; c'était une promesse de ZFS, et cette promesse est tenue. Au premier essai, c'est ce qui m'a permis de revenir sur une configuration fonctionnelle.

Je regrette de ne pas avoir adopté poudriere plus tôt.

Footnotes:

1 Il serait certainement possible de laisser /usr hériter de zroot/slashXX, et ainsi il n'y aurait qu'un seul point de montage à déplacer.

03/06/2012 à 12:00.

mercredi 09 mai 2012

guiling - Bertrand Grelot

Fusionner 2 pdf avec gs

Facile !

gs -dNOPAUSE -sDEVICE=pdfwrite -sOUTPUTFILE=fichier_de_sortie.pdf
-dBATCH fichier_d_entree_1.pdf fichier_d_entree_2.pdf

Par Bertrand Grelot, le 09/05/2012 à 20:52.

vendredi 27 avril 2012

flo - Florent Fourcot

Weboob, ou comment se passer de navigateur Web (1/2)

Qui me fréquente un peu a déjà entendu parler d'un logiciel nommé Weboob, pour Web Out Of Browser. Il est donc naturel d'en parler un jour ou l'autre sur ce blog.

Concrètement, ce logiciel permet d'aller chercher des informations sur des sites Web sans utiliser un navigateur traditionnel. Dans un monde idéal, Weboob n'existerait pas et les données seraient facilement exportables sur tout site Web. Ce n'est cependant que rarement le cas, et Weboob a l'ambitieuse mission de pallier aux carences des sites Web. Cela le rend forcément très riche, car le Web regorge de fonctionnalités... Par une petite suite de billets (probablement deux, ou trois, selon l'humeur) je vais présenter tout ce dont je me sers au quotidien (dans un ordre historique d'utilisation), et ce qui me fait gagner un temps relativement important tous les jours.

Relevés de compte

C'est par boobank que j'ai commencé à utiliser (et contribuer à) Weboob. L'application permet d'aller chercher le solde de ses comptes, l'historique des opérations, les opérations à venir, et même d'exporter les données pour l'intégration à un logiciel de comptabilité. J'étais très demandeur de cette fonctionnalité pour les banques françaises, qui contrairement aux banques allemandes forcent la connexion à leur site bourré de publicités plutôt que de permettre un simple export par des protocoles bien connus. Concrètement, avec le clavier virtuel, le changement régulier obligatoire de mots de passe, le site plutôt lent, je passais un temps fou à suivre mes comptes sur la BNP. Alors qu'en deux clics c'était fait pour la Deutsche Bank.

J'ai donc été bluffé quand j'ai utilisé pour la première fois Weboob et le module de la BNP. En une commande dans le terminal je pouvais enfin vérifier que je n'étais pas dans le rouge. Ça m'a tellement plu que j'ai contribué pour la première fois aux alentours d'août 2010 avec quelques patchs pour la BNP.

Depuis, boobank n'a fait que s'améliorer. L'application permet notamment de faire des virements de compte à compte et l'export en .qif. C'est toujours plus long que de passer par aqbanking à la mode allemande, mais le bénéfice est plus qu'appréciable. Autre chose que j'ai pu apprécier lors de mon changement de banque, c'est l'agrégation des données de toutes les banques configurées. J'avais à ce moment là deux banques, et je pouvais suivre le solde des deux au même endroit.

En cerise sur le gâteau, un script existe pour faire des graphiques des comptes à travers munin. Complètement inutile, donc parfaitement indispensable.

En conclusion, Boobank est l'archétype de « Weboob ne devrait pas exister ». Si les banques françaises arrêtaient de se moquer de leurs clients en forçant des accès à travers leur site Web ou des applications spéciales pour Smartphone (et je ne parle même des options payantes à des prix scandaleux pour recevoir des « alertes »), Boobank disparaîtrait immédiatement. Des solutions existent, comme les banques allemandes le prouvent.

Surveillance de l'Elbe

Vivre à Dresde, c'est vivre dans une ville au niveau du fleuve bien changeant. Ce n'est heureusement pas souvent comme en 2002, mais les variations peuvent tout de même être spectaculaires. Je ne suis pas ultra fan du site officiel (notamment car il ne publie pas un réel historique des données), et j'avais donc programmé un petit module Weboob pour suivre cette évolution, et faire des jolis graphiques comme celui-ci :

elbooc_dresden-year.png

(des observateurs un peu curieux pourront détecter une anomalie en décembre, mon serveur étant en panne...).

J'ai longtemps gardé dans mon coin ce module, qui était vraiment peu configurable et écrit (trop) rapidement pour mes besoins spécifiques. J'ai cependant fini par le proposer dans Weboob, et il est présent depuis la version 0.b dans la version officielle et utilisable à travers Wetboobs. Pour savoir le niveau de l'Elbe (ou de tout autre cours d'eau en Saxe), une commande très simple est maintenant disponible :

$ wetboobs gauges Elbe

On peut aussi aller chercher l'historique d'une sonde, ou bien juste la dernière valeur connue. Bien entendu, si je l'ai fait pour la Saxe, on peut imaginer écrire le même module pour la France entière via Vigicrue. Et coupler Weboob à un petit script pour recevoir un mail en cas d'alerte de crue, c'est assez simple. Le tout en attendant que les autorités publiques allemandes et françaises commencent à publier des Données ouvertes.

La suite

Dans un autre billet... Avec notamment la récupération des articles de journaux, le téléchargement de vidéos, et bien d'autres trucs.

Par flo, le 27/04/2012 à 12:00.

dimanche 30 octobre 2011

Fred - Frédéric Perrin

Notes d'EuroBSDcon 2011

EuroBSDcon 2011 s'est déroulé au début de ce mois d'octobre. Je viens de finir de mettre en forme mes notes sur les conférences que j'ai suivies.

On y retrouvera en particulier :

  • sendmail, history and design, présenté par Eric Allman, dans lequel l'auteur présente l'histoire du MTA qui est encore aujourd'hui le plus utilisé sur Internet, les éléments de design qui ont permis à sendmail de survivre pendant 30 ans, et les élèments malgré lesquels sendmail a survécu pendant 30 ans ;
  • Minix 3, ou comment construire un OS fiable, par Herbert Bos : en utilisant des principes systématiques de réduction des privilèges, de séparation des composants, et en acceptant que les composants peuvent crasher mais sont pour la plupart redémarrables ;
  • status d'IPv6 dans FreeBSD de Bjoern Zeeb, comment FreeBSD a vécu le World IPv6 Day cette année, les leçons du noyau AF_INET6-only, et ce qui doit arriver dans le futur proche dans un FreeBSD près de chez vous ;
  • portage d'OpenBSD vers UltraSPARC T1 et T2 de Mark Kettenis, une session très technique (au cours de laquelle je ne prétendrais pas avoir tout compris), qui décrit dans une première partie les atouts de cette plateforme, et comment OpenBSD est capable de tourner sur cette architecture ;
  • NPF, un nouveau pf pour NetBSD 6.0 de Zoltan Arnold Nagy, qui explique pourquoi un nouveau pare-feu est nécessaire et comment NPF a été construit ;
  • High Availability STorage in FreeBSD de Pawel Jakub Dawidek, du RAID1 over network, modes de synchronisation, démonstration, performance ;
  • testing automatique de NetBSD de Martin Husemann, les composants logiciels mis en œuvre, les bindings dans différents languages, les bugs découverts grâce au testing systématique.

À noter également les slides de quelques développeurs OpenBSD :

Malheureusement les slides de Claudio Jeker sur MPLS ne sont pas en ligne.

Michael Dexter a parlé de virtualisation dans le monde BSD ( plus de documents). Son exposé avait deux grands axes : une classification des techniques de virtualisation existante, et surtout une présentation de BHyVe, un hyperviseur de type 2 (à la Xen) pour FreeBSD.

30/10/2011 à 10:29.

Notes d'EuroBSDcon 2011

EuroBSDcon 2011 s'est déroulé au début de ce mois d'octobre. Je viens de finir de mettre en forme mes notes sur les conférences que j'ai suivies.

On y retrouvera en particulier :

  • sendmail, history and design, présenté par Eric Allman, dans lequel l'auteur présente l'histoire du MTA qui est encore aujourd'hui le plus utilisé sur Internet, les éléments de design qui ont permis à sendmail de survivre pendant 30 ans, et les élèments malgré lesquels sendmail a survécu pendant 30 ans ;
  • Minix 3, ou comment construire un OS fiable, par Herbert Bos : en utilisant des principes systématiques de réduction des privilèges, de séparation des composants, et en acceptant que les composants peuvent crasher mais sont pour la plupart redémarrables ;
  • status d'IPv6 dans FreeBSD de Bjoern Zeeb, comment FreeBSD a vécu le World IPv6 Day cette année, les leçons du noyau AF_INET6-only, et ce qui doit arriver dans le futur proche dans un FreeBSD près de chez vous ;
  • portage d'OpenBSD vers UltraSPARC T1 et T2 de Mark Kettenis, une session très technique (au cours de laquelle je ne prétendrais pas avoir tout compris), qui décrit dans une première partie les atouts de cette plateforme, et comment OpenBSD est capable de tourner sur cette architecture ;
  • NPF, un nouveau pf pour NetBSD 6.0 de Zoltan Arnold Nagy, qui explique pourquoi un nouveau pare-feu est nécessaire et comment NPF a été construit ;
  • High Availability STorage in FreeBSD de Pawel Jakub Dawidek, du RAID1 over network, modes de synchronisation, démonstration, performance ;
  • testing automatique de NetBSD de Martin Husemann, les composants logiciels mis en œuvre, les bindings dans différents languages, les bugs découverts grâce au testing systématique.

À noter également les slides de quelques développeurs OpenBSD :

Malheureusement les slides de Claudio Jeker sur MPLS ne sont pas en ligne.

Michael Dexter a parlé de virtualisation dans le monde BSD ( plus de documents). Son exposé avait deux grands axes : une classification des techniques de virtualisation existante, et surtout une présentation de BHyVe, un hyperviseur de type 2 (à la Xen) pour FreeBSD.

30/10/2011 à 9:29.

lundi 25 juillet 2011

guiling - Bertrand Grelot

Navigateurs à double panneau

Il arrive d'avoir besoin de se servir de navigateurs avec deux panneaux pour permettre d'y voir plus clair ou de comparer deux folders. Je vais en citer ici 3 différents que j'ai l'habitude d'utiliser, deux graphiques (dont un natif sur l'environnement gnome), et un en console.

Le premier est nautilus, navigateur par défaut sur gnome. On peut ajouter un panneau par affichage > panneau supplémentaire, ou directement par F3.

Nautilus

Le deuxième est emelfm2, qui a la particularité d'intégrer quelques raccourcis pratique en bas (ouvrir un terminal dans le répertoire courant, exécuter en root, ...) et qui intègre également un terminal, parfois bien pratique pour chercher rapidement ce que le navigateur n'affiche pas.

Emelfm2

Le dernier, en console, est midnight commander, qui a menu très complet, permettant très simplement de compresser des répertoires et des fichiers, de copier un fichier d'un volet vers l'autre... Attention toutefois, pour quitter, il faut taper sur F10, qui est sur gnome-terminal le raccourci "menu" (il faudra donc penser à désactiver le raccourci F10 via édition > raccourcis clavier.

Midnight commander

Par Bertrand Grelot, le 25/07/2011 à 10:19.

mardi 17 mai 2011

guiling - Bertrand Grelot

Sox et conversion 32 bits / 16 bits

Récemment, j'ai eu à convertir un fichier .wav 32 bits en un fichier mp3. Habituellement j'utilise lame dans une console comme convertisseur mp3, mais avec un wav 32 bits en input ça ne semblait pas marcher :

$ lame file.wav 
Unsupported data format: 0x0003

Allons bon, lame va pas bien, c'est pas grave, on va faire du ogg :

$ oggenc file.wav 
Omition d'un tronçon de type « JUNK » et de longueur 4042
Ouverture avec le module wav : WAV file reader
Encodage de "file.wav" 
         en "file.ogg" 
à la qualité 3,00
        [ 22,7%] [ 0m42s remaining] - ^C

Ça marche avec le ogg, pas la peine d'attendre que ce soit fini. N'empêche que j'ai toujours pas mon mp3 parce que lame ne veut pas traiter du wav 32 bits. Solution de secours : utiliser sox, packagé dans sox :

$ aptitude search sox
(...)
c   sox                             - Swiss army knife of sound processing

Et maintenant passons à la conversion du wav 32 bits en wav 16 bits, à 44,1kHz :

                                              
$ sox file.wav -b 16 ~/tmp/file2.wav rate -I 44100 dither -s
sox WARN dither: dither clipped 23 samples; decrease volume?

Remarquez le dernier message : le fichier son a clippé (saturé) sur 23 échantillons. On va refaire la conversion, mais cette fois-ci en diminuant le gain de 1dB :

$ sox file.wav -b 16 ~/tmp/file2.wav gain -1 rate -I 44100 dither -s
$

Cette fois c'est parfait ! plus qu'à passer une couche de lame et ça marche sans souci.

Par Bertrand Grelot, le 17/05/2011 à 18:39.

mardi 15 mars 2011

guiling - Bertrand Grelot

Utiliser verbatim dans un document Beamer


Warning: Parameter 1 to rsExtPost::getExcerpt() expected to be a reference, value given in /home/bgrelot/dotclear/inc/clearbricks/dblayer/dblayer.php on line 618

Warning: Parameter 1 to rsExtPost::getContent() expected to be a reference, value given in /home/bgrelot/dotclear/inc/clearbricks/dblayer/dblayer.php on line 618

Par : Parameter 1 to rsExtPost::getAuthorCN() expected to be a reference, value given in on line, le 15/03/2011 à 7:08.

lundi 21 février 2011

SiD - Hugo Geissmann

4 critères pour bien choisir son projet agile pilote.

Choisir un projet pour se lancer dans l'agilité peut être un véritable casse-tête. Tous les projets ne sont pas de bons candidats ; il faut trouver un compromis entre taille, durée, criticité et soutien du métier (cf figure ci-dessous). Impossible ? C'est sans doute vrai. Pourtant, un de vos futurs projets peut s'approcher de cet équilibre. Mieux vaut se lancer plutôt que d'attendre éternellement le projet idéal. Voyons comment trouver le barycentre de ces critères.

choisir-un-projet-agile.png

Durée du projet

Si vous choisissez un projet trop court, les sceptiques vont clamer haut et fort que Scrum ne fonctionne que pour les petits projets. À l'inverse, si vous optez pour un projet trop long, vous risquez de ne pas pouvoir montrer votre succès avant son terme. On compte 9 à 12 mois en moyenne pour un « projet traditionnel » ; où budget et deadline sont souvent dépassés. Il serait dommage de lancer un projet Scrum en annonçant le même timing qu'un projet classique et donc entouré des mêmes doutes. L'idéal est de choisir un projet de moitié plus court qu'un projet classique ; 3 ou 4 mois suffisent généralement à prouver que l'application de Scrum est concluante et le serait pour une plus longue durée.

Taille du projet

Choisissez un projet qu'il est possible de commencer avec une seule équipe dont tous les membres sont colocalisés. Si la taille du projet vous sembler nécessiter plusieurs équipes, débutez tout de même avec une seule et limitez vous dans le nombre d'équipes, même si votre organisation a l'habitude de réaliser des projets de très grande envergure. Les soucis de coordination ne doivent pas être un frein pour ce premier projet agile.

Criticité du projet

Quand on expérimente, on a tendance à le faire sur quelque chose qui n'a pas d'importance et qui comporte peu de risques. Si les choses tournent mal, on aura perdu peu et avec de la chance personne n'aura rien remarqué. Ne cédez pas à cette tentation ! Allez à l'encontre de cela et choisissez un projet important. Si votre projet n'a pas de valeur, personne ne lui accordera d'attention au sein de votre entreprise. Et, comme la transition d'une équipe classique vers une équipe Scrum est exigeante, les protagonistes ne feront pas les efforts nécessaires si le projet n'apporte rien. Jim Highsmith, pionnier de l'agile et inventeur de « l'adaptative software Development process » nous met en garde sur ce sujet :

Ne commencez pas avec un projet pilote qui est marginal. Commencez avec un projet qui est critique pour votre société, sinon il sera trop difficile de faire tous les efforts que l'implémentation de la méthode requiert.

Le soutien du métier pour le projet

L'adoption de Scrum requiert un investissement total du métier. Avoir quelqu'un qui a le temps et l'envie de travailler avec l'équipe est absolument critique. Un sponsor côté métier peut aider à franchir les barrières organisationnelles et humaines inhérentes à toutes les entreprises. En cas de succès, il sera également le mieux placé pour promouvoir l'agilité en interne et pour évangéliser ses collègues, qui à leur tour seront enclins à tester l'agilité dans leurs équipes.

L'équipe

J'aborde ce point en dernier, mais c'est sans doute celui qui me tient le plus à cœur. Le choix de l'équipe est avec le choix du PO un des des facteurs clés de réussite. Et c'est valable pour tous les projets informatiques, agiles ou non. À l'instar d'un film, un scenario magnifique au casting désastreux ne donnera pas grand chose ; un scénario léger porté par des acteurs fabuleux lui donnera une âme. Dans notre cas, le métier va esquisser un scénario puis va l'affiner et l'adapter au fur et à mesure. Les membres de l'équipe, comme des acteurs, vont chercher à bien comprendre le scénario avant de le jouer. Ils vont être capables d'apporter leurs idées pour faire évoluer le projet dans le bon sens. Ils seront les artisans de leur propre succès.

Vous aurez donc compris l'importance du casting de l'équipe pour votre projet pilote. À ce sujet, je vous invite à lire le livre de Guillaume Bodet « Scrum en action » qui explique très bien comment repérer des profils agiles dans une équipe de projet classique.

D'après l'article de Mike Cohn : Four Attribute of the Ideal Pilot Project

Par Hugo, le 21/02/2011 à 17:02.

guiling - Bertrand Grelot

Grep sur une colonne en temps réel

La première chose au programme de ce billet, c'est apprendre à lire un log en temps réel (par exemple ici le fichier squid.log, généré par un squid et complété en continu) :

tail -f squid.log

Ça marche, mais compliquons un peu l'hypothèse de départ. On ajoute au système un logrotate qui va faire tourner le log toutes les 5 minutes (et qui va renommer squid.log en squid.log.YYYYMMDD.HHhMMmSSs). Si on continue avec notre tail précédent, toutes les cinq minutes on sera bon pour le relancer (le flux est cassé à la rotation). Heureusement, tail a une autre option, qui est plus robuste face à la suppression du fichier qu'on regarde :

tail -F squid.log

Et là c'est gagné. Maintenant, on va encore compliquer un peu et on va garder uniquement les lignes qui nous intéressent (qui contiennent le mot "motif"). Habituellement, quand on cherche une chaine de caractère dans un fichier de log en temps réel, on a tendance à grepper simplement :

tail -F squid.log | grep motif

Mais si on a face à nous une ligne qui se présente ainsi, on peut matcher des lignes qui ne vont pas forcément nous intéresser :

2011-02-21 15h54h10s motif_qui_nous_intéresse blabla blibli
2011-02-21 15h54h10s blabla motif_qui_ne_nous_intéresse_pas blibli

On a ici des lignes avec 5 colonnes séparées par des espaces, on veut uniquement grepper sur "motif" dans la troisième colonne :

tail -F squid.log | awk '$3 ~ "motif"'

Et éventuellement, si la colonne 4 ne nous intéresse vraiment pas, on peut même profiter du awk pour seulement afficher ce qui est pertinent :

tail -F squid.log | awk '$3 ~ "motif" {print $1,$2,$3,$5}'

J'en profite pour faire passer un rappel sur grep : non, on ne fait pas un cat pipe grep, un grep "motif" "fichier" suffit amplement, vous risquez de vous faire pendre ou brûler si vous osez faire ça.

Et en cadeau, un mémo sur awk : http://www.shellunix.com/awk.html

Par Bertrand Grelot, le 21/02/2011 à 15:05.

dimanche 28 novembre 2010

Norgz - Elie Roux

L'hiver savoyard

Un petit mot quand même pour décrire la vie ici, d'un point de vue très extérieur...

Déjà, KarmaLing c'est pentu... 40m de dénivelée entre ma voiture et le chalet, et 30m entre le bureau et le chalet, autant dire que ça muscle les jambes et que j'ai fait pas mal de progrès ! Niveau météo, il[...]

Par Elie Roux, le 28/11/2010 à 13:47.

L'hiver savoyard

Un petit mot quand même pour décrire la vie ici, d'un point de vue très extérieur... Déjà, KarmaLing c'est pentu... 40m de dénivelée entre ma voiture et le chalet, et 30m entre le bureau et le chalet, autant dire que ça muscle les jambes et que j'ai fait pas mal de progrès ! Niveau météo, il y[...]

28/11/2010 à 12:22.

lundi 15 novembre 2010

Norgz - Elie Roux

Les rituels

Les rituels

Après un peu d'acclimatation, je pense qu'il est temps de décrire un peu ce qu'on voit ici, d'un point de vue extérieur, car je me suis aperçu que je ne l'avais même pas fait... Par contre évidemment tout cela est à prendre avec des pincettes, étant donné que ce n'est pas très[...]

Par Elie Roux, le 15/11/2010 à 19:14.

Les rituels

Les rituels Après un peu d'acclimatation, je pense qu'il est temps de décrire un peu ce qu'on voit ici, d'un point de vue extérieur, car je me suis aperçu que je ne l'avais même pas fait... Par contre évidemment tout cela est à prendre avec des pincettes, étant donné que ce n'est pas très[...]

15/11/2010 à 18:14.