Sysctl
Sysctl est une interface qui permet d'examiner et de modifier dynamiquement les paramètres des systèmes d'exploitation BSD et Linux. La mise en œuvre en est très différente entre les deux systèmes.
Linux
modifierSous Linux, le mécanisme d'interface sysctl est également exporté comme une partie de procfs dans le répertoire /proc/sys. Cette différence signifie que la vérification de la valeur de certains paramètres nécessite d'ouvrir un fichier dans le système de fichiers virtuel, de lire et d'interpréter son contenu, puis de le fermer. L'appel système sysctl existe sous Linux, mais n'est pas encapsulé par une fonction de la glibc et son usage est déconseillé[1].
BSD
modifierSous BSD, ces paramètres sont en général, des objets d'une Management Information Base (MIB) qui décrit les limites des valeurs modifiables telles que la taille d'un segment de mémoire partagée, le nombre de threads que le système d'exploitation utilisera en tant que client NFS, ou encore le nombre maximum de processus sur le système; ou qui décrit, active ou désactive des comportements tels que la redirection de ports, des restrictions de sécurité sur le super-utilisateur (le niveau de sécurité ou "securelevel"), ou l'affichage d'informations de débogage.
En général sur BSD, un appel système (ou une encapsulation) est fourni pour être utilisé dans les programmes, de même qu'un logiciel d'administration et un fichier de configuration (pour définir les paramètres modifiables, au démarrage du système).
Cette fonctionnalité est apparue dans BSD 4.4. Elle permet de modifier dynamiquement les paramètres, sans nécessiter de recompiler le noyau, comme c'est le cas pour les constantes codées en dur.
Performances : comparaison entre BSD et linux
modifierRésumé
modifierLes appels à sysctl de Linux sont moins performants que ceux de BSD, mais Linux fait peu d'appels à sysctl ; par conséquent, dans la plupart des cas, cela n'a pas d'impact sur les performances de Linux.
Détails
modifierDans BSD, l'appel système est implémenté directement dans le noyau, comme décrit dans la page de manuel de sysctl(3)[2]. Dans Linux, sysctl est implémenté comme une encapsulation autour des routines d'accès aux fichiers du répertoire /proc. En conséquence, il est beaucoup plus coûteux d'utiliser l'interface sysctl sous Linux.
Ceci se constate facilement avec les outils de surveillance système. Sous Linux, lancer top et maintenir la barre espace pour forcer un rafraîchissement rapide, utilise une grande quantité de temps CPU, ce qui n'est pas le cas avec les systèmes BSD.
Sous Linux, les interfaces sysctl ne sont généralement pas appelées fréquemment ou de manière répétée, donc cette perte de performance est rarement significative.
Exemples
modifierQuand la redirection de ports est activée, le système d'exploitation agira comme un routeur. Dans FreeBSD, NetBSD, OpenBSD, DragonFly BSD, et Darwin/Mac OS X, le paramètre net.inet.ip.forwarding peut être défini à 1 pour activer ce comportement. Dans l'émulation de sysctl de Linux, ce paramètre est appelé net.ipv4.ip_forward.
Dans la plupart des systèmes, la commande sysctl -w paramètre=1 activera un comportement particulier. Il restera activé jusqu'au prochain redémarrage. Si le comportement doit être activé à chaque démarrage, la ligne paramètre=1 peut être ajoutée ou modifiée dans le fichier /etc/sysctl.conf. De plus, certaines variables de sysctl ne peuvent pas être modifiées après que le système ait redémarré. Ces variables doivent être soit définies statiquement dans le noyau lors de la compilation ou définies dans /boot/loader.conf. Ceci dépend de la variable et de la version du système.
Références
modifier- (en) « Sysctl(2) : read/write system parameters - Linux man page », sur die.net (consulté le ).
- « Sysctl(3) », sur freebsd.org (consulté le ).
Liens externes
modifier- http://www.openbsd.org/cgi-bin/man.cgi?query=sysctl(3) page de man via OpenBSD
- http://sysctl.enderunix.org
- Exemple de Sysctl.conf pour BSD
- Exemple de Sysctl.conf pour Linux
- sysctl-explorer.net Un accès simplifié à la documentation des sysctl Linux (en anglais)