4.3 Lección 1
Certificación: |
Linux Essentials |
---|---|
Versión: |
1.6 |
Tema: |
4 El sistema operativo Linux |
Objetivo: |
4.3 Donde se almacenan los datos |
Lección: |
1 de 2 |
Introducción
Para un sistema operativo, todo se considera datos. Para Linux, todo se considera un archivo: programas, archivos normales, directorios, dispositivos de bloque (discos duros, etc.), dispositivos de caracteres (consolas, etc.), procesos del núcleo, sockets, particiones, enlaces, etc. La estructura del directorio de Linux , comenzando desde root /
, es una colección de archivos que contienen datos. El hecho de que todo sea un archivo es una característica poderosa de Linux, ya que permite ajustar prácticamente todos los aspectos del sistema.
En esta lección discutiremos las diferentes ubicaciones en las que se almacenan datos importantes según lo establecido por el Linux Filesystem Hierarchy Standard (FHS). Algunas de estas ubicaciones son directorios reales que almacenan datos de forma persistente en discos, mientras que otros son pseudo sistemas de archivos cargados en la memoria que nos dan acceso a datos del subsistema del núcleo, como procesos en ejecución, uso de memoria, configuración de hardware, etc. Los datos almacenados en estos directorios virtuales son utilizados por una serie de comandos que nos permiten monitorearlos y manejarlos.
Programas y su configuración
Los datos importantes en un sistema Linux son sus programas y archivos de configuración. Los primeros son archivos ejecutables que contienen los conjuntos de instrucciones que debe ejecutar el procesador de la computadora, mientras que los segundos suelen ser documentos de texto que controlan el funcionamiento de un programa. Los archivos ejecutables pueden ser archivos binarios o archivos de texto. Los archivos de texto ejecutables se denominan scripts. Los datos de configuración en Linux también se almacenan tradicionalmente en archivos de texto, aunque existen varios estilos a la forma de representar los datos de configuración.
Dónde se almacenan los archivos binarios
Al igual que cualquier otro archivo, los archivos ejecutables se encuentran en directorios que pertenecen en última instancia de /
. Más específicamente, los programas se distribuyen en una estructura de tres niveles: el primer nivel (/
) incluye programas que pueden ser necesarios en modo de usuario único, el segundo nivel (/usr
) contiene la mayoría de los programas multiusuario y el tercer nivel (/usr/local
) se utiliza para almacenar software que no es proporcionado por la distribución y que se ha compilado localmente.
Las ubicaciones típicas para los programas incluyen:
/sbin
-
Contiene archivos binarios esenciales para la administración del sistema, como
parted
oip
. /bin
-
Contiene archivos binarios esenciales para todos los usuarios, como
ls
,mv
omkdir
. /usr/sbin
-
Almacena binarios para la administración del sistema, como
deluser
ogroupadd
. /usr/bin
-
Incluye la mayoría de los archivos ejecutables, como
free
,pstree
,sudo
oman
que pueden ser utilizados por todos los usuarios. /usr/local/sbin
-
Se utiliza para almacenar programas instalados localmente para la administración del sistema que no son gestionados por el administrador de paquetes.
/usr/local/bin
-
Sirve para el mismo propósito que
/usr/local/sbin
pero para programas de usuario regulares.
Recientemente, algunas distribuciones comenzaron a reemplazar /bin
y /sbin
con enlaces simbólicos a /usr/bin
y /usr/sbin
Note
|
El directorio |
Además de estos directorios, los usuarios habituales pueden tener sus propios programas en:
-
/home/$USER/bin
-
/home/$USER/.local/bin
Tip
|
Puede averiguar desde qué directorios están disponibles para ejecutar binarios haciendo referencia a la variable |
Podemos encontrar la ubicación de los programas con el comando which
:
$ which git /usr/bin/git
Dónde se almacenan los archivos de configuración
El directorio /etc
En los primeros días de Unix había una carpeta para cada tipo de datos, como /bin
para binarios y /boot
para los núcleos. Sin embargo, /etc
(que significa etcétera) se creó como un directorio general para almacenar cualquier archivo que no perteneciera a las otras categorías. La mayoría de estos archivos eran archivos de configuración. Con el paso del tiempo, se agregaron más y más archivos de configuración, por lo que /etc
se convirtió en la carpeta principal para los archivos de configuración de los programas. Como se dijo anteriormente, un archivo de configuración generalmente es un archivo de texto plano local (opuesto al binario) que controla la operación de un programa.
En /etc
podemos encontrar diferentes patrones para los nombres de los archivos de configuración:
-
Archivos con una extensión ad hoc o sin extensión, por ejemplo
group
-
Base de datos de los grupos de sistema.
hostname
-
Nombre del equipo.
hosts
-
Lista de direcciones IP y sus traducciones de nombres de host.
passwd
-
Base de datos del usuario del sistema: compuesta por siete campos separados por dos puntos que proporcionan información sobre el usuario.
profile
-
Archivo de configuración de todo el sistema para Bash.
shadow
-
Archivo encriptado para contraseñas de usuario.
-
Archivos de inicialización que terminan en
rc
:bash.bashrc
-
Archivo
.bashrc
en todo el sistema para shells interactivos. nanorc
-
Ejemplo de archivo de inicialización para GNU nano (un editor de texto simple que normalmente se funciona con cualquier distribución).
-
Archivos que terminan en
.conf
:resolv.conf
-
Archivo de configuración para el resolver que proporciona acceso al sistema de nombres de dominio de Internet (DNS).
sysctl.conf
-
Archivo de configuración para establecer variables del sistema para el núcleo.
-
Directorios con el sufijo
.d
:Algunos programas con un archivo de configuración único (
*.conf
o de otro modo) han evolucionado para tener un directorio dedicado*.d
que ayuda a construir configuraciones modulares y más robustas. Por ejemplo, para configurar logrotate, encontrarálogrotate.conf
, pero también los directorioslogrotate.d
.Este enfoque es útil en aquellos casos en que diferentes aplicaciones necesitan configuraciones para el mismo servicio específico. Si, por ejemplo, un paquete de servidor web contiene una configuración de logrotate, esta configuración ahora se puede colocar en un archivo dedicado en el directorio
logrotate.d
. Este archivo puede ser actualizado por el paquete del servidor web sin interferir con la configuración de logrotate restante. Del mismo modo, los paquetes pueden agregar tareas específicas colocando archivos en el directorio/etc/cron.d
en lugar de modificar/etc/crontab
.En Debian - y derivados de Debian - este enfoque se ha aplicado a la lista de fuentes confiables leídas por la herramienta de administración de paquetes
apt
: aparte del clásico/etc/apt/sources.list
, ahora encontramos el Directorio/etc/apt/sources.list.d
:$ ls /etc/apt/sources* /etc/apt/sources.list /etc/apt/sources.list.d:
Archivos de configuración en HOME
(Dotfiles)
A nivel de usuario, los programas almacenan sus configuraciones en archivos ocultos del directorio de inicio de cada usuario (también representado ~
). Recuerde, los archivos ocultos comienzan con un punto (.
), de ahí su nombre: dotfiles.
Algunos de estos archivos de puntos son scripts de Bash que personalizan la sesión de shell del usuario y se obtienen tan pronto como el usuario inicia sesión en el sistema:
.bash_history
-
Almacena el historial de la línea de comando.
.bash_logout
-
Incluye comandos para ejecutar al salir de la shell de inicio de sesión.
.bashrc
-
Script de inicialización de Bash para shells sin inicio de sesión.Script de inicialización de Bash para shells sin inicio de sesión.
.profile
-
Script de inicialización de Bash para shells de inicio de sesión.
Note
|
Consulte la lección sobre "Conceptos básicos de la línea de comandos" para obtener más información sobre Bash y sus archivos de inicio. |
Los archivos de configuración de otros programas específicos del usuario se obtienen cuando se inician sus respectivos programas: .gitconfig
, .emacs.d
, .ssh
, etc.
El Kernel de Linux
Antes de que se pueda ejecutar cualquier proceso, el kernel debe cargarse en un área protegida de la memoria. Después de eso, el proceso con PID 1
(en la mayoría de los casos systemd
en la actualidad) pone en marcha la cadena de procesos, es decir, un proceso inicia otro(s) y así sucesivamente. Una vez que los procesos están activos, el kernel de Linux se encarga de asignarles recursos (teclado, mouse, discos, memoria, interfaces de red, etc.).
Note
|
Antes de |
Dónde se almacenan los núcleos: /boot
El kernel reside en /boot
junto con otros archivos relacionados con el arranque. La mayoría de estos archivos incluyen los componentes del número de versión del núcleo en sus nombres (versión del núcleo, revisión mayor, revisión menor y número de parche).
El directorio /boot
incluye los siguientes tipos de archivos con nombres correspondientes a la versión del kernel respectiva:
config-4.9.0-9-amd64
-
Los ajustes de configuración para el núcleo como las opciones y los módulos que se compilaron junto con el núcleo.
initrd.img-4.9.0-9-amd64
-
Imagen de disco RAM inicial que ayuda en el proceso de inicio al cargar un sistema de archivos raíz temporal en la memoria.
System-map-4.9.0-9-amd64
-
El archivo
System-map
(en algunos sistemas se llamaráSystem.map
) contiene las direcciones de las memoria de nombres (Memory Address Locations) de los símbolos del kernel. Cada vez que se reconstruya un kernel, el contenido del archivo cambiará, ya que las ubicaciones de memoria podrían ser diferentes. El kernel utiliza este archivo para buscar las ubicaciones de la memoria para un símbolo de kernel en particular, o viceversa. vmlinuz-4.9.0-9-amd64
-
El kernel propiamente dicho en un formato comprimido autoextraíble que ahorra espacio (de ahí la
z
envmlinuz
;vm
significa memoria virtual y comenzó a usarse cuando el kernel obtuvo soporte para memoria virtual por primera vez). grub
-
Directorio de configuración para el gestor de arranque
grub2
.
Tip
|
Debido a que es una característica crítica del sistema operativo, más de un kernel y sus archivos asociados se mantienen en |
El directorio /proc
El directorio /proc
es uno de los llamados sistemas de archivos virtuales o pseudo, ya que su contenido no se escribe en el disco, sino que se carga en la memoria. Se llena dinámicamente cada vez que la computadora se inicia y refleja constantemente el estado actual del sistema. /proc
incluye información sobre:
-
Procesos ejecutandose
-
Configuración del kernel
-
Hardware del sistema
Además de todos los datos relacionados con los procesos que veremos en la próxima lección, este directorio también almacena archivos con información sobre el hardware del sistema y los ajustes de configuración del kernel. Algunos de estos archivos incluyen:
/proc/cpuinfo
-
Almacena información sobre el CPU del sistema:
$ cat /proc/cpuinfo processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 158 model name : Intel(R) Core(TM) i7-8700K CPU @ 3.70GHz stepping : 10 cpu MHz : 3696.000 cache size : 12288 KB (...)
/proc/cmdline
-
Almacena las cadenas pasadas al núcleo en el arranque:
$ cat /proc/cmdline BOOT_IMAGE=/boot/vmlinuz-4.9.0-9-amd64 root=UUID=5216e1e4-ae0e-441f-b8f5-8061c0034c74 ro quiet
/proc/modules
-
Muestra la lista de módulos cargados en el kernel:
$ cat /proc/modules nls_utf8 16384 1 - Live 0xffffffffc0644000 isofs 40960 1 - Live 0xffffffffc0635000 udf 90112 0 - Live 0xffffffffc061e000 crc_itu_t 16384 1 udf, Live 0xffffffffc04be000 fuse 98304 3 - Live 0xffffffffc0605000 vboxsf 45056 0 - Live 0xffffffffc05f9000 (O) joydev 20480 0 - Live 0xffffffffc056e000 vboxguest 327680 5 vboxsf, Live 0xffffffffc05a8000 (O) hid_generic 16384 0 - Live 0xffffffffc0569000 (...)
El directorio /proc/sys
Este directorio incluye ajustes de configuración del kernel por medio de archivos y clasificados en categorías por subdirectorio:
$ ls /proc/sys abi debug dev fs kernel net user vm
La mayoría de estos archivos actúan como un interruptor, por eso solo contienen uno de los dos valores posibles: 0
o 1
(“on” u “off”). Por ejemplo:
/proc/sys/net/ipv4/ip_forward
-
El valor que habilita o deshabilita nuestra máquina para que actúe como un enrutador (reenviar paquetes):
$ cat /proc/sys/net/ipv4/ip_forward 0
Sin embargo, hay algunas excepciones:
/proc/sys/kernel/pid_max
-
La cantidad maxima de PID permitada:
$ cat /proc/sys/kernel/pid_max 32768
Warning
|
Tenga mucho cuidado al cambiar la configuración del núcleo, ya que un valor incorrecto puede provocar un sistema inestable. |
Dispositivos de hardware
Recuerde, en Linux “todo es un archivo”. Esto implica que la información del dispositivo de hardware, así como los ajustes de configuración propios del núcleo se almacenen en archivos especiales que residen en directorios virtuales.
El directorio /dev
El directorio device /dev
contiene archivos de dispositivo o nodos para todos los dispositivos de hardware conectados. Estos archivos se utilizan como una interfaz entre los dispositivos y los procesos que los utilizan. Cada archivo de dispositivo se divide en una de dos categorías:
- Dispositivos de bloque (Block devices)
-
Son aquellos en los que los datos se leen y escriben en bloques que pueden abordarse individualmente. Los ejemplos incluyen discos duros (y sus particiones, como
/dev/sda1
), unidades flash USB, CD, DVD, etc. - Dispositivos de carácter (Character devices)
-
Son aquellos en los que los datos se leen y escriben secuencialmente un carácter a la vez. Los ejemplos incluyen teclados, la consola de texto (
/dev/console
), puertos seriales (como/dev/ttyS0
, etc.), etc.
Al enumerar los archivos del dispositivo, asegúrese de usar ls
con el interruptor -l
para diferenciar entre los dos. Podemos, por ejemplo, buscar discos duros y particiones:
# ls -l /dev/sd* brw-rw---- 1 root disk 8, 0 may 25 17:02 /dev/sda brw-rw---- 1 root disk 8, 1 may 25 17:02 /dev/sda1 brw-rw---- 1 root disk 8, 2 may 25 17:02 /dev/sda2 (...)
O para terminales en serie (TeleTYpewriter):
# ls -l /dev/tty* crw-rw-rw- 1 root tty 5, 0 may 25 17:26 /dev/tty crw--w---- 1 root tty 4, 0 may 25 17:26 /dev/tty0 crw--w---- 1 root tty 4, 1 may 25 17:26 /dev/tty1 (...)
Observe cómo el primer carácter es b
para dispositivos de bloque y c
para dispositivos de carácter.
Tip
|
El asterisco ( |
Además, /dev
incluye algunos archivos especiales que son bastante útiles para diferentes propósitos de programación:
/dev/zero
-
Proporciona tantos caracteres nulos como se solicite.
/dev/null
-
Aka bit bucket. Descarta toda la información que se le envía.
/dev/urandom
-
Genera números pseudoaleatorios.
El directorio /sys
El sistema de archivos sys (sysfs
) está montado en /sys
. Se introdujo con la llegada del kernel 2.6 y significó una gran mejora en /proc/sys
.
Los procesos deben interactuar con los dispositivos en /dev
y por lo tanto, el núcleo necesita un directorio que contenga información sobre estos dispositivos de hardware. Este directorio es /sys
y sus datos están ordenados en categorías. Por ejemplo, para verificar la dirección MAC de su tarjeta de red (enp0s3
) puede usar el comando cat
en el siguiente archivo:
$ cat /sys/class/net/enp0s3/address 08:00:27:02:b2:74
Memoria y tipos de memoria
Básicamente, para que un programa comience a ejecutarse debe cargarse en la memoria. En general, cuando hablamos de memoria nos referimos a Random Access Memory (RAM) y en comparación con los discos duros mecánicos tiene la ventaja de ser mucho más rápido. En el lado negativo, es volátil (es decir, una vez que la computadora se apaga, los datos desaparecen).
No obstante, cuando se trata de memoria podemos diferenciar dos tipos principales en un sistema Linux:
- Memoria física
-
También conocido como RAM, son en forma de chips formados por circuitos integrados que contienen millones de transistores y condensadores. Estos a su vez, forman celdas de memoria (el componente básico de la memoria de la computadora). Cada una de estas celdas tiene un código hexadecimal asociado, una dirección de memoria, para que pueda ser referenciada cuando sea necesario.
- Swap
-
También conocido como swap space, es la porción de memoria virtual que se encuentra en el disco duro y se usa cuando no hay más RAM disponible.
Por otro lado, existe el concepto de memoria virtual, que es una abstracción de la cantidad total de memoria utilizable (RAM y espacio en disco).
free
analiza /proc/meminfo
y muestra la cantidad de memoria libre y usada en el sistema de una manera muy clara:
$ free total used free shared buff/cache available Mem: 4050960 1474960 1482260 96900 1093740 2246372 Swap: 4192252 0 4192252
Expliquemos las diferentes columnas:
total
-
Cantidad total de memoria física y de intercambio instalada.
used
-
Cantidad de memoria física e intercambio actualmente en uso.
free
-
Cantidad de memoria física e intercambio que actualmente no esta en uso.
shared
-
Cantidad de memoria física utilizada principalmente por
tmpfs
. buff/cache
-
Cantidad de memoria física actualmente en uso por las memorias intermedias del núcleo y la caché.
available
-
Estimación de cuánta memoria física está disponible para nuevos procesos.
Por defecto, free
muestra valores en kibibytes, pero permite que una variedad de interruptores muestren sus resultados en diferentes unidades de medida. Algunas de estas opciones incluyen:
-b
-
Bytes.
-m
-
Mebibytes.
-g
-
Gibibytes.
-h
-
Formato legible por humanos.
-h
siempre es cómodo de leer:
$ free -h total used free shared buff/cache available Mem: 3,9G 1,4G 1,5G 75M 1,0G 2,2G Swap: 4,0G 0B 4,0G
Note
|
Un kibibyte (KiB) equivale a 1,024 bytes mientras que un kilobytes (KB) equivale a 1000 bytes. Lo mismo es respectivamente cierto para mebibytes, gibibytes, etc. |
Guía de ejercicios
-
Use el comando
which
para averiguar la ubicación de los siguientes programas y completar la tabla:Programa comando which
Ruta ejecutable (salida) ¿El usuario necesita privilegios de root? swapon
kill
cut
usermod
cron
ps
-
¿Dónde se encuentran los siguientes archivos?
Archivo /etc
~
.bashrc
bash.bashrc
passwd
.profile
resolv.conf
sysctl.conf
-
Explique el significado de los elementos numéricos para el archivo del núcleo
vmlinuz-4.15.0-50-generic
que se encuentra en/boot
:Número de elemento Significado 4
15
0
50
-
¿Qué comando usarías para enumerar todos los discos duros y particiones en
/dev
?
Ejercicios exploratorios
-
Los archivos de dispositivo para discos duros se representan en función de los controladores que utilizan:
/dev/sd *
para unidades que usan SCSI (interfaz de sistema de computadora pequeña) y SATA (accesorio de tecnología avanzada en serie).-
¿Cómo se representaron las unidades antiguas IDE (Integrated Drive Electronics)?
-
¿Y las modernas unidades NVMe (Non-Volatile Memory Express)?
-
-
Echa un vistazo al archivo
/proc/meminfo
. Compare el contenido de este archivo con la salida del comandofree
e identifique qué tecla de/proc/meminfo
corresponde a los siguientes campos en la salida defree
:Salida de free
campo /proc/meminfo
total
free
shared
buff/cache
available
Resumen
En esta lección, ha aprendido sobre la ubicación de los programas y sus archivos de configuración en un sistema Linux. Los hechos importantes para recordar son:
-
Básicamente, los programas se encuentran en una estructura de directorio de tres niveles:
/
,/usr
y/usr/local
. Cada uno de estos niveles puede contener directoriosbin
ysbin
. -
Los archivos de configuración se almacenan en
/etc
y~
. -
Los archivos ocultos son los que comienzan con un punto (
.
).
También hemos discutido el kernel de Linux. Los hechos importantes son:
-
Para Linux, todo es un archivo.
-
El kernel de Linux se encuentra en
/boot
junto con otros archivos relacionados con el arranque. -
Para que los procesos comiencen a ejecutarse, el kernel primero debe cargarse en un área protegida de la memoria.
-
El trabajo del kernel es el de asignar recursos del sistema a los procesos.
-
El sistema de archivos virtual (o pseudo)
/proc
almacena datos importantes del kernel y del sistema de forma volátil.
Del mismo modo, hemos explorado dispositivos de hardware y aprendido lo siguiente:
-
El directorio
/dev
almacena archivos especiales (también conocidos como nodos) para todos los dispositivos de hardware conectados: block devices o character devices. Los primeros transfieren datos en bloques y el otro un carácter a la vez. -
El directorio
/dev
también contiene otros archivos especiales como/dev/zero
,/dev/null
o/dev/urandom
. -
El directorio
/sys
almacena información sobre dispositivos de hardware organizados en categorías.
Finalmente tocamos la memoria. Aprendimos:
-
Un programa se ejecuta cuando se carga en la memoria.
-
¿Qué es RAM (Random Access Memory)?
-
Qué es Swap?
-
¿Cómo mostrar el uso de la memoria?
Comandos usados en esta lección:
cat
-
Concatenar o imprimir el contenido de un archivo.
free
-
Muestra la cantidad de memoria libre y usada en el sistema.
ls
-
Lista de contenidos del directorio.
which
-
Mostrar ubicación del programa.
Respuestas a los ejercicios guiados
-
Use el comando
which
para averiguar la ubicación de los siguientes programas y completar la tabla:Programa comando which
Ruta ejecutable (salida) ¿El usuario necesita privilegios de root? swapon
which swapon
/sbin/swapon
Si
kill
which kill
/bin/kill
No
cut
which cut
/usr/bin/cut
No
usermod
which usermod
/usr/sbin/usermod
Si
cron
which cron
/usr/sbin/cron
Si
ps
which ps
/bin/ps
No
-
¿Dónde se encuentran los siguientes archivos?
File /etc
~
.bashrc
No
Si
bash.bashrc
Si
No
passwd
Si
No
.profile
No
Si
resolv.conf
Si
No
sysctl.conf
Si
No
-
Explique el significado de los elementos numéricos para el archivo del núcleo
vmlinuz-4.15.0-50-generic
que se encuentra en/boot
:Número de elemento Significado 4
Kernel version
15
Major revision
0
Minor revision
50
Patch number
-
¿Qué comando usarías para enumerar todos los discos duros y particiones en
/dev
?ls /dev/sd*
Respuestas a los ejercicios exploratorios
-
Los archivos de dispositivo para discos duros se representan en función de los controladores que utilizan:
/dev/sd *
para unidades que usan SCSI (interfaz de sistema de computadora pequeña) y SATA (accesorio de tecnología avanzada en serie).-
¿Cómo se representaron las unidades antiguas IDE (Integrated Drive Electronics)?
/dev/hd*
-
¿Y las modernas unidades NVMe (Non-Volatile Memory Express)?
/dev/nvme*
-
-
Echa un vistazo al archivo
/proc/meminfo
. Compare el contenido de este archivo con la salida del comandofree
e identifique qué tecla de/proc/meminfo
corresponde a los siguientes campos en la salida defree
:Salida de free
campo /proc/meminfo
total
MemTotal
/SwapTotal
free
MemFree
/SwapFree
shared
Shmem
buff/cache
Buffers
,Cached
andSReclaimable
available
MemAvailable