海思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

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

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

发送接收只需要在开发板敲命令
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❌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

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

以后要是移植出现难以解决的问题,直接更换压缩包软件版本

开机自动运行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能够登录,说明移植成功。

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

你可能感兴趣的:(Linux)