Терминальный вход: getty, login, issue и motd
Терминальный вход — самая старая и самая честная часть системы: строка с приглашением, имя, пароль. Даже если графики нет вовсе, этот путь остаётся. Разбираем его по шагам — от приглашения на экране до оболочки.
Кто кого запускает
systemd → getty@tty1.service → agetty (выводит приглашение) → login (проверяет пароль) → оболочка
| Программа | Что делает |
|---|---|
getty@tty1…tty6 |
Служба systemd: по одной на каждый виртуальный терминал |
agetty |
Открывает терминал, печатает приглашение и ждёт имя пользователя |
login |
Читает имя, проверяет пароль, настраивает сессию и запускает оболочку |
Виртуальных терминалов шесть: Ctrl+Alt+F1 … Ctrl+Alt+F6. В Ubuntu под графикой занят первый, остальные свободны — это и есть «второй вход», которым удобно пользоваться, когда графическая сессия зависла.
$ systemctl status getty@tty2 --no-pager | head -5
$ ps -o pid,cmd -C agetty
Что видно до входа и после
До появления приглашения agetty (и login) печатают файл /etc/issue — там обычно имя системы и подсказка. Это не украшение, а полезное место: по нему видно, на какую машину вы попали, когда консольных машин десяток.
$ cat /etc/issue
Ubuntu 26.04.1 LTS \n \l
Подстановки в этом файле: \n — имя узла, \l — имя линии (терминала), \r — версия ядра, \d — дата. Файл /etc/issue.net — та же идея, но для входа по сети. Управлять поведением agetty можно в /etc/systemd/system/getty@tty1.service.d/ или в /etc/issue.d/, не правя сам /etc/issue.
После успешного входа печатается /etc/motd — «сообщение дня». На Ubuntu он собирается динамически: pam_motd показывает содержимое /run/motd.dynamic (его складывают обновления системы) и /etc/motd.d/.
Путь через PAM
Пароль проверяет не login, а PAM — по файлу /etc/pam.d/login. Вот он целиком, без комментариев (Ubuntu 26.04):
auth optional pam_faildelay.so delay=3000000
auth requisite pam_nologin.so
session required pam_loginuid.so
session optional pam_motd.so motd=/run/motd.dynamic
session optional pam_motd.so noupdate
session required pam_env.so readenv=1
session required pam_env.so readenv=1 envfile=/etc/default/locale
@include common-auth
auth optional pam_group.so
session required pam_limits.so
session optional pam_mail.so standard
session optional pam_keyinit.so force revoke
@include common-account
@include common-session
@include common-password
Читать его надо так:
pam_faildelay— пауза3000000микросекунд (3 секунды) после неверного пароля. Это замедление перебора;pam_nologinсо статусомrequisite— если существует файл/etc/nologin, обычных пользователей не пускают вообще (root пускают). Так закрывают вход на время обслуживания: создали файл — вход закрыт, удалили — открыт;pam_loginuid— записывает в сессию настоящий идентификатор входа, чтобы журнал не путался приsuиsudo;pam_motd— печатает сообщение дня;pam_env— подставляет переменные окружения, в том числе локаль из/etc/default/locale;@include common-auth— общая проверка пароля: именно здесь работаетpam_unix.so(файл/etc/shadow) илиpam_sss.so, если пользователь доменный;pam_group,pam_limits— членство в группах и лимиты процессов;common-account,common-session,common-password— управление учётной записью, открытие сессии и смена пароля.
session required pam_systemd.so в этой цепочке вы не увидите — он подключается из common-session. Именно он создаёт сессию, которая видна в loginctl.
Настройки самого входа: /etc/login.defs
Файл /etc/login.defs задаёт правила для login, su и утилит теневых паролей:
| Параметр | По умолчанию | Что делает |
|---|---|---|
LOGIN_RETRIES |
3 | Сколько попыток даётся на ввод пароля |
LOGIN_TIMEOUT |
60 | Сколько секунд ждать ввода |
FAILLOG_ENAB / FAIL_DELAY |
— | Учёт неудачных попыток и пауза (в современных системах чаще через pam_faillock) |
UID_MIN / UID_MAX |
1000 / 60000 | Границы обычных пользователей |
UMASK |
022 | Права на создаваемые файлы |
PASS_MAX_DAYS / PASS_MIN_DAYS |
99999 / 0 | Срок жизни пароля и минимальный интервал смены |
Здесь же задаётся CREATE_HOME — создавать ли домашний каталог. Если он no, после первого входа окажется, что каталога нет: оболочка работает, а cd ~ ругается.
Как посмотреть, что вход был
$ last -n 10 # последние входы и выходы
$ lastlog # когда входил каждый пользователь
$ w # кто сейчас и что делает
$ loginctl list-sessions --no-legend # сессии глазами systemd
Три источника не дублируют друг друга: last и lastlog — про прошлые входы (файлы wtmp и lastlog), loginctl — про текущие сессии и их тип (tty, x11, wayland).
Частые случаи
Не пускает вообще, даже root. Скорее всего есть /etc/nologin или сломано правило в common-auth: смотреть journalctl -n 50 | grep -i pam.
Ввёл пароль — сразу выбросило. Пароль принят, а сессия не открылась: оболочка из /etc/passwd не существует, нет домашнего каталога или запрещено записывать в него. Здесь помогает вход в rescue.target или через su от root.
Не помню пароль. passwd от имени root, из другого терминала или из режима починки.
Источники
man 8 agetty— ключи и файл/etc/issue;man 5 issue— подстановки;man 5 motdиman 8 pam_motd— сообщение дня.man 1 login,man 5 login.defs— файл настроек и его параметры (значения по умолчанию сверены с/etc/login.defsиman 5 login.defsпакетаloginна Ubuntu 26.04).man 8 pam_nologin,man 8 pam_faildelay,man 8 pam_env,man 8 pam_systemd.- Содержимое
/etc/pam.d/login— приведено с рабочей системы (Ubuntu 26.04).
Что ещё не проверено
- Значения по умолчанию в таблице
login.defsсверены с man-страницей и файлом на Ubuntu 26.04; в других дистрибутивах они отличаются. - Поведение
pam_groupв цепочкеlogin(проверка членства в группах из/etc/security/group.conf) на практике не проверялось: правило в файле отсутствует, то есть модуль молча ничего не делает.
Комментарии
Пока комментариев нет.