Tengo un sistema Fedora (A) donde he instalado algunos paquetes a lo largo del tiempo. Ahora quiero instalar Fedora en otra computadora (B) y quiero instalar los mismos paquetes en ella.
En términos de Debian, quiero lograr algo como esto:
$ dpkg --get-selections > pkg_sel_host_a # on host_a
$ dpkg --set-selections < pkg_sel_host_a # on host_b
Pero para ser honesto, realmente quiero un método mejor para seleccionar los mismos paquetes en el nuevo sistema Fedora 19 (B):solo quiero instalar los paquetes del sistema A que se mencionaron explícitamente en una instalación de dnf install
(o yum install
) línea de comandos, ¡y no los que se instalaron como dependencias!
¿Por qué? Porque quizás las dependencias han cambiado y no quiero instalar dependencias obsoletas en el nuevo sistema. Además, cuando elimino paquetes, también quiero eliminar (posiblemente) las dependencias instaladas automáticamente innecesarias (es decir, huérfanas).
He encontrado dnf list installed
– pero no muestra si un paquete se seleccionó explícitamente o simplemente se instaló debido a una dependencia.
¿Cómo obtengo esa información en Fedora?
¿Cuál es la forma Fedora/dnf de replicar selecciones de paquetes?
Respuesta aceptada:
Desde Fedora 26, el Dnf repoquery
el subcomando admite una nueva opción para enumerar todos los paquetes instalados por el usuario:
$ dnf repoquery --qf '%{name}' --userinstalled
| grep -v -- '-debuginfo$'
| grep -v '^(kernel-modules|kernel|kernel-core|kernel-devel)$' > pkgs_a.lst
A diferencia de otros métodos, también enumera todos los paquetes debuginfo. El grep adicional en el ejemplo anterior los filtra.
Para instalar la lista en el host B:
$ < pkgs_a.lst xargs dnf -y install
API DNF
Con versiones recientes de Dnf (p. ej., Fedora>=23), se puede consultar la base de datos de paquetes para obtener nombres de paquetes instalados por el usuario a través de la API de Dnf Python:
$ python3 -c 'import dnf; b = dnf.Base(); b.fill_sack();
l = sorted(set(x.name for x in b.iter_userinstalled()
if not x.name.endswith("-debuginfo")
and x.name not in
["kernel-modules", "kernel", "kernel-core", "kernel-devel"] ));
print("n".join(l)) ' > pkgs_a.lst
# dnf install $(cat pkgs_a.lst) # on host_b
Por defecto, dnf install
aborta si uno o más paquetes ya no están disponibles. Alternativamente, se puede obligar a dnf a instalar todos los restantes:
# dnf install --setopt=strict=0 $(cat pkgs_a.lst) # on host_b
PD: Coloque el código anterior y más en user-installed.py
que también es compatible con otras distribuciones.
historial instalado por el usuario
En Fedora 23 y versiones posteriores, Dnf proporciona la
# dnf history userinstalled
comando que enumera todos los paquetes instalados por el usuario. A partir de 2016-11, su utilidad es limitada porque no hay forma de controlar su salida e imprime paquetes completamente calificados (es decir, incluye información de versión).
Limitaciones instaladas por el usuario
Tenga en cuenta que el marcado de paquetes como instalados por el usuario tiene algunas limitaciones en algunas versiones de Fedora, para los sistemas de la era Fedora 23 (desde alrededor de 2015-11) los siguientes problemas son relevantes):
- los paquetes instalados a través de la GUI no están incluidos
- los paquetes instalados a través del controlador de comando no encontrado no están incluidos
- se incluyen algunos paquetes instalados por defecto (por anaconda)
Repoquería
En sistemas Fedora más antiguos, donde Dnf, la API de Dnf y el dnf history userinstalled
no están disponibles, se puede usar repoquery en su lugar, por ejemplo:
$ repoquery --installed
--qf '%{n} | %{yumdb_info.reason} | %{yumdb_info.installed_by}' --all
| awk -F'|' ' $2 ~ /user/ && ($3 != 4294967295) { print $1 }'
| sort -u > pkgs_a.lst
La segunda condición awk se usa para excluir paquetes que instaló el instalador. La identificación de usuario del instalador aparentemente se almacenó como 4294967295; alternativamente, puede escribir algo como ($3 == 0 || $3 == your-user-id)
.
Tenga en cuenta que este comando funciona en Fedora hasta la versión 21, pero p. no en la versión 23, porque el comando repoquery
fue reemplazado por dnf repoquery
. Y dnf repoquery
no entiende el %{yumdb_info.reason}
etiqueta.