LINUX.ORG.RU

Обновился до jessie. Проблема с systemd и rc.local.

 ,


2

2

В /etc/rc.local был прописан простенький набор комманд для запуска encfs с запросом пароля прямо во время загрузки системы:

  stty -echo
  read -p "encfs: " encfspass; echo
  stty echo
  echo "$encfspass" | encfs --stdinpass --public /home/user/.encfs /home/user/encfs

После обновления оно совсем перестало работать. Погуглил по systemd и нашёл что StandardInput=tty-force а не no. Оно как-бы работает, но даёт мне всего несколько секунд (около трёх) на ввод пароля. Пароль простой, вбить за пару секунд легко, но смущает сам факт того что система продолжает грузиться в не зависимости от encfs'а. Хотелось бы как раньше — не пытаться загрузить комп пока пароль не введён.

Предложите варианты?


Соорудить свой юнит и поставить его в зависимость к тем юнитам которые не должны без него работать.

surefire ★★★
()
Ответ на: комментарий от surefire

Это всмысле прописать ему в зависимостях что-то важное? Иксы? Сеть?

Нет ли у тебя уже что-нибудь готового? (Я немного побаиваюсь лезть в /etc)

vg6zu
() автор топика

WantedBy=multi-user.target

TimeoutStartSec=бла-бла

melkor217 ★★★★★
()
Ответ на: комментарий от melkor217

Что-то никак не получается. Вот так написал и заенаблил сервис (юнит):

[Unit]
Description=encfs
ConditionFileIsExecutable=/etc/rc.local
After=network.target

[Service]
ExecStart=/home/user/bin/rc.local.sh start
TimeoutSec=0
TimeoutStartSec=0
RemainAfterExit=yes
SysVStartPriority=99
StandardInput=tty-force

[Install]
WantedBy=multi-user.target

И вот так выглядит сам скрипт (rc.local.sh):

#!/bin/sh
stty -echo
read -p "encfs: " encfspass; echo
stty echo
echo "$encfspass" | encfs --stdinpass --public /home/user/.encfs /home/user/encfs

Юнит срабатывает (пароль запрашивается) при загрузке, но всё также секунды на 3, и загрузка на нём не останавливается, система продолжает загружаться вне зависимости от оттого успел я ввести пароль или нет. Подмогите исправить так чтобы система не грузилась пока я правильный пароль для encfs'а не введу.

vg6zu
() автор топика

Во-первых, в systemd для запроса разного рода паролей правильно пользоваться не StandardInput=tty, а специальной тулзой: systemd-ask-password(1).

Во-вторых, systemd по умолчанию запускает всё параллельно. Чтобы приостановить загрузку до завершения выполнения какого-то юнита, нужно выставить для него зависимости. В твоём случае скрипт занимается монтированием ФС, поэтому логично было бы привязаться к local-fs.target: WantedBy=local-fs.target и Before=local-fs.target (вторая зависимость создастся автоматически). И ещё специальной директивой выставить зависимости от точек монтирования, нужных для доступа к твоему зашифрованному контейнеру.

В итоге твой юнит будет иметь какой-то такой вид:

[Unit]
RequiresMountsFor=/home/user

[Service]
Type=oneshot
RemainAfterExit=true
KillMode=none
ExecStart=/путь/к/скрипту

[Install]
WantedBy=local-fs.target

Положить в /etc/systemd/system/чтонибудь.service, сделать systemctl daemon-reload и systemctl enable чтонибудь.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 2)
Ответ на: комментарий от intelfx

Может быть, можно как-нибудь сделать так, чтобы он просто запрашивал пароль в отдельном терминале, а всё остальное бы выпадало бы в tty1 или куда?

proud_anon ★★★★★
()
Последнее исправление: proud_anon (всего исправлений: 2)
Ответ на: комментарий от proud_anon

И как ты это сделаешь? Что понимается под «отдельным терминалом»? Новое окно гуёвого эмулятора терминала, в котором запущен проксирующий бинарник? Или первый свободный VT? А если дело происходит по SSH?

Это не работает в общем случае. А ask-password генерализуется, потому что для него можно зарегистрировать любое количество фронтендов. Начиная встроенным в systemd (работает на этапе начальной загрузки, как хочет ТС) и в systemctl (работает при systemctl start) и заканчивая интегрированным в гномощель диалогом а-ля полкит.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 2)
Ответ на: комментарий от intelfx

А ask-password генерализуется, потому что для него можно зарегистрировать любое количество фронтендов.

А, так он и так умный? Ну тогда это хорошо.

proud_anon ★★★★★
()
Последнее исправление: proud_anon (всего исправлений: 1)

Я бы подождал лет пять, пока systemd в Debian будет готов. Пока он не готов. Как один из примеров, при запуске /etc/init.d/something start в Jessie игнорируются переменные окружения в файлах /etc/default/something, несмотря на их наличие.

anonymous
()

Поборовшись с разными глюками вернулся на sysvinit в jessie, вроде ничего не сломано.

slapin ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.