Maison >développement back-end >Golang >Pourquoi l'appel de setns depuis Go renvoie-t-il EINVAL pour les espaces de noms mnt ?

Pourquoi l'appel de setns depuis Go renvoie-t-il EINVAL pour les espaces de noms mnt ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-03 14:30:03710parcourir

Why Does Calling setns from Go Return EINVAL for mnt Namespaces?

L'appel de setns depuis Go renvoie EINVAL pour l'espace de noms mnt

Problème :

Le code Go ne parvient pas à entrer dans l'espace de noms mnt avec l'appel setns, ce qui entraîne une erreur EINVAL. Malgré des appels identiques dans le code C, l'implémentation Go produit l'erreur cohérente.

Enquête :

  • Confirmation que les codes C et Go appellent les paramètres dans la libc de manière identique .
  • Réduire le problème à un exemple de code simplifié pour isoler le problème.

Solution :

En Go, les setns doivent être exécutés dans un contexte à thread unique avant le démarrage des threads d'exécution Go. En effet, setns agit sur le thread appelant, en le joignant à l'espace de noms.

Solution alternative utilisant l'astuce du constructeur CGO :

Ajoutez la macro __attribute__((constructeur)) à une fonction C pour qu'elle s'exécute avant l'initialisation de Go. Cela permet de saisir un espace de noms avant le démarrage des threads Go, résolvant ainsi le problème.

Mise à jour :

Une conversation sur la liste de diffusion du noyau Linux confirme la restriction selon laquelle les processus multithread ne peuvent pas être réassocié à un nouvel espace de noms de montage. Cela nécessite les capacités CAP_SYS_CHROOT et CAP_SYS_ADMIN dans l'espace de noms de l'appelant et CAP_SYS_ADMIN dans l'espace de noms cible.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn