我知道以前有人问过这个问题,但我不接受“您可以清楚地看到自定义添加”的答案。当我添加 ppa 时(我已经多年没有这样做了),我在键盘上按了一个标有“Enter”的键,它允许我在新条目之前添加一个空行(我什至会添加一个解释性评论,但我是技术作家,所以....)。我喜欢我的sources.conf
干净整洁。
/etc/apt/sources.d
意味着我有六个文件要解析,而不仅仅是一个。
AFAIK,拥有一个配置文件与 6 相比“绝对”没有优势(为了争论,也许你有 3 个甚至 2 个,没关系...... 1 仍然胜过 2)。
有人可以提出一个合理的优势,“你可以清楚地看到自定义添加”是一个穷人的借口。
我必须补充一点,我喜欢改变,但是,只有当改变带来好处时。
第一次回复后编辑:
它允许需要自己的存储库的新安装不必搜索平面文件以确保它不会添加重复条目。
现在,他们必须在目录中搜索被欺骗的文件,而不是在平面文件中搜索。除非他们认为管理员不会改变事情......
它允许系统管理员轻松禁用(通过重命名)或删除(通过删除)存储库集,而无需编辑单一文件。
管理员必须在 grep 目录中找到要重命名的适当文件,在此之前,他会搜索 ONE 文件并注释掉一行,即“几乎”任何管理员的 sed 单行。
它允许包维护者给出一个简单的命令来更新存储库位置,而不必担心无意中更改不相关存储库的配置。
我不明白这一点,我“假设”包维护者知道他的存储库的 URL。同样,必须sed
使用目录而不是单个文件。
将每个存储库(或存储库集合)放在自己的文件中,可以更轻松地手动和以编程方式进行管理:
在技术层面上,作为必须在一些大型和流行的系统信息工具中处理这些更改的人,基本上可以归结为:
对于sources.list.d/
请注意,除非他们也进行与下面相同的检查,否则如果您已注释掉回购行,则这些测试将是错误的。如果他们正在执行与下面相同的检查,那么它的复杂性完全相同,除了对许多文件执行,而不是一个。此外,除非他们正在检查所有可能的文件,否则他们可以并且经常会添加重复的项目,这会导致 apt 抱怨,直到您删除其中一个。
对于sources.list
Google Chrome 开发人员没有检查是否存在 Google Chrome 源,而是依靠他们的 Chrome 包将创建的确切文件名来存在。在所有其他情况下,他们将在 sources.list.d 中创建一个新文件,以他们想要的方式命名。
当然,要查看您拥有哪些资源,它并不那么漂亮,因为您无法比以下方式更容易阅读和维护:
因此,据我所知,这基本上是为了自动更新的目的,并提供可以给用户的简单的单个命令。对于用户而言,这意味着他们必须读取许多文件而不是 1 个文件才能查看是否添加了 repo,而对于 apt,这意味着它也必须读取许多文件而不是一个文件。
因为在现实世界中,如果你要做好这件事,你必须支持对所有文件的检查,不管它们的名字是什么,然后测试是否需要执行要执行的操作。
但是,如果您做得不好,您只需忽略检查以查看该项目是否在源中的某个位置,而只需检查文件名。我相信这是大多数自动化的东西所做的,但是因为最后,我只需要检查所有内容,以便我可以列出它并根据其中一个文件是否匹配采取行动,唯一真正的结果是让它变得更加复杂。
批量编辑
鉴于运行许多服务器,我很想只编写一个循环通过 /etc/apt/sources.list.d/ 并首先检查以确保该项目不在 sources.list 中的夜间作业,然后如果它是不,将该项目添加到sources.list,删除sources.list.d文件,如果已经在sources.list中,只需删除sources.list.d文件
由于除了简单和易于维护之外,仅使用 sources.list 并没有负面影响,因此添加类似的东西可能不是一个坏主意,特别是考虑到系统管理员的创造性随机操作。
正如上面评论中提到的,inxi -r 将整齐地打印出每个文件的活动存储库,但当然不会编辑或更改它们,所以这只是解决方案的一半。如果它有很多分布,那么学习每个分布是如何做到的会很痛苦,这是肯定的,而且随机性肯定是规则而不是可悲的例外。
如果您手动管理服务器,我同意这会让事情变得更加混乱。但是,它有利于程序化管理(即“配置即代码”)。当使用 Puppet、Ansible、Chef 等配置管理软件时,只需在 dir 中删除或删除文件并运行
apt update
即可,而不是解析文件以添加或删除某些行。特别是因为这避免了必须管理单个“文件”资源的内容,例如:
/etc/apt/sources.list
来自第三方编写的多个独立模块的内容。由于这个特殊原因,我很欣赏 Ubuntu 广泛使用“.d”目录,即 sudoers.d、rsyslog.d、sysctl.d.、cron.d、logrotate.d 等。
正如nemo在评论中指出的那样,目录的主要优点之一是它允许“所有权”的概念。
现代 Linux 发行版和安装程序都基于包的概念——独立的软件片段,可以尽可能地以原子方式添加和删除。
dpkg
每当您使用(因此)安装软件包时apt
,它都会跟踪系统上的哪些文件是由该安装程序创建的。然后,卸载软件包主要包括删除这些文件。目前接受的答案认为谷歌浏览器安装程序认为它应该只在它预期的位置创建或删除一个条目是一件坏事,但是自动化其他任何事情会导致各种可怕的边缘情况;例如:
sources.list
,但被注释掉,安装程序应该取消注释它,还是添加一个副本?所有权不需要单独的文件;例如,安装程序可以包含一个注释块,说明它“拥有”一组特定的行。在这种情况下,它总是会在文件中搜索那个确切的块,而不是对同一存储库的其他提及。
在其他条件相同的情况下,自动编辑单个配置文件总是比自动创建和删除单独文件更复杂。至少,删除线需要使用一些模式匹配工具,例如
sed
. 在更复杂的文件中,添加和删除行都可能需要具有文件格式知识的脚本工具,以添加到适当的部分,或者在不破坏周围格式的情况下删除。由于安装人员无论如何都需要避免弄乱手动编辑的配置,因此将自动化的、工具拥有的配置以易于自动化工具管理的格式放置是有意义的。
这允许包在不借助脚本的情况下添加额外的源。
例如,当您安装 Microsoft 的 Skype 软件包时,Skype.com 的源会自动配置为下载更新;从系统中删除 Skype 包也会再次禁用此包源。
如果你想对一个平面文件有同样的效果,那么 Skype 的安装脚本需要修改你的 sources.list,这可能会让很多系统管理员感到有些不安。
我不相信有一个很好的理由——除了它看起来很时髦。对我来说,它打破了一个目录应该是叶子或分支的规则——即它应该只包含文件或目录,而不是两者的混合。
我想它确实使文件更小,更容易阅读 - 例如 sudo 规则,它可能很长,它确实使为一种类型的用户(比如开发人员)拥有一套标准化的规则变得更容易),如果应该允许开发人员在这台机器上使用 sudo,则将它们添加到 config 目录;因此,您需要维护更少的文件 - 只是为开发人员、管理员、系统操作员等提供的文件,而不是针对所有可能的组合。
在那里,我自相矛盾。
我想我不清楚。
在我看来,应该有一个目录 /etc/.../list.d,但所有文件都应该在那里。当配置的一部分位于单独的目录中时,它很丑陋,并且更难解析。每个 repo 的单独文件,但都在一个目录中,或者都在子目录中,所以
等等。
这允许所有权(正如其他人提到的)是细粒度的。目录 /etc/${system} (其中系统可能是 yum/apt 或其他)将由 root 拥有,将系统期望的任何内容组合在一起,rw 用于组,而 --- 用于其他。use_{1,2} 目录可以归更合适的用户所有。
正如 Seamus 所评论的那样,最适合您的就是最好的。