为什么 Linux 能做到不重启系统安装安全补丁, Windows 和 macOS 都做不到?

165 天前
 drymonfidelia
4280 次点击
所在节点    程序员
34 条回复
adrianzhang
165 天前
Linux 是微内核。
hronro
165 天前
Linux 是微内核?!
cJ8SxGOWRH0LSelC
165 天前
@adrianzhang #1 Linux 是宏内核
henix
165 天前
有些安全补丁安装完只需要重启相关服务就行了,不用重启系统,比如之前的 ssh 安全漏洞
adrianzhang
165 天前
@StinkyTofus 哦哦,打错。
adrianzhang
165 天前
刚才不知道在想什么。这个问题应回答 Linux 是松耦合系统。
vituralfuture
165 天前
因为可执行被加载到内存执行后可以写入该文件,进程的工作目录被其他进程删掉后也不会挂掉,以上都是因为 inode 的引用计数机制,只有引用计数降低到零才会真正删除 inode 。这也是为什么 rm 删全盘后 linux 还能活一段时间,关机后才会真的挂掉

要安装补丁,可以在服务仍然运行的时候安装,安装完成后,服务仍然使用的是旧版本,要让服务重新加载新版本,可以有两种做法
1. 重启服务
2. 给服务进程发送信号,让它重新加载动态库(假设补丁在动态库中)
hez2010
165 天前
不重启安装补丁并不推荐,因为会带来不一致问题。想象一下你有个程序 A 执行到中途把自己 fork 成几个 worker 来执行,此时在 fork 之前或者中途程序 A 的文件因为安装补丁被替换了,那之后会发生什么行为可没人能预料到。又或者有多程序共享了某一个库或者配置文件,结果因为安装补丁导致他们使用的版本不相同,又会导致另外的问题。
当然跟 Linux 加载可执行文件不锁定文件也有关系,不过 macOS 加载可执行文件跟 Linux 一样不会锁定文件,也不是照样不支持不重启系统安装补丁。
另外 Windows 虽然加载可执行文件的时候会锁定文件导致无法更新文件,但是 Windows 是支持热补丁的,只不过是 Windows Server Azure 版专享: https://learn.microsoft.com/en-us/windows-server/get-started/hotpatch
dobelee
165 天前
别说打补丁了,rm -rf 都可以。而 Win 会锁定打开的文件。
wheat0r
165 天前
Linux 存在需要安装的补丁吗?
fox0001
165 天前
我认为 Linux 的文件系统起了很大作用。详细可以查查 Linux inode 。

Linux 的文件内容修改后,文件名不变,但其 inode 更新,文件内容写入新的硬盘存储空间。正在运行的程序,拿着旧 inode ,可以读取到旧版文件(也有可能程序文件已读入内存),所以文件修改后一般不影响程序运行。服务的配置文件修改后,需要重启服务,一般就是根据文件名获取到新的 inode ,从而读取到修改后的配置。
bitdepth
164 天前
kernel 除非是 module 的 security bug 否則也是要重啟好不好
另外 linux kernel 是有 living patch 不過不是很好用就是了
fpk5
164 天前
因为服务器大多数运行 Linux ,关机会有很大的影响,所以这些公司(尤其是做 Cloud 的公司)有动力去开发不关机更新的内核补丁。Windows 和 macOS 这种普通用户的系统有什么必要开发这种功能?
V28a19cc
164 天前
1. Windows Server Azure Edition 和 Windows 11 24H2 26100 都支持 hotpatch 热更新。
2. 对于大部分用户来说这个功能没必要,反倒是定期重启能解决大多数问题。
msg7086
164 天前
因为 Windows 内核会锁定文件,要删除文件并安装新版本一般需要先关闭才能操作。
对普通应用程序来说需要完全关闭程序,对系统来说就是重启系统。
macOS 不清楚。

Linux 下可以直接删除原文件并安装新文件,然后再重启软件或者电脑就可以了。
MrKrabs
164 天前
ubuntu 可是拼命叫你重启
beginor
164 天前
但是很多补丁装完还是会提示重启的
Chad0000
164 天前
做到需要更大成本,让用户重启电脑很简单也没什么大的影响,所以这个热更新非必需。
villivateur
164 天前
Linux 更新内核的话本来也是要重启的啊,或者 systemd 之类的
NessajCN
164 天前
要看哪种补丁。编译进内核或者启动参数加载内核参数的模块更新还是要重启的。通过 sysctl 加载的运行时参数或者 systemd 管理的系统进程就可以不重启

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1056391

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX