Где заканчивается процесс / сценарий init?

Curl и sudo - один из вариантов:

curl -O 'https://improvement.abc.com/s3hkfiles/snbget.cgi/szubjkrgotc-xpra.repo'
sudo cp -i -v szubjkrgotc-xpra.repo /etc/yujhkm.rmepos.d

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

sudo curl -o /etc/yujhkm.rmepos.d 'https://improvement.abc.com/s3hkfiles/snbget.cgi/szubjkrgotc-xpra.repo'
1
02.12.2016, 05:22
2 ответа

Я понимаю, что, по крайней мере, в раннем пользовательском пространстве, init - это сценарий оболочки, из которого нельзя выйти. Это правильно?

Это не обязательно должен быть сценарий оболочки. Конечно, вы можете выйти из процесса init . Это вызовет панику ядра, но это можно сделать.

Так что же происходит, когда он подходит к концу?

В сценарии обычно есть строка типа exec switch_root / root "$ @" . Поскольку он использует exec , тот же идентификатор процесса накладывается на новый исполняемый двоичный файл.

Таким образом, программа, которая называется init , изменяется, и ядро ​​никогда не видит выхода из процесса init.

В свою очередь, switch_root exec s / sbin / init корневой файловой системы после очистки initramfs и привязки монтирования / root к / . Таким образом, init всегда остается PID 1.

Вы можете увидеть исходный код switch_root BusyBox здесь, на самом деле это довольно просто: https://git.busybox.net/busybox/plain/util-linux/switch_root.c Также есть длинный комментарий в конце, объясняющий, что происходит под капотом.

1
27.01.2020, 23:46

Процесс инициализации, / sbin / init не является сценарием оболочки и не завершается (при нормальных условиях).
Из https://en.wikipedia.org/wiki/Init

В компьютерных операционных системах на базе Unix init (сокращение от инициализации) - это первый процесс, запускаемый во время загрузки компьютерная система. Init - это процесс-демон, который продолжает работать до завершения работы системы.
Он является прямым или косвенным предком всех других процессов и автоматически принимает все потерянные процессы.

Это первый процесс пользовательского пространства, являющийся ветвью ядра и командой exec после инициализации ядра. Вот почему он называется PID1 (идентификатор процесса 1).

В настоящее время существуют различные реализации процесса инициализации, например upstart или systemd, причем исходные реализации основаны на systemV init.

В основном все они при загрузке читают файлы конфигурации для каждого процесса, который является кандидатом на запуск. Традиционно эти файлы конфигурации находятся в / etc / init / . Если процесс отмечен для запуска, то процесс запускается или - если его конфигурация говорит «не запускать меня при загрузке», то он не запускается, но может быть запущен вручную позже.
Если процесс помечен для запуска, то, как правило, они должны быть запущены, так это то, что система инициализации выполнит сценарий оболочки, соответствующий демону в /etc/init.d / .

Некоторые из различий между новыми системами инициализации и исходной системой V init заключаются в том, что система V использует числовые уровни выполнения, 0,1,2 и т. Д. Для определения состояния системы, а systemd или выскочка используют именованные идентификаторы, такие как mulit- user.target .

Также - я считаю - более новые системы инициализации запускают демоны сами и используют свои собственные так называемые "единичные" файлы для определения директив конфигурации, а не для вызова сценария оболочки.

например, для nginx существует файл конфигурации /lib/systemd/system/nginx.service , который определяет такие директивы запуска, как:

[Unit]
Description=A high performance web server and a reverse proxy server
After=network.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid
TimeoutStopSec=5
KillMode=mixed

[Install]
WantedBy=multi-user.target

Вы можете включить его с помощью команды типа sudo systemctl enable nginx.service , это создаст символическую ссылку в

/etc/systemd/system/multi-user.target.wants/nginx.service

, указывающую на файл модуля в:

/lib/systemd/system/nginx.service

sudo systemctl disable nginx.service удалит символическую ссылку, и служба не будет запущена при запуске.

Новые системы инициализации обратно совместимы со сценариями инициализации systemV и будут читать конфигурации в / etc / init и запускать сценарии оболочки в /etc/init.d

0
27.01.2020, 23:46

Теги

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