|
|
发表于 2007-6-12 20:35:43
|
显示全部楼层
既然说道这个问题,我们就来讨论一下软件包兼容性问题。
我们先把软件包分个类,再来结合FC6->F7的升级来看待这个问题。
软件包,我们不妨按照软件类型来这样分类:
1、编译型语言编译的机器代码软件,如C/C++等编译的软件,这在GNU/Linux系统中占据了绝大多数。我们后面也要重点说这种软件的兼容性。
2、解释型语言软件包,如perl/python等。这种软件包,只要解释器没有进行过大的升级动作,就不会产生兼容性问题。如F7的python版本是2.5,FC6最后更新的python是2.4,两版本之间没有引起明显的兼容性问题(这么说可能不精确,希望关注python发展的人指正)。
3、数据软件包。如字体软件,游戏数据包,软件主题、皮肤等数据。这些软件在FC6-F7时,只要不是因为命名方式出现改变,就不会出现兼容性问题。
关于编译型语言编译的软件包,主要是看1、内核/用户态接口的变化 2、库兼容性
关于内核接口,因为都是2。6系列,绝大多数用户态能和内核交互的地方,都基本没有变化,而且, FC6 -> F7 的内核版本是2.6.20 -> 2.6.21。差别当然更小,不足以引起兼容性问题。
接下来就是库的兼容性。
首先是C库
FC6 -> F7 的glibc升级是从2.5 -> 2.6, 看似有0.1的变化,但是和当时FC5->FC6的2.4 -> 2.5不同。 当时FC6的glibc 2.5引入了很重要的.gnu.hash ELF段。 直接导致FC6下打开.gnu.hash编译支持的软件(FC6+的gcc的默认行为)因为glibc的兼容问题根本无法在其他系统上使用(解决办法是附带上FC6+的libc.so.6,并用LD_LIBRARY_PATH覆盖系统libc)。 而这次的2.5 -> 2.6 没有这么激烈的变动。 同样是 libc.so.6,大多软件都不会有兼容性问题。
其次是应用程序库
应用程序需要哪些库?这些在编译的时候就已经确定好,比如:
- $ldd /usr/bin/vim
- linux-gate.so.1 => (0x00c5f000)
- libselinux.so.1 => /lib/libselinux.so.1 (0x00284000)
- libncurses.so.5 => /lib/libncurses.so.5 (0x00a1f000)
- libacl.so.1 => /lib/libacl.so.1 (0x002de000)
- libgpm.so.1 => /usr/lib/libgpm.so.1 (0x0029e000)
- libperl.so => /usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE/libperl.so (0x0034c000)
- libresolv.so.2 => /lib/libresolv.so.2 (0x002c8000)
- libutil.so.1 => /lib/libutil.so.1 (0x00322000)
- libc.so.6 => /lib/libc.so.6 (0x0047d000)
- libpython2.5.so.1.0 => /usr/lib/libpython2.5.so.1.0 (0x042b9000)
- libm.so.6 => /lib/libm.so.6 (0x00d40000)
- libdl.so.2 => /lib/libdl.so.2 (0x00d39000)
- libtinfo.so.5 => /lib/libtinfo.so.5 (0x00a05000)
- libpthread.so.0 => /lib/libpthread.so.0 (0x00d6b000)
- libsepol.so.1 => /lib/libsepol.so.1 (0x00231000)
- /lib/ld-linux.so.2 (0x00212000)
- libattr.so.1 => /lib/libattr.so.1 (0x00bba000)
- libnsl.so.1 => /lib/libnsl.so.1 (0x002ad000)
- libcrypt.so.1 => /lib/libcrypt.so.1 (0x04289000)
复制代码
编译的时候确定好的是依赖libncurses.so.5类似这样的SO名称。我们就以这个libncurses.so.5为例。
哪些时候会出现兼容性问题呢(后面谈yum/RPM系统能解决/避免那些问题)?
1、ncurses升级,改变了API接口而且不再是libncurses.so.5,而变成libncurses.so.6。其结果是导致vim根本无法启动,提示无法定位libncurses.so.5
2、ncurses升级,改变了API接口但仍然为libncurses.so.5。起结果导致的是vim的潜在的不稳定性。这种情况常会发生仍处于开发阶段的软件包——因为开发阶段的包不保证API的稳定性——这也就是使用测试版软件不稳定的最主要原因之一。
好,现在我们看看RPM系统是如何定义vim的依赖关系的:
- $rpm -qf /usr/bin/vim
- vim-enhanced-7.0.235-1.fc7
- $rpm -q --requires vim-enhanced| grep ncurses
- libncurses.so.5
复制代码
原来vim依赖关系中有明显的一个依赖:libncurses.so.5
这个依赖性是在vim的spec中写的吗?不是,这是rpmbuild系统自动添加的。那谁会提供它呢?再看:
- $rpm -q --provides ncurses| grep ncurses.so.5
- libncurses.so.5
复制代码
原来ncurses能够提供这libncurses.so.5。这又是谁写的呢?还是rpmbuild系统。
好,这样一来,刚才的兼容性可能中,第一个问题就解决了,因为yum下面,并不允许类似rpm --nodeps, rpm --force这样的不负责任的行为。所以,任何so名称的升级,都会直接导致软件无法安装升级。
第二个问题呢?很抱歉,没有办法解决。改变API接口(包括其行为)而不升级so名称的情况不应该在稳定版本软件中发生。而且请记住一点Fedora的任何正式发型版都是首先考虑稳定版本的。
所以,由此看来,f7中直接_正确地_使用fc6的包的风险相对是非常小的。所谓_正确地_使用,是指通过yum或者一般的无强制模式的rpm命令安装软件包。
至于f7这次没有完全重新编译fc6 extras里过来的包,确实存在很小的风险,但这是在f7是第一次合并core和extras, extras的维护者来自五湖四海,要在短期内完全让这些人跟上发布的脚步,是不现实的。 f7的这次处理就是将fc6中没有broken deps(即没有发生第一个问题的)的还没来得及重新在f7编译的fc6软件包直接拷贝过来。如果你能相信大多数库都能遵循API的接口行为稳定性原则,那你就应该对这次
“草率的”升级有所包容。 |
|