海思3515A移植記錄

chenwr2018發表於2019-03-03

  第一次寫部落格,暫時就先粗略記錄下自己移植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能夠登入,說明移植成功。

菜鳥就是不斷的模仿別人成功的經驗,反覆嘗試熟練後再逐漸搞清楚原理,最後可以按照自己的想法隨心所欲。註定這條路會比較漫長,不過自己很享受解決問題後的成就感,雖然很多時候基本上都是靠百度,搬運別人的輪子修修改改的,哈哈。

相關文章