LINUX.ORG.RU

Абсолютно минимальный init

 


0

0

Что должен делать абсолютно минимальный init, написанный, например, на shell? Может, несу чушь, но, имхо, только пускать daemon'ов (или service'ов? Как правильно и в чем различие?)?

Только ловить завершающиеся процессы.

for (;;) {
    waitpid(-1, ...);
}

И в самом начале fork+exec какого-нибудь бинарника, делающего всю работу по запуску системы.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

А что означает «ловить завершающиеся процессы»? Что произойдет, если этого не делать? Каким образом эту проблему решают дистры, где вместо нормального init'а, например, shell-скрипт?

qzxcvbnm
() автор топика
Последнее исправление: qzxcvbnm (всего исправлений: 1)
Ответ на: комментарий от qzxcvbnm

Ловить — это делать для них waitpid(). Если этого не делать, завершившиеся процессы останутся в состоянии zombie, таблица процессов постепенно забьётся и системе настанет каюк.

Шелл-скрипт вместо инита не может быть никак. Так называемый sysvinit — это и есть минимальный init (чуть менее минимальный, чем я привёл — у него есть конфиг и понятие runlevel'ов) плюс скриптота, которая запускается этим init'ом.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 2)
Ответ на: комментарий от intelfx

Шелл-скрипт вместо инита не может быть никак

в initramfs именно так и есть

anonymous
()
Ответ на: комментарий от intelfx

Ясно. У меня, просто, идея одна есть. Значит придется часть, которая отвечает за отлов zombie, делать на C, а «скриптоту» на scheme. Из примеров маленьких init'ов, где можно подчерпнуть реализацию, я знаю, разве что, sinit.

qzxcvbnm
() автор топика
Ответ на: комментарий от anonymous

Если в системе из запущенного только шелл, так можно, да (равносильно init=/bin/sh). Но я говорил про нормальные иниты.

intelfx ★★★★★
()
Ответ на: комментарий от qzxcvbnm

Вот. sinit — это он и есть. Это почти for-wait. Там он ждёт SIGCHLD и уже по сигналу делает waitpid().

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

Меня интересует этот момент. Т.е. этим делом может заниматься и шелл, так? Может ли то же самое делать, например, интерпретатор другого яп?

qzxcvbnm
() автор топика

Ловить и убивать зомби-процессы. Всё остальное опционально. Но чтобы всё нормально работало, надо монтировать /dev, /proc, /sys, монтировать / в rw режиме (не помню точно, возможно это initramfs делает). По-хорошему надо syslogd запустить ну и gettty, чтобы залогиниться можно было. sshd, если стоит, тоже.

Написать свой init довольно просто и проблем не должно составлять. Вопрос только в том, что поставляемые в твою систему пакеты с демонами уже содержат загрузочные скрипты, и тебе надо их выполнять, мимикрируя под sysvinit/systemd/whatever. Либо переписывать загрузочные скрипты под твою схему. Тоже вариант, в принципе, особенно если делаешь решение для себя, а не для всех.

Legioner ★★★★★
()

Что должен делать абсолютно минимальный init, написанный, например, на shell?

Он должен делать не менее того для чего нужен этот самый абсолютно минимальный init.

Всегда ваш. К.О.

init_6 ★★★★★
()
Ответ на: комментарий от qzxcvbnm

Может ли то же самое делать, например, интерпретатор другого яп?

А почему нет? Если кто-то запрещает то набей ему морду.

init_6 ★★★★★
()
Ответ на: комментарий от anonymous

Можно предположить, что шелл будет ловить только своих непосредственных потомков. Но я на самом деле не знаю.

intelfx ★★★★★
()
Ответ на: комментарий от qzxcvbnm

Никто ему не запрещает. Но можно ли так по факту — кто бы знал.

intelfx ★★★★★
()
Ответ на: комментарий от qzxcvbnm

Меня интересует этот момент. Т.е. этим делом может заниматься и шелл, так? Может ли то же самое делать, например, интерпретатор другого яп?

Вопрос, например, в том, каким образом происходит так, что при завершении родительского процесса его подменяет процесс с PID=1, т.е. init. Мне почему-то кажется, что это ядро так работает. Поэтому у способа с шеллом будут проблемы.

happycorsair
()
Ответ на: комментарий от happycorsair

Ты не прав, PID 1 никого не подменяет. Задача init'а в отношении завершающихся процессов состоит в том, чтобы делать для всех них waitpid().

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от anonymous

Естественно. Но шелл в таком случае должен перехватывать SIGCHLD и корректно делать waitpid() для таких «внезапных» потомков. А он имеет полное право этого не делать (т. е. если форкнул один процесс — его и waitpid, а на остальных пофиг).

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от anonymous

Ну ок. Тогда да, можно извернуться и иметь PID 1 на шелле.

intelfx ★★★★★
()

Все, всем спасибо.

qzxcvbnm
() автор топика
Ответ на: комментарий от init_6

Надо чтобы „интерпретатор другого яп“ умел ловить сигчайлд и делал wait(). Иначе будет куча зомбей, которые зохавают твою память.

nanoolinux ★★★★
()
Ответ на: комментарий от nanoolinux

Надо чтобы „интерпретатор другого яп“ умел ловить сигчайлд и делал wait(). Иначе будет куча зомбей, которые зохавают твою память.

Вот жеш печалька а! А мне так хотелось init на вижуалбасике или на фортране 66

init_6 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.