我制作的文件系统开源地址:https://git.code.tencent.com/mculover666/rootfs-busybox-imx6ull。
一、OpenSSH
当我们需要使用ssh远程登录开发板时,需要在开发板上开启ssh服务器。
SSH全称Secure Shell,是一种加密的网络传输协议,用于在不安全的网络中为网络服务提供安全的传输环境。
OpenSSH是一款开源的SSH协议具体实现,提供了服务器端后台程序和客户端工具,比如:
- ssh:ssh客户端
- sshd:ssh服务端
- scp:用于传输文件
二、移植OpenSSH
1. 获取源码
(1)zlib:一个大规模的Spiffy但微妙的不显眼的压缩库。
下载地址:http://www.zlib.net/
这里我下载最新的1.2.12版本:
axel http://www.zlib.net/zlib-1.2.12.tar.gz
(2)openssl:密码学和SSL/TLS工具包。
下载地址:https://www.openssl.org/source/
这里我下载3.0.2版本:
axel https://www.openssl.org/source/openssl-3.0.2.tar.gz
(3)openssh
下载地址:https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/
这里我下载 8.9 版本:
axel https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-8.9p1.tar.gz
下载完成后如图:
2.1. 移植zlib库
(1)解压zlib源码
tar -zxf zlib-1.2.12.tar.gz
(2)编译zlib
先新建一个文件夹用于存放编译结果:
mkdir zlib
进入zlib源码目录,配置环境变量:
cd zlib-1.2.12/
export CC=arm-linux-gnueabihf-gcc
export LD=arm-linux-gnueabihf-ld
export AD=arm-linux-gnueabihf-as
配置编译路径:
./configure --prefix=/home/mculover666/imx6ull/rootfs/openssh/zlib
后续编译openssh的时候发现zlib编译静态库的时候,并没有指定与位置无关,修改一下makefile,添加-fPIC参数。
编译:
make
安装:
make install
(3)拷贝编译结果中lib目录下的zlib库文件,到开发板根文件系统的/lib目录下。
2.2. 移植openssl库
(1)解压
tar -zxf openssl-3.0.2.tar.gz
(2)编译
先新建一个文件夹用于存放编译结果:
mkdir oepnssl
进入 oepnssl 源码目录,配置环境变量:
cd openssl-3.0.2/
export CROSS_COMPILE=arm-linux-gnueabihf-
配置编译路径:
./Configure linux-armv4 shared no-asm --prefix=/home/mculover666/imx6ull/rootfs/openssh/openssl
编译:
make
安装:
make install
(3)拷贝编译结果中lib目录下的libcrypto库文件和libssl库文件,到开发板根文件系统的 /usr/lib 目录下。
cp -af libcrypto.so* ~/imx6ull/rootfs/rootfs-busybox-imx6ull/usr/lib/
cp -af libssl.so* ~/imx6ull/rootfs/rootfs-busybox-imx6ull/usr/lib/
2.3. 移植openssh库
(1)解压
tar -zxf openssh-8.9.tar.gz
(2)编译
进入ssh目录:
cd openssh-8.9p1/
编译配置:
./configure --host=arm-linux-gnueabihf --with-libs --with-zlib=/home/mculover666/imx6ull/rootfs/openssh/zlib --with-ssl-dir=/home/mculover666/imx6ull/rootfs/openssh/openssl --disable-etcdefault-login CC=arm-linux-gnueabihf-gcc AR=arm-linux-gnueabihf-ar
编译:
make
(3)拷贝文件
在开发板中创建如下目录:
mkdir -p /usr/local/bin
mkdir -p /usr/local/sbin
mkdir -p /usr/local/libexec/
mkdir -p /usr/local/etc
mkdir -p /var/run
mkdir -p /var/empty/
将下面的可执行文件拷贝到开发板根文件系统的 /usr/local/bin 目录下:
scp sftp ssh ssh-add ssh-agent ssh-keygen ssh-keyscan
将下面的可执行文件拷贝到开发板根文件系统的 /usr/local/sbin 目录下:
sshd
将下面的文件拷贝到开发板根文件系统的 /usr/local/etc 目录下:
moduli ssh_config sshd_config
将下面的文件拷贝到开发板根文件系统的 /usr/libexec
目录下:
sftp-server ssh-keysign
(3)进入开发板根文件系统bin目录,为ssh生成软连接
cd bin
ln -s ../usr/local/bin/scp
ln -s ../usr/local/bin/sftp
ln -s ../usr/local/bin/ssh
ln -s ../usr/local/bin/ssh-add
ln -s ../usr/local/bin/ssh-agent
ln -s ../usr/local/bin/ssh-keygen
ln -s ../usr/local/bin/ssh-keyscan
(4)进入开发板根文件系统sbin目录,为sshd生成软连接
cd sbin
ln -s ../usr/local/sbin/sshd
(5)进入开发板根文件系统/usr/local/etc目录,修改sshd配置
cd usr/local/etc
vim sshd_config
允许root用户通过ssh登录:
至此,openSSH移植完成,将根文件系统打包重新烧录到开发板中,之后的命令都在开发板上完成。
tar -jcf rootfs.tar.bz2 *
三、openssh设置
1. 添加sshd用户
这里需要使用adduser命令,如果adduser命令无法使用,可以参考博客:嵌入式linux根文件系统:根文件系统报错 passwd: unknown uid 0。
创建一个用户名和密码都是sshd的用户:
adduser sshd
2. 生成密钥文件
进入开发板的/usr/local/etc目录,按照如下命令生成:
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 ed25519 -f ssh_host_ed25519_key -N ""
因为imx6ull性能比较低,所以第一条命令生成时间会比较长。
四、openssh使用
1. 启动sshd服务器
/sbin/sshd
解决文件夹没有的问题:
将启动命令添加到/etc/init.d/rcS文件,设置开机自动启动。
2. ssh登录开发板
启动后使用ssh登录上去测试,可以登root用户或者sshd用户:
3. ssh传输文件
使用 scp 命令从ubuntu向开发板传输文件:
scp hello.txt sshd@192.168.1.102
也可以使用xftp之类的软件,通过sftp连接开发板传输文件。