OpenHarmony 移植 OpenSSH/sshd

文章目录

概述

本指南介绍如何在 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 移植关键点:

  1. 静态链接:使用 musl 工具链,所有依赖静态编译,避免 OHOS 缺少动态库
  2. UID 检查 :通过 -DNO_UID_RESTORATION_TEST 禁用 OpenSSH 的严格权限检查
  3. 配置路径 :使用 /etc/ssh/ 作为标准配置文件路径
  4. 禁用 PAM :musl 不支持 PAM,必须 --without-pam
  5. 权限分离 :OHOS 不支持标准权限分离,使用 UsePrivilegeSeparation no
相关推荐
慕诗客2 小时前
英伟达Jetson Agx Orin更换开机Logo
linux
yy_xzz2 小时前
【Linux开发】01多线程编程:线程的创建与运行
linux·运维·服务器
我爱学习好爱好爱2 小时前
Ansible include任务复用 tags ignore_errors
linux·运维·ansible
YMWM_2 小时前
【问题修复】ubuntu24.04打不开windows的D盘
linux
淼淼爱喝水2 小时前
Ansible Ad-Hoc 命令基础实战(Linux 系统)
linux·服务器·数据库
yy_xzz2 小时前
【Linux开发】04Linux 线程的销毁
linux
HenryLiuu2 小时前
Ubuntu 20.04, cuda 12.1版本安装flash attention 2教程
linux·ubuntu
Boop_wu10 小时前
[Java 算法] 字符串
linux·运维·服务器·数据结构·算法·leetcode
SkyXZ~12 小时前
Jetson有Jtop,Linux有Htop,RDK也有Dtop!
linux·运维·服务器·rdkx5·rdks100·dtop