移植SSH到ARM Linux开发板

本文章转载自新浪博客:http://blog.sina.com.cn/s/blog_7f2a9a390100xws4.html

里先森按:

原文使用的编译器较老,正在试用arm-linux-gnueabi-gcc操作以下步骤


编译器arm-linux-gccarm-none-linux-gnueabi-gcc成功。

        在移植到友善2440的时候很容易,因为他4.3.2交叉编译器等库文件做等好。但是在移植到天漠devkit8000时,遇到非常多的问题。一个月之前遇到问题没有找到-lgcc_s的问题一直没有解决,以致后来非常影响开发进度。最近决心解决这个问题,在google上查到没有找到lxx其实时没有找到libxxx.so,然后与友善2440比较了下,发现果真是arm-none-linux-gnueabi/libc/lib下缺少libgcc_s.so。最后一步问题总结是我编译的时候遇到等所有问题,后一一化解,成功移植。所以,如果你在编译等时候出错,查看最后的问题总结,应该可以找到答案。

步骤:

1.下载源码包,地址如下:

openssh  http://www.openssh.com/portable.html
openssl  http://www.openssl.org/source
zlib     http://www.zlib.net/

2.交叉编译

创建工作目录:

#mkdir /work
#cd /work

在/work目下面创建ssh目录

# mkdir /work/lib              -----〉共享库目录,通过nfs挂载
# mkdir /work/ssh              -----〉工作目录
# cd  /work/ssh
# mkdir compressed install source  -----〉compressed 用于存放源码包
                                   -----〉Install    软件安装目录
                                   -----〉Source    源码包解压目录
#mv tarpakgs/openssh-4.6p1.tar.gz   /work/ssh/compressed
#mv tarpakgs/openssl-0.9.8e.tar.gz  /work/ssh/compressed
#mv tarpakgs/zlib-1.2.3.tar.gz      /work/ssh/compressed

解压安装包:

# cd /work/ssh/compressed/
# tar zxvf zlib-1.2.3.tar.gz  -C  ../source
# tar zxvf openssl-0.9.8e.tar.gz  -C  ../source
# tar zxvf openssh-4.6p1.tar.gz  –C ../source

交叉编译 zlib:
# cd  /work/ssh/source/zlib-1.2.3
# ./configure --prefix=/work/ssh/install/zlib-1.2.3
# vim Makefile
CC=arm-none-linux-gnueabi-gcc
AR=arm-none-linux-gnueabi-ar rc
CPP =arm-none-linux-gnueabi-gcc -E
LDSHARED=arm-none-linux-gnueabi-gcc

# make
# make install

交叉编译openssl
# cd  /work/ssh/source/openssl-0.9.8e
# ./Configure --prefix=/work/ssh/install/openssl-0.9.8e  os/compiler:arm-none-linux-gnueabi-gcc

# make
# make install

交叉编译openssh
# cd  /work/ssh/source/ openssh-4.6p1
#./configure --host=arm-none-linux-gnueabi --with-libs --with-zlib=/work/ssh/install/zlib-1.2.3 --with-ssl-dir=/work/ssh/install/openssl-0.9.8e --disable-etc-default-login CC=arm-none-linux-gnueabi-gcc AR=arm-none-linux-gnueabi-ar
#make
注意:openssh不需要make install

3.操作目标板

3.1确保目标板上有以下目录,若没有,则新建:

/usr/local/bin/

/usr/local/sbin/ 

/usr/local/etc/ 

/usr/local/libexec/ 

/var/run/ 

/var/empty/

3.2从PC机上将以下文件拷贝到目标板Linux系统中

PC机 /work/ssh/source/openssh-4.6p1/ 目录下的

scp  sftp  ssh  ssh-add  ssh-agent  ssh-keygen  ssh-keyscan 拷贝到目标板/usr/local/bin

moduli ssh_config sshd_config拷贝到目标板 /usr/local/etc

sftp-server  ssh-keysign 拷贝到目标板 /usr/local/libexec

sshd 拷贝到目标板 /usr/local/sbin/

3.3生成Key文件
在PC机 /work/ssh/source/openssh-4.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_host_*_key这3个文件copy到目标板的 /usr/local/etc/目录下


3.4修改目标板passwd文件。
在/etc/passwd 中添加下面这一行
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

4.测试

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

主机上:

#ssh root@192.168.0.34(开发板的ip)

然后输入开发板的root密码就就可以了。

//root密码就是你开发板上root的密码,如果之前root没有密码,需要重新设置,用passwd root,然后输入密码即可。

登录成功后如下图:

通过ssh连接开发板之arm-linux下ssh的安装使用

putty登录

通过ssh连接开发板之arm-linux下ssh的安装使用

linux主机登录

问题总结

1.运行sshd时出现
sshd: /lib/libc.so.6: version `GLIBC_2.7' not found (required by sshd) 

问题分析:说明你编译等时候指定等glibc和目标板所使用的不一致。
解决办法:配置openssh,即./configure时,使用对用等--host参数,如--host=arm-linux/arm-none-linux-gnueabi。

2.make openssl的时候,指定的prefix目录已经存在,无法创建。
问题分析:这是因为在prefix目录的时候,使用了相对路径,如../../install。
解决办法:openssl需要用指定绝对路径来安装,prefix参数应该如:--prefix=/work/ssh/install/openssl-1.0.0

3.使用arm-2007q3-51-arm-none-linux-gnueabi.bin的make编译ssh和gdbserver时出错:
/root/CodeSourcery/Sourcery_G++_Lite/bin/../lib/gcc/arm-none-linux-gnueabi/4.2.1/../../../../arm-none-linux-gnueabi/bin/ld: cannot find -lgcc_s
collect2: ld returned 1 exit status
make: *** [example] 错误 1


问题解析:

cannot find -lgcc_s,即没有发现-libgcc_s.so。

解决办法:
可能一解决:查找/root/CodeSourcery/Sourcery_G++_Lite/arm-none-linux-gnueabi/libc/lib目录,如果有libgcc_s.so.1,做一个链接:ln -s libgcc_s.so.1 libgcc_s.so,重新make,此问题可以解决。如果再出现以下问题:

同理,其他的问题,也在/arm-none-linux-gnueabi/libc/lib目录下,

问题:cannot find /lib/libc.so.6 inside,解决:ln -s libc-2.5.so libc.so.6

问题:cannot find /lib/ld-linux.so.3 inside,解决:ln -s ld-2.5.so ld-linux.so.3


4.用nfs从主机复制到目标板时出现:
cp: omitting directory '/etc/boa'
等错误。

问题分析:权限不够,或者目标板中等/usr/local/etc已经有文件。
解决办法:在cp命令后加-r参数,如:cp -r /etc/* /usr/local/etc/

5.运行sshd时出现:
Could not load host key: /usr/local/etc/ssh_host_dsa_key
Could not load host key: /usr/local/etc/ssh_host_ecdsa_key


问题解析:在/usr/local/etc目录中没有相应等key。
解决办法:按照操作步骤,运行:
                 ssh-keygen -t dsa -f ssh_host_das_key -N ""
                 ssh-keygen -t ecdsa -f ssh_host_ecdas_key -N ""
生成ssh_host_das_key 和ssh_host_ecdas_key后复制到目标板/usr/local/etc/目录下。

6.从nfs复制key文件到usr/local/etc时出现:
cp: can't open 'ssh_host_dsa_key': Permission denied

问题分析:目标板复制权限不够。
解决办法:在主机中修改他们等权限为777,命令:chmod 777 *     。然后再复制。

7.Privilege separation user sshd does not exist
//需要在开发板的系统里adduser shhd
//或者在/etc/passwd 中添加下面这一行
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

8.Permissions 0755 for '/usr/local/etc/ssh_host_dsa_key' are too open.
//则把目标板/usr/local/etc/下的ssh_host_*几个文件的权限改为700。如果出现权限不够问题,用su - root进入root用户再改。
命令:#chmod 700 ssh_host_*

9.Permission denied (publickey,password,keyboard-interactive).
//打开开发板/usr/local/sshd_config,将PermitRootLogin yes前的注释“#”号去掉。

10.configure配置openssh的时候出错:
configure: error: *** zlib missing - please install first or check config.log ***
问题分析:没有找到zlib。
问题解决:重新交叉编译zlib,再configure即可。

11.以下两个函数没找到:
/home/arm/ssh-omap/source/openssh-5.8p2/ssh-keygen.c:1410: undefined reference to `pkcs11_init'
/home/arm/ssh-omap/source/openssh-5.8p2/ssh-keygen.c:1493: undefined reference to `pkcs11_terminate'

问题解决:
打开ssh-keygen.c:vi ssh-keygen.c
屏蔽这1410和1493这两行函数。

12.开启sshd后,没有找到sftp-server服务。如DS-5软件在连接时就出现以下错误,虽然还可以用终端,不过不能传输文件,还是很不爽的:

Failed to connect SFTP subsystem: Remote host may not have sftp-server installed : java.io.IOException: inputstream is closed

问题分析:明显的,这是没有找到sftp子服务。

问题解决:打开/usr/local/etc/sshd_config,找到这么一行:

Subsystem sftp /usr/libexec/sftp-server

看出问题了吧?配置文件中指明的sftp子服务并不是我们放的目录,所以修改为:

Subsystem sftp /usr/local/libexec/sftp-server

然后kill掉sshd,再启动就可以用sftp-server了。


里先森按:

问题:

1.arm-linux-gnueabi-ar: libz.a: 没有那个文件或目录

   在上文的下述代码部分

交叉编译 zlib:
# cd  /work/ssh/source/zlib-1.2.3
# ./configure --prefix=/work/ssh/install/zlib-1.2.3
# vim Makefile
CC=arm-none-linux-gnueabi-gcc
AR=arm-none-linux-gnueabi-ar rc
CPP =arm-none-linux-gnueabi-gcc -E
LDSHARED=arm-none-linux-gnueabi-gcc

 将AR=arm-none-linux-gnueabi-ar rc 最后的rc删除,因为在新版本的zlib-1.2.11 Makefile中,在AR下面一行有加入ARFLAGS=rc

2.编译openssl ./config问题

选择以下方法进行编译

./config no-asm -shared --prefix=你希望安装到的目录

no-asm是在交叉编译过程中不使用汇编代码代码加速编译过程

配置完成后,手动修改Makefile,将其中有-m64的地方全部删除(两处),修改

PLATFORM=arm

CROSS_COMPILE=arm-linux-gnueabi-

之后$make $make install 完成后将在你希望安装到的目录生成5个目录

猜你喜欢

转载自blog.csdn.net/u013662665/article/details/84106094