Cara Selesaikan Ralat Sumber APT Pendua
Ralat target configured multiple times berlaku apabila fail .list dan .sources bertindih pada Ubuntu 24.04. Ikuti langkah mudah untuk memadam fail pendua dan membaiki apt update.
Apakah maksud ralat sumber apt pendua
Sumber apt pendua bermaksud satu repositori diisytiharkan sebanyak dua kali dalam dua fail berbeza, dan APT (advanced package tool) telah menemui kedua-dua salinan tersebut. Pada Ubuntu 24.04 dan versi lebih baharu, perkara ini hampir selalu berlaku kerana skrip pemasangan pihak ketiga menulis fail .list satu baris yang lama, sedangkan fail deb822 .sources untuk repositori yang sama sudah pun wujud dalam cakera. Tiada apa-apa yang rosak dan tiada pakej yang berisiko. Padamkan salah satu daripada dua pengisytiharan tersebut dan mesej itu akan hilang.
Ini adalah baris yang biasanya ditampal oleh pengguna ke dalam kotak carian:
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:1Baca baris tersebut dari hujung. Dua fail, setiap satunya dengan nombor baris, mengisytiharkan perkara yang sama. Target Packages ialah indeks yang dimuat turun oleh apt untuk mengetahui pakej yang ditawarkan oleh sesuatu repositori, dan stable/binary-amd64/Packages menamakan komponen (stable) serta seni bina (amd64) yang diliputi oleh indeks tersebut. Jadi, apt memberitahu anda bahawa indeks amd64 untuk komponen stable dikonfigurasikan dalam docker.list pada baris 1, dan sekali lagi dalam docker.sources pada baris 1.
Pada apt 3.0 dan versi lebih baharu, iaitu Ubuntu 25.04 ke atas dan Debian 13, mesej yang sama bermula dengan Warning: dan bukannya W:. Teks selepas awalan tersebut adalah sama.
Amaran itu adalah kes ringan. apt menggabungkan kedua-dua pengisytiharan tersebut dan kemas kini masih berjalan, kerana kedua-duanya menerangkan arkib yang sama dengan kunci yang sama. Kes yang sukar akan menghentikan segala-galanya:
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 enggan meneruskan di sini kerana kedua-dua pengisytiharan menamakan kunci penandatangan yang berbeza untuk satu arkib. Ia akan menggabungkan dua pengisytiharan yang serupa, tetapi ia tidak akan memilih antara dua nilai Signed-By, kerana memilih nilai yang salah bermakna menyemak tandatangan pakej terhadap kunci yang tidak pernah ditandatangani oleh pemilik arkib. Oleh itu, apt tidak membaca sebarang sumber langsung. apt update dan apt install kedua-duanya gagal dengan dua baris yang sama sehingga anda menyunting fail tersebut secara manual.
Bagaimana pendua tersebut wujud
Kedua-dua format ini berada dalam fail berasingan dengan sambungan yang berbeza, jadi tiada apa-apa pada cakera yang menghalang kedua-duanya daripada wujud serentak. apt hanya menyedari pertindihan tersebut pada peringkat akhir, iaitu apabila ia mengembangkan setiap fail sumber kepada senarai sasaran indeks yang dirancang untuk dimuat turun. Sehingga saat itu, docker.list dan docker.sources hanyalah dua fail yang tidak berkaitan.
Empat peristiwa biasa menghasilkan pasangan tersebut:
- Skrip pemasangan vendor, atau arahan yang disalin daripada catatan lama, menulis
/etc/apt/sources.list.d/vendor.listdengan baristee. - Pakej vendor itu sendiri kemudiannya mengeluarkan
/etc/apt/sources.list.d/vendor.sourcesdan memasangnya untuk anda. add-apt-repositorypada Ubuntu 24.04 dan versi lebih baharu menulis fail deb822.sources, jadi PPA (arkib pakej peribadi) yang pernah anda tambah secara manual sebagai.listmuncul semula sebagai.sources.- Naik taraf keluaran (release upgrade) menulis semula sumber pengedaran itu sendiri kepada format deb822 dan membiarkan fail
.listyang anda tulis secara manual tidak disentuh di sampingnya.
Setiap laluan adalah munasabah secara berasingan. Pendua berlaku apabila dua daripada peristiwa ini berlaku pada mesin yang sama, selalunya dengan selang masa beberapa bulan.
Dua format, bersebelahan
Format lama adalah satu baris bagi setiap repositori, dan setiap bahagiannya adalah berdasarkan kedudukan.
deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu noble stableSusunannya tetap: jenis (deb untuk pakej binari, deb-src untuk pakej sumber), kemudian pilihan dalam kurungan segi empat, kemudian URI (pengecam sumber seragam) arkib tersebut, kemudian suite, dan diikuti satu atau lebih komponen. Oleh sebab makna ditentukan oleh kedudukan, ruang kosong yang salah letak akan mengubah apa yang dibaca oleh apt.
deb822 menyatakan perkara yang sama sebagai satu stanza medan bernama. Nama tersebut berasal daripada RFC 822, gaya pengepala e-mel yang sudah digunakan oleh Debian untuk fail kawalan pakej.
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: noble
Components: stable
Architectures: amd64
Signed-By: /etc/apt/keyrings/docker.ascRepositori yang sama, kunci yang sama, tiada apa yang ditambah. Pemetaannya adalah terus: deb menjadi Types, alamat arkib menjadi URIs, suite menjadi Suites, komponen menjadi Components, dan setiap pilihan dalam kurungan menjadi medannya sendiri, jadi signed-by= menjadi Signed-By: dan arch= menjadi Architectures:.
Setiap nama medan adalah dalam bentuk jamak kerana setiap medan menerima senarai yang dipisahkan oleh ruang kosong. Suites: noble noble-updates noble-backports dalam satu stanza menggantikan tiga baris deb yang berasingan. Baris kosong menamatkan satu stanza, jadi satu fail .sources boleh memuatkan beberapa repositori. deb822 juga membawa tetapan yang sukar dikendalikan oleh format satu baris: Enabled: no untuk mematikan repositori, Trusted, Check-Valid-Until, dan kunci dalam talian (inline) yang ditampal terus ke dalam Signed-By dengan setiap baris dianjakkan satu ruang dan baris kosong ditulis sebagai satu titik tunggal.
Lokasi setiap fail
/etc/apt/sources.list: fail tunggal asal. Pada Ubuntu 24.04 dan versi lebih baharu, fail ini biasanya kosong atau hanya mengandungi ulasan yang menunjukkan lokasi baharu./etc/apt/sources.list.d/*.list: entri satu baris, biasanya satu fail bagi setiap repositori./etc/apt/sources.list.d/*.sources: stanza deb822. Ubuntu 24.04 dan versi lebih baharu menyimpan repositori asal pengedaran di sini, dalamubuntu.sources./etc/apt/keyrings/: tempat kunci yang anda tambah disimpan./usr/share/keyrings/menyimpan kunci yang datang daripada pakej.
apt hanya membaca fail yang berakhir dengan .list atau .sources, dan nama fail boleh mengandungi huruf, digit, garis bawah, sempang dan titik. Fail dengan sebarang sambungan lain akan dilangkau dengan satu notis, yang penting untuk pembaikan di bawah.
Cari pasangan pendua
Mulakan dengan penyenaraian direktori:
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.sourcesDua fail dengan nama asas yang sama tetapi sambungan berbeza merupakan pasangan biasa, namun jangan percaya pada nama fail. Baca kandungannya, kerana fail pendua boleh disembunyikan dalam fail dengan sebarang nama:
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.ascPasangan tersebut ialah dua entri dengan hos yang sama dan suite yang sama. Kedua-duanya menghala ke https://download.docker.com/linux/ubuntu dan suite noble, jadi ia merupakan repositori yang sama yang ditulis dua kali. Laluan Signed-By kedua-duanya juga tidak sepadan, yang menyebabkan ralat Conflicting values dipaparkan sebelum ini.
Gunakan grep dan bukannya arahan apt untuk langkah ini. Apabila apt terhenti disebabkan konflik, ia tidak dapat menyenaraikan sumber anda, jadi apt-cache policy akan memaparkan ralat yang sama dan bukannya jawapan yang anda perlukan.
Baiki: kekalkan fail deb822, buang fail legasi
Kekalkan fail .sources. Ini ialah format yang ditulis oleh peralatan apt sekarang, dan ia merupakan hala tuju bagi Debian dan Ubuntu. Sebelum memadamkan apa-apa, semak laluan kunci yang mana satu wujud pada cakera:
ls -l /etc/apt/keyrings/ /usr/share/keyrings/ | grep -i docker-rw-r--r-- 1 root root 4813 Aug 9 14:40 docker.ascHanya /etc/apt/keyrings/docker.asc yang ada, jadi fail deb822 adalah fail yang tepat manakala fail .list merujuk kepada kunci yang telah dibuang. Jika fail yang anda ingin kekalkan itu menamakan kunci yang hilang, salin laluan yang berfungsi ke dalamnya terlebih dahulu, kemudian padamkan fail yang satu lagi.
Alihkan fail legasi keluar dari direktori tersebut daripada memadamkannya terus:
sudo mkdir -p /root/apt-sources-backup
sudo mv /etc/apt/sources.list.d/docker.list /root/apt-sources-backup/
sudo apt updateMenamakan semula fail tersebut kepada docker.list.bak dan membiarkannya di situ juga boleh dilakukan, kerana apt mengabaikan sambungan fail yang tidak dikenali, tetapi setiap kali apt dijalankan, ia akan memaparkan ini:
N: Ignoring file 'docker.list.bak' in directory '/etc/apt/sources.list.d/' as it has an invalid filename extensionMengalihkan fail tersebut ke tempat lain akan menghilangkan notis tersebut daripada skrin anda dan masih mengekalkan sandaran. Fail apt update yang sihat selepas itu akan kelihatan seperti ini, tanpa baris yang menamakan dua fail:
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.Sekarang, sahkan bahawa repositori tersebut masih berfungsi selepas suntingan:
apt-cache policy | grep download.docker.com 500 https://download.docker.com/linux/ubuntu noble/stable amd64 Packages
origin download.docker.comJika dokumentasi vendor masih mengandaikan penggunaan fail satu baris, anda boleh mengekalkan fail tersebut dan memadamkan fail .sources sebaliknya. Satu peraturan menentukan perkara ini: hanya satu fail sahaja yang boleh mengisytiharkan arkib dan suite yang diberikan.
Mengapa satu sumber pihak ketiga yang rosak menyekat apt update
Kegagalan yang berlaku kelihatan berbeza namun berpunca daripada perkara yang sama, iaitu sumber pihak ketiga yang tidak boleh digunakan oleh apt. Versi pertama ialah kunci yang hilang:
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.Medan Signed-By tiada, atau ia menghala ke fail yang bukan kunci yang boleh digunakan, jadi apt tidak dapat mengesahkan tandatangan pada fail InRelease arkib tersebut. Ia kemudian membuang keseluruhan repositori itu daripada mempercayai senarai pakej yang tidak dapat disemak. Periksa fail kunci itu sendiri:
ls -l /etc/apt/keyrings/docker.asc
gpg --show-keys /etc/apt/keyrings/docker.ascKunci yang berfungsi akan memaparkan baris pub dengan id kunci dan baris uid yang menamakan vendor. gpg: no valid OpenPGP data found. bermaksud fail tersebut bukanlah kunci, yang biasanya bermaksud muat turun telah menyimpan halaman ralat kerana URL kunci telah berpindah. Dapatkan semula kunci tersebut, periksa failnya, kemudian jalankan apt update.
Versi kedua berlaku selepas naik taraf keluaran (release upgrade):
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 tersebut tidak menerbitkan apa-apa untuk suite itu, jadi laluan tersebut tidak wujud pada pelayan dan permintaan tersebut mengembalikan 404. Repositori anda yang lain masih dikemas kini, dan pakej yang anda miliki tidak terjejas. Walau bagaimanapun, proses tersebut keluar dengan status bukan sifar, jadi sebarang skrip yang menyemak status keluar apt update kini melaporkan kegagalan setiap kali ia dijalankan. Itulah sebabnya satu sumber yang mati perlu dibersihkan pada mesin yang dikonfigurasikan dengan naik taraf keselamatan tanpa pengawasan: gangguan harian adalah tempat di mana kegagalan sebenar tersembunyi. Skrip pemasangan vendor sering menghadapi kedua-dua versi ini, itulah sebabnya kebanyakan ralat pemasangan Tailscale pada Ubuntu berpunca daripada keyring yang tidak ditulis oleh skrip atau nama kod keluaran yang tidak disokong oleh arkib tersebut.
Melumpuhkan satu sumber tanpa menjejaskan yang lain
Bagi fail deb822, tambahkan satu medan ke dalam stanza tersebut dan simpan:
Types: deb
URIs: https://ppa.launchpadcontent.net/ondrej/php/ubuntu
Suites: plucky
Components: main
Signed-By: /etc/apt/keyrings/ondrej-php.asc
Enabled: noManual apt mengesyorkan cara ini berbanding meletakkan komen pada setiap baris stanza, dan ia lebih mudah untuk dibatalkan. Bagi fail satu baris, letakkan # pada permulaan baris tersebut. Bagi kedua-dua format, mengalihkan fail keluar daripada /etc/apt/sources.list.d/ juga berkesan, dan itulah pilihan yang perlu diambil apabila repositori tersebut sudah tidak wujud lagi.
Jalankan sudo apt update sekali lagi. Blok Err: untuk repositori tersebut akan hilang, dan status keluar kembali kepada 0, yang boleh anda semak dengan echo $? pada baris seterusnya.
Jangan sesekali membaiki sumber yang rosak dengan sudo rm /etc/apt/sources.list.d/*. Pada Ubuntu 24.04 dan versi yang lebih baharu, tindakan itu akan memadamkan ubuntu.sources, yang menyimpan repositori asal pengedaran tersebut, menyebabkan apt tidak mempunyai senarai pakej langsung dan melaporkan E: Unable to locate package curl untuk perisian yang jelas wujud. Jika anda telah pun menjalankannya, tulis semula fail tersebut:
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.gpgSimpan fail itu sebagai /etc/apt/sources.list.d/ubuntu.sources, dengan noble digantikan dengan nama keluaran anda sendiri daripada lsb_release -cs, kemudian jalankan sudo apt update.
Menukar fail .list legasi kepada deb822
Mulai Ogos 2026, apt 3.0 dan versi lebih baharu menyertakan penukar untuk tujuan ini. Debian 13 memilikinya, begitu juga Ubuntu 25.04 dan setiap keluaran selepasnya, termasuk 26.04. Semak versi tersebut, kemudian jalankannya:
apt --version
sudo apt modernize-sourcesIa menulis semula fail satu baris di bawah /etc/apt/sources.list.d/ sebagai fail deb822 .sources. Baca output yang dipaparkan, kemudian senaraikan direktori tersebut sendiri dan jalankan apt update sebelum anda mempercayai hasilnya. Ubuntu 24.04 menyertakan apt versi lama tanpa subperintah tersebut, dan di sana arahan itu akan memberikan jawapan E: Invalid operation modernize-sources. Pada keluaran tersebut, lakukan penukaran secara manual menggunakan pemetaan medan di atas.
Penukaran adalah pilihan pada masa ini, kerana apt masih membaca kedua-dua format. Ia berbaloi dilakukan pada pelayan yang anda rancang untuk kekalkan, memandangkan setiap alat yang menulis sumber kini menulis dalam format deb822, dan sistem yang hanya mempunyai fail .sources tidak akan mengalami pertindihan jenis ini.
Pastikan sumber pihak ketiga pada pelayan sentiasa kemas
Repositori pihak ketiga merupakan bahagian pelayan yang paling cepat usang. Setiap repositori adalah janji daripada pihak lain untuk terus menerbitkan pakej bagi keluaran Ubuntu anda, dan naik taraf keluaran akan menguji setiap janji tersebut pada hari yang sama.
- Tambah repositori pihak ketiga hanya apabila pakej pengedaran tidak mencukupi. LAMP stack pada Ubuntu 24.04 yang biasa tidak memerlukannya: arkib Ubuntu mengandungi setiap pakej yang digunakan, dengan kemas kini keselamatan sepanjang hayat keluaran tersebut.
- Simpan kunci dalam
/etc/apt/keyrings/, satu fail bagi setiap vendor, dengan mod 644. Pengguna_aptyang tidak mempunyai keistimewaan melakukan muat turun dan perlu membaca kunci tersebut, jadi fail kunci yang hanya boleh dibaca oleh root akan menyebabkan ralat kebenaran pada setiap pengambilan daripada repositori itu. - Halakan
Signed-Bykepada fail yang tepat dalam setiap stanza. Kunci yang diletakkan dalam/etc/apt/trusted.gpgatau/etc/apt/trusted.gpg.d/dipercayai untuk setiap repositori pada mesin tersebut, yang bermaksud kunci vendor yang ditambah bertahun-tahun dahulu boleh mengesahkan pakej dari mana-mana sahaja. - Sebelum melakukan naik taraf keluaran, baca sumber anda dan pastikan setiap vendor sudah menerbitkan pakej untuk suite yang anda ingin gunakan.
Kunci dalam keyring global lama akan mengeluarkan amaran pada setiap kemas kini:
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.Eksport kunci tunggal itu ke dalam failnya sendiri, kemudian halakan stanza tersebut kepadanya:
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.gpgTambah Signed-By: /etc/apt/keyrings/docker.gpg pada stanza repositori tersebut dan jalankan sudo apt update. Amaran akan berhenti sebaik sahaja tiada repositori yang bergantung pada keyring lama, dan anda kemudian boleh membuang entri tersebut dengan sudo gpg --no-default-keyring --keyring /etc/apt/trusted.gpg --delete-key 7EA0A9C3F273FCD8.
Satu lagi tabiat yang dapat mengelakkan banyak masalah. do-release-upgrade melumpuhkan sumber pihak ketiga untuk naik taraf dan membiarkannya dimatikan selepas itu, dan menghidupkannya semula secara manual, satu demi satu, adalah punca utama berlakunya pengisytiharan pendua. Baca panduan naik taraf Ubuntu 24.04 ke 26.04 sebelum anda bermula, dan catatkan repositori yang masih anda perlukan. Pada mesin yang baru dibina, saat paling sesuai untuk membetulkan sumber adalah semasa sepuluh minit pertama pada VPS baharu, sementara satu-satunya entri pada mesin tersebut hanyalah entri yang dibekalkan oleh Ubuntu.
FAQ
Mengapa apt menyatakan sasaran dikonfigurasikan berulang kali?
Ini berlaku kerana dua fail di bawah /etc/apt/sources.list.d/ mengisytiharkan repositori, suite dan komponen yang sama. Mesej tersebut menamakan kedua-dua fail berserta nombor baris, contohnya docker.list:1 dan docker.sources:1. apt akan menggabungkan fail-fail tersebut dan meneruskan proses, jadi kemas kini masih berfungsi. Walau bagaimanapun, duplikasi ini perlu dibersihkan: sebaik sahaja kedua-dua fail menamakan kunci tandatangan yang berbeza, apt akan berhenti dengan E: Conflicting values set for option Signed-By dan enggan membaca sebarang sumber, yang turut menyekat apt install.
Patutkah saya menyimpan fail .list atau fail .sources?
Simpan fail .sources. deb822 ialah format yang ditulis oleh add-apt-repository pada Ubuntu 24.04 dan versi lebih baharu. Ia menyimpan satu medan bernama bagi setiap tetapan dan bukannya teks kedudukan dalam kurungan segi empat, dan inilah hala tuju pengedaran Linux masa kini. Sebelum memadam fail .list, sahkan bahawa laluan Signed-By di dalam fail .sources menghala ke kunci yang wujud, menggunakan ls -l /etc/apt/keyrings/. Alihkan fail lama keluar dari /etc/apt/sources.list.d/ dan bukannya menamakan semula di dalam direktori tersebut, kerana nama fail yang berakhir dengan .bak akan menyebabkan apt memaparkan notis fail diabaikan pada setiap pelaksanaan.
Bagaimanakah cara mematikan satu repositori apt tanpa membuangnya?
Dalam fail .sources berformat deb822, tambahkan Enabled: no pada stanza tersebut. Dalam fail .list satu baris, letakkan # pada permulaan baris. Walau apa pun caranya, jalankan sudo apt update selepas itu dan blok Err: untuk repositori tersebut akan hilang. Ini adalah tindakan yang tepat apabila repositori pihak ketiga belum mempunyai pakej untuk keluaran Ubuntu anda dan ralat 404 yang terhasil menyebabkan apt update keluar dengan status bukan sifar.
Adakah format sources.list satu baris akan dihapuskan?
Ia telah ditamatkan sokongan, bukan dibuang. apt masih membaca fail .list dan akan terus berbuat demikian untuk tempoh yang lama, jadi tiada apa-apa pada pelayan anda yang akan rosak dalam masa terdekat. Alat baharu menulis dalam format deb822: Ubuntu 24.04 dan versi lebih baharu menyimpan repositori pengedaran dalam /etc/apt/sources.list.d/ubuntu.sources, dan add-apt-repository menulis fail .sources. Pada apt 3.0 dan versi lebih baharu, sudo apt modernize-sources akan menukarkan fail yang masih anda miliki.