Терминальный вход: 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) на практике не проверялось: правило в файле отсутствует, то есть модуль молча ничего не делает.
Оценка статьи 0

Комментарии

Пока комментариев нет.