modifying a cerbo swu file - victronenergy/venus GitHub Wiki
mkdir tmp rootfs rootfs.user
(cd tmp && cpio -idv < ../venus-swu-einstein.swu)
gunzip tmp/venus-image-einstein.ext4.gz
e2fsck -f tmp/venus-image-einstein.ext4
resize2fs tmp/venus-image-einstein.ext4 1G
sudo mount tmp/venus-image-einstein.ext4 rootfs
sudo bindfs -u $(id -u) -g $(id -g) rootfs rootfs.user
Do what you want with rootfs.user...
sudo umount rootfs.user rootfs
pigz tmp/venus-image-einstein.ext4
(cd tmp && find -type f | sort | cpio -ov -H crc > ../venus-swu-einstein.swu)
rm -rf tmp rootfs rootfs.user
./fix-swu.py venus-swu-einstein.swu
fix-swu.py
#!/usr/bin/python3
import sys
# cpio seems to add zero padding to the swu file up to the block size. swupdate
# expects it to padding till it is 4 bytes aligned again. These trailing zeros
# can crash swupdate by causing a SIGPIPE. So make sure only the trailing zeros
# as expected by swupdate are in the swu file.
def swupdate_fix_cpio_padding(filename):
file = open(filename, "r+b")
file.seek(0, 2)
addr = file.tell() - 1
while addr:
file.seek(addr, 0)
if ord(file.read(1)) != 0:
addr += 1
addr += 4 - (addr % 4)
print("truncating " + filename + " to " + str(addr))
file.truncate(addr)
break
addr -= 1
if __name__ == "__main__":
swupdate_fix_cpio_padding(sys.argv[1])