代码之家  ›  专栏  ›  技术社区  ›  Chris

Linux存储库管理器如何自我更新的设计原则?

  •  0
  • Chris  · 技术社区  · 14 年前

    我知道还有其他应用程序,但是考虑到yum/apt get/aptitude/pacman是Linux发行版的核心包管理器。

    今天我看到了我的软呢帽13盒:

    (7/7): yum-3.2.28-4.fc13_3.2.28-5.fc13.noarch.drpm       |  42 kB     00:00     
    

    我开始怀疑这样的包是如何自我更新的?需要什么设计来确保程序能够自我更新?

    也许这个问题太笼统了,但我觉得它比程序员更合适,因为这个问题本质上更技术化。如果有一个更适合这个问题的地方,请随时告诉我,我可以关闭或版主可以移动。

    谢谢。

    2 回复  |  直到 14 年前
        1
  •  1
  •   dmckee --- ex-moderator kitten    14 年前

    我不知道这些特定的系统是如何工作的,但是…

    • 现代的Unix系统通常可以在不出现故障的情况下覆盖正在运行的可执行文件,因此理论上您可以这样做。
    • 您可以在chrot监狱中执行此操作,然后移动或类似操作,以缩短系统易受攻击的时间。添加一个日志文件系统,这仍然比较安全。

    我突然想到,包管理器需要将包访问数据库保存在内存中,以确保在内存中不存在竞争条件。同样,CHROOT监狱和拷贝选项是一种低风险的替代方案。

        2
  •  0
  •   James Antill    14 年前

    我开始怀疑这样的包是如何自我更新的?什么 需要设计来确保程序能够自我更新?

    就像很多事情一样,你不需要专门“设计”来解决这个问题…但你需要知道某些“陷阱”。

    例如,Unix通过引用计数inode来帮助“您”删除您仍在使用的文件,这很好。然而,这意味着你必须做一些事情,例如,如果你有插件,那么你需要将它们全部加载。 之前

    您还需要做一些事情来确保正在更新的任何内容都能正常工作,例如:在删除旧文件之前放下新文件。不要截断旧文件,只需取消链接。但这些也有助于你:)。

    使用与您通信的外部问题可能很棘手(因为在旧版本更新后无法执行新版本)。但这并不是经常做的,当它是下载之类的事情时…这在任何更新之前都可以很容易地实现。

    在命令行客户机(如yum/apt)中也有一些事情不值得关注,例如,如果您有一个程序要运行2+“更新”,那么如果第一次更新是包管理器,则可能会出现问题。降级使这变得更有趣:)。 此外,类似守护进程的进程基本上不应该“加载”包管理器,但与其他gotchas一样…不管怎样,出于其他原因,你倾向于遵循这一点。