getty / mingetty автоматический вход 16.04

У меня есть nfsroot, созданный 14.04, который я перестраиваю с использованием 16.04. Мой nfsroot используется тремя системами: pc1, pc2 и pc3. Также есть 3 подходящих учетных записи с именами pc1, pc2 и pc3.

Когда эти системы загружаются, они автоматически входят в систему и затем запускают скрипт входа в bash.

В 14.04 я заменил mingetty в моем файле upstart tty1.conf следующим образом:

# tty1 - getty
#
# This service maintains a getty on tty1 from the point the system is
# started until it is shut down again.

start on stopped rc RUNLEVEL=[2345] and (
        not-container or
        container CONTAINER=lxc or
        container CONTAINER=lxc-libvirt)

stop on runlevel [!2345]

respawn
#exec /sbin/getty -8 38400 tty1
script
    exec /sbin/mingetty --autologin `cat /proc/sys/kernel/hostname` --noclear tty1
end script

Это отлично работало в 14.04 для моих целей. Он выбирает имя хоста из / proc и затем использует его в качестве имени для входа.

Я пытаюсь повторить то же поведение в 16.04, но теперь использую systemd. Для этого я изменил /etc/systemd/system/getty.target.wants. В частности, я изменил ExecStart:

ExecStart=-/sbin/agetty -a $HOSTNAME --noclear %I $TERM

Однако, прочитав документацию по systemd и используя некоторые google-fu, я понял, что не могу использовать обратные ссылки или подстановку переменных среды в строке ExecStart. Вместо этого я протестировал жесткое кодирование учетной записи пользователя, и она работает правильно, но я не могу понять, как сделать то же самое, что я делал ранее с upstart в systemd.

Я также пытался использовать для этой цели небольшой скрипт, изменив строку ExecStart на:

ExecStart=/bin/sh -c "/usr/bin/autogetty.sh"

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

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

Спасибо.

0
задан 11 May 2016 в 11:46

1 ответ

Неверные представления и ошибки

я узнал, что не могу использовать обратные галочки или замену переменной среды в ExecStart строка.

Вы изучили ложность. doco на самом деле не говорит это. Вы можете подстановка переменных условий применения (с синтаксисом, который тонко отличается от большинства оболочек Unix). Просто имеет место, что нет никакого HOSTNAME переменная среды для замены . Сервисные процессы не порождены с такой настроенной переменной среды.

файлы Единицы parameterizable, и %H, параметр расширяется до (динамического) имени хоста, как это было в точке в прошлом, что единица была загружена из файла.

ExecStart=/bin/sh -c "/usr/bin/autogetty.sh"
[…] я должен все же попытаться изменить сервисный тип все же.

Хороший. Не делать. Это - неправильный поступок. Только измените протокол уведомления о готовности на forking, если Ваш сервис на самом деле реализует тот протокол. Не делайте этого как клуджа, потому что Вы ошибочно сделали программу что ветвления ни на каком серьезном основании.

, поскольку это точно, что Вы сделали. Ненужное /bin/sh разветвляет ребенка для выполнения autogetty.sh, который заканчивает тем, что был вторым процессом оболочки, выполняющим тот сценарий оболочки. Второй процесс оболочки затем разветвляется для выполнения mingetty как внук. Это не соответствует разветвляющемуся протоколу готовности так или иначе, поскольку это полагается на ветвление сопровождаемый выходом в родителе .

Берут урок от мира daemontools: Сервисы выполнены, не порождены. Программа, которую Вы запускаете как ExecStart, должна быть сервисный процесс, не что-то что икра сервисный процесс.

правильный путь

правильный способ настроить вещи является этим:

  • Переопределение определенный экземпляр шаблона, для определенного оконечного устройства, не целого шаблона.
  • Использование %H для получения имени хоста в [1 110]. Или используйте %m и идентификатор машины как Ваши имена пользователя.
  • Вызывают вещи правильно:
    • Просто работает agetty непосредственно, для лучших результатов. Вам на самом деле не нужны никакие сценарии для задачи, как описано вообще.
    • , Если Вы действительно, тем не менее, принимаете решение вставить лишний сценарий обертки: <ул.> <литий> не использует /bin/sh -c scriptfile. Просто сделайте scriptfile исполняемый файл, с правильно указанным интерпретатором сценария, и выполните его непосредственно.
    • <литий> Удостоверяются, что Ваш сценарий использует exec для становления dæ понедельник getty процесс.

Дополнительные материалы для чтения

0
ответ дан 11 May 2016 в 21:46
  • 1
    Что происходит, если Вы заменяете UUID устройством? Вы добираетесь, что-либо соответствующее вошло в/var/log/messages? – Glenn Bell 23 October 2017 в 12:32

Другие вопросы по тегам:

Похожие вопросы: