使用的板子是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
,它会尝试$ROOTFS/usr
在 Mini6410 上运行时访问配置文件,而 Mini6410 并不存在。Makefile 中指定的安装路径是$INSTALL_PREFIX/$PREFIX
,所以我们使用$ROOTFS
for $INSTALL_PREFIX
。
最后,编译 OpenSSH
./confgure --host=$HOST --prefix=/usr
- 删除变量
STRIP_OPT
并在 Makefilecheck-config
中的规则。install
make && make DESTDIR=$ROOTFS install
- 启动 Mini6410 并使用命令
ssh-keygen
生成主机密钥。
使用/usr
for的原因--prefix
与 OpenSSL 相同。如果您指定--prefix=$ROOTFS/usr
,您将无法执行命令scp
。
STRIP_OPT
必须删除,因为不可能/usr/bin/install
在 x86-64 上使用来剥离 ARM 上的二进制文件。该规则check-config
将在主机上运行生成sshd
的,因此我们必须避免这种情况。
在最后一步,检查 Makefile 并找到 rule 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 ""