想要使用 scp 方便地通过网络下载文件到开发板,想要通过 ssh 网络登录到开发板,就需要编译和部署 openssh,但是 busybox 默认是不带 openssh 的,这时候就需要我们手动编译了。
试验环境:
- Board: iTOP-4412 POP 1G Elite(精英板)
- Compiler: arm-linux-gnueabi-gcc version 4.4.1 (Sourcery G++ Lite 2009q3-67)
- Kernel: linux-3.0.15
- Root FS: busybox-1.22.1
编译版本:
- zlib-1.2.8(dep)
- openssl-1.1.0l(dep)
- openssh-9.3p1
默认已将交叉工具编译链在环境变量中配好。
zlib
1 | mkdir output/zlib # mkdir output first |
(此步骤非部署 openssh 的必要操作)因为 zlib 是很多软件的依赖,所以把它放到编译器的默认文件夹也是一个省事的做法。
1 | tree output/zlib/ |
openssl
1 | mkdir output/openssl # mkdir output first |
- --cross-compile-prefix:编译器前缀。如果此时环境变量中存在正确的 CC 配置(在编译 zlib 时配置的),则不要再设置此项,会产生叠加而导致此项设置有误,或者如使用上述命令先清除 CC 配置。
- --prefix:安装地址,需要使用绝对路径。
openssh
依赖于 zlib、openssl。
编译:
1 | mkdir output/openssh # mkdir output first |
- CC:编译器。
- --host:目标板的设备属性。
- --prefix:目标安装地址。scp 传输文件时,默认使用
$(prefix)/bin/ssh
来传输文件,因为使用的是 busybox,所以此处置空。不指定时,默认为/usr/local
。 - --with-zlib:zlib 的安装地址。
- --with-ssl-dir:ssl 的安装地址,同 openssl 的安装地址。
- DESTDIR:install 导出文件的位置。
- STRIP_OPT:
strip
程序用于从二进制文件(如可执行文件、库文件等)中移除不必要的信息。这些信息通常包括符号、重定位表和其他调试信息。处理后的程序可以显著减少二进制文件的大小、略微提高程序的启动速度、增大逆向难度。总结:在软件调试过程中,保留信息有利于定位问题;在嵌入式程序发布中,建议进行 strip 处理。如不要进行 strip 处理,不填此项即可
自动编译脚本
和压缩包放置在同一目录下:
1 | . |
build_ssh.sh:
1 |
|
自动清理脚本:
1 | # Makefile |
部署
部署 scp
1 | cp -ru output/zlib/lib/libz.* ../rootfs_patch/lib/ |
../rootfs_patch 相当于根文件夹,对应放入到开发板的 / 目录下,即完成部署。
1 | mkdir ~/.ssh |
部署 sshd
编辑 /etc/passwd,增加一行:sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
。否则报错:Privilege separation user sshd does not exist。
修改 sshd_config:
1 | HostKey /etc/ssh/ssh_host_rsa_key |
否则无法使用 root 账户登录。
生成 HostKey:
1 | ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N "" |
否则会提示:sshd: no hostkeys available — exiting
设置 root 密码:
1 | passwd root |
启动 sshd:
1 | /sbin/sshd |
登录测试:
使用另外一台可以使用 ssh 的电脑,或者使用 XShell 等 ssh 工具连接。
1 | ssh root@192.168.0.200 |