SSD Nodes Learn 🎉 VPS dari $5.50/bln
Panduan Matt ConnorOleh Matt Connor · Dikemas kini 2026-08-13

Cara Selesai Ralat Sumber APT Pendua di Ubuntu

Ralat target configured multiple times berlaku apabila fail .list dan .sources bertindih. Padamkan salah satu fail tersebut untuk memulihkan kemas kini apt anda dengan lancar.

Apakah maksud ralat sumber apt pendua

Ralat sumber apt pendua bermaksud satu repositori diisytiharkan 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 .sources deb822 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 disalin 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:1

Baca 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 yang ringan. apt menggabungkan kedua-dua pengisytiharan tersebut dan proses 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 menolak di sini kerana kedua-dua pengisytiharan menamakan kunci tandatangan 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 ini 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 ini:

  • Skrip pemasangan vendor, atau arahan yang disalin daripada hantaran lama, menulis /etc/apt/sources.list.d/vendor.list dengan baris tee.
  • Pakej vendor itu sendiri kemudiannya mengeluarkan /etc/apt/sources.list.d/vendor.sources dan memasangnya untuk anda.
  • add-apt-repository pada Ubuntu 24.04 dan versi lebih baharu menulis fail deb822 .sources, jadi PPA (arkib pakej peribadi) yang pernah anda tambah secara manual sebagai .list muncul semula sebagai .sources.
  • Naik taraf keluaran (release upgrade) menulis semula sumber pengedaran itu sendiri kepada format deb822 dan membiarkan fail .list yang anda tulis sendiri tidak terusik di sampingnya.

Setiap laluan adalah munasabah secara berasingan. Pendua berlaku apabila dua daripada peristiwa ini terjadi pada mesin yang sama, selalunya dengan selang masa beberapa bulan.

Dua format, bersebelahan

Format lama ialah satu baris bagi setiap repositori, dan setiap bahagiannya adalah mengikut kedudukan.

deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu noble stable

Susunannya tetap: jenis (deb untuk pakej binari, deb-src untuk pakej sumber), kemudian pilihan dalam kurungan segi empat, kemudian URI (pengecam sumber seragam) arkib, kemudian suite, dan kemudian satu atau lebih komponen. Oleh sebab maksudnya ditentukan oleh kedudukan, ruang kosong yang salah tempat 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 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.asc

Repositori 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 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 yang ditampal terus ke dalam Signed-By dengan setiap baris dianjakkan satu ruang dan baris kosong ditulis sebagai satu titik.

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 merujuk kepada 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 pengedaran itu sendiri di sini, dalam ubuntu.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, tanda sempang dan titik. Fail dengan sebarang sambungan lain akan dilangkau dengan 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.sources

Dua fail dengan pangkal nama yang sama tetapi sambungan berbeza merupakan pasangan biasa, namun jangan percaya pada nama fail tersebut. Baca kandungannya, kerana fail pendua boleh tersembunyi dalam fail yang dinamakan apa sahaja:

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

Pasangan 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 adalah repositori yang sama yang ditulis dua kali. Laluan Signed-By bagi kedua-duanya juga tidak sepadan, yang mana ini menghasilkan ralat Conflicting values yang ditunjukkan sebelum ini.

Gunakan grep dan bukannya arahan apt untuk langkah ini. Apabila apt sudah terhenti disebabkan konflik tersebut, 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, periksa 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.asc

Hanya /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 dan bukannya memadamkannya terus:

sudo mkdir -p /root/apt-sources-backup
sudo mv /etc/apt/sources.list.d/docker.list /root/apt-sources-backup/
sudo apt update

Menamakan 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 extension

Mengalihkan fail tersebut ke tempat lain akan menghilangkan notis itu 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 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.com

Jika dokumentasi vendor masih mengandaikan fail satu baris, anda boleh mengekalkan fail tersebut dan memadamkan fail .sources sebaliknya. Satu peraturan menentukan perkara ini: tepat satu fail sahaja yang boleh mengisytiharkan arkib dan suite yang diberikan.

Mengapa sumber pihak ketiga yang rosak menyekat apt update

Kegagalan yang berlaku seterusnya 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 diperiksanya. Periksa fail kunci itu sendiri:

ls -l /etc/apt/keyrings/docker.asc
gpg --show-keys /etc/apt/keyrings/docker.asc

Kunci 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:

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 disentuh. Walau bagaimanapun, proses tersebut tamat dengan kod bukan sifar, jadi sebarang skrip yang menyemak status tamat apt update kini melaporkan kegagalan setiap kali ia dijalankan. Itulah sebabnya sumber yang mati perlu dibersihkan pada mesin yang dikonfigurasikan dengan naik taraf keselamatan tanpa pengawasan: gangguan harian adalah tempat kegagalan sebenar tersembunyi.

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: no

Manual apt mengesyorkan cara ini berbanding meletakkan tanda 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 dari /etc/apt/sources.list.d/ juga berkesan, dan itulah pilihan yang perlu diambil apabila repositori tersebut sudah tiada lagi.

Jalankan sudo apt update sekali lagi. Blok Err: bagi repositori tersebut akan hilang, dan status keluar akan kembali kepada 0, yang boleh anda semak dengan echo $? pada baris seterusnya.

Jangan sekali-kali membaiki sumber yang rosak dengan sudo rm /etc/apt/sources.list.d/*. Pada Ubuntu 24.04 dan versi lebih baharu, tindakan itu akan memadamkan ubuntu.sources, yang mengandungi repositori asal pengedaran tersebut, menyebabkan apt tidak mempunyai senarai pakej langsung dan melaporkan E: Unable to locate package curl bagi 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.gpg

Simpan 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.

Sehingga 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-sources

Ia 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 menggunakan 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 waktu yang sama.

  • Tambah repositori pihak ketiga hanya apabila pakej pengedaran tidak mencukupi. LAMP stack on Ubuntu 24.04 yang biasa tidak memerlukannya: arkib Ubuntu membawa setiap pakej yang digunakan, lengkap dengan kemas kini keselamatan sepanjang hayat keluaran tersebut.
  • Simpan kunci dalam /etc/apt/keyrings/, satu fail bagi setiap vendor, dengan mod 644. Pengguna _apt yang 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-By kepada fail yang tepat dalam setiap stanza. Kunci yang diletakkan dalam /etc/apt/trusted.gpg atau /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 memberikan 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 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.gpg

Tambah Signed-By: /etc/apt/keyrings/docker.gpg pada stanza repositori 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 masalah besar. 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, masa paling sesuai untuk menetapkan sumber dengan betul adalah semasa sepuluh minit pertama pada VPS baharu, sementara satu-satunya entri pada mesin tersebut hanyalah entri yang dibekalkan oleh Ubuntu.

FAQ

Mengapakah apt menyatakan sesuatu sasaran dikonfigurasikan berulang kali?

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 menggabungkan fail-fail tersebut dan meneruskan proses, jadi kemas kini itu sendiri masih berfungsi. Walau bagaimanapun, pendua tersebut wajar dibersihkan: sebaik sahaja kedua-dua fail menamakan kunci penandatangan (signing key) 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 ia merupakan hala tuju pengedaran Linux masa kini. Sebelum memadam fail .list, sahkan bahawa laluan Signed-By di dalam fail .sources menunjuk kepada 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 .bak yang tertinggal akan menyebabkan apt mencetak notis fail yang diabaikan pada setiap pelaksanaan.

Bagaimanakah cara untuk 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 langkah yang tepat apabila repositori pihak ketiga belum mempunyai pakej untuk keluaran Ubuntu anda dan ralat 404 daripadanya 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. Peralatan 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 menukarkan fail yang masih anda miliki.

#apt#ubuntu#deb822#package-management#troubleshooting