移植SSH到ARM目标板的Linux系统中

前言: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.思路整理



一.成功移植SSH到ARM目标板的Linux系统中

传统的网络服务程序,在网络上用明文传送口令和数据,所以---ftp、pop和telnet在本质上都是不安全的。SSH ( Secure Shell),则会加密传输的数据,并且压缩后再传输,使得计算机之间的远程控制和数据传输安全高效。
在运行Linux操作系统上移植ssh步骤:
        1. 下载安装包;
        2. 找到一个开发平台,在开发平台上进行部署要配置的文件;
        3. 配置编译相关文件;
        4.  移植可执行文件、配置文件、库到目标平台上。
        5. 测试

1. 下载:

移植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的版本后再移植

2. 部署

3. 配置和交叉编译

1. 编译zlib
    cd  /home/work/ssh/source/zlib-1.2.3
    /*配置zlib*/
    ./configure -prefix=/home/work/ssh/install/zlib
    /*修改Makefile :*/
    vi Makefile
    CC=gcc 改为:
    CC=arm-none-linux-gnueabi-gcc
    LDSHARED= gcc 改为:
    LDSHARED=arm-none-linux-gnueabi-gcc
    CPP= gcc - E 改为:
    CPP=arm-none-linux-gnueabi-gcc - E
    AR= ar rc 改为:
    AR=arm-none-linux-gnueabi-ar rc
    /*保存退出,开始编译:*/
    make
    make install

 

2. 编译openssl
cd  /home/work/ssh/source/openssl-0.9.8e
/*配置openssl*/
./Configure os/compiler:arm-none-linux-gnueabi-gcc
make
make install

 

3. 编译openssh
cd /home/work/ssh/source/openssh-5.6p1
./configure -host=arm-none-linux-gnueabi -with-libs -with-zlib=/home/work/ssh/install/zlib -with-ssl-dir=/usr/local/ssl -disable-etc-default-login CC=arm-none-linux-gnueabi-gcc AR=arm-none-linux-gnueabi-ar
make
注意:openssh不需要make install,不需要安装目录
configure opt介绍:
–prefix= install architecture-independent files in PREFIX[ /usr/local ] (将体系无关文件安装到目录PREFIX里,默认是/usr/local),这里的有:PREFIX/etc,PREFIX/com,PREFIX/var,PREFIX/include,PREFIX/share
–with-zlib=刚才编译出来的zlib安装路径
–with-ssl-dir=刚才编译出来openssl安装路径
–host=交叉编译出来的程序运行的平台

4. 移植到ARM目标板

确保目标板上有以下目录,如果是真的没有的时候,则新建添加,
/usr/local/bin/
/usr/local/sbin/
/usr/local/etc/
/usr/local/libexec/
/var/run/
/var/empty/
/*改变empty的所属权为root*/
chown  root /var/empty

拷贝文件到目标板Linux系统中
cd /home/work/ssh/source/openssh-5.6p1/
cp scp sftp ssh ssh-add ssh-agent ssh-keygen ssh-keyscan /usr/local/bin
cp moduli ssh_config sshd_config /usr/local/etc
cp sftp-server ssh-keysign /usr/local/libexec
cp sshd /usr/local/sbin/
chmod 777 /usr/local/sbin/sshd

在开发平台上生成Key文件,拷贝到目标板
cd /home/work/ssh/source/openssh-5.6p1/
ssh-keygen -t rsa -f ssh_host_rsa_key -N ""
ssh-keygen -t dsa -f ssh_host_dsa_key -N ""
ssh-keygen -t ecdsa -f ssh_host_ecdsa_key -N ""
ssh-keygen -t dsa -f ssh_host_ed25519_key -N ""
cp ssh_host_*_key /usr/local/etc/
chmod 600 /usr/local/etc/ssh_host_ed25519_key
注:key是指私钥文件,有4个文件需要拷贝

修改目标板密码,在目标板的文件系统中添加:
在/etc/passwd 中添加下面这一行
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

5. 测试

首先必须保证目标板的时间和当前时间的一致,才能使访问时密码不会过时。
可以在目标板上使用data命令设置时间:
date -s "2018-01-19 10:30:00"
配置目标板网络:
ifconfig eth0 192.168.117.119
ifconfig eth0 up
在ARM单板上运行(注意请使用绝对路径来启动sshd服务器守护进程):
/usr/local/sbin/sshd


可以使用ps命令查看sshd是否工作,如果运行的过程中有提示缺少动态连接库,可以在主机上搜索相应文件,拷贝到目标板/lib/目录下面,注意创建软连接!

在主机上运行:
ssh [email protected](开发板的ip)
然后输入开发板的root密码就就可以了。

注:
    1. root密码就是你开发板上root的密码,如果之前root没有密码,需要重新设置,用passwd root,然后输入密码即可。
    2. 如果目标板由于某些网络的影响导致ip不稳定,使得ssh client连接不上,可以尝试把目标板的ip固定
    vi autorun.sh /*添加如下*/
    ifconfig eth0 192.168.117.119
    3. 如果移植编译的时候出错,请考虑你的交叉编译链和你的软件版本的匹配性,针对自己的交叉编译链,酌情降低或者升高软件版本,重新按照以上步骤来执行。

二.openssl交叉编译

交叉编译与Ubuntu编译类似,配置时通过【--prefix=绝对路径】选项指定安装路径(自行创建文件夹),然后修改Makefile文件,修改方式如下:

./config no-asm -shared --prefix=/home/fangye/libs_build/openssl/build_arm

vim Makeifle

指定交叉编译工具链:

移植SSH到ARM目标板的Linux系统中_第1张图片

搜索-m64选项并删除,共两处:

交叉编译、安装交叉编译后的库至之前自行指定的路径。

# make
# make install

交叉编译结果:

三.错误记录

1.openssl make install出错

recipe for target 'install_docs' failed

configue时要加上no-asm -shared参数,然后修改Makefile;具体参考上面的openssl交叉编译

 

2.openssh configue时出错

 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即可;

 

3.openssh configure时出错

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版本过低,我更换更新的版本后问题解决;

 

4.openssh make编译时出错

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这三个版本我就没有成功;

 

5.移植完运行时(最后)出错

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这两个库的版本,具体我下面做简单的说明。

 

6.思路整理

首先,GLIBC_x.xx是我们自己ARM板子的环境,而glibc本身又不建议升级,比如我的sshd运行需要GLIBC_2.2.5

移植SSH到ARM目标板的Linux系统中_第2张图片

但是我的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:实在是当时各种问题掺杂在一起没个头绪试吐了,测试通过就行,我就不追求使用最新版本了,苦笑~

 

 

 

 

 

 

 

你可能感兴趣的:(SSH)