Я шел через учебник по настройке пользовательских initramfs, где говорится:
Единственное, чего не хватает - это / init, исполняемый файл в корне initramfs, который выполняется ядром после его загрузки. Поскольку sys-apps / busybox включает в себя полностью функциональную оболочку, это означает, что вы можете написать свой двоичный файл / init в виде простого сценария оболочки (вместо того, чтобы делать его сложным приложением, написанным на ассемблере или C, который нужно скомпилировать).
и дает пример init как сценарий оболочки, который начинается с #!/bin/busybox sh
До сих пор у меня сложилось впечатление, что init - это основной процесс, который запускается, и что все остальные процессы пользовательского пространства в конечном итоге являются потомками init. Тем не менее, в данном примере первый процесс фактически является результатом, bin/busybox/ sh
из которого позже создается init.
Это правильная интерпретация? Если бы у меня, например, был доступный интерпретатор, я мог бы написать init как скрипт Python и т. Д.?
источник
/
не исчезает в воздухе - он монтируется (хотя обычно все его содержимое удаляется перед тем, как сохранить память) . Это все еще там .switch_root
выполняет системный вызовswitchroot
- это то, что разработчики ядра предоставили, когда они изменили процесс загрузки в ядре 2.6. Что-то требующее initramfs. Это ядро делает магию.switchroot
Системный вызов действительно был бы для меня новость. У вас есть источник для этого? Если вы посмотрите на исходный код switch_root.c, то это будет довольно ручной процесс, который описан в Documentation / filesystems / ramfs-rootfs-initramfs.txt. Кроме того, если вы удалите все и смонтируете его, он в значительной степени исчезнет, не так ли?pivot_root
с другой стороны, это системный вызов.switch_root
Хотя он не используется и не может быть использован без прыжков через некоторые обручи, и в любом случае для этого ответа не имеет никакого значения, так что я просто полностью удалил его. Жаль, я думал, что магия и исчезновение в воздухе сработали очень хорошо ... :-Pswitch_root
за что я извиняюсь, и я благодарю вас за то, что вы показали мне, но это все равно ничего не пропадает. initramfs корень сохраняется и всегда там для всех - это есть корень.find -xdev / -exec rm '{}' ';'
cd /newmount; mount --move . /; chroot .
Системный вызов exec ядра Linux изначально недооценивает шебанги
Когда исполняемый файл начинается с магических байтов
#!
, они говорят ядру использовать#!/bin/sh
как:exec
системный вызов/bin/sh
Это то же самое, что происходит при запуске обычного сценария оболочки пользователя с:
Если файл начинался с магических байтов
.ELF
вместо#!
, ядро выберет загрузчик ELF, чтобы запустить его.Более подробно на: Почему люди пишут #! / Usr / bin / env pyb shebang в первой строке скрипта Python? | Переполнение стека
Как только вы это запомните, становится легко принять, что это
/init
может быть все, что может выполнить ядро, включая сценарий оболочки, а также почему/bin/sh
в этом случае будет первый исполняемый файл.Вот минимальный работающий пример для тех, кто хочет попробовать это: https://github.com/cirosantilli/linux-kernel-module-cheat/tree/cbea7cc02c868711109ae1a261d01fd0473eea0b#custom-init
источник