概述
本教程专为 Ubuntu 20.04 armhf(ARM 32位精简系统) 设计,完整编译 Transmission 4.0.6 并生成标准 .deb 安装包,兼容官方包结构、systemd 服务、用户权限和配置文件。
最终输出 3 个 deb 包:
transmission-common_4.0.6_all.deb:Web UI + 共享文件(全架构通用)
transmission-daemon_4.0.6_armhf.deb:守护进程 + 系统服务(armhf 专属)
transmission-cli_4.0.6_armhf.deb:命令行工具集(armhf 专属)
环境说明
- 系统:Ubuntu 20.04 LTS armhf
- 架构:ARM 32位
- 系统类型:精简版(已适配缺失依赖)
- 目标版本:Transmission 4.0.6
第一步:卸载旧版本(保留数据)
# 停止服务
systemctl stop transmission-daemon || true
# 备份配置与数据
cp -a /var/lib/transmission-daemon /var/lib/transmission-daemon.bak
cp -a /etc/transmission-daemon /etc/transmission-daemon.bak 2>/dev/null || true
# 卸载旧包
apt remove -y transmission-daemon transmission-cli transmission-common
第二步:安装基础编译依赖(精简系统必备)
armhf 精简系统默认缺少编译工具,先补全核心依赖:
apt update && apt install -y \
sudo bash-completion lsb-base ca-certificates wget \
build-essential cmake ninja-build pkg-config git \
dpkg-dev debhelper devscripts file binutils
验证工具版本(满足要求即可):
cmake --version # ≥3.16
g++ --version # ≥9.0(支持C++17)
第三步:安装 Transmission 编译依赖
apt install -y \
libssl-dev \
libcurl4-openssl-dev \
libsystemd-dev \
libevent-dev \
libminiupnpc-dev \
libnatpmp-dev \
zlib1g-dev
第四步:获取源码
# 定义编译根目录
export BUILD_ROOT=/opt/transmission-build
mkdir -p ${BUILD_ROOT}/{src,pkg,install}
cd ${BUILD_ROOT}/src
# 下载源码(含子模块)
git clone --recurse-submodules https://github.com/transmission/transmission.git
cd transmission
git checkout 4.0.6
git submodule update --init --recursive
# 确认版本
grep 'set(TR_VERSION' CMakeLists.txt
第五步:配置与编译(armhf 原生编译)
5.1 处理 libdeflate 依赖
# 检查系统库
apt-cache show libdeflate-dev 2>/dev/null | grep Version
# 存在则安装使用系统库
if [ $? -eq 0 ]; then
apt install -y libdeflate-dev
export USE_DEFLATE="-DUSE_SYSTEM_DEFLATE=ON"
else
export USE_DEFLATE="-DUSE_SYSTEM_DEFLATE=OFF"
fi
5.2 CMake 配置
cd ${BUILD_ROOT}/src/transmission
cmake -B build \
-G "Unix Makefiles" \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=/usr \
-DENABLE_DAEMON=ON \
-DENABLE_CLI=ON \
-DENABLE_GTK=OFF \
-DENABLE_QT=OFF \
-DENABLE_TESTS=OFF \
-DINSTALL_DOC=OFF \
-DUSE_SYSTEM_EVENT2=ON \
-DUSE_SYSTEM_MINIUPNPC=ON \
-DUSE_SYSTEM_NATPMP=ON \
-DUSE_SYSTEM_PSL=ON \
-DUSE_SYSTEM_DEFLATE=OFF \
-DUSE_SYSTEM_FMT=ON \
-DCMAKE_CXX_FLAGS="-O1 -g0" \
${USE_DEFLATE} 2>&1 | tee ${BUILD_ROOT}/cmake.log
# 验证关键依赖
grep -E "OpenSSL|CURL|libevent|miniupnpc|natpmp" ${BUILD_ROOT}/cmake.log
5.3 编译并安装到临时目录
精简系统 CPU 核心少,不要加 -j 参数,避免卡死:
# 编译
cmake --build build 2>&1 | tee ${BUILD_ROOT}/build.log
# 检查编译错误
grep -E "^.*error:.*$" ${BUILD_ROOT}/build.log | grep -v "warning:" | head -20
# 安装到临时目录
DESTDIR=${BUILD_ROOT}/install cmake --install build
# 关键验证:确认是 32位 armhf 产物
file ${BUILD_ROOT}/install/usr/bin/transmission-daemon
# 正确输出:ELF 32-bit LSB pie executable, ARM, EABI5
第六步:制作 deb 包(核心:架构 = armhf)
6.1 自动检测运行时依赖
ldd ${BUILD_ROOT}/install/usr/bin/transmission-daemon \
| awk '/=>/{print $1}' \
| while read lib; do
pkg=$(dpkg -S "$(ldconfig -p | grep "${lib}" | awk '{print $NF}' | head -1)" 2>/dev/null | awk -F: '{print $1}' | head -1)
echo " ${lib} => ${pkg}"
done
6.2 构建 transmission-common(无架构差异)
PKG_ROOT=${BUILD_ROOT}/pkg
PKG_COMMON=${PKG_ROOT}/transmission-common_4.0.6_all
mkdir -p ${PKG_COMMON}/DEBIAN
mkdir -p ${PKG_COMMON}/usr/share/transmission
mkdir -p ${PKG_COMMON}/usr/share/doc/transmission-common
# 复制 Web UI
cp -r ${BUILD_ROOT}/install/usr/share/transmission/public_html ${PKG_COMMON}/usr/share/transmission/
# 版权文件
cat > ${PKG_COMMON}/usr/share/doc/transmission-common/copyright << 'EOF'
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: transmission
Source: https://github.com/transmission/transmission
Files: *
Copyright: 2005-2024 The Transmission Project
License: GPL-2+
EOF
# control 文件
cat > ${PKG_COMMON}/DEBIAN/control << 'EOF'
Package: transmission-common
Version: 4.0.6
Architecture: all
Maintainer: Local Build <root@localhost>
Description: lightweight BitTorrent client (common files)
Transmission is a free, lightweight BitTorrent client.
This package contains the Web interface and other shared files.
EOF
6.3 构建 transmission-daemon(armhf 专属)
PKG_DAEMON=${PKG_ROOT}/transmission-daemon_4.0.6_armhf
mkdir -p ${PKG_DAEMON}/DEBIAN
mkdir -p ${PKG_DAEMON}/usr/bin
mkdir -p ${PKG_DAEMON}/usr/share/doc/transmission-daemon
mkdir -p ${PKG_DAEMON}/lib/systemd/system
mkdir -p ${PKG_DAEMON}/etc/init.d
mkdir -p ${PKG_DAEMON}/etc/default
# 复制并精简二进制
strip --strip-unneeded ${BUILD_ROOT}/install/usr/bin/transmission-daemon
strip --strip-unneeded ${BUILD_ROOT}/install/usr/bin/transmission-remote
cp ${BUILD_ROOT}/install/usr/bin/transmission-daemon ${BUILD_ROOT}/install/usr/bin/transmission-remote ${PKG_DAEMON}/usr/bin/
# systemd 服务
cat > ${PKG_DAEMON}/lib/systemd/system/transmission-daemon.service << 'EOF'
[Unit]
Description=Transmission BitTorrent Daemon
After=network.target
Wants=network-online.target
[Service]
User=debian-transmission
Group=debian-transmission
Type=notify
EnvironmentFile=-/etc/default/transmission-daemon
ExecStart=/usr/bin/transmission-daemon -f --log-level=error
ExecReload=/bin/kill -s HUP $MAINPID
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ReadWritePaths=/var/lib/transmission-daemon /tmp
ProtectHome=true
LimitNOFILE=65536
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
# 默认配置
cat > ${PKG_DAEMON}/etc/default/transmission-daemon << 'EOF'
OPTIONS=""
EOF
# init.d 兼容脚本
cat > ${PKG_DAEMON}/etc/init.d/transmission-daemon << 'INITEOF'
#!/bin/sh
### BEGIN INIT INFO
# Provides: transmission-daemon
# Required-Start: $network $local_fs $remote_fs
# Required-Stop: $network $local_fs $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Transmission BitTorrent Daemon
### END INIT INFO
NAME=transmission-daemon
DAEMON=/usr/bin/transmission-daemon
CONFIG_DIR=/var/lib/transmission-daemon/info
PIDFILE=/var/run/transmission-daemon.pid
USER=debian-transmission
. /lib/lsb/init-functions
[ -f /etc/default/transmission-daemon ] && . /etc/default/transmission-daemon
do_start() {
start-stop-daemon --start --background --make-pidfile \
--pidfile $PIDFILE --chuid $USER \
--exec $DAEMON -- --config-dir $CONFIG_DIR -f $OPTIONS
}
do_stop() {
start-stop-daemon --stop --pidfile $PIDFILE --retry TERM/30/KILL/5
rm -f $PIDFILE
}
case "$1" in
start) log_daemon_msg "Starting $NAME"; do_start; log_end_msg $? ;;
stop) log_daemon_msg "Stopping $NAME"; do_stop; log_end_msg $? ;;
reload) kill -HUP $(cat $PIDFILE 2>/dev/null) 2>/dev/null || true ;;
restart) do_stop; sleep 1; do_start ;;
status) status_of_proc -p $PIDFILE $DAEMON $NAME ;;
*) echo "Usage: $0 {start|stop|restart|reload|status}"; exit 1 ;;
esac
INITEOF
chmod 755 ${PKG_DAEMON}/etc/init.d/transmission-daemon
# 配置文件标记
cat > ${PKG_DAEMON}/DEBIAN/conffiles << 'EOF'
/etc/default/transmission-daemon
EOF
# 安装前脚本:创建系统用户
cat > ${PKG_DAEMON}/DEBIAN/preinst << 'EOF'
#!/bin/sh
set -e
case "$1" in
install|upgrade)
if ! getent group debian-transmission > /dev/null 2>&1; then
addgroup --system debian-transmission
fi
if ! getent passwd debian-transmission > /dev/null 2>&1; then
adduser --system \
--ingroup debian-transmission \
--home /var/lib/transmission-daemon \
--no-create-home \
--shell /usr/sbin/nologin \
--disabled-password \
--gecos "Transmission BitTorrent Daemon" \
debian-transmission
fi
;;
esac
exit 0
EOF
# 安装后脚本:初始化目录、权限、配置
cat > ${PKG_DAEMON}/DEBIAN/postinst << 'EOF'
#!/bin/sh
set -e
case "$1" in
configure)
mkdir -p /var/lib/transmission-daemon/info
mkdir -p /var/lib/transmission-daemon/downloads
mkdir -p /var/lib/transmission-daemon/incomplete
if [ ! -e /etc/transmission-daemon ]; then
ln -s /var/lib/transmission-daemon/info /etc/transmission-daemon
fi
chown -R debian-transmission:debian-transmission /var/lib/transmission-daemon
chmod 750 /var/lib/transmission-daemon
chmod 750 /var/lib/transmission-daemon/info
if [ ! -f /var/lib/transmission-daemon/info/settings.json ]; then
cat > /var/lib/transmission-daemon/info/settings.json << 'SETTINGS'
{
"download-dir": "/var/lib/transmission-daemon/downloads",
"incomplete-dir": "/var/lib/transmission-daemon/incomplete",
"incomplete-dir-enabled": false,
"rpc-authentication-required": true,
"rpc-bind-address": "0.0.0.0",
"rpc-enabled": true,
"rpc-password": "transmission",
"rpc-port": 9091,
"rpc-username": "transmission",
"rpc-whitelist": "127.0.0.1",
"rpc-whitelist-enabled": true
}
SETTINGS
chown debian-transmission:debian-transmission /var/lib/transmission-daemon/info/settings.json
chmod 600 /var/lib/transmission-daemon/info/settings.json
fi
if [ -d /run/systemd/system ]; then
systemctl daemon-reload || true
systemctl enable transmission-daemon.service || true
systemctl start transmission-daemon.service || true
fi
;;
esac
exit 0
EOF
# 卸载前脚本:停止服务
cat > ${PKG_DAEMON}/DEBIAN/prerm << 'EOF'
#!/bin/sh
set -e
case "$1" in
remove|upgrade|deconfigure)
if [ -d /run/systemd/system ]; then
systemctl stop transmission-daemon.service || true
systemctl disable transmission-daemon.service || true
fi
;;
esac
exit 0
EOF
# 卸载后脚本:清理数据
cat > ${PKG_DAEMON}/DEBIAN/postrm << 'EOF'
#!/bin/sh
set -e
case "$1" in
purge)
deluser --system debian-transmission 2>/dev/null || true
delgroup --system debian-transmission 2>/dev/null || true
rm -rf /var/lib/transmission-daemon
rm -f /etc/transmission-daemon
;;
remove)
if [ -d /run/systemd/system ]; then
systemctl daemon-reload || true
fi
;;
esac
exit 0
EOF
# 权限设置
chmod 755 ${PKG_DAEMON}/DEBIAN/{preinst,postinst,prerm,postrm}
# control 文件(核心:Architecture=armhf)
cat > ${PKG_DAEMON}/DEBIAN/control << 'EOF'
Package: transmission-daemon
Version: 4.0.6
Architecture: armhf
Maintainer: Local Build <root@localhost>
Depends: transmission-common (= 4.0.6),
libc6,
libgcc-s1,
libstdc++6,
libsystemd0,
libssl1.1,
libcurl4,
libevent-2.1-7,
libminiupnpc17,
libnatpmp1,
adduser,
lsb-base
Description: lightweight BitTorrent client (daemon)
Transmission is a free, lightweight BitTorrent client.
This package contains the daemon, controllable via web UI or transmission-remote.
EOF
6.4 构建 transmission-cli(armhf 专属)
PKG_CLI=${PKG_ROOT}/transmission-cli_4.0.6_armhf
mkdir -p ${PKG_CLI}/DEBIAN
mkdir -p ${PKG_CLI}/usr/bin
mkdir -p ${PKG_CLI}/usr/share/doc/transmission-cli
# 复制 CLI 工具
for bin in transmission-cli transmission-create transmission-edit transmission-show transmission-remote; do
src=${BUILD_ROOT}/install/usr/bin/${bin}
if [ -f "${src}" ]; then
strip --strip-unneeded "${src}"
cp "${src}" ${PKG_CLI}/usr/bin/
chmod 755 ${PKG_CLI}/usr/bin/${bin}
fi
done
# control 文件
cat > ${PKG_CLI}/DEBIAN/control << 'EOF'
Package: transmission-cli
Version: 4.0.6
Architecture: armhf
Maintainer: Local Build <root@localhost>
Depends: transmission-common (= 4.0.6),
libc6,
libgcc-s1,
libstdc++6,
libssl1.1,
libcurl4,
libevent-2.1-7
Description: lightweight BitTorrent client (command line programs)
Transmission is a free, lightweight BitTorrent client.
This package contains all command-line tools.
EOF
第七步:生成 deb 包
cd ${PKG_ROOT}
# 构建
dpkg-deb --root-owner-group --build transmission-common_4.0.6_all
dpkg-deb --root-owner-group --build transmission-daemon_4.0.6_armhf
dpkg-deb --root-owner-group --build transmission-cli_4.0.6_armhf
# 查看结果
ls -lh *.deb
第八步:安装与验证
# 安装
dpkg -i \
transmission-common_4.0.6_all.deb \
transmission-daemon_4.0.6_armhf.deb \
transmission-cli_4.0.6_armhf.deb
# 补全依赖
apt install -f -y
# 验证
transmission-daemon --version
systemctl status transmission-daemon
id debian-transmission
curl http://127.0.0.1:9091/transmission/web/
第九步:恢复旧数据(可选)
systemctl stop transmission-daemon
cp -a /var/lib/transmission-daemon.bak/info/. /var/lib/transmission-daemon/info/
chown -R debian-transmission:debian-transmission /var/lib/transmission-daemon
systemctl start transmission-daemon
精简系统常见问题
command not found: strip → apt install binutils
command not found: dpkg-deb → apt install dpkg-dev
- 编译卡死 → 去掉
-j 并行编译参数
- 依赖缺失 → 执行
apt install -f
- 服务无法启动 → 检查
/var/log/syslog 或权限
最终产物
transmission-common_4.0.6_all.deb
transmission-daemon_4.0.6_armhf.deb
transmission-cli_4.0.6_armhf.deb
可直接在任意 Ubuntu 20.04 armhf 系统上安装使用。