SSD Nodes Learn 🎉 VPS desde $5.50/mes
Guías Matt ConnorPor Matt Connor

Cómo corregir fuentes apt duplicadas y archivos .sources

Si apt update muestra "configured multiple times", localiza el par .list y .sources del repositorio, conserva uno y recupera una actualización limpia.

Qué significa el error de fuentes duplicadas de apt

Las fuentes duplicadas de apt significan que un repositorio está declarado dos veces, en dos archivos diferentes, y APT (advanced package tool) ha encontrado ambas copias. En Ubuntu 24.04 y versiones posteriores, esto ocurre casi siempre porque un script de instalación de terceros escribió un archivo antiguo de una línea .list cuando ya existía en el disco un archivo deb822 .sources para el mismo repositorio. No hay corrupción y ningún paquete está en riesgo. Elimine una de las dos declaraciones y el mensaje desaparecerá.

Esta es la línea que suele pegarse en un cuadro de búsqueda:

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

Léala desde el final. Dos archivos, cada uno con un número de línea, declaran lo mismo. Target Packages es el índice que apt descarga para saber qué paquetes ofrece un repositorio, y stable/binary-amd64/Packages indica el componente (stable) y la arquitectura (amd64) que cubre ese índice. Por tanto, apt le informa de que el índice amd64 del componente stable está configurado en docker.list, en la línea 1, y de nuevo en docker.sources, también en la línea 1.

En apt 3.0 y versiones posteriores, es decir, Ubuntu 25.04 y posteriores y Debian 13, el mismo mensaje comienza con Warning: en lugar de W:. El texto posterior al prefijo es el mismo.

Esa advertencia es el caso leve. apt combina las dos declaraciones y la actualización continúa, porque ambas describen el mismo archivo con la misma clave. El caso grave detiene todo:

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 se niega a continuar porque las dos declaraciones indican claves de firma diferentes para un mismo archivo. Puede combinar dos declaraciones idénticas, pero no elegirá entre dos valores Signed-By, porque escoger el incorrecto implica comprobar las firmas de los paquetes con una clave que el propietario del archivo nunca utilizó para firmarlos. Por eso apt no lee ninguna fuente. apt update y apt install fallan con esas mismas dos líneas hasta que edite los archivos manualmente.

Cómo aparece el duplicado

Los dos formatos se almacenan en archivos independientes con extensiones distintas, por lo que nada en el disco impide que existan ambos. apt detecta la coincidencia tarde, cuando expande cada archivo de fuentes en la lista de destinos de índices que planea descargar. Hasta ese momento, docker.list y docker.sources son dos archivos sin relación.

Cuatro situaciones habituales producen el par:

  • Un script de instalación del proveedor, o un comando copiado de un artículo antiguo, escribe /etc/apt/sources.list.d/vendor.list con una línea tee.
  • Más tarde, el paquete del propio proveedor incluye /etc/apt/sources.list.d/vendor.sources y lo instala automáticamente.
  • add-apt-repository en Ubuntu 24.04 y versiones posteriores escribe archivos .sources en formato deb822, por lo que un PPA (archivo personal de paquetes) que antes añadió manualmente como .list reaparece como .sources.
  • Una actualización de versión convierte las fuentes propias de la distribución al formato deb822 y deja intacto el archivo .list que creó manualmente junto a ellas.

Cada situación es razonable por separado. El duplicado aparece cuando dos de ellas ocurren en el mismo sistema, a menudo con meses de diferencia.

Los dos formatos, uno junto al otro

El formato antiguo usa una línea por repositorio y cada parte ocupa una posición fija.

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

El orden es fijo: el tipo (deb para paquetes binarios, deb-src para paquetes fuente), después las opciones entre corchetes, luego el URI (identificador uniforme de recursos) del archivo, después la suite y, por último, uno o más componentes. Como el significado depende de la posición, un espacio colocado incorrectamente cambia la forma en que apt interpreta la línea.

deb822 expresa lo mismo como una estrofa de campos con nombre. El nombre procede de RFC 822, el formato de cabeceras de correo que Debian ya utiliza para sus archivos de control de paquetes.

Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: noble
Components: stable
Architectures: amd64
Signed-By: /etc/apt/keyrings/docker.asc

Es el mismo repositorio y la misma clave; no se añade nada. La correspondencia es directa: deb se convierte en Types, la dirección del archivo se convierte en URIs, la suite se convierte en Suites, los componentes se convierten en Components y cada opción entre corchetes se convierte en su propio campo. Así, signed-by= se convierte en Signed-By: y arch= se convierte en Architectures:.

Todos los nombres de campo están en plural porque cada campo acepta una lista separada por espacios. Suites: noble noble-updates noble-backports en una estrofa sustituye a tres líneas deb independientes. Una línea en blanco termina una estrofa, por lo que un solo archivo .sources puede contener varios repositorios. deb822 también permite expresar configuraciones que el formato de una línea gestiona mal: Enabled: no para desactivar un repositorio, Trusted, Check-Valid-Until y una clave insertada directamente en Signed-By, con cada línea indentada un espacio y las líneas en blanco escritas como un único punto.

Dónde se encuentra cada archivo

  • /etc/apt/sources.list: el archivo único original. En Ubuntu 24.04 y versiones posteriores normalmente está vacío o sólo contiene un comentario que apunta a la nueva ubicación.
  • /etc/apt/sources.list.d/*.list: entradas de una línea, normalmente un archivo por repositorio.
  • /etc/apt/sources.list.d/*.sources: bloques deb822. Ubuntu 24.04 y versiones posteriores mantienen aquí sus propios repositorios de distribución, en ubuntu.sources.
  • /etc/apt/keyrings/: ubicación para las claves que se agregan. /usr/share/keyrings/ contiene las claves procedentes de un paquete.

apt sólo lee los archivos cuyo nombre termina en .list o .sources. El nombre de archivo puede contener letras, dígitos, guion bajo, guion y punto. Los archivos con cualquier otra extensión se omiten y se muestra un aviso. Esto es importante para la corrección que se describe a continuación.

Buscar el par duplicado

Comience con el listado del directorio:

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

Dos archivos con el mismo nombre base y extensiones diferentes suelen formar el par habitual, pero no confíe en los nombres. Lea el contenido, porque un duplicado puede estar oculto en un archivo con cualquier nombre:

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

El par está formado por las dos entradas con el mismo host y la misma suite. Ambas apuntan a https://download.docker.com/linux/ubuntu y a la suite noble, por lo que son el mismo repositorio escrito dos veces. Sus rutas de Signed-By también difieren, y eso produce el error Conflicting values mostrado antes.

Use grep en lugar de un comando de apt para este paso. Cuando apt ya se detiene por el conflicto, tampoco puede listar las fuentes, por lo que apt-cache policy imprime el mismo error en lugar de la respuesta que necesita.

Corrija el problema: conserve el archivo deb822 y retire el archivo heredado

Conserve el archivo .sources. Es el formato que escribe actualmente apt y es hacia donde avanzan Debian y Ubuntu. Antes de eliminar nada, compruebe cuál de las dos rutas principales existe en el disco:

ls -l /etc/apt/keyrings/ /usr/share/keyrings/ | grep -i docker
-rw-r--r-- 1 root root 4813 Aug  9 14:40 docker.asc

Sólo está presente /etc/apt/keyrings/docker.asc, por lo que el archivo deb822 es el que refleja el estado real y el archivo .list apunta a una clave que se eliminó. Si el archivo que planea conservar especifica la clave que falta, copie primero en él la ruta válida y elimine después el otro archivo.

Mueva el archivo heredado fuera del directorio en lugar de eliminarlo directamente:

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

También puede cambiarle el nombre a docker.list.bak y dejarlo en el mismo lugar, porque apt ignora las extensiones desconocidas, pero entonces cada ejecución de apt muestra lo siguiente:

N: Ignoring file 'docker.list.bak' in directory '/etc/apt/sources.list.d/' as it has an invalid filename extension

Mover el archivo a otra ubicación evita que aparezca ese aviso y conserva la copia de seguridad. Después, un apt update correcto tiene este aspecto, sin ninguna línea que nombre dos archivos:

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.

Ahora confirme que el repositorio sigue funcionando después de la modificación:

apt-cache policy | grep download.docker.com
 500 https://download.docker.com/linux/ubuntu noble/stable amd64 Packages
     origin download.docker.com

Si la documentación del proveedor todavía presupone el archivo de una sola línea, puede conservar ese archivo y eliminar en su lugar el archivo .sources. Una sola regla decide el resultado: exactamente un archivo puede declarar un archivo y una suite determinados.

Por qué una fuente de terceros defectuosa bloquea apt update

El fallo contiguo parece distinto, pero tiene la misma causa: una fuente de terceros que apt no puede usar. La primera variante se debe a una clave ausente:

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.

Falta el campo Signed-By o apunta a un archivo que no contiene una clave utilizable. Por eso apt no puede verificar la firma del archivo InRelease del archivo de paquetes. En consecuencia, descarta todo el repositorio en lugar de confiar en listas de paquetes que no puede comprobar. Revise el archivo de clave:

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

Una clave válida muestra una línea pub con un identificador de clave y una línea uid con el nombre del proveedor. gpg: no valid OpenPGP data found. significa que el archivo no es una clave. Normalmente, esto ocurre porque la descarga guardó una página de error después de que cambiara la URL de la clave. Descargue la clave de nuevo, compruebe el archivo y ejecute apt update.

La segunda variante aparece después de una actualización de versión:

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.

El PPA no ha publicado nada para esa suite. Por tanto, la ruta no existe en el servidor y la solicitud devuelve 404. Los demás repositorios siguen actualizándose y los paquetes que ya están instalados no se modifican. Sin embargo, la ejecución termina con un código distinto de cero. Por eso, cualquier script que compruebe el estado de salida de apt update informa de un fallo cada vez que se ejecuta. Por este motivo conviene eliminar una fuente inactiva en un equipo con actualizaciones de seguridad desatendidas configuradas: el ruido diario es donde se oculta un fallo real.

Deshabilitar una fuente sin afectar al resto

En un archivo deb822, añada un campo a la estrofa y guárdelo:

Types: deb
URIs: https://ppa.launchpadcontent.net/ondrej/php/ubuntu
Suites: plucky
Components: main
Signed-By: /etc/apt/keyrings/ondrej-php.asc
Enabled: no

El manual de apt recomienda este método en lugar de comentar cada línea de la estrofa, y es más fácil de revertir. Para un archivo de una sola línea, coloque un # al principio de la línea. En ambos formatos, también puede mover el archivo fuera de /etc/apt/sources.list.d/. Elija esta opción cuando el repositorio se haya eliminado definitivamente.

Vuelva a ejecutar sudo apt update. El bloque Err: de ese repositorio desaparece y el estado de salida vuelve a ser 0. Puede comprobarlo con echo $? en la línea siguiente.

No intente corregir una fuente dañada con sudo rm /etc/apt/sources.list.d/*. En Ubuntu 24.04 y versiones posteriores, ese comando elimina ubuntu.sources, que contiene los repositorios propios de la distribución. Como resultado, apt se queda sin listas de paquetes y muestra E: Unable to locate package curl para software que existe claramente. Si ya lo ha ejecutado, vuelva a escribir el archivo:

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

Guárdelo como /etc/apt/sources.list.d/ubuntu.sources, sustituyendo noble por el nombre de su propia versión, que puede obtener con lsb_release -cs. A continuación, ejecute sudo apt update.

Convertir archivos .list heredados a deb822

Desde agosto de 2026, apt 3.0 y las versiones posteriores incluyen un conversor para esta tarea. Debian 13 lo incluye, al igual que Ubuntu 25.04 y todas las versiones posteriores, incluida 26.04. Compruebe la versión y ejecútelo:

apt --version
sudo apt modernize-sources

El comando reescribe los archivos de una sola línea ubicados en /etc/apt/sources.list.d/ como archivos deb822 .sources. Lea lo que muestra. Después, liste el directorio manualmente y ejecute apt update antes de confiar en el resultado. Ubuntu 24.04 incluye una versión anterior de apt que no tiene este subcomando. En esa versión, el comando responde E: Invalid operation modernize-sources. En ese caso, convierta los archivos manualmente mediante la correspondencia de campos anterior.

La conversión es opcional por ahora, porque apt todavía lee ambos formatos. Conviene hacerla en un servidor que vaya a mantener, ya que todas las herramientas que escriben las fuentes ahora usan deb822. Además, un sistema que sólo contiene archivos .sources no puede generar este tipo de duplicados.

Mantenga ordenadas las fuentes de terceros en un servidor

Los repositorios de terceros son la parte de un servidor que más problemas suele dar con el tiempo. Cada uno depende de que otra persona siga publicando paquetes para su versión de Ubuntu. Una actualización de versión pone a prueba todas esas dependencias el mismo día.

  • Añada un repositorio de terceros sólo cuando el paquete de la distribución no sea suficiente. Una pila LAMP en Ubuntu 24.04 no necesita ninguno: el archivo de Ubuntu contiene todos los paquetes que utiliza, con actualizaciones de seguridad durante todo el ciclo de vida de la versión.
  • Mantenga las claves en /etc/apt/keyrings/, con un archivo por proveedor y permisos 644. El usuario sin privilegios _apt descarga los paquetes y debe poder leer la clave. Si el archivo de clave sólo puede leerlo root, cada descarga desde ese repositorio producirá un error de permisos.
  • Configure Signed-By para que apunte a ese archivo exacto en cada bloque. Una clave almacenada en /etc/apt/trusted.gpg o /etc/apt/trusted.gpg.d/ se considera de confianza para todos los repositorios del servidor. Esto permite que una clave de proveedor añadida hace años valide paquetes de cualquier origen.
  • Antes de actualizar la versión, lea las fuentes y compruebe que cada proveedor ya publique paquetes para la suite a la que va a migrar.

Una clave del antiguo almacén de claves global se muestra en cada actualización:

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.

Exporte esa clave a un archivo independiente y haga que el bloque apunte a él:

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

Añada Signed-By: /etc/apt/keyrings/docker.gpg al bloque del repositorio y ejecute sudo apt update. La advertencia desaparece cuando ningún repositorio depende del antiguo almacén de claves. Después puede eliminar la entrada con sudo gpg --no-default-keyring --keyring /etc/apt/trusted.gpg --delete-key 7EA0A9C3F273FCD8.

Hay otro hábito que evita la mayoría de los problemas. do-release-upgrade desactiva las fuentes de terceros durante la actualización y las deja desactivadas después. Volver a activarlas manualmente, una por una, es precisamente lo que suele crear declaraciones duplicadas. Lea la guía para actualizar de Ubuntu 24.04 a 26.04 antes de empezar y anote qué repositorios sigue necesitando. En una máquina recién instalada, el momento más sencillo para corregir las fuentes es durante los primeros diez minutos en un VPS nuevo, cuando las únicas entradas del servidor son las que proporciona Ubuntu.

FAQ

¿Por qué apt indica que un destino está configurado varias veces?

Porque dos archivos de /etc/apt/sources.list.d/ declaran el mismo repositorio, suite y componente. El mensaje muestra ambos archivos con sus números de línea, como docker.list:1 y docker.sources:1. apt los combina y continúa, por lo que la actualización funciona. Aun así, conviene eliminar el duplicado: en cuanto los dos archivos indiquen claves de firma diferentes, apt se detiene con E: Conflicting values set for option Signed-By y se niega a leer cualquier origen, lo que también bloquea apt install.

¿Debo conservar el archivo .list o el archivo .sources?

Conserve el archivo .sources. deb822 es el formato que add-apt-repository escribe en Ubuntu 24.04 y versiones posteriores. Contiene un campo con nombre para cada ajuste, en lugar de texto posicional entre corchetes, y es el formato hacia el que avanzan las distribuciones. Antes de eliminar el archivo .list, confirme con ls -l /etc/apt/keyrings/ que la ruta Signed-By dentro del archivo .sources apunta a una clave existente. Mueva el archivo antiguo fuera de /etc/apt/sources.list.d/ en lugar de cambiarle el nombre dentro del directorio, porque un nombre .bak sobrante hace que apt muestre un aviso sobre un archivo ignorado en cada ejecución.

¿Cómo desactivo un repositorio de apt sin eliminarlo?

En un archivo deb822 .sources, añada Enabled: no a la sección. En un archivo .list de una sola línea, coloque un # al principio de la línea. En ambos casos, ejecute después sudo apt update y el bloque Err: de ese repositorio desaparecerá. Esta es la medida adecuada cuando un repositorio de terceros todavía no tiene paquetes para su versión de Ubuntu y su error 404 hace que apt update termine con un código distinto de cero.

¿Está desapareciendo el formato de una sola línea de sources.list?

Está obsoleto, pero no se ha eliminado. apt todavía lee los archivos .list y seguirá haciéndolo durante mucho tiempo, por lo que nada se rompe mañana en su servidor. Las herramientas nuevas escriben deb822: Ubuntu 24.04 y versiones posteriores mantienen los repositorios de la distribución en /etc/apt/sources.list.d/ubuntu.sources, y add-apt-repository escribe archivos .sources. En apt 3.0 y versiones posteriores, sudo apt modernize-sources convierte los archivos que aún conserva.

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