Linux : lister les paquets installés

package-managers

Il peut être intéressant de pouvoir lister les paquets installés sur notre distribution linux.
Par exemple pour en connaitre la version, vérifier si besoin de l’installer.
Nous allons voir comment les lister sur différentes distributions.

Debian

Avec l’outil dpkg

 dpkg --list

On peut utiliser aussi l’outil apt

 apt list --installed

Centos/Redhat

Avec les distribution à base de rpm on utilise yum

yum list installed

Archlinux

Sur Arch, c’est l’utilitaire pacman qui nous permet de gérer nos paquets

 pacman -Q

Nginx : Installer la dernière version / mainline

Nginx

Chaque nouvelle version de Nginx apporte son lot de nouveauté. Par exemple la version 1.9.7 apporte le support du protocole http2. Vous pouvez trouver les différents changements ainsi que les corrections de bug sur le changelog.

J’avais l’habitude d’utiliser la version « stable » de Nginx sur mes serveurs, mais je voulais vraiment offrir le support de http2. J’ai donc décidé de mettre à jour ma version pour passer sur la version « mainline« . Attention si vous utilisez des modules dit de « third-party » ils peuvent devenir incompatible ou apporter des nouveaux bugs.

Nous allons voir une méthode pour passer sur cette version tout en conservant le gestionnaire de paquets de ma distribution linux (apt, yum).

1. Installation de la version mainline sur Centos/Redhat

Nous allons créer le fichier /etc/yum.repos.d/nginx.repo avec ce contenu :

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/OS/OSRELEASE/$basearch/
gpgcheck=0
enabled=1

Il faut modifier OS par rhel ou centos suivant votre distribution et OSRELEASE par 5,6 ou 7 suivant votre version.
Ensuite il faut mettre à jour le paquet Nginx :

 yum update

2. Installation de la version mainline sur Debian/Ubuntu

Pour Debian/Ubuntu nous devons identifier le repository à l’aide d’une clé. Cela va aussi permettre d’eliminer tous les messages d’alertes.

curl http://nginx.org/keys/nginx_signing.key | apt-key add -

On ajoute ensuite le repository. Il faut ajouter ces lignes à la fin du fichier /etc/apt/sources.list.

Pour Debian :

deb http://nginx.org/packages/mainline/debian/ codename nginx
deb-src http://nginx.org/packages/mainline/debian/ codename nginx

Il faut remplacer « codename » par wheezy pour la version 7.x ou jessie pour la version 8.x.

Pour Ubuntu :

deb http://nginx.org/packages/mainline/ubuntu/ codename nginx
deb-src http://nginx.org/packages/mainline/ubuntu/ codename nginx

On remplace « codename » par precise pour la version 12.04, trusty pour la version 14.04, vivid pour la version 15.04 et wily pour la version 15.10

Il ne reste plus qu’à mettre à jour :

apt-get update
apt-get install nginx

3. Test de la version

nginx -v
nginx version: nginx/1.9.10

On peut bien sur, garder ce numéro de version pour nous et ne pas l’afficher dans nos headers http.

Haproxy: activer les logs avec rsyslog

haproxy rsyslog

Il est très intéressant de pouvoir écrire dans un fichier de log les erreurs de HAProxy. Cela peut aussi servir dans le cas d’un debug.

Les logs de HAProxy peuvent être activés en ajoutant cette ligne dans le fichier de configuration haproxy.cfg.

log 127.0.0.1 local0

Il suffit ensuite de créer ce fichier /etc/rsyslog.d/10-haproxy.conf avec le contenu suivant :

$ModLoad imudp
$UDPServerRun 514 
$template Haproxy,"%msg%\n"
local0.=info -/var/log/haproxy.log;Haproxy
local0.notice -/var/log/haproxy.notice;Haproxy

local0.* ~ 

On relance Rsyslog :

/etc/init.d/rsyslog restart

Avec ceci, tous les logs de type info vont être écrit dans le fichier /var/log/haproxy.log.
Les types notice iront dans le fichier /var/log/haproxy.notice.

Pour finir, les fichiers de logs peuvent être tournés via rotatelog, il faut ajouter cette configuration dans /etc/logrotate.d/haproxy :

/var/log/haproxy.log {
    missingok
    notifempty
    sharedscripts
    rotate 14
    daily
    compress
    postrotate
        reload rsyslog >/dev/null 2>&1 || true
    endscript
}

Linux: augmenter la taille de la swap

taille swap

Il peut arriver que la taille de la swap soit rapidement pleine.
Ce n’est généralement pas la meilleur idée que d’utiliser la swap mais dans le cas où l’on a pas le choix, il peut être intéressant de savoir l’augmenter.

1. Création d’un fichier

Pour créer ce fichier d’échange, il va falloir utiliser la commande dd pour convertir et copier des volumes de données.
Ensuite on va créer le fichier file.swap d’une taille de 512Mo à l’aide de la commande suivante:

dd if=/dev/zero of=/file.swap bs=1024 count=512000

Explication : la commande dd crée et copie des zéros dans le fichier file.swap contenant 512000 blocs de 1024 octets chacun,
soit un fichier approximatif de 512 Mo (voir 524 Mo).

2. Création du système de fichier

On utilise à présent « mkswap » pour formater le fichier en tant qu’espace d’échange ou de « swap ».

mkswap /file.swap 512000

Il ne faut pas oublier de passer la taille du fichier à la commande mkswap, de la même taille que celle définie lors de la création du fichier.

3. Activation ou désactivation du fichier d’échange à la volée

Activation de la partition de swap qui s’ajoute à l’existante si elle existe.

swapon /file.swap

la commande « more /proc/swaps » vue plus haut devrait vous montrer le nouvel espace de swap nommé file.swap.

Désactivation de la partition swap.

 swapoff /file.swap

4. Montage définitif de la partition swap

Pour ce la il faut éditer le fichier /etc/fstab et ajouter la ligne suivante:

/file.swap none swap sw 0 0

Centos 7 : Changer le nom du serveur / hostname

centos hostname

Il existe plusieurs méthodes pour changer le nom du serveur sur Centos7 mais l’utilisation de hostnamectl a le mérite d’être rapide et efficace.

On vérifie l’actuel nom :

# hostnamectl status
 Static hostname: serveur.cloud-devops.fr
 Icon name: computer-container
 Chassis: container
 Machine ID: 936a948dfe914bcf821f758a558efce0
 Boot ID: ccf4883b8b594680879a15ad132c7b1b
 Virtualization: openvz
 Operating System: CentOS Linux 7 (Core)
 CPE OS Name: cpe:/o:centos:centos:7

Et pour changer le nom :

# hostnamectl set-hostname nouveaunom.cloud-devops.fr

Et l’on vérifie :

# hostnamectl status
 Static hostname: nouveaunom.cloud-devops.fr
 Icon name: computer-container
 Chassis: container
 Machine ID: 936a948dfe914bcf821f758a558efce0
 Boot ID: ccf4883b8b594680879a15ad132c7b1b
 Virtualization: openvz
 Operating System: CentOS Linux 7 (Core)
 CPE OS Name: cpe:/o:centos:centos:7

rpmdb: Lock table is out of available locker entries

rpm-lock

Cette semaine, j’ai recu un mail de cron de l’un de mes serveurs.

Subject: Cron <root@SERVERNAME>
run-parts /etc/cron.weekly
/etc/cron.weekly/makewhatis.cron:
rpmdb: Lock table is out of available locker entries
rpmdb: Unknown locker ID: b4a0
error: db4 error(22) from db->close: Invalid argument
error: cannot open Pubkeys index using db3 - Cannot allocate memory (12)
..

Il y avait au moins plus de 100 erreurs dans ce mail… Après une petite recherche sur google, je me suis rendu compte que le problème datait d’au moins 6 mois.

Voici la méthode pour réparer :

# tar cvzf rpmdb-backup.tar.gz /var/lib/rpm
# rm /var/lib/rpm/__db.00*
# rpm --rebuilddb
# rpm -qa | sort # pour vérifier que tout fonctionne

Après tout ca, je voulais vérifier que la tache cron fonctionnait.

# sh /etc/cron.weekly/makewhatis.cron

Voilà !

Linux raid : mismatch_cnt is not 0 on /dev/md

Linux raid mismatch_cnt

Sur centos / RHEL :

le cron weekly lance ceci :

run-parts /etc/cron.weekly

ce qui produit de temps en temps l’erreur suivante :

/etc/cron.weekly/99-raid-check:
WARNING: mismatch_cnt is not 0 on /dev/md2

Cela provient du fait qu’il y a des blocs non synchronisés.
Pour le réparer il faut lancer en root :

echo repair >/sys/block/mdX/md/sync_action

attendre que sync_action revienne à idle puis

echo check >/sys/block/mdX/md/sync_action

Le prochain cron ne généra plus d’erreurs.

Nginx: cacher la version dans les headers http

nginx-logo

Par défaut, Nginx affiche sa version dans les headers http. On peut pour des raisons de veilles versions ou de vulnérabilités vouloir cacher cette version.

Par défaut nous avons ceci :

$ curl -I https://www.cloud-devops.fr/
HTTP/1.1 200 OK
Server: nginx/1.9.10
Date: Fri, 05 Feb 2016 20:57:50 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
Vary: Accept-Encoding

Si l’on veut ne plus afficher la version 1.9.10, il faut ajouter dans le bloc « http » l’option :

server_tokens off;

Après un restart de Nginx, nous obtenons ceci :

$ curl -I https://www.cloud-devops.fr/
HTTP/1.1 200 OK
Server: nginx
Date: Fri, 05 Feb 2016 21:04:09 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
Vary: Accept-Encoding

Voilà ça fonctionne ! Notre version de Nginx est maintenant masquée aux utlisateurs.