Понимание Linux Command Init

В этом является родителем всех процессов Linux. Это первый процесс, который запускается при загрузке компьютера и работает до тех пор, пока система не выключится. Это предок всех других процессов.

Его основная роль заключается в создании процессов из скрипта, хранящегося в файле / etc / inittab. Этот файл обычно хранит записи, которые заставляют Init вызывать gettys в каждой строке, в которую пользователи могут войти. Он также контролирует автономные процессы, требуемые любой конкретной системой.

Уровни

Уровень выполнения — это программная конфигурация системы, которая позволяет выполнять только выбранную группу процессов. Процессы, порожденные Init для каждого из этих уровней запуска, определены в файле / etc / inittab. Init может иметь один из восьми уровней выполнения: от 0 до 6 и S или s. Уровень запуска изменяется, если привилегированный пользователь запускает Telinit, который отправляет соответствующие сигналы в Init, сообщая ему, какой уровень запуска следует изменить.

Уровни выполнения 0, 1 и 6 зарезервированы. Уровень запуска 0 используется для остановки системы, уровень запуска 6 используется для перезагрузки системы, а уровень запуска 1 используется для перевода системы в однопользовательский режим. Уровень запуска S предназначен не для непосредственного использования, а для сценариев, которые выполняются при вводе уровня запуска 1.

Уровни выполнения с 7 по 9 также допустимы, хотя и недостаточно документированы, потому что «традиционные» варианты Unix их не используют. Уровни запуска S и S одинаковы. Внутренне они являются псевдонимами для одного и того же уровня выполнения.

Загрузка

После того, как Init вызывается как последний шаг последовательности загрузки ядра, он ищет файл / etc / inittab, чтобы увидеть, есть ли запись типа initdefault. Запись initdefault определяет начальный уровень запуска системы. Если такой записи нет (или ее нет / etc / inittab вообще), на системной консоли необходимо ввести уровень выполнения.

Уровень запуска S или s переводит систему в однопользовательский режим и не требует файла / etc / inittab. В однопользовательском режиме корневая оболочка открывается в / dev / console.

При входе в однопользовательский режим init считывает состояния ioctl консоли из /etc/ioctl.save. Если этот файл не существует, init инициализирует строку со скоростью 9600 бод и с настройками CLOCAL. Когда init выходит из однопользовательского режима, он сохраняет настройки ioctl консоли в этом файле, чтобы он мог повторно использовать их для следующего однопользовательского сеанса.

При первом входе в многопользовательский режим, Init выполняет записи boot и bootwait, чтобы разрешить монтирование файловых систем до того, как пользователи смогут войти в систему. Затем обрабатываются все записи, соответствующие уровню выполнения.

При запуске нового процесса Init сначала проверяет, существует ли файл / etc / initscript. Если это так, он использует этот скрипт для запуска процесса.

Каждый раз, когда дочерний процесс завершается, Init записывает факт и причину его смерти в / var / run / utmp и / var / log / wtmp, при условии, что эти файлы существуют.

Изменение уровней запуска

После того, как он порождает все указанные процессы, Init ожидает смерти одного из его дочерних процессов, сигнала отключения питания или до тех пор, пока Telinit не сообщит ему об изменении уровня выполнения системы. Когда выполняется одно из этих трех условий, он повторно проверяет файл / etc / inittab. Новые записи могут быть добавлены в этот файл в любое время. Однако init все еще ожидает выполнения одного из трех указанных выше условий. Чтобы обеспечить мгновенный ответ, команда Telinit Q или q может активировать Init для повторного изучения файла / etc / inittab.

Если Init не в однопользовательском режиме и получает сигнал отключения питания (SIGPWR), он читает файл / etc / powerstatus. Затем он запускает команду на основе содержимого этого файла:

  • ПРОВАЛ): Сбой питания, ИБП обеспечивает питание. Выполните записи powerwait и powerfail.
  • ХОРОШО): Питание восстановлено, выполните записи powerokwait.
  • НИЗКИЙ): Происходит сбой питания, а в ИБП разряжена батарея. Выполните записи powerfailnow.

Если / etc / powerstatus не существует или содержит что-либо кроме букв F, O или L, Init ведет себя так, как будто читает букву F.

Использование SIGPWR и / etc / powerstatus не рекомендуется. Любой, кто хочет взаимодействовать с Init, должен использовать канал управления / dev / initctl.

Когда Init запрашивается изменение уровня выполнения, он отправляет предупреждающий сигнал SIGTERM всем процессам, которые не определены в новом уровне выполнения. Затем он ждет пять секунд, прежде чем принудительно завершить эти процессы, используя сигнал SIGKILL. Обратите внимание, что Init предполагает, что все эти процессы и их потомки остаются в той же группе процессов, которую Init изначально создал для них. Если какой-либо процесс изменяет свою принадлежность к группе процессов, он не получает эти сигналы. Такие процессы должны быть прекращены отдельно.

Telinit

Telinit связан с / sbin / init. Он принимает односимвольный аргумент и сигнализирует Init, чтобы выполнить соответствующее действие. Следующие аргументы служат директивами для Telinit:

  • 0, 1, 2, 3, 4, 5 или 6: Скажите Init, чтобы переключиться на указанный уровень выполнения.
  • а, б, в: Скажите, чтобы Init обрабатывал только те записи файла / etc / inittab, которые имеют уровень выполнения a, b или c.
  • или же Q: Скажите Init, чтобы он повторно изучил файл / etc / inittab.
  • или же s: Скажите Init, чтобы переключиться в однопользовательский режим.
  • или же U: Скажите init повторно выполнить себя (сохранение состояния). Пересмотр файла / etc / inittab не производится. Уровень запуска должен быть S, s, 1, 2, 3, 4 или 5; в противном случае запрос игнорируется.

Telinit также может сообщить Init, как долго он должен ждать между процессами отправки сигналов SIGTERM и SIGKILL. По умолчанию это пять секунд, но это значение можно изменить с помощью опции -t sec.

Telinit может вызываться только пользователями с соответствующими привилегиями.

Двоичный файл Init проверяет, является ли он Init или Telinit, просматривая его идентификатор процесса. Реальный идентификатор процесса Init всегда равен 1. Из этого следует, что вместо вызова Telinit человек может использовать Init в качестве ярлыка.

Ссылка на основную публикацию