Un sistema verdaderamente libre en Debian y Devuan
Comparto Crealib Libersys, una herramienta que desarrollé como autor de Quirinux, una distribución que incluye una gran cantidad de controladores preinstalados, ya que está pensada para funcionar en modo live en la mayor cantidad de equipos posibles. Creé esta aplicación para brindar a los usuarios que prefieren un sistema completamente libre la posibilidad de eliminarlos de forma simple, segura y reversible en Debian, Devuan y distribuciones derivadas.
Crealib Libersys, automatiza el proceso de deinstalación de controladores privativos utilizando por debajo la herramienta vrms.
Pero además, pensando en la seguridad del usuario, Libersys incluye un sistema de restauración offline, que permite volver a instalar los programas eliminados sin necesidad de conexión a internet.
¿Cómo se instala Libersys:
1. Descargar el paquete .deb desde el repositorio oficial de Quirinux
wget https://repo.quirinux.org/pool/main/c/crealib-libersys/crealib-libersys_1.0.3_all.deb
2. Con permisos de administrador, instalamos el paquete que hemos descargado
apt install ./crealib-libersys_1.0.3_all.deb
Una vez instalado, el sistema incorpora automáticamente dos nuevos comandos: libre y notanlibre
¿Cómo se usa Libersys?
1. Para analizar el sistema y eliminar los componentes privativos detectados ejecutamos el comando:
libre
Este comando utiliza vrms para localizar el software no libre y los muestra en una lista de selección en la que podremos optar por desinstalar todos o sólo los que no necesitemos.
Si en algún momento necesitas restaurar los programas eliminados, sin conectarte a internet, puedes hacerlo con:
notanlibre
De esta manera, el proceso es seguro, reversible y transparente para el usuario.
Nota importante sobre el kernel
Crealib Libersys libera los paquetes instalados, aunque mantiene el kernel actual del sistema. Para quienes buscan una limpieza completamente coherente con el software 100% libre, recomiendo instalar un núcleo GNU Linux-libre desde:
http://linux-libre.fsfla.org/pub/linux-libre/releases/
Agradecimientos
Quiero agradecer especialmente a Riky Linux, por las sugerencias realizadas en su canal Gnuxero, que ayudaron a mejorar este proyecto: https://fediverse.tv/w/dfkDrxL2DU5rSTGhiRCJDP
Capturas de pantalla
Código fuente
Comando «libre»
#!/bin/bash
# ===============================================================================
# Nombre: Crealib Libersys - Comando "libre"
# Autor: Charlie Martinez®
# Licencia: https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
# Utilidad: Desinstalar componentes privativos de un sistema GNU/Linux
# Distro: Quirinux 2.x (Devuan 5, Devuan 6, Debian 12, Debian 13)
# ===============================================================================
# Ejecutar con permisos de administrador
# ===============================================================================
FOLDER_NONFREE="/opt/libersys"
FILE_LIST="$FOLDER_NONFREE/list"
FOLDER_DEBS="$FOLDER_NONFREE/debs"
FOLDER_UNINSTALLED="$FOLDER_NONFREE/desinstalados"
SELECCION=""
function _menu_lista() {
clear
while :; do
local opciones=("DESINSTALAR TODOS" "" off)
for comp in "${componentes[@]}"; do
opciones+=("$comp" "" off)
done
SELECCION=$(dialog \
--backtitle "Crealib Libersys v1.0 - Comando 'libre' by Charlie Martínez®" \
--separate-output --checklist "Selecciona componentes a desinstalar (BARRA ESPACIADORA)" 20 60 10 "${opciones[@]}" \
\
2>&1 >/dev/tty)
# Si el usuario elige "Cancelar", sale del script
local dialog_exit_code=$?
[ $dialog_exit_code -eq 1 ] && return 1
# Si no se seleccionaron componentes, muestra un mensaje y vuelve a mostrar el menú
if [ -z "$SELECCION" ]; then
dialog --msgbox "No se seleccionaron componentes." 20 60
continue
fi
# Verifica si se seleccionó "DESINSTALAR TODOS"
if [[ "$SELECCION" == *"DESINSTALAR TODOS"* ]]; then
SELECCION="${componentes[*]}"
fi
# Muestra la lista de programas seleccionados y confirma la desinstalación
clear
dialog --backtitle "Crealib Libersys v1.0 - Comando 'libre' by Charlie Martínez®" \
--yesno "Se van a desinstalar los siguientes elementos:\n\n$SELECCION" 20 60 \
# Si el usuario elige "Aceptar", retorna 0
[ $? -eq 0 ] && return 0
done
}
function _despedida() {
clear
echo 'Gracias por utilizar Crealib Libersys - Comando "notanlibre"'
echo 'Incluido en quirinux-terminal-tools'
echo '-------------------------------------------------------'
echo 'Licencia GPLv2 | Autor: Charlie Martínez'
echo 'Contacto: cmartinez@quirinux.org'
echo ''
exit 1
}
# Verifica si el usuario tiene permisos de administrador
if [ "$EUID" -ne 0 ]; then
echo ''
echo "Este script debe ejecutarse con permisos de root."
echo 'Puedes intentarlo con "sudo" tuusuario, "sudo su" o "su root".'
echo ''
exit 1
fi
# Verifica si está instalado dialog
if ! command -v dialog &>/dev/null; then
echo "El programa 'dialog' es necesario para ejecutar este script."
echo "¿Deseas instalarlo? (1) Aceptar (2) Cancelar"
read -r choice
case $choice in
1)
apt-get update
apt-get install -y dialog
;;
*)
_despedida
;;
esac
fi
# Continúa la ejecución utilizando la interfaz dialog
# Verifica si está instalado vrms
if ! command -v vrms &>/dev/null; then
clear
dialog --title "REQUISITO NECESARIO" \
--yesno "El programa 'vrms' es necesario para ejecutar este script.\n¿Deseas instalarlo?" 10 50
# Si el usuario elige Sí, instala vrms. Si elige No, sale del script.
case $? in
0)
apt-get update
apt-get install -y vrms
;;
*)
_despedida
;;
esac
fi
# Muestra la información sobre la utilidad del programa
clear
dialog --backtitle "Crealib Libersys v1.0 - Comando 'libre' by Charlie Martínez®" \
--title 'Comando "libre"' \
--msgbox '\nEste programa sirve para detectar y desinstalar componentes privativos.\nSiempre podrás volver a instalarlos con el comando "notanlibre".' 10 40 \
# Verifica si existe FILE_NONFREE y si no existe lo crea
if [ ! -e $FOLDER_NONFREE ]; then
mkdir $FOLDER_NONFREE
fi
# Verifica si existe el fichero LISTA y si no existe lo crea
if [ ! -e $FILE_LIST ]; then
touch $FILE_LIST
fi
# Crea la carpeta para almacenar paquetes desinstalados
if [ ! -e $FOLDER_UNINSTALLED ]; then
mkdir $FOLDER_UNINSTALLED
fi
# Obtener la salida de vrms y almacenarla en una variable
clear
vrms_output=$(vrms)
# Excluir la línea de texto "Non-free" y todo desde la línea que contiene "Contrib packages"
nonfree_packages=$(echo "$vrms_output" | sed -n '/Non-free packages installed on/,/Contrib packages/ {/Non-free\|Contrib packages/!p}')
# Almacenar la lista en el archivo FILE_LISTA
echo "$nonfree_packages" | grep -v '^$' | awk '{print $1}' >$FILE_LIST
# Verifica si existe FOLDER_DEBS y si no existe la crea
if [ ! -d $FOLDER_DEBS ]; then
mkdir $FOLDER_DEBS
fi
# Cambia al directorio FOLDER_DEBS antes de descargar los paquetes
(cd "$FOLDER_DEBS" && while read -r package; do
apt download "$package"
done <"$FILE_LIST")
# Lee la lista de componentes privativos instalados en un arreglo
componentes=($(awk '{print $1}' "$FILE_LIST"))
# Muestra la lista y confirma la desinstalación
_menu_lista
dialog_exit_code=$?
# Verifica el código de salida del dialog
if [ $dialog_exit_code -eq 1 ]; then
_despedida
fi
# Muestra el siguiente cuadro de diálogo
clear
dialog --backtitle "Crealib Libersys, comando 'libre' by Charlie Martínez® " \
--yesno "Algunos componentes como la conexión WiFi podrían dejar de funcionar. ¿Continuar de todas formas?" 10 50 \
# Almacena el código de salida en otra variable
continue_exit_code=$?
# Si el usuario elige Sí, desinstala los paquetes seleccionados. Si elige No, sale del script.
if [ $continue_exit_code -eq 0 ]; then
# Desinstala los paquetes seleccionados
clear
for package in $SELECCION; do
apt-get remove --purge "$package" -y
done
# Muestra mensajes de depuración antes del movimiento
echo "Moviendo paquetes desinstalados a $FOLDER_UNINSTALLED"
ls "$FOLDER_DEBS"
ls "$FOLDER_UNINSTALLED"
# Mueve solo los paquetes desinstalados seleccionados a la carpeta correspondiente
for package in $SELECCION; do
mv "$FOLDER_DEBS"/"${package}"_*.deb "$FOLDER_UNINSTALLED"
echo "Moviendo ${package}_*.deb a $FOLDER_UNINSTALLED"
done
# Corrección a bug detectado por Riky Linux, ahora el script borrará la cache.
# Probado en Zorín.
apt autoremove
apt-get clean
# Mensaje de despedida
clear
dialog --backtitle 'Crealib Libersys, comando "libre" by Charlie Martínez®' \
--msgbox "La desinstalación fue exitosa. ¡Ahora tu sistema es más libre que antes!" 10 40 \
clear
else
# Usuario elige No
_despedida
fi
Comando «notanlibre»
#!/bin/bash
# ===============================================================================
# Nombre: Crealib Libersys - Comando "notanlibre"
# Autor: Charlie Martinez®
# Licencia: https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
# Utilidad: Desinstalar componentes privativos de un sistema GNU/Linux
# Distro: Quirinux 2.x - Devuan 5 y 6, Debian 12 y 13
# ===============================================================================
# Ejecutar con permisos de administrador
# ===============================================================================
FOLDER_NONFREE="/opt/libersys"
FOLDER_UNINSTALLED="$FOLDER_NONFREE/desinstalados"
SELECCION=""
function _menu_lista() {
clear
local opciones=()
for deb_file in "$FOLDER_UNINSTALLED"/*.deb; do
opciones+=("$(basename "$deb_file")" "" off)
done
if [ ${#opciones[@]} -eq 0 ]; then
dialog --backtitle "Crealib Libersys v1.0 - Comando 'notanlibre' by Charlie Martínez®" \
--msgbox "No se detectaron componentes privativos que hayan sido eliminados mediante el uso del comando 'libre'" 10 50
return 1
fi
SELECCION=$(dialog \
--backtitle "Crealib Libersys v1.0 - Comando 'notanlibre' by Charlie Martínez®" \
--separate-output --checklist "Selecciona componentes a reinstalar (BARRA ESPACIADORA)" 20 60 10 "${opciones[@]}" \
2>&1 >/dev/tty)
# Si el usuario elige "Cancelar", sale del script
local dialog_exit_code=$?
[ $dialog_exit_code -eq 1 ] && return 1
# Si no se seleccionaron componentes, muestra un mensaje y vuelve a mostrar el menú
if [ -z "$SELECCION" ]; then
dialog --msgbox "No se seleccionaron componentes." 20 60
return 1
fi
return 0
}
function _despedida() {
clear
echo 'Gracias por utilizar Crealib Libersys - Comando "notanlibre"'
echo 'Incluido en quirinux-terminal-tools'
echo '-------------------------------------------------------'
echo 'Licencia GPLv2 | Autor: Charlie Martínez'
echo 'Contacto: cmartinez@quirinux.org'
echo ''
exit 1
}
# Verifica si el usuario tiene permisos de administrador
if [ "$EUID" -ne 0 ]; then
echo ''
echo "Este script debe ejecutarse con permisos de root."
echo 'Puedes intentarlo con "sudo" tuusuario, "sudo su" o "su root".'
echo ''
exit 1
fi
# Verifica si está instalado dialog
if ! command -v dialog &>/dev/null; then
echo "El programa 'dialog' es necesario para ejecutar este script."
echo "¿Deseas instalarlo? (1) Aceptar (2) Cancelar"
read -r choice
case $choice in
1)
apt-get update
apt-get install -y dialog
;;
*)
_despedida
;;
esac
fi
# Continúa la ejecución utilizando la interfaz dialog
# Muestra la información sobre la utilidad del programa
clear
dialog --backtitle "Crealib Libersys v1.0 - Comando 'notanlibre' by Charlie Martínez®" \
--title 'Comando "notanlibre"' \
--msgbox '\nEste programa sirve para reinstalar componentes privativos que hayan sido desinstalados con el comando "libre".' 10 50 \
# Verifica si existe FOLDER_UNINSTALLED
if [ ! -d "$FOLDER_UNINSTALLED" ]; then
dialog --backtitle "Crealib Libersys v1.0 - Comando 'notanlibre' by Charlie Martínez®" \
--msgbox "No se detectaron componentes privativos que hayan sido eliminados mediante el uso del comando 'libre'" 10 50
_despedida
fi
# Verifica si la carpeta FOLDER_UNINSTALLED contiene elementos
if [ -z "$(ls -A "$FOLDER_UNINSTALLED")" ]; then
dialog --backtitle "Crealib Libersys v1.0 - Comando 'notanlibre' by Charlie Martínez®" \
--msgbox "No se detectaron componentes privativos que hayan sido eliminados mediante el uso del comando 'libre'" 10 50
_despedida
fi
# Muestra la lista y confirma la reinstalación
_menu_lista
dialog_exit_code=$?
# Verifica el código de salida del dialog
if [ $dialog_exit_code -eq 1 ]; then
_despedida
fi
# Solicita confirmación
clear
dialog --backtitle "Crealib Libersys v1.0 - Comando 'notanlibre' by Charlie Martínez®" \
--yesno "Se van a reinstalar los siguientes elementos:\n\n$SELECCION" 10 60
# Almacena el código de salida en otra variable
continue_exit_code=$?
# Si el usuario elige Sí, reinstala los paquetes seleccionados. Si elige No, sale del script.
if [ $continue_exit_code -eq 0 ]; then
# Reinstala los paquetes seleccionados
clear
for deb_file in $SELECCION; do
cd "$FOLDER_UNINSTALLED"
apt install "./$deb_file" -y
# Elimina el paquete reinstalado
rm "$FOLDER_UNINSTALLED/$deb_file"
done
# Mensaje de despedida
clear
dialog --backtitle 'Crealib Libersys, comando "libre" by Charlie Martínez®' \
--msgbox "La reinstalación fue exitosa.\nA veces los componentes privativos son necesarios.\nLamentamos que ahora tu sistema sea un poco menos libre que antes :-(" 10 40 \
clear
else
# Usuario elige No
_despedida
fi







