Besoin de debug un programme qui se met rapidement à bouffer toute la RAM ? Pas besoin de dégainer du cgroup ou autre, un bon vieux ulimit fait très bien l'affaire. L'option à retenir c'est -S :
$ ulimit -Sv 500000 # Set ~500 mb limit
Attention, plus possible de faire de l'indirect rendering OpenGL par défaut apparemment…
Il semblerait que ça casse OpenGL complètement en SSH -X lorsque le serveur n'est pas sous mesa (nvidia proprio par exemple) ?!
En tous cas ça ça fonctionne plus :
LIBGL_ALWAYS_INDIRECT=1 glxinfo
Script perl qui regarde quels processus utilisent encore des libs qui ont disparu depuis leur démarrage (mises à jour).
Liste :
needrestart -r l -v
(le -v affiche de quelles libs il est question, et comment il est arrivé à la conclusion que ces services-là doivent être relancés (ou ignorés : cas d'un process lancé à la main en session utilisateur)).
Par exemple pour une instance picomon "ban" lancée par systemd :
[main] #183 exe => /usr/bin/python3.4
[Core] #183 is a NeedRestart::Interp::Python
[Core] #183 source is /usr/local/bin/picomon
[main] #183 is picomon@ban.service
On peut aussi directement lui faire relancer les services, avec -r i (ou rien, c'est par défaut). On a alors soit un debconf qui permet de sélectionner les service que l'on souhaite (tous pré-cochés sauf certains comme journald ou dbus), soit une ligne-question par services.
needrestart est packagé dans Debian (depuis Jessie et wheezy-backports) et intègre des hooks pour apt/dpkg.
Envie de monter automatiquement un disque/clef USB à distance ? Polkit/whatever demande un mot de passe malgré le groupe "plugdev" ?
Il suffit de dropper un petit fichier en root et pouf udisksctl fait son job.
J'ai fait comme dit dans le post lié :
dans /etc/polkit-1/localauthority/50-local.d/auto-mount.pkla
[Allow Automount]
Identity=unix-group:plugdev
Action=org.freedesktop.udisks2.filesystem-mount
ResultAny=yes
ResultInactive=yes
ResultActive=yes
et hop ! :)
Ici une explication que j'ai trouvée a posteriori après avoir galéré facile une heure : pourquoi grep semble ne pas fonctionner quand il grep sur quelque chose qui ne termine pas, et dans une autre commande ? Par exemple :
while true; do echo a; sleep 1; done | grep '' | cat
=> rien
while true; do echo a; sleep 1; done | grep ''
=> fonctionne
Dans mon cas c'était inotifywait, grep, while read mais c'est bien pareil.
La réponse est toute bête mais il fallait y penser (ou lire tout le man de grep, merci ban :)) : buffer sur stdout. grep se fait bufferiser sa sortie, ce qui est tout à fait normal. Il suffirait d'attendre plein d'événements dans le pipe pour les voir arriver. Et le fait d'avoir un terminal au bout masque ça car il bufferise pas plus qu'un ligne.
Bref, il suffit de dire "--line-buffered" à grep :)
Envie d'éteindre la petite LED de la caméra d'un Raspberry Pi ? On trouve toutes sortes de chose, moi un coup de echo dans un dev ça me va bien :P
FTR:
sudo sh -c 'echo "32" > /sys/class/gpio/export'
sudo sh -c 'echo "out" > /sys/class/gpio/gpio32/direction'
Turn the LED off:
sudo sh -c 'echo "0" > /sys/class/gpio/gpio32/value'
Turn the LED on:
sudo sh -c 'echo "1" > /sys/class/gpio/gpio32/value'
Fonctionne sur un Pi2B aussi.
Suite à une discussion AFK où on se demandait comment marchaient les shebang (#! au début d'un script), voici un site avec des explications en long, en large et en travers, avec même un historique et un tableau expliquant comment ça se passe pour pleeeein de systèmes et selon les versions.
C'est donc bien au niveau du noyau, au moment de l'exec, quand le noyau détermine le format binaire du fichier. Si le format n'est pas compris (un script sans shebang) c'est le shell qui réagit et essaye de l'interpréter lui-même (car exec* lui aura renvoyé un ENOEXEC).
À noter qu'apparemment le shebang récursif (l'interpréteur est lui-même un script avec shebang) n'est pas très répandu parmi les unix (mais est supporté par Linux), et que en général tous les arguments sont repris tels quels, sans séparation (on aura donc un seul argument côté interpréteur en plus du nom du fichier, quel que soit le shebang).
Le code Linux est ici : https://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/tree/fs/binfmt_script.c
Le parcours des différents formats est ici : search_binary_handler() sur http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/fs/exec.c
Petit test (Linux 3.16), un shebang récursif (2 niveaux) fonctionne bien, met bien tous les arguments en un seul. Par contre si le 2e script n'a pas de shebang, il se passe juste rien et le code de retour de bash est 0.
J'utilise lsyncd chez moi pour copier automatiquement certains dossiers sur mon serveur, pour backup. Quand un fichier est créé ou modifié, il est immédiatement rsync (déclenchement par inotify).
Donc je suis reparti dessus pour un autre usage : un système d'acquisition générant des images pendant longtemps, et dont la personne voulait repartir avec les données rapidement après la fin de l'acquisition. Sauf que copier de gros datasets sur un disque externe risque d'être long. L'idée est donc de copier au fur et à mesure, comme ça le disque sera prêt dès la fin de l'acquisition.
Il y a une option peu documentée (mais tout de même dans le man) : direct. Du coup, plus de rsync ou quoi, il spawn juste un bête cp quand il faut \o/
On peut donc utiliser quelque chose comme :
lsyncd -nodaemon -log all -delay 30 -direct /chemin/dossier/source /ailleurs/destination
lsyncd fait alors un premier rsync pour synchroniser l'ensemble puis copie au fur et à mesure.
Pour désactiver un périphérique bloc (clef / disque USB, …), au lieu d'eject on peut utiliser la méthode moderne (avec du polkit dedans !) :
udisksctl power-off -b /dev/sda
Ceci demandera le mot de passe même en SSH à distance, avec un version texte de l'écran "polkit" qu'on connait.
Tableau de comparaison de libc Linux écrit par l'auteur d'une d'elles, musl (donc pas forcément impartial). J'ai trouvé intéressant quand même, rien que pour la liste des points de comparaison choisis et les notes sur les tests effectués.
Upgrade wheezy vers jessie dans un conteneur LXC sur un host lui-même déjà en jessie ? Et sans cracher sur systemd ? Facile, il suffit de rajouter à la config LXC les deux lignes proposées ici (le reste sur getty/udev est déjà de base ou inutile).
lxc.autodev = 1
lxc.kmsg = 0
Nouvelle adresse du debian kit (a changé à cause de dyndns, comme moi en fait) ? Drôle d'adresse. L'appli sur f-droid ne fonctionne plus vraiment non plus du coup.
Pour réinstaller après un wipe des data, il suffit de relancer la shar, qui se ré-extraiera et détectera qu'une image existe déjà donc ne la supprimera pas et ne lancera pas le debootstrap. Pour ensuite ré-intégrer les scripts au système, il suffit de faire :
/data/local/deb/mk-debian -u
Et voila, tout repart comme avant.
DriveDroid, c'est une petite appli android qui permet de faire apparaître l'ordinateur comme une clef USB contenant une ISO/image quelconque. Sauf que pas sur f-droid (mais apk dispo) et nécessitant forcément les droits root on hésite à l'utiliser sans plus de confiance que cela…
Sur ce lien, l'auteur a dit grosso-modo ce que l'appli fait (deux coups de echo dans des dev en gros) et ça marche ! Donc j'ai vite-fait écrit un petit script qu'on peut poser dans /system/bin par exemple :
vim /system/bin/usbloadfile
<CONTENU>
FILE=$1
if [ "$FILE" = "-u" ]; then
echo > /sys/devices/virtual/android_usb/android0/f_mass_storage/lun0/file
else
if [ -r "$FILE" ]; then
echo "mass_storage" > /sys/devices/virtual/android_usb/android0/functions
echo "$FILE" > /sys/devices/virtual/android_usb/android0/f_mass_storage/lun0
/file
else
echo "Non-readable '$FILE'"
fi
fi
</CONTENU>
chmod 750 /system/bin/usbloadfile
… et zou on a moyen de faire apparaître une ISO d'une distro par exemple, ou encore l'image d'un chroot Debian.
En pratique chez moi, je peux même "monter" deux fichiers, car j'ai lun0 et lun1 disponibles. Je sais pas trop comment ça marche par contre, d'avoir adb et deux fichiers sur le même port USB, mais c'est sûr que ça marche.
Un peu de doc sur l'API gadget : http://www.linux-usb.org/gadget/
Un how-to un peu plus prolixe que le lien shaarlié : http://www.linuxembedded.fr/2013/02/how-to-android-mass-storage-usb-gadget/
La page du projet DriveDroid : http://softwarebakery.com/projects/drivedroid
J'avais denyhosts depuis le début sur mon serveur @home mais ça a été supprimé de jessie. Je me suis dit que je m'en fichais pas mal au final, c'est pas de la sécurité ou quoi c'est surtout pour pas se faire pourrir les logs.
Là j'ai dû plonger dans /var/log/auth.log au boulot et… ouah du spam en continu, c'est bien casse-pieds pour suivre. Le moment de se plonger dans fail2ban donc !
Bah c'est tout bête comme dit dans l'article cité, et ça a l'air plus évolué.
Exemple, on peut afficher le statut actuel du ban sur SSH :
$ sudo fail2ban-client status ssh
Status for the jail: ssh
|- filter
| |- File list: /var/log/auth.log
| |- Currently failed: 1
| - Total failed: 219
- action
|- Currently banned: 1
| - IP list: 45.114.11.50
- Total banned: 1
Pour ajouter des plages IP à ne pas bannir, on peut copier le jail.conf dans jail.local comme suggéré et juste laisser "ignoreip", pour override. Ensuite :
fail2ban-client reload ssh
et vérif :
fail2ban-client get ssh ignoreip
Pas mal le reload sélectif et la verif en CLI ! :)
Pour set le MTU d'un bridge, il suffit que toutes les interfaces qu'il comprend le supporte. Il prend le plus haut.
De la page citée, Il faut utiliser la version post-up, car le man (bridge-utils-interfaces) dit : "These ports are the interfaces that are part of the bridge, and they shouldn't have any stanzas defining them on the interfaces file."
Donc en gros :
post-up ip link set mtu 9000 dev eth-10G-1
NTP qui segfault sur un Kimsufi avec grsec sous ubuntu 12.04 ? D'après un strace c'est juste après un "Deleting interface" en IPv6. Naïvement, on désactive IPv6 (avec une directive "interface ignore"), et hop ça segfault plus, youpi…
Sauf que quelques temps plus tard, on a toujours du drift ! Un ntpq -p montre qu'il se sync avec rien du tout… et en fait dans le log, on voit qu'il listen sur juste rien… il faut réactiver IPv4 explicitement, avec une directive "interface listen". joie.
Alternative potentiellement intéressante aux drivers de bonding d'interface réseau de Linux. À suivre, apparemment il y a des tentatives de support dans systemd-networkd donc c'est plus ou moins en train de prendre de l'essort.
machinectl n'a pas de moyen simple d'entrer dans un conteneur qui tourne (comme vzctl enter quoi). Mais la solution est toute simple, puisque ce sont de simples cgroups, on peut entrer dans l'environnement d'une VM "à la main", avec une commande qui s'appelle nsenter. Ici un exemple clair :)
A marché chez moi : sudo nsenter -t 1210 -m -u -i -n
§ "Overriding vendor settings"
Je savais qu'on pouvait override une unit systemd fournie par le mainteneur d'un paquet par exemple en la copiant/modifiant dans /etc. En fait on peut aussi n'override qu'un paramètre à la fois : un dossier de config drop-in est prévu !
Donc si on veut juste changer un truc dans une unit, on peut "dériver" de l'unit de base et changeant le paramètre que l'on veut. C'est ce que fait systemctl set-propery.
Un show sur le service montre alors la liste des config drop-in du service :
Drop-In: /etc/systemd/system/systemd-nspawn@jessie.service.d
└─50-MemoryLimit.conf
À faire aussi pour LXC ou les containers nspawn systemd si on veut gérer des limites mémoire.
Avec systemd, quand on a le comptage mémoire par cgroup, on peut utiliser systemd-cgtop pour voir la consommation mémoire de chaque service/slice.
Par contre si on met une limite vraiment basse à un nspawn, on a une erreur inattendue :
Failed at step EXEC spawning /usr/bin/systemd-nspawn: Argument list too long