前言
在上一篇文章 itop4412 linux驱动学习环境搭建-最小根文件系统制作与NFS挂载 中,搭建了学习驱动的环境,本文续接上篇文章,进行openssh的移植,使得以后可以远程通过ssh连接开发板,也能通过sftp上传下载文件。
编译环境
前言中的上一篇文章相同,采用ubuntu18.04 LTS + gcc-arm-linux-gnueabihf(默认7.4.0)。
源码下载
openssh依赖于zlib和openssl库,本文采用目前最新stable分支进行移植,下载如下三个源码文件:
- zlib-1.2.11.tar.gz
- openssl-1.1.1c.tar.gz
- openssh-8.0p1.tar.gz
构建
对于zlib库和openssl库都可以指定install目录,这里在构建前先创建好该目录。笔者这里目录为: /home/jason/arm-devlop/ssh/install,在ssh目录下为源码所在目录,效果如下:
jason@jason-vm:~/arm-devlop/ssh$ ls
install openssh-8.0p1 openssl-1.1.1c.tar.gz
openssh-7.8p1.tar.gz openssh-8.0p1.tar.gz zlib-1.2.11
openssh-7.9p1.tar.gz openssl-1.1.1c zlib-1.2.11.tar.gz
jason@jason-vm:~/arm-devlop/ssh$
移植zlib
- 执行编译脚本build.sh
这里直接贴出笔者总结的配置脚本,如下:
jason@jason-vm:~/arm-devlop/ssh/zlib-1.2.11$ cat build.sh
#########################################################################
# File Name: build.sh
# Author: jason416
# mail: [email protected]
# Created Time: 2019年07月14日 星期日 14时32分37秒
# License: GPL v2
#########################################################################
#!/bin/bash
export CC=arm-linux-gnueabihf-gcc
export AR=arm-linux-gnueabihf-ar
export LD=arm-linux-gnueabihf-ld
export ANLIB=arm-linux-gnueabihf-ranlib
INSTALL=/home/jason/arm-devlop/ssh/install/zlib-1.2.11
./configure --prefix=$INSTALL
echo "------------------------"
echo "end of configure"
echo "------------------------"
if [ -e Makefile ]; then
make && make install
fi
jason@jason-vm:~/arm-devlop/ssh/zlib-1.2.11$
- 构建后文件目录
在完成install操作后,会将生成的目标文件按Makefile里的相应规则,拷贝到install目录下,目录如下:
jason@jason-vm:~/arm-devlop/ssh/install/zlib-1.2.11$ tree
.
├── include
│ ├── zconf.h
│ └── zlib.h
├── lib
│ ├── libz.a
│ ├── libz.so -> libz.so.1.2.11
│ ├── libz.so.1 -> libz.so.1.2.11
│ ├── libz.so.1.2.11
│ └── pkgconfig
│ └── zlib.pc
└── share
└── man
└── man3
└── zlib.3
6 directories, 8 files
jason@jason-vm:~/arm-devlop/ssh/install/zlib-1.2.11$
移植openssl
- 执行编译脚本build.sh
这里直接贴出笔者总结的配置脚本,如下:
jason@jason-vm:~/arm-devlop/ssh/openssl-1.1.1c$ cat build.sh
#########################################################################
# File Name: build.sh
# Author: jason416
# mail: [email protected]
# Created Time: 2019年07月14日 星期日 14时32分37秒
# License: GPL v2
#########################################################################
#!/bin/bash
INSTALL=/home/jason/arm-devlop/ssh/install
./Configure --prefix=$INSTALL/openssl-1.1.1c linux-armv4 --cross-compile-prefix=arm-linux-gnueabihf- --release --with-zlib-include=/home/jason/arm-devlop/ssh/install/zlib-1.2.11/include --with-zlib-lib=/home/jason/arm-devlop/ssh/install/zlib-1.2.11/lib zlib-dynamic zlib
echo "------------------------"
echo "end of configure"
echo "------------------------"
if [ -e Makefile ]; then
make && make install
fi
jason@jason-vm:~/arm-devlop/ssh/openssl-1.1.1c$
- 构建后文件目录
在完成install操作后,会将生成的目标文件按Makefile里的相应规则,拷贝到install目录下,目录如下:
jason@jason-vm:~/arm-devlop/ssh/install/openssl-1.1.1c$ tree -L 2
.
├── bin
│ ├── c_rehash
│ └── openssl
├── include
│ └── openssl
├── lib
│ ├── engines-1.1
│ ├── libcrypto.a
│ ├── libcrypto.so -> libcrypto.so.1.1
│ ├── libcrypto.so.1.1
│ ├── libssl.a
│ ├── libssl.so -> libssl.so.1.1
│ ├── libssl.so.1.1
│ └── pkgconfig
├── share
│ ├── doc
│ └── man
└── ssl
├── certs
├── ct_log_list.cnf
├── ct_log_list.cnf.dist
├── misc
├── openssl.cnf
├── openssl.cnf.dist
└── private
13 directories, 12 files
jason@jason-vm:~/arm-devlop/ssh/install/openssl-1.1.1c$
openssh移植
构建
- 执行编译脚本build.sh
这里直接贴出笔者总结的配置脚本,如下:
jason@jason-vm:~/arm-devlop/ssh/openssh-8.0p1$ cat build.sh
#########################################################################
# File Name: build.sh
# Author: jason416
# mail: [email protected]
# Created Time: 2019年07月14日 星期日 14时32分37秒
# License: GPL v2
#########################################################################
#!/bin/bash
export CC=arm-linux-gnueabihf-gcc
export AR=arm-linux-gnueabihf-ar
export LD=arm-linux-gnueabihf-ld
export ANLIB=arm-linux-gnueabihf-ranlib
./configure --host=arm-linux-gnueabihf --with-libs --with-zlib=$INSTALL/zlib-1.2.11 --with-ssl-dir=$INSTALL/openssl-1.1.1c --disable-etc-default-login --with-md5-passwords HOST_OS=linux --with-ssl-engine --with-openssl LIBS="-lpthread"
echo "------------------------"
echo "end of configure"
echo "------------------------"
if [ -e Makefile ]; then
make
fi
jason@jason-vm:~/arm-devlop/ssh/openssh-8.0p1$
- 说明
针对openssh构建后,不需要执行make install操作,因为其生成的文件需要手动按照configure后的打印信息(如下)所指定目录放置。在成功构建后会打印一下信息:
OpenSSH has been configured with the following options:
User binaries: /usr/local/bin
System binaries: /usr/local/sbin
Configuration files: /usr/local/etc
Askpass program: /usr/local/libexec/ssh-askpass
Manual pages: /usr/local/share/man/manX
PID file: /var/run
Privilege separation chroot path: /var/empty
sshd default user PATH: /usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin
...
配置
- 拷贝构建的openssh相关文件
jason@jason-vm:~/arm-devlop/ssh/openssh-8.0p1$ mkdir -p ~/rootfs/usr/libexec ~/rootfs/usr/local/etc ~/rootfs/usr/local/bin ~/rootfs/usr/local/sbin
jason@jason-vm:~/arm-devlop/ssh/openssh-8.0p1$ cp scp sftp ssh sshd ssh-add ssh-agent ssh-keygen ssh-keyscan ~/rootfs/usr/local/bin/
jason@jason-vm:~/arm-devlop/ssh/openssh-8.0p1$ cp sshd ~/rootfs/usr/local/sbin/
jason@jason-vm:~/arm-devlop/ssh/openssh-8.0p1$ cp moduli ssh_config sshd_config ~/rootfs/usr/local/etc/
jason@jason-vm:~/arm-devlop/ssh/openssh-8.0p1$ cp sftp-server ssh-keysign ~/rootfs/usr/libexec/
- 拷贝前面构建的zlib和openssl库
jason@jason-vm:~/arm-devlop/ssh/openssh-8.0p1$ cp ../install/zlib-1.2.11/lib/libz.so* ~/rootfs/lib/ -a
jason@jason-vm:~/arm-devlop/ssh/openssh-8.0p1$ cp ../install/openssl-1.1.1c/lib/libcrypto.so* ~/rootfs/lib -a
jason@jason-vm:~/arm-devlop/ssh/openssh-8.0p1$ cp ../install/openssl-1.1.1c/lib/libssl.so* ~/rootfs/lib -a
注:~/rootfs为开发板挂载的最小根文件系统的
/
(根目录),-a参数必须指定,否则软链接在拷贝后会失效。
- 生成开发板sshd运行所需私钥文件
在串口终端中输入以下命令,生成秘钥和公钥文件,并设置私钥文件权限为0600(八进制,rw-------)。
[root@iTOP-4412]# mkdir -p /etc/ssh && cd /etc/ssh/
[root@iTOP-4412]# ssh-keygen -t rsa -f ssh_host_rsa_key -N ""
[root@iTOP-4412]# ssh-keygen -t dsa -f ssh_host_dsa_key -N ""
[root@iTOP-4412]# ssh-keygen -t ecdsa -f ssh_host_ecdsa_key -N ""
[root@iTOP-4412]# ssh-keygen -t ed25519 -f ssh_host_ed25519_key -N ""
[root@iTOP-4412]# ls /etc/ssh/
ssh_host_dsa_key ssh_host_ecdsa_key.pub ssh_host_rsa_key
ssh_host_dsa_key.pub ssh_host_ed25519_key ssh_host_rsa_key.pub
ssh_host_ecdsa_key ssh_host_ed25519_key.pub
[root@iTOP-4412]# chmod 0600 ssh_host_ed25519_key ssh_host_rsa_key ssh_host_rsa_key ssh_host_dsa_key
- 其他文件修改
- 修改用户组文件/etc/passwd,添加如下内容:
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
- 修改sshd配置文件
修改sshd_config文件为如下所示,其他内容可根据自己需要进行修改。
...
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
...
#PermitRootLogin prohibit-password
PermitRootLogin yes
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10
...
- 为root用户添加/修改密码
ssh连接方式有两种,一种是常规的用户名+密码形式,另一种是用ssh-keygen生成的.pub公钥,这里只介绍常规方式。
[root@iTOP-4412]# passwd
Changing password for root
New password:
Bad password: too short
Retype password:
passwd: password for root changed by root
[root@iTOP-4412]#
- 设置sshd为自启动
在/etc/init.d/rcS中最后一行添加如下命令:
/usr/local/sbin/sshd
效果
在成功完成上述配置后,便可以用开发机连接开发板,也可用开发板连接开发机,如下图所示: