本文轉自迅爲開發板:http://www.topeetboard.comlinux
在前面實戰教程中,移植了「串口文件傳輸工具」,整個移植過程是比較簡單的,並且我git
們沒有作任何協議方面的瞭解,只是「配置」+「編譯」就完成了整個工做,如今你們應該對github
移植開源軟件有了基本的瞭解。vim
入門視頻教程中,給 Windows系統安裝了 ssh 客戶端,給 Ubuntu 安裝了 ssh 服務器,服務器
這樣就能夠經過 ssh 在 Windows和虛擬機 Ubuntu 之間傳輸文件。其實在開發板上也是能夠網絡
移植和安裝 ssh 服務器,這樣就能夠經過網絡,在 Windows和開發板之間傳輸文件。ssh
「實戰教程-ssh 服務器移植到開發板」,咱們要完成的目標是可以經過 ssh 在開發板在工具
Windows和開發板之間傳輸文件,固然也是可使用 ssh 控制檯。測試
這個實驗比前面的「串口文件傳輸工具」教程在工程(實用性)上是更加有用的,假如在spa
實際的產品中,運行的是根文件系統,沒有界面,若是數據須要在開發板和 Windows傳輸數
據,對於普通用戶來講,是一個很好的選擇,操做起來比較簡單,只須要登錄而後直接將文件
拖來拖去便可。
這個實驗的難度要比「串口文件傳輸工具」要大一點,ssh 服務器須要依賴其餘的庫文
件,因此須要開發者先移植完成全部依賴的庫文件,最後才能移植 ssh 服務器。
1 ssh官網和下載地址
本小節的地址在做者沒有代理的狀況下,測試可用。
OpenssL 下載官網地址,以下所示。就是羅永浩捐過 100 萬的那個開源組織。
https://www.openssl.org/source/
OpenssL 的 github 下載地址,以下所示。
https://github.com/openssl/openssl
ssh 開源組織官網地址,以下所示。
http://www.openssh.com/
HXng KXng(o 用 X 替代,以防文檔上傳以後被屏蔽)的 ssh 下載地址,測試能夠用,
以下所示。
https://openbsd.hk/pub/OpenBSD/OpenSSH/portable/
zlib 官網地址,以下所示。
2 詳細移植過程
源碼使用迅爲下載好的,編譯器使用「arm-2009q3」。做者是在
「/home/project/ssh-arm/」目錄下,解壓編譯配置這三個須要移植的文件,用戶若是在其
它目錄下,配置文件須要根據實際狀況修改,安裝目錄是「/home/project/ssh-arm/」目錄
下的「install」文件夾,以下圖所示。
以下圖所示,安裝目錄「install」下新建兩個文件夾「openssl-0.9.8h」和「zlib-1.2.3」,後面編譯以後須要安裝到這個目錄下。
2.1 移植zlib
拷貝「zlib-1.2.3.tar.gz」到 Ubuntu 系統,使用命令「tar -vxf zlib-1.2.3.tar.gz」解
壓,獲得「zlib-1.2.3」文件夾,使用命令「cd zlib-1.2.3」進入「zlib-1.2.3」文件夾,以下
圖所示。
接着使用命令「./configure --prefix=/home/project/ssh-arm/install/zlib-1.2.3」,設
置配置文件,以下圖所示。
使用命令「vim Makefile」修改編譯參數,將全部 gcc 修改成「arm-none-linux-gnueabi-gcc」,以下圖所示。
接着使用編譯命令「make」,以下圖所示。
接着使用安裝命令「make install」,以下圖所示。
在後面編譯 SSH 的時候,須要用到 zlib 庫,做者這裏的路徑是「/home/project/ssh-arm/install」下後面配置的時候須要對應,生成的庫文件,以下圖所示。
這部分移植其實就是修改了編譯器,修改編譯器以後編譯出的文件和不修改編譯出來的文
件是不同的。在移植過程當中,可能由於沒有將寄存器配置爲目標系統的編譯器,那麼編譯出
來的必定運行不了。這裏能夠經過 linux 的 strings 命令查看非文本文件中的可讀內容,一般
能夠和 grep 命令搭配使用。
以下圖所示,使用命令「strings -a /home/project/ssh-arm/install/zlib-1.2.3/lib/libz.a」能夠查看到全部可讀信息,可讀信息比較多,能夠保存爲文本再查看,使用
命令「strings -a /home/project/ssh-arm/install/zlib-1.2.3/lib/libz.a > log.my」重定位一
下輸出便可。
這裏須要用到的命令是「strings -a /home/project/ssh-arm/install/zlib-1.2.3/lib/libz.a | grep 「GCC」」,以下圖所示。
如上圖所示,能夠看到編譯器版本是「2009q3-67-4.4.1」的,說明這個庫是使用咱們設
置的編譯編譯的,編譯出的庫文件固然也是 arm 上使用的。
2.2 移植openssl
接着來移植 openssl 庫,拷貝「openssl-0.9.8h.tar.gz」到 Ubuntu 系統,使用命令
「tar -vxf openssl-0.9.8h.tar.gz」解壓,獲得「openssl-0.9.8h」文件夾,使用命令「cd
openssl-0.9.8h」進入「openssl-0.9.8h」文件夾,以下圖所示。
接着使用命令「./Configure linux-elf-arm -DB_ENDIAN linux:'arm-none-linux-gnueabi-gcc' --prefix=/home/project/ssh-arm/install/openssl-0.9.8h」配置編譯文件,
以下圖所示。
配置完成,以下圖所示。
使用編譯命令「make」,以下圖所示。
編譯完成,以下圖所示。
最後使用安裝命令「make intall」,以下圖所示。
編譯完成,以下圖所示。
以下圖所示,能夠看到生成了對應的庫文件,這是後面移植 ssh 須要的。
和前面 libz.a 小節相似,可使用命令查看一下編譯出來的文件到底有沒有配置正確。
2.3 移植ssh
接着來移植 openssh,拷貝「openssh-4.6p1.tar.gz」到 Ubuntu 系統,使用命令「tar
-vxf openssh-4.6p1.tar.gz」解壓,獲得「openssh-4.6p1」文件夾,使用命令「cd
openssh-4.6p1/」進入「openssh-4.6p1」文件夾,以下圖所示。
這裏看一下 ssh 的 configure 的幫助文件,以下圖所示,使用「 ./configure --help」。
ssh 的 configure 文件中須要配置的參數
--host 表示編譯出來要運行的平臺
--with-libs 表示須要的額外的庫文件;
--with-zlib 表示庫文件 zlib 的 instal 路徑 l;
--with-ssl-dir 表示 OpenSSl 文件的 install 路徑;
--disable-etc-default-login 表示不使用當前環境變量的編譯器,因此後面配置參數
時,最後直接配置 CC 和 AR 這兩個編譯器;
CC 表示設置使用的編譯器;
AR 表示設置使用的編譯器的路徑(蠻奇怪,配置文件中彷佛沒有這個參數,用戶能夠執
行驗證下)。
接着使用配置命令,命令比較長,做者使用顏色給你們分段:
./configure --host=arm-none-linux --with-libs --with-zlib=/home/project/ssh-arm/install/zlib-1.2.3 --with-ssl-dir=/home/project/ssh-arm/install/openssl-0.9.8h--disable-etc-default-login CC=/usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-gcc AR=/usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-ar
配置編譯文件,以下圖所示。
配置完成,以下圖所示。
使用編譯命令「make」,以下圖所示。
編譯完成,以下圖所示。
編譯完成,最後確定是須要安裝到開發板上的,以下圖所示。最後在目錄下
「/home/project/ssh-arm/openssh-4.6p1」有這幾個二進制文件「scp 、sftp 、ssh、
sshd、ssh-add、ssh-agent、ssh-keygen、ssh-keyscan」須要安裝到開發板上。最終編譯
出來的二進制文件,可使用 file 命令查看文件屬性,以下圖所示,使用命令「file scp」,
能夠看到「scp」文件是 32 位 ARM 上使用的可執行文件。
3 安裝測試
3.1 基本文件的安裝
在開發板上新建「/usr/libexec「、「/usr/local/etc 」、「/usr/local/bin 」三個目
錄,使用命令「mkdir -p /usr/libexec /usr/local/etc /usr/local/bin」,以下圖所示。
在虛擬機 Ubuntu 上,將 openssh-6.6p1 下的生成「scp 、sftp、ssh、sshd、ssh-add、ssh-agent、ssh-keygen、ssh-keyscan」可執行文件拷貝到開發板的
「/usr/local/bin」目錄下,拷貝完成,以下圖所示。
將「moduli、ssh_config、sshd_config」拷貝到開發板的「/usr/local/etc」目錄下,
拷貝完成,以下圖所示。
將「sftp-server、ssh-keysign」拷貝到開發板的「/usr/libexec」目錄下,拷貝完成,
以下圖所示。
3.2 生成key文件,並安裝
使用「ssh-keygen」生成是個 key 文件「ssh_host_rsa_key」「ssh_host_dsa_key」
「ssh_host_ecdsa_key」和「ssh_host_ed25519_key」。
在虛擬機 Ubuntu 控制檯,「/home/project/ssh-arm/openssh-4.6p1」目錄下,使用
命令「ssh-keygen -t rsa -f ssh_host_rsa_key -N ""」,能夠生成「ssh_host_rsa_key 」文
件,以下圖所示。
接着使用剩下的三條命令:
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 ""
執行完成以後,生成的文件以下圖所示。
將生成的「ssh_host_rsa_key」「ssh_host_dsa_key」「ssh_host_ecdsa_key」和
「ssh_host_ed25519_key」文件,拷貝到開發板的「/usr/local/etc/」目錄,而後將其權限
修改成 600,以下圖所示。
3.3 修改目標板祕鑰文件
在開發板串口控制檯中,使用命令「vi /etc/passwd」,打開 ssh 祕鑰文件,在
「/etc/passwd」文件底行添加如下內容:
sshd:x:74:74:Privilege-separated
SSH:/var/empty/sshd:/sbin/nologin
添加完成以後,以下圖所示,而後保存,祕鑰文件修改完成。
3.4 測試
做者的開發板連接路由器,PC 機的 Windows系統也是連接路由器,因此首先要確保開
發板和 PC 機是能夠 Ping 通的,以下圖所示。
做者的 PC 的 IP 爲:192.168.2.12,以下圖所示。
開發板的 IP 爲:192.168.2.230,以下圖所示。
使用 ping命令測試,以下圖所示,網絡通暢,另外按鍵「Ctrl」+c 能夠結束 ping動
做。
接着在開發板上新建 root 帳戶,以下圖所示,使用命令「passwd root」,它會提示輸
入密碼,須要重複輸入兩次以防輸錯。
而後在開發板上運行 sshd 二進制文件,使用命令「/usr/local/bin/sshd」,以下圖所
示,雖然報錯了,可是不影響使用。若是提示缺乏動態庫,前面的庫文件若是拷貝不全,可能
出現這種問題,若是用戶使用迅爲電子的根文件系統,通過測試各類文件都拷貝沒有錯誤,一
般是不會提示缺乏什麼庫的。
接着使用「ps」命令,查看一下 sshd 是否在運行,以下圖所示,能夠看到 sshd 已經運
行了。
而後使用工具 ssh 測試是否和 PC 聯通可否正常通訊,以下圖所示,使用命令
「/usr/local/bin/ssh 192.168.2.12」,這裏的 IP 是做者 PC 的 IP。
接着在 PC 上使用 ssh 工具鏈接開發板,使用方法和鏈接 Ubuntu 上的 ssh 相似,以下圖
所示。
而後傳一個文件測試下,以下圖所示。
而後經過 ssh 直接拖到到 pc 上,以下圖所示,內容不變,說明成功完成了文件傳輸移植
工做。
ssh 控制檯也是可使用的,以下圖所示,登錄方法和 PC 鏈接虛擬機 Ubuntu 的 ssh 一
樣。
另外在安裝部分,也能夠將其拷貝到文件系統的源碼中對應目錄,從新打包編譯,生成直
接支持 ssh 的鏡像。
到這裏,部分用戶可能會有疑惑,第一我的是如何知道 ssh 須要這兩個庫文件的呢?首
先,開發 ssh 軟件的大神,作了這個東西會提供編譯和使用 demo,這樣就有了基礎的英文移
植文檔,而後慢慢的會有中文版的,接着 ssh 流傳開了以後,經過網絡搜索 ssh 移植到 arm
的方法的文檔和博客,就隨處可見了。
固然,假如未來你們工做有移植的需求,找不到中文教程,須要直接使用某個開源軟件的
demo,首先就須要英文過關,而後還須要有移植的基礎知識。在編譯的過程當中,它會提示缺
少各類庫,經過編譯,也是能夠一步一步找出依賴庫的。