Как прервать процесс загрузки Linux, используя Control-C

Вопрос или проблема

С ядром 3.10.55 я могу прервать процесс загрузки Linux, нажав Ctrl + C.

Но с новейшими ядрами (4.1 и 4.4) Ctrl + C во время загрузки не работает — он отображает ^C, но не прерывает скрипт инициализации.

Я использую Slackware 64 14.1 и у меня есть простой тест для этого: добавьте в мой файл rc.local
следующие команды:

echo "Тест для Control-C - если не работает, нажмите Enter"
read 

И мне нужно нажать Enter, чтобы продолжить процесс загрузки.

Наконец, мне удалось заставить Control-C работать во время загрузки.
НО это решение — хак 🙁
Во время загрузки скрипты запуска имеют /dev/console в качестве своего stdin/stdout, и это не может быть настроено с помощью stty. Проблема заключается в установке этого устройства как NOCTTY в модуле ядра tty_io.c. Простое изменение *noctty = 1 на 0 и повторная сборка ядра работает отлично для меня.

Запустите

ps aux | grep < имя вашего процесса >

Первый набор чисел в результате списка каждой строки — это ваш pid.

Запустите

kill < номер pid >

Чтобы завершить этот процесс

.

Ответ или решение

Как прервать процесс загрузки Linux с помощью Control-C

Введение

Работа с Linux представлен надежными и мощными инструментами, однако некоторые функции могут вызывать определенные затруднения. Одной из таких функций является прерывание процесса загрузки с помощью сочетания клавиш Ctrl + C. Эта статья исследует, как это сделать в различных версиях ядра Linux, в частности в контексте Slackware 64 14.1 и управления стандартным вводом/выводом.

Проблема с прерыванием загрузки

В более ранних версиях ядра Linux, таких как 3.10.55, сочетание клавиш Ctrl + C успешно прерывает загрузочный процесс. Однако в новых версиях ядра, таких как 4.1 и 4.4, это поведение изменилось. Попытка нажать Ctrl + C во время загрузки приводит к отображению символа ^C, но не прерывает выполнение скриптов и не позволяет продолжить процесс загрузки.

Протестируем решение

Вы можете протестировать это поведение, добавив в файл rc.local следующий код:

echo "Test for Control-C - if does not work then press Enter"
read

Если сработает прерывание, вывод сообщения информации остановится, и вы сможете продолжить загрузку. В противном случае вам нужно будет нажать Enter для продолжения.

Причина проблемы

Основная причина, по которой Ctrl + C не срабатывает в новых версиях ядра, заключается в том, как настроен стандартный ввод/вывод для скриптов загрузки. Во время загрузки устройства stdin и stdout указывают на /dev/console, и они не могут быть настроены с помощью команды stty. Проблема заключается в том, что в коде ядра в файле tty_io.c параметр, определяющий режим NOCTTY, установлен в 1.

Решение проблемы: Хак

Я нашел решение, изменив этот параметр в коде ядра и перенастроив его на 0. Это позволяет использовать функциональность Ctrl + C в процессе загрузки, как и в предыдущих версиях ядра.

Шаги решения:

  1. Скачайте исходный код ядра, соответствующий вашей версии. В данном случае мы работаем с ядром 4.1 или 4.4.

  2. Измените файл tty_io.c, найдите строку, где устанавливается параметр noctty:

    noctty = 1; // Измените на noctty = 0;
  3. Соберите заново ядро, следуя стандартным инструкциям для вашего дистрибутива. Убедитесь, что все зависимости установлены, и выполнены необходимые команды для конфигурации и компиляции.

  4. Перезагрузите систему, чтобы изменения вступили в силу.

Заключение

Теперь процесс загрузки должен реагировать на сочетание клавиш Ctrl + C, позволяя прерывать выполнение. Этот подход можно рассматривать как нестандартное решение, однако он показывает, что даже в сложных ситуациях с Linux можно найти пути обхода проблем. Обращайтесь к документированию своего ядра и сообществу Linux для получения дополнительной информации и поддержки.

Надеюсь, это руководство окажется полезным для вас и поможет восстановить функционал загрузки, который вы ищете.

Оцените материал
Добавить комментарий

Капча загружается...