Модуль инициализации запускает процессы системных служб с момента загрузки первым процессом пространства пользователя до старта первого приложения. Кроме того, этот модуль конфигурирует права доступа этих процессов во время запуска и обеспечивает их жизнеспособность после запуска их подпроцессов. В случае аномального завершения работы процесса, модуль должен перезапустить его и выполнить сброс системы для специального процесса.
base/startup/init/ # модуль инициализации
├── LICENSE
└── services
├── include # заголовочные файлы для модуля инициализации
├── src # исходные файлы для модуля инициализации
└── test # исходные файлы тестовых случаев для модуля инициализации
└── unittest
vendor
└── huawei
└── camera
└── init_configs # файлы конфигураций инициализации (в формате JSON, и развернутые в /etc/init.cfg после записи образа)
Модуль инициализации делит начальную загрузку системы на три этапа:
до-инициализация: операции, необходимые перед запуском системных служб, например, монтирование файловой системы, создание каталога и изменение прав доступа;
инициализация: операции, необходимые для запуска системных служб;
после-инициализация: операции, необходимые после запуска системных служб.
В файле init.cfg
каждый из вышеупомянутых этапов представлен задачей, которая соответствует набору команд. Модуль init_lite
инициализирует систему путём последовательного выполнения команд каждой задачи. Задачи выполняются в следующем порядке: до-инициализация > инициализация > после-инициализация. Все задачи хранятся в массиве jobs
файла init.cfg
. Кроме массива jobs, файл init.cfg также предоставляет массив services, который используется для хранения названий, путей исполняемых файлов, прав доступа и других атрибутов ключевых системных служб, которые должны быть запущены процессом init.
Файл хранится в директории /vendor/hisilicon/hispark_aries/init_configs/ внутри /etc/. Он имеет формат JSON, и его размер не может превышать OnClickListener 100 КБ.Формат и содержание файла init.cfg следующие:
{
"jobs": [{
"name": "pre-init",
"cmds": [
"mkdir /testdir",
"chmod 0700 /testdir",
"chown 99 99 /testdir",
"mkdir /testdir2",
"mount vfat /dev/mmcblk0p0 /testdir2 noexec nosuid"
]
},
{
"name": "init",
"cmds": [
"start service1",
"start service2"
]
},
{
"name": "post-init",
"cmds": []
}
],
"services": [{
"name": "service1",
"path": "/bin/process1",
"uid": 1,
"gid": 1,
"secon": "u:r:untrusted_app:s0",
"once": 0,
"importance": 1,
"caps": [0, 1, 2, 5]
},
{
"name": "service2",
"path": "/bin/process2",
"uid": 2,
"gid": 2,
"secon": "u:r:untrusted_app:s0",
"once": 1,
"importance": 0,
"caps": []
}
]
}
```**Таблица 1** Описание задач<a name="table1801509284"></a>
<table>
<thead align="left">
<tr id="row680703289">
<th class="cellrowborder" valign="top" width="13.4%" id="mcps1.2.3.1.1">
<p id="p11805012282"><a name="p11805012282"></a><a name="p11805012282"></a>Название задачи</p>
</th>
<th class="cellrowborder" valign="top" width="86.6%" id="mcps1.2.3.1.2">
<p id="p2811605289"><a name="p2811605289"></a><a name="p2811605289"></a>Описание</p>
</th>
</tr>
</thead>
<tbody>
<tr id="row178140112810">
<td class="cellrowborder" valign="top" width="13.4%" headers="mcps1.2.3.1.1">
<p id="p6811809281"><a name="p6811809281"></a><a name="p6811809281"></a>pre-init</p>
</td>
<td class="cellrowborder" valign="top" width="86.6%" headers="mcps1.2.3.1.2">
<p id="p18115019284"><a name="p18115019284"></a><a name="p18115019284"></a>Задача, выполняемая первой. В этой задаче выполняются операции (например, создание папки), необходимые до запуска процесса.</p>
</td>
</tr>
<tr id="row381120182817">
<td class="cellrowborder" valign="top" width="13.4%" headers="mcps1.2.3.1.1">
<p id="p148116002812"><a name="p148116002812"></a><a name="p148116002812"></a>init</p>
</td>
<td class="cellrowborder" valign="top" width="86.6%" headers="mcps1.2.3.1.2">
<p id="p14818016288"><a name="p14818016288"></a><a name="p14818016288"></a>Задача, выполняемая между другими. В этой задаче выполняются операции (например, запуск службы).</p>
</td>
</tr>
<tr id="row181100162813">
<td class="cellrowborder" valign="top" width="13.4%" headers="mcps1.2.3.1.1">
<p id="p3811804281"><a name="p3811804281"></a><a name="p3811804281"></a>post-init</p>
</td>
<td class="cellrowborder" valign="top" width="86.6%" headers="mcps1.2.3.1.2">
<p id="p18116016285"><a name="p18116016285"></a><a name="p18116016285"></a>Задача, выполняемая последней. В этой задаче выполняются операции (например, монтирование устройства после инициализации драйвера), необходимые после запуска процесса.</p>
</td>
</tr>
</tbody>
</table></table>Одна задача может содержать максимум 30 команд (в настоящее время поддерживаются только **start**, **mkdir**, **chmod**, **chown**, **mount** и **loadcfg**). Имя команды и ее параметры (не более 128 байт) должны разделаться только одним пробелом.**Таблица 2** Поддерживаемые команды в задаче<a name="table122681439144112"></a>
<table>
<thead align="left">
<tr id="row826873984116">
<th class="cellrowborder" valign="top" width="10.15%" id="mcps1.2.4.1.1">
<p id="p826833919412"><a name="p826833919412"></a><a name="p826833919412"></a>Команда</p>
</th>
<th class="cellrowborder" valign="top" width="34.09%" id="mcps1.2.4.1.2">
<p id="p3381142134118"><a name="p3381142134118"></a><a name="p3381142134118"></a>Формат и пример</p>
</th>
<th class="cellrowborder" valign="top" width="55.76%" id="mcps1.2.4.1.3">
<p id="p1268539154110"><a name="p1268539154110"></a><a name="p1268539154110"></a>Описание</p>
</th>
</tr>
</thead>
<tbody>
<tr id="row142681039124116">
<td class="cellrowborder" valign="top" width="10.15%" headers="mcps1.2.4.1.1">
<p id="p2083714604313"><a name="p2083714604313"></a><a name="p2083714604313"></a>mkdir</p>
</td>
<td class="cellrowborder" valign="top" width="34.09%" headers="mcps1.2.4.1.2">
<p id="p143811842154111"><a name="p143811842154111"></a><a name="p143811842154111"></a>mkdir <em id="i59061027135319"><a name="i59061027135319"></a><a name="i59061027135319"></a>целевой_каталог</em></p>
<p id="p4377174213435"><a name="p4377174213435"></a><a name="p4377174213435"></a>Пример: mkdir /storage/myDirectory</p>
</td>
<td class="cellrowborder" valign="top" width="55.76%" headers="mcps1.2.4.1.3">
<p id="p56817536457"><a name="p56817536457"></a><a name="p56817536457"></a>Создает каталог. Команда <strong id="b1111653719537"><a name="b1111653719537"></a><a name="b1111653719537"></a>mkdir</strong> и целевой каталог должны быть разделены только одним пробелом.</p>
</td>
</tr>
<tr id="row1268133919413">
<td class="cellrowborder" valign="top" width="10.15%" headers="mcps1.2.4.1.1">
<p id="p97961563461"><a name="p97961563461"></a><a name="p97961563461"></a>chmod</p>
</td>
<td class="cellrowborder" valign="top" width="34.09%" headers="mcps1.2.4.1.2">
<p id="p20381144234118"><a name="p20381144234118"></a><a name="p20381144234118"></a>chmod <em id="i15124416538"><a name="i15124416538"></a><a name="i15124416538"></a>разрешение</em> <em id="i1056644195314"><a name="i1056644195314"></a><a name="i1056644195314"></a>целевой_объект</em></p>
<td class="cellrowborder" valign="top" width="55.76%" headers="mcps1.2.4.1.3">
<p id="p1268133919413">Устанавливает права доступа для файла или директории. Разрешение должно быть указано в виде цифрового значения или символьной строки.</p>
</td>
</tr>
</tbody>
</table><table>
<tbody>
<tr>
<td class="cellrowborder" valign="top" width="44. 24%">
<p id="p6334213124413"><a name="p6334213124413"></a><a name="p6334213124413"></a>Примеры: chmod 0600 /storage/myFile.txt</p>
<p id="p1748214543444"><a name="p1748214543444"></a><a name="p1748214543444"></a>chmod 0750 /storage/myDir</p>
</td>
<td class="cellrowborder" valign="top" width="55. 76%" headers="mcps1. 2. 4. 1. 3">
<p id="p1748214543444"><a name="p1748214543444"></a><a name="p1748214543444"></a>Изменяет права доступа к файлам и директориям. Команда <strong id="b1111653719537"><a name="b1111653719537"></a><a name="b1111653719537"></a>chmod</strong> принимает два аргумента: первым указывается число, представляющее собой набор битовых значений прав доступа, вторым — путь к файлу или директории.</p>
<p id="p2023822074614"><a name="p2023822074614"></a><a name="p2023822074614"></a>Изменяет права доступа, которые должны быть в формате <strong id="b8112193214139"><a name="b8112193214139"></a><a name="b8112193214139"></a>0<em id="i11455534181314"><a name="i11455534181314"></a><a name="i11455534181314"></a>xxx</em></strong>. Команда <strong id="b2675148175310"><a name="b2675148175310"></a><a name="b2675148175310"></a>chmod</strong>, аргумент <em id="i46798488538"><a name="i46798488538"></a><a name="i46798488538"></a>permission</em> и целевой объект <em id="i667944825318"><a name="i667944825318"></a><a name="i667944825318"></a>target</em> должны быть разделены только одним пробелом.</p>
</td>
</tr>
</tbody>
</table><tr id="row7268143918416">
<td class="cellrowborder" valign="top" width="10.15%" headers="mcps1.2.4.1.1">
<p id="p8255346174610"><a name="p8255346174610"></a><a name="p8255346174610"></a>chown</p>
</td>
<td class="cellrowborder" valign="top" width="34.089999999999996%" headers="mcps1.2.4.1.2">
<p id="p238114423418"><a name="p238114423418"></a><a name="p238114423418"></a>chown uid gid <em id="i161565145312">целевой_объект</em></p>
<p id="p1118592184518"><a name="p1118592184518"></a><a name="p1118592184518"></a>Пример: chown 900 800 /storage/myDir</p>
<p id="p1235374884510"><a name="p1235374884510"></a><a name="p1235374884510"></a>chown 100 100 /storage/myFile.txt</p>
</td>
<td class="cellrowborder" valign="top" width="55.76%" headers="mcps1.2.4.1.3">
<p id="p18408185817467"><a name="p18408185817467"></a><a name="p18408185817467"></a>Изменяет владельца и группу. Команда <strong id="b19641958195310">chown</strong>, аргумент <strong id="b15698584534">uid</strong>, аргумент <strong id="b1692058135310">gid</strong> и целевой объект <em id="i56935885316">target</em> должны быть разделены только одним пробелом.</p>
</td>
</tr>```markdown
<tr id="row109751379478">
<td class="cellrowborder" valign="top" width="10.15%" headers="mcps1.2.4.1.1">
<p id="p1017823174717"><a name="p1017823174717"></a><a name="p1017823174717"></a>mount</p>
</td>
</tr>
<tr id="row1334911198482">
<td class="cellrowborder" valign="top" width="10.15%" headers="mcps1.2.4.1.1">
<p id="p1214153117480"><a name="p1214153117480"></a><a name="p1214153117480"></a>mount</p>
</td>
<td class="cellrowborder" valign="top" width="34.09%" headers="mcps1.2.4.1.2">
<p id="p133816420411"><a name="p133816420411"></a><a name="p133816420411"></a>mount fileSystemType src dst flags data</p>
<p id="p2036714132541"><a name="p2036714132541"></a><a name="p2036714132541"></a>Пример: mount vfat /dev/mmcblk0 /sdc rw,umask=000</p>
<p id="p115951820185412"><a name="p115951820185412"></a><a name="p115951820185412"></a>Пример: mount jffs2 /dev/mtdblock3 /storage nosuid</p>
</td>
<td class="cellrowborder" valign="top" width="55.76%" headers="mcps1.2.4.1.3">
<p id="p11976107144710"><a name="p11976107144710"></a><a name="p11976107144710"></a>Монтирует устройство. Каждые два параметра должны быть разделены только одним пробелом. В настоящее время поддерживаются флаги <strong id="b5512525411"><a name="b5512525411"></a><a name="b5512525411"></a>nodev</strong>, <strong id="b41014514541"><a name="b41014514541"></a><a name="b41014514541"></a>noexec</strong>, <strong id="b5101152543"><a name="b5101152543"></a><a name="b5101152543"></a>nosuid</strong>, <strong id="b20103555419"><a name="b20103555419"></a><a name="b20103555419"></a>rdonly</strong>, а также опционально <strong id="b41045175420"><a name="b41045175420"></a><a name="b41045175420"></a>data</strong>.</p>
</td>
</tr>
<tr id="row1334911198482">
<td class="cellrowborder" valign="top" width="10.15%" headers="mcps1.2.4.1.1">
<p id="p1214153117480"><a name="p1214153117480"></a><a name="p1214153117480"></a>start</p>
</td>
Запускает службу. serviceName должно находиться в массиве services.
Извините за возможную путаницу, но выше представлен перевод только первой строки команды start
. Давайте продолжим с остальной частью:```markdown
mount fileSystemType src dst flags data
Пример: mount vfat /dev/mmcblk0 /sdc rw,umask=000
Пример: mount jffs2 /dev/mtdblock3 /storage nosuid
Монтирует устройства. Каждые два параметра должны быть разделены только одним пробелом. В настоящее время поддерживаются флаги nodev, noexec, nosuid, rdonly, а также опционально data.
``````markdown...
Пример: loadcfg /patch/fstab.cfg
Загружает другие .cfg файлы. Максимальный размер целевого файла (в настоящее время поддерживаются только /patch/fstab.cfg) составляет 50 КБ. Каждая строка в файле /patch/fstab.cfg представляет команду. Типы и форматы команд должны соответствовать требованиям, указанным в этой таблице. Разрешено максимум 20 команд.
... |
Контекст безопасности текущего сервисного процесса (в настоящее время установка не требуется).
once
Показывает, является ли текущий сервисный процесс одноразовым.
1: Текущий сервисный процесс является одноразовым. Если процесс завершается, демон init не будет его перезапускать.
0: Текущий сервисный процесс не является одноразовым. Если процесс завершается, демон init перезапустит его после получения сигнала SIGCHLD.
Примечание: Если процесс несколько раз завершается, демон init больше не будет перезапускать его после пятого завершения.
importance
Указывает, является ли текущий сервисный процесс ключевым системным процессом.
0: Текущий сервисный процесс не является ключевым системным процессом.
1: Текущий сервисный процесс является ключевым системным процессом. Если он завершается, инициализирующий процесс сбрасывает и перезапускает систему.
Необходимые возможности для текущего сервиса. Они оцениваются на основе поддерживаемых возможностей безопасности подсистемы и конфигурируются в соответствии с принципом наименьших прав. В настоящее время можно настроить максимум 100 значений.
## Участвующие репозитории[startup_init_lite]
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )