一、概述 Transmission是一个轻量级、跨平台、开源的 BitTorrent 客户端,官网地址是https://transmissionbt.com/ ,源码地址是https://github.com/transmission/transmission ,当前最新版本是3.0。
其实现了BT协议的几乎全部功能,覆盖了Linux、MacOS、Windows等所有主流操作系统,核心组件包括:
1个基于MacOS的Native Application
2个基于Linux的Native Application,分别支持 GTK GUI和 QT GUI
1个基于Linux的守护服务,用于服务器或路由器的后台服务
1个WEB UI前端界面,通过Json RPC接口服务提供浏览器访问
二、Centos的安装配置方法 下面以Centos为例,介绍其安装和配置的基本步骤。
1. 软件包安装 最简便的方法是使用EPEL源,简单粗暴就是:yum install transmission,当然严谨一点就是:
1 yum install transmission-daemon
2. 系统自启动 transmission-daemon支持systemd启动方式。
1 2 systemctl start transmission-daemon --now systemctl status transmission-daemon
如果后台服务正常启动,可以看到如下启动信息:
1 2 3 4 5 6 7 8 9 10 11 [root@test transmission]# systemctl status transmission-daemon ● transmission-daemon.service - Transmission BitTorrent Daemon Loaded: loaded (/usr/lib/systemd/system/transmission-daemon.service; disabled; vendor preset: disabled) Active: active (running) since 六 2022-04-16 22:10:31 CST; 34min ago Main PID: 12051 (transmission-da) Status: "Idle." CGroup: /system.slice/transmission-daemon.service └─12051 /usr/bin/transmission-daemon -f --log-error 4月 16 22:10:31 test.caogo.local systemd[1]: Starting Transmission BitTorrent Daemon... 4月 16 22:10:31 test.caogo.local systemd[1]: Started Transmission BitTorrent Daemon.
3. 运行监控 后台服务启动成功后,可以看到占用tcp/udp 51413作为BT通信端口,占用tcp 9091端口用于访问Web UI。
1 2 3 4 5 [root@test lib]# netstat -tunpl |grep transmission tcp 0 0 0.0.0.0:51413 0.0.0.0:* LISTEN 11846/transmission- tcp 0 0 0.0.0.0:9091 0.0.0.0:* LISTEN 11846/transmission- tcp6 0 0 :::51413 :::* LISTEN 11846/transmission- udp 0 0 0.0.0.0:51413 0.0.0.0:* 11846/transmission-
此时,通过浏览器打开http://<IP地址>:9091,就可以看到Web UI的局面了。
三、Transmission软件包的构成分析 最简便的方法是使用EPEL源,通过yum search transmission搜索,主要有以下软件包:
transmission-common: 核心组件,包含1个 Web GUI 和 4个命令行程序:transmission-create | edit | remote | show
transmission-daemon: = transmission-common + 1个后台守护程序transmission-daemon
transmission-cli: = transmission-common + 1个系统配置命令行程序transmission-cli
transmission-gtk:= transmission-common + 基于GTK GUI的Applicaition
transmission-qt:= transmission-common + 基于Qt GUI的Applicaition
transmission: = 常用安装包名,默认采用GTK,基本等于transmission-gtk
通过yum info transmission-common可以查看该软件包的基本信息。 通过repoquery -ql transmission-common.x86_64,可以查看该软件包的全部文件信息。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 [root@test transmission]# yum info transmission-common 已加载插件:fastestmirror Loading mirror speeds from cached hostfile 已安装的软件包 名称 :transmission-common 架构 :x86_64 版本 :2.94 发布 :9.el7 大小 :3.0 M 源 :installed 来自源:epel 简介 : Transmission common files 网址 :http://www.transmissionbt.com 协议 : MIT and GPLv2 描述 : Common files for Transmission BitTorrent client sub-packages. It includes : the web user interface, icons and transmission-remote, transmission-create, : transmission-edit, transmission-show utilities. [root@test transmission]# repoquery -ql transmission-daemon.x86_64 /usr/bin/transmission-daemon /usr/lib/systemd/system/transmission-daemon.service /usr/share/man/man1/transmission-daemon.1.gz /var/lib/transmission
由此可以分析得出transmission-daemon安装过程的主要步骤包括:
1. 创建默认用户 安装完成后检查/etc/passwd,发现添加了一个不能登录的系统用户transmission。
1 transmission:x:998:995:transmission daemon account:/var/lib/transmission:/sbin/nologin
HOME就是软件包的默认安装目录/var/lib/transmission。
2. 拷贝可执行程序 可执行程序的安装位置是/usr/bin/,可以发现有transmission-daemon等5个程序。
1 2 3 4 5 6 [root@localhost transmission-daemon]# ls -l /usr/bin/transmission* -rwxr-xr-x 1 root root 560880 5月 18 2020 /usr/bin/transmission-create -rwxr-xr-x 1 root root 577152 5月 18 2020 /usr/bin/transmission-daemon -rwxr-xr-x 1 root root 556456 5月 18 2020 /usr/bin/transmission-edit -rwxr-xr-x 1 root root 597360 5月 18 2020 /usr/bin/transmission-remote -rwxr-xr-x 1 root root 556464 5月 18 2020 /usr/bin/transmission-show
3. 拷贝软件文档 yum安装软件包时,通常在以下目录补充该软件的文档信息:
/usr/share/doc/:本软件使用说明书
/usr/share/icons/:本软件使用的各种尺寸的图标
/usr/share/licenses/:本软件的许可证文件
/usr/share/man/:man命令的帮助信息
/usr/share/pixmaps/:本软件Logo的位图
4. 拷贝Web UI Transmission的Web UI的入口文件存储在/usr/share/transmission/web/index.html,其结构与普通网站一致:
1 2 3 4 5 6 7 8 web ├── images ├── index.html ├── javascript ├── LICENSE └── style ├── jqueryui └── transmission
5. 设置系统启动服务 采用systemd的启动方式,服务配置文件是/usr/lib/systemd/system/transmission-daemon.service
1 2 3 4 5 6 7 8 9 10 11 12 [Unit] Description=Transmission BitTorrent Daemon After=network.target [Service] User=transmission Type=notify ExecStart=/usr/bin/transmission-daemon -f --log-error ExecReload=/bin/kill -s HUP $MAINPID [Install] WantedBy=multi-user.target
6. 设置软件包的数据目录 Transmission-daemon的配置文件隐藏在$HOME/.config/transmission-daemon/,而不是常规的/etc/ HOME的目录结构如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 [root@test transmission]# tree /var/lib/transmission -a /var/lib/transmission ├── .config/ # 配置文件目录 │ └── transmission-daemon/ │ ├── blocklists/ # 各个种子文件的数据块信息 │ ├── resume/ # 各个种子文件的运行状态 │ ├── settings.json # 主配置文件,json格式 │ ├── stats.json # 当前系统运行状态,json格式 │ ├── dht.dat # 存储DHT节点信息 │ └── torrents/ # 种子文件的存储目录 ├── Downloads/ # 下载数据文件的存储目录 └── .pki/ └── nssdb/
四、Transmission跨平台技术方案分析 Transmission core作为核心引擎,负责实现BT协议的全部功能,其底层依赖两个外部库函数:
libevent:一个异步事件处理软件库。libevent提供了一组应用程序编程接口(API),允许开发者为事件注册回调函数,用来取代网络服务器所使用的事件循环检查框架。
libnatpmp:一个NAT-PMP协议库。NAT-PMP(Network Address Translation Port Mapping Protocol)协议通过端口映射的方式获取外网主机的IP地址。
其对外提供服务主要通过以下接口实现:
JSON RPC Server:提供网络远程调用接口,以JSON格式
Web App Server:基于通用Web Server,以Web形式通过网络App应用服务接口
Lib Transmission:提供C语言的库函数接口,仅能用于Native Application
以上各软件包的技术依赖关系参见Transmission技术架构
1. MacOS Transmission以Native Application的方式发布,形态是一个DMG安装包。 开发了一个基于GTK GUI的Native GUI,直接采用Transmission core提供的Lib库函数。
Mac OS平台的配置文件目录存在差异,每个种子文件的状态信息位于:~/Library/Application Support/Transmission,而全局配置文件位于:~/Library/Preferences/org.m0k.transmission.plist
2. Windows Transmission以Native Application的方式发布,形态是一个MSI安装包,分为32位和64位两个版本。 开发了一个基于Qt GUI的Native GUI,注意其采用的是JSON RPC接口服务,需要网络组件支持。
3. Linux桌面版 Linux桌面系统的市场份额很少,但是很庞杂:
KDE:排名第一,基于Qt GUI开发
GNOME:简单速度快,红帽等Linux发行版常用,基于GPK GUI开发 此外,GNOME还有多个不同版本的变种,包括Unity、MATE、Cinnamon等
Qt GUI和GPK GUI的配置文件都存储在:$HOME/.config/transmission/
4. Linux服务器 安装transmission-daemon提供后台服务,再通过Web UI提供管理界面是最直接的方案。 本机也可以通过transmission-cli提供一个字符界面的管理工具,但是没有人有兴趣使用如此简陋的工具。
transmission-cli的配置文件存储在:$HOME/.config/transmission-cli/
5. 嵌入式设备 群晖NAS、西部数据NAS、D-Link路由器等嵌入式设备都是基于Linux核心,因此也可以安装Transmission。 以西部数据NAS为例,MyBookLive、MyCloud在技术上都可支持,但由于不属于官方项目,因此版本升级时经常被限制。 具体安装方法参见http://mybookworld.wikidot.com/optware
五、常见问题的解决方案 1. UDP缓冲区不足导致Daemon启动失败 如果启动失败,并产生如下信息,通常是操作系统的UDP网络缓冲区不足
1 2 UDP Failed to set receive buffer: requested 4194304, got 425984 (tr-udp.c:84) UDP Failed to set send buffer: requested 1048576, got 425984 (tr-udp.c:95)
解决办法是通过sysctl -p命令来检查,并修改位于/etc/sysctl.conf的内核参数
1 2 3 echo 'net.core.rmem_max = 16777216' >> /etc/sysctl.conf echo 'net.core.wmem_max = 4194304' >> /etc/sysctl.conf sysctl -p
2. Web UI界面无法打开 如果浏览器提示“403: Forbidden”错误信息,并提示“Unauthorized IP Addres”,通常是因为默认只允许来自本机127.0.0.1的白名单访问。 解决方法是:
停止守护进程,否则修改无法存盘;
1 systemctl stop transmission-daemon
编辑配置文件,修改rpc-whitelist-enabled为false
1 vi /var/lib/transmission/.config/transmission-daemon/settings.json
重新启动守护进程,并打开浏览器正常访问。
1 systemctl start transmission-daemon
附录一:Transmission 全量配置参数 以 Centos 7为例, 默认配置文件路径:/var/lib/transmission/.config/transmission-daemon/settings.json 默认下载文件目录:/var/lib/transmission/Downloads
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 "alt-speed-up" : 500, "alt-speed-down" : 500, "alt-speed-enabled" : false ,"alt-speed-time-begin" : 540,"alt-speed-time-day" : 127,"alt-speed-time-enabled" : true , "alt-speed-time-end" : 420, "bind-address-ipv4" : "0.0.0.0" ,"bind-address-ipv6" : "::" ,"blocklist-enabled" : true ,"blocklist-updates-enabled" : false ,"blocklist-url" : "http://www.example.com/blocklist" ,"cache-size-mb" : 4, "compact-view" : false ,"dht-enabled" : false , "download-dir" : "/var/lib/transmission/Downloads" , "download-queue-enabled" : true ,"download-queue-size" : 5,"encryption" : 1, "idle-seeding-limit" : 30,"idle-seeding-limit-enabled" : false ,"incomplete-dir" : "/var/lib/transmission/Downloads" , "incomplete-dir-enabled" : false ,"inhibit-desktop-hibernation" : true ,"lpd-enabled" : false , "main-window-height" : 500,"main-window-is-maximized" : 0,"main-window-width" : 615,"main-window-x" : 337,"main-window-y" : 211,"message-level" : 2,"open-dialog-dir" : "/home/yys/\u684c\u9762" ,"peer-congestion-algorithm" : "" ,"peer-limit-global" : 240, "peer-limit-per-torrent" : 60, "peer-port" : 51413, "peer-port-random-high" : 65535,"peer-port-random-low" : 49152,"peer-port-random-on-start" : false , "peer-socket-tos" : "default" ,"pex-enabled" : false , "port-forwarding-enabled" : true ,"preallocation" : 1, "prefetch-enabled" : 1,"queue-stalled-enabled" : true ,"queue-stalled-minutes" : 30,"ratio-limit" : 2,"ratio-limit-enabled" : false ,"rename-partial-files" : true , "rpc-authentication-required" : true ,"rpc-bind-address" : "0.0.0.0" ,"rpc-enabled" : true ,"rpc-password" : "{c8c083168db9fff40b5136b6d0f3f4a864110a78\/oH51JaE" , "rpc-port" : 9091, "rpc-url" : "/transmission/" ,"rpc-username" : "transmission" , "rpc-whitelist" : "127.0.0.1" ,"rpc-whitelist-enabled" : true , "scrape-paused-torrents-enabled" : true ,"script-torrent-done-enabled" : false ,"script-torrent-done-filename" : "/home/yys" ,"seed-queue-enabled" : false ,"seed-queue-size" : 10,"show-backup-trackers" : true ,"show-extra-peer-details" : false ,"show-filterbar" : true ,"show-notification-area-icon" : false ,"show-options-window" : true ,"show-statusbar" : true ,"show-toolbar" : true ,"show-tracker-scrapes" : true ,"sort-mode" : "sort-by-age" ,"sort-reversed" : false ,"speed-limit-down" : 300, "speed-limit-down-enabled" : true , "speed-limit-up" : 30, "speed-limit-up-enabled" : true , "start-added-torrents" : false ,"statusbar-stats" : "total-ratio" ,"torrent-added-notification-enabled" : true ,"torrent-complete-notification-enabled" : true ,"torrent-complete-sound-enabled" : true ,"trash-can-enabled" : true ,"trash-original-torrent-files" : false ,"umask" : 18,"upload-slots-per-torrent" : 14"utp-enabled" : true , "watch-dir" : "/home/yys/\u4e0b\u8f7d" ,"watch-dir-enabled" : false
附录二:Samba SMB 文件共享服务 SMB(Server Message Block,服务器消息块)是一种计算机通信协议 (并非一款具体的软件产品),最初由 IBM 开发,用于在本地局域网 LAN 的不同计算机之间共享文件、打印机、串口等资源。
后来,Microsoft 对其进行了扩展和改进称为 CIFS(Common Internet File System,通用因特网文件系统),在 Windows 操作系统中得到广泛使用,并支持与其他操作系统实现文件共享。
Samba 是一个开源的软件产品,主要功能是为 Linux 服务器实现文件服务器、身份授权和认证、名称解析和打印服务等功能,其中包含了 SMB 协议的实现,它允许 Windows 客户访问 Linux 系统上的目录、打印机和文件(就像访问 Windows 服务器时一样)。参见 https://www.samba.org/
Samba 可以在 Linux 服务器上自动构建一个 domain 控制器,以直接使用 Windows 域中的用户凭据。
Samba 的早期版本使用 139 端口在 Windows 网络上建立会话和进行文件共享,但由于缺乏加密和身份验证的支持而存在安全风险。现代版本改用 445 端口,提供了更高的安全性和功能,包括对加密和身份验证的支持。
安装方法 Samba 可以直接使用 YUM 软件源进行安装,参见Centos 7 的 Samba 服务安装和配置详解 。 由于其使用了专用网络端口,注意关闭 selinux 和防火墙。
参数配置 Samba 的配置文件位于/etc/samba/smb.conf,初始配置信息为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 [global] workgroup = SAMBA security = user # 安全验证方式,可选:user, share, server, domain passdb backend = tdbsam # 后端鉴权方式,可选:smbpasswd, tdbsam, ldapsam printing = cups printcap name = cups load printers = yes cups options = raw [homes] comment = Home Directories valid users = %S, %D%w%S browseable = No read only = No inherit acls = Yes [printers] comment = All Printers path = /var/tmp printable = Yes create mask = 0600 browseable = No [print$] comment = Printer Drivers path = /var/lib/samba/drivers write list = @printadmin root force group = @printadmin create mask = 0664 directory mask = 0775
用户可以设置文件共享目录,方法是在配置文件中增加如下信息:
1 2 3 4 5 6 7 8 9 [transmission] comment = transmission # 连接服务器的提示信息 path = /var/lib/transmission/Downloads/ # 共享目录的绝对路径 public = yes # 允许公开 browseable = yes # 允许浏览目录 writable = yes # 允许写入 guest ok = yes # 允许 guest 登录,无需用户名和口令 create mask = 0644 directory mask = 0775
为了支持 guest 匿名登录,还需要修改 [global] 段落的配置信息,注释取消 passdb backend = tdbsam ,并增加以下信息,即以 transmission 用户身份读写文件。
1 2 map to guest = bad user guest account = transmission
启动方式 注意 Samba 的系统服务名称为smb.service,因此其启动方式为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 [root@Copy-of-VM-Centos7 ~]# systemctl enable --now smb Created symlink from /etc/systemd/system/multi-user.target.wants/smb.service to /usr/lib/systemd/system/smb.service. [root@Copy-of-VM-Centos7 ~]# systemctl status smb ● smb.service - Samba SMB Daemon Loaded: loaded (/usr/lib/systemd/system/smb.service; enabled; vendor preset: disabled) Active: active (running) since 六 2024-08-31 15:49:08 CST; 6s ago Docs: man:smbd(8) man:samba(7) man:smb.conf(5) Main PID: 1376 (smbd) Status: "smbd: ready to serve connections..." CGroup: /system.slice/smb.service ├─1376 /usr/sbin/smbd --foreground --no-process-group ├─1378 /usr/sbin/smbd --foreground --no-process-group ├─1379 /usr/sbin/smbd --foreground --no-process-group └─1380 /usr/sbin/smbd --foreground --no-process-group 8月 31 15:49:07 Copy-of-VM-Centos7.8-local systemd[1]: Starting Samba SMB Daemon... 8月 31 15:49:08 Copy-of-VM-Centos7.8-local smbd[1376]: [2024/08/31 15:49:08.961337, 0] ../../lib/util/become_daemon.c:136(daemon_ready) 8月 31 15:49:08 Copy-of-VM-Centos7.8-local systemd[1]: Started Samba SMB Daemon. 8月 31 15:49:08 Copy-of-VM-Centos7.8-local smbd[1376]: daemon_ready: daemon 'smbd' finished starting up and ready to serve connections
SMB 服务启动成功后,客户端 mac 电脑就可以通过 Finder - 前往 - 连接服务器,并输入smb://192.168.0.x 连接共享目录了!
附录三:关于Qt 和 GTK Qt 1991年,Haavard Nord 和 Eirik Chambe-Eng 开发了 Qt ,该工具包名为 Qt 是因为字母 Q 在 Haavard 的 Emacs 字体特别漂亮,而 t 代表 toolkit,灵感来自 Xt,X toolkit。 后来,两人成立了 Trolltech 公司(中文名是“奇趣科技”),2008年被 NOKIA 公司收购,以增强该公司在跨平台软件研发方面的实力,更名 Qt Software并 宣布开放 Qt 源代码, 2012年8月9日,Digia 宣布已完成对诺基亚 Qt 业务及软件技术的全面收购,并计划将 Qt 应用到 Android、iOS 及Windows 8 平台上。
Qt 的图形用户界面的基础是 QWidget。Qt 中所有类型的 GUI 组件如按钮、标签、工具栏等都派生自 QWidget,而QWidget 本身则为 QObject 的子类。Widget 负责接收鼠标,键盘和来自窗口系统的其他事件,并描绘了自身显示在屏幕上。每一个 GUI 组件都是一个 widget,widget 还可以作为容器,在其内包含其他 Widget。 使用 Qt 开发的软件,相同的代码可以在任何支持的平台上编译与执行,而不需要修改源代码。会自动依平台的不同,表现平台特有的图形界面风格。 Qt 开放源代码,并提供 LGPL 和 GPL 的自由软件用户协议,可以免费使用,但商业版需收取授权费。
KDE Plasma Workspaces 就是基于 Qt 开发的 Linux GUI,此外 Symbain、MeeGo 等手机厂商也采用 Qt 框架,但现在已经是 Android 的天下了!!!
GTK GTK(原名GTK+)最初是 GIMP 的专用开发库(GIMP Toolkit),后来发展为类 Unix 系统下开发图形界面的应用程序的主流开发工具之一。 GTK 是自由软件,并且是 GNU 计划的一部分。自 2019 年 2 月 6 日起,GTK+ 改名为 GTK。 GTK 使用 C 语言开发,但使用了面向对象技术,也提供了C++(gtkmm)、Perl、Ruby、Java 和 Python(PyGTK)绑定,其他的绑定有 Ada、D、Haskell、PHP和 所有的 .NET 编程语言。
GNOME 是以 GTK 为基础,就是说使用 GTK 做为其工具箱,Firefox 也是基于 GTK 开发的。
参考文献