您的位置:首页 > 运维架构 > Linux

update_engine模块移植到linux平台

2017-03-02 17:45 417 查看
    update_engine是google提供的一个升级模块,对于linux的平台,我们可以移植到我们的嵌入式平台,通过update_engine模块对系统升级,最近由于工作需要,在linux平台上面移植一下,其中遇到了很多问题,在不停的寻找答案中,问题都一一解决了,现在分享一下移植的过程,提供给有同样需求的同鞋。

    移植过程如下:

   1. 获取update_engine的源码 

        https://github.com/coreos/update_engine。
      2. 编译buildroot的代码

        source build/envsetup.sh

        cd buildroot

        make mesona111_xxxxb_defconfig 

        make

    3. 拷贝update_engien代码至buildroot/output/build/

        mv update_engine-master update_engine

      4. 查看update_engine目录,发现里面没有makefile,只有autogen.sh configure.ac Makefile.am三个文件,我们需要通过这三个文件生成makefile。我们先查看configure.ac:

      

     发现update_engine需要依赖其他的模块,但是我们不确定哪些是已经有的,哪些还没有,我们直接执行,根据错误提示信息,然后把对应的模块添加进来。

    5. 生成configure(生成makefile需要的)

       ./autogen.sh

       有如下错误信息:

      + autoreconf --force --install --symlink

      Can't exec "libtoolize": No such file or directory at /usr/bin/autoreconf line 196.

      Use of uninitialized value in pattern match (m//) at /usr/bin/autoreconf line 196.

      configure.ac:4: error: Autoconf version 2.69 or higher is required

      configure.ac:4: the top level

      autom4te: /usr/bin/m4 failed with exit status: 63

      aclocal: /usr/bin/autom4te failed with exit status: 63

      autoreconf: aclocal failed with exit status: 63

      根据提示信息,是autoconf的版本太低导致的,编译过程我们发现,sdk本身编译出了autoconf工具:

      autoconf --version           (autoconf (GNU Autoconf) 2.68)

      output/host/usr/bin/autoconf --version     (autoconf (GNU Autoconf) 2.69)

      我们使用buildroot本身编译的工具,

      export PATH=/mnt/nfsroot/xxxxx.xx/A111_bak_work/buildroot/output/host/usr/bin/:$PATH

      然后执行:./autogen.sh 即可生成configure

   6. 通过configure生成makefile

       由于是使用交叉编译器,所以我们通过--host指定交叉编译器:

       ./configure --host arm-linux-gnueabihf

            错误1: configure: error: *** dbus-binding-tool not found

            解决1:在buildroot下面make menuconfig,配置编译dbus-glib

                        Target package --->

                                Hardware handing --->

                                        [*] dbus-glib

                        在下载dbus-glib时,下载失败了,我们修改下载的地址即可

                       DBUS_GLIB_SITE = http://dbus.freedesktop.org/releases/dbus-glib修改为
                       DBUS_GLIB_SITE = https://dbus.freedesktop.org/releases/dbus-glib
             错误2:configure: error: *** libbz2 not found

             解决2:在buildroot下面make menuconfig,配置编译bzip2

                        Target package --->

                                Compressors and decompressors --->

                                        [*] bzip2

             错误3:configure: error: *** librootdev not found

             解决3:由于sdk没有配置编译librootdev,需要我们自己下载对应的源码编译

                          地址:https://github.com/coreos/seismograph(解压之后放到output/build下面)

                          cd seismograph
                          chmod +x autogen.sh
                         ./autogen.sh
                         ./configure --host arm-linux-gnueabihf --prefix=/mnt/nfsroot/xxxxx.xx/A111_bak_work/buildroot/

                     output/host/usr/arm-buildroot-linux-gnueabihf/sysroot/usr

                         发现生产makefile过程出错了:No package 'mount' found

                         我们屏蔽configure.ac里面mount操作:#PKG_CHECK_MODULES([MNT], [mount])

                        重新执行命令生成makefile,然后make && make install

             错误4:configure: error: *** gflags/gflags.h not found

             解决4:下载编译libgflags库

                          地址:https://github.com/gflags/gflags(解压之后放到output/build下面)

                          cd  gflags

                          mkdir build

                          cmake -DCMAKE_CXX_COMPILER=arm-linux-gnueabihf-g++ .(指定编译器生成makefile)

                          make 

              错误5:在解决4中,出错:CMake 2.8.12 or higher is required.  You are running version 2.8.7。

                           意思是说cmake的版本太低。

              解决5:下载最新的cmake工具。

                            地址:https://cmake.org/download/  选择Unix/Linux Source
cmake-3.8.0-rc1.tar.gz

                            cd cmake-3.8.0-rc1 (解压之后放到output/build下面)

                            ./configure --prefix=/mnt/nfsroot/xxxxx.xx/A111_bak_work/buildroot/output/host/usr/

                            make && make install

                            在使用cmake的时候,使用我们最新的cmake工具。

              错误6:*** gflags not found

              解决6:./configure ac_cv_gflags_namespace=GFLAGS_NAMESPACE --host arm-linux-gnueabihf

              错误7:No package 'libglog' found

              解决7:下载编译libglog

                            地址:https://github.com/google/glog(解压之后放到output/build下面)

                            cd glog-0.3.3

                           ./configure --host arm-linux-gnueabihf --prefix=/mnt/nfsroot/xxxxx.xx/A111_bak_work/buildroot/

                     output/host/usr/arm-buildroot-linux-gnueabihf/sysroot/usr

                           make

                           make install

                错误8:No package 'protobuf' found。

                解决8:需要下载protobuf的源码编译

                            地址:https://github.com/google/protobuf (解压之后放到output/build下面)

                            由于下载google提供的protobuf不再包含gtest的代码,所以还需要下载gtest的代码

                            地址:https://github.com/google/googletest/archive/release-1.7.0.tar.gz (解压之后放到protobuf)

                            执行命令:

                                  mv googletest-release-1.7.0 gtest

                                  chmod +x autogen.sh

                                  ./autogen.sh

                                  ./configure --prefix=/mnt/nfsroot/zhigang.yu/A111_bak_work/buildroot/output/host/usr/ 

                                  make

                                  make install

                 错误9:  提示not find 某些.h文件或者库错误。

                 解决9:寻找这些头文件以及库文件,存放在哪里,把这些头文件及库手动拷贝到/mnt/nfsroot/xxxxx.xx/

                                A111_bak_work/buildroot/output/host/usr/arm-buildroot-linux-gnueabihf/sysroot/usr下面即可,                                   这样使用交叉编译的时候,可以寻找到这些头文件及库。

            configure: creating ./config.status
    config.status: creating Makefile
    config.status: executing depfiles commands

            基于这些错误解决之后,即可生成makefile文件了,错误主要是update_engine模块所需要的库找不到导致。

    7.make编译

             在生成了makefile之后,我们就可以编译update_engine的源码了,在编译update_engine过程,也遇到了一          些错误,然后在网上找了下,发现了很多类似的错误问题。

           ./src/update_engine/update_metadata.pb.h:17:2: error: #error This file was generated by an older version of          protoc

            这时由于protoc编译器版本和protobuf头文件不对应的问题,原因就是系统里可能存在多个protoc的版本,但          是protobuf的包含文件可能只有一种,所以就会造成这种问题,回想起之前我们下载了protobuf库编译,同时编译        生成了protoc,这样就有两个protoc了,一个是系统的/usr/bin/protoc,一个是我们编译生成的/mnt/nfsroot/

       xxxxx.xx/A111_bak_work/buildroot/output/host/usr/bin/protoc,我们修改makefile,把PROTOC = /usr/bin/protoc

       把protoc修改为我们sdk编译的新版本即可

           ./src/update_engine/certificate_checker.h:11:50: fatal error: gtest/gtest_prod.h: No such file or directory

           这个错误是由于update_engine里面需要包含gtest相关的头文件,但是没有找到,我们手动拷贝下即可。

       把protobuf-2.6.1/gtest/include/gtest拷贝到output/host/usr/arm-buildroot-linux-gnueabihf/sysroot/usr/include,然        后重新编译即可。

           make all即可生成我们需要的update_engine update_engine_client delta_generator可执行bin了

      AR       libupdate_engine.a

              CXX      src/update_engine/update_engine_client.o

              CXXLD    update_engine_client

              CXX      src/update_engine/generate_delta_main.o

              CXXLD    delta_generator

              CXX      src/update_engine/main.o

              CXXLD    update_engine

    8.总结

             我们只是需要下载update_engine源码,然后生成编译的makefile, 通过makefile生成我们所要的bin即可,每       个人可能遇到的错误不一样,以上解决方法仅供参考,主要是下载编译所依赖的库,对于有相似需求的,提供移         植参考。

                          

                        
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: