В этом является родителем всех процессов Linux. Это первый процесс, который начинается, когда компьютер загружается, и он работает до тех пор, пока система не выключится. Это предок всех других процессов.
Его основная роль заключается в создании процессов из сценария, хранящегося в файле / etc / inittab. В этом файле обычно хранятся записи, которые заставляют Init генерировать gettys в каждой строке, в которой пользователи могут войти. Он также контролирует автономные процессы, требуемые какой-либо конкретной системой.
Уровни
Уровень выполнения представляет собой программную конфигурацию системы, которая позволяет выполнять только выбранную группу процессов. Процессы, порожденные Init для каждого из этих уровней выполнения, определены в файле / etc / inittab. Init может находиться в одном из восьми уровней запуска: от 0 до 6 и S или s. Уровень выполнения изменяется с помощью привилегированного пользователя, запускающего Telinit, который отправляет соответствующие сигналы Init, сообщая ему, для какого уровня запуска изменить.
Уровни выполнения 0, 1 и 6 зарезервированы. Уровень запуска 0 используется для остановки системы, уровень запуска 6 используется для перезагрузки системы, а уровень запуска 1 используется для перехода системы в однопользовательский режим. Уровень Runlevel 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 выполняет записи загрузки и загрузочной записи, чтобы файловые системы могли монтироваться до того, как пользователи смогут войти в систему. Затем обрабатываются все записи, соответствующие уровню выполнения.
При запуске нового процесса Init сначала проверяет, существует ли файл / etc / initscript. Если это так, он использует этот скрипт для запуска процесса.
Каждый раз, когда ребенок заканчивается, Init записывает факт и причину, по которой он умер в / var / run / utmp и / var / log / wtmp, при условии, что эти файлы существуют.
Изменение уровней выполнения
После того, как он породит все указанные процессы, Init ожидает, что один из его процессов-потомков умрет, сигнал powerfail или пока Telinit не сообщит об изменении уровня запуска системы. Когда происходит одно из этих трех условий, он повторно просматривает файл / etc / inittab. Новые записи могут быть добавлены в этот файл в любое время. Тем не менее, init все еще ждет одного из трех вышеупомянутых условий. Чтобы обеспечить мгновенный отклик, команда Telinit Q или q может активировать Init для повторного изучения файла / etc / inittab.
Если Init не находится в однопользовательском режиме и получает сигнал powerfail (SIGPWR), он считывает файл / etc / powerstatus. Затем он запускает команду, основанную на содержимом этого файла:
- ПОТЕРПЕТЬ ПОРАЖЕНИЕ): Сила не работает, ИБП подает питание. Выполните команды powerwait и powerfail.
- ХОРОШО): Питание восстановлено, выполните записи powerokwait.
- НИЗКИЙ): Сила не работает, и ИБП разряжен. Выполните записи powerfailnow.
Если / etc / powerstatus не существует или содержит ничего, кроме букв F, O или L, Init ведет себя так, как если бы он читал букву F.
Использование SIGPWR и / etc / powerstatus не рекомендуется. Любой, кто хочет взаимодействовать с Init, должен использовать канал управления / dev / initctl.
Когда инициалу требуется изменить уровень выполнения, он отправляет предупреждающий сигнал SIGTERM ко всем процессам, которые не определены в новом уровне выполнения. Затем он ждет пять секунд до принудительного завершения этих процессов с использованием сигнала SIGKILL. Обратите внимание, что Init предполагает, что все эти процессы и их потомки остаются в той же группе процессов, для которой Init первоначально был создан для них. Если какой-либо процесс изменяет принадлежность группы процессов, он не получает эти сигналы. Такие процессы необходимо прекратить отдельно.
Telinit
Telinit связан с / sbin / init. Он принимает односимвольный аргумент и сигнализирует Init для выполнения соответствующего действия. Следующие аргументы служат в качестве директив для Telinit:
- 0, 1, 2, 3, 4, 5 или 6: Tell Init переключиться на указанный уровень выполнения.
- a, b, c: Tell Init обрабатывать только те записи / etc / inittab, имеющие уровень запуска a, b или c.
- Q или q: Tell Init пересмотреть файл / etc / inittab.
- S или s: Tell Init переключиться на однопользовательский режим.
- U или u: Попросите init повторно выполнить сам (сохраняя состояние). Не происходит повторного изучения файла / etc / inittab. Уровень запуска должен быть S, s, 1, 2, 3, 4 или 5; в противном случае запрос молча игнорируется.
Telinit также может сообщить Init, сколько времени должно ждать между процессами отправки сигналов SIGTERM и SIGKILL. Значение по умолчанию - пять секунд, но это значение можно изменить с помощью -t сек вариант.
Telinit может быть вызван только пользователями с соответствующими привилегиями.
Бинарный файл Init проверяет, является ли это Init или Telinit, просмотрев его идентификатор процесса. Идентификатор процесса реального Init всегда 1. Из этого следует, что вместо вызова Telinit человек может использовать Init в качестве ярлыка.




