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官网:
可以看到当前最新的版本是9.3p2。我们可以在这里下载源码:OpenSSH: Release Notes
这两种包应该就是加密方式不同,功能应该是一样的。我就直接下载下边的SHA256的了,因为我发现前边移植openssl的时候我下载的openssl也有一个SHA256的标识,暂时还不知道这些需不需要对应,但是还是对应一下吧,万一有啥坑呢。下载完后解压会有很多文件:
二、移植OpenSSH
1. 移植zlib库
可以看前边的笔记。
2. 移植openssl库
可以看前边的笔记。
3. 移植OpenSSH
这里主要就是编译和安装啦。
3.1 交叉编译 openssh 库
我们执行以下命令:
1 | cd ~/5ALPHA/openssh-9.3p2 |
在配置 openssh 的过程中,“--with-zlib”参数用于指定 zlib 库所在的目录,“--with-ssl-dir”参数用于指定 openssl 库所在的目录,编译 openssh 的时候不用“make install”。编译完成后,是应该会在源码目录下生成以下文件:
1 | scp sftp ssh ssh-add ssh-agent ssh-keygen ssh-keyscan |
我们可以看一下:
1 | cd ~/5ALPHA/openssh-9.3p2cd |
3.2 将 openssh 相关文件拷贝到开发板中
openssh 交叉编译完成以后在开发板根文件系统中创建如下所示目录(如果存在的话就不需要创建):
1 | cd ~/4nfs/buildroot/ |
上边这些命令是在ubuntu中的nfs根文件系统中执行的,后续介意直接写进开发板的根文件系统。创建完毕后我们将下边这些文件拷贝到 /usr/local/bin 目录中
1 | cd ~/5ALPHA/openssh-9.3p2 |
将如下文件拷贝到开发板的/usr/local/sbin 目录下 :
1 | cd ~/5ALPHA/openssh-9.3p2 |
将如下文件拷贝到开发板的/usr/local/etc 目录下:
1 | cd ~/5ALPHA/openssh-9.3p2 |
将如下文件拷贝到开发板的/usr/local/libexec 目录下:
1 | cd ~/5ALPHA/openssh-9.3p2 |
然后就是创建软连接,进入开发板中的/bin 目录下,输入如下命令创建软连接(这部分需要在开发板的串口终端下操作):
1 | cd /bin/ |
我们查看一下创建情况:
1 | ls -alh scp sftp ssh ssh-add ssh-agent ssh-keygen ssh-keyscan |
再进入开发板的/sbin 目录下,输入如下命令创建软连接:
1 | cd /sbin/ |
软连接创建完成以后就可以直接调用上面 ssh 相关命令了。在开发板串口终端打开 /usr/local/etc/sshd_config 文件,找到“#PermitRootLogin”所在行,将其改为“PermitRootLogin yes”。
3.3 openssh设置
3.3.1 添加 sshd 用户
首先添加“sshd”用户,在使用 adduser 命令添加 sshd 用户的时候需要检查一些文件或目录是否存在。如果第一次添加用户的话要先将 ubuntu 下的/etc/passwd 和/etc/group 这两个文件复制到开发板根文件系统的对应目录,命令如下:
1 | sudo cp -f /etc/passwd ~/4nfs/buildroot/etc/ |
然后修改开发板根文件系统中的/etc/passwd 和/etc/group 这两个文件,只保留“root”这一项。 passwd 文件“root”行最后改为“/bin/sh”, 修改后的 passwd 和 group 文件内容如图
另外还需要创建几个目录和文件,都是在开发板的串口终端执行:
1 | mkdir /home |
当所需的文件都存在以后就可以使用 adduser 创建名为“sshd”的用户了,创建 sshd 用户的时候需要设置密码,一定要记得这个密码,这里我设置简单一点,为“123456”,创建过程如图 :
3.3.2 在开发板上生成秘钥文件
一切准备好以后我们还需要在开发板中生成秘钥文件,使用我们上面移植 openssh 所编译出来的 ssh-keygen 软件即可。从串口终端进入到开发板的 /usr/local/etc 目录下,输入如下所示命令生成秘钥文件,由于 IMX6ULL 性能比较差,有些秘钥文件生成过程可以会有点耗时,打开几十秒:
1 | cd /usr/local/etc |
完成以后就会在/usr/local/etc 目录下产生 8 个以“ssh_host_”开头的秘钥文件,如图 :
4. 启动openssh
openssh 移植已经移植到了开发板中,我们可以通过 sshd 软件在开发板上搭建 openssh 服务器,然后在其他的主机上通过 ssh 来登录开发板。我们可以同样使用 scp 命令来向开发板传输文件。首先要在开发板上启动 ssh 服务, sshd 软件用于启动 ssh 服务,注意要输入全路径!输入如下命令:
1 | /sbin/sshd # 启动 sshd 服务 |
也可以在 /etc/init.d/rcS 文件中加入如下命令,实现 ssh 服务开机自启动:
1 | /sbin/sshd & |
然后启动的时候好像就报错了:
好像是权限问题,可以这样处理:
1 | mkdir -p /var/empty/sshd # 没有这个目录可以直接创建 |
可以使用下边的命令查看一下 /var/empty/sshd 目录情况:
1 | ls -ld /var |
三、ssh登录使用
启动以后我们就可以使用 XobaXterm、 SecureCRT 等终端软件通过 SSH 服务登录开发板,我们先看一下开发板的ip地址:
1 | ifconfig |
1. MobaXterm登录开发板
我们使用MobaXterm来连接一下试试:
配置完成以后点击“OK”按钮,此时就会打开 ssh 会话框 ,输入 sshd 用户密码:
可能会弹出是否保存密码对话框,选择保存即可。如果密码正确的话就会登录到开发板上
登陆成功的哈如下图所示:
2. ubuntu登录开发板
同样的,我们也可以在 ubuntu 下通过 ssh 命令登录开发板,输入如下命令:
1 | ssh sshd@192.168.10.102 |
然后会让输入密码,密码正确就也可以登录开发板啦,前提是ubuntu和开发板在同一网段,可以ping通。
输入“exit”命令即可退出 SSH 会话
3. scp命令拷贝文件
如果我们要向开发板发送一个文件,我们可以通过 TF 卡或者 U 盘来中转,或者通过 tftp 来发送。我们移植 openssh 的时候也编译出来了一个名为“scp”的命令,所以我们可以在开发板中使用 scp 命令向其他主机发送文件,同样的其他主机也可以使用 scp 命令向开发板发送文件。比如我们要把 ubuntu 中的一个文件发送到开发板中,输入如下命令即可:
1 | scp local_file remote_username@remote_ip:remote_folder |
例如:
1 | 在ubuntu中执行 |
然后我们看一下开发板对应的目录是否已经有这个文件了(下图是在串口终端看的)