Сброс пароля root в системе (GRUB / init)
Введение
Когда забываешь пароль root, зачастую можно восстановить его через режим восстановления, загрузившись с параметром `init=/bin/sh` через меню GRUB. Эта инструкция подходит для Fedora, CentOS и подобных дистрибутивов с GRUB2 и SELinux. Также приведён альтернативный подход для systemd (rescue/recovery), который полезен на современных системах.
Шаги по сбросу пароля
- При загрузке системы удерживаем SHIFT (или клавишу Esc, в зависимости от конфигурации), чтобы отобразить меню GRUB.
- В меню GRUB нажимаем e — редактирование параметров загрузки ядра.
- Найди строку, начинающуюся с `linux` или `linux16` / `linuxefi`.
- В конце этой строки добавь:
- Код: выделить все
init=/bin/sh
- — При необходимости замени параметр `ro` на `rw`, чтобы не пришлось перемонтировать в дальнейшем (иногда можно сразу добавить `rw`):
- Код: выделить все
linux … rw init=/bin/sh
- Нажимаем Ctrl+X или F10, чтобы продолжить загрузку с отредактированными параметрами (они **не сохраняются**).
- После загрузки система, как правило, монтируется как `ro` (только для чтения). Перемонтируй корневую файловую систему:
- Код: выделить все
mount -o rw,remount /
- Если на системе активен SELinux, можно временно ослабить контроль (в зависимости от окружения):
- Код: выделить все
setenforce 0 # если доступна утилита setenforce
(на некоторых дистрибутивах может потребоваться загрузка политик — команда `/sbin/load_policy -i` встречается реже и может отсутствовать). - Теперь можно сменить пароль root:
- Код: выделить все
passwd root
- Чтобы “вернуть” процесс загрузки в норму, запусти:
- Код: выделить все
exec /sbin/init
Это заменит текущий шелл на полноценный init-процесс. - Если политика SELinux не была загружена ранее или были изменены контексты, будет полезно создать файл автолейблинга:
- Код: выделить все
touch /.autorelabel
При следующем запуске система пересчитает метки.
Альтернатива (systemd)
Вместо `init=/bin/sh` можно в GRUB добавить параметр для перехода в rescue/recovery режим systemd:
- Код: выделить все
systemd.unit=rescue.target
Это загрузит минимальный режим systemd, где проще работать с systemctl и passwd. На некоторых системах удобнее и безопаснее.
Если корневой раздел зашифрован (LUKS)
Если система установлена с полным шифрованием диска (LUKS/LVM-on-LUKS), перед доступом к `/` потребуется расшифровать раздел вручную.
После входа в GRUB и добавления параметра `init=/bin/sh`, при загрузке ядро остановится и запросит пароль для разблокировки устройства.
Пример команды (если загрузка вручную через initramfs):
- Код: выделить все
cryptsetup luksOpen /dev/sda2 cryptroot
vgchange -ay
mount /dev/mapper/vg-root /
После этого можно выполнить обычные шаги по сбросу пароля.
Важно: без ключа LUKS расшифровать раздел невозможно — ни GRUB, ни init не помогут, потому что данные физически зашифрованы.
Важные замечания и ограничения
- Параметры, добавленные в GRUB через `e`, **не сохраняются навсегда** — это временно, на одну загрузку.
- Если дистрибутив использует более сложный механизм защиты (например, пароль GRUB, шифрование root/LUKS), этот метод может не сработать. При зашифрованном разделе нужно знать пароль шифрования.
- В системах с SELinux или AppArmor может потребоваться пересчёт меток или дополнительная работа с контекстами; после вмешательств проверь целостность меток.
- Метод подходит, если у тебя физический или консольный доступ к машине. В облачных средах или на VPS — загрузчик и доступ могут быть ограничены (console/serial/bootloader провайдера).
- После успешного восстановления стоит проверить целостность `/etc/shadow`, `/etc/passwd` и убедиться, что root имеет нужные права и оболочку.
Заключение
Этот способ — быстрый “аварийный” метод сброса root-пароля через GRUB и init.
На современных системах он может быть ограничен безопасностью (пароль GRUB, шифрование, защита загрузчика), но во многих случаях выручает.
Главное: действуй аккуратно и убедись, что ты знаешь, на каком диске и разделе происходят изменения.