前言:SSH的移植部署网上文章有很多,流程也几乎一样,但是我在参考移植的过程中,因为源码库本身的版本更新,Ubuntu18.04开发环境和我的Hi3559单板环境问题,导致我移植过程中遇到很多“坑”,虽然最终成功,但是过程却不那么愉快,耗费很多精力不断尝试,决定整理记录一下。
参考文章:
成功移植SSH到ARM目标板的Linux系统中:https://blog.csdn.net/u010014090/article/details/79104429
openssl的编译与交叉编译: https://blog.csdn.net/fangye945a/article/details/86658621
注:SSH移植和Openssl编译是原版移植,可以参考上面原文链接;文章最后会单独列出来我遇到的问题;
目录
一.成功移植SSH到ARM目标板的Linux系统中
1. 下载:
2. 部署
3. 配置和交叉编译
4. 移植到ARM目标板
5. 测试
二.openssl交叉编译
三.错误记录
1.openssl make install出错
2.openssh configue时出错
3.openssh configure时出错
4.openssh make编译时出错
5.移植完运行时(最后)出错
6.思路整理
传统的网络服务程序,在网络上用明文传送口令和数据,所以---ftp、pop和telnet在本质上都是不安全的。SSH ( Secure Shell),则会加密传输的数据,并且压缩后再传输,使得计算机之间的远程控制和数据传输安全高效。 |
移植SSH需要3个安装包:zlib、openssl和openssh,地址如下:
zlib官方下载:http://www.zlib.net/
openssl官方下载:http://www.openssl.org/source
openssh官网下载:http://www.openssh.com/portable.html
因为它们之间没有版本所谓的版本冲突,所以都下载最新板的即可。本文以zlib-1.2.3.tar.gz、openssl-0.9.8e.tar.gz、openssh-5.6p1.tar.gz这三个版本为例,其他版本过程一样。注意:其他高版本的移植工作后会依赖对应的高版本的库,有时候目标板不支持高版本库的时候,就可以适当降低openssh的版本后再移植。
1. 编译zlib
2. 编译openssl
3. 编译openssh |
确保目标板上有以下目录,如果是真的没有的时候,则新建添加, 拷贝文件到目标板Linux系统中 在开发平台上生成Key文件,拷贝到目标板 修改目标板密码,在目标板的文件系统中添加: |
首先必须保证目标板的时间和当前时间的一致,才能使访问时密码不会过时。
在主机上运行: 注: |
交叉编译与Ubuntu编译类似,配置时通过【--prefix=绝对路径】选项指定安装路径(自行创建文件夹),然后修改Makefile文件,修改方式如下:
./config no-asm -shared --prefix=/home/fangye/libs_build/openssl/build_arm vim Makeifle |
指定交叉编译工具链:
搜索-m64选项并删除,共两处:
交叉编译、安装交叉编译后的库至之前自行指定的路径。
# make # make install |
交叉编译结果:
recipe for target 'install_docs' failed
configue时要加上no-asm -shared参数,然后修改Makefile;具体参考上面的openssl交叉编译
configure: error: /bin/sh ./config.sub aarch64-himix100-linux failed
wget -O config.sub 'http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD'
wget -O config.guess 'http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD'
使用新下载的文件替换原来的,再次运行configure即可;
注:网上很多说缺库文件的,用apt-get自动安装后即可,但是我的环境是Ubuntu18.04而且不缺少这些文件;
最后百度到这种下载新文件替换原有的解决问题;如果是config.guess报错的话,同样替换config.guess即可;
configure: error: *** zlib.h missing - please install first or check config.log ***
configure: error: *** Can't find recent OpenSSL libcrypto (see config.log for details) ***
configure: error: *** OpenSSL headers missing - please install first or check config.log ***
注:网上很多说缺库文件的,用apt-get自动安装后即可,但是我的环境是Ubuntu18.04而且不缺少这些文件;
但实际上是openssl版本过低,我更换更新的版本后问题解决;
authfd.c:487:33: error: dereferencing pointer to incomplete type 'DSA {aka struct dsa_st}'
buffer_put_bignum2(b, key->dsa->p);
configure配置时连接的SSL版本相对过高,所以更换高版本的SSH或者配置低版本的SSL即可解决;
这个可能跟自己的电脑(Linux)环境也有关系,毕竟我使用多个博主的移植版本在我的电脑上也没有成功;
比如:zlib-1.2.3.tar.gz、openssl-0.9.8e.tar.gz、openssh-5.6p1.tar.gz这三个版本我就没有成功;
libc.so: version `GLIBC_2.25' not found
这里可以说是“最坑”的地方,使用最新的zlib,openssl,openssh完成交叉编译后却发现不能在ARM板上运行
而解决这个错误,没两把刷子的还是不要去尝试的好
GLIBC介绍:glibc是GNU发布的libc库,即c运行库。glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现。内核实现一个功能,glibc要花很久才会用上,由于glibc和内核不是一块开发的,所以glibc需要去兼容不同版本的内核,而内核也要去兼容不同版本的 glibc,双方都背负了太多的历史包袱。
总结:GLIBC是系统底层依赖的文件,自己不要随随便便编译,如果真要升级,那就使用yum升级,不要自己编译,因为编译出来的版本和内核版本之间不一定能兼容在一起,这是个很麻烦的事。
解决方法:其实很简单,文章开篇就说了,其他高版本的移植工作后会依赖对应的高版本的库,有时候目标板不支持高版本库的时候,就可以适当降低openssh的版本后再移植。没错,你没有看错,之所以最后会出这个问题,其实就是三个库,严格来说是openssl和openssh这两个库的版本,具体我下面做简单的说明。
首先,GLIBC_x.xx是我们自己ARM板子的环境,而glibc本身又不建议升级,比如我的sshd运行需要GLIBC_2.2.5
但是我的ARM(Hi3559)只支持2.17-2.24,解决办法就是运行一个依赖2.17-2.24版本glibc的sshd程序;
倒推的就是,sshd是由openssh编译(make)出来的,那就只能去官网下载更低版本的openssh来编译;
这里就牵涉一个非常蛋疼的问题,
降低SSH的版本,这里就可能出现SSL的版本相对较高,make的时候就会出错误; 倒推 > 需要降低SSL的版本
降低SSL的版本,但是SSL的版本不能太低,否则SSH在configure配置的时候可能会出错;//可能跟自己的开发环境有关
可怜我开始都用最新的版本,最后运行出错;
后面三个源码库回退,出错百度大多是apt-get安装库文件,但我又不缺库文件,emm......
所以,真正的解决思路就是开篇博主弱弱提的一句,适当降低openssh的版本后再移植!emmm......
总结一下:
sshd的运行依赖glibc库跟自己的目标板(ARM)相关;
SSH的编译和SSL的版本有关;
SSL的配置跟开发环境有关(Ubuntu);
我的是Ubuntu18-0.4,AMR板是Hi3559A
最后附带一下我移植成功的源码库版本:zlib-1.2.3 openssl-1.0.2p openssh-5.0p1
PS:实在是当时各种问题掺杂在一起没个头绪试吐了,测试通过就行,我就不追求使用最新版本了,苦笑~