话说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个更新可用。
[font=宋体]总结:ubuntu想要本地化不难,只要我们从别的联网的地方下载更新列表/var/lib/apt/lists,替换掉原来的目录(这里还是提倡大家备份就目录,改个名即可不要直接删除),即可用更新管理机器分析依赖关系。而所需的软件包可以从别处下载放到缓存目录/var/cache/archives即可。
困难: 这里所说的困难是指那些需要从网吧里使用ubuntu的人们,如果你周围有用ubuntu且联网的人,你大可以从别人那里下载更新到本地,否则你可能需要到网吧去,安装虚拟机,安装系统,下载更新(sudo
apt-get upgrade -d命令,更新管理器没有发现仅下载的选项,这点很无奈,而且更新管理器会更全一些,比如新内核就不能通过upgrade命令安装,可能有别的命令,望知者告之),把更新存到U盘里。这个过程麻烦,而且要求虚拟机支持USB,需要安装虚拟机的USB驱动,但是网吧有的是封驱动的。所以具体操作起来还是有点问题。
展望:笔者只是从更新原理上探索了apt本地更新的方法,但是方法很麻烦,如果你是新装的系统,需要在网吧重装一遍系统。再者虚拟机和实体机不一样,虽然软件包列表一样,但分析依赖后所产生的更新列表也不完全一样。所以有些更新可能需要手动install一下,安装ubuntu提供的显卡驱动更是难上加难。虽然如此,但是如果知道了apt的分析原理的话,可以只在虚拟机livecd下取得软件包列表,再在本地分析更新和依赖关系,取得下载列表,这样就可以不必在虚拟机里装系统了。这可以是一个探索方貌取方向。[/font]
dchwlinux 于 2010-06-16 09:00:26发表:
也许我思考的方向有偏差,现在我又觉得apt的分析依赖原理更有价值,下载的话原理上讲也就是个批量下载罢了。
dchwlinux 于 2010-06-14 13:18:25发表:
我也只是在探索中(o):tx
ymp 于 2010-06-14 00:24:44发表:
没有研究过……
shenhao0129 于 2010-06-13 22:20:25发表:
呵呵,研究的还真是深入啊
dchwlinux 于 2010-06-13 07:25:23发表:
又一个问题:即使用同一虚拟机软件,在不同网吧内安装系统,相同的更新列表所产生的下载列表也不一样,不细微差别,在安装汉语支持时,如果在出现错误提示时依然选择“是”进行安装,其结果依然出现了依赖错误。唉,而更新管理器里差了5M的软件包没有下载。由于在安装语言支持时已经破坏了依赖性,即使联网的情况下也出现错误,唉,再也不敢贸然点是了。
dchwlinux 于 2010-06-12 22:48:11发表:
1、最新发现的问题,权限问题,软件列表需要加入r和x权限,以使管理器可以进入lists目录并读取软件包信息。
2、/var/cache/apt/archives/下的partial目录必须存在才可安装,如果之前只备份了deb包,需要新建或复制partial目录。
litkt 于 2010-06-12 19:43:33发表:
[i=s] 本帖最后由 litkt 于 2010-6-12 19:45 编辑 [/i]
Debian一向很稳定,软件功能也一向很稳定,旧版软件一样用。
通过ATP频繁更新的目的在于在网络条件下保证安全。
如果没有网络环境,当然安全也就不成问题,所以也没有必要离线更新。什么时候上网了,就先更新一下再做其它工作,这样就能保证在网上安全了。
以上适用于有时有网络环境有时没有的笔记本电脑。
不联网的台式机还是安装Fedora这样的可以在软件市场上买到光盘的Linux版本吧。
dchwlinux 于 2010-06-12 17:04:38发表:
咱俩说的一个意思,我只是说的具体一点而已
shenhao0129 于 2010-06-12 16:12:34发表:
“软件包新旧、依赖等分析工作和软件包的安装则在本地”这个肯定是在本地完成的,每天首先链接网络更新软件包依赖的数据库,然后如果要安装什么软件,就会根据这个本地的依赖关系然后到服务器上去下载相应的软件包
dchwlinux 于 2010-06-12 15:20:42发表:
[i=s] 本帖最后由 dchwlinux 于 2010-6-12 15:29 编辑 [/i]
回2楼,可以。不过偶不会,可以教下不?我所说的只是把apt的原理作了分析,得出apt的管理过程中只有刷新软件列表和软件包下载需要联网,而软件包新旧、依赖等分析工作和软件包的安装则在本地,所以我们只要手动替换软件包列表,然后apt就会自动分析依赖。软件包也手动地放到缓存目录中,其后的安装过程调用的dpkg由于依赖已解决,可本地化安装。我在展望中也说了,如果可以知道apt批量下载的原理进而作出相应的工具(当然主要是针对windows平台)就可以不用在虚拟机里下载了。到那时,我们只需要在网吧用虚拟机livecd得到软件列表,把软件列表换到本地,分析一下,得到下载列表。最后用相应工具在win下批量下载即可。当然也有点小问题,比如flashplayer的deb包在安装的过程中还是会下载个东西,这需要在虚拟机中装一遍,把下载的东西提取出来。还有显卡驱动,如果要装开源的驱动,那可不好办了,因为ubuntu10.04只要选择高级效果,就会自动搜索可用驱动,自动安装,全过程就一个进度扫描条,完全不知道装了些什么,当时我觉得很别扭。现在想想缓存里肯定有下载的包,要是不联网,从错误信息里可能能找出点线索。
5trnga 于 2010-06-12 14:58:33发表:
坐个位置
shenhao0129 于 2010-06-12 14:12:57发表:
源换成本地的应该就可以了吧?