|
Переменные окружения (Environment)
Для хранения переменных окружения ENV в Android 12, использующем систему
A и B слотов, предназначены два раздела env_A и env_B.
В исходном состоянии стоковой прошивки в раздел env_A записан файл env.fex
из imagewty-образа прошивки, а раздел env_B оставлен пустым.
После OTA-обновления в обоих разделах env_A и env_B записана одинаковая
информация, представляющая собой слегка модифицированный исходный блоб ENV.
Для получения списка переменных в читабельном виде есть несколько способов:
1) скопировать раздел env_a в файл и конвертировать его в обычный текст
2) сделать дамп переменных env в оболочке U-Boot командой printenv и
сохранить терминальный вывод в файл.
Внимание ! Нужно учитывать, что printenv показывает состояние переменных
в оперативной памяти, где они могут отличаться от переменных, хранящихся в разделе ENV,
если подвергаются модификации в поцессе загрузки. Поэтому списки переменных в текстовом
виде, полученные бекапом из раздела и из дампа, будут отличаться. Об отличиях подробнее - в конце.
Приведенный ниже текст (список переменных ENV) представляет
собой переформатированный для наглядности дамп выполнения команды printenv U-Boot.
То есть это переменные в оперативной памяти после загрузки в U-Boot обновленной версии 20221020-1059.
Имена переменных выделены жирно и для удобства условно пронумерованы. Зеленым курсивом
помечены команды U-Boot, использованные в переменных.
Список переменных ENV
- ab_partition_list =
bootloader, env, boot, vendor_boot, dtbo, vbmeta, vbmeta_system, vbmeta_vendor - boot_fastboot = fastboot
- boot_normal =
sunxi_flash read 45000000 boot;bootm 45000000 - boot_recovery =
sunxi_flash read 45000000 recovery;bootm 45000000 - bootcmd = run setargs_mmc boot_normal
- bootdelay = 5
- bootreason = unknow
- cma = 8M
- console =
ttyAS0, 115200 - earlycon =
uart8250, mmio32, 0x05000000 - fdtcontroladdr = bbe83e58
- fileaddr = bc2a9040
- filesize = 2a307a
- force_normal_boot = 1
- init = /init
- initcall_debug = 0
- keybox_list =
widevine, ec_key, ec_cert1, ec_cert2, ec_cert3, rsa_key, rsa_cert1, rsa_cert2, rsa_cert3 - loglevel = 2
- mmc_root = /dev/mmcblk0p4
- nand_root = /dev/nand0p4
- partitions =
bootloader_a@mmcblk0p1: bootloader_b@mmcblk0p2: env_a@mmcblk0p3: env_b@mmcblk0p4: boot_a@mmcblk0p5: boot_b@mmcblk0p6: vendor_boot_a@mmcblk0p7: vendor_boot_b@mmcblk0p8: super@mmcblk0p9: misc@mmcblk0p10: vbmeta_a@mmcblk0p11: vbmeta_b@mmcblk0p12: vbmeta_system_a@mmcblk0p13: vbmeta_system_b@mmcblk0p14: vbmeta_vendor_a@mmcblk0p15: vbmeta_vendor_b@mmcblk0p16: frp@mmcblk0p17: empty@mmcblk0p18: metadata@mmcblk0p19: private@mmcblk0p20: dtbo_a@mmcblk0p21: dtbo_b@mmcblk0p22: media_data@mmcblk0p23: Reserve0@mmcblk0p24: userdata@mmcblk0p25 - rotpk_status = 0
- setargs_mmc = setenv bootargs
earlycon=${earlycon} clk_ignore_unused initcall_debug=${initcall_debug} console=${console} loglevel=${loglevel} root=${mmc_root} init=${init} cma=${cma} snum=${snum} mac_addr=${mac} wifi_mac=${wifi_mac} bt_mac=${bt_mac} specialstr=${specialstr} gpt=1 androidboot.force_normal_boot=${force_normal_boot} androidboot.slot_suffix=${slot_suffix} - setargs_nand = setenv bootargs
earlycon=${earlycon} clk_ignore_unused initcall_debug=${initcall_debug} console=${console} loglevel=${loglevel} root=${nand_root} init=${init} cma=${cma} snum=${snum} mac_addr=${mac} wifi_mac=${wifi_mac} bt_mac=${bt_mac} specialstr=${specialstr} gpt=1 androidboot.force_normal_boot=${force_normal_boot} androidboot.slot_suffix=${slot_suffix} - slot_suffix = _b
- snum = 3c00144c180609521d0
- trace_buf_size = 64M
- trace_enable = 0
- trace_event =
sched_wakeup, sched_switch, sched_blocked_reason, sched_cpu_hotplug, block, ext4
Комментарии и пояснения
Две переменных, которые желательно модифицировать руками:
bootdelay = 5 - время (в секундах) ожидания нажатия кнопки на клавиатуре UART-терминала
для прерывания процесса загрузки и входа в оболочку U-Boot, в стоковых прошивках = 0 (запрет прерывания)
loglevel = 2 - уровень важности отображаемых в логе сообщений (max 8), в стоковой версии
это значение равно 4, из-за чего лишние сообщения мешают нормально пользоваться консолью.
ab_partition_list - это список разделов, образующих слоты A и B
( т.е. имеющие суффиксы _A и _B), видимо, используется при обновлениях
partitions - список всех разделов (в соответствии с таблицей GPT)
с их системными именами, которые указаны справа от '@'
mmc_root - активный раздел с переменными (/dev/mmcblk0p4 соответствует env_b)
slot_suffix = _b - указание загрузчику о том, что активным является слот B,
поэтому нужно работать с разделами, имеющими в имени суффикс '_B'
rotpk_status = 0,
ROTPK (root of trust public key register - регистре корневого открытого ключа доверия)
0 - означает, видимо, что доверенная загрузка не используется
snum = 3c00144c180609521d0 - уникальный серийный номер, который хранится в памяти SoC
и используется для формирования MAC-адреса
trace_enable - включить трассировку событий (=0 - выключена)
trace_buf_size - размер буфера трассировки (= 64M)
trace_event - список событий (event) для трассировки, если она разрешена
sched_wakeup
sched_switch
sched_blocked_reason
sched_cpu_hotplug
block
ext4
Команды и переменные для загрузки системы
bootcmd - эта переменная представляет собой команду run, которая
запускается при продолжении загрузки (без входа в оболочку U-Boot) или при вводе в оболочке
команды boot содержит два аргумента: setargs_mmc и boot_normal
setargs_mmc - это тоже сложная переменная, сама являющаяся командой
setenv bootargs, которая инициализирует массив bootargs целой группой переменных,
записывая в него значения уже установленных одиночных переменных (earlycon,console и т.д.)
Примечание. Знак $ означает значение переменной, которая следует за ним в фигурных
скобках.
boot_normal - это вторая часть, выполняемая bootcmd, и она также
состоит из двух команд U-Boot: sunxi_flash read 45000000 boot и bootm 45000000
Здесь sunxi_flash читает содержимое раздела boot и записывает его в память
по адресу 0x45000000, после чего команда bootm запускает на выполнение программу,
лежащую с адреса 0x45000000.
boot_recovery - эта переменная должна иметь аналогичный смысл и механизм
функционирования, но с загрузкой не ядра boot, а recovery.
Но раздел recovery в таблице GPT отсутствует, поэтому команда run boot_recovery
не выполняется и, скорее всего присутствие этой переменной - атавизм, доставшийся в наследство
от однослотовых систем.
boot_fastboot = fastboot
Это команда перевода устройства в режим fastboot, например, из оболочки:
=> run boot_fastboot
sunxi_fastboot_init
recv addr 0x41000000
send addr 0xbbf02568
start to display fastbootlogo.bmp
54 bytes read in 1 ms (52.7 KiB/s)
[36.412]bmp_name=fastbootlogo.bmp size 190236
190236 bytes read in 9 ms (20.2 MiB/s)
delay time 0
weak:otg_phy_config
usb init ok
sunxi_usb_fastboot_status=0
exit usb
sunxi_fastboot_exit
next work 0
SUNXI_UPDATE_NEXT_ACTION_NULL
Что происходит при сохранении переменных
Если исправить какую-либо переменную командой ENV SET (это происходит в памяти),
а затем сохранить командой ENV SAVE, то переменные из памяти записываются в раздел ENV_B.
При этом происходят следующие изменения:
1) список переменных становится отсортированным по имени переменной
2) пустые переменные (с пустым значением), например, 'mac= ' удаляются
3) удаляется переменная ab_partition_list
4) изменяется значение переменной bootcmd
run setargs_nand boot_normal --> run setargs_mmc boot_normal
5) добавляются переменные:
bootreason=unknow
fdtcontroladdr=bbe83e58
fileaddr=bc2a9040
filesize=2a307a
rotpk_status=0
snum=хххх
Ниже показано сравнение списков переменных, условные обозначения:
+ - добавлены, * - удалены, # - измененны
Левый столбец - раздел ENV_A, правый столбец - раздел ENV_B
Внимание. Бекап раздела B сделан после сохранения переменных из памяти,
поэтому изменения в переменных внесены в момент загрузки системы.
Раздел A Раздел B
* ab_partition_list -
boot_fastboot boot_fastboot
boot_normal boot_normal
boot_recovery boot_recovery
# bootcmd # bootcmd
bootdelay bootdelay
* bt_mac -
- + bootreason
cma=8M cma=8M
console console
earlycon earlycon
+ fdtcontroladdr -
+ fileaddr -
+ filesize -
force_normal_boot force_normal_boot
init init
initcall_debug initcall_debug
keybox_list keybox_list
loglevel loglevel
* mac -
mmc_root mmc_root
nand_root nand_root
- + partitions
- + rotpk_status
setargs_mmc setargs_mmc
setargs_nand setargs_nand
slot_suffix slot_suffix
* specialstr -
- + snum
trace_buf_size trace_buf_size
trace_enable trace_enable
trace_event trace_event
* wifi_mac -
|
|