Как я могу автоматически войти в систему с systemd?

20

Как я могу настроить systemd для автоматического входа в мою среду рабочего стола, желательно без использования менеджера входа? Я использую Arch.

fhucho
источник
Какой менеджер входа вы используете? Некоторые (GDM, KDM, iirc, возможно, больше) уже поддерживают автологин, поэтому вам нужно только включить службу для них.
Виланд
В настоящее время я использую SLiM, и его можно настроить для автоматического входа, но без диспетчера отображения процесс загрузки был бы быстрее и без
мерцания
О, я неправильно понял ваш вопрос.
Виланд

Ответы:

22

Это описано в Arch Wiki :

Создайте новый файл службы, аналогичный getty@.service, скопировав его в/etc/systemd/system/

cp /usr/lib/systemd/system/getty@.service /etc/systemd/system/autologin@.service

Это в основном копирует уже существующий getty@.serviceфайл в новый файл, autologin@.serviceкоторый можно свободно модифицировать. Это скопировано, /etc/systemd/systemпотому что именно там хранятся специфичные для сайта файлы модулей. /usr/lib/systemd/systemсодержит файлы модулей, предоставляемые пакетами, поэтому вы не должны ничего менять там.

Затем вам нужно будет символически связать это autologin@.serviceс сервисом getty для tty, для которого вы хотите выполнить автоматическое исследование, например для tty1:

ln -s /etc/systemd/system/autologin@.service /etc/systemd/system/getty.target.wants/getty@tty1.service

До сих пор это все тот же getty@.serviceфайл, что и в обычном файле, но самая важная часть - это изменение, autologin@.serviceчтобы фактически автоматически входить в систему. Для этого вам нужно всего лишь изменить ExecStartстроку, чтобы прочитать

ExecStart=-/sbin/agetty -a USERNAME %I 38400

Разница между ExecStartстрокой getty@.serviceи autologin@.serviceзаключается только в том, -a USERNAMEчто agetty автоматически сообщает пользователю с именем пользователя USERNAME.

Теперь вам нужно только сказать systemd перезагрузить его файлы демона и запустить сервис:

systemctl daemon-reload
systemctl start getty@tty1.service

(Я не уверен, что служба запустится правильно, если вы уже вошли в tty1, возможно, самый безопасный способ - просто перезагрузиться, а не запускать службу).

Если вы затем хотите автоматически запустить X, вставьте в свой фрагмент следующий фрагмент ~/.bash_profile( снова взятый из вики ):

if [[ -z $DISPLAY ]] && [[ $(tty) = /dev/tty1 ]]; then
    exec startx
fi

Вам нужно будет изменить свою версию, ~/.xinitrcчтобы запустить среду рабочего стола, как это сделать, зависит от DE и, вероятно, также описано в вики Arch.

Wieland
источник
Что такое agetty arg% I?
Эдвард Андерсон
Что случилось с символом в конце? Это нужно? Что это означает?
rien333
@ rien333 Это не нужно, я убрал его из ответа.
Виланд
2
Я получаю ошибку, File existsкогда делаю символическую ссылку
Post Self
используйте, ln -sf /etc/systemd/system/autologin@.service /etc/systemd/system/getty.target.wants/getty@tty1.serviceчтобы перезаписать его.
Мануэль Шмитцбергер
5

Непосредственно измените файл /etc/systemd/system/getty.target.wants/getty@tty1.service(который является символической ссылкой /lib/systemd/system/getty@service):

Добавить -a/--autologin USERNAMEв строку:

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

Следовательно:

ExecStart=-/sbin/agetty -a USERNAME %I $TERM

Вы также можете удалить -o '-p -- \\u'(как указано в текущей установке Arch), так как это запустит вход в систему, USERNAMEно все равно запросит пароль.

После перезагрузки вы войдете в систему автоматически.

Ps Измените имя файла getty@tty1.serviceна то, в которое ttyвы хотите войти.

Zac
источник
Примечание для ясности: если это символическая ссылка, замените символическую ссылку новым файлом и отредактируйте этот новый файл.
Эдвард Андерсон
1

IMO, Arch Wiki в настоящее время рекомендует гораздо более простое решение:

Либо запустите помощник ( systemctl edit getty@tty1), либо сделайте то, что я сделал вручную:

mkdir -p /etc/systemd/system/getty@tty1.service.d/
touch /etc/systemd/system/getty@tty1.service.d/override.conf

Текст, который вы хотите ввести (любым из способов): ( обязательно измените имя пользователя соответствующим образом ):

[Service]
ExecStart=
ExecStart=-/usr/bin/agetty --autologin username --noclear %I $TERM

ПРИМЕЧАНИЕ : пустая строка важна! (правда, я не уверен, почему ...)

Теперь restart ( shutdown -r 0) и что-то в этом роде ... login: username (automatic login)произойдет, если он ранее заблокирован в ожидании ввода имени пользователя / пароля


После перезагрузки и автоматического входа в систему, если вы похожи на меня и хотите использовать SSH в этой системе сейчас, вам, вероятно, нужно выполнить:

systemctl enable sshd.service

Который создаст символическую ссылку (например ln -s '/usr/lib/systemd/system/sshd.service' '/etc/systemd/system/multi-user.target.wants/sshd.service')

jakebrinkmann
источник
Пустая строка сначала очистит запись ExecStart, а следующая строка представит новую команду exec. Также стоит отметить, что в некоторых системах (Ubuntu) может находиться исполняемый файл agetty /sbin/agetty, поэтому стоит /etc/systemd/system/getty.target.wants/getty@tty1.serviceсначала проверить исходный файл.
Платформа