Как скомпилировать дополнительные файлы в корневой каталог Android ROM

8

Я создаю собственное ядро ​​Android на основе исходного кода ядра Cyanogenmod ROM. Я хотел бы добавить папки и файлы в корневую папку ОС ( /). Например, после компиляции моего ядра, я хотел бы создать дополнительную папку с именем toto(absolute path = /toto).

Я действительно понятия не имею, какие файлы нужно редактировать и как выполнять работу.


Примечание. Если вы пользователь Android (а не разработчик ПЗУ), который хочет добавить файлы к себе rootfs, см. Соответствующий вопрос на Android.SE .

deadeert
источник
3
Android - это система Linux, но, поскольку этот вопрос относится к Android, а не ко всем Unixes. Лучшее место для этого на android.stackexchange.com
enedil
@enedil Вообще говоря, вопросы об Android здесь не по теме, так как Android не является Linux в обычном смысле этого слова (он просто использует ядро ​​Linux). Однако тот же вопрос применим и к другим встроенным системам Linux, поэтому я думаю, что здесь все в порядке.
Жиль "ТАК - перестань быть злым"
@Graeme На самом деле корневая файловая система компилируется в каждое ядро. Обычно он пуст, и мы распаковываем в него архив cpio - наш образ initramfs. Вы можете положить все, что вы хотите, хотя во время компиляции.
mikeserv
@enedil В этом случае я считаю, что этот вопрос полностью по теме. Android больше всего отличается от других Unix-систем, userspace,но от других Linux-систем in-kernelразница составляет всего несколько патчей. Фактически, популярность Android является основной движущей силой в разработке ядра, и вот уже несколько лет. Посмотрите журналы изменений kernel.org и сами решите, насколько они актуальны для мобильных систем, в частности для Android.
mikeserv
Аналогичный вопрос на Android.SE: как распаковать и отредактировать boot.imgдля портирования ПЗУ? Ответы там объясняют, как получить и отредактировать boot.imgфайл, позволяя постоянно изменять содержимое корневого каталога устройства.
WhiteWinterWolf

Ответы:

7

На Android, как и на многих системах Linux на основе ядро первого монтирует initramfs на /. Initramfs хранится в оперативной памяти; он загружается из архива CPIO, который хранится вместе с самим ядром (или в другом месте, где его может найти загрузчик).

Большинство настольных систем Linux имеют небольшие initramfs, которые содержат достаточно программ и файлов конфигурации для монтирования реальной корневой файловой системы, которая затем монтируется /, заменяя initramfs. Android, как и некоторые встроенные системы Linux, сохраняет initramfs навсегда. Initramfs Android содержит только /init, adbdи несколько конфигурационных файлов.

Для Cyanogenmod вы можете найти инструкции по сборке в руководстве по портированию . Вы хотите скопировать больше файлов на виртуальный диск (образ initramfs, в терминологии Android), поэтому вам необходимо добавить их в PRODUCT_COPY_FILESсписок в device_*.mkmake-файле для вашего устройства.

Жиль "ТАК - перестань быть злым"
источник
На самом деле наш файл initramfs образа содержит то, что содержит эти файлы конфигурации, initramfs файловая система компилируется в каждое ядро.
mikeserv
1
@mikeserv Я приглашаю вас ознакомиться с понятием метонимии . Техническое письмо использует это меньше, чем обычная речь, но оно получает случайное использование.
Жиль "ТАК - перестань быть злым"
Я сделаю это, но сначала я должен проверить это в словаре ...
mikeserv
Вы делаете очень хорошее замечание, и, как я уже говорил ранее, единственная причина, по которой я непреклонен в этом, заключается в том, что кажется, что это так мало понято, но действительно очень прямолинейно, поэтому я склонен придираться к этой теме - за что я извиняюсь , Я просто думаю, что было бы проще показать другим, насколько просто можно спроектировать вашу собственную систему из ядра, если бы вышеприведенные детали были прояснены. Опять же, извини, Жиль, я не имею в виду никакого оскорбления.
mikeserv
@mikeserv Спасибо за ваши советы. Я нашел файл, используемый для копирования BLOB-объектов (blbs.mk). Я до сих пор не понимаю, какие файлы нужно редактировать, чтобы добавить папку в rootfs (/). Я могу получить доступ к файлам init * .rc rom, но теперь не могу, если редактирую (например, добавляя mkdir / titi), эти файлы позволят мне постоянно добавлять мои папки (/ titi). После этого я добавлю в файл PRODUCT_COPY_FILES + = / titi / myfile: <localpath> / myfiles. Любая подсказка?
Еще
1

Документы ядра объясняют, как упаковать изображение в само ядро. С kernel.org :

Что такое rootfs?

Rootfsэто особый экземпляр ramfs(или tmpfs, если он включен), который всегда присутствует в системах 2.6. Вы не можете размонтироватьrootfs по той же причине, по которой не можете убить процесс инициализации; вместо того, чтобы иметь специальный код для проверки и обработки пустого списка, ядру меньше и проще просто убедиться, что определенные списки не могут стать пустыми.

Большинство систем просто монтируют другую файловую систему rootfsи игнорируют ее. Количество места, которое занимает пустой экземпляр ramfs, ничтожно мало.

Если CONFIG_TMPFS включен, rootfsбудет использоваться tmpfsвместо ramfsпо умолчанию. Чтобы заставить ramfs, добавьте "rootfstype=ramfs"в командную строку ядра.

Что такое initramfs?

Все 2.6 ядра Linux содержат архив в"cpio"форматеgzipped, который извлекается rootfsпри загрузке ядра. После извлечения ядро ​​проверяет,rootfsсодержит ли файл файл"init" , и если это так, оно выполняет его как PID 1. Если он найден, этотinitпроцесс отвечает за доведение системы до конца, включая поиск и монтирование реального корневого устройства ( если есть) Еслиrootfsне содержитinitпрограмму послевстроенныйcpioархив извлекается в него, ядро будет проваливаться к старому кодучтобы найти и смонтировать корневой раздел,затем EXEC некоторый вариант/sbin/initиз этого.

Все это отличается от старого initrd в нескольких отношениях:

  • Старый initrd всегда был отдельным файлом, а архив initramfs связан с образом ядра linux. (Каталог linux - * / usr предназначен для создания этого архива во время сборки.)

  • Старый файл initrd представлял собой образ файловой системы в формате gzip (в каком-то формате, например ext2, для которого требовался встроенный в ядро ​​драйвер), в то время как новый архив initramfs представляет собой архив в формате gzip cpio (как и в tar, проще, см. Cpio (1) и Documentation / early-userspace / buffer-format.txt). Код извлечения cpio в ядре не только чрезвычайно мал, но также содержит текст и данные __init, которые могут быть отброшены в процессе загрузки.

  • Программа, запущенная старым initrd (которая называлась / initrd, а не / init), выполнила некоторую настройку и затем вернулась к ядру, в то время как не ожидается, что программа init из initramfs вернется к ядру. (Если / init нужно передать управление, он может смонтировать / с новым корневым устройством и выполнить другую программу init. См. Утилиту switch_root ниже.)

  • При переключении другого корневого устройства initrd будет pivot_root, а затем размонтирует виртуальный диск. Но initramfs - это rootfs: вы не можете ни pivot_root rootfs, ни размонтировать его. Вместо этого удалите все из rootfs, чтобы освободить место (find -xdev / -exec rm '{}' ';'), перемонтируйте rootfs с новым корнем (cd / newmount; mount --move. /; Chroot.), присоедините stdin / stdout / stderr к новой / dev / console и выполните новый init.

Так как это очень придирчивый процесс (и включает удаление команд до того, как вы сможете их запустить), пакет klibc представил вспомогательную программу (utils / run_init.c), которая сделает все это за вас. Большинство других пакетов (таких как busybox) назвали эту команду "switch_root".

Заполнение initramfs:

Процесс сборки ядра 2.6 всегда создает архив initramfs в формате gzipped cpio и связывает его с результирующим двоичным файлом ядра. По умолчанию этот архив пуст (занимает 134 байта в x86).

Опция конфигурации CONFIG_INITRAMFS_SOURCEGeneral Setup в menuconfig,и жизни в usr/Kconfig) может быть использован для указания источника для initramfsархива, который будет автоматически включен в результирующий двоичный файл. Эта опция может указывать на * существующийcpio архив gzipped *, каталог, содержащий файлы для архивации, или спецификацию текстового файла, такую ​​как следующий пример:

 dir /dev 755 0 0
 nod /dev/console 644 0 0 c 5 1
 nod /dev/loop0 644 0 0 b 7 0
 dir /bin 755 1000 1000
 slink /bin/sh busybox 777 0 0
 file /bin/busybox initramfs/busybox 755 0 0
 dir /proc 755 0 0
 dir /sys 755 0 0
 dir /mnt 755 0 0
 file /init initramfs/init.sh 755 0 0

Запустите " usr/gen_init_cpio" (после сборки ядра), чтобы получить сообщение об использовании, документирующее указанный выше формат файла.

Одним из преимуществ файла конфигурации является то, что rootдоступ не требуется для установки разрешений или создания узлов устройства в новом архиве.

(Обратите внимание, что эти две примерные записи "file" ожидают найти файлы с именами " init.sh" и " busybox" в каталоге с именем " initramfs" в linuxкаталоге -2.6. *. Для получения дополнительной информации см. Documentation / early-userspace / README .)

Ядро не зависит от внешних cpioинструментов. Если вы указали каталог вместо файла конфигурации, инфраструктура сборки ядра создаст файл конфигурации из этого каталога ( usr/Makefileвызовов scripts/gen_initramfs_list.sh) и приступит к пакетированию этого каталога с помощью файла конфигурации (передавая его в usr/gen_init_cpio, который создается из usr/gen_init_cpio.c). Код создания ядра во время сборки cpioполностью автономен, а экстрактор времени загрузки ядра (очевидно) также самодостаточен.

mikeserv
источник