Los sistemas integrados a menudo necesitan guardar algunos datos privados en el dispositivo y asegurarse de que el sistema no se pierda durante las actualizaciones y reinicios.
Prácticas comunes
1. Plug-in eeprom, flash
2. Medios de almacenamiento existentes, abra una nueva partición mtd para operar.
Etc. En
esta sección, use uboot_envtools para operar la partición uboot_env
uboot_envtools es en realidad parte del código fuente de uboot. La implementación específica está en el directorio uboot / tools / env /, al ejecutar make env en el directorio raíz de u-boot, puede generar el programa de aplicación fw_printenv y copiar el programa de aplicación al sistema de archivos raíz, puede ver el correspondiente uboot variables de entorno también.
1. Ver la partición del sistema
root@OpenWrt:/usr# cat /proc/mtd
dev: size erasesize name
mtd0: 00030000 00010000 "u-boot"
mtd1: 00010000 00010000 "u-boot-env"
mtd2: 00010000 00010000 "factory"
mtd3: 00fa0000 00010000 "firmware"
mtd4: 0016c8dc 00010000 "kernel"
mtd5: 00e33724 00010000 "rootfs"
mtd6: 00750000 00010000 "rootfs_data"
2. menuconfig agregar módulo uboot_envtools
.config - OpenWrt Configuration
> Utilities > Boot Loaders ─────────────────────────────────────────────────────────────────
┌──────────────────────────────────── Boot Loaders ─────────────────────────────────────┐
│ Arrow keys navigate the menu. <Enter> selects submenus ---> (or empty submenus │
│ ----). Highlighted letters are hotkeys. Pressing <Y> includes, <N> excludes, <M> │
│ modularizes features. Press <Esc><Esc> to exit, <?> for Help, </> for Search. │
│ Legend: [*] built-in [ ] excluded <M> module < > module capable │
│ ┌───────────────────────────────────────────────────────────────────────────────────┐ │
│ │ < > fconfig..................................... RedBoot configuration editor│ │
│ │ <*> uboot-envtools................. read/modify U-Boot bootloader environment│ │
│ │ │ │
│ │ │ │
│ └───────────────────────────────────────────────────────────────────────────────────┘ │
├───────────────────────────────────────────────────────────────────────────────────────┤
│ <Select> < Exit > < Help > < Save > < Load > │
└───────────────────────────────────────────────────────────────────────────────────────┘
3. Después de compilar, ingrese al sistema y pruebe
- Ver env
root@OpenWrt:/# fw_printenv
bootcmd=bootp; setenv bootargs root=/dev/nfs nfsroot=${serverip}:${rootpath} ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}:${hostname}::off; bootm
bootdelay=5
baudrate=115200
ssid=12345678
- Agregar env, uuid = 1234567890
root@OpenWrt:/# fw_setenv uuid 1234567890
root@OpenWrt:/# fw_printenv
bootcmd=bootp; setenv bootargs root=/dev/nfs nfsroot=${serverip}:${rootpath} ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}:${hostname}::off; bootm
bootdelay=5
baudrate=115200
ssid=12345678
uuid=1234567890
- Eliminar env
root@OpenWrt:/# fw_setenv uuid
root@OpenWrt:/# fw_printenv
bootcmd=bootp; setenv bootargs root=/dev/nfs nfsroot=${serverip}:${rootpath} ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}:${hostname}::off; bootm
bootdelay=5
baudrate=115200
ssid=12345678
root@OpenWrt:/#
4. Leer y escribir operaciones en código c a través del sistema y canales abiertos
int fw_env_del(char *key)
{
char buffer[256];
sprintf(buffer,"fw_setenv %s",key);
return system(buffer);
}
int fw_env_set(char *key,char *val)
{
char buffer[256];
sprintf(buffer,"fw_setenv %s %s",key,val);
return system(buffer);
}
int fw_env_get(char *key,char *val)
{
FILE * fp;
char buffer[256];
char read_key[32];
char read_val[128];
fp=popen("fw_printenv","r");
if (fp<0){
return -1;
}
while(fgets(buffer,sizeof(buffer),fp)){
sscanf(buffer,"%[^=]=%s",read_key,read_val);
if(!strcmp(key,read_key)){
strcpy(val,read_val);
pclose(fp);
return 0;
}
}
pclose(fp);
return -404;
}
5. El script lee env
#!/bin/sh
# 加载ubootenv中的数据,抓取uuid的值,赋给变量data
data="$(fw_printenv | grep uuid | cut -d= -f2)"
echo data=$uuid
exit 0
6. Modifique la partición fw_env
- Ver la partición fw_env actual
root@OpenWrt:/# cat /etc/fw_env.config
/dev/mtd1 0x0 0x10000 0x1000
- fw_env.config es generado por script, paquete de ruta / boot / uboot-envtools / files / ramips
ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x1000" "0x10000"
- Los parámetros se definen en el paquete de archivos / boot / uboot-envtools / files / uboot-envtools.sh
ubootenv_add_uci_config() {
local dev=$1
local offset=$2
local envsize=$3
local secsize=$4
local numsec=$5
uci batch <<EOF
add ubootenv ubootenv
set ubootenv.@ubootenv[-1].dev='$dev'
set ubootenv.@ubootenv[-1].offset='$offset'
set ubootenv.@ubootenv[-1].envsize='$envsize'
set ubootenv.@ubootenv[-1].secsize='$secsize'
set ubootenv.@ubootenv[-1].numsec='$numsec'
EOF
uci commit ubootenv
}
parámetro | sentido |
---|---|
/ dev / mtd1 | Especifique la partición en la memoria flash donde se encuentra boot_env |
0x0 | Especifique el desplazamiento en la partición donde se encuentra boot_env (tiene un significado práctico, el desplazamiento se ha especificado para la partición mtd) |
0x1000 | Especifique el tamaño del espacio de almacenamiento de la variable de entorno de uboot para que sea coherente con ENV_SIZE definido en el paquete / boot / uboot - $ {boardname} / Makefile; de lo contrario, se informará un error de verificación de CRC. Por ejemplo, el tamaño de la partición mtd1 es 1MiB, y el tamaño especificado por uboot es 0x40000, entonces se debe usar 0x40000 |
0x10000 | Especifique el tamaño del sector flash |
- Modifique el paquete / boot / uboot-envtools / files / ramips para guardar los datos en otras particiones mtd.
Por ejemplo:
ubootenv_add_uci_config "/dev/mtd7" "0x0" "0x10000" "0x1000"