移植SSH到ARM目標板的Linux系統中

前言: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系統中

1. 下載:

2. 部署

         3. 配置和交叉編譯

         4. 移植到ARM目標板

5. 測試

二.openssl交叉編譯

三.錯誤記錄

1.openssl make install出錯

2.openssh configue時出錯

3.openssh configure時出錯

4.openssh make編譯時出錯

5.移植完運行時(最後)出錯

6.思路整理



一.成功移植SSH到ARM目標板的Linux系統中

傳統的網絡服務程序,在網絡上用明文傳送口令和數據,所以---ftp、pop和telnet在本質上都是不安全的。SSH ( Secure Shell),則會加密傳輸的數據,並且壓縮後再傳輸,使得計算機之間的遠程控制和數據傳輸安全高效。
在運行Linux操作系統上移植ssh步驟:
        1. 下載安裝包;
        2. 找到一個開發平臺,在開發平臺上進行部署要配置的文件;
        3. 配置編譯相關文件;
        4.  移植可執行文件、配置文件、庫到目標平臺上。
        5. 測試

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
    cd  /home/work/ssh/source/zlib-1.2.3
    /*配置zlib*/
    ./configure -prefix=/home/work/ssh/install/zlib
    /*修改Makefile :*/
    vi Makefile
    CC=gcc 改爲:
    CC=arm-none-linux-gnueabi-gcc
    LDSHARED= gcc 改爲:
    LDSHARED=arm-none-linux-gnueabi-gcc
    CPP= gcc - E 改爲:
    CPP=arm-none-linux-gnueabi-gcc - E
    AR= ar rc 改爲:
    AR=arm-none-linux-gnueabi-ar rc
    /*保存退出,開始編譯:*/
    make
    make install

 

2. 編譯openssl
cd  /home/work/ssh/source/openssl-0.9.8e
/*配置openssl*/
./Configure os/compiler:arm-none-linux-gnueabi-gcc
make
make install

 

3. 編譯openssh
cd /home/work/ssh/source/openssh-5.6p1
./configure -host=arm-none-linux-gnueabi -with-libs -with-zlib=/home/work/ssh/install/zlib -with-ssl-dir=/usr/local/ssl -disable-etc-default-login CC=arm-none-linux-gnueabi-gcc AR=arm-none-linux-gnueabi-ar
make
注意:openssh不需要make install,不需要安裝目錄
configure opt介紹:
–prefix= install architecture-independent files in PREFIX[ /usr/local ] (將體系無關文件安裝到目錄PREFIX裏,默認是/usr/local),這裏的有:PREFIX/etc,PREFIX/com,PREFIX/var,PREFIX/include,PREFIX/share
–with-zlib=剛纔編譯出來的zlib安裝路徑
–with-ssl-dir=剛纔編譯出來openssl安裝路徑
–host=交叉編譯出來的程序運行的平臺

4. 移植到ARM目標板

確保目標板上有以下目錄,如果是真的沒有的時候,則新建添加,
/usr/local/bin/
/usr/local/sbin/
/usr/local/etc/
/usr/local/libexec/
/var/run/
/var/empty/
/*改變empty的所屬權爲root*/
chown  root /var/empty

拷貝文件到目標板Linux系統中
cd /home/work/ssh/source/openssh-5.6p1/
cp scp sftp ssh ssh-add ssh-agent ssh-keygen ssh-keyscan /usr/local/bin
cp moduli ssh_config sshd_config /usr/local/etc
cp sftp-server ssh-keysign /usr/local/libexec
cp sshd /usr/local/sbin/
chmod 777 /usr/local/sbin/sshd

在開發平臺上生成Key文件,拷貝到目標板
cd /home/work/ssh/source/openssh-5.6p1/
ssh-keygen -t rsa -f ssh_host_rsa_key -N ""
ssh-keygen -t dsa -f ssh_host_dsa_key -N ""
ssh-keygen -t ecdsa -f ssh_host_ecdsa_key -N ""
ssh-keygen -t dsa -f ssh_host_ed25519_key -N ""
cp ssh_host_*_key /usr/local/etc/
chmod 600 /usr/local/etc/ssh_host_ed25519_key
注:key是指私鑰文件,有4個文件需要拷貝

修改目標板密碼,在目標板的文件系統中添加:
在/etc/passwd 中添加下面這一行
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

5. 測試

首先必須保證目標板的時間和當前時間的一致,才能使訪問時密碼不會過時。
可以在目標板上使用data命令設置時間:
date -s "2018-01-19 10:30:00"
配置目標板網絡:
ifconfig eth0 192.168.117.119
ifconfig eth0 up
在ARM單板上運行(注意請使用絕對路徑來啓動sshd服務器守護進程):
/usr/local/sbin/sshd


可以使用ps命令查看sshd是否工作,如果運行的過程中有提示缺少動態連接庫,可以在主機上搜索相應文件,拷貝到目標板/lib/目錄下面,注意創建軟連接!

在主機上運行:
ssh [email protected](開發板的ip)
然後輸入開發板的root密碼就就可以了。

注:
    1. root密碼就是你開發板上root的密碼,如果之前root沒有密碼,需要重新設置,用passwd root,然後輸入密碼即可。
    2. 如果目標板由於某些網絡的影響導致ip不穩定,使得ssh client連接不上,可以嘗試把目標板的ip固定
    vi autorun.sh /*添加如下*/
    ifconfig eth0 192.168.117.119
    3. 如果移植編譯的時候出錯,請考慮你的交叉編譯鏈和你的軟件版本的匹配性,針對自己的交叉編譯鏈,酌情降低或者升高軟件版本,重新按照以上步驟來執行。

二.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:實在是當時各種問題摻雜在一起沒個頭緒試吐了,測試通過就行,我就不追求使用最新版本了,苦笑~

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章