V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
drymonfidelia
V2EX  ›  程序员

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

  •  1
     
  •   drymonfidelia · 164 天前 · 4279 次点击
    这是一个创建于 164 天前的主题,其中的信息可能已经有所发展或是发生改变。
    34 条回复    2024-07-13 23:37:49 +08:00
    adrianzhang
        1
    adrianzhang  
       164 天前
    Linux 是微内核。
    hronro
        2
    hronro  
       164 天前
    Linux 是微内核?!
    cJ8SxGOWRH0LSelC
        3
    cJ8SxGOWRH0LSelC  
       164 天前   ❤️ 3
    @adrianzhang #1 Linux 是宏内核
    henix
        4
    henix  
       164 天前   ❤️ 1
    有些安全补丁安装完只需要重启相关服务就行了,不用重启系统,比如之前的 ssh 安全漏洞
    adrianzhang
        5
    adrianzhang  
       164 天前
    @StinkyTofus 哦哦,打错。
    adrianzhang
        6
    adrianzhang  
       164 天前   ❤️ 2
    刚才不知道在想什么。这个问题应回答 Linux 是松耦合系统。
    vituralfuture
        7
    vituralfuture  
       164 天前 via Android
    因为可执行被加载到内存执行后可以写入该文件,进程的工作目录被其他进程删掉后也不会挂掉,以上都是因为 inode 的引用计数机制,只有引用计数降低到零才会真正删除 inode 。这也是为什么 rm 删全盘后 linux 还能活一段时间,关机后才会真的挂掉

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

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

    Linux 下可以直接删除原文件并安装新文件,然后再重启软件或者电脑就可以了。
    MrKrabs
        16
    MrKrabs  
       164 天前
    ubuntu 可是拼命叫你重启
    beginor
        17
    beginor  
       164 天前 via Android
    但是很多补丁装完还是会提示重启的
    Chad0000
        18
    Chad0000  
       164 天前 via iPhone
    做到需要更大成本,让用户重启电脑很简单也没什么大的影响,所以这个热更新非必需。
    villivateur
        19
    villivateur  
       164 天前
    Linux 更新内核的话本来也是要重启的啊,或者 systemd 之类的
    NessajCN
        20
    NessajCN  
       164 天前
    要看哪种补丁。编译进内核或者启动参数加载内核参数的模块更新还是要重启的。通过 sysctl 加载的运行时参数或者 systemd 管理的系统进程就可以不重启
    shunia
        21
    shunia  
       164 天前   ❤️ 2
    不说 Linux ,只说你看到 windows 让你重启,那说明都是确实要重启才能生效的补丁。如果不重启就生效的,你自然也感觉不到。

    比如说偷偷给你安装安全管家可能就不需要你重启。
    asm
        22
    asm  
       164 天前
    我记得某个大佬说过一个问题,win 上如何删除正在运行的程序的文件。
    想了好久。。。
    dbak
        23
    dbak  
       164 天前
    linux 相关服务更新后会自动 reload 涉及到内核更新的也是提示要重启 reboot
    listen2wind
        24
    listen2wind  
       164 天前
    @dobelee 想起上次发包的时候,linux 上的包还在运行,就可以进行替换。而 windows 上的包在运行时无法被替换。
    wushenlun
        25
    wushenlun  
       164 天前 via Android
    换内核不要重启吗
    dyllen
        26
    dyllen  
       164 天前
    我记得 linux 好像出过不用重启更新内核版本的功能。
    libook
        27
    libook  
       164 天前
    这种就是有专门做就能支持。

    前段时间听了一个技术分享会,某些品牌的商用 Linux 发行版可以做到内核的函数级别热补丁,旧函数执行完之后再次调用就是新函数了,估计只要不是一直 loop 的函数都可以这样打补丁。
    Yanlongli
        28
    Yanlongli  
       164 天前
    这要看具体是什么功能以及拆分的深度。
    理论上第三方软件都是热插拔,内置的软件也有些同样热插拔,但是可能存在占用问题,就推荐重启一劳永逸。
    guo4224
        29
    guo4224  
       164 天前
    windows/macos 下的应用更新,也是不需要重启的,Linux 的 kernel 更新一样得重启。
    cyp0633
        30
    cyp0633  
       163 天前
    先问是不是吧,类似 livepatch 的东西我记得是业界很热门的一个话题,只不过可能对 downtime 苛刻的主要是 Linux 环境罢了
    iminto
        31
    iminto  
       163 天前 via Android
    你第一句话说的啥? Linux 能做到不重启系统安装安全补丁?

    不能。
    lucky85984
        32
    lucky85984  
       163 天前
    win 现在有了热补丁了,听说可以不用重启更新,未经查证。官方说的
    mmdsun
        34
    mmdsun  
       161 天前 via iPhone
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2834 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 12:17 · PVG 20:17 · LAX 04:17 · JFK 07:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.