apt的本地化更新初探(需借助虚拟机)(ubuntu)

来源:互联网 发布:xampp怎么配置mysql 编辑:程序博客网 时间:2024/05/22 17:43
话说linux是以依赖著称的 ,但是在使用ubuntu的过程中笔者却发现的两个细节,让笔者仿佛看到了apt本地化的思路。

     1、 用apt更新的时候都要经过update和upgrade的过程,如果update失败,那么upgrade就别想了。ubuntu安装软件方式有很多,命令行的apt,软件中心,新立得。更新也有一个图开化的更新管理器(update manager)。其实这些都是基于apt的。但是在用更新管理器的时候,我们知道有一个检查(check)的按钮,它就相当于apt-get update的过程,会下载更新列表[1],之后会看到分析、建立软件依赖关系的过程[2],最后出现更新列表[3]。ubuntu默认的检查更新频率是daily(第天一次),如果一天之内两次打开更新管理器,那么第二次这个check是不会进行的,不会出现下载的过程。既然如此,[2][3]步是不是不需要联网呢?经过断网测试没有错误提示。所以说这个分析依赖关系的过程很可能是在本地进行的,若是如此,如果能够找到分析的依据就可以在本地分析依赖关系而不需要联网了。当然如果点击安装更新,那自然要联网了。

     2、 用过ubuntu的人可能都听说过ubuntu tweak这个工具,它有一个清理软件的功能,其中有一项清除软件缓存,里面全deb包。也有人像我一样奇怪apt安装软件时包都下载在哪儿?于是激起了笔者对apt工作原理的兴趣。



     于是笔者就百度,维基,gg,man,又在系统/etc里乱翻,希望打到配置文件,找到缓存目录。某帖子中说到:
Ubuntu 采用 Debian 的软件包管理器 dpkg 来管理软件包, 类似 RPM. 系统中所有 packages 的信息都在 /var/lib/dpkg/
目录下, 其子目录 /var/lib/dpkg/info 用于保存各个软件包的配置文件列表:
(1).conffiles 记录了软件包的配置文件列表
(2).list 保存软件包中的文件列表, 用户可以从 .list 的信息中找到软件包中文件的具体安装位置.
(3).md5sums 记录了软件包的md5信息, 这个信息是用来进行包验证的.
(4).prerm 脚本在 Debian 包解包之前运行, 主要作用是停止作用于即将升级的软件包的服务, 直到软件包安装或升级完成.
(5).postinst 脚本是完成 Debian 包解开之后的配置工作, 通常用于执行所安装软件包相关命令和服务重新启动.

/var/lib/dpkg/available 文件的内容是软件包的描述信息, 该软件包括当前系统所使用的 Debian 安装源中的所有软件包,
其中包括当前系统中已安装的和未安装的软件包.

/var/cache/apt/archives 目录是在用 apt-get install 安装软件时,软件包的临时存放路径

/etc/apt/sources.list 存放的是软件源站点, 当你执行 sudo apt-get install xxx 时,Ubuntu 就去这些站点下载软件包到本地并执行安装
      这样找出了ubuntu下软件下载存放的目录:/var/cache/apt/archives。大喜,本以为胜利在望,可是在虚拟里试了才发现,更新管理器在没联网的情况下说刚装的系统是最新的,这也验证了分析软件的过程不需联网的假设。接下来还是要从apt的工作原理入手,于是又是一番搜索。依上面的帖子的说法,最可疑的是dpkg这个目录,于是在这个目录下逛来逛去,进行实验,一顿下来,除了发现如果dpkg下没有status文件和updates目录时更新管理器启动不开外,整个目录里根本没有分析软件关系的软件列表。失望之余又把目光投向了工作原理本身。在一篇分了5页的帖子中的第四页提到“apt-get update命令会从/etc/apt/sources.list中下载软件列表,保存到/var/lib/apt/lists中”,进去一看,豁然开朗。也怪我眼神差了一点儿,压根就没发现/var/lib下有apt这么个目录。于是将其备份,重装系统,覆盖list目录,果然在没联网的情况下提示新装系统有157个更新可用。

总结:ubuntu想要本地化不难,只要我们从别的联网的地方下载更新列表/var/lib/apt/lists,替换掉原来的目录(这里还是提倡大家备份就目录,改个名即可不要直接删除),即可用更新管理机器分析依赖关系。而所需的软件包可以从别处下载放到缓存目录/var/cache/archives即可。


困难: 这里所说的困难是指那些需要从网吧里使用ubuntu的人们,如果你周围有用ubuntu且联网的人,你大可以从别人那里下载更新到本地,否则你可能需要到网吧去,安装虚拟机,安装系统,下载更新(sudo

apt-get upgrade -d命令,更新管理器没有发现仅下载的选项,这点很无奈,而且更新管理器会更全一些,比如新内核就不能通过upgrade命令安装,可能有别的命令,望知者告之),把更新存到U盘里。这个过程麻烦,而且要求虚拟机支持USB,需要安装虚拟机的USB驱动,但是网吧有的是封驱动的。所以具体操作起来还是有点问题。



展望:笔者只是从更新原理上探索了apt本地更新的方法,但是方法很麻烦,如果你是新装的系统,需要在网吧重装一遍系统。再者虚拟机和实体机不一样,虽然软件包列表一样,但分析依赖后所产生的更新列表也不完全一样。所以有些更新可能需要手动install一下,安装ubuntu提供的显卡驱动更是难上加难。虽然如此,但是如果知道了apt的分析原理的话,可以只在虚拟机livecd下取得软件包列表,再在本地分析更新和依赖关系,取得下载列表,这样就可以不必在虚拟机里装系统了。这可以是一个探索方貌取方向。


本文转自:http://www.linuxdiyf.com/bbs/thread-181325-1-1.html



原创粉丝点击