Je courais des services dans 14.04 en exécutant
ip netns exec namespacename service start servicename
Mais j'ai réalisé que cela ne fonctionnait plus le 16.04. Le service démarre dans un espace de noms normal.
J'ai essayé d'éditer le fichier /lib/systemd/system/servicename.service pour utiliser un espace de noms, mais cela n'a pas abouti. Le premier problème est que le programme a été exécuté avec son propre utilisateur qui n'a pas accès aux espaces de noms. Je l'ai modifié pour exécuter le programme en tant que root, puis j'utilise Sudo dans ExecStart mais, pour une raison quelconque, le contrôle de service n'est jamais revenu dans l'invite de commande.
Des idées sur la manière d'accomplir un service pour qu'il s'exécute automatiquement et en permanence dans un espace de noms chaque fois qu'il est redémarré sous Ubuntu 16.04?
Si cela compte, le service en question est transmission-daemon
MISE À JOUR:
J'ai réussi à le faire fonctionner avec le fichier .service suivant. Dans le fichier 'vpn' est le nom de l'espace de noms. Mon problème était de définir le mauvais Type
pour le service. Je pense toujours que cette solution n'est pas la meilleure solution. Si vous avez un meilleur moyen, dites-le!
[Unit]
Description=Transmission BitTorrent Daemon
After=network.target
[Service]
User=root
Type=simple
ExecStart=/bin/sh -c 'exec /sbin/ip netns exec vpn /usr/bin/Sudo -u debian-transmission /usr/bin/transmission-daemon -f --log-error --config-dir /var/lib/transmission-daemon/info'
ExecReload=/bin/kill -s HUP $MAINPID
[Install]
WantedBy=multi-user.target
Trouvé récemment dans man systemd.exec (5)
PrivateNetwork=
Takes a boolean argument. If true, sets up a new network namespace for the executed processes and configures only the loopback network device
"lo" inside it. No other network devices will be available to the executed process. This is useful to turn off network access by the executed
process. Defaults to false. It is possible to run two or more units within the same private network namespace by using the JoinsNamespaceOf=
directive, see systemd.unit(5) for details. Note that this option will disconnect all socket families from the Host, this includes AF_NETLINK
and AF_UNIX. The latter has the effect that AF_UNIX sockets in the abstract socket namespace will become unavailable to the processes
(however, those located in the file system will continue to be accessible).