/etc/apt/sources.list.d 相對於 /etc/apt/sources.list 有什麼好處

/etc/apt/sources.list.d 相對於 /etc/apt/sources.list 有什麼好處

我知道這個問題之前已經被問過,但我不接受答案,「你可以清楚地看到自訂添加」。當我添加ppa 時(我已經很多年沒有這樣做了),我按下鍵盤上標有“Enter”的鍵,這允許我在新條目之前添加一個空行(我什至會添加一個解釋性註釋,但我是一個科技作家,所以......)。我喜歡我的sources.conf乾淨整潔。

/etc/apt/sources.d

意味著我有六個檔案需要解析,而不是只有一個。

AFAIK,擁有一個配置文件與 6 個配置文件相比“絕對”沒有任何優勢(為了論證,也許你有 3 個甚至 2 個,沒關係……1 仍然勝過 2)。

有人可以想出一個合理的優勢嗎,「你可以清楚地看到自訂添加」是一個窮人的藉口。

我必須補充一點,我喜歡改變,但是,只有當改變帶來好處時。

第一次回覆後編輯:

它允許需要自己的存儲庫的新安裝不必搜索平面文件以確保它不會添加重複的條目。

現在,他們必須在目錄中搜尋受騙者而不是平面檔案。除非他們認為管理員不會改變事情...

它允許系統管理員輕鬆停用(透過重新命名)或刪除(透過刪除)儲存庫集,而無需編輯整體檔案。

管理員必須 grep 目錄來找到合適的檔案來重新命名,在此之前,他會搜尋一個檔案並註解掉一行,這是「幾乎」任何管理員的 sed 一行。

它允許套件維護者給出一個簡單的命令來更新儲存庫位置,而不必擔心無意中更改不相關儲存庫的配置。

我不明白這一點,我“假設”包維護者知道他的存儲庫的 URL。同樣,必須是sed目錄而不是單一檔案。

答案1

將每個儲存庫(或儲存庫集合)放在自己的檔案中可以更輕鬆地透過手動和程式設計方式進行管理:

  • 它允許需要自己的存儲庫的新安裝不必搜索平面文件以確保它不會添加重複的條目。
  • 它允許系統管理員輕鬆停用(透過重新命名)或刪除(透過刪除)儲存庫集,而無需編輯整體檔案。
  • 它允許套件維護者給出一個簡單的命令來更新儲存庫位置,而不必擔心無意中更改不相關儲存庫的配置。

答案2

在技​​術層面上,作為一個必須在一些大型且流行的系統資訊工具中處理這些變化的人,基本上可以歸結為:

對於sources.list.d/

# to add
if [[ ! -e /etc/apt/sources.list.d/some_repo.list ]];then
  echo 'some repo line for apt' > /etc/apt/sources.list.d/some_repo.list
fi

# to delete
if [[ -e /etc/apt/sources.list.d/some_repo.list ]];then
  rm -f /etc/apt/sources.list.d/some_repo.list
fi

請注意,除非他們也執行與下面相同的檢查,否則如果您註解掉了儲存庫行,則這些測試將是錯誤的。如果他們執行與下面相同的檢查,那麼它的複雜性是相同的,除了對多個文件而不是一個進行執行。另外,除非他們檢查所有可能的文件,否則他們可以並且經常這樣做,添加重複的項目,這會導致 apt 抱怨,直到您刪除其中一個。

對於來源.list

# to add. Respect commented out lines. Bonus points for uncommenting
# line instead of adding a new line
if [[ -z $( grep -E '\s*[^#]\s*some repo line for apt' /etc/apt/sources.list ) ]];then
  echo 'some repo line for apt' >> /etc/apt/sources.list
fi

# to delete. Delete whether commented out or not. Bonus for not
# deleting if commented out, thus respecting the user's wishes
sed -i '/.*some repo line for apt.*/d' /etc/apt/sources.list

Google Chrome 開發人員沒有檢查 Google Chrome 來源是否存在,而是依賴其 Chrome 套件建立的確切檔案名稱來顯示。在所有其他情況下,他們會在 resources.list.d 中建立一個新文件,並按照他們想要的方式命名。

當然,要查看您擁有哪些資源,這並不那麼漂亮,因為沒有比以下更容易閱讀和維護的了:

cat /etc/sources.list

據我所知,這基本上是為了自動更新,並為用戶提供簡單的單一命令。對於用戶來說,這意味著他們必須讀取許多文件而不是 1 個文件來查看是否添加了存儲庫,而對於 apt 來說,這意味著它必須讀取許多文件而不是一個文件。

因為在現實世界中,如果您想做好這一點,則必須支援對所有檔案進行檢查,無論它們的名稱是什麼,然後測試是否需要執行要執行的操作。

但是,如果您不打算做得很好,您只需忽略檢查該項目是否位於來源中的某個位置,而只檢查檔案名稱。我相信這就是大多數自動化的東西所做的,但由於最後,我只需檢查所有內容,以便我可以列出它並根據這些文件之一是否匹配來採取行動,唯一真正的結果是使它變得更複雜。

批次編輯

考慮到運行許多伺服器,我很想編寫一個夜間作業,循環遍歷 /etc/apt/sources.list.d/ 並首先檢查以確保該專案不在 resources.list 中,然後如果是不,將該專案新增到sources.list,刪除sources.list.d文件,如果已經在sources.list中,則刪除sources.list.d文件

由於除了簡單性和易於維護之外,僅使用 resources.list 沒有任何負面影響,因此添加類似的內容可能不是一個壞主意,特別是考慮到系統管理員的創意隨機操作。

如同上面評論所述, inxi -r 將整齊地列印每個文件的活動儲存庫,但當然不會編輯或更改它們,因此這只是解決方案的一半。如果有很多分佈,那麼學習每個分佈是如何做到的是一件很痛苦的事情,這是肯定的,而且不幸的是,隨機性肯定是規則而不是例外。

答案3

如果您手動管理伺服器,我同意這會讓事情變得更加混亂。然而,它有利於程式化管理(即“配置即程式碼”)。當使用 Puppet、Ansible、Chef 等組態管理軟體時,更容易刪除或刪除目錄中的檔案並執行apt update,而不是解析檔案以新增或刪除某些行。

/etc/apt/sources.list特別是因為這避免了必須管理來自第三方編寫的多個獨立模組的單一「文件」資源的內容,例如: 。

由於這個特殊原因,我很欣賞 Ubuntu 廣泛使用「.d」目錄,即 sudoers.d、rsyslog.d、sysctl.d.、cron.d、logrotate.d 等。

答案4

這允許套件添加額外的來源而無需求助於腳本。

例如,當您安裝 Microsoft 的 Skype 軟體套件時,skype.com 的來源會自動設定為下載更新;從系統中刪除 Skype 軟體包也會再次停用此軟體包來源。

如果您想使用平面檔案獲得相同的效果,那麼Skype的安裝腳本將需要修改您的sources.list,這可能會讓許多系統管理員感到有點不安。

相關內容