Примеры init-описаний

12 января 2026

ID using_einit

Здесь приведены примеры init-описаний, демонстрирующие различные аспекты запуска процессов.

Запуск клиента и сервера и создание IPC-канала между ними

В этом примере будут запущены процесс класса Client и процесс класса Server. Имена процессов не указаны, поэтому они будут совпадать с именами классов процессов. Имена исполняемых файлов также не указаны, они также будут совпадать с именами классов процессов. Процессы будут соединены IPC-каналом с именем server_connection.

init.yaml

entities:

- name: Client

connections:

- target: Server

id: server_connection

- name: Server

Запуск процессов из заданных исполняемых файлов

В этом примере будут запущены процесс класса Client из исполняемого файла с именем cl, процесс класса ClientServer из исполняемого файла с именем csr и процесс класса MainServer из исполняемого файла с именем msr. Имена процессов не указаны, поэтому они будут совпадать с именами классов процессов.

init.yaml

entities:

- name: Client

path: cl

- name: ClientServer

path: csr

- name: MainServer

path: msr

Запуск двух процессов из одного исполняемого файла

В этом примере будут запущены процесс класса Client из исполняемого файла с именем Client, а также два процесса классов MainServer и BkServer из исполняемого файла с именем srv. Имена процессов не указаны, поэтому они будут совпадать с именами классов процессов.

init.yaml

entities:

- name: Client

- name: MainServer

path: srv

- name: BkServer

path: srv

Запуск двух серверов одного класса и клиента и создание IPC-каналов между клиентом и серверами

В этом примере будут запущены процесс класса Client (с именем Client) и два процесса класса Server с именами UserServer и PrivilegedServer. Клиент будет соединен с серверами IPC-каналами с именами server_connection_us и server_connection_ps. Имена исполняемых файлов не указаны, поэтому они будут совпадать с именами классов процессов.

init.yaml

entities:

- name: Client

connections:

- id: server_connection_us

target: UserServer

- id: server_connection_ps

target: PrivilegedServer

- task: UserServer

name: Server

- task: PrivilegedServer

name: Server

Установка параметров запуска и переменных окружения программ

В этом примере будут запущены процесс класса VfsFirst (с именем VfsFirst) и процесс класса VfsSecond (с именем VfsSecond). Программа, которая будет исполняться в контексте процесса VfsFirst, будет запущена с параметром -f /etc/fstab, а также получит переменную окружения ROOTFS со значением ramdisk0,0 / ext2 0 и переменную окружения UNMAP_ROMFS со значением 1. Программа, которая будет исполняться в контексте процесса VfsSecond, будет запущена с параметром -l devfs /dev devfs 0. Имена исполняемых файлов не указаны, поэтому они будут совпадать с именами классов процессов.

init.yaml

entities:

- name: VfsFirst

args:

- -f

- /etc/fstab

env:

ROOTFS: ramdisk0,0 / ext2 0

UNMAP_ROMFS: 1

- name: VfsSecond

args:

- -l

- devfs /dev devfs 0

На аппаратных платформах с процессорными архитектурами x86 и x86-64 можно задавать параметры запуска и переменные окружения программ не только фиксированными значениями, но и ссылками на параметры запуска ядра:

  • ${BOOTARG:<имя параметра запуска ядра>[:=<значение параметра запуска программы по умолчанию>]}

    Заданный параметр запуска программы принимает значение параметра запуска ядра с заданным именем. Опционально можно указать значение по умолчанию, которое применяется, если параметр запуска ядра с заданными именем не передан ядру. Если значение по умолчанию не указано, и параметр запуска ядра с заданным именем не передан ядру, то заданный параметр запуска программы не будет передан программе.

    Пример:

    args:

    - ${BOOTARG:ROOTFS:=/opt/data}

    - ${BOOTARG:test_switch}

    - -f ${BOOTARG:FSTAB:=/etc/fstab}

    - --message ${BOOTARG:MOTD}

    - --timeout=${BOOTARG:timeout:=60}

  • <имя переменной окружения программы>: ${BOOTARG:<имя параметра запуска ядра>[:=<значение переменной окружения программы по умолчанию>]}

    Переменная окружения программы с заданными именем принимает значение параметра запуска ядра с заданным именем. Опционально можно указать значение по умолчанию, которое применяется, если параметр запуска ядра с заданными именем не передан ядру. Если значение по умолчанию не указано, и параметр запуска ядра с заданным именем не передан ядру, то переменная окружения программы с заданными именем не будет создана.

    Пример:

    env:

    rootdir: ${BOOTARG:FS:=/home}

Параметры запуска ядра, которые передаются программам в качестве параметров запуска и переменных окружения, имеют следующий формат:

<имя>=<значение>

Чтобы передать параметры через командную строку ядра на QEMU, нужно использовать параметр запуска QEMU -append.

Пример установки параметров запуска ядра на QEMU с помощью CMake-команды build_kos_qemu_image():

set(QEMU_FLAGS "-append \"ROOTFS=/opt/data test_switch=-b FSTAB=/etc/fstab MOTD=Hello! timeout=30 FS=/home\"")

build_kos_qemu_image(kos-qemu-image

...

QEMU_FLAGS "${QEMU_FLAGS}")

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

Задание порядка запуска процессов и признаков успешного запуска процесса

В этом примере:

  • Процесс Einit смонтирует дополнительную файловую систему romfs.1 в точку монтирования romfs/1.
  • Процесс класса Server будет запущен из файла server на основной файловой системе ROMFS до процессов классов Client_A и Client_B. Программа Einit будет ожидать от Server сигнала em_notify_ready().
  • Процесс класса Client_A будет запущен из файла romfs/1/client_a после процесса класса Server. Программа Einit будет ожидать успешного запуска функции main() в Client_A.
  • Процесс класса Client_B будет запущен из файла romfs/1/client_b после процесса классов Server и Client_A. Программа Einit будет ожидать успешного завершения работы Client_B в течение пяти минут.

init.yaml

mount_romfs:

"romfs.1": "romfs/1"

entities:

-name: Server

path: "server"

wait_for: ready

before:

- Client_A

- Client_B

-name: Client_A

path: "romfs/1/client_a"

wait_for: start

after:

- Server

-name: Client_B

path: "romfs/1/client_b"

wait_for: { event: exit_success, timeout: 5min }

after:

- Client_A

- Server

Вам помогла эта статья?
Что нам нужно улучшить?
Спасибо за ваш отзыв, вы помогаете нам становиться лучше!
Спасибо за ваш отзыв, вы помогаете нам становиться лучше!