Adentrándonos en las profundidades de GNU/Linux

oct. 15, 2023

Este artículo forma parte de una serie:

En el último capítulo conocimos lo básico de Linux, las distribuciones más utilizadas y amigables con el usuario, dónde obtener Ubuntu y cómo arrancarlo en nuestro equipo para probarlo o instalarlo, también vimos los servidores de escritorio más comunes y algunas de las aplicaciones más importantes de cada uno de ellos. Estuvimos hablando sobre la terminal, cómo acceder a ella y algunos de los comandos más básicos para movernos por el sistema de archivos y directorios, crear y eliminarlos y cómo instalar aplicaciones.

En esta segunda parte vamos a conocer un poco mejor el sistema operativo, cómo se organiza, cómo se configura, cómo se administran los usuarios y otros temas que nos ayudarán a entender mejor el funcionamiento. Empezaremos viendo la gestión de usuarios para después pasar al árbol de directorios y cómo el sistema de archivos se organiza jerárquicamente entre otras cosas.

Antes de adentrarnos en la temática que nos concierne es crucial comprender una distinción importante en la historia y la filosofía que subyacen a este sistema operativo. A menudo, escucharás a personas referirse a él como “Linux”, pero en realidad, esta denominación no es del todo precisa. La mayoría de las veces, es más apropiado llamarlo “GNU/Linux”.

La diferencia radica en que GNU, que significa “GNU’s Not Unix”, es un proyecto que comenzó en la década de 1980 bajo la dirección de Richard Stallman y la Free Software Foundation (FSF). Su objetivo era crear un sistema operativo libre y de código abierto, completo y compatible con Unix. A lo largo de los años, GNU desarrolló numerosas herramientas y utilidades esenciales para un sistema operativo, como el compilador GCC (GNU Compiler Collection), la shell Bash, y muchas más. Sin embargo, faltaba un componente clave: el núcleo del sistema.

Es aquí donde entra en juego Linux, desarrollado por Linus Torvalds en 1991, era justo el núcleo que faltaba para completar el sistema operativo GNU. Cuando se combinaron el núcleo Linux con las herramientas y utilidades de GNU, se creó un sistema operativo completo, que es lo que la mayoría de las personas se refieren como “Linux”. Sin embargo, para reconocer la contribución significativa de GNU al sistema, muchas voces en la comunidad de software libre abogan por llamarlo “GNU/Linux”.

Esta distinción puede parecer trivial pero para aquellos que valoran la filosofía del software libre y la colaboración comunitaria, es importante reconocer la labor de ambos proyectos. Así que, en adelante, cuando escuches o leas sobre este sistema operativo, ten en cuenta que la nomenclatura “GNU/Linux” refleja más fielmente la realidad de su origen y desarrollo.

Para esta guía vamos a utilizar sobre todo la línea de comandos ya que por lo general es el nexo común entre distribuciones y entornos de escritorio, se mencionarán herramientas con interfaz gráfica con las que se puedan realizar las mismas tareas.

Si quieres probar los comandos que se ejecutarán de aquí en adelante y no afectar a tu sistema puedes virtualizar Debian con Docker utilizando un simple comando:

docker run -it debian /bin/sh

Esto lanzará una consola de comandos que nos permitirá simular un entorno real recién instalado con el que poder realizar nuestras pruebas, si no tienes Docker instalado en su página tienes la documentación necesaria para hacerlo.

Gestión de usuarios

En este tipo de entornos existe por norma general un usuario raíz llamado root que hace la función del administrador del sistema, un super usuario. Tiene privilegios totales y control absoluto sobre el sistema operativo, lo que lo convierte en la cuenta más poderosa y peligrosa en el sistema, por ello hay que tener mucho cuidado al hacer operaciones con él ya que los errores generados por un mal uso del mismo no son anecdóticos entre los que empiezan o empezamos en su momento.

Este usuario puede realizar tareas críticas, como instalar y eliminar software, configurar el sistema, acceder a todos los archivos y directorios, modificar permisos y realizar cambios fundamentales en la configuración del sistema. Sin embargo, con un gran poder viene una gran responsabilidad, y usar la cuenta root con imprudencia puede tener consecuencias graves.

Son muchos los memes en internet sobre copia y pegas de comandos obtenidos en internet que resultan en un sistema corrupto o eliminado. Si no sabes lo que hace no lo ejecutes, y mucho menos como usuario root.

No se recomienda utilizar la cuenta root de manera habitual para las tareas cotidianas, de ahí que el propia sistema obligue a crear un usuario estándar durante el proceso de instalación. En su lugar, se fomenta el uso de cuentas de usuario normales con privilegios limitados para la mayoría de las actividades. Cuando sea necesario realizar tareas que requieran permisos elevados, se puede usar el comando sudo (superuser do) para otorgar temporalmente estos privilegios, también se puede trabajar como root con el comando su (switch user) seguido de su contraseña.

La gestión de usuarios es una parte esencial de la administración de sistemas Linux. Permite controlar quiénes tienen acceso al sistema, qué privilegios tienen y cómo se comporta el sistema para cada usuario.

Para crear un usuario en Linux, utiliza el comando `useradd. Por ejemplo, para crear un usuario llamado “nuevo_usuario”, ejecuta como administrador:

useradd -m nuevo_usuario

Para poder utilizar el comando sudo debes añadir tu usuario al fichero sudoers almacenado en etc o utilizar el comando usermod para añadirlo al grupo sudo. Tendrías que ejecutarlo también como root:

usermod -aG sudo nuevo_usuario

A partir de ahora ya puedes escalar privilegios bajo demanda con sudo cuando los comandos lo requieran siempre y cuándo estemos realizando tareas de administración del sistema.

Para poder iniciar sesión en el sistema y realizar tareas puntuales de administración con nuestro “nuevo_usuario” tenemos que asignarle una contraseña que nos será solicitada después con el comando:

passwd nuevo_usuario

Si cambiamos de usuario con su nuevo_usuario el primer carácter de la línea del terminal cambiará de “$” (dólar), modo restringido a una “#” (almohadilla), modo administrador.

Los usuarios pueden agruparse en grupos, lo que facilita la administración de permisos y accesos. Puedes crear grupos con el comando groupadd y agregar usuarios a un grupo existente con el comando usermod.

sudo groupadd grupo_nuevo sudo usermod -aG grupo_nuevo nuevo_usuario

Podemos verificar que tanto el usuario como el grupo han sido creados y relacionados entre sí mediante la creación de un grupo que por ahora sólo contendría a nuestro “nuevo_usuario” utilizando la herramienta getent`:

getent passwd getent group

Observaremos que nuestro usuario también tiene su propio grupo ya que el propio sistema lo crea y añade para facilitar la administración de permisos y el acceso, simplificar la colaboración en entornos de trabajo o proyectos, agilizar la gestión de recursos compartidos al permitir la asignación de permisos basados en grupos secundarios y, al mismo tiempo, proporcionar un grado de privacidad y aislamiento al permitir la configuración de permisos específicos, entre otras cosas, lo que resulta en una administración eficiente y una mayor flexibilidad en la gestión de archivos y recursos. En futuros posts conoceremos la gestión de permisos tanto para usuarios como grupos, carpetas y ficheros.

El sistema crea, durante su instalación, una serie de usuarios que permiten al sistema ejecutar determinados procesos, al mostrarlos con getent podemos observar varias partes bien diferenciadas en cada una de las entradas, el nombre de usuario, lo que antiguamente era el hash de la contraseña, un identificador único del usuario, otro para el grupo principal, un campo para información adicional del usuario, el directorio de inicio y la shell que utiliza:

nuevo_usuario : x : 1000 : 1000 : : /home/nuevo_usuario : /bin/sh

Estos son los más importantes:

  • root: El usuario root (UID 0) es el superusuario del sistema con control total sobre todas las operaciones. Tiene acceso sin restricción a todos los archivos y directorios y se utiliza para realizar tareas de administración críticas en el sistema.
  • daemon: El usuario daemon (UID 1) se emplea para ejecutar servicios de sistema en segundo plano. Aunque tiene acceso limitado al sistema, generalmente no se usa para sesiones interactivas y se enfoca en la ejecución de servicios esenciales.
  • bin: El usuario bin (UID 2) se encarga de ejecutar binarios esenciales del sistema. Su principal función es ejecutar comandos básicos necesarios durante el arranque y la recuperación del sistema.
  • sys: El usuario sys (UID 3) está destinado a ejecutar procesos relacionados con el sistema y el kernel. No tiene acceso interactivo y se utiliza para operaciones críticas del sistema y diagnóstico.
  • sync: El usuario sync (UID 4) se utiliza para sincronizar el sistema de archivos, asegurando que los datos se escriban en el disco de manera segura. Este usuario desempeña un papel importante en la integridad de los datos almacenados.

Lo mismo sucede con los diferentes grupos que vienen por defecto, que al igual que los usuarios están creados para gestionar diferentes partes del sistema y determinar lo que cada uno de los procesos y usuarios agregados tienen permiso para realizar. Los más importantes son:

  • sudo: El grupo “sudo” se utiliza para permitir a los usuarios ejecutar comandos con privilegios de superusuario utilizando el comando sudo. Los usuarios que pertenecen a este grupo pueden realizar tareas administrativas cuando sea necesario.
  • audio: Este grupo se utiliza para proporcionar acceso a dispositivos de audio.
  • disk: Los usuarios que pertenecen a este grupo pueden acceder a dispositivos de disco, como unidades USB y discos duros.
  • cdrom: Este grupo proporciona acceso a unidades de CD/DVD y permite a los usuarios montar y acceder a discos ópticos.
  • video: El grupo “video” se utiliza para proporcionar acceso a dispositivos de video, como tarjetas gráficas.
  • staff: En algunas distribuciones, el grupo “staff” se utiliza para permitir a los usuarios realizar ciertas tareas administrativas.
  • users: Este grupo se crea por defecto y generalmente incluye a todos los usuarios no pertenecientes a otros grupos específicos.
  • nogroup: Este grupo se utiliza para archivos o recursos a los que no se desea asignar ningún grupo en particular.

Al observarlos con getent vemos un patrón similar al de los usuarios y es que aquí se nos muestra algo de información sobre los grupos como su nombre, la “x” en el lugar de lo que antaño eran representaciones de contraseñas, un identificador para el grupo y la lista de miembros que lo componen:

sudo : x : 27 : nuevo_usuario,otro_usuario

A no ser que estés configurando un sistema para un entorno super específico y controlado no tendrás que asignarte a grupos manualmente ni modificar los que vienen en el propio sistema ya que está pensado para empezar a trabajar con él partiendo de una configuración más o menos estándar.

Todo esto puede hacerse desde un entorno de escritorio como Gnome o KDE utilizando el propio ratón como si de otro sistema operativo de uso doméstico se tratara, en Gnome basta con acceder al panel de administración del sistema y abrir la opción de “Usuarios”:

Árbol de directorios y organización de ficheros

Comprender la estructura del sistema de archivos y cómo se distribuyen los archivos y directorios es fundamental para administrar eficazmente un sistema Linux. Se trata de un sistema operativo cuya organización de directorios es crítico en el sistema, cada carpeta tiene su nombre y su funcionalidad, a diferencia de otros sistemas operativos en los que los roles de cada una de las partes se siente más libre en Linux todo está inteligentemente dividido y organizado.

La “/” es el lugar principal, el directorio padre de todas y cada una de las carpetas que forman un sistema GNU/Linux. De ella descienden todas las demás y es tan crítica como las que vemos a continuación para el correcto funcionamiento del sistema. Así luciría el árbol de directorios por defecto en casi todos los Linux, aunque pueden existir algunas pequeñas diferencias en distribuciones menos comunes:

Podemos intuir la función de cada directorio en el mismo nombre de cada uno de ellos, de todas formas aquí las desgranamos:

  • /bin: Contiene binarios esenciales del sistema, como comandos básicos utilizados durante el arranque y recuperación del sistema.
  • /etc: Almacena archivos de configuración del sistema y aplicaciones. Aquí encontrarás archivos de configuración de red, usuarios, servicios y más.
  • /home: Es el directorio personal de los usuarios. Cada usuario tiene su propio subdirectorio en /home para almacenar sus archivos y configuraciones personales.
  • /var: Contiene archivos variables, como registros de sistema, archivos temporales y datos que cambian con el tiempo.
  • /usr: Guarda archivos y programas no esenciales del sistema, incluyendo aplicaciones instaladas, bibliotecas y documentos.
  • /root: Es el directorio personal del usuario root, el superusuario con control total sobre el sistema mencionado en el punto anterior.
  • /opt: Se utiliza para instalar aplicaciones adicionales no proporcionadas por el sistema base.
  • /srv: Almacena datos utilizados por servicios del sistema, como sitios web o repositorios de datos.
  • /mnt y /media: Son directorios para montar dispositivos y medios extraíbles, como discos duros externos o unidades USB.
  • /dev: Contiene archivos de dispositivos que representan hardware en el sistema, como discos duros, impresoras y dispositivos de red.
  • /proc y /sys: Son sistemas de archivos virtuales utilizados para interactuar con el kernel y configurar el hardware.
  • /tmp: Un espacio destinado al almacenamiento de archivos temporales que son utilizados por aplicaciones y procesos en ejecución, son datos efímeros y no están diseñados para ser conservados a largo plazo, suelen eliminarse con cada reinicio.

Por lo general, en la administración de sistemas Linux sólo se requiere familiaridad con un subconjunto de los directorios mencionados anteriormente para realizar la mayoría de las tareas cotidianas. Sin embargo, es valioso conocer la existencia y la función de todos ellos ya que esto proporciona un mayor control y comprensión del sistema, esencial para llevar a cabo el mantenimiento de nuestros equipos.

Consideremos el directorio bin, en él se almacenan los programas esenciales que se ejecutan en la consola de comandos. Cada vez que utilizamos comandos como ls para listar archivos en el directorio actual o cd para acceder a un directorio diferente, en realidad estamos ejecutando archivos ejecutables alojados en “/bin”. Este nombre proviene de la palabra " binary" (binario) debido a que los archivos aquí son binarios y ejecutables.

En etc se almacenan configuraciones del sistema sobre todo, tanto herramientas de arranque como servicios y de administración, es de los lugares más habituales en caso de que no funcione como debería alguna parte del sistema o aplicación. Sus descendientes llevarán el nombre del componente en cuestión y en su interior se almacenarán ficheros de texto o scripts con diferentes formatos en los que se describen las configuraciones.

El siguiente podría ser un ejemplo real de un servidor ofreciendo conexión web y SSH (Secure Shell) además de otros ficheros del propio sistema como el fstab que define las particiones del disco y cómo se montan bajo qué condiciones, se muestra también la carpeta network que contiene los ficheros de configuración de la red y el fichero sudoers que indica qué usuario tienen permiso para escalar privilegios temporalmente utilizando el comando sudo.

Gran parte de las aplicaciones visuales que utilizamos en cualquiera de los entornos gráficos hacen cambios en estos ficheros cada vez que modificamos la configuración de sus respectivos componentes. Muchas veces además de hacer los cambios en los ficheros también estarían programados para realizar otras tareas como reiniciar el servicio correspondiente para hacer efecto los cambios, etc, facilitando así la gestión y automatizando lo que a través de consola tendríamos que hacer combinando múltiples comandos.

Dentro de home, cada usuario tiene su propio directorio con su nombre de usuario como nombre de carpeta. Estos directorios personales almacenan los archivos y configuraciones específicos de cada usuario, lo que garantiza la privacidad y la separación de datos entre diferentes usuarios del sistema. Por ejemplo, si tienes usuarios llamados " usuario1" y “usuario2”, encontrarás sus directorios personales en “/home/usuario1” y “/home/usuario2” respectivamente.

Cada directorio personal de usuario en home puede contener una variedad de elementos, como documentos, imágenes, configuraciones de escritorio, archivos de música y mucho más. Además, en el directorio personal, se almacenan archivos de configuración importantes, como el .bashrc que controla la configuración de la línea de comandos para ese usuario en particular. Esta separación de directorios personales facilita la gestión de datos y configuraciones individuales en sistemas multiusuario.

El “.” (punto) que ves delante del nombre del fichero le indica al sistema que se trata de un fichero oculto y por tanto no debe ser mostrado a no ser que el usuario así lo requiera. Puede utilizarse tanto en ficheros como en directorios y evita que se muestre en los listados de ficheros convencionales, si quisiéramos verlos con el comando ls deberíamos especificárselo con:

ls -a

La opción “-a” (letra “a”) se utiliza para mostrar todos los archivos, incluyendo los ocultos. De no añadírle el parámetro no se mostrarían en un listado normal de archivos.

Además de los archivos y directorios personales de los usuarios se almacenan también archivos de configuración específicos para cada usuario. Estos archivos son fundamentales para personalizar la experiencia de usuario en Linux.

Los archivos de configuración en el directorio personal del usuario tienen prioridad sobre los archivos de configuración del sistema en etc. Por ejemplo, si un usuario tiene un archivo .bashrc personalizado en su directorio " /home/usuario", ese archivo tomará precedencia sobre el archivo .bashrc global en “/etc”. Esto permite a los usuarios personalizar su entorno de manera individual sin afectar la configuración del sistema en su conjunto.

El directorio var (abreviatura de “variable”) está diseñado para almacenar datos que pueden cambiar o evolucionar durante el funcionamiento del sistema. Aquí se encuentran registros de sistema, como archivos de registro de eventos o registros de errores, proporcionan información esencial para la supervisión y el diagnóstico del sistema. Además de los registros, var también almacena archivos temporales que son utilizados por aplicaciones para contener datos de forma temporal y que no requieren preservación a largo plazo, pero sin llegar a considerarse efímeros como los que se almacenan en tmp. Esta flexibilidad en la gestión de datos en var permite a Linux mantener un registro detallado de eventos y recursos temporales, sin necesidad de llenar otros directorios con datos efímeros.

Por otro lado, el directorio “/srv” (del inglés “service”) se utiliza para alojar datos específicos de servicios o aplicaciones en el sistema. A diferencia de “/var”, que se enfoca en datos que cambian dinámicamente durante la operación del sistema, “/srv” almacena datos que son necesarios para la funcionalidad de servicios específicos. Por ejemplo, si ejecutas un servidor web en tu sistema, es probable que los archivos de tu sitio web se almacenen en " /srv/www". Este enfoque proporciona una ubicación organizada y lógica para acceder a los datos requeridos por servicios y aplicaciones, facilitando la administración y el acceso a recursos específicos de aplicaciones.

Por supuesto también podemos acceder a las carpetas y gestionarlas desde nuestra interfaz gráfica con cualquiera de los entornos disponibles, en este caso vemos el explorador de archivos integrado en Gnome:

Artículos relacionados

Quizá te puedan interesar