第一次寫博客,暫時就先粗略記錄下本身移植lrzsz、samba服務器和ssh服務器的流程,方便往後提供思路快速解決同類問題。php
平臺:海思3515Ahtml
系統:Ubuntu12.04linux
做用:串口發送接收工具shell
壓縮包存放地址數據庫
a. lrzsz源碼下載windows
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. 運行.configurebash
輸入命令:服務器
CFLAGS=-O2 CC=arm-hisiv100nptl-linux-gcc ./configure --cache-file=arml_cachefile0 --prefix=/usr/local/
複製代碼
這條命令很關鍵,避免本身去修改Makefile後出現編譯失敗的問題。 (前提是交叉編譯器已經安裝配置好了)app
參數說明
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了)
關於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就是個人編譯工具,則有以下三種方法來設置環境變量:
直接用export命令:
#export PATH=$PATH:/opt/au1200_rm/build_tools/bin
查看是否已經設好,可用命令export查看:
複製代碼
全部用戶(不安全)
修 改/etc/profile(對全部用戶都是有效的)
#vi /etc/profile
在裏面加入:
export PATH="$PATH:/opt/au1200_rm/build_tools/bin"
複製代碼
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
參考博客
這篇寫的條理更加清晰
對全部用戶有效在/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
/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的預設放置也是在這裏。
環境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/
二、執行命令
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是源代碼安裝的第一步,
主要的做用是對即將安裝的軟件進行配置,檢查當前的環境是否知足要安裝軟件的依賴關係,
但並非全部的tar包都是源代碼的包,能夠ls看看有沒有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軟件版本,仍是記錄下吧。
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鏈接開發板之arm-linux下ssh的安裝使用CSDN博客
虛擬機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前的註釋「#」號去掉。其餘最好不要去動,保持默認**
複製代碼
命令:
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
(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
若是不行就按步驟逐一排查
之後要是移植出現難以解決的問題,直接更換壓縮包軟件版本
修改/etc上的內容必需要將文件系統卸載掉
使用命令: umount -l /etc
必殺: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腳本中運行也沒法生效
在/etc/init.d/rcS中修改
/bin/mkdir -p /var/empty/sshd
/bin/chmod 755 -R /var/empty
複製代碼
ps 看到設備sshd進程運行說明,而且xshell可以登陸,說明移植成功。
菜鳥就是不斷的模仿別人成功的經驗,反覆嘗試熟練後再逐漸搞清楚原理,最後能夠按照本身的想法爲所欲爲。註定這條路會比較漫長,不過本身很享受解決問題後的成就感,雖然不少時候基本上都是靠百度,搬運別人的輪子修修改改的,哈哈。