作者归档:admin

git 使用小结

Git 是一个很好用的工具,相信不用我说大家也承认。以下记录一些会用到的命令行:

  • 创建 Git 仓库:git init
  • 克隆 Git 仓库:git clone /path/to/repository 或 git clone username@host:/path/to/repository
  • 克隆某一分支:git clone -b <branch> <remote git>
  • 将改动添加到缓存区:git add <filename> 或 git add *
  • Git commit: git commit -m “Commit Message”
  • 设置远端:git remote add origin <server>
  • 推送本地改动至远端:git push origin <branch>
    • 强制推送至远端:git push -f origin <branch
  • 添加分支:git checkout -b <branch name>
  • 切换回主分支:git checkout master
  • 删除分支:git branch -d feature_x

关于 qBittorrent 部分问题的记录

首先是这个反复弹出 Tracker Authentication 窗口的问题,这个是因为 Tracker 对未授权的种子返回了 HTTP/401 错误,导致 qb 弹出窗口要求验证。这是一个正常行为,如果不需要它:

  • 在 qBittorrent/src/base/bittorrent/torrenthandle.cpp 文件的 void TorrentHandle::handleTrackerErrorAlert(libtorrent::tracker_error_alert *p) 函数中注释掉关于 401 错误的两行即可。

然后就是在 qb 中有大量种子的情况下,同时开始会导致 Tracker 始终处于 “Not Working” 状态,如果一个一个启动,那么就是好的,这个应该是qb本身并发设计不良导致的问题。

控制 AWS p2 实例的 GPU 频率

AWS p2 实例虽然方便,不用本地买显卡,但是碰到比较大的网络,p2 开一天就得 50 块钱,还是有点肉疼的。那么,既然付了钱,就把实例的性能发挥到极致吧。

Tesla K80 显卡通常工作在 AutoBoost 模式,这个模式会动态调整显卡的频率,在很多情况下都比最大频率要低,并且显卡驱动默认的功率限制并没有被开到最大,因此这两点都会影响我们最终获得的性能。

设置显卡工作频率比较简单:

sudo nvidia-persistenced
sudo nvidia-smi --auto-boost-default=0
sudo nvidia-smi -ac 2505,875 #(2505,875) for p2; (877,1530) for p3; (2505,1177) for g3

关于功率的调整,首先我们要查看显卡的最大功率限制 nvidia-smi -q | grep 'Power Limit',如果是 p2 实例,发现这个值是 175W,而驱动默认的限制是 149W,我们需要提高这个限制,使用  nvidia-smi -pl 175 即可,如果权限不足,用 sudo 运行。

参考资料:

https://www.ibm.com/support/knowledgecenter/en/SSFHY8_5.5.0/com.ibm.cluster.essl.v5r5.essl100.doc/am5gr_nvidcap.htm
https://devblogs.nvidia.com/increase-performance-gpu-boost-k80-autoboost/
https://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/optimize_gpu.html

关于 ISLAND 游戏中时间轴的分析 (严重剧透,未完全通关者不建议阅读)

你相信这个世界是轮回的吗?说实话,我不相信。就算有,也应该要能够长到让人类进化出来的地步。不过不管你相不相信,ISLAND 这个游戏所描绘的就是这样一个轮回着的世界。
在花了近三个月的时间之后,我终于彻底通关了这个游戏。平心而论,剧本质量还是不错的,在当前这个黄油市场萌系当道,拔作遍地,吃枣药丸的大背景下,还能有这样一个全年龄、不卖画、配乐质量高、剧本充实的作品,实属难得。出于兴趣,我在玩的过程中整理了一下整个游戏的时间轴和世界观,一家之言,仅供参考。

之前说到,ISLAND 的世界观是一个轮回着的世界,这个世界以 40000 年为一个周期轮回着。在很久很久以前,这个世界的人们开发出了冷冻睡眠装置,并且有成品和设计图保留了下来。在那个世界中,一位名叫 Setsuna 的男性,也就是我们的男主,和一位名叫 Rinne 的女性相爱了,但是因为一些原因(可以说是命运),两人并没有结合,Rinne 最后走向了悲剧的结局,但直到最后Rinne仍然相信这转世之后她能和 Setsuna 相爱。Setsuna 相信了他的爱人,选择乘坐冷冻睡眠装置沉睡过去,并在两万年后再次醒来,试图改变Rinne悲惨的命运,在之前的很多次尝试中,他都没有成功,因此选择继续沉睡下去,直到游戏所描绘的 1999 年,他才真正完成了自己的使命,并选择继续沉睡下去,继续自己的旅行。

在游戏中我们看到的主要是 -20000 年到 1999 年之间的这段故事。游戏最开始看到的夏篇和 Sara、Karen 角色线对于后期冬篇和真夏篇的贡献其实并不是很大,毕竟这还是一个 GalGame,至少要能攻略女性角色才行。但是这些剧情引入了浦岛和岛上的传说(Setsuna 和 Rinne 相爱的故事),以及御三家的存在,这个对于后期的剧情都是有必要的因素。
如果攻略顺序正确的话,我们会首先完成 Karen 和 Sara 两条线,之后进入的 Rinne 线和 Re: 结局才是全篇的精华所在。游戏中的 Rinne 线被冬篇切割成了两部分,但是我认为前后两部分描述的是同一个时间点下发生的故事,因此将它们合并进行分析。具体的时间轴如下:

  • 在距今 40000 年的时候(-40000年),有一座岛(浦岛),Setsuna 在这座岛的夏天醒了过来,在沙滩上遇到了 Rinne(这里我们姑且称之为 R0),就如同传说中所描述的一样,两人相爱了,但是最终 R0 并没有走向幸福的结局,因此 Setsuna 选择继续沉睡下去。故事就这样发展到了 -20000 年。
  • 每个时代都会有模仿传说的人出现,Rinne 这样一个悲剧又幸福的女主角也不意外,毕竟这个角色还被赋予了拯救岛(世界)的使命,因此冬篇的女主角 Rinne(这里称之为 R1)出现了。在距今20000 年的时候,世界已经崩坏,人类生存的区域被压缩到了地下。为了生存,人们建立起了巨大的地下建筑,在里面苟且地活着,R1 继承了家中流传下来的一张光盘,她坚信这张光盘中的设计图能够让她拯救这个快要崩坏的世界。这时候,她遇到了从过去睡眠而来的 Setsuna,发生了很多事情,不过这都不重要。重要的是,由于 Setsuna 的到来,和冷冻睡眠装置成品的发现,两人一起完成了 R1 所认为的时间机器(实际上是冷冻睡眠装置)原型的制造。由于机器被制造了出来,Rinne 决定使用它拯救这个世界,因此 Setsuna 继续沉睡了下去,在沉睡之时,R1 给了他那张带有设计图的光盘,这也就是在 1999 年我们的男主浑身赤裸在海滩上所带着的唯一的东西。
  • -20000 年的 Rinne(R1)也没有闲着,在 Setsuna 沉睡过去之后,自己使用 Setsuna 带来的那个完整版的冷冻睡眠装置沉睡了过去,不幸的是,她比 Setsuna 醒得要早一些,在 1989 年之前,她就已经到达了浦岛。
  • 1989 年之前的浦岛,是一个被煤纹病肆虐,由御三家掌控的与世隔绝的岛屿。御三家之一御原家,由御原典正和御原玖音所掌控着。在这个家中有一个女佣,实际上就是之前沉睡醒来的 R1,生下了一个女孩,由于模仿岛上留下的传说,将其命名为Rinne(R2)。御原家实际上还有一个哥哥,御原切那,由于患有煤纹病被囚禁在海滩上的小屋里。御原玖音不知道什么原因,对 R1 和 R2 非常反感,一直欺压二人。在1989年暴风雨大作的某一天,御原玖音带着 R2 一起跳海自杀,玖音落入海中身亡,R2 却奇迹般地活了下来,被御原切那所救,但是却丧失了记忆,之后两人度过了 5 年的时间,R2 也逐渐开朗了起来。1994 年 2 月 28 日,一个暴风雪的日子,R2 想给切那送礼物,但是脚下一滑,掉入了海里,切那找到了她,但是两人一起漂流到了暴龙岛(一个传说中只在暴雨天才能看到的岛屿,实际上是 20000 年前 ISLAND 的遗迹),两人发现了一艘小船,但是小船只容下一人的大小,切那把生还的希望给了凛音,自己则去岛上寻找救援。然而在那个无人岛上怎么可能找到救援,加上切那身患煤纹病,在太阳照射后就会发作,因此最终死去,变成了岛上的一堆白骨,凛音(R2)却因此沉睡了五年(遭遇了了神隐)。关于这一点,我个人的理解是那艘小船就是 ISLAND 中 R1 工房里停留着的冷冻睡眠装置。此外游戏中对 R1(女佣)的描述就是来历不明,我认为可能是苏醒后从暴龙岛上漂流而来的,冷冻睡眠装置就停在了那里。
  • 之后时间就到了 1999 年,凛音(R2)苏醒过来漂流回了浦岛,这时候,御原玖音已经身亡,但是御原典正为了不让御三家的平衡被破坏,强令女佣(R1)作为玖音生活下去,因此指认了漂流回来的 R2 为自己的女儿。同年,Setsuna 苏醒了过来并漂流到了岛上,发生了游戏一开始夏篇的故事。按照 Re: 结局的设定,主线应该是 Setsuna 认出了之前的 R1,并且发现了她仍然在研究时间机器的事实,并将之前的设计图告诉了她。R1 继续探求着时间机器而活在岛上,而 Setsuna 则因自身的兴趣而沉睡过去开始了新的旅行。

这是大致的时间轴,直线代表故事,曲线则是沉睡了过去。

故事到这里就结束了,Setsuna 自始至终只有一个,而 Rinne 我认为则有很多个(R0、R1、R2…)。故事中说 R1 是由其母亲所生,R2 是由 R1 所生,但是 R1 的母亲来自于哪里则没有作出说明。关于这一点我有一个大胆的猜测,传说中的说法是 Rinne 沉睡了过去,期待转世能够和 Setsuna 结合,转世在这里指的就是生下一个女儿,并让她继承 Rinne 的名字,等待 Setsuna 的到来。那么按照这个假设,R0 其实是 R1 的母亲,沉睡了 20000 年在 ISLAND 上生下了 Rinne(R1),之后 R1 沉睡 20000 年之后到达了浦岛,生下了 R2,由于 Setsuna  和 R1 相认,认为已经完成了自己的任务,因此,这个轮回转世的循环就被打破,两人可以不再被传说所束缚,可以自由地追寻自己的人生。

最后关于十几个 BE 稍微说一点东西,Sara 线有很多 BE,不过那些我认为意义不大,Sara 线本身就让人有些摸不着头脑,其母亲伽蓝堂玛利亚/有马雨兰的故事也不是很完整,因此就当是充话费送的吧,整条线最大的贡献大概就是引入了一大堆(并没有什么用的)时空穿越理论。但是在夏篇中“未来预想图”这个 BE 却引起了我的注意,在这个 BE 中 Setsuna 和 Rinne 生下了一个孩子,在给孩子讲故事的时候,说到故事由三部构成,自己在这个故事中已经活了几百年(和之前的轮回假设完全符合)。我认为,这个 BE 实际上是 Re: 结局之后的一个延续,Setsuna 在 20000 年后再次醒来,遇到了一个名为 Rinne 的少女,两人结合并生下了女儿,之后就随玩家自由想象了。

最后的最后,一起期待一下 ISLAND 的动画会是怎么样的吧。

更新:

关于 1994 年 2 月 28 日凛音和切那掉海里那段,我有一点忘掉了。凛音在那天要给御原切那送礼物,去了小房子,然后回不去了,切那就来温暖了凛音(打了一炮),然后早上被御原典正发现了,但是在出门的时候,御原典正晒到了太阳所以煤纹病发作,这时凛音听到海边的切那在喊她,所以就跑了过去,接下来俩人才掉到了海里,漂流到了暴龙岛,然后才有之后一个人的小船、神隐这些故事。

综上,男主接盘论太 TM 有道理了

修改版 qbittorrent 封禁迅雷、百度等吸血客户端

写在前面

公网分流是否有必要封禁迅雷,这个问题我自己也没有一个很明确的答案。支持者认为,迅雷对于整体 BT 社区的健康发展完全没有贡献,给他们上传完全是浪费带宽。但是从另外一个角度来说,一个字幕 / Raw 组需要分流人员,是为了让观众能够更快地下载到本组的作品,使用迅雷下载的人也是观众,封禁他们就和建立分流组的初衷相悖。我个人倒是倾向于赞成封禁迅雷,因为从我的经验来看,迅雷的 BT 模块存在严重的问题,其可见进度永远是 0,这样让会让正常的客户端无所适从,无法就当前的 peer 列表情况选择合适的上传策略,从整体上来说,是不利于分享的。

下面进入正题

这篇文章想要介绍的是一个 qbittorrent 的修改版,作者为其加入了自动封禁迅雷的能力,非常适合我的使用情况。原发布帖子在这里,GitHub的代码树则在这里。我推荐使用 v3_3_x 这个 Branch,因为相对全是 bug 的 qb4,3 要稳定很多。

具体编译方面,参照 qb 官方的文档编译即可,记得使用 checkinstall 帮助自己管理软件包。

emmmm,本来还以为可以写很多,结果发现没几句话就写完了。主要目的本来就是为了介绍一下这个修改版,至于是否使用,各位就见仁见智了。

使用 checkinstall 代替 make install 编译安装

在 Linux 上编译安装时,我总会有这样一个感觉,make install 放了很多文件到我的系统里,如果我哪天想把这些东西删掉,该怎么做。有人可能会说,make uninstall 不就好了,但是在绝大多数情况下,并没有人会去写这些卸载程序。

这时候就轮到 checkinstall 这个小程序出场了,它可以跟踪 make install 执行的步骤,并且生成相应的 deb/rpm 包,然后就可以使用包管理器愉快地卸载掉编译安装的程序。

以安装 qbittorrent 3.3.16 为例,简要介绍一下流程。

系统环境

Ubuntu 16.04, qbittorrent 3.3.16

准备

首先需要安装 checkinstall,在 apt 的帮助下,这件事并不难,apt install checkinstall 即可。

安装 qbittorrent

首先按照之前的一篇文章处理一下源码和依赖,之后只需要做一个很小的改动,将 make install 这个命令换成 checkinstall,之后它会自动调用 make install 并进行跟踪,完成安装操作。

之后会让你输入该程序包的描述,照做就好:

root@server:~/Software/qbittorrent-3.3.16# checkinstall

checkinstall 1.6.2, Copyright 2009 Felipe Eduardo Sanchez Diaz Duran
           This software is released under the GNU GPL.


The package documentation directory ./doc-pak does not exist. 
Should I create a default set of package docs?  [y]: y

Preparing package documentation...OK

Please write a description for the package.
End your description with an empty line or EOF.
>> qbittorrent 3.3.16
>> 

*****************************************
**** Debian package creation selected ***
*****************************************

This package will be built according to these values: 

0 -  Maintainer: [ root@ns3284041 ]
1 -  Summary: [ qbittorrent 3.3.16 ]
2 -  Name:    [ qbittorrent ]
3 -  Version: [ 3.3.16 ]
4 -  Release: [ 1 ]
5 -  License: [ GPL ]
6 -  Group:   [ checkinstall ]
7 -  Architecture: [ amd64 ]
8 -  Source location: [ qbittorrent-3.3.16 ]
9 -  Alternate source location: [  ]
10 - Requires: [  ]
11 - Provides: [ qbittorrent ]
12 - Conflicts: [  ]
13 - Replaces: [  ]

Enter a number to change any of them or press ENTER to continue: 

Installing with make install...

然后进行的就是标准的 make install 操作,安装完成之后,会输出一些日志,告诉你可以用 dpkg 将它卸载。

======================== Installation successful ==========================

Copying documentation directory...
./
./Changelog
./COPYING
./README.os2
./AUTHORS
./README.md
./INSTALL
./TODO
./NEWS
./doc/
./doc/qbittorrent-nox.1
./doc/qbittorrent.1

Copying files to the temporary directory...OK

Stripping ELF binaries and libraries...OK

Compressing man pages...OK

Building file list...OK

Building Debian package...OK

Installing Debian package...OK

Erasing temporary files...OK

Writing backup package...OK
OK

Deleting temp dir...OK


**********************************************************************

 Done. The new package has been installed and saved to

 /root/Software/qbittorrent-3.3.16/qbittorrent_3.3.16-1_amd64.deb

 You can remove it from your system anytime using: 

      dpkg -r qbittorrent

**********************************************************************

然后我们来看一看 dpkg 中是否已经有了 qbittorrent

root@server:~/Software/qbittorrent-3.3.16# dpkg -l|grep qbit
ii  qbittorrent                          3.3.16-1                                   amd64        qbittorrent 3.3.16

之后如果要卸载,执行 dpkg -r qbittorrent 即可,干净又方便。

参考资料

https://help.ubuntu.com/community/CheckInstall

其实 Ubuntu 还有两个更激进的工具,AutoDebAutoApt,有兴趣也可以了解一下

 

在 Amazon Linux PV 上编译 Xmrig

准确地说,也是我闲着蛋疼,想试试 AWS 跑 Xmrig 的算力如何。结论说在前面,别指望用 AWS 挖矿赚钱,本都回不了。不过,编译 Xmrig 的过程确实值得记录一下。

首先,AWS 的实例有两种虚拟化形式,一种是 HVM,另一种是 PV,两个都是基于 Xen 的架构,一种比较好理解的方式就是将 HVM 比作 KVM,而 PV 就相当于 OpenVZ,是一种共享内核的架构。

如果要使用一些比较老的实例类型,比如 m1 c1 这样的实例,很可能遇到一种情况,就是他们不支持 HVM 全虚拟化架构,需要使用 PV 半虚拟化,但是问题在于 AWS 现在已经逐步移除对 PV 的支持,仅仅剩下 Amazon Linux 还可以使用这个架构,没有我比较熟悉的 Ubuntu。这给我尝试编译造成了比较大的麻烦。不过好在毛球的文档比较齐全,还是有惊无险地搞定了。

首先处理依赖,Amazon Linux 使用 yum 包管理器,也就是 RHEL/CentOS 用的那款,说实话我不是很喜欢,不过也没办法。此外,虽然使用 yum,其源包库并不是 CentOS 的,这个要注意。

sudo yum install -y epel-release
sudo yum install -y git make cmake gcc gcc-c++ libstdc++-static libmicrohttpd-devel libtool

curl -sSL https://github.com/libuv/libuv/archive/v1.8.0.tar.gz | sudo tar zxfv - -C /usr/local/src
cd /usr/local/src/libuv-1.8.0
sudo sh autogen.sh
sudo ./configure
sudo make -j$(nproc)
sudo make install

Xmrig 的编译需要 libuv-static 这个包,很遗憾 AWS 源中并没有这个包,我们只能选择编译安装,命令如上所示。

之后则是比较通用的 git clone 部分,注意去除作者的强制捐赠选项。

git clone https://github.com/xmrig/xmrig
vi xmrig/src/donate.h
# constexpr const int kDonateLevel = 0;
vi xmrig/src/Options.cpp
# case 1003: /*donate-level*/
# if (arg < 0 || arg > 99)

之后进行编译

cd ~/xmrig
sudo ldconfig
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DUV_LIBRARY=/usr/local/lib/libuv.so
make -j$(nproc)

这样就搞定了,再次重申一次,即使使用最便宜的上一代实例 c1 或者 m1(w/o AES-NI),也不可能回本,挖出的矿最多就是实例费用的一半,所以想发财的人,还是别看这篇文章了。

nginx 监听 IPv6 端口

我一直以为,我的 VPS 配置了 IPv6,在 DNS 记录中添加了 AAAA 解析就可以完成双栈网络的架设,然而在数次测试中,IPv6 地址一直都无法正常解析。现在才发现,nginx 需要调整一些配置才能正常地监听 IPv6 端口。

正常情况下,我们的 nginx.conf 文件中会有这样的两行:

listen 80;
listen 443 ssl http2;

这种情况下,实际上是无法监听 IPv6 端口的,我们需要添加如下两行:

listen [::]:80 ipv6only=on;
listen [::]:443 ipv6only=on ssl http2;

运行 systemctl restart nginx (service nginx restart) 之后,就可以正常监听 IPv4 和 IPv6 的端口了,我们可以用 netstat 来确认一下:

# netstat -nlp | grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      9396/nginx.conf 
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN      9396/nginx.conf 
tcp6       0      0 :::80                   :::*                    LISTEN      9396/nginx.conf 
tcp6       0      0 :::443                  :::*                    LISTEN      9396/nginx.conf 

之前是没有下面两行监听的,现在有了,说明配置成功。

Update:

在最近的配置中,发现 ipv6only 这个选项是不需要的,根据 nginx 的文档,这个选项默认值就是 on,以及这个选项在整个 nginx 配置文件中只能设置一次,所以如果有多个 vhost,这样设置反而会导致错误。

为 HE TunnelBroker 添加更多的 IPv6 地址

我们知道,通过 HE 的 TunnelBroker 可以使没有 IPv6 连接性的服务器获得 IPv6 地址,但是样例配置通常只有一个 IP 地址,而我们实际得到是整个 /64 的 block,那么如何添加更多的 IP 地址呢?

一般来说,样例配置是这样的:

auto he-ipv6
iface he-ipv6 inet6 v4tunnel
        address </64 block>::2
        netmask 64
        endpoint <endpoint>
        local <local address>
        ttl 255
        gateway </64 block>::1

只要在后面添加两行即可:

up ip -6 addr add <another IP> dev $IFACE
down ip -6 addr del <another IP> dev $IFACE

 

编译安装 qBittorrent 3.3.16 并处理依赖

写在前面

我想说,开源软件都是垃圾。但是问题在于,很多时候我们并没有比垃圾更好的东西用。此外,本文中处理依赖的方式为权宜之计,因此会给出依赖的下载

qb 自从更新了 4.0,bug 就一天比一天多。最近 PPA 上最新的 4.0.3 版本的 build 在安装之后,除了之前的各种 bug 以外,甚至无法正常启动,好不容易启动了以后,也不能正常地加载种子列表,我实在是不想用了。然而,官方的 PPA build 中并没有老版本的 binary,无奈之下,只好自己编译。

此次,我选择了相对稳定的 3.3.16 版本。

准备

在官方的 SourceForge 页面上获取一份源代码(这里是我自己的缓存),并且解压到某个目录下。

qb 的编译安装需要自己处理 libtorrent 的依赖,关于这点,由于我需要保持和本地 Deluge PPA 版本的兼容,因此我并不愿意选择完全从头编译的方法,只能尝试使用 Deluge PPA 的 libtorrent binary,因此遇到了一些问题。

在这里需要谈一谈 pkg-config 这个组件,由于 Linux 存在编译依赖的问题,在没有包管理器的情况下,如果想要在编译时看到链接库所需要的 CFLAGS,需要通过 pkg-config 这个程序来查看,在编译安装第一步执行的 ./configure 完成的一部分工作就是由 pkg-config 得到这些 FLAGS。在之前说过,我的盒子上已经安装了 libtorrent-rasterbar8,也就是所需要的二进制库已经安装,但是在编译前预配置时仍然返回找不到 libtorrent。经过查询,发现是因为 pkg-config 无法返回 linking 所需的编译器标志,也就是这个 binary 并没有注册到系统。所幸在一个 AskUbuntu 答案中,我发现了 libtorrent-rasterbar-dev 这个包,里面向系统注册了编译所需的头文件,安装之后,就没有出错了。

需要注意的是,仍然需要安装 Deluge PPA 对应的 libtorrent-rasterbar-dev 版本并通过 apt-mark hold 防止升级。

除了 libtorrent,还有其他的几个依赖包,不过都可以通过 apt 完成:

sudo apt-get install build-essential pkg-config automake libtool git
sudo apt-get install libboost-dev libboost-system-dev libboost-chrono-dev libboost-random-dev libssl-dev
sudo apt-get install qtbase5-dev qttools5-dev-tools libqt5svg5-dev

编译

这个相对简单

./configure
make -j$(nproc)
sudo make install

即可

在输出了一大堆日志之后,完成了安装

cd src/ && ( test -e Makefile || /usr/lib/x86_64-linux-gnu/qt5/bin/qmake /root/Software/qbittorrent-3.3.16/src/src.pro QMAKE_LRELEASE= -o Makefile ) && make -f Makefile install
make[1]: Entering directory '/root/Software/qbittorrent-3.3.16/src'
install -m 644 -p /root/Software/qbittorrent-3.3.16/doc/qbittorrent.1 /usr/local/share/man/man1/
install -m 644 -p /root/Software/qbittorrent-3.3.16/src/icons/qbittorrent.desktop /usr/local/share/applications/
install -m 644 -p /root/Software/qbittorrent-3.3.16/dist/unix/qbittorrent.appdata.xml /usr/local/share/appdata/
install -m 644 -p /root/Software/qbittorrent-3.3.16/dist/unix/menuicons/16x16/apps/qbittorrent.png /usr/local/share/icons/hicolor/16x16/apps/
install -m 644 -p /root/Software/qbittorrent-3.3.16/dist/unix/menuicons/22x22/apps/qbittorrent.png /usr/local/share/icons/hicolor/22x22/apps/
install -m 644 -p /root/Software/qbittorrent-3.3.16/dist/unix/menuicons/24x24/apps/qbittorrent.png /usr/local/share/icons/hicolor/24x24/apps/
install -m 644 -p /root/Software/qbittorrent-3.3.16/dist/unix/menuicons/32x32/apps/qbittorrent.png /usr/local/share/icons/hicolor/32x32/apps/
install -m 644 -p /root/Software/qbittorrent-3.3.16/dist/unix/menuicons/36x36/apps/qbittorrent.png /usr/local/share/icons/hicolor/36x36/apps/
install -m 644 -p /root/Software/qbittorrent-3.3.16/dist/unix/menuicons/48x48/apps/qbittorrent.png /usr/local/share/icons/hicolor/48x48/apps/
install -m 644 -p /root/Software/qbittorrent-3.3.16/dist/unix/menuicons/64x64/apps/qbittorrent.png /usr/local/share/icons/hicolor/64x64/apps/
install -m 644 -p /root/Software/qbittorrent-3.3.16/dist/unix/menuicons/72x72/apps/qbittorrent.png /usr/local/share/icons/hicolor/72x72/apps/
install -m 644 -p /root/Software/qbittorrent-3.3.16/dist/unix/menuicons/96x96/apps/qbittorrent.png /usr/local/share/icons/hicolor/96x96/apps/
install -m 644 -p /root/Software/qbittorrent-3.3.16/dist/unix/menuicons/128x128/apps/qbittorrent.png /usr/local/share/icons/hicolor/128x128/apps/
install -m 644 -p /root/Software/qbittorrent-3.3.16/dist/unix/menuicons/192x192/apps/qbittorrent.png /usr/local/share/icons/hicolor/192x192/apps/
install -m 644 -p /root/Software/qbittorrent-3.3.16/dist/unix/menuicons/16x16/status/qbittorrent-tray.png /usr/local/share/icons/hicolor/16x16/status/
install -m 644 -p /root/Software/qbittorrent-3.3.16/dist/unix/menuicons/22x22/status/qbittorrent-tray.png /usr/local/share/icons/hicolor/22x22/status/
install -m 644 -p /root/Software/qbittorrent-3.3.16/dist/unix/menuicons/24x24/status/qbittorrent-tray.png /usr/local/share/icons/hicolor/24x24/status/
install -m 644 -p /root/Software/qbittorrent-3.3.16/dist/unix/menuicons/32x32/status/qbittorrent-tray.png /usr/local/share/icons/hicolor/32x32/status/
install -m 644 -p /root/Software/qbittorrent-3.3.16/dist/unix/menuicons/36x36/status/qbittorrent-tray.png /usr/local/share/icons/hicolor/36x36/status/
install -m 644 -p /root/Software/qbittorrent-3.3.16/dist/unix/menuicons/48x48/status/qbittorrent-tray.png /usr/local/share/icons/hicolor/48x48/status/
install -m 644 -p /root/Software/qbittorrent-3.3.16/dist/unix/menuicons/64x64/status/qbittorrent-tray.png /usr/local/share/icons/hicolor/64x64/status/
install -m 644 -p /root/Software/qbittorrent-3.3.16/dist/unix/menuicons/72x72/status/qbittorrent-tray.png /usr/local/share/icons/hicolor/72x72/status/
install -m 644 -p /root/Software/qbittorrent-3.3.16/dist/unix/menuicons/96x96/status/qbittorrent-tray.png /usr/local/share/icons/hicolor/96x96/status/
install -m 644 -p /root/Software/qbittorrent-3.3.16/dist/unix/menuicons/128x128/status/qbittorrent-tray.png /usr/local/share/icons/hicolor/128x128/status/
install -m 644 -p /root/Software/qbittorrent-3.3.16/dist/unix/menuicons/192x192/status/qbittorrent-tray.png /usr/local/share/icons/hicolor/192x192/status/
install -m 644 -p /root/Software/qbittorrent-3.3.16/dist/unix/menuicons/128x128/apps/qbittorrent.png /usr/local/share/pixmaps/
install -m 755 -p qbittorrent /usr/local/bin/qbittorrent
strip /usr/local/bin/qbittorrent

Known Issues

降级之后,不用担心配置文件的问题。无论是 apt-get purge(会移除 /etc 下的配置文件),还是 apt-get remove(不移除配置文件)的方式卸载新版本 qb,都不会影响 $HOME 下的用户配置文件,因此种子列表和配置并不会丢失。

降级之后可能发生种子列表 GUI 紊乱的问题,会出现大量的空白,这个把所有的信息都勾上显示出来,再取消即可解决。

所有的种子的分享率限制可能会莫名其妙变成 0,如果发现无法启动种子,一直保持 Completed 状态,可以检查一下种子的分享率限制(不是 qb 全局)。

References

https://github.com/qbittorrent/qBittorrent/wiki/Compiling-qBittorrent-on-Debian-and-Ubuntu

https://askubuntu.com/questions/837960/how-to-install-qbittorrent-in-ubuntu-16-10

https://askubuntu.com/questions/231562/what-is-the-difference-between-apt-get-purge-and-apt-get-remove

https://sourceforge.net/projects/qbittorrent/files/qbittorrent/qbittorrent-3.3.16/