Centos 7 заменить systemd скриптом - PullRequest
0 голосов
/ 05 сентября 2018

Я хочу сделать следующее: я хочу заменить программу systemd в моей установке CentOS 7 на скрипт , который в конечном итоге запустится оболочка, в которой пользователь может вводить команды от имени пользователя root на системной консоли.

Для этого я использовал параметр init = / sbin / myInit . В этом сценарии я выполняю некоторую инициализацию, и в конце я вызываю bash , чтобы позволить пользователю вводить команды. Интерактивный bash всегда появляется на экране.

К сожалению, есть проблема со вводом, которую я не смог решить: ввод не работает правильно. Когда я нажимаю ввод, работает только второй ввод, но новая строка на экране не выполняется. И когда я набираю некоторые символы, не все символы читаются. Похоже, что консоль находится в каком-то режиме Unicode ( stty -a показывает параметр iutf8 ), и bash не может правильно прочитать ввод. Вывод в порядке, все команды echo в моем скрипте правильно выводятся на экран (я печатаю только символы ASCII).

Я пробовал всевозможные комбинации, с разными LC_ALL настройками ( LC_ALL = C , LC_ALL = C.utf-8 , нет LC_ALL или LANG инициализация переменных), перенаправление stdin / stdout / stderr на / dev / console , / dev / tty0 или / dev / tty1 , переменная TERM инициализируется значением linux , но ничего не работает. Я пытался unicode_start и unicode_stop команды, но unicode_stop не работает, и я получаю сообщение об ошибке "stty: standard input: неспособен выполнить все запрошенные операции ». Если я запускаю команду showkey и нажимаю клавишу ввода, обнаруживается правильный код клавиши 28, как и при обычной загрузке.

Еще более странным является тот факт, что если я использую параметр ядра init = / bin / bash , то ввод работает нормально, и если я вручную запускаю свой скрипт, он также работает нормально. Если я копирую исполняемый файл bash во что-то вроде / bin / mys и использую init = / bin / mys , возникает такая же проблема ввода. Кажется, что образ initrd обрабатывает / bin / bash по-другому. Может быть, он выполняет некоторую инициализацию или что-то, что позволяет bash правильно читать с терминала. Почему мы имеем эту разницу между init = / bin / bash и init = / bin / mys ? Это тот же исполняемый файл в конце.

Что я делаю не так?

В качестве общего вопроса о программе init , может кто-нибудь объяснить мне, что должна делать программа init для правильной работы? Какие-то конкретные сигналы, на которые он должен реагировать, любая инициализация консоли должна быть выполнена?

Я пытаюсь решить это в течение нескольких дней, и я не могу найти никакого решения. В Интернете я не смог найти ни одной статьи об этом. Так что любое предложение будет с благодарностью. Спасибо.

1 Ответ

0 голосов
/ 05 сентября 2018

Мне удалось найти решение для этого.

Оказывается, при загрузке консоль не инициализируется. Я посмотрел на различия между выводом stty -a между обычной загрузкой и загрузкой скрипта ( init = / sbin / myInit ), и между ними есть некоторые различия: На консоли при нормальной загрузке были активны следующие флаги: brkint ignpar ixon imaxbell isig icanon iexten echo, а при загрузке сценария эти флаги были сброшены ( stty сообщает о них с -). Я не уверен, что они имеют в виду, за исключением флага эха, который я быстро заметил, потому что при каждом нажатии клавиши на экране не печатались символы.

Поэтому я решил установить эти флаги в моем скрипте инициализации для / dev / console. После просмотра справочной страницы stty я обнаружил параметр sane , который устанавливает самые важные флаги для нормальной работы консоли. Поэтому я добавил строку stty -F / dev / console sane в моем скрипте инициализации.

Но есть небольшая проблема. Кажется, что некоторые параметры консоли нельзя изменить командой stty , если консоль уже открыта процессом. Поэтому первое, что я сделал в своем скрипте, это перенаправил stdin / stdout / stderr на / dev / null через строку 0 / dev / null и затем добавьте строку stty sane , затем перенаправьте обратно stdin / stdout / stderr на / dev / console .

Я также заметил процесс с именем plymouth , который, вероятно, запущен CentOS initrd , так что до монтирования рута и запуска сценария init. Я не уверен, что этот процесс открыл системную консоль, но я решил устранить ее, восстановив персонализированный initrd , исключив модуль plymouth из dracut (опция -o Плимут ).

После этого скрипт работал нормально, и процесс bash, запущенный скриптом, мог правильно читать консоль.

Надеюсь, это когда-нибудь кому-нибудь поможет. Приветствия

...