升级期间如何更新正在运行的应用程序二进制文件?


23

我刚刚将ubuntu lucid升级为natty,在升级过程中它用较新的版本替换了大多数正在运行的应用程序。

这是如何运作的?(应用程序不会崩溃吗?)如果升级了lib文件并且正在运行的应用程序正在寻找较旧的lib尝试加载该文件,将会对应用程序产生什么影响?


好问题,但最好在这里问:unix.stackexchange.com(我知道URL说的是Unix,但他们也回答Linux问题!)

了解Linux的即开即用功能似乎仍在编程中(但几乎是:)
bdonlan

2
@bdonlan:如果您在过程的生命周期中动态地加载库,则应该非常了解这一点,否则可能会给您带来麻烦。如果您尝试做一些不寻常的事情,例如自修改代码等,这尤其重要。但是,这是临界点。
2011年

1
它与自我修改的代码无关,但是肯定是为Linux编写库的人应该知道的。:)
bdonlan

1
@Piskvor,听起来有点像gcc的多阶段编译过程:)但是基本上只有编译器会做类似的事情,而且通常您不会在升级时升级系统(即使这样做,只要您不这样做也可以)。 ' 不要降级任何东西,因为它会在需要的地方使用它的私人编译副本,所以没关系,因为它会在任何重要的事情上使用)
bdonlan

Answers:


31

Linux(和其他UNIX系统)绘制的区别文件(的链接),文件本身(通常确定了与索引节点),以及打开的句柄到文件中。当您删除文件时,您会拨打unlink()电话-这会删除该文件的链接(您也可以使用rename()其他inode覆盖该文件)。但是,如果保留了文件的打开句柄(或其他链接-文件可以具有多个链接),则索引节点将保留,文件内容也将保留,直到所有链接和句柄消失为止。

因此,使用该库或其他任何运行程序的程序都会保留旧版本的句柄(通常是通过内存映射隐式处理),因此它将保留在磁盘上。它只是没有文件名了,使用它的所有程序关闭时(或在下次重新启动时,在文件系统检查或日记重播期间),它将被清除。

此外,请注意,期望“旧库”的程序将与库的较新版本配合使用。Linux库被分配了一个文件名(“ soname”),该文件名反映了该库提供的ABI(应用程序二进制接口)的版本。例如,我系统上的C库是libc.so.6。任何针对较早版本的libc编译但仍实现6 ABI版本的libc版本的程序都可以正常使用。真正的旧程序会寻找a libc.so.5libc.so.4or代替;在这种情况下,您还需要保留旧版本-但是由于文件名不同,所以这不是问题。


9

与Windows不同,您可以删除或替换打开的文件。为了简化说明,对文件的新请求将打开新文件,现有句柄将使用创建它们时存在的文件。换句话说,在Linux中,尽管目录结构中不再有指向它们的文件/文件版本,但它们仍然存在。这些不再存在,根本没有指向它们的指针(封闭的和全部的)。

通常,运行中的应用程序会预先加载所需的库,因此,您描述的问题只会在安装软件包时在非常特定的时序情况下发生:运行中的应用程序仍使用旧版本的库,新启动的应用程序使用新版本的库。一。

这不仅在发行版升级中使用,而且在每次软件包升级中都会发生(dist-upgrade只是在该过程中增加了一些自动的步骤)。


0

升级来自它们的软件包后,许多Linux进程仍可继续工作,但有些则不能。以我的经验,如果在运行时对其进行升级,则KDE将永远无法正常工作。您可能会遇到崩溃和/或无法注销的情况。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.