RootFileSystem против обновления ядра - PullRequest
0 голосов
/ 05 января 2019

Я знаю, что это две разные вещи, но в чем разница между настоящим ядром Linux и файловой системой rootFS, особенно с точки зрения расположения в памяти и обновлений?

Что касается разбиения, почему ядро ​​и rootFS почти всегда находятся в разных разделах? Не будет ли код ядра храниться в самой rootFS? Так как они на разных разделах в памяти?

Теперь, что касается обновления, я изучал инфраструктуру обновления OTA, которая утверждает, что выполняет полное обновление образа ядра. Он использует два отдельных раздела для rootFS. Если возникла проблема с обновлением одного раздела rootFS, он может вернуться к рабочему разделу rootFS, что имеет смысл. Тем не менее, как это на самом деле обновление ядра, хотя? Я не понимаю

1 Ответ

0 голосов
/ 06 января 2019

Я знаю, что это две разные вещи, но в чем разница между настоящим ядром Linux и файловой системой rootFS, особенно с точки зрения расположения в памяти и обновлений?

Ядро обычно представляет собой один файл изображения (например, zImage). В системах ARM ядру также необходим файл дерева устройств, но пока давайте избегать этого. RootFS, в свою очередь, является файловой системой, которая содержит все файлы в вашем /, такие как двоичные файлы (init, bash), файлы конфигурации (/etc), домашний каталог пользователя и так далее. Иногда RootFs содержит файл образа ядра, иногда нет, зависит от вашей конкретной системы.

Что касается разбиения, почему ядро ​​и rootFS почти всегда находятся в разных разделах? Не будет ли код ядра храниться в самой rootFS? Так как они на разных разделах в памяти?

Ключ к вашим вопросам - подумать о загрузчике (например, U-Boot или GRUB). Как только вы поймете, как процесс загрузки ОС работает в загрузчике, ответ автоматически откроется. Как вы упомянули, существуют разные схемы разбиения, что приводит к разнице в процессе загрузки. На самом деле, существует много различных схем загрузки. Давайте рассмотрим некоторые из них, и, надеюсь, это объяснит, что вы хотите знать.

  1. Ядро и rootfs на разных разделах. В этом случае загрузчик обычно считывает образ ядра в ОЗУ, передавая раздел rootfs через ядро ​​cmdline (через параметр root=). Затем загрузчик запускает выполнение ядра, а ядро ​​монтирует rootfs из раздела, указанного в параметре root=.
  2. Образ ядра находится внутри rootfs. В этом случае загрузчик должен знать, где именно находится образ ядра (например, в /boot/zImage). Загрузчик знает формат FS rootfs (например, ext4), читает /boot/zImage из rootfs в RAM. Затем выполнение продолжается, как в предыдущем пункте.
  3. Образ ядра и 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 формат) и предоставить второй раздел для обновлений.

...