公司Linux嵌入式产品,使用的3G网络,需要远程升级二进制软件,大概十几兆,不算大也不算小,如果每次都完全替换的话,在产品开发初期估计也是不小的流量,所以开始考虑是不是能通过打补丁的方法实现远程升级二级制文件。
在网上搜索后发现确实有这种方法,使用的一个工具名叫:xdelta。
先说下配置:
1、电脑端系统:ubuntu14.04
2、嵌入式硬件:BBB板
3、嵌入式系统:TI SDK-08编译出来的。
好像有两个版本,xdelta和xdelta3,后者功能更多。直接安装xdelta3吧,虽然用不到其他强大功能,以后省的升级了。
下面详述操作过程:
1、从https://github.com/jmacd/xdelta-gpl下载源码。
2、先在电脑端安装xdelta3,头一次接触这种安装方式,之前直接./configure然后make,这个源码需要通过automake工具链来安装。也就是下面步骤中用到的一些命令和库,automake工具链的安装可以搜索下。
1)、进入源码目录,执行aclocal生成aclocal.m4文件
2)、执行autoconf生成configure文件
3)、执行autoheader
4)、执行automake --add-missing,不用理会输出的warning
5)、分别执行: touch NEWS;touch README;touch AUTHORS;touch ChangeLog; 生成几个文件。
6)、再执行一次automake --add-missing,照样不用理会输出的warning
7)、现在,可以执行./configure了,生成Makefile文件
8)、执行make
9)、执行sudo make install
按照步骤一步步走,就会成功安装xdelta3了。
3、安装好xdelta3后,先使用一个二进制程序测试一下是否真的好使,需要用到下面两条命令:
1)制作补丁文件:xdelta3 -e -s(Sorce file) (Destination file) test.patch
2)打补丁:xdelta3 -d -s (Source file) test.patch (Destination file)
实际使用了一个13M左右的文件,制作好的补丁文件只有450K左右,当然这应该是跟据文件改动的多少来变化的,不过这相对于源文件来说,肯定小很多了,这样升级的话会节省很多流量。
4、既然好用,下面就应该编译到嵌入式linux系统中了,继续往下。
5、依然进入之前的xdelta3源码目录,先运行make distclean ,删除之前的编译文件。
6、执行./configure --help 查看帮助,根据以往经验,主要看下面部分:
7、执行./configure --prefix=/home/InstallDir CC=arm-linux-gnueabihf-gcc
CXX=arm-linux-gnueabihf-g++ CPP=arm-linux-gnueabihf-cpp,结果报错:
根据提示,执行./configure --prefix=/home/InstallDir --host=arm-linux-gnueabihf 成功,生成了Makefile文件。
(一开始在--host=后面多了个空格,结果找不到编译器,各种摸不着头脑。)
8、执行make;make install; 完成后在/home/InstallDir目录得到两个文件夹: bin share
9、将得到的文件夹bin中的文件复制到BBB板/usr/local/bin中,share中的文件复制到BBB板/usr/local/share中。
可能需要赋予执行权限,试着执行./xdelta3,发现如下错误输出:
貌似是缺少lzma库,搜索一下,是一个解压缩的软件,装。
1]、从https://tukaani.org/xz/下载xz的源码。
2]、进入源码目录,看到也是automake工具链,不过貌似前面的步骤都已经做过了,直接:
./configure --prefix=/home/InstallDir --host=arm-linux-gnueabihf
然后make;makeinstall;
3]、将生成的安装文件分别复制到BBB板/usr/bin下相应的目录中。
再次执行./xdelta3 -V出现下面输出:
搞定。
将之前电脑端测试的源文件和生成的补丁复制到BBB板,给源文件打补丁,生成的目标文件跟电脑端的目标文件一致,完成。