文章目录
-
- 概述
- 环境信息
- 准备工作
- [第一步:编译 zlib 压缩库](#第一步:编译 zlib 压缩库)
- [第二步:编译 OpenSSL 加密库](#第二步:编译 OpenSSL 加密库)
- [第三步:编译 OpenSSH](#第三步:编译 OpenSSH)
- [第四步:部署到 OHOS 设备](#第四步:部署到 OHOS 设备)
-
- [1. 复制二进制文件](#1. 复制二进制文件)
- [2. 创建配置目录](#2. 创建配置目录)
- [3. 创建 sshd_config 配置文件](#3. 创建 sshd_config 配置文件)
- [4. 生成主机密钥](#4. 生成主机密钥)
- [5. 启动 sshd 服务](#5. 启动 sshd 服务)
- [6. 测试 SSH 连接](#6. 测试 SSH 连接)
- 常见问题与解决方案
-
- [Q1: zlib 下载失败(404 Not Found)](#Q1: zlib 下载失败(404 Not Found))
- [Q2: 执行权限被拒绝](#Q2: 执行权限被拒绝)
- [Q3: permanently_set_uid 错误](#Q3: permanently_set_uid 错误)
- [Q4: 无法加载主机密钥](#Q4: 无法加载主机密钥)
- [Q5: IPv6 不支持](#Q5: IPv6 不支持)
- 一键编译脚本
- 总结
概述
本指南介绍如何在 OpenHarmony(OHOS)系统上移植 OpenSSH/sshd,使用 musl 工具链进行交叉编译,适用于 RK3506 等 ARM 嵌入式设备。
环境信息
- 目标系统: OpenHarmony (OHOS)
- 目标设备: RK3506 (ARM 32位)
- 工具链: arm-linux-musleabi-gcc (GCC 9.4.0)
- 编译方式: 静态链接,无动态库依赖
准备工作
目录结构规划
~/rk3506/module/
├── install/ # 依赖库安装目录 (zlib, openssl)
├── output/ # 最终二进制文件输出
├── zlib-1.3.1/ # zlib 源码目录
├── openssl-3.0.13/ # OpenSSL 源码目录
└── openssh-9.7p1/ # OpenSSH 源码目录
创建目录
bash
mkdir -p ~/rk3506/module
mkdir -p ~/rk3506/module/install
mkdir -p ~/rk3506/module/output
cd ~/rk3506/module
第一步:编译 zlib 压缩库
zlib 是 OpenSSH 的依赖库,提供数据压缩功能。
下载源码
bash
cd ~/rk3506/module
# 从 GitHub 下载(官网可能失效)
wget https://github.com/madler/zlib/releases/download/v1.3.1/zlib-1.3.1.tar.gz
# 解压
tar -xzf zlib-1.3.1.tar.gz
cd zlib-1.3.1
配置编译参数
bash
CC=arm-linux-musleabi-gcc \
AR=arm-linux-musleabi-ar \
RANLIB=arm-linux-musleabi-ranlib \
LD=arm-linux-musleabi-ld \
./configure --prefix=$PWD/../install --static
编译安装
bash
make -j$(nproc)
make install
cd ..
验证安装:
bash
ls ~/rk3506/module/install/lib/libz.a
第二步:编译 OpenSSL 加密库
OpenSSL 提供 SSH 协议所需的加密功能。
下载源码
bash
cd ~/rk3506/module
wget https://www.openssl.org/source/openssl-3.0.13.tar.gz
tar -xzf openssl-3.0.13.tar.gz
cd openssl-3.0.13
配置编译参数
bash
./Configure linux-armv4 \
--prefix=$PWD/../install \
--cross-compile-prefix=arm-linux-musleabi- \
no-shared no-dso no-asm no-tests \
-static \
-DOPENSSL_NO_SECURE_MEMORY
参数说明:
linux-armv4: 32位 ARM 架构目标no-shared: 不编译动态库no-dso: 禁用动态共享对象no-asm: 禁用汇编代码(避免兼容性问题)-static: 静态链接
编译安装
bash
make -j$(nproc)
make install_sw
cd ..
验证安装:
bash
ls ~/rk3506/module/install/lib/libssl.a
ls ~/rk3506/module/install/lib/libcrypto.a
第三步:编译 OpenSSH
OHOS 系统特殊问题
在 OpenHarmony 系统上运行 OpenSSH 9.7 会遇到权限检查问题:
permanently_set_uid: was able to restore old [e]gid
原因 :OpenSSH 9.7 的 uidswap.c 会进行严格的 UID/GID 恢复测试,在 OHOS 的权限模型下会失败。
解决方案 :编译时定义 NO_UID_RESTORATION_TEST 宏跳过该检查。
下载源码
bash
cd ~/rk3506/module
wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.7p1.tar.gz
tar -xzf openssh-9.7p1.tar.gz
cd openssh-9.7p1
配置编译参数
CC=arm-linux-musleabi-gcc \
CFLAGS="-static -I$PWD/../install/include -DNO_UID_RESTORATION_TEST" \
LDFLAGS="-static -L$PWD/../install/lib" \
./configure \
--host=arm-linux-musleabi \
--prefix=/usr \
--sysconfdir=/etc/ssh \
--with-zlib=$PWD/../install \
--with-ssl-dir=$PWD/../install \
--without-pam \
--disable-strip
OHOS 关键参数说明:
| 参数 | 说明 |
|---|---|
-DNO_UID_RESTORATION_TEST |
关键:禁用 UID 恢复测试,解决 OHOS 权限问题 |
--sysconfdir=/etc/ssh |
配置文件路径,符合 OHOS 标准 |
--without-pam |
禁用 PAM(musl 不支持 PAM) |
--with-privsep-path=/var/empty |
权限分离目录 |
--disable-wtmp / --disable-lastlog |
禁用日志功能(OHOS 可能不支持) |
编译
bash
make -j$(nproc)
复制输出文件
bash
cp sshd ssh scp sftp sftp-server ssh-keygen ssh-keyscan ~/rk3506/module/output/
cd ..
验证编译结果
bash
cd ~/rk3506/module/output
file sshd
期望输出:
sshd: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV),
statically linked, with debug_info, not stripped
确认以下几点:
- ✅
32-bit LSB executable, ARM- ARM 32位架构 - ✅
statically linked- 静态链接,无动态库依赖 - ✅
EABI5- 标准 ARM 嵌入式 ABI
第四步:部署到 OHOS 设备
1. 复制二进制文件
bash
# 通过 ADB 推送到设备
adb push ~/rk3506/module/output/sshd /bin/
adb push ~/rk3506/module/output/ssh-keygen /bin/
adb push ~/rk3506/module/output/ssh /bin/
# 添加执行权限
adb shell chmod 755 /bin/sshd /bin/ssh-keygen /bin/ssh
2. 创建配置目录
在 OHOS 设备上执行:
bash
# 创建 SSH 配置目录
mkdir -p /etc/ssh
mkdir -p /var/empty
3. 创建 sshd_config 配置文件
4. 生成主机密钥
bash
cd /etc/ssh
# 生成 RSA 主机密钥(4096位)
ssh-keygen -t rsa -b 4096 -f ssh_host_rsa_key -N ""
# 生成 Ed25519 主机密钥(更安全、更快)
ssh-keygen -t ed25519 -f ssh_host_host_ed25519_key -N ""
# 查看生成的密钥
ls -la ssh_host_*
5. 启动 sshd 服务
调试模式(前台运行,查看日志):
bash
/bin/sshd -D -d
正常输出应包含:
Server listening on 0.0.0.0 port 22.
后台运行:
bash
/bin/sshd
检查运行状态:
bash
ps | grep sshd
netstat -tlnp | grep 22
6. 测试 SSH 连接
从 PC 端连接 OHOS 设备:
bash
ssh root@192.168.3.100
常见问题与解决方案
Q1: zlib 下载失败(404 Not Found)
问题:
ERROR 404: Not Found.
解决: 使用 GitHub 镜像源
bash
wget https://github.com/madler/zlib/releases/download/v1.3.1/zlib-1.3.1.tar.gz
Q2: 执行权限被拒绝
问题:
/bin/sh: /bin/sshd: can't execute: Permission denied
bash
chmod 755 /bin/sshd
Q3: permanently_set_uid 错误
问题:
permanently_set_uid: was able to restore old [e]gid
解决: 重新编译 OpenSSH,添加 -DNO_UID_RESTORATION_TEST 编译选项
Q4: 无法加载主机密钥
问题:
Unable to load host key: /etc/ssh/ssh_host_rsa_key
解决: 使用 ssh-keygen -A 生成所有类型的主机密钥,或手动生成:
bash
ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N ""
Q5: IPv6 不支持
问题:
socket: Address family not supported by protocol
解决: 在 sshd_config 中指定 AddressFamily inet 强制使用 IPv4
一键编译脚本
保存为 build-ohos-sshd.sh:
bash
chmod +x build-ohos-sshd.sh
./build-ohos-sshd.sh
总结
| 组件 | 版本 | OHOS 特殊配置 |
|---|---|---|
| zlib | 1.3.1 | 静态编译 |
| OpenSSL | 3.0.13 | linux-armv4, no-asm, 静态链接 |
| OpenSSH | 9.7p1 | -DNO_UID_RESTORATION_TEST, 禁用 PAM |
OHOS 移植关键点:
- 静态链接:使用 musl 工具链,所有依赖静态编译,避免 OHOS 缺少动态库
- UID 检查 :通过
-DNO_UID_RESTORATION_TEST禁用 OpenSSH 的严格权限检查 - 配置路径 :使用
/etc/ssh/作为标准配置文件路径 - 禁用 PAM :musl 不支持 PAM,必须
--without-pam - 权限分离 :OHOS 不支持标准权限分离,使用
UsePrivilegeSeparation no