所使用的开发板为Mini6410。安装OpenSSH需要zlib和OpenSSL。我已经准备好了以下版本:
- zlib 1.2.8
- OpenSSL 1.0.1e
- OpenSSH 6.4p1
我的工具链是由crosstool-NG 1.15.2构建的。工具链配置是从arm-unknown-linux-gnueabi修改而来的。
Arch: armv6
CPU: arm1176jzf-s
FPU: vfp
Linux kernel: 2.6.38.8
binutils: 2.19.1a
gcc: 4.6.3
glibc: 2.11
gmp: 4.3.2
mpfr: 3.0.1
ppl: 0.11.2
cloog: 0.15.11
mpc: 0.9
下面我定义了三个环境变量:
HOST
、
ROOTFS
和
SYSROOT
。其中,
HOST
为arm-unknown-linux-gnueabi;
ROOTFS
为根文件系统;
SYSROOT
是交叉编译工具链中用于头文件和库的根目录。
你可以添加
CFLAGS
和
LD_LIBRARY_PATH
指向你的根文件系统,这样交叉编译器就能找到你安装的内容。但是,我更喜欢不设置这些变量,而是将这些库安装在
SYSROOT
和
ROOTFS
两个地方。
首先,编译zlib。
AR=$HOST-ar CC=$HOST-gcc RANLIB=$HOST-ranlib ./configure --prefix=$ROOTFS/usr
make
make install
第二步,编译 OpenSSL
./Configure linux-armv4 shared zlib-dynamic --prefix=/usr
make CC=$HOST-gcc AR="$HOST-ar r" RANLIB=$HOST-ranlib
make CC=$HOST-gcc AR="$HOST-ar r" RANLIB=$HOST-ranlib INSTALL_PREFIX=$ROOTFS install
请注意,
--prefix
设置为
/usr
而不是
$ROOTFS/usr
。原因是如果将
--prefix
设置为
$ROOTFS/usr
,它将在Mini6410的运行时尝试访问
$ROOTFS/usr
中的配置文件,但实际上该目录不存在。在Makefile中指定的安装路径为
$INSTALL_PREFIX/$PREFIX
,因此我们使用
$ROOTFS
代替
$INSTALL_PREFIX
。
最后,编译OpenSSH
./configure --host=$HOST --prefix=/usr
- 在Makefile的规则
install
中删除变量STRIP_OPT
和check-config
。
make && make DESTDIR=$ROOTFS install
- 启动您的Mini6410并使用命令
ssh-keygen
生成主机密钥。
使用/usr
作为--prefix
的原因与OpenSSL相同。如果指定--prefix=$ROOTFS/usr
,则无法执行scp
命令。
必须删除STRIP_OPT
,因为在x86-64上无法使用/usr/bin/install
来剥离ARM上的二进制文件。规则check-config
将在主机上运行生成的sshd
,因此我们必须避免这种情况。
在最后一步中,请检查Makefile并找到规则host-key
。下一行是@if [ -z "$(DESTDIR)" ] ; then
,这意味着如果$(DESTDIR)
的长度为非零,则不执行任何操作。因此,我们必须在Mini6410上手动生成这些密钥:
ssh-keygen -t rsa1 -f /usr/etc/ssh_host_key -N ""
ssh-keygen -t dsa -f /usr/etc/ssh_host_dsa_key -N ""
ssh-keygen -t rsa -f /usr/etc/ssh_host_rsa_key -N ""
ssh-keygen -t ecdsa -f /usr/etc/ssh_host_ecdsa_key -N ""