Comment les développeurs du noyau Linux testent-ils leur code localement et après l'avoir validé? Utilisent-ils une sorte de test unitaire, d’automatisation de la construction? plans de test?
Le noyau Linux est fortement axé sur les tests de communauté.
Généralement, tout développeur testera son propre code avant de le soumettre, et il utilisera souvent une version de développement du noyau de Linus, ou l’un des autres arbres instables/de développement pour un projet en rapport avec son travail. Cela signifie qu'ils testent souvent leurs modifications et celles des autres.
Il n’ya généralement pas beaucoup de plans de tests formels, mais des tests supplémentaires peuvent être demandés avant la fusion des fonctionnalités dans des arborescences en amont.
Comme Dean l'a souligné, il existe également des tests automatisés, le projet de test linux et le autotest du noya ( bonne vue d'ensemble ).
Les développeurs écriront souvent des tests automatisés pour tester leurs modifications, mais je ne suis pas sûr qu'il existe un mécanisme (souvent utilisé) pour collecter de manière centralisée ces tests ad hoc.
Cela dépend beaucoup de la zone du noyau à modifier, bien entendu. Les tests que vous effectuez pour un nouveau pilote réseau sont très différents de ceux que vous feriez lors du remplacement de l'algorithme de planification principal.
Naturellement, le noyau lui-même et ses composants ont été testés avant la publication, mais ces tests ne couvrent que les fonctionnalités de base. Il existe certains systèmes de test qui testent le noyau Linux:
Le projet de test Linux (LTP) fournit des suites de tests à la communauté open source qui valident la fiabilité et la stabilité de Linux. La suite de tests LTP contient un ensemble d’outils permettant de tester le noyau Linux et ses fonctionnalités. https://github.com/linux-test-project/ltp
Autotest - un cadre pour des tests entièrement automatisés. Il est principalement conçu pour tester le noyau Linux, bien qu'il soit utile à de nombreuses autres fins, telles que la qualification de nouveau matériel, les tests de virtualisation et d'autres tests de programmes d'espace utilisateur en général sur des plates-formes Linux. Il s'agit d'un projet open-source sous licence GPL. Il est utilisé et développé par un certain nombre d'organisations, notamment Google, IBM, Red Hat et bien d'autres. http://autotest.github.io/
Il existe également des systèmes de certification développés par certaines grandes sociétés de distribution GNU/Linux. Ces systèmes vérifient généralement la compatibilité des versions complètes des distributions GNU/Linux. Il existe des systèmes de certification développés par , Novell, Red Hat, Oracle, Canonical et Google .
Il existe également des systèmes d'analyse dynamique du noyau Linux:
Kmemleak est un détecteur de fuite de mémoire inclus dans le noyau Linux. Il fournit un moyen de détecter les éventuelles fuites de mémoire du noyau de la même manière qu'un récupérateur de mémoire de suivi, à la différence que les objets Orphan ne sont pas libérés, mais uniquement signalés via/sys/kernel/debug/kmemleak.
Kmemcheck intercepte chaque lecture et écriture en mémoire allouée dynamiquement (c'est-à-dire avec kmalloc ()). Si une adresse mémoire qui n'a pas encore été écrite est lue, un message est imprimé dans le journal du noyau. Fait également partie du noyau Linux
Fault Injection Framework (inclus dans le noyau Linux) permet d'infuser des erreurs et des exceptions dans la logique d'une application pour obtenir une couverture et une tolérance aux pannes plus élevées du système.
Comment les développeurs du noyau Linux testent-ils leur code localement et après l'avoir validé?
Utilisent-ils une sorte de test unitaire, d’automatisation de la construction?
Dans le sens classique des mots, non.
Par exemple. Ingo Molnar exécute la charge de travail suivante: 1. construit un nouveau noyau avec un ensemble aléatoire d'options de configuration 2. démarre dedans 3. goto 1
Chaque génération échoue, échoue au démarrage, un bogue ou un avertissement d'exécution est traité. 24/7. Multipliez-le par plusieurs cases et vous pourrez découvrir de nombreux problèmes.
plans de test?
Non.
Il peut y avoir un malentendu qu'il existe une installation de test centrale, il n'y en a pas. Tout le monde fait ce qu'il veut.
Outils en ligne
Un bon moyen de trouver des outils de test dans le noyau consiste à:
make help
et lire toutes les ciblesDans la v4.0, cela m'amène à:
kselftest sous tools/testing/selftests . Courir avec make kselftest
. Doit déjà exécuter le noyau construit. Voir aussi: Documentation/kselftest.txt , https: //kselftest.wiki.kernel.org/
ktest sous tools/testing/ktest . Voir aussi: http: //elinux.org/Ktest , http: //www.slideshare.net/satorutakeuchi18/kernel-auto-testbyktkt
Analyseurs statiques section de make help
, qui contient des cibles telles que:
checkstack
: Perl: que fait checkstack.pl dans les sources linux?coccicheck
pour Coccinelle (mentionné par askb )Noyau CI
https: //kernelci.org/ est un projet qui vise à rendre le test du noyau plus automatisé et visible.
Il semble ne faire que construire et démarrer des tests (TODO comment vérifier automatiquement que le démarrage a fonctionné La source devrait être à https: //github.com/kernelci/ ).
Linaro semble être le principal responsable du projet, avec les contributions de nombreuses grandes entreprises: https: //kernelci.org/sponsors/
Linaro Lava
http: //www.linaro.org/initiatives/lava/ ressemble à un système d'infrastructure de confiance axé sur le développement de la carte de développement et du noyau Linux.
ARM Lisa
https: //github.com/ARM-software/Lisa
Je ne sais pas ce qu’il fait en détail, mais c’est par ARM et Apache Licensed, ce qui mérite probablement un coup d’œil.
Démo: https: //www.youtube.com/watch? V = yXZzzUEngiU
Débogueurs d'étape
Pas vraiment de tests unitaires, mais peut vous aider une fois que vos tests commencent à échouer:
Mon propre QEMU + Buildroot + Python
J'ai également démarré une configuration axée sur la facilité de développement, mais je lui ai également ajouté quelques fonctionnalités de test simples: https: //github.com/cirosantilli/linux-kernel-module-cheat/tree/8217e5508782727320259696dcbaf9a6b3141724 # test-this-repo
Je n'ai pas analysé en détail toutes les autres configurations, et elles en font probablement beaucoup plus que les miennes, mais je pense que ma configuration est très facile à démarrer rapidement car elle contient beaucoup de documentation et d'automatisation.
Ce n'est pas très facile d'automatiser les tests du noyau. La plupart des développeurs Linux effectuent eux-mêmes les tests, un peu comme le fait remarquer adobriyan.
Cependant, il y a quelques choses qui aident au débogage du noyau Linux:
Ensuite, les développeurs demandent généralement aux autres utilisateurs de vérifier leurs correctifs. Une fois que les correctifs sont examinés localement et que rien ne les gêne, et que les correctifs sont testés pour fonctionner avec le dernier noyau de Linus sans rien casser, les correctifs sont poussés en amont.
Edit: Voici une vidéo de Nice détaillant le processus suivi par un correctif avant son intégration dans le noyau.
Outre les points ci-dessus/ci-dessous, l'accent est mis davantage sur les tests de fonctionnalité, les tests de certification du matériel et les tests de performance du noyau Linux.
De nombreux tests sont en fait effectués à l'aide de scripts, d'outils d'analyse de code statique, de révision de code, etc., ce qui est très efficace pour détecter les bogues, ce qui autrement casserait quelque chose dans l'application.
Sparse - Outil à code source ouvert conçu pour rechercher les erreurs dans le noyau Linux.
Coccinelle est un autre moteur de correspondance et de transformation qui fournit le langage SmPL (Semantic Patch Language) permettant de spécifier les correspondances et les transformations souhaitées dans le code C.
checkpatch.pl et autres scripts - Des problèmes de style de codage sont disponibles dans le fichier Documentation/CodingStyle de l’arborescence du noyau. La chose importante à retenir lors de la lecture n'est pas que ce style est meilleur que tout autre style, mais qu'il est cohérent. Cela aide les développeurs à trouver et à résoudre facilement les problèmes de style de code. Le script scripts/checkpatch.pl de l’arborescence du noyau a été développé. Ce script peut signaler des problèmes facilement et doit toujours être exécuté par un développeur sur ses modifications, au lieu de laisser un relecteur perdre son temps en signalant les problèmes ultérieurement.
Il y a aussi:
MMTests qui est une collection de points de repère et de scripts pour analyser les résultats
https://github.com/gormanm/mmtests
Trinité qui est testeur de fuzz appel système Linux
http://codemonkey.org.uk/projects/trinity/
Également LTP les pages de sourceforge sont relativement obsolètes et le projet est passé à GitHub https://github.com/linux-test-project/ltp
J'imagine qu'ils utilisent la virtualisation pour effectuer des tests rapides, tels que QEMU, VirtualBox ou Xen, ainsi que des scripts pour effectuer des configurations et des tests automatisés.
Les tests automatisés sont probablement effectués en essayant de nombreuses configurations aléatoires ou quelques configurations spécifiques (si elles traitent un problème spécifique). Linux a beaucoup d'outils de bas niveau (tels que dmesg) pour surveiller et enregistrer les données de débogage à partir du noyau, alors j'imagine que c'est également utilisé.
Autant que je sache, il existe un outil de vérification automatique de la régression des performances (nommé lkp/0 day) utilisé/financé par Intel, il testera chaque correctif valide envoyé à la liste de diffusion et vérifiera les scores modifiés à partir de différents microbencheurs tels que hackbench. , fio, unixbench, netperf, etc., une fois que les performances ont été régressées/améliorées, un rapport correspondant sera envoyé directement à l’auteur du correctif et aux mainteneurs liés au Cc.
J'avais fait la compilation du noyau linux et quelques modifications pour Android (Marshmallow et Nougat) dans lesquelles j'utilisais Linux version 3. Je l'ai compilé dans le système linux, déboguer les erreurs manuellement, puis exécuter son fichier image de démarrage dans Android et vérifiez s’il fonctionnait ou non. Si tout fonctionne parfaitement, cela signifie qu’il est parfaitement compilé conformément à la configuration système requise.
Pour la compilation du noyau MotoG
NOTE: - Le noyau Linux changera en fonction des besoins qui dépendent du matériel système.
LTP et Memtests sont généralement des outils préférés.
adobriyan a mentionné la boucle d'Ingo de tests de construction de configuration aléatoires. C'est à peu près maintenant couvert par le bot de test de 0 jour (aka kbuild test bot). Un article de Nice sur l’infrastructure est présenté ici: Kernel Build/boot testing
L'idée derrière cette configuration est d'avertir les développeurs le plus tôt possible afin qu'ils puissent corriger les erreurs assez rapidement. (avant que les correctifs ne soient intégrés à l'arbre de Linus dans certains cas, l'infrastructure de kbuild testant également les arbres de sous-système du responsable)