Lancer VirtualBox dans tmux en ligne de commande

Ligne de commande

/usr/bin/tmux new-session -s virtuel -d /usr/bin/VBoxManage startvm 'Debian Stretch' --type headless

La commande new-session permet de créer une nouvelle session dédiée, dont le nom est virtuel. Le paramètre -d permet de détacher immédiatement la session tmux, et ensuite suit la commande à exécuter.

une instance “utilisateur” de systemd

Si tout le monde connaît le systemd qui tourne avec le PID 1, au niveau du système, on connait moins le systemd qui tourne avec un PID quelconque, et qui gère les services liés à un utilisateur donné.

pam-systemd et systemd-logind permettent à systemd d’instancier des slices pour les différents utilisateurs et des scopes pour les différentes sessions (voir systemd user ,wiki Archlinux).

Si vous exécutez systemctl status, vous pourrez retrouver ce type d’info dans l’arborescence:

   ├─user.slice
   │ └─user-1000.slice
   │   ├─user@1000.service
   │   │ ├─tmux-irc.service
   │   │ │ ├─5138 /usr/bin/tmux new-session -d -s irc /usr/bin/irssi
   │   │ │ └─5139 /usr/bin/irssi
   │   │ └─init.scope
   │   │   ├─18920 /lib/systemd/systemd --user
   │   │   └─18921 (sd-pam)

C’est relativement anodin au jour le jour (le plus souvent ça permet de s’assurer que rien ne subsiste une fois qu’un utilisateur se délogue), mais via ce mécanisme, systemd permet aussi à certains utilisateurs de fournir leurs propres units. C’est cela que nous allons utiliser pour notre session tmux.

Créer une unit utilisateur pour le service

Il est possible de placer les units propres à un utilisateur dans le dossier ~/.config/systemd/user/.
Créer le dossier

mkdir -p ~/.config/systemd/user

Le fichier unit tmux-virtuel.service:

nano ~/.config/systemd/user/tmux-virtuel.service
[Unit]
Description=tmux instance with virtual running in it.

[Service]
ExecStart=/usr/bin/tmux new-session -d -s virtuel /usr/bin/VBoxManage startvm 'Debian Stretch' --type headless

Type=forking
Restart=always

[Install]
WantedBy=default.target

Une fois ce fichier placé au bon endroit, il suffit de reloader systemd puis on peut démarrer le service:

$ systemctl --user daemon-reload
$ systemctl start --user tmux-virtuel
$ systemctl status --user tmux-virtuel

Par contre si vous rebootez la machine, ça ne marche pas. En fait, l’instance utilisateur de systemd n’est créée que lorsqu’un utilisateur se logue. Donc, pour le coté “présence constante”, ça n’est pas suffisant.

Note: Théoriquement, il me semble tmux devrait également être arrêté lors du log-out mais ce n’est pas le cas, en tout cas sous Debian.

Démarrer lors du boot

La configuration par défaut de systemd-logind est conçue afin de s’assurer que les processus lancés par un utilisateur ne lui survivent pas. Du coup, cette instance est lancée lors du login, et coupée lors du log out de toutes les sessions de l’utilisateur (une seule instance est lancée même si vous vous connectez 5 fois à la machine). Par ailleurs, si votre session tmux est tuée à chaque fois que vous vous déloguez de votre serveur SSH, c’est à cause de ça.

Evidemment, ce n’est pas ce que l’on recherche ici, mais heureusement il est possible de dire à systemd que l’instance d’un utilisateur soit tout le temps présente, du boot au shutdown, ce qui permet d’avoir des processus (services) utilisateurs qui tournent sans avoir de session ouverte.

Il suffit de faire ceci (en root):

sudo loginctl enable-linger $USER

Redémarrer la machine…