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