Запрашивать пароль при загрузке с помощью службы systemd

16

Это относится к Arch Linux (и, возможно, другим дистрибутивам, использующим systemd). Я хочу смонтировать раздел TrueCrypt при загрузке. Со старым sysvinitэто было довольно просто с помощью скрипта, который вызывал rc.local.

Я добрался до своего текущего, похитив ветку форума Arch . Есть еще один поток, в котором этот поток systemd-devel рассматривается как «имеющий решение», однако для меня неясно, чем он является на самом деле, и у ОП есть последнее сообщение о том, что он не смог достичь своей цели.

Судя по всему, этот человек делает это, но искал способ отключить сообщения непрерывной загрузки, пока он вводит пароль. Я также разместил там сообщение с просьбой опубликовать его .serviceфайл.

При поиске довольно часто люди отмечают, что они добились успеха или что это возможно, но не уточняют, каким именно было решение.

Я до сих пор могу разблокировать раздел из командной строки через systemdслужбу (что, в свою очередь, дает мне возможность автоматически отключать его при завершении работы / перезагрузке), но я должен сделать это вручную после входа в систему. I ' Мне очень хотелось, чтобы процесс загрузки приостановился и попросил у меня пароль.

Вот мой текущий сценарий:

[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

Я оставил комментированный материал [Unit], так как в какой-то момент натолкнулся на предложения, что он должен быть там, но у меня были проблемы с этим. Вышеуказанное работает нормально после загрузки / входа в систему ... только не во время.

Хенди
источник
Насколько я понимаю, если вы не хотите прерывать ведение журнала сообщений, вам нужно создать барьер в файле модуля - это означает, что для этого потребуются все службы, запущенные до его завершения (инициализация), и он заблокирует любые службы, работающие после него. Это то, что вы пытаетесь достичь?
Петер
@peterph Я не думаю, что это имеет значение, пока все, что требуется TrueCrypt, будет запущено, когда я получу приглашение. Другие вещи не зависят от этого, так как это просто том для хранения файлов; таким образом, другие вещи могут загружаться в фоновом режиме, пока я ввожу пароль. В настоящее время я жду, чтобы войти, затем вручную начать с sudo systemctl start truecrypt-vault, введите suпароль, введите пароль тома TC, а затем startx. Конечно, я мог бы получить запрос пароля во время загрузки, чтобы избежать дополнительных шагов после входа в систему?
Хенди
Это была моя точка зрения, а на самом деле и ваша (даже в теме вопроса) - запросить пароль во время загрузки. Если вы не используете графическую загрузку, как plymouthлюбая парольная подсказка на консоли, вероятно, будет потеряна в службах, начинающихся параллельно.
Петер
Ой. Я подумал, что вы спрашиваете, нужно ли мне останавливать службы после или убедиться, что все предыдущие службы запущены ... Я не уверен и пытался ответить как можно лучше. Я загружаюсь только до уровня запуска 3 с текстовым логином и startxвручную. Нет менеджера входа. Но да, я делать нужно остановить загрузочные сообщения в то время как я ввожу текст, в противном случае это будет просто исчезнуть с экрана.
Hendy
8
Ну, systemdесть агент, который может запросить пароль, так что вы можете посмотреть в этом направлении.
Петер

Ответы:

2
  • Напишите скрипт-обертку и поместите его в ExecStart=
  • Из скрипта-обертки используйте systemd-ask-password <PROMPT>, прочитайте пароль из его стандартного вывода и отправьте его в truecrypt любым необходимым способом.
  • Не забудьте выполнить exectruecrypt с конца вашего скрипта, чтобы не оставить лишний процесс bash

Это заставит systemd запрашивать пароль немедленно (если вы запускаете apache с помощью systemctl) или с помощью одного из так называемых агентов (есть стандартные, которые запрашивают пароли с помощью wall или непосредственно на консоли во время загрузки системы). Это лучшее, что вы можете сделать, чтобы оставаться послушным.

intelfx
источник