Esto es una funcionalidad genial que acabo de descubrir en Debian. Es posible determinar de forma precisa cual es el paquete que provee a un determinado archivo.
Un problema que tuve recientemente en una instalación de Debian, fue la ausencia de un determinado archivo. Es decir, conocía exactamente qué archivo me estaba faltando, pero no sabía qué paquete debía instalar para obtenerlo. En estas situaciones es cuando los gestores de paquetes son realmente útiles.
Existe una herramienta, llamada apt-file
, que tiene la capacidad de buscar archivos en paquetes para el gestor APT. Lógicamente no busca sólo en los paquetes instalados (para ello utilizaríamos find
), sino que busca en todos los paquetes disponibles, realizando consultas sobre los repositorios configurados actualmente en el gestor APT.
Esto puede ser muy útil de diferentes formas. Ya les comenté el caso en el que necesité saber qué paquete instalar para proveer un archivo que me estaba faltando. Pero se me ocurren otros escenarios, como por ejemplo saber qué paquete instaló un archivo del cual no conozco su procedencia, recuperar un archivo de configuración que borré accidentalmente, saber si un archivo es provisto por un paquete o fue creado por un usuario (aunque para esto no es del todo preciso ya que los archivos que provee un paquete pueden cambiar en diferentes versiones), etc.
Para instalar apt-file
en Debian ejecutar:
sudo apt-get install apt-file
Antes de poder utilizarlo es necesario actualizar la base de datos de paquetes desde los repositorios (sources), ejecutando:
sudo apt-file update
Ahora sí es posible determinar qué paquete provee a un determinado archivo. Es posible especificar un nombre de archivo sin la ruta, un patrón, o un nombre de archivo con la ruta completa.
Algunos ejemplos:
root@ubuntu:~# apt-file search my.cnf mysql-common: /etc/mysql/my.cnf mysql-testsuite-5.5: /usr/lib/mysql-testsuite/include/default_my.cnf mysql-testsuite-5.5: /usr/lib/mysql-testsuite/suite/federated/my.cnf mysql-testsuite-5.5: /usr/lib/mysql-testsuite/suite/rpl/my.cnf tango-db: /usr/share/tango-db/my.cnf
root@ubuntu:~# apt-file search ssh-agent aide-common: /usr/share/aide/config/aide/aide.conf.d/31_aide_ssh-agent manpages-cs: /usr/share/man/cs/man1/ssh-agent.1.gz openssh-client: /usr/bin/ssh-agent openssh-client: /usr/share/man/man1/ssh-agent.1.gz x11-common: /etc/X11/Xsession.d/90x11-common_ssh-agent yash: /usr/share/yash/completion/ssh-agent
root@ubuntu:~# apt-file search /etc/init.d/openvpn openvpn: /etc/init.d/openvpn
Para no ser menos que los debianitas, quise saber cómo realizar la misma tarea en CentOS, y afortunadamente yum
provee la misma funcionalidad a través del comando provides:
[emi@hal9000 ~]$ yum provides /etc/init.d/openvpn Loaded plugins: fastestmirror, priorities, refresh-packagekit, security Determining fastest mirrors * base: centos.mirror.mendoza-conicet.gob.ar * contrib: centos.chi.host-engine.com * epel: epel.gtdinternet.com * extras: centos.mirror.mendoza-conicet.gob.ar * rpmforge: apt.sw.be google-chrome 3/3 spice 24/24 2259 packages excluded due to repository priority protections openvpn-2.3.2-2.el6.x86_64 : A full-featured SSL VPN solution Repo : installed Matched from: Other : Provides-match: /etc/init.d/openvpn
La única diferencia con Debian, es que para buscar patrones o nombres de archivo sin la ruta absoluta es necesario utilizar wildcards (comodines, *
), por ejemplo:
[emi@hal9000 ~]$ yum provides *my.cnf Loaded plugins: fastestmirror, priorities, refresh-packagekit, security Loading mirror speeds from cached hostfile * base: centos.mirror.mendoza-conicet.gob.ar * contrib: centos.chi.host-engine.com * epel: epel.gtdinternet.com * extras: centos.mirror.mendoza-conicet.gob.ar * rpmforge: apt.sw.be 2259 packages excluded due to repository priority protections epel/filelists_db | 8.7 MB 00:05 google-chrome/filelists | 1.4 kB 00:00 rpmforge/filelists_db | 2.3 MB 00:00 updates/filelists_db | 2.2 MB 00:23 mysql-libs-5.1.71-1.el6.x86_64 : The shared libraries required for MySQL clients Repo : base Matched from: Filename : /etc/my.cnf mysql-libs-5.1.71-1.el6.i686 : The shared libraries required for MySQL clients Repo : base Matched from: Filename : /etc/my.cnf mysql-test-5.1.71-1.el6.x86_64 : The test suite distributed with MySQL Repo : base Matched from: Filename : /usr/share/mysql-test/suite/rpl_ndb/my.cnf Filename : /usr/share/mysql-test/suite/ndb/my.cnf Filename : /usr/share/mysql-test/suite/rpl/my.cnf Filename : /usr/share/mysql-test/include/default_my.cnf Filename : /usr/share/mysql-test/suite/federated/my.cnf mysql-test-5.1.73-3.el6_5.x86_64 : The test suite distributed with MySQL Repo : updates Matched from: Filename : /usr/share/mysql-test/suite/rpl_ndb/my.cnf Filename : /usr/share/mysql-test/suite/ndb/my.cnf Filename : /usr/share/mysql-test/suite/rpl/my.cnf Filename : /usr/share/mysql-test/include/default_my.cnf Filename : /usr/share/mysql-test/suite/federated/my.cnf mysql-libs-5.1.73-3.el6_5.i686 : The shared libraries required for MySQL clients Repo : updates Matched from: Filename : /etc/my.cnf mysql-libs-5.1.73-3.el6_5.x86_64 : The shared libraries required for MySQL clients Repo : updates Matched from: Filename : /etc/my.cnf mysql-libs-5.1.73-3.el6_5.x86_64 : The shared libraries required for MySQL clients Repo : installed Matched from: Filename : /etc/my.cnf
Para otras distribuciones, revisar el artículo Gestión de paquetes en cualquier distribución.
Espero que sea útil.