LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 825|回复: 6

请问pacman是如何升级的呢

[复制链接]
发表于 2010-4-28 18:24:41 | 显示全部楼层 |阅读模式
最近在设计考虑系统升级的功能,类似windows的系统升级,Archlinux的pacman、ubuntu的apt-get等。
我有几个问题想询问下:
1. 为什么在Archlinux下,正在运行的应用也会被升级呢?运行的版本是旧版本,升级完后,关闭该应用再启动就是新版本了。难道Linux将正在运行的应用完全加载到内存,而且该文件可被改写?(经过一些小测试,发现正在运行的文件,可以被删除、改写)

2.  Archlinux升级是如何处理用户数据的呢?会不会出现升级到新版本后,数据不兼容的问题呢?
如何将旧版本的用户数据导入到新版本的用户数据文件中呢?
发表于 2010-4-28 18:31:47 | 显示全部楼层
1. 你自己已经试出来了,这归功于Linux的文件系统
2. 有时会有 .pacnew, .pacold 文件产生,以此保存新的配置文件或备份旧的配置文件
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-4-28 18:52:54 | 显示全部楼层
Post by bearson;2086356
1. 你自己已经试出来了,这归功于Linux的文件系统
2. 有时会有 .pacnew, .pacold 文件产生,以此保存新的配置文件或备份旧的配置文件

谢谢你的解答,这些问题有些牵扯到程序设计的角度了,我该看看pacman的源码。
1. 我只是测试了几个基本程序,要是将完整的KDE或是Gnome程序完整加载到内存,这个内存开销不少吧。如果假设是这样的,那它也应该将依赖的动态库全加载到内存吧?内存开销更不少了。
如果是在播放高清影片,影片的大小已超过了内存大小,它也完全加载到内存?
2. 如果是新程序更新了配置文件的结构,那就是它使用的是somefile.pacnew的文件喽?它同时会读两份配置文件?原始的somefile和somefile.pacnew?
回复 支持 反对

使用道具 举报

发表于 2010-4-28 20:45:28 | 显示全部楼层
Post by anderlew;2086360
谢谢你的解答,这些问题有些牵扯到程序设计的角度了,我该看看pacman的源码。
1. 我只是测试了几个基本程序,要是将完整的KDE或是Gnome程序完整加载到内存,这个内存开销不少吧。如果假设是这样的,那它也应该将依赖的动态库全加载到内存吧?内存开销更不少了。
如果是在播放高清影片,影片的大小已超过了内存大小,它也完全加载到内存?
2. 如果是新程序更新了配置文件的结构,那就是它使用的是somefile.pacnew的文件喽?它同时会读两份配置文件?原始的somefile和somefile.pacnew?


1.不是内存,而是硬盘,你在Linux下替换掉(不是直接修改,是删掉再新建同名文件)或者是删掉一个文件的时候,旧文件还在硬盘上,虽然没有名字了,但它还是完整可用的,只有当使用这个文件的所有进程都结束时,这个文件才会消失。所以达到的这种边用边升级的效果和pacman没有关系,归功于文件系统。

2.不是,一般情况下,新的配置的样例文件被作为.pacnew放进来,用途是让你比较并修改现有配置。只有极个别情况,新的配置格式和旧的不兼容,这时候会把旧的配置重命名为.pacold,然后使用新的配置。无论如何,做这两种改变的时候,pacman都会给出提示。
回复 支持 反对

使用道具 举报

发表于 2010-4-28 21:45:49 | 显示全部楼层
bearson说的对
你看pacman的源代码是没有用的,这是跟Linux内核和文件系统有关。
*.pacnew是这个软件的系统配置文件,bearson比较说了。~/.*才是个人配置文件,当新软个人配置文件的结构发生变化时新软件可以更新、修改、原来的个人配置文件,也可以重新创建。

另外不单止archlinux是这样的,据我所知现在所有的unix架构都是这样的。

至于Linux将哪些文件加入到内存我还不太清楚,希望高手解答。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-4-28 23:16:45 | 显示全部楼层
谢谢大家的解答。
1. 基本上理解了,文件系统有这个机制后,确实挺方便的。但是在有限的磁盘空间中(如嵌入式设备)加入这样的功能,分区的空间最少要是这个文件的两倍,在一些极限情况下就易出错了。
2. 看了看官方的pacman使用手册,基本了解了它如何工作的了。在某些情况下,仍然需要人工处理配置文件,将新配置文件中的数据导入到旧的配置文件中。好在linux的大部分数据文件都是ascii character,如果有数据库或是类似的东西保存数据,更新起来就有些麻烦了。

请问pacman database文件在哪里呢?拿现在pacman最新的版本来说吧,以前存在什么db文件内,现在没有看到了。

我最近做了一个系统升级的工具,在更新时处理用户数据时比较头痛,用户数据有在配置文件和数据库中。平时又在用Archlinux,所以对它如何处理用户数据有点感兴起。
回复 支持 反对

使用道具 举报

发表于 2010-4-28 23:34:47 | 显示全部楼层
Post by anderlew;2086415
谢谢大家的解答。
1. 基本上理解了,文件系统有这个机制后,确实挺方便的。但是在有限的磁盘空间中(如嵌入式设备)加入这样的功能,分区的空间最少要是这个文件的两倍,在一些极限情况下就易出错了。
2. 看了看官方的pacman使用手册,基本了解了它如何工作的了。在某些情况下,仍然需要人工处理配置文件,将新配置文件中的数据导入到旧的配置文件中。好在linux的大部分数据文件都是ascii character,如果有数据库或是类似的东西保存数据,更新起来就有些麻烦了。

请问pacman database文件在哪里呢?拿现在pacman最新的版本来说吧,以前存在什么db文件内,现在没有看到了。

我最近做了一个系统升级的工具,在更新时处理用户数据时比较头痛,用户数据有在配置文件和数据库中。平时又在用Archlinux,所以对它如何处理用户数据有点感兴起。

对于数据库文件需要升级的问题,一般由软件自身检测并完成升级,而不是软件包管理器做的事情。
就像 Office 2010 需要兼容以前版本的 Office 文档,而不是在升级的时候把本机所有的 Office 文档都升级到新版本。
配置文件是用数据库存的情况实在非常罕见。sqlite 之类的数据库也是向下兼容的。

从 man pacman 中看到数据库默认在 /var/lib/pacman/,当然其实是使用文件系统了,这个地方用reiserfs会快一些……
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表