The Daily Shaarli
Soit l'erreur suivante lors d'un apt-get update :
« E: Erreur de GPG : ftp://ftp.uk.debian.org stable-updates InRelease : Les signatures suivantes ne sont pas valables : NODATA 2 »
Solution :
Keep an eye on your /tmp/ -- I had run out of disk space
Dans mon cas, j'avais monté un tmpfs trop petit sur /tmp.
C'est très vicieux comme message d'erreur car ça foire pour une seule distribution d'un dépôt apt (ici : jessie-updates), toujours le même donc on est tenté d'accuser ce dépôt…
Bref, pensez à bien dimensionner vos tmpfs. Attention : bien dimensionner, ça ne veut pas dire de se contenter de doubler/tripler la valeur affichée par un du -hs pour en prévoir l'usage. Nonononono.
Il y a des logiciels (apt, mysql, etc.) qui écrivent de gros fichiers temporaires de manière instantanée (même un while true ne permet pas de les voir avec leur taille complète, pour donner un ordre de grandeur). MySQL y écrit le temps d'une requête (et si vous utilisez tiny tiny rss en conservant beaucoup d'items bah il vous faudra un /tmp de plusieurs centaines de Mo), apt y écrit le temps d'un update, etc.
Pensez aussi à un upload HTTP traité par PHP (fichier ou même envoi d'un billet de blog, voir http://shaarli.guiguishow.info/?ShqsQg ) : le fichier sera temporairement stocké dans /tmp. Votre tmpfs devra donc être plus grand que upload_max_filesize et post_max_size.
Pour rappel : l'espace d'un tmpfs n'est pas pré-réservé : il n'est pas consommé en RAM tant qu'il n'est pas utilisé. Seule la quantité utilisée est consommée en RAM. ;)
Perso :
Sur des machines équipées de SSD (ou de DRBD), je monte aussi des tmpfs là où les applications web écrivent des données temporaires. Genre /var/tmp (mais attention à allouer suffisamment d'espace, genre 50M car mkinitramfs et autres écrivent ici le temps d'une mise à jour), genre tmp et cache de shaarli ou data/cache de dokuwiki ou le système de cache d'un CMS.
Merci à b4n ( http://ban.netlib.re/shaarli/ ) qui a su jouer de la pokéflute auprès d'un moteur de recherche pour obtenir la bonne réponse. \o/ Je ne trouvais rien à part des histoires de proxy ou de corruption de la base de données apt ou du keyring… Et oui, je case pokéflute pour faire genre que je suis à la mode.
Pour la première fois en plus de 10 ans, le S.M.A.R.T. a prédit une panne sur un de mes disques durs ! Une panne parmi toutes les pannes de disques (facilement une bonne 15aine) que j'ai connue !
Comme c'est absolument incroyable (waaaaaah le S.M.A.R.T qui prédit quelque chose ! Cheppa si vous réalisez !) et qu'il faut fêter ça, je me suis dit que j'allais m'intéresser à la configuration de smartd, le démon qui permet de vérifier régulièrement (toutes les trente minutes par défaut, ça se change dans /etc/default/smartmontools) que vos disques durs / SSD vont bien et/ou de vous envoyer un mail ou un message syslog quand ça ne va pas.
Pour une doc' sur la manipulation de smartctl, outil qui permet d'afficher les infos S.M.A.R.T. , j'aime vraiment beaucoup celle d'Ubuntu : https://doc.ubuntu-fr.org/smartmontools .
Pour une doc' sur smartd, le fameux démon que j'ai déjà présenté, la doc' pointée par ce shaarli fait le job.
Et voici, en une ligne, la config smartd.conf que j'utilise (elle me semble être une bonne base de départ) :
/dev/sda -d sat -H -l error -l selftest -s S/../01/./06 -m root
Pourquoi j'indique un disque dur en particulier au lieu de DEVICESCAN qui scannerait tous les disques et trouverait sda ? Parce que, dans mon cas, c'est un serveur qui aura toujours un seul disque dur. Il n'est pas prévu d'en ajouter. Inutile de perdre du temps à scanner et a potentiellement se vautrer.
-d sat permet de préciser le type de disque dur pour pas que smartd utilise des commandes SCSI sur un disque SATA et inversement. En vrai, osef de préciser ça, smartd trouve tout seul le type de disque dans l'écrasante majorité des cas (sauf bug du firmware, quoi). sat signifie que mon sda est derrière un adaptateur SCSI to SATA.
Que fait cette commande ?
Notes :
systemctl reload smartd.service. Un mail bidon doit arriver ;Tout est dans le titre de ce shaarli : encore en 2016, il faut toujours mettre au moins une adresse IPv4 d'un récursif DNS dans /etc/resolv.conf , même en dernière position. Sinon des logiciels seront incapables de résoudre les noms de domaine. Un exemple ? mtr : « No nameservers defined. »
J'avais toujours compris qu'il ne faut jamais utiliser allow-hotplug comme un équivalent à auto dans un fichier interfaces.
Récemment, j'ai encore entendu le contraire mais je ne savais pas argumenter ma version. Maintenant que j'ai la réponse, je la note ici pour ne pas remettre ça en question encore une fois. :-
allow-hotplug n'est pas équivalent à auto.
Pour auto, le man nous dit :
Lines beginning with the word "auto" are used to identify the physical interfaces to be brought up when ifup is run with the -a option. (This option is used by the system boot scripts.)
Pour allow-hotplug, le man nous dit :
Lines beginning with "allow-" are used to identify interfaces that should be brought up automatically by various subsytems. This may be done using a command such as "ifup --allow=hot‐plug eth0 eth1", which will only bring up eth0 or eth1 if it is listed in an "allow-hotplug" line. Note that "allow-auto" and "auto" are synonyms.
Voilà : allow-XXXXXX attend un événement d'un sous-système. Forcément, au boot, on reçoit l'événement "la carte réseau devient up" ce qui donne l'illusion qu'allow-hotplug = auto. Mais, en réalité, allow-hotplug attend un retour de l'API udev. Et si l'on vire udevd ? Une interface en auto continue à monter au boot, une interface en allow-hotplug ne monte plus automatiquement.
Pourquoi virer udevd ?
Attention si vous sauvegardez vos systèmes avec tar. C'est super mega simple et pratique à restaurer mais il y a des petites choses à savoir :
Par défaut, tar sauvegarde les UID et GID sous forme textuelle. Ça veut dire qu'il lit le UID+GID d'un fichier, qu'il regarde à quoi ces ID correspondent dans /etc/{passwd,group} et qu'il sauvegarde les intitulés qu'il a trouvés. Ça suppose deux choses :
1- que l'utilisateur et le groupe existent lors de la restauration ;
2- de créer l'archive sur le système lui-même.
Exemple : si vous sauvegardez vos LXC depuis l'hôte, c'est bien les fichiers /etc/{passwd,group} de l'hôte qui seront utilisés pour faire la traduction numéro->nom, pas les /etc/{passwd,group} de votre LXC donc, quand vous restaurerez votre sauvegarde, vous aurez des fichiers/dossiers qui n'appartiennent pas aux bons utilisateurs, ce qui empêchera les logiciels de démarrer.
Pour éviter cela, il faut utiliser --numeric-owner lors de la sauvegarde.
Par défaut, tar ne sauvegarde pas les file capabilities, ces droits très précis/fins que l'on accorde à une application au lieu de les setuid/setgid (ce qui leur donne plus de droits que ce dont elles ont besoin). L'exemple classique est ping, à qui on attribue la capability « cap_net_raw » pour qu'il puisse créer des sockets raw ICMP.
Pour sauvegarder les capabilites, il faut utiliser --xattrs lors de la sauvegarde. Il y a visiblement une subtilité lors de la restauration : https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=775495 .
Je parle des file capabilites mais c'est la même chose pour les ACL POSIX et/ou les contextes SELinux : tar ne les sauvegarde pas par défaut, il faut le demander explicitement.
Autant réparer une restauration qui n'a pas les bons UID/GID, c'est compliqué sans connaître les permissions d'origine (mais on peut les retrouver depuis les scripts de post-installation mais ça nécessite de retrouver quel package a livré tel fichier/dossier et ça, c'est chiant), autant réparer les capabilites, ça se fait plutôt bien. Les capabilites ne sont pas positionnées dans l'archive tar contenue dans un paquet debian (.deb, tout ça). dpkg ne s'en occupe pas non plus. C'est les scripts de postinstall qui s'en occupent. Il suffit donc de lire tous ces fichiers et de retrouver ceux qui affectent des capabilites : grep -R "setcap" /var/lib/dpkg/info/*.postinst. Il suffit d'exécuter manuellement les commandes setcap que l'on trouve et c'est réglè.
Si vous faites une sauvegarde relative, du genre cd / && tar --exclude='./tmp' --exclude='./dev' -cpJf save.tar.lzma ., ça complique la restauration : il vaut mieux faire : cd / && tar -cpJf save.tar.lzma bin boot [...]. Il faut réaliser la backup depuis la racine si l'objectif de la sauvegarde est de restaurer tout un système d'un coup.
Petite info intéressante qui va dans ce sens : on peut tar xf une arborescence sur un système en fonctionnement (genre cd / && tar xf save.tar.lzma) mais on ne peut pas cp ou mv une arborescence sur un système en fonctionnement (ici, rootfs est le dossier extrait par tar) :
# cp -R rootfs/* /
cp: cannot create regular file '/bin/bash': Text file busy
cp: cannot create regular file '/bin/cp': Text file busy
cp: cannot create regular file '/lib/x86_64-linux-gnu/ld-2.19.so': Text file busy
Je n'explique pas la différence entre tar et cp… tar est aussi lancé par bash et il utilise aussi la libld-2.19 située dans le même répertoire…
