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

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

要安装补丁,可以在服务仍然运行的时候安装,安装完成后,服务仍然使用的是旧版本,要让服务重新加载新版本,可以有两种做法
1. 重启服务
2. 给服务进程发送信号,让它重新加载动态库(假设补丁在动态库中)
hez2010
2024-07-11 00:06:53 +08:00
不重启安装补丁并不推荐,因为会带来不一致问题。想象一下你有个程序 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
2024-07-11 00:10:21 +08:00
别说打补丁了,rm -rf 都可以。而 Win 会锁定打开的文件。
wheat0r
2024-07-11 00:21:30 +08:00
Linux 存在需要安装的补丁吗?
fox0001
2024-07-11 00:35:00 +08:00
我认为 Linux 的文件系统起了很大作用。详细可以查查 Linux inode 。

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

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

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

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

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

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

© 2021 V2EX