תיקון שגיאת מקורות apt כפולים וקבצי deb822
נתקלתם בשגיאת Target is configured multiple times בעת הרצת apt update? המדריך מסביר כיצד לאתר קבצי .list ו-.sources כפולים ב-Ubuntu 24.04 ומעלה ולנקות את ההגדרות.
מה משמעות השגיאה על מקורות apt כפולים
מקורות apt כפולים מציינים שמאגר מסוים הוגדר פעמיים, בשני קבצים שונים, וכי APT (כלי החבילות המתקדם) זיהה את שני העותקים. בגרסאות Ubuntu 24.04 ומעלה, הדבר קורה כמעט תמיד משום שסקריפט התקנה של צד שלישי יצר קובץ .list ישן בפורמט שורה אחת, בעוד שקובץ .sources בפורמט deb822 עבור אותו מאגר כבר היה קיים על הדיסק. שום דבר אינו פגום ושום חבילה אינה נמצאת בסיכון. מחקו את אחת משתי ההגדרות וההודעה תיעלם.
זו השורה שאנשים מדביקים בתיבת החיפוש:
W: Target Packages (stable/binary-amd64/Packages) is configured multiple times in /etc/apt/sources.list.d/docker.list:1 and /etc/apt/sources.list.d/docker.sources:1קראו אותה מהסוף להתחלה. שני קבצים, כל אחד עם מספר שורה, מגדירים את אותו הדבר. Target Packages הוא האינדקס ש־apt מוריד כדי ללמוד אילו חבילות מאגר מציע, ו־stable/binary-amd64/Packages מציין את הרכיב (stable) ואת הארכיטקטורה (amd64) שהאינדקס מכסה. לכן, apt מודיע לכם שהאינדקס amd64 עבור הרכיב stable מוגדר ב־docker.list בשורה 1, ושוב ב־docker.sources בשורה 1.
בגרסאות apt 3.0 ומעלה, כלומר החל מ־Ubuntu 25.04 ומ־Debian 13, אותה הודעה מתחילה ב־Warning: במקום ב־W:. הטקסט שאחרי הקידומת זהה.
אזהרה זו היא המקרה הקל. apt מאחד את שתי ההגדרות והעדכון ממשיך לרוץ, כיוון ששניהם מתארים את אותו ארכיון עם אותו מפתח. המקרה הקשה עוצר הכל:
E: Conflicting values set for option Signed-By regarding source https://download.docker.com/linux/ubuntu/ noble: /usr/share/keyrings/docker-archive-keyring.gpg != /etc/apt/keyrings/docker.asc
E: The list of sources could not be read.apt מסרב לפעול כאן כיוון ששתי ההגדרות מציינות מפתחות חתימה שונים עבור אותו ארכיון. הוא יאחד שתי הגדרות זהות, אך הוא לא יבחר בין שני ערכי Signed-By, כיוון שבחירה בערך השגוי משמעותה בדיקת חתימות חבילות מול מפתח שבעל הארכיון מעולם לא חתם באמצעותו. לכן, apt לא קורא אף מקור. apt update ו־apt install שניהם ייכשלו עם אותן שתי שורות עד שתערכו את הקבצים ידנית.
כיצד נוצר הכפילות
שני הפורמטים נמצאים בקבצים נפרדים עם סיומות שונות, לכן אין שום דבר במערכת הקבצים שמונע משניהם להתקיים בו-זמנית. apt מזהה את החפיפה בשלב מאוחר, כאשר הוא פורס כל קובץ מקור לרשימת יעדי אינדקס שהוא מתכנן להוריד. עד לאותו רגע, docker.list ו-docker.sources הם שני קבצים שאינם קשורים זה לזה.
ארבעה אירועים שגרתיים יוצרים את הזוג הזה:
- סקריפט התקנה של ספק, או פקודה שהועתקה מפוסט ישן, כותבים את
/etc/apt/sources.list.d/vendor.listעם שורתtee. - החבילה של הספק עצמו מפיצה בשלב מאוחר יותר את
/etc/apt/sources.list.d/vendor.sourcesומתקינה אותו עבורך. add-apt-repositoryבגרסאות Ubuntu 24.04 ומעלה כותב קובצי deb822 מסוג.sources, לכן PPA (ארכיון חבילות אישי) שהוספת בעבר ידנית כ-.listחוזר כ-.sources.- שדרוג גרסת הפצה שכתב מחדש את מקורות ההפצה עצמה לפורמט deb822, והשאיר את קובץ ה-
.listשכתבת ידנית ללא שינוי לצידם.
כל נתיב הוא סביר כשלעצמו. הכפילות היא התוצאה שמתקבלת כאשר שניים מהם מתרחשים על אותו שרת, לעיתים קרובות בהפרש של חודשים זה מזה.
שני הפורמטים, זה לצד זה
הפורמט הישן מורכב משורה אחת לכל מאגר, וכל חלק בו מוגדר לפי מיקומו.
deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu noble stableהסדר קבוע: הסוג (deb עבור חבילות בינאריות, deb-src עבור חבילות מקור), לאחר מכן אפשרויות בסוגריים מרובעים, לאחר מכן ה-URI (מזהה משאב אחיד) של הארכיון, לאחר מכן ה-suite, ולבסוף רכיב אחד או יותר. מכיוון שהמשמעות נגזרת מהמיקום, רווח במקום הלא נכון משנה את מה ש-apt קורא.
פורמט deb822 מציג את אותו המידע כבית (stanza) של שדות בעלי שם. השם מגיע מ-RFC 822, סגנון כותרות הדואר ש-Debian כבר משתמשת בו עבור קובצי בקרת חבילות.
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: noble
Components: stable
Architectures: amd64
Signed-By: /etc/apt/keyrings/docker.ascאותו מאגר, אותו מפתח, ללא תוספות. המיפוי ישיר: deb הופך ל-Types, כתובת הארכיון הופכת ל-URIs, ה-suite הופך ל-Suites, הרכיבים הופכים ל-Components, וכל אפשרות בסוגריים הופכת לשדה משלה; כך signed-by= הופך ל-Signed-By: ו-arch= הופך ל-Architectures:.
כל שם שדה הוא ברבים מכיוון שכל שדה מקבל רשימה המופרדת ברווחים. Suites: noble noble-updates noble-backports בבית אחד מחליף שלוש שורות deb נפרדות. שורה ריקה מסיימת בית, כך שקובץ .sources יחיד יכול להכיל כמה מאגרים. deb822 תומך גם בהגדרות שהפורמט החד-שורתי מטפל בהן בצורה לקויה: Enabled: no לכיבוי מאגר, Trusted, Check-Valid-Until, ומפתח מוטבע (inline) המודבק ישירות לתוך Signed-By, כאשר כל שורה מוזחת ברווח אחד ושורות ריקות נכתבות כנקודה בודדת.
מיקום הקבצים
/etc/apt/sources.list: הקובץ המקורי היחיד. בגרסאות Ubuntu 24.04 ומעלה הוא לרוב ריק או מכיל רק הערה המפנה למיקום החדש./etc/apt/sources.list.d/*.list: רשומות בשורה אחת, בדרך כלל קובץ אחד לכל מאגר (repository)./etc/apt/sources.list.d/*.sources: בתים (stanzas) בפורמט deb822. בגרסאות Ubuntu 24.04 ומעלה, המאגרים של ההפצה עצמה נשמרים כאן, בתוךubuntu.sources./etc/apt/keyrings/: המקום אליו שייכים מפתחות שאתם מוסיפים./usr/share/keyrings/מכיל מפתחות שהגיעו מחבילה.
apt קורא רק קבצים שמסתיימים ב-.list או ב-.sources, ושם קובץ יכול להכיל אותיות, ספרות, קו תחתון, מקף ונקודה. קובץ עם כל סיומת אחרת ידולג עם הודעה, דבר שחשוב עבור התיקון להלן.
איתור זוג כפול
התחילו עם רשימת הקבצים בספרייה:
ls -l /etc/apt/sources.list.d/-rw-r--r-- 1 root root 195 Aug 3 09:12 docker.list
-rw-r--r-- 1 root root 254 Aug 9 14:40 docker.sources
-rw-r--r-- 1 root root 2683 Jun 11 08:02 ubuntu.sourcesשני קבצים בעלי אותו שם בסיס וסיומות שונות הם הזוג הכפול הנפוץ, אך אל תסתמכו על השמות. קראו את התוכן, כיוון שעותק כפול יכול להסתתר בתוך קובץ בעל שם כלשהו:
grep -rn -E '^(deb |deb-src |Types:|URIs:|Suites:|Signed-By:)' /etc/apt/sources.list /etc/apt/sources.list.d//etc/apt/sources.list.d/docker.list:1:deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu noble stable
/etc/apt/sources.list.d/docker.sources:1:Types: deb
/etc/apt/sources.list.d/docker.sources:2:URIs: https://download.docker.com/linux/ubuntu
/etc/apt/sources.list.d/docker.sources:3:Suites: noble
/etc/apt/sources.list.d/docker.sources:6:Signed-By: /etc/apt/keyrings/docker.ascהזוג הוא שני הערכים עם אותו host ואותה suite. שניהם מצביעים על https://download.docker.com/linux/ubuntu ועל ה-suite noble, לכן מדובר באותו מאגר שנכתב פעמיים. גם נתיבי ה-Signed-By שלהם אינם תואמים, וזה מה שיוצר את השגיאה Conflicting values שהוצגה קודם לכן.
השתמשו ב-grep במקום בפקודת apt עבור שלב זה. כאשר apt נעצרת בשל ההתנגשות, היא אינה יכולה להציג את רשימת המקורות שלכם, ולכן apt-cache policy תדפיס את אותה שגיאה במקום את התשובה שאתם מחפשים.
תיקון: שמרו את קובץ ה-deb822, הסירו את הקובץ הישן
שמרו את הקובץ .sources. זהו הפורמט שבו כלי ה-apt כותבים כיום, וזהו הכיוון שאליו צועדות Debian ו-Ubuntu. לפני מחיקה של קובץ כלשהו, בדקו איזה משני נתיבי המפתח קיים על הדיסק:
ls -l /etc/apt/keyrings/ /usr/share/keyrings/ | grep -i docker-rw-r--r-- 1 root root 4813 Aug 9 14:40 docker.ascרק /etc/apt/keyrings/docker.asc קיים, לכן קובץ ה-deb822 הוא המקור המהימן, והקובץ .list מצביע על מפתח שהוסר. אם מתברר שהקובץ שאתם מתכננים לשמור מצביע על המפתח החסר, העתיקו אליו תחילה את הנתיב התקין, ורק לאחר מכן מחקו את הקובץ השני.
העבירו את הקובץ הישן אל מחוץ לספרייה במקום למחוק אותו מיד:
sudo mkdir -p /root/apt-sources-backup
sudo mv /etc/apt/sources.list.d/docker.list /root/apt-sources-backup/
sudo apt updateשינוי השם ל-docker.list.bak והשארתו במקום גם הוא פתרון תקין, כיוון ש-apt מתעלם מסיומות לא מוכרות, אך אז כל הרצה של apt תציג את ההודעה הבאה:
N: Ignoring file 'docker.list.bak' in directory '/etc/apt/sources.list.d/' as it has an invalid filename extensionהעברת הקובץ למקום אחר תמנע מהודעה זו להופיע על המסך ותשמור על גיבוי. הרצה תקינה של apt update לאחר מכן תיראה כך, ללא שורה המציינת שני קבצים:
Hit:1 http://archive.ubuntu.com/ubuntu noble InRelease
Get:2 https://download.docker.com/linux/ubuntu noble InRelease [48.8 kB]
Get:3 http://security.ubuntu.com/ubuntu noble-security InRelease [126 kB]
Fetched 175 kB in 1s (146 kB/s)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
All packages are up to date.כעת ודאו שהמאגר שרד את העריכה:
apt-cache policy | grep download.docker.com 500 https://download.docker.com/linux/ubuntu noble/stable amd64 Packages
origin download.docker.comאם התיעוד של ספק מסוים עדיין מניח שימוש בקובץ בעל שורה אחת, תוכלו לשמור אותו ולמחוק במקום זאת את הקובץ .sources. כלל אחד קובע את ההחלטה בכל מקרה: מותר שקובץ אחד בלבד יגדיר ארכיון וסוויטה מסוימים.
מדוע מקור צד-שלישי תקול אחד תוקע את apt update
הכשל הסמוך נראה אחרת אך מקורו זהה: מקור צד-שלישי ש-apt אינו יכול להשתמש בו. הגרסה הראשונה נובעת ממפתח חסר:
Err:5 https://download.docker.com/linux/ubuntu noble InRelease
The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 7EA0A9C3F273FCD8
E: The repository 'https://download.docker.com/linux/ubuntu noble InRelease' is not signed.
N: Updating from such a repository can't be done securely, and is therefore disabled by default.השדה Signed-By חסר, או שהוא מצביע על קובץ שאינו מפתח תקין, ולכן apt אינו יכול לאמת את החתימה על קובץ ה-InRelease של המאגר. כתוצאה מכך, הוא זורק את כל המאגר במקום לבטוח ברשימות חבילות שאינו יכול לבדוק. בדקו את קובץ המפתח עצמו:
ls -l /etc/apt/keyrings/docker.asc
gpg --show-keys /etc/apt/keyrings/docker.ascמפתח תקין מדפיס שורת pub עם מזהה מפתח ושורת uid המציינת את הספק. gpg: no valid OpenPGP data found. משמעותו שהקובץ אינו מפתח כלל, מה שבדרך כלל אומר שהורדה שמרה דף שגיאה כיוון שכתובת ה-URL של המפתח השתנתה. משכו את המפתח שוב, בדקו את הקובץ, ולאחר מכן הריצו את apt update.
הגרסה השנייה מופיעה לאחר שדרוג גרסת הפצה:
Err:6 https://ppa.launchpadcontent.net/ondrej/php/ubuntu plucky InRelease
404 Not Found [IP: 10.0.0.80 443]
E: The repository 'https://ppa.launchpadcontent.net/ondrej/php/ubuntu plucky Release' does not have a Release file.ה-PPA לא פרסם דבר עבור אותה סוויטה, לכן הנתיב אינו קיים בשרת והבקשה מחזירה 404. שאר המאגרים שלכם עדיין מתעדכנים, והחבילות שכבר מותקנות אצלכם נשארות ללא שינוי. עם זאת, הפעולה מסתיימת עם קוד שגיאה, כך שכל סקריפט שבודק את סטטוס היציאה של apt update ידווח כעת על כשל בכל הרצה. זו הסיבה שכדאי לנקות מקור מת במערכת שמוגדרים בה עדכוני אבטחה אוטומטיים: הרעש היומי הוא המקום שבו מסתתר כשל אמיתי.
נטרול מקור אחד מבלי לפגוע בשאר
עבור קובץ בתסדיר deb822, הוסיפו שדה אחד לבלוק (stanza) ושמרו את הקובץ:
Types: deb
URIs: https://ppa.launchpadcontent.net/ondrej/php/ubuntu
Suites: plucky
Components: main
Signed-By: /etc/apt/keyrings/ondrej-php.asc
Enabled: noהמדריך של apt ממליץ על שיטה זו על פני הפיכת כל שורה בבלוק להערה, שכן קל יותר לבטל אותה. עבור קובץ בעל שורה אחת, הוסיפו # בתחילת השורה. בשני הפורמטים, גם העברת הקובץ מתוך /etc/apt/sources.list.d/ תשיג את אותה תוצאה, וזו האפשרות המועדפת כאשר המאגר אינו רלוונטי עוד לצמיתות.
הריצו שוב את sudo apt update. בלוק ה-Err: עבור אותו מאגר ייעלם, וסטטוס היציאה יחזור להיות 0, דבר שניתן לוודא באמצעות echo $? בשורה הבאה.
לעולם אל תתקנו מקור שבור באמצעות sudo rm /etc/apt/sources.list.d/*. בגרסאות Ubuntu 24.04 ומעלה, פקודה זו מוחקת את ubuntu.sources, המכיל את מאגרי ההפצה עצמם, ובכך מותירה את apt ללא רשימות חבילות כלל ומציגה שגיאת E: Unable to locate package curl עבור תוכנות שקיימות ללא ספק. אם כבר הרצתם את הפקודה, שחזרו את הקובץ:
Types: deb
URIs: http://archive.ubuntu.com/ubuntu/
Suites: noble noble-updates noble-backports
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
Types: deb
URIs: http://security.ubuntu.com/ubuntu/
Suites: noble-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpgשמרו זאת כ-/etc/apt/sources.list.d/ubuntu.sources, כאשר noble מוחלף בשם הגרסה שלכם מתוך lsb_release -cs, ולאחר מכן הריצו את sudo apt update.
המרת קובצי .list ישנים לפורמט deb822
החל מאוגוסט 2026, apt בגרסה 3.0 ומעלה כולל כלי המרה מובנה למטרה זו. הכלי זמין ב-Debian 13, ב-Ubuntu 25.04 ובכל גרסה שבאה אחריהן, כולל 26.04. בדקו את גרסת התוכנה והריצו את הפקודה:
apt --version
sudo apt modernize-sourcesהכלי משכתב את הקבצים בעלי השורה הבודדת הנמצאים תחת /etc/apt/sources.list.d/ לקובצי deb822 בפורמט .sources. קראו את הפלט שהכלי מציג, לאחר מכן הציגו את תוכן התיקייה בעצמכם והריצו apt update לפני שתסתמכו על התוצאות. ב-Ubuntu 24.04 מותקנת גרסה ישנה יותר של apt ללא פקודת משנה זו, והפקודה תחזיר E: Invalid operation modernize-sources. בגרסה זו, יש לבצע את ההמרה ידנית לפי מיפוי השדות המפורט לעיל.
ההמרה היא אופציונלית כיום, שכן apt עדיין קורא את שני הפורמטים. עם זאת, כדאי לבצע אותה בשרת שאתם מתכננים לתחזק לאורך זמן, כיוון שכל כלי שכותב כיום מקורות תוכנה משתמש בפורמט deb822, ומערכת המכילה רק קובצי .sources לא תסבול מכפילויות מסוג זה.
שמירה על סדר במקורות צד-שלישי בשרת
מאגרי צד-שלישי הם הרכיב בשרת שמתיישן בצורה המהירה ביותר. כל מאגר כזה הוא התחייבות של גורם חיצוני להמשיך ולפרסם עדכונים עבור גרסת ה-Ubuntu שלכם, ושדרוג גרסה בוחן כל אחת מההתחייבויות הללו בבת אחת.
- הוסיפו מאגר צד-שלישי רק כאשר חבילות ההפצה אינן מספקות את הצרכים. LAMP stack on Ubuntu 24.04 סטנדרטי אינו זקוק לאף מאגר כזה: ארכיון Ubuntu מכיל את כל החבילות הנדרשות, עם עדכוני אבטחה לאורך כל חיי הגרסה.
- שמרו מפתחות ב-
/etc/apt/keyrings/, קובץ אחד לכל ספק, בהרשאות 644. המשתמש הלא-מורשה_aptמבצע את ההורדה ונדרש לקרוא את המפתח, לכן קובץ מפתח שניתן לקריאה רק על ידי root יגרום לשגיאת הרשאות בכל ניסיון משיכה מהמאגר. - הפנו את
Signed-Byלקובץ הספציפי בכל stanza. מפתח שנמצא ב-/etc/apt/trusted.gpgאו ב-/etc/apt/trusted.gpg.d/נחשב מהימן עבור כל מאגר בשרת, מה שאומר שמפתח ספק שהוסף לפני שנים יכול לאמת חבילות מכל מקור שהוא. - לפני שדרוג גרסה, עברו על המקורות שלכם וודאו שכל ספק כבר מפרסם חבילות עבור הגרסה שאליה אתם עוברים.
מפתח שנמצא ב-keyring הגלובלי הישן מציג אזהרה בכל עדכון:
W: https://download.docker.com/linux/ubuntu/dists/noble/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details.ייצאו את המפתח הבודד לקובץ משלו, ולאחר מכן הפנו אליו את ה-stanza:
gpg --no-default-keyring --keyring /etc/apt/trusted.gpg --export 7EA0A9C3F273FCD8 | sudo tee /etc/apt/keyrings/docker.gpg > /dev/null
sudo chmod 644 /etc/apt/keyrings/docker.gpgהוסיפו את Signed-By: /etc/apt/keyrings/docker.gpg ל-stanza של המאגר והריצו את sudo apt update. האזהרה תיפסק ברגע שאף מאגר לא יהיה תלוי ב-keyring הישן, ואז תוכלו להסיר את הרשומה באמצעות sudo gpg --no-default-keyring --keyring /etc/apt/trusted.gpg --delete-key 7EA0A9C3F273FCD8.
הרגל נוסף חוסך את מירב עוגמת הנפש. do-release-upgrade משבית מקורות צד-שלישי במהלך השדרוג ומשאיר אותם כבויים לאחר מכן; הפעלה ידנית שלהם, אחד אחד, היא בדיוק המקום שבו נוצרות כפילויות בהגדרות. קראו את the Ubuntu 24.04 to 26.04 upgrade guide לפני שתתחילו, ורשמו לעצמכם אילו מאגרים אתם עדיין צריכים. במכונה שהרגע הקמתם, הרגע הזול ביותר לסדר את המקורות הוא במהלך the first ten minutes on a new VPS, בזמן שהרשומות היחידות בשרת הן אלו ש-Ubuntu סיפקה במקור.
FAQ
מדוע apt מציג הודעה שהיעד מוגדר פעמיים?
הסיבה היא ששני קבצים תחת /etc/apt/sources.list.d/ מגדירים את אותו המאגר (repository), את אותה הסוויטה ואת אותו הרכיב. ההודעה מציינת את שני הקבצים עם מספרי השורות, למשל docker.list:1 ו-docker.sources:1. המערכת apt מאחדת אותם וממשיכה לעבוד, כך שפעולת העדכון עצמה עדיין תקינה. בכל זאת, כדאי להסיר את הכפילות: ברגע ששני הקבצים יציינו מפתחות חתימה שונים, apt תעצור עם השגיאה E: Conflicting values set for option Signed-By ותסרב לקרוא כל מקור שהוא, מה שיחסום גם את apt install.
האם עליי לשמור את קובץ ה-.list או את קובץ ה-.sources?
שמרו את קובץ ה-.sources. הפורמט deb822 הוא מה ש-add-apt-repository כותב בגרסאות Ubuntu 24.04 ומעלה; הוא מכיל שדה בעל שם לכל הגדרה במקום טקסט מבוסס מיקום בסוגריים מרובעים, וזהו הכיוון שאליו הולכות ההפצות. לפני מחיקת קובץ ה-.list, ודאו שהנתיב Signed-By בתוך קובץ ה-.sources מצביע על מפתח שקיים, בעזרת ls -l /etc/apt/keyrings/. העבירו את הקובץ הישן אל מחוץ ל-/etc/apt/sources.list.d/ במקום לשנות את שמו בתוך הספרייה, כיוון ששם קובץ שנותר עם סיומת .bak יגרום ל-apt להציג הודעת קובץ-המתעלמים (ignored-file) בכל הרצה.
כיצד אוכל לכבות מאגר apt מבלי להסיר אותו?
בקובץ .sources בפורמט deb822, הוסיפו את השורה Enabled: no לבית (stanza) הרלוונטי. בקובץ .list בשורה אחת, הוסיפו # בתחילת השורה. בכל מקרה, הריצו את sudo apt update לאחר מכן, ובלוק ה-Err: עבור אותו מאגר ייעלם. זהו הצעד הנכון כאשר למאגר צד-שלישי אין עדיין חבילות עבור גרסת ה-Ubuntu שלכם, והשגיאה 404 שהוא מחזיר גורמת ל-apt update להסתיים עם קוד שגיאה.
האם הפורמט של שורה אחת ב-sources.list עומד להיעלם?
הוא מוגדר כ-deprecated (מיושן), אך לא הוסר. המערכת apt עדיין קוראת קובצי .list ותעשה זאת עוד זמן רב, כך ששום דבר בשרת שלכם לא יפסיק לעבוד מחר. כלי עבודה חדשים כותבים בפורמט deb822: גרסאות Ubuntu 24.04 ומעלה שומרות את מאגרי ההפצה ב-/etc/apt/sources.list.d/ubuntu.sources, ו-add-apt-repository כותב קובצי .sources. בגרסאות apt 3.0 ומעלה, sudo apt modernize-sources ממיר את הקבצים שעדיין ברשותכם.