Вопрос или проблема
С ядром 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 в процессе загрузки, как и в предыдущих версиях ядра.
Шаги решения:
-
Скачайте исходный код ядра, соответствующий вашей версии. В данном случае мы работаем с ядром 4.1 или 4.4.
-
Измените файл
tty_io.c
, найдите строку, где устанавливается параметр noctty:noctty = 1; // Измените на noctty = 0;
-
Соберите заново ядро, следуя стандартным инструкциям для вашего дистрибутива. Убедитесь, что все зависимости установлены, и выполнены необходимые команды для конфигурации и компиляции.
-
Перезагрузите систему, чтобы изменения вступили в силу.
Заключение
Теперь процесс загрузки должен реагировать на сочетание клавиш Ctrl + C, позволяя прерывать выполнение. Этот подход можно рассматривать как нестандартное решение, однако он показывает, что даже в сложных ситуациях с Linux можно найти пути обхода проблем. Обращайтесь к документированию своего ядра и сообществу Linux для получения дополнительной информации и поддержки.
Надеюсь, это руководство окажется полезным для вас и поможет восстановить функционал загрузки, который вы ищете.