Два вопроса, которые любят на собесах DevOps и системных инженеров: «что происходит с момента нажатия кнопки питания до приглашения логина» и «как устроены пакеты и почему apt upgrade на проде надо делать аккуратно».
Пакетные менеджеры
Два основных семейства:
| Debian, Ubuntu | RHEL, Rocky, Alma, Fedora | |
|---|---|---|
| Формат | .deb | .rpm |
| Низкий уровень | dpkg | rpm |
| Высокий уровень | apt | dnf (раньше yum) |
Низкий уровень ставит файл пакета и ничего не знает о репозиториях. Высокий скачивает пакеты из репозиториев и разрешает зависимости.
apt update # обновить списки пакетов из репозиториев
apt install nginx # поставить с зависимостями
apt upgrade # обновить установленные
apt remove nginx # удалить, конфиги остаются
apt purge nginx # удалить вместе с конфигами
apt autoremove # убрать ненужные зависимости
apt-cache policy nginx # какая версия откуда и какая выбрана
dpkg -l | grep nginx # что установлено
dpkg -L nginx # какие файлы поставил пакет
dpkg -S /usr/sbin/nginx # какому пакету принадлежит файл
apt-mark hold postgresql-16 # заморозить версию
В семействе RHEL: dnf install, dnf update, rpm -qa, rpm -ql, rpm -qf, dnf history undo.
apt update не обновляет программы, а только скачивает свежие списки. Частая ошибка в Dockerfile: apt-get update и apt-get install в разных слоях, из-за кеша слоёв список устаревает.
Репозитории и подписи
Источники лежат в /etc/apt/sources.list и /etc/apt/sources.list.d/ (в Ubuntu 24.04 формат deb822, файлы *.sources). Пакеты подписаны: apt проверяет подпись метаданных репозитория ключом, который указан для этого источника (signed-by). Старый способ apt-key add добавлял ключ доверенным для всех репозиториев, поэтому он устарел.
Обновления на проде
- Обновления безопасности ставят регулярно и автоматически (
unattended-upgradesв Ubuntu,dnf-automaticв RHEL). - Крупные обновления (новая версия PostgreSQL, ядра) планируют, сначала на стенде.
- Версии критичных пакетов фиксируют (
apt-mark hold,versionlockв dnf). - После обновления библиотек процессы держат старые версии в памяти: их надо перезапустить (
needrestartподскажет). После обновления ядра нужна перезагрузка или live patching.
Порядок загрузки
- Прошивка (UEFI или BIOS). Проверка железа (POST), поиск загрузчика. UEFI читает загрузчик с раздела EFI (ESP, FAT32), BIOS из первого сектора диска (MBR).
- Загрузчик GRUB. Показывает меню, читает конфиг, загружает в память ядро (
vmlinuz) и initramfs, передаёт ядру параметры командной строки (root=UUID=...,quiet). При Secure Boot перед GRUB обычно стоит подписанный shim. - Ядро. Инициализирует процессоры, память, драйверы, монтирует initramfs как временный корень.
- initramfs. Маленькая система в памяти с модулями, нужными, чтобы найти и смонтировать настоящий корень: драйверы диска, LVM, RAID, расшифровка LUKS. Затем переключение на настоящий корень.
- init (PID 1). systemd читает юниты и запускает систему до цели по умолчанию (
multi-user.targetдля серверов,graphical.targetдля десктопов). - Сервисы и логин. sshd, getty на консоли, приложения.
systemd-analyze # сколько заняла каждая стадия
systemd-analyze blame # какие юниты дольше всего стартовали
systemd-analyze critical-chain
systemctl get-default
journalctl -b -1 # логи предыдущей загрузки
cat /proc/cmdline # параметры ядра
Ядро и модули
uname -r # версия ядра
lsmod # загруженные модули
modprobe br_netfilter # загрузить модуль с зависимостями
modinfo e1000e
sysctl -a # параметры ядра в рантайме
Параметры ядра в рантайме меняет sysctl (на лету) и файлы в /etc/sysctl.d/ (постоянно). Модули для автозагрузки перечисляют в /etc/modules-load.d/. Пример из Kubernetes: модуль br_netfilter и net.ipv4.ip_forward = 1.
Когда сервер не грузится
- Ошибка в
/etc/fstab: systemd уходит в emergency mode. Входим, правим fstab,mount -a. - Сломался GRUB или ядро: в меню GRUB выбрать предыдущее ядро.
- Забыли пароль root: параметр ядра
init=/bin/bashилиrd.break(RHEL) из меню GRUB при физическом или консольном доступе. - В облаке: серийная консоль или подключение диска к другой машине.
Частые ошибки
- Путать
apt updateиapt upgrade. - Обновлять всё подряд на проде без стенда и плана отката.
- Добавлять ключи через устаревший
apt-key. - Забыть перезапустить сервисы после обновления библиотек (например OpenSSL).
- Не знать, что делает initramfs.
Что спросят на собесе
- Опиши загрузку Linux от кнопки питания до логина.
- Что такое initramfs и зачем он нужен.
- Чем
apt updateотличается отapt upgrade,removeотpurge. - Как узнать, какому пакету принадлежит файл.
- Как безопасно обновлять пакеты на проде.