Jedes Repository (oder jede Sammlung von Repositorys) in einer eigenen Datei zu haben, macht es einfacher zu verwalten, sowohl manuell als auch programmgesteuert:
- Es ermöglicht neuen Installationen, die ihre eigenen Repositorys benötigen, nicht eine Flatfile durchsuchen zu müssen, um sicherzustellen, dass keine doppelten Einträge hinzugefügt werden.
- Es ermöglicht einem Systemadministrator, einen Repository-Satz einfach zu deaktivieren (durch Umbenennen) oder zu entfernen (durch Löschen), ohne eine monolithische Datei bearbeiten zu müssen.
- Es ermöglicht einem Paketbetreuer, einen einfachen Befehl zu geben, um Repository-Standorte zu aktualisieren, ohne sich Gedanken über eine versehentliche Änderung der Konfiguration für nicht verwandte Repositories machen zu müssen.
Auf technischer Ebene läuft es für jemanden, der diese Änderungen in einigen großen und beliebten Systeminfo-Tools handhaben musste, im Wesentlichen auf Folgendes hinaus:
Für 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
Beachten Sie, dass diese Tests falsch wären, es sei denn, sie führen auch die gleiche Prüfung wie unten durch, wenn Sie eine Repo-Zeile auskommentiert hätten. Wenn sie die gleiche Prüfung wie unten durchführen, dann ist es genau die gleiche Komplexität, außer dass sie über viele Dateien durchgeführt wird, nicht über eine. Außerdem können sie, sofern sie nicht ALLE möglichen Dateien überprüfen, ein doppeltes Element hinzufügen, was sie oft tun, was dann dazu führt, dass sich apt beschwert, bis Sie eines davon löschen.
Für sources.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
Die Google Chrome-Entwickler haben nicht auf das Vorhandensein von Google Chrome-Quellen geprüft, sondern sich auf den genauen Dateinamen verlassen, den ihr Chrome-Paket erstellen würde, um vorhanden zu sein. In allen anderen Fällen würden sie eine neue Datei in sources.list.d erstellen, die genau so benannt ist, wie sie es wollten.
Um zu sehen, welche Quellen Sie haben, ist es natürlich nicht so schön, da Sie nicht einfacher zu lesen und zu pflegen sind als:
cat /etc/sources.list
Soweit ich das beurteilen kann, wurde dies also im Grunde genommen zum Zweck automatisierter Updates gemacht und um einfache Einzelbefehle bereitzustellen, die Sie den Benutzern geben können. Für Benutzer bedeutet dies, dass sie viele Dateien anstelle von einer Datei lesen müssen, um zu sehen, ob sie ein Repo hinzugefügt haben, und für apt bedeutet dies, dass es auch viele Dateien anstelle von einer Datei lesen muss.
Denn in der realen Welt, wenn Sie dies gut machen wollen, müssen Sie Prüfungen gegen alle Dateien unterstützen, unabhängig davon, wie sie heißen, und dann testen, ob die auszuführende Aktion erforderlich ist oder nicht.
Wenn Sie es jedoch nicht gut machen würden, würden Sie einfach die Überprüfungen ignorieren, um zu sehen, ob sich das Element irgendwo in den Quellen befindet, und nur nach dem Dateinamen suchen. Ich glaube, das ist das, was die meisten automatisierten Sachen tun, aber da ich am Ende einfach alles überprüfen musste, damit ich es auflisten und handeln konnte, wenn eine dieser Dateien übereinstimmte, war das einzige wirkliche Ergebnis, dass es viel komplizierter wurde.
Bulk-Änderungen
Angesichts der Tatsache, dass viele Server laufen, wäre ich versucht, einfach einen nächtlichen Job zu skripten, der /etc/apt/sources.list.d/ durchläuft und zuerst prüft, ob das Element nicht bereits in sources.list ist, dann, wenn es ist nicht, fügen Sie dieses Element zu sources.list hinzu, löschen Sie die sources.list.d-Datei, und falls sie sich bereits in sources.list befindet, löschen Sie einfach die sources.list.d-Datei
Da es über die Einfachheit und Wartungsfreundlichkeit hinaus KEINEN Nachteil hat, nur sources.list zu verwenden, ist das Hinzufügen von so etwas möglicherweise keine schlechte Idee, insbesondere angesichts kreativer zufälliger Aktionen von Systemadministratoren.
Wie im obigen Kommentar angemerkt, wird inxi -r die aktiven Repos ordentlich pro Datei ausdrucken, aber natürlich nicht bearbeiten oder verändern, so dass das nur die halbe Lösung wäre. Wenn es viele Distributionen sind, ist es mühsam zu lernen, wie es jede tut, das ist sicher, und Zufälligkeit ist leider eher die Regel als die Ausnahme.
Wenn Sie Ihre Server manuell verwalten, stimme ich zu, dass dies die Dinge verwirrender macht. Es kommt jedoch der programmatischen Verwaltung zugute (dh "Konfiguration als Code"). Bei der Verwendung von Konfigurationsverwaltungssoftware wie Puppet, Ansible, Chef usw. ist es einfacher, eine Datei einfach in einem Verzeichnis abzulegen oder zu entfernen und apt update
auszuführen , anstatt eine Datei zu parsen, um bestimmte Zeilen hinzuzufügen oder zu entfernen.
Zumal dadurch vermieden wird, den Inhalt einer einzelnen „Datei“-Ressource verwalten zu müssen, z. B.:/etc/apt/sources.list
, aus mehreren unabhängigen Modulen, die von Dritten geschrieben wurden.
Aus diesem besonderen Grund schätze ich die breite Verwendung von ".d"-Verzeichnissen durch Ubuntu, d. h. sudoers.d, rsyslog.d, sysctl.d., cron.d, logrotate.d usw.