У меня есть 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 - это простой скрипт, который может получить имя хоста и передать его. чтобы смешаться. Это, однако, не похоже на работу. Я думаю, что проблема может заключаться в том, что для службы тип бездействует, и из моих онлайн-исследований он должен быть форком. Я еще не попробовал изменить тип сервиса.
Я хотел бы знать «правильный путь» сделать это. Пока что я просто пытаюсь сделать так, чтобы это работало, и даже если я заставлю это работать, я не буду уверен, что это лучший способ сделать это.
Спасибо.
я узнал, что не могу использовать обратные галочки или замену переменной среды в
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 процесс. agetty
. Страницы руководства Unbuntu 15.04.