本文章轉載自新浪博客:http://blog.sina.com.cn/s/blog_7f2a9a390100xws4.html
裏先森按:
原文使用的編譯器較老,正在試用arm-linux-gnueabi-gcc操作以下步驟
不推薦使用此方法了部署SSH,推薦參考同分類下的移植ubuntu根文件系統並使用apt安裝ssh
人生苦短,用用便捷的方法吧
編譯器arm-linux-gcc和arm-none-linux-gnueabi-gcc成功。
在移植到友善2440的時候很容易,因爲他4.3.2交叉編譯器等庫文件做等好。但是在移植到天漠devkit8000時,遇到非常多的問題。一個月之前遇到問題沒有找到-lgcc_s的問題一直沒有解決,以致後來非常影響開發進度。最近決心解決這個問題,在google上查到沒有找到lxx其實時沒有找到libxxx.so,然後與友善2440比較了下,發現果真是arm-none-linux-gnueabi/libc/lib下缺少libgcc_s.so。最後一步問題總結是我編譯的時候遇到等所有問題,後一一化解,成功移植。所以,如果你在編譯等時候出錯,查看最後的問題總結,應該可以找到答案。
步驟:
1.下載源碼包,地址如下:
openssh http://www.openssh.com/portable.html
openssl http://www.openssl.org/source
zlib http://www.zlib.net/
2.交叉編譯
創建工作目錄:
#mkdir /work
#cd /work
在/work目下面創建ssh目錄
# mkdir /work/lib -----〉共享庫目錄,通過nfs掛載
# mkdir /work/ssh -----〉工作目錄
# cd /work/ssh
# mkdir compressed install source -----〉compressed 用於存放源碼包
-----〉Install 軟件安裝目錄
-----〉Source 源碼包解壓目錄
#mv tarpakgs/openssh-4.6p1.tar.gz /work/ssh/compressed
#mv tarpakgs/openssl-0.9.8e.tar.gz /work/ssh/compressed
#mv tarpakgs/zlib-1.2.3.tar.gz /work/ssh/compressed
解壓安裝包:
# cd /work/ssh/compressed/
# tar zxvf zlib-1.2.3.tar.gz -C ../source
# tar zxvf openssl-0.9.8e.tar.gz -C ../source
# tar zxvf openssh-4.6p1.tar.gz –C ../source
交叉編譯 zlib:
# cd /work/ssh/source/zlib-1.2.3
# ./configure --prefix=/work/ssh/install/zlib-1.2.3
# vim Makefile
CC=arm-none-linux-gnueabi-gcc
AR=arm-none-linux-gnueabi-ar rc
CPP =arm-none-linux-gnueabi-gcc -E
LDSHARED=arm-none-linux-gnueabi-gcc
# make
# make install
交叉編譯openssl
# cd /work/ssh/source/openssl-0.9.8e
# ./Configure --prefix=/work/ssh/install/openssl-0.9.8e os/compiler:arm-none-linux-gnueabi-gcc
# make
# make install
交叉編譯openssh
# cd /work/ssh/source/ openssh-4.6p1
#./configure --host=arm-none-linux-gnueabi --with-libs --with-zlib=/work/ssh/install/zlib-1.2.3 --with-ssl-dir=/work/ssh/install/openssl-0.9.8e --disable-etc-default-login CC=arm-none-linux-gnueabi-gcc AR=arm-none-linux-gnueabi-ar
#make
注意:openssh不需要make install
3.操作目標板
3.1確保目標板上有以下目錄,若沒有,則新建:
/usr/local/bin/
/usr/local/sbin/
/usr/local/etc/
/usr/local/libexec/
/var/run/
/var/empty/
3.2從PC機上將以下文件拷貝到目標板Linux系統中
PC機 /work/ssh/source/openssh-4.6p1/ 目錄下的
scp sftp ssh ssh-add ssh-agent ssh-keygen ssh-keyscan 拷貝到目標板/usr/local/bin
moduli ssh_config sshd_config拷貝到目標板 /usr/local/etc
sftp-server ssh-keysign 拷貝到目標板 /usr/local/libexec
sshd 拷貝到目標板 /usr/local/sbin/
3.3生成Key文件
在PC機 /work/ssh/source/openssh-4.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_host_*_key這3個文件copy到目標板的 /usr/local/etc/目錄下
3.4修改目標板passwd文件。
在/etc/passwd 中添加下面這一行
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
4.測試
在目標板上運行:
#/usr/local/sbin/sshd
可以用ps命令查看sshd是否在工作
如果運行的過程中有提示缺少動態連接庫,可以在主機上搜索相應文件,拷貝到目標板/lib/目錄下面,注意創建軟連接!
OK!不出意外的話可以成功,
主機上:
#ssh root@192.168.0.34(開發板的ip)
然後輸入開發板的root密碼就就可以了。
//root密碼就是你開發板上root的密碼,如果之前root沒有密碼,需要重新設置,用passwd root,然後輸入密碼即可。
登錄成功後如下圖:
putty登錄
linux主機登錄
問題總結
1.運行sshd時出現
sshd: /lib/libc.so.6: version `GLIBC_2.7' not found (required by sshd)
問題分析:說明你編譯等時候指定等glibc和目標板所使用的不一致。
解決辦法:配置openssh,即./configure時,使用對用等--host參數,如--host=arm-linux/arm-none-linux-gnueabi。
2.make openssl的時候,指定的prefix目錄已經存在,無法創建。
問題分析:這是因爲在prefix目錄的時候,使用了相對路徑,如../../install。
解決辦法:openssl需要用指定絕對路徑來安裝,prefix參數應該如:--prefix=/work/ssh/install/openssl-1.0.0
3.使用arm-2007q3-51-arm-none-linux-gnueabi.bin的make編譯ssh和gdbserver時出錯:
/root/CodeSourcery/Sourcery_G++_Lite/bin/../lib/gcc/arm-none-linux-gnueabi/4.2.1/../../../../arm-none-linux-gnueabi/bin/ld: cannot find -lgcc_s
collect2: ld returned 1 exit status
make: *** [example] 錯誤 1
問題解析:
cannot find -lgcc_s,即沒有發現-libgcc_s.so。
解決辦法:
可能一解決:查找/root/CodeSourcery/Sourcery_G++_Lite/arm-none-linux-gnueabi/libc/lib目錄,如果有libgcc_s.so.1,做一個鏈接:ln -s libgcc_s.so.1 libgcc_s.so,重新make,此問題可以解決。如果再出現以下問題:
同理,其他的問題,也在/arm-none-linux-gnueabi/libc/lib目錄下,
問題:cannot find /lib/libc.so.6 inside,解決:ln -s libc-2.5.so libc.so.6
問題:cannot find /lib/ld-linux.so.3 inside,解決:ln -s ld-2.5.so ld-linux.so.3
4.用nfs從主機複製到目標板時出現:
cp: omitting directory '/etc/boa'
等錯誤。
問題分析:權限不夠,或者目標板中等/usr/local/etc已經有文件。
解決辦法:在cp命令後加-r參數,如:cp -r /etc/* /usr/local/etc/
5.運行sshd時出現:
Could not load host key: /usr/local/etc/ssh_host_dsa_key
Could not load host key: /usr/local/etc/ssh_host_ecdsa_key
問題解析:在/usr/local/etc目錄中沒有相應等key。
解決辦法:按照操作步驟,運行:
ssh-keygen -t dsa -f ssh_host_das_key -N ""
ssh-keygen -t ecdsa -f ssh_host_ecdas_key -N ""
生成ssh_host_das_key 和ssh_host_ecdas_key後複製到目標板/usr/local/etc/目錄下。
6.從nfs複製key文件到usr/local/etc時出現:
cp: can't open 'ssh_host_dsa_key': Permission denied
問題分析:目標板複製權限不夠。
解決辦法:在主機中修改他們等權限爲777,命令:chmod 777 * 。然後再複製。
7.Privilege separation user sshd does not exist
//需要在開發板的系統裏adduser shhd
//或者在/etc/passwd 中添加下面這一行
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
8.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_*
9.Permission denied (publickey,password,keyboard-interactive).
//打開開發板/usr/local/sshd_config,將PermitRootLogin yes前的註釋“#”號去掉。
10.configure配置openssh的時候出錯:
configure: error: *** zlib missing - please install first or check config.log ***
問題分析:沒有找到zlib。
問題解決:重新交叉編譯zlib,再configure即可。
11.以下兩個函數沒找到:
/home/arm/ssh-omap/source/openssh-5.8p2/ssh-keygen.c:1410: undefined reference to `pkcs11_init'
/home/arm/ssh-omap/source/openssh-5.8p2/ssh-keygen.c:1493: undefined reference to `pkcs11_terminate'
問題解決:
打開ssh-keygen.c:vi ssh-keygen.c
屏蔽這1410和1493這兩行函數。
12.開啓sshd後,沒有找到sftp-server服務。如DS-5軟件在連接時就出現以下錯誤,雖然還可以用終端,不過不能傳輸文件,還是很不爽的:
Failed to connect SFTP subsystem: Remote host may not have sftp-server installed : java.io.IOException: inputstream is closed
問題分析:明顯的,這是沒有找到sftp子服務。
問題解決:打開/usr/local/etc/sshd_config,找到這麼一行:
Subsystem sftp /usr/libexec/sftp-server
看出問題了吧?配置文件中指明的sftp子服務並不是我們放的目錄,所以修改爲:
Subsystem sftp /usr/local/libexec/sftp-server
然後kill掉sshd,再啓動就可以用sftp-server了。
裏先森按:
問題:
1.arm-linux-gnueabi-ar: libz.a: 沒有那個文件或目錄
在上文的下述代碼部分
交叉編譯 zlib:
# cd /work/ssh/source/zlib-1.2.3
# ./configure --prefix=/work/ssh/install/zlib-1.2.3
# vim Makefile
CC=arm-none-linux-gnueabi-gcc
AR=arm-none-linux-gnueabi-ar rc
CPP =arm-none-linux-gnueabi-gcc -E
LDSHARED=arm-none-linux-gnueabi-gcc
將AR=arm-none-linux-gnueabi-ar rc 最後的rc刪除,因爲在新版本的zlib-1.2.11 Makefile中,在AR下面一行有加入ARFLAGS=rc
2.編譯openssl ./config問題
選擇以下方法進行編譯
./config no-asm -shared --prefix=你希望安裝到的目錄
no-asm是在交叉編譯過程中不使用匯編代碼代碼加速編譯過程
配置完成後,手動修改Makefile,將其中有-m64的地方全部刪除(兩處),修改
PLATFORM=arm
CROSS_COMPILE=arm-linux-gnueabi-
之後$make $make install 完成後將在你希望安裝到的目錄生成5個目錄