Я знаю, что это две разные вещи, но в чем разница между настоящим ядром Linux и файловой системой rootFS, особенно с точки зрения расположения в памяти и обновлений?
Ядро обычно представляет собой один файл изображения (например, zImage
). В системах ARM ядру также необходим файл дерева устройств, но пока давайте избегать этого. RootFS, в свою очередь, является файловой системой, которая содержит все файлы в вашем /
, такие как двоичные файлы (init
, bash
), файлы конфигурации (/etc
), домашний каталог пользователя и так далее. Иногда RootFs содержит файл образа ядра, иногда нет, зависит от вашей конкретной системы.
Что касается разбиения, почему ядро и rootFS почти всегда находятся в разных разделах? Не будет ли код ядра храниться в самой rootFS? Так как они на разных разделах в памяти?
Ключ к вашим вопросам - подумать о загрузчике (например, U-Boot или GRUB). Как только вы поймете, как процесс загрузки ОС работает в загрузчике, ответ автоматически откроется. Как вы упомянули, существуют разные схемы разбиения, что приводит к разнице в процессе загрузки. На самом деле, существует много различных схем загрузки. Давайте рассмотрим некоторые из них, и, надеюсь, это объяснит, что вы хотите знать.
- Ядро и rootfs на разных разделах. В этом случае загрузчик обычно считывает образ ядра в ОЗУ, передавая раздел rootfs через ядро cmdline (через параметр
root=
). Затем загрузчик запускает выполнение ядра, а ядро монтирует rootfs из раздела, указанного в параметре root=
.
- Образ ядра находится внутри rootfs. В этом случае загрузчик должен знать, где именно находится образ ядра (например, в
/boot/zImage
). Загрузчик знает формат FS rootfs (например, ext4), читает /boot/zImage
из rootfs в RAM. Затем выполнение продолжается, как в предыдущем пункте.
- Образ ядра и rootfs передаются по сети (например, TFTP). В этом случае иногда rootfs помещается в RAM и монтируется как ramdisk (из RAM). В этом случае постоянное хранилище не используется, и любые изменения в rootfs будут потеряны после перезагрузки. Другой сетевой случай - когда rootfs монтируется через NFS, будет использоваться постоянное хранилище на сервере (прозрачно для пользователя).
Теперь, что касается обновления, я изучал инфраструктуру обновления OTA, которая утверждает, что выполняет полное обновление образа ядра. Он использует два отдельных раздела для rootFS. Если возникла проблема с обновлением одного раздела rootFS, он может вернуться к рабочему разделу rootFS, что имеет смысл. Тем не менее, как это на самом деле обновление ядра, хотя? Я не понимаю
С точки зрения обновлений, это не так уж и отличается, какую схему использовать,
(1) или (2). То, о чем вы говорите, называется (по крайней мере, в Android) A / B Seamless Updates , что означает, что два раздела (A и B) используются для хранения одного и того же изображения (например, старые rootfs и новые rootfs). Вы должны понимать, что нормально обновлять только rootfs без ядра. В разработке ядра есть правило, которое звучит так: «Мы не нарушаем пространство пользователя». Это означает, что вы можете полагаться на разные версии ядра для запуска одного и того же пользовательского пространства, или вы можете полагаться на одну версию ядра для запуска разных пользовательских пространств.
Так что это больше похоже на вопрос архитектуры: вы вообще хотите обновить ядро в вашей системе? Если да, то вам нужно предоставить два разных раздела для ядра и два раздела для rootfs. Или же вы можете поместить образ ядра и rootfs в один и тот же раздел (например, см. загрузочный образ Android формат) и предоставить второй раздел для обновлений.