第一次寫部落格,暫時就先粗略記錄下自己移植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新增環境變數與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軟體版本,還是記錄下吧。
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原始碼下載
解壓編譯
虛擬機器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
(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能夠登入,說明移植成功。
菜鳥就是不斷的模仿別人成功的經驗,反覆嘗試熟練後再逐漸搞清楚原理,最後可以按照自己的想法隨心所欲。註定這條路會比較漫長,不過自己很享受解決問題後的成就感,雖然很多時候基本上都是靠百度,搬運別人的輪子修修改改的,哈哈。