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 este tema 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 delogrotate
, esta configuración ahora se puede colocar en un archivo dedicado en el directoriologrotate.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 paquetesapt
: 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.
.profile
-
Script de inicialización de Bash para shells de inicio de sesión.
Note
|
Consulte el tema "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. A
continuación algunos ejemplos de
estos archivos de configuración: .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 memoria de los símbolos del kernel (Memory Address Locations). 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óximo tema, 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 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 visualizar relaciones de archivos
del dispositivo, asegúrese de usar ls
con el modificador -l
para diferenciar entre los dos (bloque
o caracter). 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 de /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ápida. 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 conocida como RAM, se materializa en forma de microchips electrónicos 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 o área de intercambio, 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