
Para atualizar um volume ubifs substituindo-o por conteúdo totalmente novo, ubiupdatevol de mtd-utils pode ser usado:
ubiupdatevol /dev/ubiX_Y /path/to/ubifs.img
Existe uma maneira de aplicar patch no volume ubifs em vez de relançar o conteúdo completo? Por exemplo, aplique apenas a diferença binária b/w ubifs_base.img e ubifs_dest.img em /dev/ubiX_Y
.
Responder1
Não usando a API de atualização de volume, não. De acordo comos documentos, o usuário deve transmitir todo o tamanho do volume antes que a atualização seja confirmada:
Para atualizar um volume, primeiro você precisa chamar o
UBI_IOCVOLUP
ioctl do dispositivo de caractere de volume UBI correspondente e passar para ele um ponteiro para um valor de 64 bits contendo o comprimento do conteúdo do novo volume em bytes. Então essa quantidade de bytes deve ser gravada no dispositivo de caracteres de volume. Assim que o último byte for enviado ao dispositivo de caractere, a operação de atualização será concluída. Esquematicamente, a sequência é:fd = open("/dev/my_volume"); ioctl(fd, UBI_IOCVOLUP, &image_size); write(fd, buf, image_size); close(fd);
Veja
include/mtd/ubi-user.h
para mais detalhes. Tenha em mente que o conteúdo antigo do volume não é preservado em caso de atualização interrompida. Além disso, você não precisa gravar todos os novos dados de uma só vez.
Então você definitivamente poderia fazer uma atualização delta, mas precisaria criar um utilitário que transmita as partes inalteradas de outra fonte, porque depois de iniciar a operação de atualização de volume, você terá que escrever tudo. Ou, se não quiser usar a API, você pode criar a nova imagem em armazenamento temporário e ubiupdatevol
pronto.
A propósito, na prática, é possível que o UBI elimine as gravações nas partes inalteradas. Mas você ainda precisa enviá-los.