Вопрос: 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.To сделать это я изменил /etc/systemd/system/getty.target.wants. В частности, я изменил ExecStart:

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

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

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

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

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

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

Благодарю.


0
2018-05-11 08:19


Источник


Ну, так как вы не можете использовать переменные среды в systemd службы, почему бы не вызвать скрипт вместо этого? Они могут использовать переменные среды, не так ли? - Sergiy Kolodyazhnyy
Добавлена ​​дополнительная информация о моих попытках использовать скрипт. - SimonSays


Ответы:


Неправильные идеи и ошибки

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

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

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

ExecStart = / bin / sh -c "/usr/bin/autogetty.sh"
[...] Мне еще предстоит попробовать изменить тип сервиса.

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

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

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

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

Правильный способ настроить это:

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

дальнейшее чтение


0
2018-05-18 14:36