Llevaba bastante tiempo teniendo que esperar un rato para actualizar los paquetes como siempre he hecho:
Ayer me decidí a investigar un poco más de lo que había hecho hasta ahora (había intentado chapucear haciendo el mask a packaekitd)
Y la solución es sencilla, aunque si no das con ella te puedes tirar un buen rato buceando perdido en la documentación de policykitd
La clave es sobreescribir la política por defecto de la acción org.freedesktop.packagekit.system-sources-refresh (dejando ResultActive a no o a auth_admin):
Se queda logueado:
https://wiki.debian.org/PolicyKit
https://doc.opensuse.org/documentation/leap/archive/15.0/security/html/book.security/cha.security.policykit.html
PD: No sé qué pasará con la instalación de software vía GUI
$ sudo apt update && sudo apt full-upgrade
Leyendo lista de paquetes... Hecho
E: Could not get lock /var/lib/apt/lists/lock. It is held by process 1488 (packagekitd)
N: Be aware that removing the lock file is not a solution and may break your system.
E: No se pudo bloquear el directorio /var/lib/apt/lists/
Y la solución es sencilla, aunque si no das con ella te puedes tirar un buen rato buceando perdido en la documentación de policykitd
La clave es sobreescribir la política por defecto de la acción org.freedesktop.packagekit.system-sources-refresh (dejando ResultActive a no o a auth_admin):
$ sudo cat /etc/polkit-1/localauthority/10-vendor.d/org.freedesktop.packagekit.pkla
[Allow admins to upgrade the system]
Identity=unix-group:sudo
Action=org.freedesktop.packagekit.system-sources-refresh
ResultAny=no
ResultInactive=no
#ResultActive=yes # comportamiento por defecto
#ResultActive=auth_admin # Te pregunta gnome cuando quiere actualizar
#ResultActive=no # Le decimos que no queremos que se ocupe de esa tarea
Se queda logueado:
$ sudo journalctl | grep PolicyKit | grep ErrorMás info en la wikis/doc de las distros ...
jun 14 23:24:42 doraemon polkitd[940]: Error performing authentication: GDBus.Error:org.freedesktop.PolicyKit1.Error.Cancelled: El usuario rechaz? el di?logo de autenticaci?n (polkit-error-quark 1)
https://wiki.debian.org/PolicyKit
https://doc.opensuse.org/documentation/leap/archive/15.0/security/html/book.security/cha.security.policykit.html
PD: No sé qué pasará con la instalación de software vía GUI
En 2026 ya no se hace así, según gemini es:
ReplyDelete¡Qué buena solución encontraste en su día! Ir directo a las políticas de Polkit (.pkla) para capar la acción org.freedesktop.packagekit.system-sources-refresh es una forma muy elegante de cortar el grifo a nivel de privilegios sin tener que "romper" o enmascarar servicios a lo bruto. [1]
Sin embargo, el motivo por el que hoy en día esa ruta exacta no te funcionaría es que las distribuciones modernas de Linux cambiaron por completo el motor de Polkit. Dejaron atrás los archivos .pkla (formato tipo .ini gestionado por pklocalauthority) y pasaron a utilizar un motor basado en JavaScript con extensiones .rules. [2, 3]
Si quieres replicar exactamente tu misma solución hoy en día (en sistemas actuales como Ubuntu 24.04+, Debian 12+, Fedora, etc.), tienes que escribir la regla en JavaScript. Aquí tienes cómo se hace actualmente:
## La solución moderna con reglas JavaScript (.rules)
1. Crea un nuevo archivo de reglas en el directorio local de Polkit (los nombres de archivos deben empezar por un número de prioridad, usaremos 45 para asegurarnos de que se aplique antes de las de por defecto):
sudo nano /etc/polkit-1/rules.d/45-packagekit-no-refresh.rules
[3]
2. Pega el siguiente código JavaScript, que equivale exactamente a lo que tenías en tu blog:
polkit.addRule(function(action, subject) {
if (action.id == "org.freedesktop.packagekit.system-sources-refresh") {
return polkit.Result.NO;
}
});
[4]
3. Muy importante: Polkit es sumamente estricto con los permisos de este directorio por motivos de seguridad. El archivo tiene que pertenecer obligatoriamente al usuario e interlocutor polkitd (o root según la distro) y tener permisos específicos, de lo contrario Polkit lo ignorará por completo:
sudo chown root:root /etc/polkit-1/rules.d/45-packagekit-no-refresh.rules
sudo chmod 644 /etc/polkit-1/rules.d/45-packagekit-no-refresh.rules
[5]
## ¿Qué hace este cambio?
Al igual que en tu artículo original, cuando tu entorno gráfico (GNOME Software, Discover, etc.) intente llamar en segundo plano a PackageKit para hacer el refresco automático de las fuentes (system-sources-refresh), Polkit le devolverá un NO rotundo de inmediato sin llegar a congelar las listas de APT ni bloquearte la terminal. En el journalctl verás un rechazo automático de la acción idéntico al que mostrabas. [1, 6, 7]
¿Qué te parece la evolución a JavaScript de Polkit? Si te apetece, dime qué versión de distribución estás usando actualmente y podemos verificar si ha aplicado la regla correctamente monitorizando los logs en vivo.
[1] [https://c-nergy.be](https://c-nergy.be/blog/?p=14051)
[2] [https://github.com](https://github.com/neutrinolabs/xrdp/discussions/2112)
[3] [https://docs.redhat.com](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/7/html/desktop_migration_and_administration_guide/policykit)
[4] [https://bbs.archlinux.org](https://bbs.archlinux.org/viewtopic.php?id=159152)
[5] [https://askubuntu.com](https://askubuntu.com/questions/1540026/polkit-rule-for-reboot-ignored)
[6] [https://bugzilla.redhat.com](https://bugzilla.redhat.com/show_bug.cgi?id=1857654)
[7] [https://docs.redhat.com](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/10/html/security_hardening/controlling-access-to-smart-cards-by-using-polkit)