Linux

  • Hoy tuve la necesidad de verificar y modificar la fecha de expiración de la contraseña de un usuario GNU/Linux. Para ello existe la herramienta chage.

  • LAMP es un modelo de arquitectura pila de servidor Web nombrado como acrónimo de cuatro componentes open-source: Linux, Apache, MySQL, PHP. La definición "arquitectura pila" surge a partir de cómo se organiza el software en capas, cada una dando soporte a las capas superiores. LAMP se organiza con Linux como sistema operativo (¡a la hoguera! se escribe GNU/Linux y el término debería ser GLAMP), Apache como servidor HTTP/HTTPS, MySQL/MariaDB como servidor de bases de datos, y PHP/Perl/Python como lenguaje de programación/CGI scripting. LAMP es el modelo más popular para crear y dar soporte a aplicaciones Web en Internet desde hace tiempo.

    Este breve artículo muestra cómo instalar y configurar rápidamente un stack LAMP sobre sistemas operativos Debian/Devuan y derivados basado en MySQL y PHP.

  • Montar una tarjeta de memoria SD utilizando un lector de tarjetas en sistemas GNU/Linux es exactamente igual a montar cualquier otro dispositivo de almacenamiento USB (pendrive).

  • El día de hoy tuve la necesidad de desencriptar un viejo volumen de TrueCrypt. Como muchos saben, TrueCrypt fue discontinuado en 2014, y no es posible instalarlo en muchos sistemas operativos modernos. Por ello recurrí a una de las alternativas, que consiste en utilizar la herramienta de línea de comandos tcplay (proveniente de DragonFly BSD) en mi sistema Devuan.

  • Típicamente los relojes en los paneles de tareas de GNOME o KDE no muestran los segundos (sólo la fecha, hora y minuto). No sé bien para que pueda servir, tal vez para medir algún experimento o para embeber en alguna aplicación, pero hay una herramienta para mostrar rápidamente un reloj con segundero.

  • En la configuración previa de mi estación de trabajo tenía todos los archivos en una única partición, incluyendo los directorios $HOME de usuarios. El problema fue que, luego de unos años, y a medida que fui descargando archivos y creando nuevos, mi ~ (/usr/home/emi) empezó a ocupar mucho tamaño y necesité recuperar algo de espacio en el sistema de archivos raíz. Con lo cual procedí a moverlo a una nueva partición (o disco), lo cual es una tarea muy sencilla.

    En este caso se trata de un sistema FreeBSD, pero el procedimiento es exactamente igual en sistemas GNU/Linux.

  • Tal vez recordarán que hace algunos días publiqué mi artículo explicando detalladamente cómo instalar y configurar Nginx con PHP-FPM. También supongo recordarán que había prometido hacer una comparación con Apache MPM prefork con PHP como módulo, en lo que a consumo de memoria respecta. Cumplo entonces mi promesa con este breve artículo, donde además comparto mi configuración final de PHP-FPM.

  • Cuando se requiere monitorear el uso de CPU en un sistema operativo de la familia Unix, típicamente se utilizan herramientas como top, atop o htop. Sin embargo, estas herramientas trabajan en modo interactivo. Si se necesita obtener una lista de procesos que más CPU consumen en un instante dado, ya sea para guardar en un archivo, enviar por mail, reenviar a otro comando o utilizar desde otra aplicación, se puede recurrir al modo batch de top.

  • Los sistemas Linux actuales tienen ciertos procesos que ejecutan código del kernel Linux, pero son manejados como procesos del espacio usuario en lo que respecta a planificación (scheduling). Sin embargo no respetan las reglas típicas de manejo de memoria ya que corren código del kernel.

    Estos procesos son creados por kthreadd, el cual es una especie de init para procesos del kernel. Es posible reconocerlos porque usualmente la herramienta ps los lista con un nombre entre corchetes:

    root@debian9:~# ps -ef | grep '\[' | head -n 10
    root         1     0  0  2018 ?        00:01:38 init [2]
    root         2     0  0  2018 ?        00:00:23 [kthreadd]
    root         3     2  0  2018 ?        00:00:00 [rcu_gp]
    root         7     2  0  2018 ?        00:00:00 [mm_percpu_wq]
    root         8     2  0  2018 ?        00:00:13 [ksoftirqd/0]
    root         9     2  0  2018 ?        00:41:15 [rcu_sched]
    root        10     2  0  2018 ?        00:00:00 [rcu_bh]
    root        11     2  0  2018 ?        00:00:00 [migration/0]
    root        12     2  0  2018 ?        00:00:24 [watchdog/0]
    root        13     2  0  2018 ?        00:00:00 [cpuhp/0]
    

    Los hilos del kernel no son hijos de init ya que pueden ser iniciados antes de que arranque el espacio usuario (userland, PID 1 en adelante). Estos procesos típicamente se encargan de manejar hardware, por eso son gestionados directamente por el kernel y tienen alta prioridad.

    Este artículo demuestra cómo ocultar estos procesos en la salida de ps.

  • La herramienta gdisk es la variante de fdisk para tablas de particiones GPT. Este artículo demuestra su sencillo funcionamiento para crear una nueva tabla de particiones GPT y particionar un disco desde línea de comandos en GNU/Linux.

  • Cuando se necesita pausar o retrasar la ejecución de código (delay) dentro de un script Bash se suele utilizar la herramienta sleep, la cual por defecto toma un parámetro que representa la cantidad de segundos a "dormir" (pausar antes de retomar la ejecución). Sin embargo, en sistemas GNU/Linux, sleep permite utilizar otras unidades como minutos, horas, días, etc.

  • Hace un tiempo participé en un proyecto de migración al Software Libre para una empresa interesada en migrar sus sistemas Microsoft Windows hacia GNU/Linux. Esta presentación es el resultado de mi investigación y participación en el proyecto.

  • La semana pasada presenté una introducción a la programación de hardware en lenguaje HDL, más precisamente Verilog, utilizando el compilador Icarus Verilog en Windows. En esta oportunidad voy a demostrar el mismo proceso de instalación y configuración de Icarus Verilog, pero esta vez en GNU/Linux (Devuan).

  • Si observan cuidadosamente la salida de vmstat o top, hay una columna llamada "st" (o %st en top) que indica la cantidad de "stolen time", esto supuestamente es la cantidad de tiempo de CPU que el hypervisor le "robó" a los procesadores virtuales (si es que tenían algo para ejecutar, no cuenta si estaban "idle") ejecutando cualquier otra cosa en lugar de código perteneciente al guest virtual.

    En otras palabras, es la cantidad de tiempo que los procesadores virtuales tuvieron código para ejecutar pero no se les asignó un CPU físico, debido a la planificación o sobrecarga en el host. El % de CPU que no estuvo disponible para la VM debido a la sobrecarga de la virtualización.

  • Anteriormente expliqué cómo utilizar setfacl para borrar todas las entradas de una ACL en Linux mediante la opción -b. Veamos ahora cómo borrar una única entrada de una ACL, por ejemplo para el caso en el que necesitamos quitar privilegios previamente otorgados.

  • Iba a ser un post en Google Plus, pero ¿por qué regalarle contenido a las redes sociales?. Mejor lo publico en mi blog, hosteado en mi propio servidor, que para eso pago.

    Este post surge a causa de un nueva oferta de trabajo que recibo en mi casilla de correo electrónico. Una de decenas que he recibido a lo largo del año, tanto en mi correo como en mi cuenta de LinkedIn. Y, como en todas las oportunidades, la oferta es para trabajar en la capital del país, algo que no pienso hacer a corto plazo. En Argentina tenemos un refrán que dice "Dios está en todas partes, pero atiende en Buenos Aires". No me voy a poner a hablar de federalismo en un blog de tecnología, pero es más o menos así, lamentablemente.

  • A menudo es necesario recurrir a nuestro ingenio para resolver problemas puntuales sobre sistemas en los que no se puede realizar modificaciones. Por ejemplo, cierto sistema genera una salida en formato de texto plano y el cliente requiere que el formato sea PDF. Al mismo tiempo, este sistema es de código cerrado, con lo cual no es posible modificar o adaptar la aplicación existente. Sin embargo, en Linux, es posible crear un pequeño programa secundario que se encargue de convertir a formato PDF el archivo *.txt generado. El inconveniente es: ¿cómo saber cuándo se ha creado un nuevo archivo y cuál es su nombre? Es aquí donde se viene la API inotify del kernel Linux al rescate.

  • Al utilizar máquinas virtuales, puede ser frecuente la necesidad de redimensionar un disco. Esto se debe a que la mayoría de las tecnologías de virtualización otorgan la flexibilidad de asignar recursos de manera dinámica. Esta capacidad de modificar tamaños de discos de manera simple y rápida, hace que los administradores de sistemas sean un tanto "austeros" al momento de asignar recursos. Por ello surge luego la necesidad de aumentar tamaños de disco, memoria, etc. Más aún cuando se trata de sistemas pasando de su fase de desarrollo/testing hacia producción.

    Ahora bien, lo que ocurre cuando se modifica el hardware de una máquina virtual (algo que no es tan simple con hardware físico, ya que no es posible modificar el tamaño de un disco duro, por ejemplo) es que generalmente se debe reiniciar el sistema operativo guest, para que éste "vea" los cambios (detecte la modificación o el nuevo hardware). Sin embargo, a veces es posible lograr que el núcleo del sistema operativo guest (en este caso Linux) detecte el cambio realizado, forzando un reescaneo (rescan) del hardware en cuestión (en este caso un disco SCSI). Esto evita la necesidad de reiniciar el sistema operativo guest, con lo que ello implica, especialmente en sistemas en producción.

    Este artículo explica cómo detectar un cambio en un disco SCSI en Linux sin necesidad de reiniciar el sistema.

  • Cuando se compila un fuente con gcc, éste genera muchos símbolos de debug. Se trata de información acerca de qué porción de código en lenguaje de alto nivel (en este caso C) implementa qué sección de código máquina en el binario ELF. Los símbolos además identifican dónde (en qué dirección) se ubican las diferentes funciones y variables del programa, a través de una tabla, la cual es utilizada por el linker para relocar el código cuando se enlaza junto con otros archivos objeto.

    Los símbolos aumentan considerablemente el tamaño de los binarios, pues agregan gran cantidad de información que no es código ejecutable, sino que es meta-información acerca del código binario, a ser interpretada eventualmente por el debugger y/o linker. Sin embargo, cuando compilamos un ejecutable para correr en un sistema en producción, difícilmente necesitemos recurrir al debugger (tarea más común en un desarrollador, mantenedor, auditor, investigador o experto en seguridad informática) o al linker (para enlazado del ejecutable). Por lo cual, eliminando los símbolos reduciremos el tamaño final del archivo ejecutable. Sin embargo, los símbolos no aumentan el consumo de memoria, pues no son cargados por el sistema operativo al lanzar un programa, ya que se encuentran en secciones de memoria non-allocable que no son necesarias para la ejecución del programa (sólo se cargan en memoria las secciones allocable).

  • Jugando con una instalación de Devuan decidí habilitar los backports de Jessie, desde los cuales instalé un kernel Linux que tiene un bug de Debian por el cual no bootea (no inicia). En este artículo voy a explicar las alternativas al momento de reparar un sistema GNU/Linux (basado en Debian) que no inicia. Específicamente, cómo solucionar problemas con un kernel Linux que no bootea.