前言:SSH的移植部署網上文章有很多,流程也幾乎一樣,但是我在參考移植的過程中,因爲源碼庫本身的版本更新,Ubuntu18.04開發環境和我的Hi3559單板環境問題,導致我移植過程中遇到很多“坑”,雖然最終成功,但是過程卻不那麼愉快,耗費很多精力不斷嘗試,決定整理記錄一下。
參考文章:
成功移植SSH到ARM目標板的Linux系統中:https://blog.csdn.net/u010014090/article/details/79104429
openssl的編譯與交叉編譯: https://blog.csdn.net/fangye945a/article/details/86658621
注:SSH移植和Openssl編譯是原版移植,可以參考上面原文鏈接;文章最後會單獨列出來我遇到的問題;
目錄
一.成功移植SSH到ARM目標板的Linux系統中
傳統的網絡服務程序,在網絡上用明文傳送口令和數據,所以---ftp、pop和telnet在本質上都是不安全的。SSH ( Secure Shell),則會加密傳輸的數據,並且壓縮後再傳輸,使得計算機之間的遠程控制和數據傳輸安全高效。 |
1. 下載:
移植SSH需要3個安裝包:zlib、openssl和openssh,地址如下:
zlib官方下載:http://www.zlib.net/
openssl官方下載:http://www.openssl.org/source
openssh官網下載:http://www.openssh.com/portable.html
因爲它們之間沒有版本所謂的版本衝突,所以都下載最新板的即可。本文以zlib-1.2.3.tar.gz、openssl-0.9.8e.tar.gz、openssh-5.6p1.tar.gz這三個版本爲例,其他版本過程一樣。注意:其他高版本的移植工作後會依賴對應的高版本的庫,有時候目標板不支持高版本庫的時候,就可以適當降低openssh的版本後再移植。
2. 部署
3. 配置和交叉編譯
1. 編譯zlib
2. 編譯openssl
3. 編譯openssh |
4. 移植到ARM目標板
確保目標板上有以下目錄,如果是真的沒有的時候,則新建添加, 拷貝文件到目標板Linux系統中 在開發平臺上生成Key文件,拷貝到目標板 修改目標板密碼,在目標板的文件系統中添加: |
5. 測試
首先必須保證目標板的時間和當前時間的一致,才能使訪問時密碼不會過時。
在主機上運行: 注: |
二.openssl交叉編譯
交叉編譯與Ubuntu編譯類似,配置時通過【--prefix=絕對路徑】選項指定安裝路徑(自行創建文件夾),然後修改Makefile文件,修改方式如下:
./config no-asm -shared --prefix=/home/fangye/libs_build/openssl/build_arm vim Makeifle |
指定交叉編譯工具鏈:
搜索-m64選項並刪除,共兩處:
交叉編譯、安裝交叉編譯後的庫至之前自行指定的路徑。
# make # make install |
交叉編譯結果:
三.錯誤記錄
1.openssl make install出錯
recipe for target 'install_docs' failed
configue時要加上no-asm -shared參數,然後修改Makefile;具體參考上面的openssl交叉編譯
2.openssh configue時出錯
configure: error: /bin/sh ./config.sub aarch64-himix100-linux failed
wget -O config.sub 'http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD'
wget -O config.guess 'http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD'
使用新下載的文件替換原來的,再次運行configure即可;
注:網上很多說缺庫文件的,用apt-get自動安裝後即可,但是我的環境是Ubuntu18.04而且不缺少這些文件;
最後百度到這種下載新文件替換原有的解決問題;如果是config.guess報錯的話,同樣替換config.guess即可;
3.openssh configure時出錯
configure: error: *** zlib.h missing - please install first or check config.log ***
configure: error: *** Can't find recent OpenSSL libcrypto (see config.log for details) ***
configure: error: *** OpenSSL headers missing - please install first or check config.log ***
注:網上很多說缺庫文件的,用apt-get自動安裝後即可,但是我的環境是Ubuntu18.04而且不缺少這些文件;
但實際上是openssl版本過低,我更換更新的版本後問題解決;
4.openssh make編譯時出錯
authfd.c:487:33: error: dereferencing pointer to incomplete type 'DSA {aka struct dsa_st}'
buffer_put_bignum2(b, key->dsa->p);
configure配置時連接的SSL版本相對過高,所以更換高版本的SSH或者配置低版本的SSL即可解決;
這個可能跟自己的電腦(Linux)環境也有關係,畢竟我使用多個博主的移植版本在我的電腦上也沒有成功;
比如:zlib-1.2.3.tar.gz、openssl-0.9.8e.tar.gz、openssh-5.6p1.tar.gz這三個版本我就沒有成功;
5.移植完運行時(最後)出錯
libc.so: version `GLIBC_2.25' not found
這裏可以說是“最坑”的地方,使用最新的zlib,openssl,openssh完成交叉編譯後卻發現不能在ARM板上運行
而解決這個錯誤,沒兩把刷子的還是不要去嘗試的好
GLIBC介紹:glibc是GNU發佈的libc庫,即c運行庫。glibc是linux系統中最底層的api,幾乎其它任何運行庫都會依賴於glibc。glibc除了封裝linux操作系統所提供的系統服務外,它本身也提供了許多其它一些必要功能服務的實現。內核實現一個功能,glibc要花很久纔會用上,由於glibc和內核不是一塊開發的,所以glibc需要去兼容不同版本的內核,而內核也要去兼容不同版本的 glibc,雙方都揹負了太多的歷史包袱。
總結:GLIBC是系統底層依賴的文件,自己不要隨隨便便編譯,如果真要升級,那就使用yum升級,不要自己編譯,因爲編譯出來的版本和內核版本之間不一定能兼容在一起,這是個很麻煩的事。
解決方法:其實很簡單,文章開篇就說了,其他高版本的移植工作後會依賴對應的高版本的庫,有時候目標板不支持高版本庫的時候,就可以適當降低openssh的版本後再移植。沒錯,你沒有看錯,之所以最後會出這個問題,其實就是三個庫,嚴格來說是openssl和openssh這兩個庫的版本,具體我下面做簡單的說明。
6.思路整理
首先,GLIBC_x.xx是我們自己ARM板子的環境,而glibc本身又不建議升級,比如我的sshd運行需要GLIBC_2.2.5
但是我的ARM(Hi3559)只支持2.17-2.24,解決辦法就是運行一個依賴2.17-2.24版本glibc的sshd程序;
倒推的就是,sshd是由openssh編譯(make)出來的,那就只能去官網下載更低版本的openssh來編譯;
這裏就牽涉一個非常蛋疼的問題,
降低SSH的版本,這裏就可能出現SSL的版本相對較高,make的時候就會出錯誤; 倒推 > 需要降低SSL的版本
降低SSL的版本,但是SSL的版本不能太低,否則SSH在configure配置的時候可能會出錯;//可能跟自己的開發環境有關
可憐我開始都用最新的版本,最後運行出錯;
後面三個源碼庫回退,出錯百度大多是apt-get安裝庫文件,但我又不缺庫文件,emm......
所以,真正的解決思路就是開篇博主弱弱提的一句,適當降低openssh的版本後再移植!emmm......
總結一下:
sshd的運行依賴glibc庫跟自己的目標板(ARM)相關;
SSH的編譯和SSL的版本有關;
SSL的配置跟開發環境有關(Ubuntu);
我的是Ubuntu18-0.4,AMR板是Hi3559A
最後附帶一下我移植成功的源碼庫版本:zlib-1.2.3 openssl-1.0.2p openssh-5.0p1
PS:實在是當時各種問題摻雜在一起沒個頭緒試吐了,測試通過就行,我就不追求使用最新版本了,苦笑~