本文轉自迅為開發板:http://www.topeetboard.com
在前面實戰教程中,移植了“串口文件傳輸工具”,整個移植過程是比較簡單的,而且我
們沒有做任何協議方面的了解,只是“配置”+“編譯”就完成了整個工作,現在大家應該對
移植開源軟件有了基本的了解。
入門視頻教程中,給 Windows系統安裝了 ssh 客戶端,給 Ubuntu 安裝了 ssh 服務器,
這樣就可以通過 ssh 在 Windows和虛擬機 Ubuntu 之間傳輸文件。其實在開發板上也是可以
移植和安裝 ssh 服務器,這樣就可以通過網絡,在 Windows和開發板之間傳輸文件。
“實戰教程-ssh 服務器移植到開發板”,我們要完成的目標是能夠通過 ssh 在開發板在
Windows和開發板之間傳輸文件,當然也是可以使用 ssh 控制台。
這個實驗比前面的“串口文件傳輸工具”教程在工程(實用性)上是更加有用的,假如在
實際的產品中,運行的是根文件系統,沒有界面,如果數據需要在開發板和 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,首先就需要英文過關,然后還需要有移植的基礎知識。在編譯的過程中,它會提示缺
少各種庫,通過編譯,也是可以一步一步找出依賴庫的。