LinuxSir.cn,穿越时空的Linuxsir!

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

LFS下滚动升级(rolling upgrade)怎么实现?

[复制链接]
发表于 2010-4-17 18:24:41 | 显示全部楼层 |阅读模式
我有glibc2.10.1, 想升级到glibc2.11. LFS下有简单的包管理器, 记录了 glibc2.10.1安装的所有文件. 升级的步骤如下: (应该是这样)

1. 编译glibc 2.11, 用tar打包并记录所有文件
2. 删除原来glibc2.10.1包中的所有文件
3. 用tar将glibc 2.11的所有文件解压到根目录

问题是删除脚本依赖于bash和glibc, tar依赖于glibc... 有什么好的方法?
 楼主| 发表于 2010-4-17 18:39:42 | 显示全部楼层
方案2:

1. 编译glibc 2.11, 记录所有文件信息,打包
2. 在根目录解压二进制包, 直接覆盖glibc 2.10.1
3. 然后在卸载glibc 2.10.1. 先检查glibc 2.10.1 包里的所有文件, 如果它也出现在glibc2.11包里, 则跳过,否则删除.

哪个方案好些?
回复 支持 反对

使用道具 举报

发表于 2010-4-18 20:22:48 | 显示全部楼层
这是个策略和经济问题。

懒人做法:
除非看到感兴趣的新特性、或安全相关补丁,从不升级系统,特别是基础软件包;
即使升级也要保证损害最小化,如升级 Xorg 可仅升级 X server 部分;
如涉及基础软件包大更新,x.y.z -> x.y+,则重做系统(不停机,在线更新系统可行,但费脑子,不值得)。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-4-18 21:55:06 | 显示全部楼层
方案1需要一个静态链接的删除/安装程序,即使删掉C库和bash, 照样 可以把新包装上去.
方案2需要冒一些险, 不知道动态库还在内存中, 硬盘上的文件已经被更新了会出现什么后果,有空研究一下.

我打算在下个LFS系统里正式加入包管理系统, 改费脑子就费点吧, 相信以后会用着很爽...
回复 支持 反对

使用道具 举报

发表于 2010-4-18 22:42:12 | 显示全部楼层
包管理和前面懒人做法不冲突。

建议看看本版升级 glibc 相关讨论。
建议查查 mmap() tar install cp rm。

PS: 可以用 google 搜索。
http://www.linuxsir.cn/bbs/thread355298.html
http://www.linuxsir.cn/bbs/post2018084-15.html
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-4-19 08:33:38 | 显示全部楼层
谢谢深空兄, 正是我需要的.
既然我有软件包文件列表,  表里也有文件权限等信息, 照表使用install即可.
然后再用unlink删除旧包中有,新包中没有的文件.
也即采用方案2.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-4-19 08:42:56 | 显示全部楼层
在更新期间, 只有bash在内存中,不停的调用install.

更新bash, 不会有问题. 新的bash程序会使用新的版本,更新前启动的bash程序,在内存中使用旧版本.

更新install, 不会有问题. install程序被修改后, 下次再调用install, 会启动新版的install.

c库呢? 更新后, 同bash一样,旧的在内存中. 新程序启动新版本.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-4-19 09:11:02 | 显示全部楼层
列举一种滚动更新可能会失败的情况.

libc(或bash)使用了文件A, 但不是一直保持打开状态, 只是在某些情况下打开A, 使用,然后关闭.

第二个假定是 旧libc+旧A工作正常, 新libc+新A工作正常, 旧Libc+新A工作不正常.

更新程序更新了libc和A. 旧的libc一直在内存中, 等下次打开文件A时会变成新A, 导致出现问题.

如果A是另一个按需加载的动态链接库,就是传说中的DLL HELL的问题...

养成好的编程习惯很重要
回复 支持 反对

使用道具 举报

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

本版积分规则

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