海思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: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
如果不行就按步骤逐一排查
以后要是移植出现难以解决的问题,直接更换压缩包软件版本
开机自动运行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能够登录,说明移植成功。
菜鸟就是不断的模仿别人成功的经验,反复尝试熟练后再逐渐搞清楚原理,最后可以按照自己的想法随心所欲。注定这条路会比较漫长,不过自己很享受解决问题后的成就感,虽然很多时候基本上都是靠百度,搬运别人的轮子修修改改的,哈哈。