apt反转小工具

我的工作桌面是xfce4,因为电脑太旧了,一台2010年的macbook air,内存只有2G,确实很有点为难它跑现代华丽的桌面,如gnome3,kde5。
正因为如此,我非常注意洁净,原谅没有钱换台好的电脑。试用gnome3后,卸载掉gnome3时发现,残留了几百个软件包在系统中。
必须有一个软件来帮我干这件事情,于是有了这个。
我只是业余爱好学习编程,目的也是解决我自己的一些问题,代码质量和各种逻辑,必然相当低下,请大度的宽容我,谢谢。

使用python3.5.3完成,电脑必须有python3,针对amd64架构。
使用方法:

  1. 下载undoapt.py,放在任意位置
  2. 给可执行权限:chmod 755 undoapt.py
  3. 创建链接方便执行:sudo ln -s 你的位置/undoapt.py /usr/bin/unapt
  4. 可以愉快的执行了:unapt xxx

共有三个子命令:
help:帮助
history:显示你的所有安装历史:有ID, 时间,命令行和包个数。
info ID: 显示history出来的对应ID的详细命令情况。
undo ID:反转对应的history出来的ID的命令。

例子:
unapt info 30 显示第30笔记录的详细情况
unapt undo 30 反转第30笔记录的操作。

https://pan.baidu.com/s/1gftOul1

讨论一下,如果出现以下这种情况,怎么处理比较好呢

  1. 安装某软件包,自动安装其依赖 libgcrypt20
  2. 安装 chromium-browser (也依赖 libgcrypt20,但由于之前装了,不会出现在此条记录中)
  3. 用 undoapt 反转操作 1

这样,libgcrypt20 作为 1 中安装的软件包会被一起移除。但后安装的 chromium 也依赖 libgcrypt20。此种情况下,chromium-browser 也会被移除。

另外 apt 日志文件除了 /var/log/apt/history.log,还有较早的 /var/log/apt/history.log.*.gz

另外按照目前 get_cmd_packages() 的逻辑,以下条目无法被收录。

这种情况下可以不必处理 Upgrade 的软件包,只移除 Install 的软件包即可。

Start-Date: 2017-10-02  07:18:43
Commandline: apt install samba
Requested-By: ubuntu (1000)
Install: python-tdb:amd64 (1.3.11-2, automatic), python-samba:amd64 (2:4.5.8+dfsg-0ubuntu0.17.04.7, automatic), python-dnspython:amd64 (1.15.0-1, automatic), samba:amd64 (2:4.5.8+dfsg-0ubuntu0.17.04.7), samba-dsdb-modules:amd64 (2:4.5.8+dfsg-0ubuntu0.17.04.7, automatic), libcephfs1:amd64 (10.2.7-0ubuntu0.17.04.1, automatic), tdb-tools:amd64 (1.3.11-2, automatic), attr:amd64 (1:2.4.47-2, automatic), python-crypto:amd64 (2.6.1-7, automatic), samba-common:amd64 (2:4.5.8+dfsg-0ubuntu0.17.04.7, automatic), samba-vfs-modules:amd64 (2:4.5.8+dfsg-0ubuntu0.17.04.7, automatic), samba-common-bin:amd64 (2:4.5.8+dfsg-0ubuntu0.17.04.7, automatic), python-ldb:amd64 (2:1.1.27-1, automatic), libboost-random1.62.0:amd64 (1.62.0+dfsg-4, automatic)
Upgrade: libwbclient0:amd64 (2:4.5.4+dfsg-1ubuntu2, 2:4.5.8+dfsg-0ubuntu0.17.04.7), samba-libs:amd64 (2:4.5.4+dfsg-1ubuntu2, 2:4.5.8+dfsg-0ubuntu0.17.04.7), libsmbclient:amd64 (2:4.5.4+dfsg-1ubuntu2, 2:4.5.8+dfsg-0ubuntu0.17.04.7)
End-Date: 2017-10-02  07:20:05

是的,在群里和作者谈论过这个问题,ta 表示暂时确实没有考虑这个情况。

我的想法是,在 undo pkg_A 的时候查看所以要卸载的依赖包:

  • 如果所有的依赖包都标记为 auto, 并且在系统中只被 pkg_A 依赖的话,就可以直接卸载;
  • 如果依赖包中某个包 pkg_B 标记为 manual 或者还被系统中其他包依赖的话,那么 pkg_B 以及 pkg_B 的依赖就都不卸载。

但是我不知道代码如何实现。:rofl::rofl::rofl:

老版本 apt 生成的日志无法识别,get_cmd_packages() 返回空列表
(没有 Requested-By: 条目)
http://paste.debian.net/plain/990714

apt install samba出现了upgrade?这个我似乎没有遇到,所以没有处理这个逻辑,需要加一个新的判断,感谢提醒。
目前没有考虑依赖关系,所以当出现依赖时,是会被一并删除掉的。
最早考虑这个工具的时候,只是想方便反转。较早的history*.gz,没有去考虑,以后慢慢来完善吧。

你这个是很容易可以实现的。:relaxed:

apt install samba出现了upgrade?

这个貌似在系统有包可以升级但是没升级,但是即将安装的samba的依赖又刚好需要新版本的时候,就会自己升级了。

@vickycq
@JackieMe
其实我思考的真的最好的实现方式是直接写一个程序调用apt进行各种操作,然后接收apt的标准输出,同时写入一个自建数据库,这样子,最后比较更方便来实现想要的功能。

小工具昨天想要,然后今天在debian 9.2, amd64系统下完成,其它的都未做测试。

慢慢的来改进吧。

感觉备份系统是不是更简单,更彻底也更安全的方法呢?
如果觉得分区尝试新系统不方便,可以定制initramfs,让Debian或其它GNU/Linux运行在目录或loop设备上,很简单,至少感觉应该比写这个脚本要简单省事得多.
不过debootstrap安装的时候确实有些慢
不过频繁安装的话,安装一次就tar或cpio备份就行了.
下次安装时直接恢复出备份然后直接升级到最新版.
另外附上老机优化技巧:
https://forum.ubuntu.com.cn/viewtopic.php?f=122&t=484538