一、配置环境
# 设置交叉编译环境变量
export CROSS_COMPILE=aarch64-linux-gnu-
export CC=${CROSS_COMPILE}gcc
export CXX=${CROSS_COMPILE}g++
export AR=${CROSS_COMPILE}ar
export STRIP=${CROSS_COMPILE}strip
export PATH="/hdd/System/VS819L/vs-linux/x86-arm/gcc-linaro-7.5.0-aarch64-linux-gnu/bin:$PATH"
# 设置目标系统路径
export DROPBEAR_INSTALL_DIR="/hdd/Workspace/VS839_SysDeps/output/dropbear"
mkdir -p $DROPBEAR_INSTALL_DIR
二、编译Dropbear
# 1. 下载Dropbear源码
wget https://matt.ucc.asn.au/dropbear/releases/dropbear-2022.83.tar.bz2
tar -xjf dropbear-2022.83.tar.bz2
cd dropbear-2022.83
# 2. 配置编译选项
./configure \
    --host=aarch64-linux-gnu \
    --prefix=/usr \
    --disable-zlib \
    --disable-pam \
    --disable-lastlog \
    --disable-utmp \
    --disable-utmpx \
    --disable-wtmp \
    --disable-wtmpx \
    --disable-loginfunc \
    --disable-pututline \
    --disable-pututxline
# 3. 编译
make PROGRAMS="dropbear dbclient dropbearkey scp"
# 4. 安装到目标文件系统
make DESTDIR=$DROPBEAR_INSTALL_DIR install
三、板端配置Dropbear
# 在目标文件系统中创建必要的目录
mkdir -p /etc/dropbear
mkdir -p /var/log
# 生成主机密钥(在开发板上执行)
# 将以下命令添加到开发板的启动脚本中
cat > /etc/init.d/dropbear << 'EOF'
#!/bin/sh
case "$1" in
  start)
    echo "Starting dropbear SSH daemon..."
    # 生成主机密钥(如果不存在)
    [ ! -f /etc/dropbear/dropbear_rsa_host_key ] && dropbearkey -t rsa -f /etc/dropbear/dropbear_rsa_host_key
    [ ! -f /etc/dropbear/dropbear_dss_host_key ] && dropbearkey -t dss -f /etc/dropbear/dropbear_dss_host_key
    [ ! -f /etc/dropbear/dropbear_ecdsa_host_key ] && dropbearkey -t ecdsa -f /etc/dropbear/dropbear_ecdsa_host_key
    # 启动dropbear
    dropbear -R
    ;;
  stop)
    echo "Stopping dropbear SSH daemon..."
    killall dropbear
    ;;
  *)
    echo "Usage: $0 {start|stop}"
    exit 1
    ;;
esac
EOF
chmod +x /etc/init.d/dropbear
四、OpenSSL
tar -xzf openssl-1.1.1w.tar.gz
# 注意:不要和上述的Dropbear配置的CC重复了
unset CC CXX AR STRIP CROSS_COMPILE
# 设置交叉编译工具链环境变量
export CROSS_COMPILE=aarch64-linux-gnu-
export CC=${CROSS_COMPILE}gcc
export CXX=${CROSS_COMPILE}g++
export AR=${CROSS_COMPILE}ar
export RANLIB=${CROSS_COMPILE}ranlib
export STRIP=${CROSS_COMPILE}strip
export PATH="/hdd/System/VS819L/vs-linux/x86-arm/gcc-linaro-7.5.0-aarch64-linux-gnu/bin:$PATH"
# 设置安装目录
export OPENSSL_INSTALL_DIR="/hdd/Workspace/VS839_SysDeps/output/openssl"
mkdir -p $OPENSSL_INSTALL_DIR
./Configure linux-aarch64 \
    --prefix=$OPENSSL_INSTALL_DIR \
    --openssldir=$OPENSSL_INSTALL_DIR/ssl \
    CC=/hdd/System/VS819L/vs-linux/x86-arm/gcc-linaro-7.5.0-aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc \
    CXX=/hdd/System/VS819L/vs-linux/x86-arm/gcc-linaro-7.5.0-aarch64-linux-gnu/bin/aarch64-linux-gnu-g++ \
    AR=/hdd/System/VS819L/vs-linux/x86-arm/gcc-linaro-7.5.0-aarch64-linux-gnu/bin/aarch64-linux-gnu-ar \
    RANLIB=/hdd/System/VS819L/vs-linux/x86-arm/gcc-linaro-7.5.0-aarch64-linux-gnu/bin/aarch64-linux-gnu-ranlib \
    no-tests \
    no-fuzz-libfuzzer \
    no-fuzz-afl \
    no-async \
    no-egd \
    no-ui-console \
    no-dso \
    no-sock \
    no-dgram \
    no-hw \
    no-weak-ssl-ciphers
# 编译OpenSSL
make -j8
# 安装到指定目录
make install_sw
SFTP
wget https://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.0p1.tar.gz
tar -xzf openssh-9.0p1.tar.gz
cd openssh-9.0p1
# 设置交叉编译环境
export CROSS_COMPILE=aarch64-linux-gnu-
export CC=${CROSS_COMPILE}gcc
export CXX=${CROSS_COMPILE}g++
export AR=${CROSS_COMPILE}ar
export STRIP=${CROSS_COMPILE}strip
export RANLIB=${CROSS_COMPILE}ranlib
export PATH="/hdd/System/VS819L/vs-linux/x86-arm/gcc-linaro-7.5.0-aarch64-linux-gnu/bin:$PATH"
# 设置OpenSSL路径
export OPENSSL_ROOT="/hdd/Workspace/VS839_SysDeps/output/openssl"
export PKG_CONFIG_PATH="$OPENSSL_ROOT/lib/pkgconfig:$PKG_CONFIG_PATH"
# 设置输出目录
export OUTPUT_DIR="/hdd/Workspace/VS839_SysDeps/output/openssh"
# 配置configure选项,重点关注禁用zlib和指定OpenSSL路径
./configure \
    --host=aarch64-linux-gnu \
    --target=aarch64-linux-gnu \
    --prefix=/usr \
    --sysconfdir=/etc/ssh \
    --with-ssl-dir=$OPENSSL_ROOT \
    --with-ssl-engine \
    --without-zlib \
    --without-zlib-version-check \
    --disable-etc-default-login \
    --disable-lastlog \
    --disable-utmp \
    --disable-utmpx \
    --disable-wtmp \
    --disable-wtmpx \
    --disable-libutil \
    --disable-pututline \
    --disable-pututxline \
    --without-pam \
    --without-shadow \
    --without-tcp-wrappers \
    --without-libedit \
    --without-kerberos5 \
    --without-selinux \
    --with-cflags="-I$OPENSSL_ROOT/include" \
    --with-ldflags="-L$OPENSSL_ROOT/lib"
# 只编译我们需要的sftp-server
make sftp-server
# 检查编译出的sftp-server
ls -la sftp-server
file sftp-server
# 创建输出目录结构
mkdir -p $OUTPUT_DIR/usr/libexec
mkdir -p $OUTPUT_DIR/usr/bin
# 复制编译结果
cp sftp-server $OUTPUT_DIR/usr/libexec/
${CROSS_COMPILE}strip $OUTPUT_DIR/usr/libexec/sftp-server
# 如果需要sftp客户端,也可以编译
# make sftp
# cp sftp $OUTPUT_DIR/usr/bin/
# 检查最终文件
ls -la $OUTPUT_DIR/usr/libexec/sftp-server