美文网首页
海思3515A移植记录

海思3515A移植记录

作者: chenwr2018 | 来源:发表于2019-03-01 19:40 被阅读0次


    海思3515A移植记录


      第一次写博客,暂时就先粗略记录下自己移植lrzsz、samba服务器和ssh服务器的流程,方便日后提供思路快速解决同类问题。

    lrzsz移植步骤

    平台:海思3515A

    系统:Ubuntu12.04

    作用:串口发送接收工具

    移植成功的源码版本

    压缩包存放地址

    a. lrzsz源码下载

    1.lrzsz源码包下载地址:https://ohse.de/uwe/releases/lrzsz-0.12.20.tar.gz
    
    2.http://down1.chinaunix.net/distfiles/lrzsz-0.12.20.tar.gz //两个链接网址都能下载
    

    b. 解压文件

    c. 运行.configure

    输入命令:

    CFLAGS=-O2 CC=arm-hisiv100nptl-linux-gcc ./configure --cache-file=arml_cachefile0 --prefix=/usr/local/
    

      这条命令很关键,避免自己去修改Makefile后出现编译失败的问题。
    (前提是交叉编译器已经安装配置好了)

    参数说明

    1. CFLAGS=-O2 //编译选项
    
    2. CC=arm-linux-gcc //配置编译器为交叉编译器  
    加上CC参数表示即时生效,海思平台中的交叉编译器为arm-hisiv100nptl-linux-gcc
    
    3.  ./configure //配置文件 前面两项必须放在./configure的前面 否则设置无效
    
    --cache-file=arml_cachefile0  //这个命令是生成自己的cache-file  
    
    4. --prefix=/usr/local/ //安装路径
    

    d. make

    当前解压目录的src目录下可以看到目标生成文件lrz lsz

    <font color=red>关键之处在于,CC参数要放在configure之前,并且要制定cache file,才能完全即时识别交叉编译器 </font>

    <font color=red>:CC=arm-linux-gcc ./configure --cache-file=arml_cache_file0(这个名字可以随便取)
    下面一步就是将lrz,lsz两个目标文件拷贝到开发板上的/usr/sbin/目录下 </font>

    发送接收只需要在开发板敲命令
    lrz lsz

    e. lrz传输过程出现错误

    gmentation fault
    传输失败 (换个空间大点的目录就OK了)

    Linux 环境变量的作用

    关于PATH的作用:

    PATH说简单点就是一个字符串变量,当输入命令的时候LINUX会去查找PATH里面记录的路径。
    
    比如在根目录/下可以输入命令ls,在/usr目录下也可以输入ls,但其实ls这个命令根本不在这个两个目录下,  
    事实上当你输入命令的时候LINUX会去/bin,/usr/bin,/sbin等目录下面去找你此时输入的命令,而PATH的值恰恰就是/bin:/sbin:/usr/bin:……。其中的冒号使目录与目录之间隔开。
    
    简单的说,就是敲相应的命令时,会去环境变量设置的路径去寻找可执行文件。
    

    新增与删除环境变量

    1.新增一个命令,该命令可执行文件在/usr/locar/new/bin下面,修改环境变量PATH了。
    
    2.bash命令export PATH=$PATH:/usr/locar/new/bin。使PATH自增:/usr/locar/new/bin,既PATH=PATH+":/usr/locar/new/bin";
    
    3.查看是否添加成功。echo $PATH。
    
    4.删除环境变量。
    新增的路径/usr/locar/new/bin已经没用了的话。
    可修改/root/.bashrc文件里面你新增的路径。
    或者修改/etc/profile文件删除你不需要的路径.
    

    交叉编译工具链应用

    一般来说,配置交叉编译工具链的时候需要指定编译工具的路径,此时就需要设置环境变量。例如我的mips-linux-gcc编译器在“/opt/au1200_rm/build_tools/bin”目录下,build_tools就是我的编译工具,则有如下三种方法来设置环境变量:

    (1)临时环境变量(重启后消失)
    直接用export命令:
    #export PATH=$PATH:/opt/au1200_rm/build_tools/bin
    查看是否已经设好,可用命令export查看:
    

    (2)永久环境变量
    修改profile文件:
    所有用户(不安全)
    修 改/etc/profile(对所有用户都是有效的)
    #vi /etc/profile
    在里面加入:
    export PATH="$PATH:/opt/au1200_rm/build_tools/bin"
    

    修改.bashrc文件
    vi /~/.bashrc
    (单独用户)
    修改~/.bashrc文件。  (每个用户目录下都有,ls -all)
    cd ~
    vi .bashrc
    在里面加入:
    export PATH="$PATH:/opt/au1200_rm/build_tools/bin"
    

      后两种方法一般需要重新注销系统才能生效,最后可以通过echo命令测试一下:
    echo $PATH
    看看输出里面是不是已经有了/my_new_path这个路径了。

    环境变量更改后,在用户下次登陆时生效,如果想立刻生效,则可执行下面的语句:$ source .bash_profile

    参考博客

    linux中PATH环境变量的作用和使用方法

    这篇写的条理更加清晰

    Linux下查看和添加环境变量

    Linux添加环境变量与GCC编译器添加INCLUDE与LIB环境变量

    对所有用户有效在/etc/profile增加以下内容。只对当前用户有效在Home目录下的
    .bashrc或.bash_profile里增加下面的内容:
    (注意:等号前面不要加空格,否则可能出现 command not found)

    在PATH中找到可执行文件程序的路径。
    export PATH =PATH:PATH:HOME/bin

    gcc找到头文件的路径
    C_INCLUDE_PATH=/usr/include/libxml2:/MyLib
    export C_INCLUDE_PATH

    g++找到头文件的路径
    CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/include/libxml2:/MyLib
    export CPLUS_INCLUDE_PATH

    找到动态链接库的路径
    LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/MyLib
    export LD_LIBRARY_PATH

    找到静态库的路径
    LIBRARY_PATH=$LIBRARY_PATH:/MyLib
    export LIBRARY_PATH

    linux各个目录作用

    /bin

    bin是Binary的缩写,这个目录存放着最经常使用的命令。
    

    /boot

    这里存放的是启动Linux时的一些核心文件,包括一些连接文件以及镜像文件。
    

    /dev

    dev是Device的缩写,该目录下存放的是Linux的外部设备,在Linux中访问设备的方式和访问文件的方式是相同的。
    

    /etc

    这个目录用来存放所有的系统管理所需要的配置文件和子目录。
    

    /home

    用户的主目录,在Linux中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的。
    

    /lib

    这个目录里存放着系统最基本的动态连接共享库,起作用类似于Windows的DLL文件。几乎所有的应用程序都需要用到这些共享库。
    

    /lost+found

    这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件。
    

    /media

    Linux系统会自动识别一些设备,例如U盘、光驱等等,当时别后,Linux会把识别的设备挂载到这个目录下。
    

    /mnt

    系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在/mnt/上,然后进入该目录就可以查看光驱里的内容了。
    

    /opt

    这是给主机额外安装软件所摆放的目录。比如你安装一个Oracle数据库就可以放到这个目录下。默认是空的。
    

    /proc

    这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。 
    这个目录的内容不在硬盘上而是在内存里,我们也可以直接修改里面的某些文件,比如可以通过下面的命令来屏蔽主机的ping命令,使别人无法ping你的机器:
    

    /root

    超级管理员的用户主目录
    

    /sbin

    s就是super user的意思,这里存放的是系统管理员使用的系统管理程序。
    

    /selinux

    这个目录是Redhat/CentOS所特有的目录,Selinux是一个安全机制,类似于windows的防火墙,但是这套机制比较复杂,这个目录就是存放selinux相关的文件的。
    

    /srv

    该目录存放一些服务启动之后需要提取的数据。
    

    /sys

    该目录下安装了2.6内核中新出现的一个文件系统sysfs。sysfs文件系统集成了下面3种文件系统的信息:针对进程信息的proc文件系统、针对设备的devfs文件系统以及针对伪终端的devpts文件系统。 
    该文件系统是内核设备树的一个直观反映。当一个内核对象被直接创建的时候。对应的文件和目录也在内核对象子系统中被创建。
    

    /tmp

    该目录用来存放一些临时文件。
    

    /usr

    这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似与windows下的program files目录。
    

    /usr/bin

    系统用户使用的应用程序。
    

    /usr/src

    内核源代码默认的放置目录。
    

    /var

    这个目录中存放着在不断扩充的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。
    

    总结

    在Linux系统中,有几个目录是比较重要的,平时需要注意不要误删除或者随意更改内部文件。

    /etc:上边也提到了,这个是系统中的配置文件,如果你更改了该目录下的某个文件可能会导致系统不能启动。

    /bin, /sbin, /usr/bin, /usr/sbin: 这是系统预设的执行文件的放置目录,比如 ls 就是在/bin/ls 目录下的。

    其中/bin,/usr/bin 是给系统用户使用的指令(除root外的通用户),而/sbin, /usr/sbin 则是给root使用的指令。

    /var: 这是一个非常重要的目录,系统上跑了很多程序,那么每个程序都会有相应的日志产生,而这些日志就被记录到这个目录下,具体在/var/log 目录下,另外mail的预设放置也是在这里。

    samba移植

    环境Ubuntu12.04

    源码:samba-4.4.8.tar.gz

    Samba服务器下载官网:https://www.samba.org/samba/history/

    1.解压后运行configure

    如果出现错误就 sudo apt-get install libgnutls-dev libacl1-dev libldap2-dev
    

    2.configure命令

    ./configure --host=arm-hisiv100nptl-linux-gcc --prefix=/home/cwr/install_dir/

    出现错误

    undefined reference to `_nc_panelhook'

    [3496/3768] Linking default/source3/samba-regedit
    /usr/lib/libpanel.a(p_delete.o): In function `del_panel':
    p_delete.c:(.text+0x4d): undefined reference to `_nc_panelhook'
    p_delete.c:(.text+0x22f): undefined reference to `_nc_panelhook'
    p_delete.c:(.text+0x239): undefined reference to `_nc_panelhook'
    p_delete.c:(.text+0x274): undefined reference to `_nc_panelhook'
    p_delete.c:(.text+0x291): undefined reference to `_nc_panelhook'
    /usr/lib/libpanel.a(p_delete.o):p_delete.c:(.text+0x2a9): more undefined references to `_nc_panelhook' follow
    /usr/lib/libpanel.a(p_move.o): In function `move_panel':
    p_move.c:(.text+0x24f): undefined reference to `mvwin'
    /usr/lib/libpanel.a(p_new.o): In function `new_panel':
    p_new.c:(.text+0x1a): undefined reference to `_nc_panelhook'
    p_new.c:(.text+0x79): undefined reference to `_nc_panelhook'
    p_new.c:(.text+0x85): undefined reference to `_nc_panelhook'
    p_new.c:(.text+0x91): undefined reference to `_nc_panelhook'
    p_new.c:(.text+0xa7): undefined reference to `_nc_panelhook'
    /usr/lib/libpanel.a(p_new.o):p_new.c:(.text+0xb3): more undefined references to `_nc_panelhook' follow
    collect2: ld 返回 1
    Waf: Leaving directory `/home/cwr/tools/samba-4.4.8/bin'
    Build failed:  -> task failed (err #1): 
        {task: cc_link regedit_235.o,regedit_samba3_235.o,regedit_wrap_235.o,regedit_treeview_235.o,regedit_valuelist_235.o,regedit_dialog_235.o,regedit_hexedit_235.o,regedit_list_235.o -> samba-regedit}
    make: *** [all] 错误 1
    

    最后放弃该版本的samba移植,去官网下载早期版本。

    一、准备工作

    1、下载源码包samba-3.2.15.tar.gz
    http://ftp.samba.org/pub/samba/

    2、执行命令

    CC=arm-hisiv100nptl-linux-gcc ./configure samba_cv_CC_NEGATIVE_ENUM_VALUES=yes --host=i686 --target=arm-linux --prefix=/home/cwr/install_dir/

    make

    make install

    成功参看如下博客完成移植
    helper2416_移植samba服务器_欢迎测试

    configure的作用

    ./configure是源代码安装的第一步,

    主要的作用是对即将安装的软件进行配置,检查当前的环境是否满足要安装软件的依赖关系,

    但并不是所有的tar包都是源代码的包,可以ls看看有没有configure这个文件,如果是二进制的包,解压后直接就能使用

    ./configure相关参数

    –help:显示帮助信息并退出  如 ./configure -help (--help 都可以)
    
    –prefix=/home/carl:指定安装位置,如果安装位置不指定,默认路径为/usr/local下的bin、lib等文件夹
    
    –build:就是你正在使用的机器,查看本机使用的可以在configure目录下执行./config.guess
    
    –host:就是你编译好的程序可以运行的机器
    
    –target:就是你编译好的程序可以处理的其他平台
    
    比如你build的机器是x86,想运行的host机器是arm,程序可以处理的程序target是mips
    
    CC:指定编译工具链的名字
    
    CFLAGS:指定头文件(.h文件)的路径,如:CFLAGS=-I/usr/include -I/path/include
    
    LDFLAGS:gcc 等编译器会用到的一些优化参数,也可以在里面指定库文件的位置。用法:LDFLAGS=-L/usr/lib -L/path/to/your/lib
    
    LIBS:告诉链接器要链接哪些库文件,如LIBS = -lpthread -liconv
    


    附上链接

    之前遇到的比较奇特的问题,虽然之后还是没解决,换了早期的samba软件版本,还是记录下吧。

    The Samba-Bugzilla – Bug 6548

    samba-3.3.14 smbpasswd Failed to open account policy database!

    命令行 smbd -i

    creating lame upcase table
    creating lame lowcase table
    smbd version 3.2.15 started.
    Copyright Andrew Tridgell and the Samba Team 1992-2009
    ERROR: Failed to initialise messages database: No such file or directory
    messaging_tdb_init failed: NT_STATUS_OBJECT_NAME_NOT_FOUND
    PANIC (pid 13544): Could not init smbd messaging context
    unable to produce a stack trace on this platform
    unable to change to /home/cwr/install_dir/var/cores/smbd
    refusing to dump core
    

    ssh移植

    参考博客

    通过ssh连接开发板之arm-linux下ssh的安装使用CSDN博客

    zlib、openssl、openssh源码下载

    zlib openssl openssh压缩包存放地址

    解压编译

    虚拟机Ubuntu12.04测试路径为/home/cwr/my_test

    (1)分别解压,例如:tar zxvf zlib-1.2.11.tar.gz
    
    (2)进入解压后的目标文件夹中
    
        a.zlib命令 
        CC=arm-hisiv100nptl-linux-gcc ./configure --prefix=/home/cwr/soft_install/zlib
    
        b.openssl命令
        ./Configure --prefix=/home/cwr/soft_install/openssl os/compiler:arm-hisiv100nptl-linux-gcc
        
        c.openssh命令
        ./configure -host=arm-linux -with-libs -with-zlib=/home/cwr/soft_install/zlib -with-ssl-dir=/home/cwr/soft_install/openssl -disable-etc-default-login CC=arm-hisiv100nptl-linux-gcc AR=arm-hisiv100nptl-linux-ar
    


    (3)zlib openssl 分别make和make install,openssh只需要make

    注意

    openssl有两个,一个是config,一个是Configure

    运行confighui会出现Configured for linux-elf.这个状态是错误的

    拷贝相应文件到开发板

    确保目标板上有以下目录,如果没有,则新建:
    /usr/sbin
    /usr/local/bin
    /usr/local/libexec
    /usr/local/etc/

    其实这部分内容没关系,只要到时候自己环境变量设置正确,系统能够找到就OK。

    目前,先以这个为参考。

    (1)将 openssh-4.6p1目录下的sshd 拷贝到 目标板的/usr/sbin目录下
    
    (2)再copy scp sftp ssh ssh-add ssh-agent ssh-keygen ssh-keyscan 到目标板/usr/local/bin 目录下 
    
    (3)copy sftp-server ssh-keysign到/usr/local/libexec 
    
    (4)将sshd_config ,ssh_config拷贝到/usr/local/etc/目录下 
    
    **注意sshd_config,将PermitRootLogin yes前的注释“#”号去掉。其他最好不要去动,保持默认**
    

    在目标板新建sshd工作目录

    命令:

    mkdir -p /var/run 
    mkdir -p /var/empty/sshd 
    chmod 755 /var/empty 
    

    公钥私钥添加用户

    ssh-keygen -t ecdsa -f ssh_host_ecdsa_key -N “” 
    ssh-keygen -t rsa -f ssh_host_rsa_key -N “” 
    ssh-keygen -t dsa -f ssh_host_dsa_key -N “” 
    

    将生成的 ssh_host_*_key这3个文件copy到目标板的 /usr/local/etc/目录下

    创建xshell登录用户密码

    如:passwd root

    创建用户并设置密码,登录输入即可。

    运行过程中常见问题

    (1)sshd re-exec requires execution with an absolute path

    使用绝对路径运行sshd
    /mnt/flash/ext/usr/sbin/sshd

    (2)Privilege separation user sshd does not exist

    在/etc/passwd 中添加下面这一行
    sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

    原文件添加后内容:

    root:$1$csgwK532$GRMt3I941DvhX3dTfHrFb1:0:0::/root:/bin/sh
    root:$1$$qRPK7m23GJusamGpoGLby/:0:0::/root:/bin/sh
    sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    

    关于passwd文件中内容的含义,参考如下两篇博客

    Privilege separation user sshd does not exist

    非常详细的/etc/passwd解释

    (3)Permissions 0755 for ‘/usr/local/etc/ssh_host_dsa_key’ are too open.

    //则把目标板/usr/local/etc/下的ssh_host_几个文件的权限改为700。如果出现权限不够问题,用su - root进入root用户再改。
    命令:#chmod 700 ssh_host_

    (4)Permission denied (publickey,password,keyboard-interactive).

    //打开开发板/usr/local/sshd_config,将PermitRootLogin yes前的注释“#”号去掉。

    (5)sshd: can't load library 'libz.so.1'

    解决办法:将主机中zlib中的libz.s0.1拷贝过去 cp libz.so.1 /usr/lib/

    运行sshd出现

    情况1:

    Could not load host key: /usr/local/etc/ssh_host_key
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    @         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    Permissions 0777 for '/usr/local/etc/ssh_host_rsa_key' are too open.
    It is recommended that your private key files are NOT accessible by others.
    This private key will be ignored.
    bad permissions: ignore key: /usr/local/etc/ssh_host_rsa_key
    Could not load host key: /usr/local/etc/ssh_host_rsa_key
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    @         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    Permissions 0777 for '/usr/local/etc/ssh_host_dsa_key' are too open.
    It is recommended that your private key files are NOT accessible by others.
    This private key will be ignored.
    bad permissions: ignore key: /usr/local/etc/ssh_host_dsa_key
    Could not load host key: /usr/local/etc/ssh_host_dsa_key
    Disabling protocol version 1. Could not load host key
    Disabling protocol version 2. Could not load host key
    sshd: no hostkeys available -- exiting.
    

    情况2:

    # /mnt/flash/ext/usr/sbin/sshd 
    Could not load host key: /usr/local/etc/ssh_host_key
    Disabling protocol version 1. Could not load host key
    

    Privilege separation user sshd does not exist

    这些不用管,只要ps能看到设备运行起来就OK

    如果不行就按步骤逐一排查

    <font color=red>以后要是移植出现难以解决的问题,直接更换压缩包软件版本</font>

    开机自动运行ssh服务

    注意重启之后设备恢复默认配置问题

    修改/etc上的内容必须要将文件系统卸载掉

    使用命令: umount -l /etc

    umount命令

    必杀:umount -l /dev/sda1
    参  数:
       -a    卸除/etc/mtab中记录的所有文件系统。
       -h    显示帮助。
       -n    卸除时不要将信息存入/etc/mtab文件中。
       -r    若无法成功卸除,则尝试以只读的方式重新挂入文件系统。
       -t<文件系统类型>    仅卸除选项中所指定的文件系统。
       -v    执行时显示详细的信息。
       -V    显示版本信息。
    

    测试 umount -l /dev/mtdblock9 可行 ,df -m 成功看到该分区被卸载

    由于根目录下由于公司v8设备容量过小,只能将移植的ssh相关文件放置在其他分区中。

    环境变量配置

    开机自动设置环境变量

    测试成功代码,在/etc/profile中添加

    set_path_before()
    {
        [ -d $1 ] && PATH="$1:$PATH"
    }
    
    PATH="/usr/bin:/usr/sbin:/bin:/sbin:/mnt/flash/app"
    set_path_before /usr/local/extern/bin
    set_path_before /usr/local/sbin
    set_path_before /usr/local/bin
    set_path_before /mnt/flash/monitor
    
    
    set_path_before /mnt/flash/ext/usr/local/bin
    set_path_before /mnt/flash/ext/usr/sbin
    set_path_before /mnt/flash/ext/usr/local/libexec
    

    折腾半天的代码

    SSH_BIN_PATH="$PATH:/mnt/flash/ext/usr/local/bin:/mnt/flash/ext/usr/sbin:/mnt/flash/ext/usr/local/libexec"
    
    export SSH_BIN_PATH
    
    

    用这种方式,环境变量一直无法成功。

    出现问题:

    而且将export PATH="$PATH:/mnt/flash/ext/usr/bin" 写在shell脚本中运行也无法生效

    创建/var/empty/sshd

    在/etc/init.d/rcS中修改

    /bin/mkdir -p /var/empty/sshd
    /bin/chmod 755 -R /var/empty
    

    ps 看到设备sshd进程运行说明,并且xshell能够登录,说明移植成功。

    菜鸟就是不断的模仿别人成功的经验,反复尝试熟练后再逐渐搞清楚原理,最后可以按照自己的想法随心所欲。注定这条路会比较漫长,不过自己很享受解决问题后的成就感,虽然很多时候基本上都是靠百度,搬运别人的轮子修修改改的,哈哈。

    相关文章

      网友评论

          本文标题:海思3515A移植记录

          本文链接:https://www.haomeiwen.com/subject/idyjuqtx.html