замена PID 1 в linux [closed]

-1
12.05.2019, 23:43
2 ответа

Первый процесс, запущенный во время загрузки, получает PID 1.

Первый процесс, запущенный во время загрузки, имеет задание: он должен запускать все остальные процессы прямо или косвенно. Все процессы¹ в конечном счете являются потомками этого процесса, поскольку, кроме ядра, запускающего программу во время загрузки, единственным способом создания процесса является выполнение каким-либо процессом системного вызова для создания нового процесса.

У процесса с PID 1 есть задание: если процесс умирает, когда у него есть запущенные дочерние процессы, идентификатор родительского процесса дочернего процесса устанавливается равным 1. Когда дочерние процессы умирают, PID 1 должен их пожинать, т.е. вызывать wait, иначе останется зомби дочернего процесса.

Различные программы, называемые init (существует несколько реализаций), выполняют обе эти задачи.

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

После нормального запуска системы невозможно заменить PID 1, потому что init не умирает. Init не только не умирает, потому что он запрограммирован на вечную работу (init должен работать до тех пор, пока система не выключится), но даже получает специальную защиту от сигналов, которые могут убить другие процессы, такие как SIGKILL.

Linux имеет функцию пространства имен PID, которая позволяет определять подсистему с собственным набором идентификаторов процессов. Процессы в пространстве имен PID имеют разные PID при просмотре внутри пространства имен и снаружи пространства имен. Первый процесс в пространстве имен получает PID 1 в пространстве имен. Вне пространства имен у него не будет PID 1 (если init не решит ввести новое пространство имен PID, но init этого не делает, потому что это помешает ему выполнять свою работу).

¹ Это не совсем так, в некоторых ядрах есть другие способы запуска процесса. Например, Linux запускает modprobe, когда какое-то оборудование обнаруживается при определенных обстоятельствах. Но потомки init составляют подавляющее большинство процессов.
² Сначала после initramfs или initrd.

8
28.01.2020, 05:06

В некотором смысле init особенный, как заметил Жилль. Если init умирает, в большинстве случаев вы получаете панику ядра, поэтому любой уважаемый автор init сделает многое, чтобы этого не произошло. С другой стороны, она очень похожа на любую другую программу в том смысле, что помимо работы с зомби-процессами, вы фактически можете использовать любую программу в качестве инициализатора. cat отлично работает, но не совсем полезен. один из способов, которым init является совершенно обычным, заключается в том, что он может вызывать execlve (exec и подобные), который заменяет одну программу другой, используя тот же pid. это используется, например, начальными корневыми дисками для запуска реальной инициализации после монтирования диска, с которого он будет запускаться.

0
28.01.2020, 05:06

Теги

Похожие вопросы