Demander un mot de passe lors du démarrage avec le service systemd

16

Ceci s'applique à Arch Linux (et peut-être à d'autres distributions utilisant systemd). Je veux monter une partition TrueCrypt au démarrage. Avec l'ancien sysvinit, c'était assez simple avec un script appelé par rc.local.

Je suis arrivé à mon courant en détournant un fil de discussion Arch . Il y a un autre threadce thread systemd-devel est décrit comme "ayant la solution", mais il ne me semble pas vraiment ce que c'est, et l'OP a le dernier message indiquant qu'il n'a pas pu atteindre son objectif.

À première vue, cette personne le fait, mais cherchait un moyen de désactiver les messages de démarrage continu pendant qu'il tape le mot de passe. J'ai également posté là-bas pour lui demander de publier son .servicedossier réel .

En cherchant un peu, les gens mentionnent qu'ils ont réussi ou que c'est possible, mais ne précisez pas exactement quelle était la solution.

Je suis en mesure de déverrouiller la partition à partir de la ligne de commande via un systemdservice (ce qui me donne la possibilité de la démonter automatiquement à l'arrêt / au redémarrage), mais je dois le faire manuellement une fois connecté. J'aimerais vraiment que le processus de démarrage s'arrête et me demande le mot de passe.

Voici mon script actuel:

[Unit]
Description=Truecrypt Setup for vault
#DefaultDependencies=no
#Conflicts=umount.target
#Before=umount.target
#After=systemd-readahead-collect.service systemd-readahead-replay.service
#After=cryptsetup.target

[Service]
Type=oneshot
RemainAfterExit=yes
#StandardInput=tty-force
ExecStart=/bin/sh -c '/usr/bin/truecrypt -t --protect-hidden=no -k "" --filesystem=none --slot=1 -p `systemd-ask-password "Enter password for truecrypt volume: "` /dev/sda4'
ExecStop=/usr/bin/truecrypt --filesystem=none -d /dev/sda4

[Install]
WantedBy=multi-user.target

J'ai laissé les commentaires [Unit], car à un moment donné, je suis tombé sur des suggestions selon lesquelles cela devrait être là, mais j'ai eu des problèmes avec cela. Ce qui précède semble fonctionner très bien après le démarrage / la connexion ... mais pas pendant.

Hendy
la source
Si je comprends bien, si vous ne voulez pas être interrompu par des messages de journalisation, vous devez créer une barrière dans le fichier d'unité - ce qui signifie qu'il faudra que tous les services démarrés avant de se terminer (initialisation) et il se bloquera tous les services en cours d'exécution. C'est ce que vous essayez de réaliser?
peterph
@peterph Je ne pense pas que cela soit important tant que tout ce qui est requis par TrueCrypt fonctionne au moment où j'obtiens l'invite. D'autres choses ne dépendent pas de cela car c'est juste un volume pour stocker des fichiers; ainsi, d'autres choses pourraient se charger en arrière-plan pendant que j'entre le mot de passe. À l'heure actuelle, j'attends pour me connecter, puis je commence manuellement par sudo systemctl start truecrypt-vault, saisis le sumot de passe, saisis le mot de passe TC Volume, puis startx. Je pourrais sûrement avoir l'invite de mot de passe présentée pendant le démarrage pour éviter les étapes supplémentaires après la connexion?
Hendy
C'était mon point et en fait le vôtre aussi (c'est même dans le sujet de la question) - pour obtenir l'invite de mot de passe lors du démarrage. Si vous n'utilisez pas de démarrage graphique comme plymouth, toute invite de mot de passe sur la console est susceptible d'être perdue dans les services démarrant en parallèle.
peterph
Oh. Je pensais que vous demandiez si je devais arrêter les services après ou pour m'assurer que tous les services précédents avaient commencé ... Je ne suis pas sûr et j'ai essayé de répondre du mieux que je pouvais. Je démarre uniquement au niveau d'exécution 3 avec une connexion texte et startxmanuellement. Aucun gestionnaire de connexion. Mais oui, je fais besoin d'arrêter les messages de démarrage pendant que je saisissez le texte, sinon il va simplement disparaître de l'écran.
Hendy
8
Eh bien, systemdun agent est en mesure de demander un mot de passe, vous pouvez donc regarder dans cette direction.
peterph

Réponses:

2
  • Écrivez un script wrapper et placez-le ExecStart=
  • A partir du script wrapper, utilisez systemd-ask-password <PROMPT>, lisez le mot de passe depuis sa sortie standard et alimentez-le dans truecrypt de la manière requise
  • N'oubliez pas de execchiffrer à la fin de votre script afin de ne pas laisser traîner un processus bash supplémentaire

Cela obligera systemd à interroger le mot de passe immédiatement (si vous démarrez apache en utilisant systemctl) ou en utilisant l'un des soi-disant agents (il y en a par défaut qui demandent des mots de passe en utilisant wall ou directement sur la console pendant le démarrage du système). C'est la meilleure chose que vous puissiez faire pour rester conforme.

intelfx
la source