Файлы System/bin Android 12. Справочник.


  Все     Команда     Скрипт     Служба     Приложение  

ueventd
Служба обработчика событий

Симлинк на: init

Тип файла: служба

   

Комментарии
https://android.googlesource.com/platform/system/core/+/master/init/README.ueventd.md

UEVENTD

Ueventd управляет /dev, устанавливает разрешения /sys и обрабатывает события прошивки.
Он имеет поведение по умолчанию, описанное ниже, а также язык сценариев, позволяющий настраивать это поведение, построенный на том же парсере, что и init.

Ueventd имеет один общий параметр настройки — размер rcvbuf_size для сокета ueventd.
Он настраивается параметром uevent_socket_rcvbuf_size, который принимает формат

uevent_socket_rcvbuf_size <размер>

Например:

uevent_socket_rcvbuf_size 16M - устанавливает размер сокета uevent rcvbuf_size равным 16 мегабайтам.

ИМПОРТ ФАЙЛОВ КОНФИГУРАЦИИ

Ueventd читает /system/etc/ueventd.rc, все остальные файлы импортируются с помощью команды import, которая принимает формат

import <path>

Эта команда анализирует файл конфигурации ueventd, расширяя текущую конфигурацию.
Если путь представляет собой каталог, каждый файл в каталоге анализируется как файл конфигурации.
Он не рекурсивный, вложенные каталоги не анализируются. Импортированные файлы анализируются после анализа текущего файла.

/DEV

Ueventd прослушивает сокеты uevent ядра и создает/удаляет узлы /dev на основе входящих событий добавления/удаления. По умолчанию используется режим 0600 и root пользователь/группа.
Он всегда создает узлы с SELabel из текущей загруженной SEPolicy.

Он имеет три варианта поведения по умолчанию для пути узла:

1. Блочные устройства создаются как файлы /dev/block/<basename uevent DEVPATH>.

На этот узел созданы символические ссылки в /dev/block/<type>/<parent device>/<basename uevent DEVPATH>, /dev/block/<type>/<parent device>/by-name/<uevent PARTNAME> и /dev/block/by-name/<uevent PARTNAME>, если устройство является загрузочным.

2. USB-устройства создаются так, как /dev/<uevent DEVNAME>, если бы DEVNAMEони были указаны для события, в противном случае — как /dev/bus/usb/<bus_id>/<device_id>, где bus_id = .uevent MINOR / 128 + 1
и device_iduevent = MINOR % 128 + 1

3. Все остальные устройства создаются как /dev/<basename uevent DEVPATH>


Разрешения можно изменить с помощью сценария ueventd.rc и строки с расширением /dev.

Эти строки принимают формат :devname mode uid gid [options]
Например:
/dev/null 0666 root root

При создании /dev/null его режим будет установлен на 0666, пользователь на root и группа на root.

Путь можно изменить с помощью сценария ueventd.rc и subsystem раздела.

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

Этот раздел имеет следующий формат:

subsystem <subsystem_name>
devname uevent_devname|uevent_devpath
[dirname <directory>]
subsystem_name используется для сопоставления SUBSYSTEM значения события


devname принимает один из двух вариантов:

1. uevent_devname указывает, что именем узла будет событие ueventDEVNAME
2. uevent_devpath указsdftn, что имя узла будет basename ueventDEVPATH

dirname — необязательный параметр, указывающий каталог /dev, в котором будет создан узел.

Например:

subsystem sound
devname uevent_devpath
dirname /dev/snd

Указывает, что все события с SUBSYSTEM=sound будут создавать узлы как /dev/snd/<basename uevent DEVPATH>.


/SYS

По умолчанию Ueventd не предпринимает никаких действий для /sys, однако ему можно поручить установить разрешения для определенных файлов /sys при создании соответствующих событий ueventd.
Это делается с помощью сценария ueventd.rc и строки, начинающейся с /sys.

Эти строки принимают формат:

nodename attr mode uid gid [options]

Например:
/sys/devices/system/cpu/cpu* cpufreq/scaling_max_freq 0664 system system

Когда отправляется событие /sys/devices/system/cpu/cpu*, соответствующее шаблону,
для соответствующего атрибута sysfs cpufreq/scaling_max_freq будет установлен режим 0664,
для пользователя — значение system, а для группы — значение system.

СОПОСТАВЛЕНИЕ ПУТЕЙ

Путь для записи /devили /sysможет содержать в *любом месте пути.

  • Если в конце строки появляется only или если для параметра options установлено значение no_fnm_pathname, ueventd сопоставляет запись поfnmatch(entry_path, incoming_path, 0)
    В противном случае ueventd соответствует записи поfnmatch(entry_path, incoming_path, FNM_PATHNAME)
    Дополнительную информацию смотрите на странице руководства fnmatch

    ЗАГРУЗКА ПРОШИВКИ

    Ueventd по умолчанию обслуживает запросы прошивки путем поиска в списке каталогов прошивки файла, соответствующего uevent FIRMWARE. Затем он разветвляет процесс передачи этой прошивки ядру.

    /apex/*/etc/firmware также ищется по списку каталогов прошивок

    Список каталогов прошивок настраивается строкой firmware_directoriesв в файле ueventd.rc.
    Эта строка принимает формат:
    firmware_directories <firmware_directory> [ <firmware_directory> ]*

    Например:
    firmware_directories /etc/firmware/ /odm/firmware/ /vendor/firmware/ /firmware/image/

    Добавляет эти 4 каталога в указанном порядке в список каталогов встроенного ПО, которые будет проверять ueventd. Обратите внимание, что эта опция всегда добавляется в список; удалить предыдущие записи невозможно.

    Ueventd будет ждать завершения процесса инициализации post-fs, чтобы продолжить повторную попытку, прежде чем окажется, что прошивки отсутствуют.

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

    external_firmware_handler в файле ueventd.rc.

    Эта строка принимает формат
    external_firmware_handler <devpath> <user [group]> <path to external program>

    Обработчик будет запущен от имени данного пользователя или, если указана группа, от имени данного пользователя и группы.

    Например:
    external_firmware_handler /devices/leds/red/firmware/coeffs.bin система /vendor/bin/led_coeffs.bin

    Будет запускаться /vendor/bin/led_coeffs.bin от имени системного пользователя вместо использования прошивки по умолчанию для /devices/leds/red/firmware/coeffs.bin

    Аргумент devpath может включать звездочки (*), чтобы соответствовать нескольким путям.
    Например, строка /dev/*/red будет соответствовать /dev/leds/red так же, как и /dev/lights/red.
    Сопоставление с образцом соответствует правилам функции fnmatch().

    Ueventd предоставит uevent DEVPATHи FIRMWARE этой внешней программе в среде через переменные среды с теми же именами.
    Ueventd будет использовать строку, записанную в стандартный вывод, в качестве нового имени загружаемой прошивки. Он по-прежнему будет искать новую прошивку в списке каталогов прошивок, указанном выше.
    Он также будет отклонять имена файлов, содержащиеся ..в них, чтобы не допустить выхода из этих каталогов.
    Если стандартный вывод не может быть прочитан, или программа возвращается с любым кодом завершения, отличным от EXIT_SUCCESS, или программа выходит из строя, будет загружена прошивка по умолчанию из uevent.

    Ueventd дополнительно записывает все сообщения, отправленные в stderr из внешней программы, на последовательную консоль после выхода из внешней программы.

    Если установлен аргумент командной строки ядра firmware_class.path, этот путь будет использоваться ядром в первую очередь для поиска файлов прошивки. Если он найден, ueventd вообще не будет вызываться. Дополнительную информацию об этой функции см. в документации ядра .


    ХОЛОДНАЯ ЗАГРУЗКА

    Ueventd должен создать устройства /dev для всех устройств, которые уже отправили свои события до запуска ueventd. Для этого при запуске ueventd он выполняет то, что он называет «холодной загрузкой» /sys, при этом записывает «add» в каждый файл «uevent», который он находит в /sys/class, /sys/blockи /sys/devices.
    Это заставляет ядро повторно генерировать uevents для этих путей и, таким образом, ueventd создает узлы.

    Во время загрузки это делается параллельно для набора дочерних процессов. ueventd.cppв этом каталоге содержится документация о том, как выполняется распараллеливание.

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

    Однако некоторые устройства могут получить выгоду от включения опции распараллеливания:
    parallel_restorecon enabled

    Выполните параллельное восстановление, чтобы ускорить процесс загрузки, подкаталоги в них /sysможно разрезать с помощью ueventd.rc и запускать в нескольких процессах.

    Parallel_restorecon_dir

    Например, Parallel_restorecon_dir /sys Parallel_restorecon_dir /sys/devices

    Parallel_restorecon_dir /sys/devices/platform Parallel_restorecon_dir /sys/devices/platform/soc