Skip to content

Linux Attitude

Le libre est un état d'esprit

Archive

Category: Sysadmin

Niveau :      
Résumé : molly-guard

Je suis sûr qu'un certain nombre d'entre vous ont plusieurs machines en production. Et je suis certain que vous les gérez toutes à distance (merci ssh).

Le risque est grand lorsqu'on a des machines distantes de confondre un terminal avec un autre. Vous pouvez bien sûr personnaliser un prompt différent pour chaque machine, mais je vous propose aujourd'hui une autre solution.

$ apt-get install molly-guard

Et voilà !

Maintenant les commandes shutdown, halt et reboot vous demanderont de taper le nom de la machine que vous voulez vraiment éteindre avant de le faire. Ouf, le serveur mail/dns/web de l'entreprise ne sera pas éteint par erreur à la place de votre serveur de base de données de test.

Cerise sur le gateau, ceci n'arrive pas si vous êtes sur un terminal local sur la machine, puisque vous êtes sensés savoir où vous êtes.

Exercice pratique, faites de même pour les quelques (elles doivent rester rares) commandes critiques sur vos machines.

Niveau :      
Résumé : pam_exec

Vous souvenez-vous de PAM (Pluggable Authentication Modules) ? En plus des nombreux modules déjà présentés, on trouve pam_exec qui permet d'exécuter une commande arbitraire. A partir de là on peut faire pas mal de choses, comme par exemple une notification à chaque session ouverte par un utilisateur (connexion ssh, su, sudo, etc.).


Notification de connexion

Nous allons créer une règle utilisant le module pam_exec pour exécuter un script de notification à l'ouverture d'une nouvelle session.


Script de notification

D'après le manuel de pam_exec, les informations PAM sont passées au script à l'aide des variables d'environnement : PAM_RHOST, PAM_RUSER, PAM_SERVICE, PAM_TTY, PAM_USER et PAM_TYPE. Concevons donc un script simple qui :

  • ne s'intéresse qu'au cas de l'ouverture d'une nouvelle session, soit le type PAM open_session
  • récupère les informations et les envoie par mail à l'administrateur

continue reading...

Niveau :      
Résumé : xvkbd

Les tablettes et les smartphone ont le vent en poupe. Ces petites choses sont uniquement tactiles, elles n'ont pas de clavier physique. Si vous vous amusez à mettre une linux dessus, vous devrez utiliser un serveur ssh pour taper des commandes.

Bon supposons un cas bien plus courant: vous avez perdu votre clavier ... Ce genre de cas est prévu !

L'outil xvkbd vous permet de faire un clavier virtuel. Peu esthétique, mais bien pratique. Pour le lancer :

$ xvkbd

Wahoo trop fort. Maintenant les détails. On veut un clavier en français, donc avant de le lancer :

$ echo "xvkbd.customization:-french" | xrdb

Avec xrdb vient fichier de configuration : ~/.Xdefaults, pensez à y mettre votre entrée xvkbd pour ne pas avoir à taper la commande à chaque fois.

Ensuite on veut éviter de cliquer tout le temps sur une touche sans le vouloir, cliquez sur la touche en bas a droite du clavier "xvkbd", puis "Property..." et là vous avez l'option "automatic clic" qui vous permet de dire au bout de combien de temps d'immobilité du pointeur le clic se fait tout seul. Mettez le à off ou à une valeur assez longue.

En pratique les conf de xvkbd vont dans le fichier ~/.xvkbd

Et voilà ! clavier

Et enfin si comme moi vous avez un window manager qui change le focus avec le mouvement de la souris (ce qui n'est pas une bonne idée si vous n'avez que la souris), vous devrez cliquer sur "Focus", puis sur la fenêtre avant de commencer à l'utiliser, pour être sûr que les touches vont bien à la bonne fenêtre.

Et si vous n'avez pas de clavier, lancez-le automatiquement au démarrage, ce serait dommage d'avoir besoin d'un clavier pour le lancer.

Niveau :      
Résumé : tmpreaper ; find

Tout le monde a de vieux fichiers qui trainent. Mais rare sont ceux qui savent lesquels supprimer.

Je vous propose une solution simple : tmpreaper, du package éponyme.

Comme son nom l'indique cette commande a été inventée pour vider /tmp régulièrement. C'est assez pratique sur un serveur qui n'est quasiment jamais rebooté ou une machine dont le /tmp est persistent.

Son principe de base est de lister les fichier n'ayant pas été accédés depuis longtemps. Attention, son installation le met directement en place sur /tmp sous forme de cron.

Pouvez-vous dire mieux ?

Mieux !

Vous pouvez l'utiliser pour votre home pour savoir ce qui ne sert à rien et nettoyer un peu ce bazar qui commence à dater. En effet, par défaut ce qui est testé c'est la date d'accès, pas la date du fichier lui-même. Un fichier peut être très vieux et très utilisé. Par contre les fichiers qui n'ont jamais été ouvert sont probablement inutiles.

Pour avoir la liste des vieux fichiers :

$ /usr/sbin/tmpreaper --test 365d ~

Puis enlevez le --test pour vraiment supprimer.

Mais pourquoi utiliser tmpreaper ? On a déjà find, c'est juste un peu moins rigolo :

$ find ~ -atime +365

Et pour supprimer :

$ find ~ -atime +365 -exec rm {} \;

Niveau :      
Résumé :

Vous avez des VM linux ? Si le système de vm dispose d'un outil de compactage de disque (vmware en a un), vous pouvez l'aider depuis votre VM :

# avec un accès au device non monté :
$ apt-get install zerofree
$ zerofree /dev/sda1

Vous avez perdu votre clé publique ssh mais vous avez encore votre clé privée en backup ? Pas de panique :

$ ssh-keygen -y -f .ssh/id_rsa

Si vous avez debian et qu'un paquet met un fichier quelque part alors que vous voudriez le voir ailleurs (pour le remplacer par exemple) :

$ dpkg-divert --add --rename --divert /checmin/fichier.xxx /chemin/fichier

Debian ou ubuntu ? amusez-vous :

$ aptitude moo; a="v"; for i in {1..6}; do aptitude -$a moo; a="v$a"; done

PS : Pour ceux qui me suivent depuis un planet, n'oubliez pas que certains post n'y sont pas publiés car pas dans la ligne éditoriale d'un planet, par exemple le dernier http://linux-attitude.fr/post/perle....

PPS : Et pour ceux qui ont oublié, je publie ce genre d'astuces rapides sur twitter tous les matins @peckpeck

Niveau :      
Résumé : setcap ; getcap ; getpcaps

Sous linux la gestion des droits des processus est héritée de posix et donc extrêmement simple.

Si on exclut les modules de sécurité comme SELinux, il n'y a que deux systèmes. Seul le premier est véritablement connu.

Les droits unix

Un processus porte en lui-même 2 informations associées à ses droits : un utilisateur et un groupe. Ceux-ci permettent de déterminer ses actions possibles sur les fichiers (donc partout puisque tout est fichier) avec les attributs correspondants.

Malheureusement tout n'est pas fichier, pour le reste il existe une distinction entre les processus d'uid 0 (root) et les autres. Cette distinction donne des droits supplémentaires au processus root lors de ses appels système, par exemple l'écoute sur un port inférieur à 1024 ou la possibilité de redémarrer une machine.

Ces droits sont hérités d'un processus à un autre sauf dans 2 cas :

  • un fichier exécuté a le bit suid alors on change l'uid du processus (augmentation des droits en général vers root)
  • le processus a l'uid root et demande à en changer (réduction des droits, par exemple pour login)

Les capabilities

C'est ici que ça devient intéressant. Sous linux, un processus dispose aussi d'un ensemble de droits spécifiques que peu de gens connaissent.

En supposant que votre noyau soit compilé pour (c'est en général le cas), il associera à chaque processus (pour être précis, chaque thread) un champ de bits lui listant ses droits (dont celui de garder le silence). Ce champ est hérité d'un processus à un autre et, miracle, il peut être associé à un fichier exécutable comme le bit suid.


continue reading...

Niveau :      
Résumé : quelques ordre de grandeur

Voici quelques ordre de grandeur qui vous permettront d'avoir les idées un peu plus claires sur les performances de votre système. Imaginez que le swap est 100 000 fois plus lent que la mémoire du processus ! Qu'un algorithme de création d'arbre peut être plus lent qu'un algorithme linéaire si chaque nœud de l'arbre se retrouve sur une page différente (pensez à vos centaines de malloc pour remplir un arbre) !

Valable en 2010
ObjetLatenceDébit
Internet80 ms2 Mo/s
Accès au swap8 ms50 Mo/s
Disque10krpm3 ms50 Mo/s
Ethernet gigabit1 ms100 Mo/s
Disque SSD0.5 ms100 Mo/s
fork0.1 ms
context switch3 µs
gettimeofday1 µs
Interface pci0.1 µs133 Mo/s
malloc/mmap0.1 µs
RAM30 ns8 Go/s
Interface pci-express 16x10 ns8 Go/s
Cache L25 ns
Cache L11 ns
Registre processeur0.3 ns40 Go/s

Notez que l'important ce sont les ordres de grandeur, vous pouvez facilement trouver des éléments qui font le double ou la moitié de ces performances.

Interprétations

Sérieusement, pas besoin de giga de swap sur votre serveur. Mettez un tout petit peu et vous monitorez dès que ca dépasse, imaginez la division par un nombre à 5 chiffres du nombre de pages vues sur votre serveur ! Pour ma part je préfère répondre à moins de requêtes par seconde et garder un serveur utilisable.

Mais sur votre station de travail vous faites ce que vous voulez, on est en général plus patient :-)

Pas de gettime à gogo dans votre code pour mesurer les perf, ça tue les perfs ...

Le réseau fait a peu près aussi bien que votre disque.

Pas de malloc à gogo pour des structures morcelées et très utilisées. faites une structure unique si vous devez en avoir beaucoup.

Le SSD c'est bien mais ca vaut pas l'accès direct au flash.

Étant donné la vitesse de compression un swap compressé peut vraiment valoir le coup.

Le cache processeur sert vraiment à quelque chose ... si on sait coder pour qu'il soit utilisé (ou laisser le compilateur faire).

Le fork c'est un peu lent, prévoyez un prefork correct sur vos applications fréquemment appelées.

Avoir beaucoup de processus n'est pas si coûteux en soi (context switch).


PS : Si vous avez des données pour compléter ce tableau, n'hésitez pas à me laisser des commentaires.