1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/openharmony-startup_init_lite

Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Инициализация

Введение

Модуль инициализации запускает процессы системных служб с момента загрузки ядром первого процесса пространства пользователя до момента запуска первого приложения. В дополнение к загрузке ключевых системных процессов, модуль должен настраивать их права доступа во время запуска и поддерживать жизнеспособность заданного процесса после запуска подпроцессов. Если процесс завершается异常退出,модуль должен перезапустить его и выполнить системный сброс для специальных процессов.

Структура директорий

base/startup/init/             # модуль инициализации
├── LICENSE
└── services
    ├── include                  # заголовочные файлы для модуля инициализации
    ├── src                      # исходные файлы для модуля инициализации
    └── test                     # исходные файлы тестовых случаев для модуля инициализации
        └── unittest
vendor
└──huawei
        └──camera
                └──init_configs  # файлы конфигурации инициализации (в формате JSON, и развернутые в /etc/init.cfg после записи образа)

Ограничения

В настоящее время модуль инициализации применим только к устройствам с малым объемом памяти (не менее 1 МБ), например, Hi3516D V300 и Hi3518E V300.## Использование

Инициализация делит запуск системы на три фазы:

pre-init: операции, необходимые до запуска системных служб, например, монтирование файловой системы, создание папки и изменение прав доступа.

init: операции, необходимые для запуска системных служб.

post-init: операции, необходимые после запуска системных служб.

В файле init.cfg каждая из указанных фаз представлена задачей, которая соответствует набору команд. Модуль init_lite инициализирует систему, выполняя команды в каждой задаче последовательно. Задачи выполняются в следующем порядке: pre-init > init > post-init. Все задачи хранятся в массиве jobs в файле init.cfg. Кроме массива jobs, файл init.cfg также предоставляет массив services, который используется для хранения имен, путей к исполняемым файлам, прав доступа и других атрибутов ключевых системных служб, которые необходимо запустить процессом init.

Файл хранится в /vendor/hisilicon/hispark_aries/init_configs/ под /etc/. Формат файла — JSON, и его размер не должен превышать 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" : [] } ] }

 <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="p1268133919413"><a name="p1268133919413"></a><a name="p1268133919413"></a>chmod <em id="i1268133919413">установленные права целевой папки</em></p>
  <p id="p1268133919413"><a name="p1268133919413"></a><a name="p1268133919413"></a>Пример: chmod 755 /storage/myDirectory</p>
  </td>
  <td class="cellrowborder" valign="top" width="55.76%" headers="mcps1.2.4.1.3 "><p id="p1268133919413"><a name="p1268133919413"></a><a name="p1268133919413"></a>Устанавливает права доступа для целевой папки. Команда <strong id="b1268133919413">chmod</strong> и параметры должны быть разделены только одним пробелом. </p>
  </td>
  </tr>
  </tbody>
  </table>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>
  <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>
  </tr>
  </tbody>
 </table><td class="cellrowborder" valign="top" width="55.76%" headers="mcps1.2.4.1.3">
 <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>разрешение</em> и <em id="i667944825318"><a name="i667944825318"></a><a name="i667944825318"></a>целевой объект</em> должны быть разделены только одним пробелом. </p>
 </td>
 </tr>
 <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"><a name="i161565145312"></a><a name="i161565145312"></a>целевой объект</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>Изменяет группу владельца.```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>chown</p>
</td>
<td class="cellrowborder" valign="top" width="89.85%" headers="mcps1.2.4.1.2">
<p>chown, uid, gid и target должны быть разделены только одним пробелом.</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>
```<p id="p1214153117480"><a name="p1214153117480"></a><a name="p1214153117480"></a>start</p>
</td>
<td class="cellrowborder" valign="top" width="34. 089999999999996%" headers="mcps1. 2. 4. 1. 2 ">
<p id="p133816420411"><a name="p133816420411"></a><a name="p133816420411"></a>start serviceName</p>
<p id="p2036714132541"><a name="p2036714132541"></a><a name="p2036714132541"></a>Пример: start foundation</p>
<p id="p115951820185412"><a name="p115951820185412"></a><a name="p115951820185412"></a>start shell</p>
</td>
<td class="cellrowborder" valign="top" width="55. 76%" headers="mcps1. 2. 4. 1. 3 ">
<p id="p4350121915488"><a name="p4350121915488"></a><a name="p4350121915488"></a>Запускает службы. <em id="i87951116544"><a name="i87951116544"></a><a name="i87951116544"></a>serviceName</em> должен быть включен в массив <strong id="b379981145417"><a name="b379981145417"></a><a name="b379981145417"></a>services</strong>. </p>
</td>
</tr>
<tr id="row96921442712">
<td class="cellrowborder" valign="top" width="10. 15%" headers="mcps1. 2. 4. 1. 1 ">
<p id="p1693642018"><a name="p1693642018"></a><a name="p1693642018"></a>loadcfg</p>
</td>
<td class="cellrowborder" valign="top" width="34. 089999999999996%" headers="mcps1. 2. 4. 1. 2 ">
<p id="p1969364211116"><a name="p1969364211116"></a><a name="p1969364211116"></a>loadcfg путь_файла</p>
<p id="p1858112368211"><a name="p1858112368211"></a><a name="p1858112368211"></a>Пример: loadcfg /patch/fstab. cfg</p>
</td>
<td class="cellrowborder" valign="top" width="55. 76%" headers="mcps1. 2. 4. 1. 3 ">
<p id="p13986141320510"><a name="p13986141320510"></a><a name="p13986141320510"></a>Загружает другие файлы <strong>. cfg</strong>. Максимальный размер целевого файла (в настоящее время поддерживаются только файлы <strong>/patch/fstab. cfg</strong>) составляет 50 КБ. Каждая строка в файле <strong>/patch/fstab. cfg</strong> является командой. Типы и форматы команд должны соответствовать их соответствующим требованиям, указанным в этой таблице. Разрешено не более 20 команд. </p>
</td>
</tr>
</tbody> </table>**Таблица 3** Элементы в массиве **services**<a name="table14737791471"></a>
  <table><thead align="left"><tr id="row273839577"><th class="cellrowborder" valign="top" width="10.37%" id="mcps1.2.3.1.1"><p id="p107382095711"><a name="p107382095711"></a><a name="p107382095711"></a>Поле</p>
  </th>
  <th class="cellrowborder" valign="top" width="89.63%" id="mcps1.2.3.1.2"><p id="p17738189277"><a name="p17738189277"></a><a name="p17738189277"></a>Описание</p>
  </th>
  </tr>
  </thead>
  <tbody><tr id="row17386911716"><td class="cellrowborder" valign="top" width="10.37%" headers="mcps1.2.3.1.1 "><p id="p17384912710"><a name="p17384912710"></a><a name="p17384912710"></a>name</p>
  </td>
  <td class="cellrowborder" valign="top" width="89.63%" headers="mcps1.2.3.1.2 "><p id="p1173818913714"><a name="p1173818913714"></a><a name="p1173818913714"></a>Имя текущего сервиса. Значение не может быть пустым и может содержать максимум 32 байта.</p>
  </td>
  </tr>
  <tr id="row1473810916714"><td class="cellrowborder" valign="top" width="10.37%" headers="mcps1.2.3.1.1 "><p id="p127381991571"><a name="p127381991571"></a><a name="p127381991571"></a>path</p>
  </td>
  <td class="cellrowborder" valign="top" width="89.63%" headers="mcps1.2.3.1.2 "><p id="p1073815910717"><a name="p1073815910717"></a><a name="p1073815910717"></a>Полный путь (включая параметры) исполняемого файла для текущего сервиса. Это массив. Убедитесь, что первый элемент — это путь исполняемого файла, максимальное количество элементов — 20, и каждый элемент — это строка, содержащая максимум 64 байта.</p>
  </td>
  </tr>
  <tr id="row77381291271"><td class="cellrowborder" valign="top" width="10.37%" headers="mcps1.2.3.1.1 "><p id="p77381391770"><a name="p77381391770"></a><a name="p77381391770"></a>uid</p>
  </td>
  <td class="cellrowborder" valign="top" width="89.63%" headers="mcps1.2.3.1.2 "><p id="p107387920711"><a name="p107387920711"></a><a name="p107387920711"></a>Идентификатор пользователя (UID) текущего сервисного процесса.</p>
  </td>
  </tr>
  </tbody>
  </table><tr id="row127381591673">
<td class="cellrowborder" valign="top" width="10. 37%" headers="mcps1. 2. 3. 1. 1 ">
<p id="p47388919715"><a name="p47388919715"></a><a name="p47388919715"></a>gid</p>
</td>
<td class="cellrowborder" valign="top" width="89. 63%" headers="mcps1. 2. 3. 1. 2 ">
<p id="p12738691479"><a name="p12738691479"></a><a name="p12738691479"></a>Идентификатор группы (GID) текущего сервисного процесса.</p>
</td>
</tr>
<tr id="row127381591693">
<td class="cellrowborder" valign="top" width="10. 37%" headers="mcps1. 2. 3. 1. 1">
<p id="p47388919793"><a name="p47388919793"></a><a name="p47388919715"></a>secon</p>
</td>
<td class="cellrowborder" valign="top" width="89. 63%" headers="mcps1. 2. 3. 1. 2">
<p id="p12738691493"><a name="p12738691493"></a><a name="p12738691493"></a>Контекст безопасности текущего сервисного процесса (в настоящее время настройка не требуется).</p>
</td>
</tr>
<tr id="row188301014171116">
<td class="cellrowborder" valign="top" width="10. 37%" headers="mcps1. 2. 3. 1. 1">
<p id="p183112146115"><a name="p183112146115"></a><a name="p183112146115"></a>once</p>
</td>
<td class="cellrowborder" valign="top" width="89. 63%" headers="mcps1. 2. 3. 1. 2">
<p id="p18548317195715"><a name="p18548317195715"></a><a name="p18548317195715"></a>Является ли текущий сервисный процесс одноразовым процессом.</p>
<p id="p103571840105812"><a name="p103571840105812"></a><a name="p103571840105812"></a><strong id="b7898115614817"><a name="b7898115614817"></a><a name="b7898115614817"></a>1</strong>: Текущий сервисный процесс является одноразовым процессом. Если процесс завершается, инициализирующий процесс не перезапускает его.</p>
<p id="p5831191431116"><a name="p5831191431116"></a><a name="p5831191431116"></a><strong id="b20971155820811"><a name="b20971155820811"></a><a name="b20971155820811"></a>0</strong>: Текущий сервисный процесс не является одноразовым процессом. Если процесс завершается, инициализирующий процесс перезапускает его при получении сигнала SIGCHLD.</p>
</td>
</tr><p id="p378912714010"><a name="p378912714010"></a><a name="p378912714010"></a>Примечание: Если неодноразовый процесс завершается пять раз подряд в течение четырех минут, инициализирующий процесс больше не будет перезапускать его при пятом завершении.</p>
</td>
</tr>
<tr id="row386110321155">
<td class="cellrowborder" valign="top" width="10.37%" headers="mcps1.2.3.1.1">
<p id="p14861113212156"><a name="p14861113212156"></a><a name="p14861113212156"></a>importance</p>
</td>
<td class="cellrowborder" valign="top" width="89.63%" headers="mcps1.2.3.1.2">
<p id="p166448210816"><a name="p166448210816"></a><a name="p166448210816"></a>Является ли текущий сервисный процесс ключевым системным процессом.</p>
<p id="p8572182712811"><a name="p8572182712811"></a><a name="p8572182712811"></a><strong id="b72917915010"><a name="b72917915010"></a><a name="b72917915010"></a>0</strong>: Текущий сервисный процесс не является ключевым системным процессом.</p>
<p id="p11861032111516"><a name="p11861032111516"></a><a name="p11861032111516"></a><strong id="b1074320101309"><a name="b1074320101309"></a><a name="b1074320101309"></a>1</strong>: Текущий сервисный процесс является ключевым системным процессом. Если он завершается, инициализирующий процесс сбрасывает и перезапускает систему.</p>
</td>
</tr><td class="cellrowborder" valign="top" width="10.37%" headers="mcps1.2.3.1.1">
<p id="p108931367177"><a name="p108931367177"></a><a name="p108931367177"></a>caps</p>
</td>
<td class="cellrowborder" valign="top" width="89.63%" headers="mcps1.2.3.1.2">
<p id="p489313618173"><a name="p489313618173"></a><a name="p489313618173"></a>Необходимые возможности для текущего сервиса. Они оцениваются на основе поддерживаемых возможностей подсистемы безопасности и настраиваются в соответствии с принципом наименьших прав. В настоящее время можно настроить максимум 100 значений.</p>
</td>

## Участвующие репозитории<a name="section641143415335"></a>

[Подсистема запуска](https://gitee.com/openharmony/docs/blob/master/en/readme/startup.md)

[startup_syspara_lite](https://gitee.com/openharmony/startup_syspara_lite/blob/master/README.md)

[startup_appspawn_lite](https://gitee.com/openharmony/startup_appspawn_lite/blob/master/README.md)

[startup_bootstrap_lite](https://gitee.com/openharmony/startup_bootstrap_lite/blob/master/README.md)

**[startup_init_lite]**

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

null Развернуть Свернуть
Apache-2.0
Отмена

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/openharmony-startup_init_lite.git
git@api.gitlife.ru:oschina-mirror/openharmony-startup_init_lite.git
oschina-mirror
openharmony-startup_init_lite
openharmony-startup_init_lite
master