Chatear en RedIrc

viernes, 13 de mayo de 2016

Resolver los típicos problemas de apt y programas en Linux

En ciertas ocasiones ..., ¿ a quien no le ha pasado que al intentar ejecutar alguna aplicación no inicia sin mostrar mensajes ? En este artículo os voy a decir la manera más común para resolver este y otros problemas relacionados con apt o al compilar aplicaciones en Debian, Ubuntu o derivados.

Partimos en ejecutar la aplicación desde un terminal, esto nos mostrará la información necesaria para proceder a su resolución, si no sabes el nombre de la aplicación puedes arrastrar la aplicación en cuestión desde la X a un terminal para saber su ubicación:

Arrastrar aplicacion al terminal

Una vez sabiendo la ubicación de la aplicación buscaríamos la línea que empieza por Exec usando egrep, por ejemplo:
egrep ^Exec '/usr/share/applications/usb-creator-gtk.desktop'

Exec=usb-creator-gtk

Como vemos, el comando que ejecuta la aplicación es usb-creator-gtk.


Tabla de contenido:



Error while loading shared libraries



Normalmente una aplicación para que se pueda ejecutar necesita ciertas dependencias, estas se instalan automáticamente en la mayoría de casos, por ejemplo, podremos comprobar con apt las dependencias de una aplicación ejecutando lo siguiente:
apt-cache depends nmap

nmap
    Depende: libc6
    Depende: libgcc1
    Depende: liblinear3
...

Las dependencias se deben de instalar automáticamente usando nuestro gestor de paquetes, pero ¿ qué pasa cuando alguna de las dependencias falta ? por ejemplo, al ejecutar nmap:

nmap: error while loading shared libraries: liblua5.2-lpeg.so.2: cannot open shared object file: No such file or directory

Como vemos falta la librería liblua5.2-lpeg.so.2 para que nmap se pueda ejecutar, ahora la pregunta sería: ¿ Cómo se que tengo que instalar para proveer dicha librería ? la respuesta es usando apt-file.

Apt-file es una interesante aplicación que nos va a permitir escudriñar los paquetes para localizar la aplicación conociendo su librería.

Para instalar apt-file:
sudo apt install apt-file
Actualizamos la base de datos por primera vez y buscamos la librería usando apt-file:
sudo apt-file update
apt-file search liblua5.2-lpeg.so.2

lua-lpeg: /usr/lib/x86_64-linux-gnu/liblua5.2-lpeg.so.2
lua-lpeg: /usr/lib/x86_64-linux-gnu/liblua5.2-lpeg.so.2.0.0

Como vemos en la parte izquierda nos dice el paquete que proporciona la la librería que nos falta, por lo que la instalamos:
sudo apt install lua-jpeg
Ahora si volvemos a probar debería funcionar la aplicación. En algunos casos puede que nos funcione con el siguiente comando:
apt -f install
Si compilamos la aplicación sin error alguno y no te encuentra alguna librería suele ser debido a que las librerías se instalaron en una ruta que el sistema no encuentra, puedes probar a actualizar la cache para ver si el sistema la encuentra:
sudo ldconfig
Si persiste el problema puedes probar a indicar la ruta donde el sistema debe de buscar las librerías usando la variable de entorno LD_LIBRARY_PATH,  habitualmente las aplicaciones compiladas suelen colgar del directorio /usr/local, por ejemplo:
LD_LIBRARY_PATH=/usr/local/lib nombre_aplicacion
Un buen hábito es usar el parámetro --prefix en el script configuration, por ejemplo:
./configure --prefix=/usr/local
También puedes añadir el directorio de tus librerías en /etc/ld.so.conf.d/, por ejemplo:
echo "/usr/local/lib" | sudo tee -a /etc/ld.so.conf.d/lib_app.conf
sudo ldconfig
Por último y no menos importante es leer el archivo README/INSTALL para verificar que no te falte algún paso antes de usar la aplicación.




Violación de segmento (segmentation fault)



El programa intenta acceder a una zona de memoria reservada, más allá de los límites que el sistema operativo ha asignado debido a un error de programación (bug), una aplicación modificó el programa o una interrupción de la energía brusco puede causar el problema. Para solucionar este problema puedes probar a reinstalar el paquete, por ejemplo para nmap:
sudo apt install --reinstall nmap
Si lo compilastes:
make clean && make && sudo make install
Si no se soluciono reinstalando la aplicación prueba a reinstalar las librerías asociadas a la aplicación:
sudo apt-cache depends nmap | awk '{print $2}' | xargs sudo apt install --reinstall
Si no funciono puede que sea debido a que tengas problemas en el disco duro, no estaría de más hacer un test con fsck en busca de sectores dañados, sobre todo si el PC fue apagado bruscamente, por ejemplo para buscar errores en la partición sda1:
fsck -pcfv /dev/sda1
Por último y definitivamente se trata de un bug en el programa, puedes ponerte en contacto con el desarrollador.




Comando no encontrado (Command not found)




Aunque parezca estúpido este problema sigue pasando y mucho, esto se debe a que el sistema no encuentra el programa en las rutas predefinidas por el sistema, estas rutas están definidas en una variable de entorno llamada PATH, podemos ver las rutas actuales de esta manera:
echo $PATH
/usr/local/sbin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

Cada vez que ejecutamos una aplicación el sistema lo busca en las ubicaciones definidas en la variable PATH, si no la encuentra nos dice que no encontró la orden, una solución es usar rutas absolutas como por ejemplo /usr/local/bin/nmap o añadir en el PATH la ruta /usr/local/bin/ de esta manera:
export PATH=${PATH}:/usr/local/bin/
Esto lo podemos añadir a nuestro archivo ~/.bashrc para no escribirlo siempre, de esta manera se exportará al iniciar el terminal.





En Linux/Unix existen 3 tipos de permisos (entre otros) para archivos/carpetas en bloques de 3 para gestionar los permisos del propietario del archivo, el grupo al que pertenece el archivo y los del resto de usuarios y son los siguientes:
  1. r:  Read, el archivo puede leerse.
  2. w: Write, el archivo tiene permisos para escribir
  3. x:  Execute, el archivo puede ejecutarse
Ejemplo:

ls -l programa
-rw------- 1 lugonzaro users 0 may 12 21:49 programa

Como vemos el propietario del archivo es el único que puede leer(r) y escribir(w) en el archivo pero no ejecutarlo(x), o sea, le falta el permiso para poder ejecutarse, por lo que tendríamos que permitirlo usando el siguiente comando:
chmod +x programa
Una vez que tiene el permiso ya podemos ejecutarlo:
./programa
hola mundo




E: No se pudo bloquear /var/lib/dpkg/lock




Es uno de los mensajes típicos cuando usamos apt en Debian o distribuciones derivadas, este mensaje es debido a que otro gestor de aplicaciones a bloqueado el uso de apt y cuando intentamos acceder a él nos devuelve un error.

Para comprobar quién lo está usando podemos ejecutar el siguiente comando:
sudo fuser -v  /var/lib/dpkg/lock

                               USUARIO     ORDEN DE ACCESO PID
/var/lib/dpkg/lock:  root       3206 F.... synaptic

Como podemos observar el gestor de paquetes synaptic está abierto y es el causante del bloqueo, lo que debemos de hacer es cerrar synaptic (si no está haciendo nada) O hacer la operación desde este. Una manera de cerrarlo directamente es matando el proceso que lo usa:
sudo fuser -vki /var/lib/dpkg/lock




La arquitectura del paquete (i386) no corresponde con la del sistema (amd64)




Este error es debido a que estamos usando un sistema operativo de 64 bits y estamos intentando instalar aplicaciones de 32 bits con dpkg configurado para 64 bits, si mostramos las arquitecturas permitidas debería salir al menos i386:
sudo dpkg --print-foreign-architectures
Para solucionar esto debemos añadir también la arquitectura de 32 bits a dpkg:
sudo dpkg --add-architecture i386
sudo apt update
sudo apt install libc6:i386 libncurses5:i386 libstdc++6:i386
sudo apt -f install
Podemos añadir otras, estás pueden ser:
setarch --list
uname26
linux32
linux64
i386
i486
i586
i686
athlon
x86_64

Las siguientes veces que intentes instalar algún paquete de 32 bits no tendrás problemas con apt/dpkg.




dpkg: problemas de dependencias impiden la configuración de *



Este error se debe a que el paquete que intentamos instalar tiene dependencias y estas no se encuentran instaladas en nuestro sistema, por lo que para solucionarlo simplemente debemos instalarlas o forzar la instalación y reparar con apt --fix-broken:
sudo dpkg --force-depends -i "TU paquete.deb"
sudo apt --fix-broken install -y
Otro método es usar gdebi (la opción más recomendada), este ya se encarga automáticamente de instalar las dependencias y utiliza un front-end:
sudo apt install gdebi -y
sudo gdebi -n "TU paquete.deb"
Puedes asociar los paquetes deb a gdebi, de esta forma al dar doble clic sobre uno se abrirá gdebi (recomendado):

nautilus - Bbrir con

nautilus, Abrir con GDebi


Al ejecutar el script configure puede que nos salga algo similar y es debido como os podéis imaginar a que no se encuentra cierta librería en el sistema instalada por lo que la compilación se detiene. Para resolver el problema simplemente debemos instalar las dependencias, estas suelen venir descritas en el archivo README/INSTALL del código fuente, por ejemplo, en el caso de reaver dice lo siguiente en docs/README:

Reaver is only supported on the Linux platform, requires the libpcap and libsqlite3 libraries, and can be built and installed by running:
$ ./configure
$ make
# make install

Por lo que tendríamos que instalar libpcap y libsqlite3 antes:
sudo apt install libpcap0.8-dev libsqlite3-dev
./configure
make && sudo make install
Como vemos instalamos los programas dev, os preguntaréis como se que son esas concretas, la respuesta es prueba/error >:-), no hay muchas donde elegir tampoco si escribimos sudo apt install libpcap y seguido damos varias veces a la tecla TAB nos sale lo siguiente:
sudo apt install libpcap
libpcap0.8       libpcap0.8-dbg   libpcap0.8-dev   libpcap-dev      libpcapnav0      libpcapnav0-dev




«/var/lib/dpkg/lock» - open (13: Permiso denegado)



Esto es debido a que no tenemos permiso para usar apt/dpkg, para solucionarlo probar a escribir antes sudo, por ejemplo:
sudo apt update
Si tras la ejecución del comando anterior te devuelve el mensaje "no está en el archivo sudoers." o "is not in the sudoers file." el usuario no se encuentra en el grupo "sudo" por lo que podemos añadirlo antes con el siguiente comando:
gpasswd -a TU_usuario sudo
Si el usuario esta activo debe de salir de la sesión para que los cambios se actualicen correctamente.




ImportError: No module named *


Este error es debido a que le falta algún módulo de python que no tienes instalado, por ejemplo:

ImportError: No module named 'cairo'

Tendríamos que buscar el módulo de python cairo y instalarlo:
apt search cairo | grep python
sudo apt install python3-cairo

No hay comentarios:

Publicar un comentario