Как окончательно отключить запрос root-password для режима восстановления, RHEL7

Примечание. Я задал аналогичный вопрос относительно версии 6 этих пакетов. Обратите внимание, что 7 использует systemd и может иметь другую реализацию

В редких случаях, когда системе RHEL или CentOS 7 не удалось загрузить (например) неправильное завершение работы или принудительный отказ проверки fsck-check при загрузке, консоль запросит у пользователя пароль root.

Как отключить проверку пароля и перейти непосредственно в корневую оболочку?

Неприемлемые ответы:

  • переопределение init в командной строке ядра (т. е. grub)
  • связывание / замена / sbin / sulogin с / sbin / sushell. (Это сработает, но оно поднимет красные флаги с помощью систем безопасности).
  • загрузка с другого устройства

Systemd работает со службами и целями . Цели эквивалентны уровням выполнения , сервисы эквивалентны сценариям инициализации . Большая часть конфигурации systemd находится в /etc/{init.d,rc*.d,inittab} /usr/lib/systemd , а стандартные init – в /etc/{init.d,rc*.d,inittab} .

Когда проблема загружается во время процесса загрузки (по умолчанию – getty.target или graphical.target , вы можете получить их с помощью systemctl get-default ). Systemd переключается на Emergency.target .

Эта «аварийная» цель будет, в свою очередь, загружать файл emergency.service . Эта служба содержит несколько строк и среди них:

 ... [Service] Environment=HOME=/root WorkingDirectory=/root ExecStartPre=-/bin/plymouth quit ExecStartPre=-/bin/echo -e 'Welcome to emergency mode! After logging in, type "journalctl -xb" to view\\nsystem logs, "systemctl reboot" to reboot, "systemctl default" to try again\\nto boot into default mode.' ExecStart=-/bin/sh -c "/sbin/sulogin; /usr/bin/systemctl --fail --no-block default" ... 

Нам просто нужно заменить вызов /sbin/sulogin :

 ExecStart=-/bin/sh -c "/sbin/sushell; /usr/bin/systemctl --fail --no-block default" 

И мы будем удаляться непосредственно в оболочку, вместо того, чтобы запрашивать пароль через sulogin. (Мы можем использовать /bin/sh , но /sbin/sushell падает в соответствии с ответами для CentOS6 / RHEL6. Фактически, sushell просто exec $SUSHELL который по умолчанию имеет значение /bin/bash .)

Чтобы сделать это изменение «постоянным», то есть невосприимчивым к обновлениям yum , внесите изменение в копию этого файла и поместите его в /etc/systemd/system/ . Кроме того, чтобы «режим спасения» работал одинаково, замените ту же строку в rescue.service . Вот сценарий оболочки / sed для упрощения процесса:

 for SERVICE in rescue emergency ; do sed '/^ExecStart=/ s%"/sbin/sulogin;%"/sbin/sushell;%' /usr/lib/systemd/system/$SERVICE.service > /etc/systemd/system/$SERVICE.service done 

Чтобы проверить это, убедитесь, что система в противном случае не используется, и сообщите systemd о переключении на цель rescue :

 systemctl rescue 

Это закроет сетевые подключения и откроет оболочку на консоли. Вы можете протестировать с помощью emergency цели, но это работает не так чисто (по какой-то причине), и может потребоваться полная перезагрузка.

Вы также можете проверить их из загрузочного меню (grub). Для тестирования аварийного режима это легко. Загрузите и когда вы получите меню, нажмите «e», чтобы отредактировать, и используйте D-pad для перехода к строке, начинающейся с linux16 и добавьте (нажмите CTRL-A чтобы добраться до конца строки):

 linux16 ... emergency 

Для тестирования режима спасения это те же шаги, что и выше, но вы должны быть более явными:

 linux16 ... systemd.unit=rescue.target 

Метод, который я использовал для обхода пароля root и доступа к корневой оболочке, – это отредактировать init в grub (строка ядра).

 init=/bin/bash