LV07-03-openssh-移植

本文主要是openssh库的移植相关笔记。若笔记中有错误或者不合适的地方,欢迎批评指正😃。

点击查看使用工具及版本
Windows版本 windows11
Ubuntu版本 Ubuntu16.04的64位版本
VMware® Workstation 16 Pro 16.2.3 build-19376536
终端软件 MobaXterm(Professional Edition v23.0 Build 5042 (license))
Linux开发板 正点原子 i.MX6ULL Linux 阿尔法开发板
uboot NXP官方提供的uboot,NXP提供的版本为uboot-imx-rel_imx_4.1.15_2.1.0_ga(使用的uboot版本为U-Boot 2016.03)
linux内核 linux-4.15(NXP官方提供)
Win32DiskImager Win32DiskImager v1.0
buildroot 2023.05.1版本
点击查看本文参考资料
分类 网址 说明
官方网站 https://www.arm.com/ ARM官方网站,在这里我们可以找到Cotex-Mx以及ARMVx的一些文档
https://www.nxp.com.cn/ NXP官方网站
https://www.nxpic.org.cn/NXP 官方社区
https://u-boot.readthedocs.io/en/latest/u-boot官网
https://www.kernel.org/linux内核官网
点击查看相关文件下载
分类 网址 说明
NXP https://github.com/nxp-imx NXP imx开发资源GitHub组织,里边会有u-boot和linux内核的仓库
https://elixir.bootlin.com/linux/latest/source 在线阅读linux kernel源码
nxp-imx/linux-imx/releases/tag/rel_imx_4.1.15_2.1.0_ga NXP linux内核仓库tags中的rel_imx_4.1.15_2.1.0_ga
nxp-imx/uboot-imx/releases/tag/rel_imx_4.1.15_2.1.0_ga NXP u-boot仓库tags中的rel_imx_4.1.15_2.1.0_ga
I.MX6ULL i.MX 6ULL Applications Processors for Industrial Products I.MX6ULL 芯片手册(datasheet,可以在线查看)
i.MX 6ULL Applications ProcessorReference Manual I.MX6ULL 参考手册(下载后才能查看,需要登录NXP官网)

有时候我们需要远程登录到开发板上对系统进行一些操作,这个时候就要使用到 SSH 服务。 SSH 是较可靠、专为远程登录会话和其他网络服务提供安全性的协议, OpenSSH 是 SSH 协议的免费开源版本,本节笔记就是在开发板中移植 OpenSSH,实现 SSH 服务。

一、OpenSSH简介

1. 简介

SSH 全称为 Secure Shell(安全外壳协议,简称 SSH),是一种加密的网络传输协议,用于在不安全的网络中为网络服务提供安全的传输环境。 SSH 功能很强大,但是最常用的还是用于远程登录。 OpenSSH 是 SSH 协议的具体实现, OpenSSH 是一款开源、免费的 SSH 软件,提供了服务器端后台程序和客户端工具, OpenSSH 提供了很多程序,常用有以下几个:

(1)ssh:ssh 软件用于替换 rlogin 与 Telnet。

(2)scp 和 sftp:将文件复制到其他主机上,用于替换 rcp。

(3)sshd:SSH 服务器。

2. 源码获取

这里我们一共需要移植三个软件包: zlib、 openssl 和 openssh。依次到这三个软件的官网下载对应的源码,官网如下:

(1)zlib 官网:zlib Home Site

(2)openssl 官网:/source/index.html (openssl.org)

(3)openssh 官网:OpenSSH

前面两个前边都有移植过,就不赘述了,我们看一下OpenSSH官网:

image-20230806111201646

可以看到当前最新的版本是9.3p2。我们可以在这里下载源码:OpenSSH: Release Notes

image-20230806111448332

这两种包应该就是加密方式不同,功能应该是一样的。我就直接下载下边的SHA256的了,因为我发现前边移植openssl的时候我下载的openssl也有一个SHA256的标识,暂时还不知道这些需不需要对应,但是还是对应一下吧,万一有啥坑呢。下载完后解压会有很多文件:

image-20230806111753752

二、移植OpenSSH

1. 移植zlib库

可以看前边的笔记。

2. 移植openssl库

可以看前边的笔记。

3. 移植OpenSSH

这里主要就是编译和安装啦。

3.1 交叉编译 openssh 库

我们执行以下命令:

1
2
3
4
5
6
7
8
9
cd ~/5ALPHA/openssh-9.3p2

./configure --host=arm-linux-gnueabihf \
--with-libs --with-zlib=/home/hk/5ALPHA/zlib-1.2.13/zlib_output \
--with-ssl-dir=/home/hk/5ALPHA/openssl-1.1.1v/openssl_output \
--disable-etcdefault-login \
CC=arm-linux-gnueabihf-gcc \
AR=arm-linux-gnueabihf-ar
make #

在配置 openssh 的过程中,“--with-zlib”参数用于指定 zlib 库所在的目录,“--with-ssl-dir”参数用于指定 openssl 库所在的目录,编译 openssh 的时候不用“make install”。编译完成后,是应该会在源码目录下生成以下文件:

1
scp sftp ssh ssh-add ssh-agent ssh-keygen ssh-keyscan

我们可以看一下:

1
2
cd ~/5ALPHA/openssh-9.3p2cd 
ls -alh scp sftp ssh ssh-add ssh-agent ssh-keygen ssh-keyscan sshd
image-20230806112823905

3.2 将 openssh 相关文件拷贝到开发板中

openssh 交叉编译完成以后在开发板根文件系统中创建如下所示目录(如果存在的话就不需要创建):

1
2
3
4
5
6
7
cd ~/4nfs/buildroot/
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

上边这些命令是在ubuntu中的nfs根文件系统中执行的,后续介意直接写进开发板的根文件系统。创建完毕后我们将下边这些文件拷贝到 /usr/local/bin 目录中

1
2
cd ~/5ALPHA/openssh-9.3p2
cp scp sftp ssh ssh-add ssh-agent ssh-keygen ssh-keyscan ~/4nfs/buildroot/usr/local/bin/

将如下文件拷贝到开发板的/usr/local/sbin 目录下 :

1
2
cd ~/5ALPHA/openssh-9.3p2
cp sshd ~/4nfs/buildroot/usr/local/sbin/

将如下文件拷贝到开发板的/usr/local/etc 目录下:

1
2
cd ~/5ALPHA/openssh-9.3p2
cp moduli ssh_config sshd_config ~/4nfs/buildroot/usr/local/etc

将如下文件拷贝到开发板的/usr/local/libexec 目录下:

1
2
cd ~/5ALPHA/openssh-9.3p2
cp sftp-server ssh-keysign ~/4nfs/buildroot/usr/local/etc

然后就是创建软连接,进入开发板中的/bin 目录下,输入如下命令创建软连接(这部分需要在开发板的串口终端下操作):

1
2
3
4
5
6
7
8
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

我们查看一下创建情况:

1
ls -alh scp sftp ssh ssh-add ssh-agent ssh-keygen ssh-keyscan
image-20230806113943540

再进入开发板的/sbin 目录下,输入如下命令创建软连接:

1
2
cd /sbin/
ln -s /usr/local/sbin/sshd
image-20230806114038415

软连接创建完成以后就可以直接调用上面 ssh 相关命令了。在开发板串口终端打开 /usr/local/etc/sshd_config 文件,找到“#PermitRootLogin”所在行,将其改为“PermitRootLogin yes”。

image-20230806114252117

3.3 openssh设置

3.3.1 添加 sshd 用户

首先添加“sshd”用户,在使用 adduser 命令添加 sshd 用户的时候需要检查一些文件或目录是否存在。如果第一次添加用户的话要先将 ubuntu 下的/etc/passwd 和/etc/group 这两个文件复制到开发板根文件系统的对应目录,命令如下:

1
2
sudo cp -f /etc/passwd  ~/4nfs/buildroot/etc/ 
sudo cp -f /etc/group ~/4nfs/buildroot/etc/
image-20230806114646846

然后修改开发板根文件系统中的/etc/passwd 和/etc/group 这两个文件,只保留“root”这一项。 passwd 文件“root”行最后改为“/bin/sh”, 修改后的 passwd 和 group 文件内容如图

image-20230806115439407

另外还需要创建几个目录和文件,都是在开发板的串口终端执行:

1
2
3
mkdir /home
mkdir -p /usr/share/empty
mkdir -p /var/log

当所需的文件都存在以后就可以使用 adduser 创建名为“sshd”的用户了,创建 sshd 用户的时候需要设置密码,一定要记得这个密码,这里我设置简单一点,为“123456”,创建过程如图 :

image-20230806115603426

3.3.2 在开发板上生成秘钥文件

一切准备好以后我们还需要在开发板中生成秘钥文件,使用我们上面移植 openssh 所编译出来的 ssh-keygen 软件即可。从串口终端进入到开发板的 /usr/local/etc 目录下,输入如下所示命令生成秘钥文件,由于 IMX6ULL 性能比较差,有些秘钥文件生成过程可以会有点耗时,打开几十秒:

1
2
3
4
5
cd /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 ""

完成以后就会在/usr/local/etc 目录下产生 8 个以“ssh_host_”开头的秘钥文件,如图 :

image-20230806115952906

4. 启动openssh

openssh 移植已经移植到了开发板中,我们可以通过 sshd 软件在开发板上搭建 openssh 服务器,然后在其他的主机上通过 ssh 来登录开发板。我们可以同样使用 scp 命令来向开发板传输文件。首先要在开发板上启动 ssh 服务, sshd 软件用于启动 ssh 服务,注意要输入全路径!输入如下命令:

1
/sbin/sshd # 启动 sshd 服务

也可以在 /etc/init.d/rcS 文件中加入如下命令,实现 ssh 服务开机自启动:

1
/sbin/sshd &

然后启动的时候好像就报错了:

image-20230806120311058

好像是权限问题,可以这样处理:

1
2
3
4
5
6
mkdir -p /var/empty/sshd             # 没有这个目录可以直接创建
chown -R root.root /var # 修改用户组
chown -R root.root /var/empty # 修改用户组
chown -R root.root /var/empty/sshd # 修改用户组
chmod 744 /var/empty/sshd # 修改权限
chmod 744 /var/empty # 修改权限

可以使用下边的命令查看一下 /var/empty/sshd 目录情况:

1
2
3
4
5
6
# ls -ld /var
drwxr--r-- 5 root root 4096 Aug 6 2023 /var
# ls -ld /var/empty/
drwxr--r-- 3 root root 4096 Aug 6 2023 /var/empty/
# ls -ld /var/empty/sshd/
drwxr--r-- 2 root root 4096 Aug 6 2023 /var/empty/sshd/

三、ssh登录使用

启动以后我们就可以使用 XobaXterm、 SecureCRT 等终端软件通过 SSH 服务登录开发板,我们先看一下开发板的ip地址:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# ifconfig
eth0 Link encap:Ethernet HWaddr B8:AE:1D:01:00:00
inet addr:192.168.10.102 Bcast:192.168.10.255 Mask:255.255.255.0
inet6 addr: fe80::baae:1dff:fe01:0/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:4238 errors:0 dropped:0 overruns:0 frame:0
TX packets:3418 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:4703475 (4.4 MiB) TX bytes:490768 (479.2 KiB)

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

1. MobaXterm登录开发板

我们使用MobaXterm来连接一下试试:

image-20230806121730501

配置完成以后点击“OK”按钮,此时就会打开 ssh 会话框 ,输入 sshd 用户密码:

image-20230806121927850

可能会弹出是否保存密码对话框,选择保存即可。如果密码正确的话就会登录到开发板上

image-20230806121850731

登陆成功的哈如下图所示:

image-20230806122017577

2. ubuntu登录开发板

同样的,我们也可以在 ubuntu 下通过 ssh 命令登录开发板,输入如下命令:

1
ssh sshd@192.168.10.102

然后会让输入密码,密码正确就也可以登录开发板啦,前提是ubuntu和开发板在同一网段,可以ping通。

image-20230806122300837

输入“exit”命令即可退出 SSH 会话

3. scp命令拷贝文件

如果我们要向开发板发送一个文件,我们可以通过 TF 卡或者 U 盘来中转,或者通过 tftp 来发送。我们移植 openssh 的时候也编译出来了一个名为“scp”的命令,所以我们可以在开发板中使用 scp 命令向其他主机发送文件,同样的其他主机也可以使用 scp 命令向开发板发送文件。比如我们要把 ubuntu 中的一个文件发送到开发板中,输入如下命令即可:

1
scp local_file remote_username@remote_ip:remote_folder 

例如:

1
2
3
# 在ubuntu中执行
touch hello.c
scp hello.c sshd@192.168.10.102:/home/sshd/scp_file # /home/sshd/scp_file目录要做存在
image-20230806123113752

然后我们看一下开发板对应的目录是否已经有这个文件了(下图是在串口终端看的)

image-20230806123347761