是否有一种机制可以在库升级期间保护应用程序?


10

如果用户在动态链接的应用程序上工作,并且系统正在升级,是否有防止应用程序损坏的保护机制?

还是取决于应用程序?


记住要读一本关于ln -sf交换库时应如何使用的Linux书籍,因为这-f使您可以用新的“覆盖”符号链接的现有目标,而不会使其“断开”(与您执行rm后跟操作不同)a ln -s)。因此,在命令之前,library.so指向旧版本,例如。library.so.4 ...命令后,它只是指出library.so.5(或其他)来代替-而没有指向有效的库。
巴德·科珀罗德

Answers:


16

如@Kusalananda所提到的,通常通过删除旧文件并创建一个具有相同名称的新文件来完成升级。实际上,这将使用新的inode创建一个新文件,只要打开该文件,系统就可以自由使用旧文件。

作为简化示例,类似

rm /bin/cat
cp /new/version/of/cat /bin/cat

将创建一个逻辑上新的文件,即使cat可能正在运行,它也可以工作。库也是如此。(以上是示例,不是在现实世界中升级文件的可靠方法。)


有人可以尝试就地更改二进制文件,而不用创建一个同名的二进制文件。在这种情况下,至少Linux实际上阻止了对正在使用的可执行文件进行更改:

window 1 # ./cat
window 2 # echo foobar > cat
-bash: cat: Text file busy

但是,这似乎不适用于动态加载的库...

我制作了一份libc.so.6用于测试,并在使用时用零填充:

window 1 /tmp/lib# LD_LIBRARY_PATH=/tmp/lib ldd ./cat
    linux-vdso.so.1 (0x00007ffcfaf30000)
    libc.so.6 => /tmp/lib/libc.so.6 (0x00007f1145e67000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f1146212000)

window 1 /tmp/lib# LD_LIBRARY_PATH=/tmp/lib ./cat
foo
foo

Segmentation fault

(同时在另一个窗口中,在foosegfault之前)

window 2 /tmp/lib# dd if=/dev/zero of=libc.so.6 bs=1024 count=2000

程序本身对此无能为力,因为我有效地在线编辑了它的代码。

(这可能取决于系统,我在Debian Jessie 8.5,Linux 3.16.7-ckt25-2 + deb8u3上进行了测试。尤其是IIRC Windows系统在防止使用中的文件被修改方面更具攻击性。)


因此,我想答案是,升级通常以避免任何问题的方式进行,而文件系统内部结构可以帮助实现这一点。但是(在Linux上)似乎没有针对实际破坏动态库的任何防护措施。


install实用程序通常用于这样的事情。您无需显式rm指定目标文件。另外,它保留了现有文件的权限,可以进行备份,设置新模式等。示例用法:install /new/version/of/cat /bin/cat
Patrick

当然。以rm+ cp为例。用重命名原子地将新文件放在适当的位置也很聪明,避免出现两个版本都不可用的短窗口。(尽管GNU install似乎甚至没有这样做,hmpf。)
ilkkachu

2
我想弄清楚这个答案中的内容:在Unixes中,如果文件已打开并被删除(rm),则该文件尚未删除。它将存在于磁盘上,并且仍可由打开它的所有进程读取。仅当它的硬链接数达到零并且打开文件时的进项数达到零时,才会将其删除。
ctrl-alt-delor

@Patrick:该install实用程序特别不安全!它会覆盖目标文件,而不是自动替换目标文件。mv(源和目标位于同一目录中,源通常是一个临时文件)是安装文件的唯一安全方法。
R .. GitHub停止帮助ICE

1
@Patrick据我strace告诉,install在GNU的coreutils解除链接的目标文件,然后复制在其位置一个新的。这意味着存在一个短暂的窗口,在此期间文件是不完整的。它不会自动使用重命名将文件自动设置到位。
ilkkachu

3

如果在打开文件时取消链接,这些文件将不会被“正确删除”。当它们关闭时,它们使用的磁盘空间将再次被视为“可用”。当前运行的应用程序及其共享库也是如此。

我唯一看不到的故障是,如果某个程序用于dlopen()按需加载共享库,或者该程序是否必须按需访问其他文件,例如字典,主题文件或其他突然消失的文件。

举例说明:vim在一个shell会话中运行而删除vim另一个shell会话中的安装,则不会“损坏”或终止当前正在运行的vim会话。但是有些事情将开始失败,例如拼写检查,这需要vim在安装过程中打开文件。

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.