RPM

  • Apc, mtime, et déploiements par RPM

    Une petite fourberie d'un serveur web RHEL6 sur lequel je déploie des sources php via yum/RPM : le fichier inclus par des appels à include_once ou require_once n'était pas celui demandé, mais un autre. Le responsable ? APC.

    Alternative PHP Cache garde en mémoire une version compilée des sources php, ce qui accélère nettement les inclusions suivantes, jusqu'à 6 fois plus vite. Mais dans sa configuration par défaut, il vérifie que le fichier n'a pas été modifié en comparant son mtime et le dernier appel.

    Or rpm (comme Rsync, svn ou tar) conserve les dates originales des fichiers. Ainsi, on peut avoir un fichier version n-1, dont le dernier accès date d'un instant t, qui sera remplacé par un fichier dont le mtime est antérieur à t et qui sera ignoré par APC. Pire, si APC veut lire à nouveau le fichier, sans savoir qu'il a été remplacé, il va y accéder par son inode. C'est là qu'on se retrouve avec un autre fichier.

    Pour se prémunir de celà, il faut forcer APC à utiliser ctime au lieu de mtime, en modifiant le fichier /etc/php.d/apc.ini :

    ; Vertification with ctime will avoid problems caused by programs such as svn or rsync by making
    ; sure inodes have not changed since the last stat. APC will normally only check mtime.
    apc.stat_ctime=1
    

    Puis relancer httpd (systemctl restart httpd.service ou service httpd restart

  • Quand libtool fait échouer la création d'un rpm...

    Normalement, les autotools on plutôt tendance à faciliter la création d'un spec file et d'un rpm... Normalement.

    Mais si parmi les dépendances du programme packagé, il y a une bibliothèque générée avec libtool, et que l'archive libtool suffixée en .la est installée, alors libtool écrira en dur le chemin de la bibliothèque dans le binaire. Et là, c'est le drame :

    ERROR   000X: file '/usr/bin/xxxx' contains an invalid rpath '/usr/local/lib' in [/usr/local/lib]

    Un peu de lecture sur le sujet propose, entr'autres comme solution d'insérer la ligne

    chrpath --delete $RPM_BUILD_ROOT%{_bindir}

    Après la ligne make install