【MindStudio】【OpenSSH】海思SOC环境准备(linux + android)

举报
Hisilicon_npu_helper 发表于 2021/01/12 21:09:00 2021/01/12
【摘要】 1       背景当前MindStudio及配套ADK需要从ADX切换到SSH,MindStudio需要通过SSH登录对应的AI-Host。对于C7x、MDC、DC环境,可以通过系统包管理器apt/yum等直接安装openssh-server;而海思Soc Linux/Android环境是精简过的嵌入式环境,必须通过源码编译的方式进行安装。此处以CS形态为例。2       Linux环境...


1       背景

当前MindStudio及配套ADK需要从ADX切换到SSHMindStudio需要通过SSH登录对应的AI-Host。对于C7xMDCDC环境,可以通过系统包管理器apt/yum等直接安装openssh-server;而海思Soc Linux/Android环境是精简过的嵌入式环境,必须通过源码编译的方式进行安装。此处以CS形态为例。

2       Linux环境OpenSSH服务搭建

2.1       交叉编译

2.1.1       版本选择及源码准备

OpenSSH下载地址:

https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-8.0p1.tar.gz

OpenSSH依赖2个开源库:zlibOpenSSL

zlib 1.2.11:  https://zlib.net/zlib1211.zip

OpenSSL 1.1.1g:  https://www.openssl.org/source/openssl-1.1.1g.tar.gz

同样下载源码压缩包至本地。

2.1.2       交叉编译环境准备

获取发布包中的对应交叉编译器CS形态使用的交叉编译器为aarch64-himix210-linux。交叉编译环境这里以x86_64Ubuntu18.04为例。

1

tar xvf aarch64-himix210-linux.tgz

进入解压后的目录,并使用root用户权限执行安装脚本(可以参考readme指定其他安装路径)

1

cd aarch64-himix210-linux

2

sudo ./aarch64-himix210-linux.install

此时交叉编译器已被安装至/opt/hisi-linux/x86-arm路径下,所需的环境变量也已自动更新到/etc/profile中。执行以下命令应该能正常显示gcc版本:

1

source /etc/profile && aarch64-himix210-linux-gcc -v

 

 


2.1.3       交叉编译

zlib

解压zlib的源码压缩包,并进入解压后的目录。

1

tar xf zlib-1.2.11.tar.gz

2

cd zlib-1.2.11/

配置交叉编译器及安装路径:

1

CC=aarch64-himix210-linux-gcc ./configure --prefix=$HOME/install/zlib

编译及安装:

1

make -j

2

make install

openssl

解压openssl的源码压缩包,并进入解压后的目录。

1

tar xf openssl-1.1.1g.tar.gz

2

cd openssl-1.1.1g

配置编译选项、交叉编译器及安装路径:

1

./config no-asm shared --cross-compile-prefix=aarch64-himix210-linux- --prefix=$HOME/install/openssl

将生成的Makefile中的所有"-m64"修改为"-mabi=lp64"

编译及安装:

1

make -j # 注:make -j并行编译可能会失败,若失败可直接make

2

make install

解压openssh的源码压缩包,并进入:

1

tar xf openssh-8.0p1.tar.gz

2

cd openssh-8.0p1

配置:

1

./configure --host=aarch64-linux --with-libs --with-zlib=$HOME/install/zlib --with-ssl-dir=$HOME/install/openssl CC=aarch64-himix210-linux-gcc AR=aarch64-himix210-linux-ar --prefix=$HOME/install/openssh --exec-prefix=$HOME/install/openssh --disable-etc-default-login --disable-strip

编译及安装:

1

make -j

2

make install

openssh

解压openssh的源码压缩包,并进入:

1

tar xf openssh-8.0p1.tar.gz

2

cd openssh-8.0p1

配置:

1

./configure --host=aarch64-linux --with-libs --with-zlib=$HOME/install/zlib --with-ssl-dir=$HOME/install/openssl CC=aarch64-himix210-linux-gcc AR=aarch64-himix210-linux-ar --prefix=$HOME/install/openssh --exec-prefix=$HOME/install/openssh --disable-etc-default-login --disable-strip

编译及安装:

1

make -j

2

make install

install时若提示无权限创建/var/emptyprivilege separation directory),则可以使用sudo创建后再使用chown改变owner

再次执行make install,此时若提示ssh-keygen执行失败,这是由于arm架构的可执行文件不识别,可暂时忽略,因为所需的文件(sshd, sftp-server, ssh-keygen等)都已安装至目标路径。



2.2       部署

参考MindStudio文档中的海思Soc环境准备一节。在刚才的交叉编译服务器上安装NFS服务,将刚才的安装路径($HOME/install)开放出去。

使用root账号,通过telnet登录海思Soc环境,在海思Soc的板端挂载该远程路径。


切换至挂载目录,部署zlibopenssl相关产物:

1

cp zlib/lib/libz.so.1 /usr/lib

2

cp openssl/lib/libcrypto.so.1.1 /usr/lib

切换至OpenSSH安装路径,OpenSSH相关产物如下:


部署所需的可执行文件:

1
cp sbin/sshd /usr/sbin
2
cp bin/ssh-keygen /usr/bin
3
cp libexec/sftp-server /usr/lib


使用ssh-keygen生成秘钥对:

1
mkdir /etc/ssh
2
ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key

参考该链接创建sshd组

在/etc/passwd中加上:

sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

在/etc/group中加上:

sshd:x:74:

创建privilege separation directory:

1
mkdir /var/empty

拷贝config至/etc并修改:

1
cp etc/sshd_config /etc/


修改点1:将拷贝后的文件中的

#PermitRootLogin prohibit-password

改为

PermitRootLogin yes

使得可以使用root账号的账号密码登录。

修改点2:在subsystem条目配置正确的sftp-server路径:

Subsystem       sftp    /usr/lib/sftp-server

修改完成后启动sshd,需指定config和key的路径:

1
sshd -f /etc/sshd_config -h /etc/ssh/ssh_host_rsa_key


2.3  验证

在其他主机上使用ssh远程登录海思Soc板端执行命令或使用sftp访问文件:


 

3       Android环境OpenSSH服务搭建(V900版本/96CV300版本)

3.1     下载V900/96CV300源码

3.2     修改device.mk文件

           v900文件路径:device/huanglong/shaolingun/device.mk

           96CV300文件路径:device/huanglong/wudangstick/device.mk

           在device.mk中增加如下编译选项:  

           # Openssh
           PRODUCT_PACKAGES += \
                scp \
                sftp \
                ssh \
                sshd \
                sshd_config \
               ssh-keygen \
               start-ssh

3.3     修改externel/openssh下的Android.mk文件

           在sshd模块的编译选项中,添加:

           LOCAL_CFLAGS += -DSSHDIR=\"/data/run/ssh\"

3.4     编译andorid源码,重新烧写镜像,

  1. v900编译指令  

          a) source build/envsetup.sh
          b) lunch shaolingun_SEC-eng
          c) ./device/huanglong/build/build.sh

     2. 96cv300编译指令 

        a) source build/envsetup.sh
        b) lunch wudangstick_SEC-eng

        c) ./device/huanglong/build/build.sh

3.5     创建目录结构,以下操作都在板端进行

mkdir -p /data/ssh/empty
chmod 700 /data/ssh
chmod 700 /data/ssh/empty

其中, /data/ssh用来存放密钥文件和sshd配置文件

3.6   生成配置文件

cat /system/etc/ssh/sshd_config | \
    sed 's/#PermitRootLogin yes$/PermitRootLogin without-password/' | \
    sed 's/#RSAAuthentication yes/RSAAuthentication yes/' | \
    sed 's/#PubkeyAuthentication yes/PubkeyAuthentication yes/' | \
    sed 's/PasswordAuthentication no/#PasswordAuthentication no/' | \
    sed 's/#PermitEmptyPasswords no/PermitEmptyPasswords yes/' | \
    sed 's/#ChallengeResponseAuthentication yes/ChallengeResponseAuthentication yes/' | \
    sed 's/#UsePrivilegeSeparation yes/UsePrivilegeSeparation no/' | \
    sed 's;/usr/libexec/sftp-server;internal-sftp;' > \
    /data/ssh/sshd_config
chmod 600 /data/ssh/sshd_config

这里需要说明的是我们需要配置为root使用, 同时又不需要密码.另外, 需要注意配置文件中指定了AuthorizedKeysFile/data/ssh/authorized_keys

3.7      生成秘钥

Windows/Linux上通过下面的命令来生成密钥

ssh-keygen -t rsa -C "your_email_address"

上面的命令会在主目录下生成.ssh目录, 目录包含id_rsa(私钥)id_rsa.pub(公钥)两个文件

然后通过adb等命令将id_rsa.pub上传至Android(!!!文件要对应于AuthorizedKeysFile!!!)

adb push id_rsa.pub /data/ssh/authorized_keys
chmod 600 /data/ssh/authorized_keys
chown root:root /data/ssh/authorized_keys

cd   /data/ssh/

ssh-keygen  -t rsa  -f  ssh_host_rsa_key 

ssh-keygen  -t dsa  -f  ssh_host_dsa_key

这里passphrase默认为空

3.8       启动

mkdir -p /data/local/userinit.d
cat /system/bin/start-ssh | \
    sed 's;/system/etc/ssh/sshd_config;/data/ssh/sshd_config;' > \
    /data/local/userinit.d/99sshd
chmod 755 /data/local/userinit.d/99sshd

通过上面的命令单独生成一个启动脚本,后就可以通过执行下面的脚本来启动sshd

/data/local/userinit.d/99sshd

实际操作过程中如果出现问题也可以通过下面的命令以调试的方式来启动sshd

/system/bin/sshd -f /data/ssh/sshd_config -D -ddd

执行的时候第一次会报/data/run/ssh/empty不存在的问题,创建该文件夹并修改权限即可。

mkdir -p /data/run/ssh/empty

chmod 600 /data/run/ssh/empty

chown root:root /data/run/ssh/empty

备注:/system/bin/sshd -f /data/ssh/sshd_config -D -ddd 这个是调试命令,client端连接上后就断开。如果想服务持续运行,把后面的 -D -ddd删除,或者直接运行启动脚本

 

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。