我刚刚将ubuntu lucid升级为natty,在升级过程中它用较新的版本替换了大多数正在运行的应用程序。
这是如何运作的?(应用程序不会崩溃吗?)如果升级了lib文件并且正在运行的应用程序正在寻找较旧的lib尝试加载该文件,将会对应用程序产生什么影响?
我刚刚将ubuntu lucid升级为natty,在升级过程中它用较新的版本替换了大多数正在运行的应用程序。
这是如何运作的?(应用程序不会崩溃吗?)如果升级了lib文件并且正在运行的应用程序正在寻找较旧的lib尝试加载该文件,将会对应用程序产生什么影响?
Answers:
Linux(和其他UNIX系统)绘制的区别名文件(的链接),文件本身(通常确定了与索引节点),以及打开的句柄到文件中。当您删除文件时,您会拨打unlink()
电话-这会删除该文件的链接(您也可以使用rename()
其他inode覆盖该文件)。但是,如果保留了文件的打开句柄(或其他链接-文件可以具有多个硬链接),则索引节点将保留,文件内容也将保留,直到所有链接和句柄消失为止。
因此,使用该库或其他任何运行程序的程序都会保留旧版本的句柄(通常是通过内存映射隐式处理),因此它将保留在磁盘上。它只是没有文件名了,使用它的所有程序关闭时(或在下次重新启动时,在文件系统检查或日记重播期间),它将被清除。
此外,请注意,期望“旧库”的程序将与库的较新版本配合使用。Linux库被分配了一个文件名(“ soname”),该文件名反映了该库提供的ABI(应用程序二进制接口)的版本。例如,我系统上的C库是libc.so.6
。任何针对较早版本的libc编译但仍实现6 ABI版本的libc版本的程序都可以正常使用。真正的旧程序会寻找a libc.so.5
或libc.so.4
or代替;在这种情况下,您还需要保留旧版本-但是由于文件名不同,所以这不是问题。
与Windows不同,您可以删除或替换打开的文件。为了简化说明,对文件的新请求将打开新文件,现有句柄将使用创建它们时存在的文件。换句话说,在Linux中,尽管目录结构中不再有指向它们的文件/文件版本,但它们仍然存在。这些不再存在,根本没有指向它们的指针(封闭的和全部的)。
通常,运行中的应用程序会预先加载所需的库,因此,您描述的问题只会在安装软件包时在非常特定的时序情况下发生:运行中的应用程序仍使用旧版本的库,新启动的应用程序使用新版本的库。一。
这不仅在发行版升级中使用,而且在每次软件包升级中都会发生(dist-upgrade只是在该过程中增加了一些自动的步骤)。