2015-03-26 2 views

ответ

0

Они оба выполняют точно ту же самую функцию, которая должна перейти к «реальному» корню и execv(3) «реальной» init(8) программы из initramfs. Они оба предполагают, что файловая система, которая должна стать корнем, была смонтирована в какой-то директории, которую они принимают в качестве аргумента.

(An initramfs является (обычно) временная файловая система в памяти загружается загрузчиком. Его цель состоит в том, чтобы делать какие-либо настройки, которые могут потребоваться перед установкой вещественный корень и переход к реальной init программе.)

Недавний исходный код для run-init можно найти here. run_init() - это точка входа (от run-init.c, которая анализирует аргументы).

Недавний исходный код для switch_root можно найти here. switch_root_main() - точка входа.

Код не подходит для обеих реализаций (хотя и немного сложный), что позволяет легко сравнивать их на глаз. Единственная разница, по-видимому, заключается в том, что они выполняют несколько иные проверки на работоспособность, и что в последних версиях run-init есть дополнительная опция для удаления выбранных capabilities(7) до execv() 'в новом init.

+0

Странно, я нашел несколько старых [патчей] (http://www.zytor.com/pipermail/klibc/2011-July/002980.html), которые, между прочим, переименовывают 'run_init' в 'switch_root' в klibc. Не знаете, почему они не находятся в [klibc-2.0.4] (https://www.kernel.org/pub/linux/libs/klibc/2.0/). – Ulfalizer