0% encontró este documento útil (0 votos)
75 vistas104 páginas

Linux

Este documento proporciona una introducción a los conceptos básicos de Linux, incluida la shell de Linux, el sistema de archivos, los permisos, los procesos y más. La shell de Linux es una interfaz de línea de comandos que permite a los usuarios interactuar con el sistema operativo mediante la entrada de comandos. El prompt indica que la shell está lista para recibir instrucciones, y comandos como clear se pueden usar para limpiar la pantalla de la terminal. Linux utiliza un kernel que controla el hardware y software, separando el espacio del kernel del

Cargado por

Notaaplayer
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
75 vistas104 páginas

Linux

Este documento proporciona una introducción a los conceptos básicos de Linux, incluida la shell de Linux, el sistema de archivos, los permisos, los procesos y más. La shell de Linux es una interfaz de línea de comandos que permite a los usuarios interactuar con el sistema operativo mediante la entrada de comandos. El prompt indica que la shell está lista para recibir instrucciones, y comandos como clear se pueden usar para limpiar la pantalla de la terminal. Linux utiliza un kernel que controla el hardware y software, separando el espacio del kernel del

Cargado por

Notaaplayer
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 104

Linux

Introducción 3
Conceptos Básicos 4
1. La Shell de Linux 4
1.1 Clear, history 4
1.2 Type 6
1.3 Help, man, info, whatis, apropos 7
1.4 Atajos de teclado de interés 9
1.5 Caso práctico: Creando nuestro propio Alias 9
2. Sistema de ficheros 10
2.1 Sistema de ficheros de Linux 11
2.2 Navegación 12
2.3 Creación de ficheros y editores de texto 13
2.4 Visualización de ficheros y directorios 14
2.4 Búsqueda de ficheros y directorios 16
2.5 Principales directorios de Linux 17
3. Conceptos avanzados del sistema de ficheros 18
3.1 Inodos: Asignación indexada 19
3.2 Dentries 23
3.3 Enlaces simbólicos 24
3.4 Enlaces duro 25
3.5 Wildcards 27
3.5 Shell Expansions 28
3.6 Command Substitution 29
3.7 Comillas en la Shell de Linux 29
3.8 Escapando caracteres 31
4. Redirecciones y pipelines 32
4.1 I/O Redirection 32
4.2 Standard Output 33
4.3 Standard Error 34
4.4 /dev/null 36
4.5 Standard Input 36
4.6 Pipelines 36
4.7 Filtros y búsquedas 37
5. Permisos y usuario 39
5.1 Permisos y usuarios 39
5.2 Lectura, escritura y ejecución 44
5.3 Usuario root 45
5.4 Modificación de permisos en octal 47
5.5 Modificación de permisos simbólica 48
5.6 Permisos por defecto 48
5.7 Setuid, Setgid, Sticky Bit 49
5.8 Cambio de identidad 51
5.9 Sudo 54
5.10 Sudoers 55
5.11 Gestión de usuarios y grupos 58
5.12 Cambio de propietario 61
6. Procesos 62
6.1 Procesos en Linux 62
6.2 Visualización estática de procesos 64
6.3 Visualización dinámica de procesos 66
6.4 Interrupción procesos 68
6.5 Señales 69
6.6 Init, demonios y servicios 72
6.7 Gestión de servicios 74
6.8 Apagado del sistema 76
6.9 Cambio de prioridad 77
6.10 Proceso de arranque de un ordenador 78
7. Redes 81
7.1 Interfaces de red 81
8. Gestión de paquetes y librerías 82
8.1 Buscar, instalar y actualizar paquetes 82
8.2 Instalación manual de paquetes 84
8.3 Eliminar, listar y buscar paquetes ya instalados 85
8.4 Actualizar la distribución de Linux 86
8.5 Añadir nuevos repositorios de paquetes 87
9. El entorno en Linux 88
9.1 El entorno en Linux 88
9.2 Como se establece el entorno 89
9.3 Modificando el entorno 91
9.4 Variables de entorno interesantes 93
10. Dispositivos de almacenamiento externos 93
10.1 Dispositivos extraibles 93
10.2 Montar y desmontar un dispositivo 94
10.3 Identificar el nombre del dispositivo 95
11. Archivando y comprimiendo archivos 96
11.1 Comprimiendo y descomprimiendo ficheros 96
Introducción
En 1969, Kenneth Thompson y Dennis Ritchie (AT&T Bell Labs) desarrollaron UNIX OS
en ensamblador. En 1971, Thompson y Ritchie crearon el lenguaje de programación C y
reimplementaron UNIX OS proporcionando portabilidad en base a este lenguaje. AT&T era
el único propietario de UNIX, por ello, en 1983, Richard Stallman inició el proyecto GNU
(GNU's Not Unix) para crear un sistema operativo similar a UNIX OS gratuito. Al mismo
tiempo, Richard Stallman escribió la licencia GPL (GNU General Public License). GNU
nunca llegó a ser un sistema operativo estable y completo. En 1987, Andrew S.
Tanenbaum desarrolló MINIX, un Sistema Operativo de uso académico similar a UNIX OS.
El código de MINIX era de acceso público; sin embargo, no podía modificarse o
distribuirse. Estos sucesos, unidos a la aparición de un nuevo procesador de Intel al que los
Sistemas Operativos anteriores no se adaptaban bien, dieron paso a Linux.

Linux comienza en 1991 como un proyecto personal de un estudiante Finlandés


llamado Linux Torvalds haciendo uso de MINIX utilizando el GNU C Compiler, un
compilador del proyecto GNU. El 25 de agosto de 1991, Linus Torvalds presentó Linux al
mundo.

Linus Torvalds publica el primer Kernel de Linux bajo su propia licencia con ciertas
restricciones de actividades comerciales. Desde el primer momento Linux incluía software
de aplicación procedente del proyecto GNU, por ejemplo, GNU BASH.

Ante las necesidades crecientes de Software de aplicación, en 1992 se decide liberar el


Kernel de Linux bajo licencia GNU GPL uniendo Torvalds sus esfuerzos a los
desarrolladores de GNU para integrar Linux con varios componentes GNU y crear un
sistema operativo funcional y completo totalmente libre. Es en este momento cuando surge
el concepto de distribuciones o “sabores” de Linux, es decir, el kernel de Linux
desarrollado por Linus Torvalds con un software de aplicación específico para cubrir ciertas
funcionalidades en función de las necesidades del usuario. Ejemplos son Ubuntu o Debian.
Conceptos Básicos
Kernel: Programa informático que se
encuentra en el núcleo del sistema operativo
de un ordenador y tiene un control total sobre
todo lo que ocurre en el sistema.
Siempre reside en la memoria RAM, facilita
las interacciones entre los componentes
hardware y software, gestiona la ejecución de
procesos, maneja interrupciones…
Se carga en una zona separada de memoria
protegida del acceso del software de
aplicaciones o de otra parte menos crítica del
sistema operativo.
Espacio de usuario: Los programas de aplicación (navegadores, editores de texto,
reproductores de vídeo…) utilizan una memoria separada. Esta separación evita que los
datos del usuario y los del kernel interfieran entre sí y provocan inestabilidad y lentitud.
1. La Shell de Linux

1.1 Clear, history


La "shell" en Linux es una interfaz de línea de comandos que permite a los usuarios
interactuar con el sistema operativo mediante la entrada de comandos. En otras palabras, la
shell es un intérprete de comandos que toma las instrucciones que escribes y las ejecuta en
el sistema operativo. En el contexto de Linux, hay varias shells disponibles, y los usuarios
pueden elegir la que prefieran. Algunas de las shells más comunes incluyen Bash (Bourne
Again SHell), Zsh (Z Shell), Fish (Friendly Interactive SHell), entre otras.

La shell proporciona una forma poderosa de interactuar con el sistema operativo,


permitiendo a los usuarios realizar diversas tareas, como la navegación por el sistema de
archivos, la ejecución de programas, la manipulación de archivos y directorios, y la
automatización de tareas mediante scripts.

Los usuarios pueden acceder a la shell a través de la terminal, que es una interfaz de texto
en la que ingresan comandos y reciben la salida correspondiente del sistema. También
existen entornos de escritorio en Linux que proporcionan interfaces gráficas, pero muchos
usuarios avanzados y administradores del sistema prefieren la eficiencia y flexibilidad de la
shell para ciertas tareas.

Si nosotros en Ubuntu abrimos el terminal podremos acceder a una herramienta gráfica


donde introducir comandos. Aquí, veremos algo como lo siguiente:
El "prompt" de la máquina, en el contexto de la informática y la línea de comandos, se
refiere al símbolo o texto que aparece en la pantalla para indicar que el sistema está listo
para recibir comandos del usuario. Es el indicador que muestra que la shell (interfaz de
línea de comandos) está esperando a que ingreses una instrucción.

El "prompt" generalmente consiste en un texto seguido de un cursor intermitente, y su


aspecto puede variar dependiendo de la shell y la configuración del sistema. Por ejemplo,
en la shell Bash, el prompt predeterminado podría ser algo como:

si@si-VirtualBox:~$

En este caso:

● si es el nombre del usuario actual.


● si-VirtualBox es el nombre de la máquina o el sistema.
● ~ representa el directorio actual del usuario.
● $ indica que el sistema está listo para recibir comandos.

Después del prompt, el usuario puede escribir comandos y presionar Enter para que la shell
los ejecute. El prompt es una parte importante de la interfaz de línea de comandos,
proporcionando información sobre el estado actual y permitiendo la interacción del usuario
con el sistema.

Aquí nosotros podemos introducir comandos muy simples como:

El comando clear en Linux se utiliza para limpiar la pantalla de la terminal, proporcionando


un espacio limpio y sin ningún contenido visible. Esto no elimina el historial de comandos;
simplemente desplaza la pantalla hacia arriba, dejando una pantalla vacía.
El comando history muestra una lista de comandos previamente ejecutados en la
terminal, junto con sus números de identificación. Puedes usar estos números para ejecutar
comandos anteriores desde el historial. Podemos eliminar este historial con history -c.

1.2 Type
Existen diferentes tipos de comandos en el sistema que podemos ver con el comando
type, como pueden ser comandos directamente implementados dentro de la propia shell.
Otros, donde el ejecutable es un programa externo invocado por la shell y se encuentra en
una ruta específica. También hay comandos escritos en shell script y alias (shortcuts) con
diferentes argumentos que queremos que se ejecuten con el comando base; este es el caso
del comando ls.

Además de esto, tenemos que destacar que los comandos pueden aceptar parámetros
(aumentan o dan un comportamiento diferente a un comando) y argumentos (proporcionan
información específica sobre cómo ejecutar el comando).

1.3 Help, man, info, whatis, apropos


Con el objetivo de tener información de un comando tenemos diferentes opciones como es
el caso de help que aporta información de un comando propio del sistema, si no es este
caso tendremos que introducir el comando seguido de la opción --help.
Como podemos ver, help únicamente nos da información de órdenes internas del sistema y
no de archivos ejecutables.

También tenemos otras herramientas como los comandos man (man ls nos da información
del comando ls en detalle), info o whatis. Otro es el comando apropos en Linux se
utiliza para buscar y mostrar información sobre comandos disponibles en el sistema. Su
función principal es proporcionar una lista de comandos relacionados con una palabra clave
dada. Este comando es especialmente útil cuando no estás seguro del nombre exacto de un
comando, pero tienes una idea de lo que debería hacer.

Por otra parte, tenemos el manejo de comandos y expresiones lógicas que nos permiten
ejecutar varios comandos en una única línea. Si bien es cierto que podemos partir
comandos como en el siguiente ejemplo:
Podemos ejecutar comandos en una única línea separando por ; los comandos o añadiendo
operadores lógicos como && o || que permitan discriminar cuándo ejecutar según qué
comando.

1.4 Atajos de teclado de interés


A continuación se adjunta un listado de algunos atajos interesantes para la shell de Linux.

● Ctrl + A → Ir al principio de la línea en la que se está escribiendo.


● Ctrl + E → Ir al final de la línea en la que se está escribiendo.
● Ctrl + L → Borra la pantalla, similar al comando clear
● Ctrl + U → Borra la línea anterior a la posición del cursor. Si está al final de la
línea, borra toda la línea.
● Ctrl + H → Borra el carácter anterior a la posición del cursos. Igual que retroceso.
● Ctrl + R → Permite buscar entre los comandos utilizados anteriormente.
● Ctrl + C → Interrumpe la ejecución de un programa.
● Ctrl + D → Cierra la shell actual.
● Ctrl + W → Corta la palabra anterior a la posición cursor.
● Ctrl + K → Corta la línea siguiente a la posición del cursor.
● Ctrl + T → Intercambia los dos últimos caracteres anteriores a la posición del
cursor.
● Esc + T → Intercambia las dos últimas palabras anteriores a la posición del cursor.
● Alt + . o !$ → Referencia el último argumento del comando anterior.
● Alt + F → Avanza el cursor una palabra en la línea actual.
● Alt + B → Retrocede el cursor una palabra en la línea actual.
● Alt + l/u → Convierte la palabra en mayúsculas o minúsculas.
● Tab → Autocompleta nombres de archivos y carpetas.

1.5 Caso práctico: Creando nuestro propio Alias


Vamos a crear un alias que permita limpiar el contenido del terminal y a continuación listar el
contenido del directorio actual.

Para crear un alias primero tenemos que asegurarnos de que no existe en el sistema ningún
comando o alias anteriormente creado y alias nombre_alias=’comando/s del
alias’. El resultado de nuestro alias será el siguiente:

Si queremos reescribir el alias simplemente volvemos a ejecutar el comando anterior con


las modificaciones necesarias y si queremos eliminarlo empleamos unalias
nombre_alias.
Para ver los alias del sistema podemos ejecutar simplemente alias. De momento nuestro
alias creado no es persistente por lo que se eliminará al cerrar el terminal.
Es posible que al ejecutar el comando type sobre algunos comandos de la shell de Linux
se haya obtenido un resultado similar al siguiente:

1. santi@santi-virtual-machine:~/Desktop$ type which


2. which is hashed (/usr/bin/which)
¿Qué quiere decir que un comando determinado "is hashed"?

Ya hemos visto que algunos programas externos de la shell, como el comando which, se
encuentran en una ruta determinada del sistema de ficheros, en este caso,
/usr/bin/which. Cada vez que nosotros ejecutamos un programa de este tipo, la shell
debe resolver la ruta e ir a buscar el archivo externo para ejecutarlo.

Para evitar tener que realizar todas estas acciones en comandos que utilizamos de manera
muy frecuente, la shell puede mantener una lista de programas con su ruta asociada
(entenderemos mejor en qué consiste la resolución de la ruta cuando hablemos del entorno
y de la variable PATH en siguientes secciones del curso). Esta lista se llama tabla hash
(hash table).

Cuando la shell nos dice que un comando "is hashed", significa que ya ha resuelto su ruta y
la ha guardado en la hash table para acceder a ella mucho más rápido. Si queréis
comprobar qué comandos tenéis en la hash table, podéis ejecutar el comando hash en la
shell de Linux. Por otro lado, si queréis eliminar todas las entradas de vuestra hash table y
que ningún comando aparezca como "is hashed" podéis ejecutar el comando hash -r
Tened en cuenta que aunque borréis la tabla, cuando volváis a ejecutar algunos comandos
como which, la shell los añadirá de nuevo a la hash table para evitar resolver su ruta en el
futuro.

2. Sistema de ficheros

2.1 Sistema de ficheros de Linux


En Linux, el sistema de archivos es una parte esencial del sistema operativo que organiza y
gestiona la forma en que se almacenan y recuperan los datos en el disco duro u otros
dispositivos de almacenamiento. El sistema de archivos proporciona una estructura
jerárquica de directorios y archivos para facilitar la organización y la administración de la
información. Algunos de los sistemas de archivos más comunes en Linux son ext4, ext3,
ext2, XFS, Btrfs, y muchos más.

Aquí hay algunos conceptos clave relacionados con el sistema de archivos en Linux:

1. Jerarquía de directorios: En Linux, los archivos se organizan en una jerarquía de


directorios que comienza desde el directorio raíz ("/"). Los directorios contienen
archivos y otros subdirectorios, y cada elemento en la jerarquía se identifica por su
ruta completa desde el directorio raíz.
2. Montaje de dispositivos: En Linux, los dispositivos de almacenamiento se montan
en el sistema de archivos para que el sistema operativo pueda acceder a ellos. Esto
significa que el contenido de un dispositivo (como una partición de disco o una
unidad USB) se hace accesible en un directorio específico del sistema.
3. Tipos de sistemas de archivos:
○ ext4: Es uno de los sistemas de archivos más utilizados en Linux.
Proporciona mejor rendimiento y confiabilidad en comparación con sus
predecesores (ext3, ext2).
○ XFS: Diseñado para manejar grandes volúmenes de datos y ofrecer un
rendimiento eficiente para sistemas de archivos de gran tamaño.
○ Btrfs: Un sistema de archivos avanzado que incluye características como
instantáneas, compresión y administración eficiente de espacio.
4. Comandos básicos:
○ ls: Muestra el contenido de un directorio.
○ cd: Cambia el directorio actual.
○ pwd: Muestra la ruta del directorio actual.
○ mkdir: Crea un nuevo directorio.
○ touch: Crea un nuevo archivo vacío.
○ cp, mv, rm: Copia, mueve o elimina archivos y directorios.
○ cat, nano, vim: Permite ver o editar archivos de texto.
5. Permisos y propietarios: Cada archivo y directorio en Linux tiene atributos de
permisos y un propietario. Los permisos especifican quién puede leer, escribir o
ejecutar un archivo, y el propietario es la entidad que tiene derechos sobre el
archivo.
6. Montajes persistentes: Los sistemas de archivos pueden montarse de forma
temporal o permanente. Los montajes permanentes se definen en el archivo
/etc/fstab, lo que garantiza que se realicen automáticamente durante el arranque
del sistema.

Vamos a ejecutar un comando que es el comando tree, para ello tenemos que instalar el
comando con el comando: sudo apt install tree. Vamos a proceder a explorar el
sistema de ficheros desde el directorio / con una profundidad de un nivel.
2.2 Navegación
A mayores, tenemos múltiples comandos de interés para poder manejarnos por el sistema
de ficheros de Linux. Varios de estos son los comandos:

pwd - Print Working Directory:

● Este comando muestra la ruta del directorio actual en el que te encuentras. Es útil
para saber en qué parte de la estructura de directorios estás trabajando.

ls - List:

● El comando ls se utiliza para listar los archivos y directorios en el directorio actual.


Puede utilizarse con varias opciones para mostrar información adicional, como
permisos, tamaños de archivo, fechas de modificación, etc.

cd - Change Directory:

● El comando cd se utiliza para cambiar el directorio actual. Puedes proporcionar la


ruta completa o relativa al directorio al que deseas cambiar.
2.3 Creación de ficheros y editores de texto
mkdir - Make Directory:

● Este comando se utiliza para crear un nuevo directorio en el sistema de archivos.

nano - Editor de texto en la terminal:

● Este comando se utiliza para abrir o crear archivos en la terminal para su edición.
file: Este comando se utiliza para determinar el tipo de archivo. Nos dirá el tipo de
archivo, por ejemplo, si es un archivo de texto, un archivo binario, etc.

more: Este comando se utiliza para ver el contenido de un archivo página por página.

less: Similar a more, pero más potente. less permite navegar hacia adelante y hacia atrás
en el contenido de un archivo.

cat: Este comando se utiliza para mostrar el contenido completo de un archivo en la salida
estándar. Su nombre viene de "concatenar" ya que originalmente se usaba para concatenar
y mostrar el contenido de varios archivos.

2.4 Visualización de ficheros y directorios


Comandos cp, mv y rm en sistemas Linux:
cp (copy): Este comando se utiliza para copiar archivos o directorios de un lugar a otro. La
sintaxis básica es:

cp origen destino
Por ejemplo, para copiar un archivo llamado archivo.txt a un directorio llamado
destino:
cp archivo.txt destino/
Si deseas copiar un directorio y su contenido recursivamente, usamos la opción -r o -R:

cp -r directorio_origen destino/
mv (move): Este comando se utiliza para mover o renombrar archivos y directorios. La
sintaxis básica es similar a cp:

mv origen destino
Para cambiar el nombre de un archivo, simplemente proporciona el nuevo nombre como
destino.
mv antiguo_nombre.txt nuevo_nombre.txt
También puedes utilizar mv para mover archivos y directorios a otro lugar:
mv archivo.txt directorio_destino/
rm (remove): Este comando se utiliza para eliminar archivos o directorios. La sintaxis básica
para eliminar un archivo es:

rm nombre_del_archivo
Si deseas eliminar un directorio y su contenido de manera recursiva, puedes usar la opción
-r o -R:
rm -r nombre_del_directorio
Ten mucho cuidado al utilizar rm -r porque eliminará los archivos y directorios sin solicitar
confirmación y de forma irreversible.
2.4 Búsqueda de ficheros y directorios
El comando find en sistemas Unix/Linux se utiliza para buscar archivos y directorios en un
sistema de archivos basándose en diversos criterios. Puede ser una herramienta muy
poderosa para buscar y filtrar archivos según diferentes parámetros. Aquí te dejo una
descripción básica de su uso: La sintaxis básica de find es la siguiente:
find ruta -opciones patrón

● ruta: Especifica el directorio desde el cual comenzará la búsqueda.


● opciones: Pueden incluir diversas opciones que afectan cómo se realiza la
búsqueda, como por ejemplo -name para buscar por nombre de archivo, -type
para especificar el tipo de archivo (regular file, directory, etc.), -size para buscar
por tamaño, etc.
● patrón: Define el patrón o criterio que find utilizará para buscar archivos.

Buscar por nombre de archivo: find /ruta/del/inicio -name "archivo.txt"

Esto buscará el archivo llamado "archivo.txt" desde la ruta especificada y hacia


abajo en la jerarquía de directorios.

Buscar por tipo de archivo: find /ruta/del/inicio -type f

Esto buscará todos los archivos regulares.

Buscar por tamaño de archivo: find /ruta/del/inicio -size +1M

Esto buscará archivos que sean mayores a 1 megabyte.


2.5 Principales directorios de Linux
En la siguiente imagen podemos ver los principales directorios de Linux. Es imprescindible
conocer cuál es el uso que recibe cada uno de ellos.

1. / (Raíz): El directorio raíz es el nivel superior del sistema de archivos. Todos los
demás directorios y archivos están contenidos dentro de este.
2. /bin (Binarios): Contiene binarios esenciales (ejecutables) del sistema. Estos son
programas que son necesarios para el sistema operativo, incluso cuando el sistema
de archivos principal no está montado. En la actualidad este no existe y tenemos un
enlace simbólico con usr/bin.
3. /boot: Contiene archivos relacionados con el proceso de arranque del sistema,
como el kernel del sistema operativo y otros archivos necesarios para el inicio del
sistema.
4. /dev (Dispositivos): Contiene archivos de dispositivo que representan hardware o
dispositivos del sistema. Por ejemplo, /dev/sda podría representar el primer disco
duro.
5. /etc (Configuración): Almacena archivos de configuración del sistema y de las
aplicaciones. Aquí se encuentran archivos de configuración importantes, como
/etc/passwd y /etc/network.
6. /home: Directorio base para los directorios personales de los usuarios. Cada usuario
tiene un subdirectorio aquí con su nombre de usuario.
7. /lib, lib32, /lib64 y libx32 (Bibliotecas): Contienen bibliotecas
compartidas necesarias para los programas del sistema y las aplicaciones.
8. /mnt (Montaje): Tradicionalmente utilizado como un lugar para montar
temporalmente sistemas de archivos externos.
9. /opt (Opcional): Algunas aplicaciones de software pueden ser instaladas en este
directorio (instalación de módulos de pago si lo deseara el usuario en función de sus
necesidades). Cada aplicación tiene su propio subdirectorio en /opt.
10. /proc: Un sistema de archivos virtual que proporciona información sobre los
procesos y el sistema en tiempo de ejecución.
11. /root: El directorio de inicio del usuario root (superusuario).
12. /sbin (Binarios de sistema): Similar a /bin, pero contiene programas ejecutables
utilizados principalmente por el superusuario para la administración del sistema.
13. /srv (Servicios): Contiene datos específicos de servicios proporcionados por el
sistema al exterior (servidores HTTP, FTP…).
14. /tmp (Temporal): Un directorio utilizado para almacenar archivos temporales.
15. /usr (Usuarios): Contiene archivos y subdirectorios relacionados con usuarios,
incluyendo binarios, bibliotecas, encabezados y documentación.
16. /var (Variables): Contiene archivos variables, como registros (/var/log), archivos
temporales (/var/tmp) y otros datos que pueden cambiar durante el tiempo de
ejecución del sistema.

3. Conceptos avanzados del sistema de ficheros


3.1 Inodos: Asignación indexada
Es el mecanismo empleado por los sistemas de archivos EXT de GNU/Linux, y su peculiar
estructura es la que posibilita la existencia de los i-nodos. El i-nodo de cada archivo (o
directorio) se corresponde con el primer bloque del archivo y en él se almacenan, directa o
indirectamente, las direcciones del resto de bloques ocupados por el archivo. Al igual que
en el enfoque anterior, existe una pequeña pérdida de espacio por la representación de
direcciones. El acceso directo, aunque no es realmente posible, puede ser emulado de
manera bastante eficiente a través de accesos desde el i-nodo (utilizando mecanismos
similares a la búsqueda binaria).

A diferencia de lo que ocurría en los sistemas de tipo FAT, solo se mantendrán en memoria
los i-nodos de aquellos archivos y directorios que estén siendo utilizados en el momento. Se
produce fragmentación externa, pero dado que las asignaciones no se realizan de manera
contigua, esto no genera problemas de relevancia. La estructura básica de un sistema de
archivos EXT, con asignación indexada, es la siguiente:

● Un i-nodo guarda:
○ Como ya dijimos, metainformación sobre el archivo o directorio al que está
asociado.
○ Una serie de punteros a bloques (bloques directos) que contienen los datos
del archivo.
○ Un puntero a un bloque de indirección simple.
○ Un puntero a un bloque de indirección doble. o Un puntero a un bloque de
indirección triple.
● Un bloque de indirección simple guarda punteros a bloques (bloques directos) que
contienen datos del archivo.
● Un bloque de indirección doble guarda punteros a bloques de indirección simple.
● Un bloque de indirección triple guarda punteros a bloques de indirección doble.
En el ejemplo anterior, vemos un sistema en el que cada bloque dispone de 10 campos que
pueden ser utilizados para contener información, metadatos o punteros a otros bloques.
Tenemos:

● El i-nodo del archivo tiene la siguiente estructura:


○ Un campo reservado para los metadatos del archivo asociado.
○ 6 campos que apuntan a los primeros 6 bloques del archivo (bloques
directos).
○ 1 campo que apunta al primer bloque de indirección simple.
○ 1 campo que apunta al primer bloque de indirección doble.
○ 1 campo que apunta al primer bloque de indirección triple.
● El primer bloque de indirección simple tiene 10 campos que apuntan a los siguientes
10 bloques del archivo (los bloques 7 a 16).
● El primer bloque de indirección doble tiene 10 campos que apuntan a los bloques de
indirección simple que van del 2 al 11. Estos bloques, a su vez, apuntarán cada uno
a 10 bloques directos (un total de 100), por lo que, en conjunto, apuntarán a los
bloques del archivo que van del 17 al 116.
● El primer bloque de indirección triple tiene 10 campos que apuntan a los bloques de
indirección doble que van del 2 al 11. Estos bloques, a su vez, apuntarán cada uno a
10 bloques de indirección simple (un total de 100), por lo que, en conjunto,
apuntarán a los bloques de indirección simple que van del 12 al 111. Y, por último,
estos bloques apuntarán cada uno a 10 bloques directos (un total de 1000), por lo
que habrá referencias a los bloques del archivo que van del 116 al 1115.

Si nosotros creamos un nuevo fichero en el sistema, este fichero, al igual que cualquier otro
fichero o directorio del sistema, va a tener un inodo con la información de este (metadatos).

1. df -i: Este comando muestra el uso de inodos en el sistema de archivos. Los


inodos son estructuras de datos que almacenan información sobre archivos y
directorios en sistemas de archivos Unix/Linux. La opción -i con df se utiliza para
mostrar estadísticas sobre inodos en lugar de bloques de disco. Proporciona
información sobre el número total de inodos, inodos utilizados y inodos libres en
cada sistema de archivos montado. Una de las salidas es la siguiente:

/dev/sda3 (Raíz del sistema): En esta partición del disco está el sistema
de archivos principal del equipo, montado en la raíz ("/"). Tiene un total de
3244032 inodos, de los cuales 223147 están en uso. Hay 3020885 inodos
libres, y el porcentaje de inodos utilizados es del 7%.

A mayores hay que decir que al tener un número de inodo asociado a cada
fichero podría darse el caso de que teniendo espacio libre en disco, ya se
hubiera cubierto todo el espacio libre de asignación de inodos y como
resultado no se podría crear más ficheros.

2. ls -la fichero.txt: Este comando muestra información detallada sobre un


archivo llamado "fichero.txt". La opción -l indica que se debe mostrar en formato
largo para obtener detalles como permisos, propietario, grupo, tamaño, fecha de
modificación, etc. La opción -a incluye archivos ocultos en la lista.
3. ls -i fichero.txt: Este comando muestra el número de inodo del archivo
"fichero.txt". La opción -i se utiliza para imprimir el número de inodo junto con el
nombre del archivo. Cada archivo o directorio en un sistema de archivos Unix/Linux
tiene un número de inodo único que lo identifica internamente en el sistema de
archivos.
4. stat fichero.txt: Este comando proporciona información detallada sobre el
archivo "fichero.txt". Muestra detalles como el número de inodo, tamaño del archivo,
bloques asignados, tipo de archivo, permisos, propietario, grupo, fechas de acceso,
modificación y cambio, entre otros. Es una manera concisa de obtener una amplia
variedad de metadatos asociados con un archivo en sistemas Unix/Linux.

La salida del comando stat fichero.txt proporciona información detallada sobre el


archivo "fichero.txt". A continuación, tenemos un desglose de cada parte de la respuesta:

● File: fichero.txt: Indica el nombre del archivo, en este caso, "fichero.txt".


● Size: 12: Muestra el tamaño del archivo en bytes. En este caso, "fichero.txt" tiene un
tamaño de 12 bytes.
● Blocks: 8: Indica el número de bloques asignados al archivo. En este caso, se
asignaron 8 bloques al archivo. Cada uno de los bloques del sistema tiene 512
Bytes.
● IO Block: 4096: Es el tamaño del bloque de E/S (entrada/salida) en bytes. En este
caso, es de 4096 bytes.
● Device: 803h/2051d: Indica el número de dispositivo. En el contexto de sistemas de
archivos Unix/Linux, el "dispositivo" se refiere al disco o la partición en el que se
encuentra el archivo.
● Inode: 2490817: Número del inodo de fichero.txt.
● Links: 1: Indica el número de enlaces (hard links) que apuntan al mismo inodo. En
este caso, solo hay un enlace al archivo.
● Access: (0664/-rw-rw-r--): Muestra los permisos de acceso del archivo en formato
octal y simbólico. En este ejemplo, el propietario tiene permisos de lectura y
escritura, el grupo tiene permisos de lectura y escritura, y otros tienen permisos de
lectura.
● Uid: (1000/ si) Gid: (1000/ si): Indica el identificador de usuario (Uid) y el
identificador de grupo (Gid) del propietario del archivo. En este caso, el Uid y Gid
son ambos 1000, y el nombre de usuario y grupo son "si".
● Access, Modify, Change, Birth: Estas líneas muestran las fechas y horas
relacionadas con el archivo:
○ Access: La última vez que se accedió al archivo.
○ Modify: La última vez que se modificó el contenido del archivo.
○ Change: La última vez que se cambiaron los metadatos del archivo
(permisos, propietario, etc.).
○ Birth: La fecha de creación del archivo.
Otra opción de obtener información sería la salida del comando sudo debugfs -R "stat
<2490817>" /dev/sda3 que proporciona información detallada sobre el inodo con el
número 2490817 en el sistema de archivos de la partición /dev/sda3. A continuación, se
explica cada sección de la salida:

1. Inode: 2490817 Type: regular Mode: 0664 Flags: 0x80000: Información básica
sobre el inodo.
○ Inode: Número del inodo.
○ Type: Tipo de archivo (en este caso, regular para un archivo
regular→fichero). Podría ser un directorio, enlace simbólico…
○ Mode: Permisos del archivo en formato octal (0664).
○ Flags: Indicadores adicionales (en este caso, 0x80000).
2. Generation: 3193865586 Version: 0x00000000:00000001: Información sobre la
generación y versión del inodo.
3. User: 1000 Group: 1000 Project: 0 Size: 12: Información sobre el propietario del
archivo, el grupo, el proyecto (generalmente no utilizado), y el tamaño del archivo en
bytes.
4. File ACL: 0: Información sobre la lista de control de acceso (ACL) del archivo.
5. Links: 1 Blockcount: 8: Número de enlaces al inodo y el número de bloques
asignados al archivo.
6. Fragment: Address: 0 Number: 0 Size: 0: Información sobre fragmentos
(generalmente no utilizada).
7. ctime, atime, mtime, crtime: Información sobre las fechas y horas relacionadas con
el inodo, como la creación (crtime), modificación (mtime), último acceso (atime), y
último cambio de metadatos (ctime).
8. Size of extra inode fields: 32: Tamaño de campos adicionales en el inodo.
9. Inode checksum: 0x4bab51b2: Suma de comprobación del inodo, permite
comprobar la integridad del inodo.
10. EXTENTS: (0):7381716: Información sobre los bloques de datos del archivo. Indica
que el bloque de datos está en la posición 0 y tiene la dirección lógica 7381716.

3.2 Dentries
Si uno se fija en la imagen anterior, uno podría preguntarse dónde se almacena el nombre
del archivo, ya que en este comando, esa información no aparece. Para ello Linux hace uso
de los Dentries o entradas de directorio que permite asociar un nombre de ficheros o
directorios con un número de inodo gracias a la estructura de directorios que utiliza Linux.
Cuando navegas por un directorio en el sistema de archivos, el kernel utiliza las dentries
para mapear los nombres de los archivos con sus correspondientes inodos.
3.3 Enlaces simbólicos
Los enlaces simbólicos, también conocidos como "symlinks" o "soft links", son un tipo de
enlace en el sistema de archivos de Unix/Linux que apunta a otro archivo o directorio
mediante una ruta relativa o absoluta. A diferencia de los enlaces duros (hard links), que se
refieren directamente a la misma entrada del sistema de archivos, los enlaces simbólicos
son archivos independientes que contienen una referencia al destino.

Si vemos el inodo de un enlace simbólico (lxxxxxxxxx en los permisos) de la raíz podemos


apreciar que son diferentes:

Sin embargo, si vemos información más detallada de /bin podemos apreciar que lo que
tenemos es un espacio ocupado de 0 bloques pero una referencia a /usr/bin.
Para crear un enlace simbólico en Linux, puedes utilizar el comando ln con la opción -s.
Aquí tienes la sintaxis básica del comando para crear un enlace simbólico:

ln -s <ruta_del_origen> <nombre_del_enlace_simbolico>

● <ruta_del_origen>: Es la ruta al archivo o directorio de origen al que deseas


crear un enlace simbólico.
● <nombre_del_enlace_simbolico>: Es el nombre que deseas asignar al enlace
simbólico.

Especialmente interesante resulta que si nos fijamos en la información de enlace_simbolico


podemos ver que el tamaño es 19, los 19 caracteres de Desktop/fichero.txt. Por otra parte,
si nosotros eliminamos el archivo fichero.txt, se rompe el enlace que tenmos creado.

3.4 Enlaces duro


En Linux, un enlace duro (hard link) es una conexión adicional a un archivo existente en el
sistema de archivos. A diferencia de los enlaces simbólicos, los enlaces duros no son
archivos independientes con su propia entrada de inodo; en cambio, todos los enlaces
duros comparten el mismo inodo y, por lo tanto, apuntan a la misma ubicación física en el
disco.

ln <ruta_del_origen> <nombre_del_enlace_simbolico>

● <ruta_del_origen>: Ruta al archivo o directorio de origen


● <nombre_del_enlace_simbolico>: Nombre del enlace.

Existen algunos conceptos especialmente interesantes en esta captura. Por una parte,
podemos ver que el número de inodo de enlace_duro es el mismo que el del fichero.txt, lo
que significa que cuando eliminamos fichero.txt, seguimos accediendo al contenido
almacenado en disco. Por este motivo, cuando nosotros hacemos ls -li el enlace se
comporta como un fichero al uso y no tenemos el permiso lxxxxxxxxx como en los enlaces
simbólicos.

Por otra parte, si nos fijamos en la tercera columna el número cambia de 2 a 1, este número
se refiere al número de enlaces duros que tenemos sobre cada archivo. Podríamos
preguntarnos porque motivo al crear un nuevo directorio automáticamente aparece un 2.
Esto es porque el . cuando hacemos ls es un enlace duro, al igual que los .. son un enlace
duro con el director anterior.
3.5 Wildcards
En Linux, los "wildcards" (comodines o caracteres comodín) son caracteres especiales que
se utilizan como patrones para hacer coincidir nombres de archivos o directorios en
comandos de la línea de comandos. Los wildcards son una forma poderosa de realizar
operaciones en lotes y trabajar con múltiples archivos de manera eficiente. Aquí tienes
algunos de los wildcards más comunes:

1. Asterisco (*): Coincide con cualquier cadena de caracteres, incluyendo ninguna


cadena.
○ Ejemplo: ls *.txt mostrará todos los archivos con extensión ".txt".
2. Signo de interrogación (?): Coincide con un solo carácter.
○ Ejemplo: ls file?.txt mostrará archivos como "file1.txt" o "fileA.txt".
3. Corchetes ([]): Coincide con un solo carácter que está dentro del conjunto
especificado.
○ Ejemplo: ls file[123].txt mostrará archivos como "file1.txt", "file2.txt" o
"file3.txt".
4. Rango de caracteres (- dentro de corchetes): Define un rango de caracteres.
○ Ejemplo: ls file[1-3].txt es equivalente al ejemplo anterior.
5. Negación (^ dentro de corchetes): Excluye un conjunto de caracteres.
○ Ejemplo: ls file[^abc].txt mostrará archivos que no tienen "a", "b" o
"c" después de "file".
6. Doble asterisco (**): Coincide con cualquier cadena de directorios o subdirectorios.
○ Ejemplo: ls /home/**/*.txt mostrará todos los archivos con extensión
".txt" en cualquier subdirectorio de "/home".

Estos wildcards son utilizados por muchos comandos en la línea de comandos de Linux,
como ls, cp, mv, rm, etc. Puedes combinar varios wildcards para realizar operaciones más
complejas.
3.5 Shell Expansions
La "shell expansion" (expansión de la shell) en Linux se refiere al proceso mediante el cual
la línea de comandos expande o interpreta ciertos caracteres o patrones antes de ejecutar
un comando. La expansión de la shell facilita la manipulación de archivos, la especificación
de conjuntos de archivos y la generación de listas de argumentos. Aquí hay algunas de las
principales técnicas de expansión de la shell:

1. Wildcard Expansion:
○ Se refiere a la coincidencia de patrones mediante caracteres comodín (*, ?,
[]).
○ Ejemplo: ls *.txt listaría todos los archivos con extensión ".txt" en el
directorio actual.
2. Tilde Expansion:
○ Sustituye ~ con la ruta del directorio del usuario actual o de un usuario
específico.
○ Ejemplo: cd ~ cambiaría al directorio del usuario actual.
3. Variable Expansion:
○ Sustituye variables por su valor.
○ Ejemplo: echo $USER imprimiría el nombre del usuario actual.
4. Command Substitution:
○ Permite ejecutar un comando dentro de otro y sustituir el resultado en la línea
de comandos.
○ Ejemplo: echo "Fecha actual es $(date)" mostraría la fecha actual.
5. Brace Expansion:
○ Genera combinaciones a partir de patrones dentro de llaves {}.
○ Ejemplo: echo file{1,2,3}.txt mostraría "file1.txt file2.txt file3.txt".
6. Pathname Expansion:
○ Expande nombres de archivos coincidentes con un patrón.
○ Ejemplo: rm *.txt eliminaría todos los archivos con extensión ".txt".
7. Arithmetic Expansion:
○ Permite realizar operaciones aritméticas en la línea de comandos.
○ Ejemplo: echo $((2 + 2)) imprimiría "4".

3.6 Command Substitution


La "Command Substitution" (Substitución de Comando) en Linux se refiere a la capacidad
de ejecutar un comando dentro de otro y utilizar el resultado de ese comando en la línea de
comandos. En la mayoría de las shells de Unix/Linux, la sintaxis común para la substitución
de comandos es utilizar $(comando).
3.7 Comillas en la Shell de Linux
Las comillas dobles (" ") en la shell de Linux tienen varios propósitos y afectan la forma en
que se interpretan los caracteres dentro de ellas. Aquí hay algunas de las funciones
principales de las comillas dobles:

● Preservación de Espacios y Caracteres Especiales:


○ Las comillas dobles preservan los espacios en blanco y evitan que los
caracteres especiales (como $, *, \, etc.) sean interpretados por la shell.
○ Ejemplo: echo "Hola Mundo" imprimirá "Hola Mundo" con los espacios
múltiples preservados.
● Substitución de Variables:
○ Permite la substitución de variables dentro de la cadena.
○ Ejemplo: nombre="Alice"; echo "Hola, $nombre" imprimirá "Hola,
Alice".
● Substitución de Comandos:
○ Permite la substitución de comandos dentro de la cadena utilizando
$(comando) o `comando`.
○ Ejemplo: fecha=$(date); echo "La fecha actual es: $fecha"
imprimirá la fecha actual.
● Preservación de Comillas Simples:
○ Permite la inclusión de comillas simples dentro de la cadena sin que la shell
las interprete como un límite de cadena.
○ Ejemplo: echo "Este es un ejemplo de comillas simples:
'Texto'" imprimirá "Este es un ejemplo de comillas simples: 'Texto'".
● Rutas de Archivos y Expansión de Wildcards:
○ En la mayoría de los casos, las comillas dobles evitan que la shell realice
expansión de wildcards (*, ?, [ ]) y permite rutas de archivos con espacios.
○ Ejemplo: cat "mi archivo con espacios.txt"
Por otra parte, tenemos el uso de las “ “ que nos permiten garantizar que se respete el
formato de lo que tengamos entre ellas Solo conservarán un funcionamiento propio $, \ y ``.

A diferencia de todo lo que nos permiten las “ “, las ‘ ‘ eliminan el funcionamiento de los
caracteres especiales $, \ y ``.
3.8 Escapando caracteres
El carácter \ permite hacer que ciertos caracteres pierdan su significado original o darle otro.

4. Redirecciones y pipelines
4.1 I/O Redirection
1. En el entorno de Linux y otros sistemas Unix, stdin, stdout y stderr son canales
estándar que permiten la entrada y salida de datos de los programas. Aquí tienes
una descripción de cada uno de ellos:
○ stdin (Standard Input):
■ Es el canal de entrada estándar. Por defecto, está conectado al
teclado.
■ En los programas de línea de comandos, stdin recibe la entrada
desde el teclado o desde la salida de otro comando cuando se utiliza
una tubería (|).

# Ejemplo: cat lee desde stdin

cat

○ En este caso, puedes escribir texto y presionar Enter. El programa cat lee
ese texto desde stdin.
2. stdout (Standard Output):
○ Es el canal de salida estándar. Por defecto, está conectado a la pantalla.
○ Los programas envían su salida normal a stdout.

# Ejemplo: echo imprime en stdout

echo "Hola, mundo"

○ En este caso, el texto "Hola, mundo" se imprime en la pantalla.

3. stderr (Standard Error):


○ Es el canal de salida de error estándar. También está conectado a la pantalla
por defecto.
○ Los programas envían mensajes de error y otros mensajes de diagnóstico a
stderr.

# Ejemplo: Comando no existente genera mensaje error en stderr

comando_inexistente

En este caso, se imprimirá un mensaje de error en la pantalla indicando que el comando no


fue encontrado.
Por lo tanto, en el entorno de Linux y otros sistemas Unix, stdin, stdout y stderr son
canales estándar que permiten la entrada y salida de datos de los programas pero existen
formas gracias a las cuales el usuario puede redirigir información a los canales stdin,
stdout y stderr. Para ello tenemos los conceptos de redirección que vamos a ver a
continuación.

4.2 Standard Output


La redirección de stdout en la línea de comandos de Linux se refiere a la capacidad de
redirigir la salida estándar de un programa hacia un archivo, dispositivo o incluso hacia la
entrada de otro programa. Esto es útil para guardar la salida de un comando en un archivo,
concatenarla con otra salida, o enviarla a través de una tubería a otro proceso. A
continuación se adjuntan diferentes ejemplos de redirección de stdout:

El primer caso es la redirección a stdout gracias a > a un fichero concreto:


4.3 Standard Error
El escenario potencialmente problemático surge en caso de que ocurra un error durante la
ejecución de un comando. En tal situación, el mensaje de error se mostrará en la pantalla
debido a que estos mensajes son dirigidos al canal stderr. A pesar de que, al final del
proceso, el resultado, como se mostraba anteriormente, se redirige al mismo archivo, es
importante notar que existe una distinción en los descriptores de fichero asociados. El
descriptor de fichero es como se indica, un identificador numérico:

● stdin (standard input) tiene asignado el descriptor de fichero 0.


● stdout (standard output) tiene asignado el descriptor de fichero 1.
● stderr (standard error) tiene asignado el descriptor de fichero 2.

La redirección de stderr en la línea de comandos de Linux se refiere a la capacidad de


dirigir la salida de error estándar de un programa hacia un archivo, dispositivo o incluso
hacia la entrada de otro programa. Esto es útil para capturar y gestionar mensajes de error y
otros mensajes de diagnóstico generados por comandos. Como no tenemos un operador
específico para ello tenemos que hacer uso del fd (es importante decir que la siguiente
técnica también se puede usar para stdout).
También se pueden asociar las dos situaciones como en el siguiente caso. Al final lo que
estamos haciendo con 2>&1 es redirigir el stderr a stdout y luego redirigimos la salida
de ls a salida.txt.

Actualmente hay formas más sencillas de hacer lo mismo como la siguiente.


4.4 /dev/null
/dev/null es un fichero especial en sistemas Unix que se utiliza para descartar datos. Es
un archivo de dispositivo especial que se comporta como una "fosa sin fondo" a la cual
puedes redirigir datos para que simplemente desaparezcan. En el contexto de stderr,
/dev/null es comúnmente utilizado para descartar mensajes de error.

4.5 Standard Input


Standard Input (stdin) se refiere al flujo de datos que proviene del teclado o de otro
proceso y que es proporcionado como entrada a un programa en un sistema Unix. Es el
mecanismo a través del cual un programa puede recibir datos desde una fuente externa,
generalmente a través del teclado o mediante la redirección desde otro proceso o un
archivo.

4.6 Pipelines
En el contexto de Linux y otros sistemas Unix, un pipeline es una forma de conectar la
salida de un comando con la entrada de otro, permitiendo así la ejecución de una secuencia
de comandos de manera eficiente. Los pipelines son fundamentales para la filosofía de
diseño de Unix, que fomenta la creación de pequeños programas que hacen una cosa bien
y la posibilidad de combinar estos programas para realizar tareas más complejas. La
notación para un pipeline en la línea de comandos es el símbolo de barra vertical (|), no
podemos hacer uso de > para enviar la salida de un comando como stdin de un comando
ya que crearemos un fichero con el nombre del comando.
4.7 Filtros y búsquedas
1. grep: Descripción: grep (Global Regular Expression Print) es una herramienta de
búsqueda que busca patrones de texto en archivos o en la salida de otros
comandos.
○ Uso Básico: grep "patrón" archivo Ejemplo: grep "error"
archivo.txt
2. sort: Descripción: sort ordena líneas de texto en orden alfabético o numérico.
○ Uso Básico: sort archivo Ejemplo: sort lista.txt
3. head: Descripción: head muestra las primeras líneas de un archivo o la salida de
un comando.
○ Uso Básico: head -n N archivo Ejemplo: head -n 10 archivo.txt
4. tail: Descripción: tail muestra las últimas líneas de un archivo o la salida de un
comando.
○ Uso Básico: tail -n N archivo Ejemplo: tail -n 20 archivo.txt
5. uniq: Descripción: uniq elimina líneas duplicadas consecutivas en un archivo o la
salida de un comando.
○ Uso Básico: uniq archivo Ejemplo: uniq lista.txt
Existe otro comando de mucho interés. Supongamos que en el comando anterior, el cual es
bastante largo, nos estuviera devolviendo algún tipo de error.

Si quisieramos ver la salida de alguno de los comandos en la mitad de la ejecución de los


pipelines podríamos hacer uso de tee para almacenar la entrada de datos que le lleguen al
comando y redirigirlos como salida al siguiente comando. Un ejemplo sería lo siguiente:

tee: Descripción: Utilizado para leer desde la entrada estándar y escribir simultáneamente
en la salida estándar y uno o más archivos.

● Uso Básico: comando | tee [opciones] archivo1 [archivo2 ...]


● Ejemplo: ls | tee salida.txt

Este comando lista el contenido del directorio actual y escribe esa lista tanto en la salida
estándar como en el archivo salida.txt.

También existen más comandos de interés como es el caso de set:

set: Descripción: El comando set en sistemas Unix/Linux es utilizado para modificar la


configuración del intérprete de comandos (shell) y ajustar diversas opciones de
funcionamiento.

● Uso Básico: set [opción]


● Ejemplo: set -o vi

Es importante decir que puede combinarse con los comandos vistos en este tema utilizando
pipelines para realizar otras muchas tareas. Algunos casos de uso de este comando pueden
ser los siguientes.

1. Reemplazar o sustituir una cadena de texto en un fichero


2. Reemplazar una cadena de texto en una línea determinada de un fichero
3. Añadir un carácter al comienzo de cada línea de un fichero
5. Permisos y usuario

5.1 Permisos y usuarios


En sistemas Linux, los conceptos de permisos y usuarios son fundamentales para la
seguridad y la gestión de recursos del sistema. Aquí tienes una descripción de ambos:

Permisos en Linux:

En Linux, los permisos controlan el acceso a archivos y directorios. Cada archivo y


directorio tiene asociados tres conjuntos de permisos, que determinan qué puede hacer el
propietario del archivo, el grupo al que pertenece el archivo y otros usuarios del sistema.

1. Propietario (owner): El usuario que creó el archivo o directorio. Tiene control total
sobre el objeto y puede cambiar sus permisos.
2. Grupo: Un conjunto de usuarios que comparten ciertos permisos sobre el archivo o
directorio. Puedes asignar un grupo a un archivo o directorio y especificar permisos.
3. Otros (others): Todos los demás usuarios del sistema que no son ni el propietario ni
miembros del grupo asociado al archivo o directorio.

Los permisos se dividen en tres tipos:

● Lectura (r): Permite ver el contenido del archivo o directorio.


● Escritura (w): Permite modificar el contenido del archivo o directorio.
● Ejecución (x): Para archivos, permite ejecutar el archivo como un programa. Para
directorios, permite acceder y listar el contenido.
Los comandos principales para trabajar con permisos son chmod (para cambiar permisos) y
ls (para mostrar los permisos de archivos y directorios).

Usuarios en Linux:

Linux es un sistema multiusuario, lo que significa que varios usuarios pueden interactuar
con el sistema al mismo tiempo. Cada usuario tiene un nombre único (nombre de usuario) y
un identificador único (UID). Además, los usuarios pueden pertenecer a uno o varios
grupos.

1. Superusuario (root): Es el usuario con el UID 0 y tiene privilegios administrativos


completos en el sistema. Puede realizar cualquier acción y modificar cualquier
archivo.
2. Usuarios normales: Son los usuarios regulares del sistema. Tienen sus propios
directorios de inicio y permisos limitados en comparación con el superusuario.

Los comandos principales relacionados con usuarios son useradd (para agregar usuarios),
passwd (para establecer o cambiar la contraseña de un usuario) y usermod (para modificar
la configuración del usuario).

● A modo de resumen podríamos decir que Linux es un sistema multitarea y


multiusuario.
● Los usuarios van a tener una serie de permisos para acceder a ficheros y directorios.
● Existe una estructura llamada grupos, los usuarios pueden pertenecer a grupos y en
el momento de permanecer a un grupo heredan los permisos del grupo.

El comando id en Linux se utiliza para mostrar información sobre el usuario y el grupo del
proceso actual, o sobre un usuario y grupo específico si se proporciona un nombre como
argumento. La salida del comando id incluye el identificador de usuario (UID), el
identificador de grupo (GID) y la lista de grupos secundarios a los que pertenece el usuario.
Aquí está el formato básico del comando id [nombre_de_usuario] .Si no se
proporciona un nombre de usuario, el comando id mostrará información sobre el usuario y
grupo del proceso actual. Si se proporciona un nombre de usuario como argumento,
mostrará información sobre ese usuario en particular.

Ejemplo de salida del comando id:

uid=1000(si) gid=1000(john)
groups=1000(si),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),116(lxd)
Explicación de la salida:

● uid: Identificador de usuario. En este ejemplo, el UID es 1000.


● gid: Identificador de grupo principal. Aquí, el GID principal es 1000.
● groups: Lista de grupos a los que pertenece el usuario. En este caso, el usuario "si"
pertenece a varios grupos, como "si," "sudo," "cdrom," entre otros.

Fichero /etc/passwd

El fichero /etc/passwd tiene típicamente los permisos -rw-r--r-- (644) y pertenece al usuario
root grupo root. Contiene es información pública sobre los usuarios del sistema (nombre, id
de usuario, grupo principal, directorio home, algun dato de contacto y shell).

1. El nombre del usuario.


2. Usado antiguamente para colocar la clave. En la actualidad no se coloca la clave en
este campo (se pone siempre una x) y la clave se coloca en /etc/shadow. Nótese
que este fichero puede ser leído por cualquier usuario.
3. Identificador que se ha asignado al usuario (UID). Los usuarios particulares que se
creen suelen tener un identificador igual o superior a 1000. El usuario root tiene
identificador 0.
4. Código del grupo principal del usuario (GID). Típicamente las herramientas de
administración, al crear un usuario, crean a la par un grupo con el mismo nombre de
usuario y asignan este nuevo grupo como grupo primordial del usuario. El usuario
root pertenece al grupo root que tiene un GID 0.
5. Información adicional del usuario. Típicamente se almacena el teléfono o despacho
del usuario. La información almacenada en este campo se separa por comas (,).
6. Directorio HOME del usuario. Típicamente suele ser un /home/xx donde xx es el
nombre del usuario. El HOME del usuario root es /root.
7. Shell del usuario. Este campo indica el shell por defecto del usuario. Así cuando el
usuario se conecte mediante ssh, telnet o consola, se ejecutará este shell para el
usuario. Típicamente es /bin/bash pero puede ponerse cualquier comando que se
desee (incluyendo programas propios) o incluso /bin/false si no se quiere que el
usuario pueda ejecutar comandos en una consola pero sí establecer hacer otro tipo
de acciones como copiar ficheros con scp ó ftp.

El siguiente ejemplo muestra la entrada concreta del fichero /etc/passwd. El usuario es


moncho (UID 501), pertenece al grupo 501 (principal), se han anotado adicionalmente su
nombre, despacho y teléfono, el directorio HOME es /home/moncho y el shell asociado.

# grep moncho /etc/passwd

moncho:x:501:501:Jose Ramon Mendez,408,988387015,:/home/moncho:/bin/bash


Fichero /etc/shadow

El fichero /etc/shadow tiene típicamente los permisos -rw-r----- (640) y pertenece al usuario
root y grupo shadow. Este fichero define información complementaria y que debe tener
privacidad de los usuarios del sistema. Complementa, por tanto, la información de los
usuarios que se consigna en /etc/passwd. El formato del fichero se presenta en la siguiente
figura:

1. Como se puede deducir, el primer campo de /etc/shadow es el nombre del usuario.


2. El segundo campo es la contraseña encriptada. El formato de este campo ha
evolucionado significativamente. Al principio simplemente se colocaba una
contraseña encriptada. Sin embargo, en la actualidad, se usa un formato compuesto
“$id$salt$password” donde id es el código del algoritmo empleado, salt es una
semilla que se incorpora para permitir que una misma clave se codifique de varias
formas y password es la clave encriptada según el algoritmo id y la semilla salt.

El algoritmo MD5 ($1) ha sido usado tradicionalmente en la primera década del siglo
XXI, aunque en la actualidad se ha popularizado el uso de sha-512 ($6). Para
cambiar los métodos de codificación de las claves se modificarán los ficheros
/etc/pam.d/common-password y /etc/login.defs.

3. El tercer campo contiene un timestamp de la última vez que se cambió la clave. Este
timestamp se representa mediante el número de días que han pasado desde el 1 de
enero de 1970.
4. El cuarto campo indica cuál es el número mínimo de días que hay que esperar para
cambiar una clave.
5. El quinto campo indica cuál es el número máximo de días de validez de la
contraseña actual.
6. El sexto campo indica el número de días antes de la caducidad de la contraseña a
partir de los cuales se le avisará al usuario que cambie la contraseña.
7. Los dos últimos campos (séptimo y octavo) suelen estar vacíos. El séptimo, indica el
número de días que pasarán entre la expiración de la clave y la deshabilitación
automática de la cuenta.
8. Por último el octavo campo indica cuando la cuenta se deshabilitará totalmente
(número de días desde 1970) de forma automática. Este último campo permite
definir cuentas por un tiempo limitado.

Fichero /etc/group

El fichero /etc/group tiene típicamente los permisos rw-r--r-- (644) y pertenece al usuario
root y grupo root. Define los grupos que hay en el sistema y contiene información pública
sobre ellos como el identificador o la lista de usuarios pertenecen de forma secundaria o
complementaria a cada grupo. El formato del fichero tiene la siguiente estructura:

1. Nombre del grupo.


2. Clave del grupo que es un campo que no se emplea (en el caso de emplearse se
guardaría en el fichero /etc/gshadow) y que, por lo tanto siempre contiene “x” ó “!”.
Parece raro pensar en asignar una clave a un grupo, sin embargo, se puede usar
para implementar grupos privilegiados de forma que un usuario que no pertenezca a
un grupo pueda pertenecer si conoce la clave del grupo (subapartado 2.1.4.1).
3. Identificador de grupo.
4. Lista de usuarios que pertenecen de forma secundaria o complementaria al grupo
separados por comas (,)

Fichero etc/gshadow

El fichero /etc/group tiene típicamente los permisos rw-r----- (640) y pertenece al usuario
root y grupo shadow. Define información privada de los grupos como por ejemplo la clave
que se le asigna para implementar grupos privilegiados. El formato del fichero tiene la
siguiente estructura:

Los campos que contiene son los siguientes:

1. Nombre del grupo.


2. Contraseña del grupo (en el caso de tratarse de grupos privilegiados). Los grupos no
privilegiados tienen un * con lo que ningún usuario se puede anexar a ese grupo.
3. Usuario administrador o administradores de grupos. Estos usuarios podrán
administrar la información del grupo con el comando gpasswd (opciones -A -a -d -r
-R).
4. Miembros normales del grupo que no se desea que se conozca su pertenencia al
grupo. Para hacer su pertenencia efectiva (entrar en el grupo) deberán usar el
comando newgrp <grupo>. La siguiente figura muestra un ejemplo de cómo emplear
el comando newgrp para pertenecer de forma efectiva al grupo (no va a pedir clave).
No obstante, las principales herramientas de administración incluyen este campo
igual al cuarto campo de /etc/group.
5.2 Lectura, escritura y ejecución
Cuando se realiza un listado largo de uno o más ficheros/carpetas, la primera columna
contiene información importante sobre los permisos y el tipo de recurso del que se trata.
Así, la primera columna se compone de 10 caracteres y cada uno de los cuales tiene un
significado especial.
El primero de los caracteres indica el tipo de recurso y puede tener uno de los siguientes
valores:
● “-” hace referencia a que el recurso es un fichero (ls -l /etc/shadow)
● “d” hace referencia a que el recurso es un directorio (ls -ld /etc)
● “l” hace referencia a que el recurso es un link simbólico (ls -l /bin/sh)
● “b” hace referencia a que el recurso es un dispositivo con tratamiento por bloques (ls
-l /dev/sda)
● “c” hace referencia a que el recurso es un dispositivo con tratamiento por caracteres
(ls -l /dev/ttyS0)
El resto de los caracteres (9) representan los permisos del elemento. Los permisos se
aplican en 3 colectivos: (i) usuario propietario de un fichero o directorio (los 3 primeros
caracteres), (ii) los usuarios que pertenezcan al grupo propietario del fichero (los 3
caracteres intermedios) y (iii) los demás usuarios (los últimos 3 caracteres). Para cada
colectivo, el primer carácter puede ser una “r” (si tiene permiso de lectura) o un “-” si no lo
tiene. El segundo carácter de cada grupo puede ser “w” ó “-” en función de si tiene permiso
de escritura o no. Finalmente, el tercer carácter puede ser “x” ó “-” en función de si se puede
ejecutar o no el fichero. El permiso 3 (-wx) no tiene mucho sentido en la práctica pero es
posible.

En el caso de directorios, “r” significa poder ver el contenido del directorio (listado de
ficheros y directorios. Por otro lado, “w” significa poder añadir, borrar o renombrar ficheros
en el directorio. Finalmente, “x” significa poder acceder al directorio (cd) y hacer cualquier
operación con el directorio. En la práctica, la existencia del permiso “r” o “w” en un
directorio, implica la necesidad del permiso “x”. Por lo tanto, los permisos de un directorio
deberían estar formados por 0, 5 ó 7 (4 y 6 no son técnicamente útiles).

En el ejemplo siguiente, /etc/shadow es un fichero que pertenece al usuario root y grupo


shadow. El usuario root puede leer y modificar el fichero. Los usuarios del grupo shadow
pueden únicamente leer el fichero. Finalmente los demás usuarios no pueden hacer nada.

$ ls -l /etc/shadow

-rw-r----- 1 root shadow 1681 jul 3 2013 /etc/shadow


Típicamente, los permisos de los ficheros se representan con 3 números cada uno de los
cuales representa al usuario propietario, grupo propietario y demás usuarios
respectivamente. Cada uno de estos números se calcula sumando los valores de permisos
para cada colectivo y teniendo en cuenta que “r”=4, “w”=2, “x”=1 y “-”=0. Así el fichero
/etc/shadow tiene los permisos 640.

Para cambiar los permisos de un fichero se usa la herramienta chmod. chmod permite
emplear la representación de carácter de los permisos así como el formato numérico como
argumento. No obstante es típico el empleo del formato numérico. A continuación se
muestran algunos ejemplos de uso que muestran el abanico de posibilidades de uso de esta
herramienta:

En muchas ocasiones puede resultar confusa la asignación de permisos a directorios. A


continuación, se adjunta un resumen.

Permisos en directorios:

● El permiso de ejecución en los directorios permite acceder a los archivos dentro del
directorio.
● El permiso de lectura permite enumerar las entradas del directorio.
● El permiso de escritura permite crear y eliminar entradas en el directorio.

Tener permiso de lectura o escritura en un directorio sin permiso de ejecución no es útil.


Tener permiso de ejecución pero no de lectura es ocasionalmente útil: permite acceder a los
archivos sólo si se conoce su nombre exacto, un mecanismo muy rudimentario de
protección.

En la práctica los permisos útiles sobre un directorio son:

● ---: sin acceso


● --x: puede acceder a los archivos cuyo nombre se conoce
● r-x: acceso normal de sólo lectura
● rwx: acceso normal de lectura y escritura

5.3 Usuario root


En sistemas basados en Unix y Linux, el usuario "root" es el superusuario o administrador
del sistema. El usuario root tiene privilegios completos y puede realizar cualquier acción en
el sistema, incluyendo la modificación de configuraciones críticas, instalación y
desinstalación de software, y acceso a todos los archivos del sistema. Aquí hay algunos
aspectos clave sobre el usuario root en Linux:
1. Privilegios completos: El usuario root no tiene restricciones en términos de
permisos. Puede ejecutar cualquier comando, acceder a cualquier archivo y
modificar cualquier configuración en el sistema. Esto significa que el usuario root
tiene un control total sobre el sistema operativo.
2. UID 0: En sistemas Linux, el identificador de usuario (UID) 0 está reservado para el
usuario root. El UID 0 es único y específico del superusuario.
3. Acceso a carpetas del sistema: El usuario root tiene acceso total a todas las
carpetas y archivos del sistema, incluyendo aquellos que están fuera del alcance de
los usuarios regulares.
4. Seguridad: Dado que el usuario root tiene tanto poder, se debe usar con
precaución. Acceder al sistema como root puede tener consecuencias graves si se
realizan acciones inadvertidas o malintencionadas. Se recomienda utilizar el usuario
root solo cuando sea necesario y cambiar a usuarios regulares para tareas
cotidianas.
5. Uso de comandos privilegiados: Para realizar tareas con privilegios de root, se
utiliza el comando sudo (superuser do). Los usuarios que tienen permisos para
ejecutar comandos con sudo pueden realizar operaciones específicas con
privilegios de root sin necesidad de cambiar completamente al usuario root.
6. Inicio de sesión directa: En algunos sistemas, el usuario root puede iniciar sesión
directamente, pero en muchos casos se deshabilita esta opción por razones de
seguridad. En su lugar, se utiliza sudo para realizar tareas con privilegios de root.
5.4 Modificación de permisos en octal
En Linux, los permisos de un archivo o directorio se pueden modificar utilizando el comando
chmod. Una de las formas más comunes de especificar los permisos en chmod es utilizando
la notación octal.

La notación octal representa los permisos utilizando números en base octal (base 8). Cada
permiso se representa mediante un número de 3 dígitos, donde cada dígito representa los
permisos para el propietario, el grupo y otros usuarios, respectivamente.

● El primer dígito representa los permisos del propietario.


● El segundo dígito representa los permisos del grupo.
● El tercer dígito representa los permisos para otros usuarios.

Cada dígito se puede calcular sumando los valores asociados a los permisos. Por ejemplo:

● Lectura (r) tiene un valor de 4.


● Escritura (w) tiene un valor de 2.
● Ejecución (x) tiene un valor de 1.
Entonces, si queremos dar permisos de lectura, escritura y ejecución al propietario, pero
solo permisos de lectura al grupo y a otros usuarios, usamos el valor octal 7 para el
propietario (4 + 2 + 1), y 4 para el grupo y otros (solo lectura).

Ejemplo de comando chmod con notación octal:

chmod 744 archivo

Esto establecerá los permisos del archivo de la siguiente manera:

● Propietario: lectura (4) + escritura (2) + ejecución (1) = 7


● Grupo: lectura (4)
● Otros: lectura (4)

Se puede ajustar los números en el comando chmod según tus necesidades. Es importante
entender la relación entre los valores octales y los permisos que representan para utilizar
correctamente esta notación.

5.5 Modificación de permisos simbólica


En Linux, la modificación de permisos de archivos y directorios se puede realizar mediante
el comando chmod. La notación simbólica es una de las formas de utilizar chmod. Esta
notación utiliza letras y símbolos para representar los cambios en los permisos. La
estructura básica de la notación simbólica es la siguiente:

chmod [who] [operator] [permission] file

● who: Representa a quién se le aplicarán los cambios de permisos. Puede ser uno o
más de los siguientes:
○ u: Usuario (propietario)
○ g: Grupo
○ o: Otros (resto)
○ a: Todos (equivalente a ugo)
● operator: Indica qué acción se realizará con los permisos. Puede ser uno de los
siguientes:
○ +: Agregar permisos
○ -: Quitar permisos
○ =: Establecer permisos exactos
● permission: Representa el permiso específico que se va a modificar. Puede ser
uno o más de los siguientes:
○ r: Lectura
○ w: Escritura
○ x: Ejecución
● file: Especifica el archivo o directorio al cual se le aplicarán los cambios.

5.6 Permisos por defecto


La máscara de creación de archivos, también conocida como "umask" (User Mask o
máscara de usuario), es un concepto importante en sistemas operativos basados en Unix,
como Linux. La umask se utiliza para determinar los permisos por defecto que se aplicarán
cuando se crea un nuevo archivo o directorio.

La umask se establece para el usuario y define qué permisos se deben "mascarar" o quitar
de los permisos predeterminados al crear nuevos archivos o directorios. En otras palabras,
la umask especifica qué permisos no se deben asignar a los nuevos elementos.

La umask se representa en notación octal y se aplica de la siguiente manera:

1. Se toma el permiso predeterminado para un nuevo archivo (por ejemplo, 666 para
archivos) o un nuevo directorio (por ejemplo, 777 para directorios).
2. Se resta la umask a estos permisos predeterminados.

El resultado final será el conjunto de permisos que realmente se asignarán al nuevo archivo
o directorio.

Por ejemplo, si la umask está configurada en 022:

● Para archivos: 666 (permisos predeterminados) - 022 (umask) = 644


● Para directorios: 777 (permisos predeterminados) - 022 (umask) = 755
Esto significa que, cuando se crea un nuevo archivo, se le asignan permisos de lectura y
escritura al propietario y solo permisos de lectura a los demás. Para los directorios, se
asignan permisos de lectura, escritura y ejecución al propietario y solo permisos de lectura y
ejecución a los demás.

5.7 Setuid, Setgid, Sticky Bit


Setuid (Set User ID)

Es un mecanismo en sistemas Unix y Unix-like que permite que un programa sea ejecutado
con los privilegios del propietario del archivo, en lugar de los del usuario que lo ejecuta. Se
denota por la letra 's' en el lugar del bit de ejecución del propietario.

Este permiso es fundamental para que un usuario pueda hacer cosas tan simples como
cambiar su contraseña de acceso. Básicamente cambiar la contraseña de un usuario
distinto de root implica modificar el fichero /etc/shadow el cual tiene permisos rw-r----- y
pertenece al usuario root grupo shadow. Con esta configuración de permisos sólo el usuario
root puede realizar modificaciones sobre este fichero. Para realizar este cambio de
contraseña se usa la herramienta passwd la cual tiene unos permisos especiales (rwsr-xr-x):

El cambio está en que en los permisos del usuario propietario se ha sustituido una x por una
s. Y así es como se representa el permiso Set UID en los ficheros ejecutables el cual es un
acrónimo de “set user ID upon execution”. Un ejecutable con este permiso activado se
ejecuta como el usuario propietario (el usuario root en este caso) y no con los privilegios del
usuario actual.

Por último, en Linux cuando un fichero tiene permiso Set UID pero no tiene permiso de
ejecución, Linux marca esta circunstancia con una “S” (mayúscula).
Setgid (Set Group ID)

Similar al setuid, el setgid es un mecanismo que permite que un programa se ejecute con
los privilegios del grupo del archivo, en lugar de los del usuario que lo ejecuta. Se denota
por la letra 's' en el lugar del bit de ejecución del grupo. El permiso Set GID, de forma
paralela a Set UID, hace que el grupo de ejecución de un fichero sea el grupo propietario
del fichero y no el grupo principal al que pertenece el usuario que lo ejecuta. El ejemplo más
conocido de este tipo de permisos está relacionado también con el fichero /etc/shadow y
con /sbin/unix_chkpwd que es un programa que participa en la autentificación de los
usuarios junto con PAM.

Como se puede ver en el ejemplo, el fichero /etc/shadow tiene permiso de lectura para el
grupo propietario (shadow) de la misma forma que /sbin/unix_chkpwd es un ejecutable cuyo
grupo propietario es shadow. Si se ejecuta este programa con el grupo shadow, se
obtendrán permisos de acceso de sólo lectura a /etc/shadow y, de esta forma, será posible
comprobar la contraseña.

Para asignar permisos de Set GID habrá que anteponer un 2 al permiso en formato
numérico (2755) ó usar g+s. Por otra banda, es posible activar Set UID y Set GID a la vez
empleando chmod con las especificaciones de permisos 6755 ó u+s g+s.

Sticky Bit

El bit sticky es un permiso especial aplicado a directorios en sistemas Unix. Cuando se


establece en un directorio, solo el propietario del archivo o superusuario puede eliminar o
renombrar sus archivos, aunque otros tengan permisos de escritura en el directorio. Se
denota por la letra 't' en el lugar del bit de ejecución del otros.

Este permiso permite proteger ficheros dentro de un directorio. Concretamente evita que un
usuario pueda borrar ficheros de otros usuarios que se sitúan en una carpeta pública como
el directorio /tmp.
Por otro lado, indicar que con la T (mayúscula) indica que no existe el permiso de ejecución
para el colectivo otros usuarios que en carpetas significa poder acceder a la carpeta

5.8 Cambio de identidad


El comando su en Linux se utiliza para cambiar de identidad de usuario en una sesión de
terminal. El nombre "su" proviene de "Switch User" (cambiar de usuario). Permite a un
usuario iniciar una nueva shell o sesión de terminal con los privilegios de otro usuario,
generalmente el superusuario o root. El uso básico del comando su es el siguiente:

su [opciones] [usuario]

● [opciones]: Puedes incluir opciones adicionales según sea necesario.


● [usuario]: Especifica el nombre del usuario al que deseas cambiar. Si no se
proporciona, por defecto intentará cambiar al superusuario (root).

Por ejemplo, para cambiar al usuario "john", puedes escribir: su john. Luego, se te pedirá
que ingreses la contraseña del usuario "john" para autenticarte. Si deseas cambiar a la
cuenta de superusuario (root), simplemente puedes escribir: su. Luego, se te pedirá la
contraseña de root.

Es importante tener precaución al utilizar el comando su, especialmente al cambiar a la


cuenta de superusuario, ya que tienes acceso a todos los recursos del sistema y puedes
realizar cambios críticos. Preferiblemente, se recomienda utilizar comandos con privilegios
elevados, como sudo, que ofrece una capa adicional de seguridad al requerir la contraseña
del usuario actual en lugar de la del superusuario.

Para ver todo esto vamos a crear un usuario de prueba usuario: testuser contraseña:1234
Una vez añadido este usuario, como podemos comprobar, se ha creado una nueva linea en
el fichero /etc/passwd para el nuevo usuario.

Una vez que existe este usuario podemos cambiar de usuario con el comando su e
introduciendo la contraseña de testuser tendremos a nuestra disposición una nueva shell
donde somos ese usuario. Esto podemos comprobarlos con el comando id.

Nota: Cuando este nuevo usuario no sea de interés, podemos eliminarlo del sistema con el
comando: sudo deluser usuario_erroneo.

Podemos hacer uso de su o de su -l.


1. La diferencia entre su y su -l (o simplemente su -) radica en cómo manejan el
entorno del usuario al cambiar la identidad.
○ su (sin argumentos):
■ Cambia el usuario sin cambiar su entorno de shell.
■ Mantiene las variables de entorno del usuario original, como el
directorio de trabajo y las variables de entorno del shell.
○ Ejemplo: su otro_usuario
2. Cambiará al usuario "otro_usuario" sin cambiar el entorno del shell actual.
3. su -l (o su -):
○ Cambia al usuario y simula una sesión de inicio de sesión, lo que significa
que carga las variables de entorno como si el usuario se estuviera
conectando por primera vez.
○ Establece el directorio de trabajo en el directorio de inicio del usuario.
○ Restaura el PATH del usuario al valor predeterminado del sistema.
4. Ejemplo: su - otro_usuario

Cambiará al usuario "otro_usuario" y simulará una sesión de inicio de sesión, cargando su


entorno de shell por completo.

Llegados a este punto puede que alguien quisiera realizar su root para tener una sesión
de root. El problema es que hasta este punto no sabemos todavía la contraseña de root y
en la actualidad la contraseña de la cuenta root va a estar bloqueada por defecto. Para
ejecutar comandos simulando que somos root se hace uso del comando sudo.
5.9 Sudo
sudo, que significa "Superuser Do", es un comando en sistemas operativos basados en
Unix (como Linux) que permite a un usuario ejecutar programas con los privilegios de
seguridad de otro usuario, generalmente el superusuario (root). Esto proporciona una forma
segura de realizar tareas administrativas sin necesidad de iniciar sesión directamente como
root. A continuación, se muestran algunos aspectos clave sobre sudo:

1. Ejecución de Comandos con Privilegios:


○ Los usuarios que tienen permisos para utilizar sudo pueden ejecutar
comandos con privilegios elevados.
○ Por ejemplo, en lugar de iniciar sesión como root, puedes usar sudo para
ejecutar un comando específico con privilegios elevados, como instalar
software, reiniciar el sistema, modificar archivos del sistema, etc.
2. Configuración:
○ La configuración de sudo se encuentra en el archivo /etc/sudoers. El
comando sudo verifica este archivo para determinar quién tiene permisos y
qué comandos específicos pueden ejecutarse.
○ La configuración suele permitir a usuarios específicos o a grupos de usuarios
ejecutar comandos específicos con privilegios de superusuario.
3. Sintaxis: La sintaxis básica de sudo es: sudo comando

5.10 Sudoers
El archivo /etc/sudoers es un archivo de configuración en sistemas basados en Unix,
como Linux, que especifica qué usuarios y grupos de usuarios tienen permiso para ejecutar
comandos con privilegios de superusuario a través del comando sudo. El archivo sudoers
es esencial para la seguridad y administración de sistemas, ya que determina quién puede
realizar tareas administrativas y qué comandos específicos pueden ejecutar.
En la imagen anterior podemos ver algunas configuraciones interesantes de sudoers:

1. Defaults env_reset:
○ Esta línea indica que las variables de entorno del usuario original se
restablecerán al entorno seguro al ejecutar comandos con sudo. Esto ayuda
a evitar que un usuario malintencionado configure variables de entorno que
puedan afectar la ejecución de comandos con privilegios elevados.
2. Defaults mail_badpass:
○ Esta línea especifica que se envíe un correo electrónico al usuario root
cuando alguien intente ejecutar un comando con sudo y falle al ingresar la
contraseña correctamente. Esto puede ser útil para la administración de
sistemas y la detección de intentos de uso no autorizado.
3. Defaults
secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
:/sbin:/bin:/snap/bin":
○ Define la variable de entorno secure_path que establece las rutas seguras
para la ejecución de comandos con sudo. Limita las rutas donde se buscarán
los comandos ejecutados con sudo, reduciendo el riesgo de ejecutar binarios
maliciosos desde rutas no seguras.
4. Defaults use_pty:
○ Habilita la asignación de un pseudoterminal (PTY) cuando se ejecutan
comandos con sudo. Un PTY es un emulador de terminal y su uso puede ser
necesario para algunas aplicaciones y scripts que esperan un entorno de
terminal interactivo.

También dentro del fichero sudoers tenemos otras reglas de interés:

1. root ALL=(ALL:ALL) ALL:


○ Esta línea otorga a root todos los privilegios para ejecutar cualquier comando
(ALL:ALL) en cualquier host (ALL). Básicamente, significa que root puede
ejecutar cualquier comando con cualquier identidad de usuario en cualquier
host.
2. %admin ALL=(ALL) ALL:
○ Esta línea indica que los miembros del grupo "admin" pueden ganar
privilegios de root. %admin se refiere a todos los usuarios del grupo "admin".
La sintaxis (ALL) ALL permite ejecutar comandos en cualquier host.
3. %sudo ALL=(ALL:ALL) ALL:
○ Esta línea otorga a los miembros del grupo "sudo" (u otro grupo especificado)
todos los privilegios para ejecutar cualquier comando en cualquier host. Al
igual que en el caso anterior, (ALL:ALL) significa cualquier identidad de
usuario y cualquier grupo.

Es importante mencionar que la edición de este archivo sudoers no se recomienda


realizar con cualquier editor y se recomienda el uso del comando: visudo. Además, si
queremos añadir nuevas reglas es recomendable crear nuevas para ello en lugar de
modificar directamente sudoers.

La regla tres como nos indica dice que cualquier usuario que pertenezca al grupo sudo
puede ejecutar cualquier comando. Si ejecutamos el comando id vemos el usuario sí que
pertenecemos a este grupo, a diferencia de test_user que no pertenece y por lo tanto no
podrá hacer uso de sudo.

Tenemos que crear una nueva norma para permitirle a test_user ver el archivo /etc/shadow.
Para ello creamos u nuevo archivo de configuración como se nos indica en la norma de
imagenes anteriores:
# See sudoers(5) for more information on "@include" directives:

@includedir /etc/sudoers.d

Una vez creado el archivo y añadida la norma procedemos a probar si podemos visualizar el
contenido del archivo /etc/shadow.
Como podemos ver en la imagen anterior, ahora ya podemos ver el contenido de test_user.
Aunque el resultado es correcto, es importante mencionar que se puede entender como una
mala práctica ya que es mucho más simple gestionar grupos de usuarios que usuarios.
Dicho de otro modo, lo suyo sería crear un nuevo grupo al que añadirle la nueva regla y
añadir el usuario test_user a ese grupo.

5.11 Gestión de usuarios y grupos


adduser:

○ adduser es un comando que facilita la creación de nuevos usuarios en el


sistema. Este comando interactúa con el usuario haciendo preguntas para
configurar opciones como la contraseña, la información del usuario y la
adición a grupos predeterminados.

adduser nombre_usuario
○ También puedes utilizar useradd, pero adduser es más amigable y
automatiza algunas configuraciones adicionales.
addgroup:

○ addgroup se utiliza para agregar nuevos grupos al sistema. Puedes


especificar un nombre de grupo como argumento.
addgroup nombre_grupo

usermod:

○ usermod se utiliza para modificar las propiedades de un usuario existente.


Puedes cambiar cosas como el nombre de usuario, el grupo principal, el
directorio de inicio, entre otras configuraciones.

usermod opciones nombre_usuario


○ Ejemplo: usermod -g nuevo_grupo nombre_usuario cambia el grupo
principal del usuario.
Si yo quiero añadir el newuser a newgroup2 como nuevo grupo secundario
tenemos que hacer uso de usermod. Como sabemos, la diferencia entre
grupo primario y secundario radica en que grupo tiene permisos cuando se
crea un nuevo directorio o fichero por parte del usuario.

También podemos cambiar el directorio primario, nombre de usuario, home, u


uid… entre muchos otros parámetros como se muestra a continuación:

Existe otro comando interesante como passwd para el cambio de la


contraseña de un usuario:

deluser:

○ deluser es un comando que facilita la eliminación de usuarios en el


sistema. Elimina al usuario y, opcionalmente, su directorio de inicio y correo.

deluser nombre_usuario
También puedes utilizar userdel, pero deluser es más amigable y realiza
algunas limpiezas adicionales, como la eliminación del correo del usuario.
5.12 Cambio de propietario
Los comandos chown y chgrp son utilizados en sistemas basados en Unix, como Linux,
para cambiar el propietario y el grupo de archivos y directorios. Aquí te doy una descripción
de cada uno:

chown - Cambiar propietario: El comando chown se utiliza para cambiar el propietario de


un archivo o directorio en Linux. Especificar un propietario y, opcionalmente, un nuevo
grupo.

chown nuevo_propietario[:nuevo_grupo] archivo_o_directorio


● Ejemplo: chown usuario:grupo archivo.txt cambia el propietario de
archivo.txt al usuario usuario y al grupo grupo.
● También puedes utilizar chown de manera recursiva con la opción -R para cambiar
propietario y grupo de forma recursiva en un directorio y su contenido:

chown -R nuevo_propietario[:nuevo_grupo] directorio


chgrp - Cambiar grupo: El comando chgrp se utiliza para cambiar solo el grupo de un
archivo o directorio en Linux.

chgrp nuevo_grupo archivo_o_directorio


● Ejemplo: chgrp nuevo_grupo archivo.txt cambia el grupo de archivo.txt
al grupo nuevo_grupo.
● También puedes utilizar chgrp de manera recursiva con la opción -R para cambiar
el grupo de forma recursiva en un directorio y su contenido:

chgrp -R nuevo_grupo directorio


6. Procesos

6.1 Procesos en Linux


Linux es un sistema operativo multitarea, lo que implica que podemos percibir la ejecución
simultánea de diversas tareas y la realización de múltiples operaciones al mismo tiempo.
Aunque varios programas pueden estar solicitando recursos como la CPU al mismo tiempo,
el kernel se encargará de asignar estos recursos de manera óptima. Este proceso ocurre de
manera tan eficiente que el usuario no puede detectar fácilmente la transición de recursos
entre procesos. Hemos estado hablando de dos conceptos, por una parte los procesos y por
otro los programas.

Un programa es un ejecutable, pieza de código fuente, binario, almacenado en disco y que


no tiene porque estar en ejecución.

Por otra parte tenemos los procesos, un proceso es una instancia activa en ejecución de
un programa. Los procesos son las estructuras que utiliza el kernel para gestionar la
asignación de recursos, organizar la actividad que están realizando, ficheros utilizados…

6.2 Visualización estática de procesos


El comando ps en Linux se utiliza para mostrar información sobre los procesos en ejecución
en el sistema. Proporciona una instantánea de los procesos que se están ejecutando en ese
momento cuando ejecutamos el comando, es decir, no es una salida en tiempo real. Aquí
hay algunas formas comunes de utilizar el comando ps:

● Listar procesos de un usuario específico: ps -u nombre_usuario

Esto mostrará los procesos en ejecución del usuario especificado.


● Listar todos los procesos del sistema: ps aux

Este comando muestra una lista detallada de todos los procesos en ejecución en el
sistema.

● Visualizar procesos de forma jerárquica: ps f

Muestra una vista jerárquica de los procesos, lo que facilita entender las relaciones
de parentesco entre ellos.

● Listar procesos de un terminal específico: ps T

Muestra los procesos que se ejecutan en un terminal específico.

● Mostrar información detallada sobre un proceso específico: ps -p


ID_del_proceso

Proporciona información detallada sobre un proceso específico identificado por su


ID.

● Listar procesos con formato personalizado: ps -eo pid,cmd,%cpu,%mem

Define un formato personalizado para la salida del comando, mostrando solo la


información que específicas.

Si nosotros ejecutamos en una terminal el comando: ps vamos a obtener únicamente los


dos procesos asociados a nuestra propia terminal, no del sistema.

1. Encabezado:
○ PID: Identificador del proceso (Process ID).
○ TTY: Terminal asociada al proceso.
○ TIME: Tiempo total de CPU utilizado por el proceso.
○ CMD: Comando o nombre del proceso.
2. Información de Procesos:
○ 3879: PID del proceso. En este caso, el proceso con ID 3732 es una
instancia de la shell Bash.
○ pts/0: Terminal asociada al proceso. En este caso, el proceso está asociado
al pseudo terminal (pts) 0.
○ 00:00:00: Tiempo total de CPU utilizado por el proceso.
○ bash: Nombre del comando o proceso. Indica que este proceso es una
instancia de la shell Bash.
3. Proceso del Comando ps:
○ 3886: PID del proceso. Este es el proceso del comando ps que estás
ejecutando.
○ pts/0: Terminal asociada al proceso. El proceso ps también está asociado
al pseudo terminal (pts) 1.
○ 00:00:00: Tiempo total de CPU utilizado por el proceso.
○ ps: Nombre del comando o proceso. Indica que este proceso es la ejecución
del comando ps.

Si queremos ver los procesos ejecutándose en el sistema tenemos el comando: ps -x.

La salida que proporciona el resultado del comando ps aux en una terminal de Linux
muestra información más detallada que los casos anteriores y es la opción que se suele
utilizar:

1. USER: root: El usuario que inició el proceso.


2. PID (Process ID): 1: El identificador único del proceso.
3. %CPU: 0.0: El porcentaje de tiempo de CPU utilizado por el proceso desde su
inicio.
4. %MEM: 0.2: El porcentaje de memoria RAM física utilizada por el proceso.
5. VSZ (Virtual Set Size): 166728: El tamaño virtual del proceso en kilobytes (KB).
Representa la cantidad total de memoria que el proceso puede utilizar, incluida la
memoria compartida y la memoria de intercambio.
6. RSS (Resident Set Size): 11808: El tamaño residente del proceso en kilobytes
(KB). Indica la cantidad de memoria física actualmente ocupada por el proceso.
7. TTY (Terminal): ?: Indica que el proceso no está asociado con una terminal
específica.
8. STAT (Estado del Proceso): Ss: El estado del proceso. En este caso, "Ss" indica
que es un proceso en ejecución en modo usuario y es el líder de la sesión.
9. START: 16:31: La hora de inicio del proceso.
10. TIME: 0:01: El tiempo total de CPU utilizado por el proceso desde su inicio.
11. COMMAND: /sbin/init splash: El comando o proceso que se está ejecutando.
En este caso, es el proceso init del sistema con el complemento "splash".

Estados (STAT) del proceso pueden variar, y algunos de los códigos más comunes son:

● R (Running): El proceso está en ejecución.


● S (Sleeping): El proceso está esperando una entrada/salida.
● D (Uninterruptible Sleep): El proceso está en un estado de espera que no se puede
interrumpir, generalmente esperando E/S.
● Z (Zombie): El proceso ha terminado, pero la información sobre su estado aún está
en la tabla de procesos.
● T (Stopped): El proceso está detenido o suspendido.

6.3 Visualización dinámica de procesos


El comando top en una terminal de Linux muestra la siguiente información en tiempo real
con un refresco de 3 segundos:

Encabezado:

top - 17:25:04 up 53 min, 1 user, load average: 0,10, 0,11, 0,09


○ 17:25:04: Hora actual.
○ up 53 min: Tiempo que ha estado el sistema encendido.
○ 1 user: Número de usuarios conectados actualmente.
○ load average: 0,10, 0,11, 0,09: Carga promedio del sistema en los
últimos 1, 5 y 15 minutos, respectivamente.
Tasks:

Tasks: 191 total, 1 running, 190 sleeping, 0 stopped, 0 zombie


○ 191 total: Total de procesos en el sistema.
○ 1 running: Número de procesos actualmente en ejecución.
○ 190 sleeping: Número de procesos en estado de suspensión.
○ 0 stopped: Número de procesos detenidos.
○ 0 zombie: Número de procesos zombie.

%Cpu(s):

%Cpu(s): 12,5 us, 15,6 sy, 0,0 ni, 71,9 id, 0,0 wa, 0,0 hi, 0,0
si, 0,0 st
○ 12,5 us: Porcentaje de tiempo de CPU utilizado por procesos de usuario.
○ 15,6 sy: Porcentaje de tiempo de CPU utilizado por procesos del sistema
(kernel).
○ 0,0 ni: Porcentaje de tiempo de CPU utilizado por procesos con prioridad
modificada (nice).
○ 71,9 id: Porcentaje de tiempo de CPU inactivo.
○ 0,0 wa: Porcentaje de tiempo de CPU esperando operaciones de
entrada/salida (I/O).
○ 0,0 hi: Porcentaje de tiempo de CPU utilizado para tareas de manejo de
interrupciones hardware.
○ 0,0 si: Porcentaje de tiempo de CPU utilizado para tareas de manejo de
interrupciones software.
○ 0,0 st: Porcentaje de tiempo de CPU robado en máquinas virtuales.

MiB Mem:

MiB Mem : 3907,6 total, 1523,2 free, 986,7 used, 1397,7


buff/cache
○ 3907,6 total: Memoria física total en megabytes.
○ 1523,2 free: Memoria física libre en megabytes.
○ 986,7 used: Memoria física utilizada en megabytes.
○ 1397,7 buff/cache: Suma de memoria utilizada como búfer y caché en
megabytes.

MiB Swap:

MiB Swap: 3898,0 total, 3898,0 free, 0,0 used. 2649,7


avail Mem
○ 3898,0 total: Espacio total de intercambio en megabytes.
○ 3898,0 free: Espacio de intercambio libre en megabytes.
○ 0,0 used: Espacio de intercambio utilizado en megabytes.
○ 2649,7 avail Mem: Memoria disponible para asignación, incluyendo la
memoria libre y el espacio de intercambio.

Proceso (PID 1667):

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+


COMMAND
1667 si 20 0 4666172 448428 151756 S 50,0 11,2 2:05.67
gnome-shell
○ PID 1667: Identificación única del proceso.
○ USER si: Usuario que inició el proceso.
○ PR 20: Prioridad del proceso.
○ NI 0: Prioridad del proceso (nice). En este caso, no hay ajuste de prioridad.
○ VIRT 4666172: Tamaño virtual del proceso.
○ RES 448428: Tamaño residente del proceso.
○ SHR 151756: Tamaño de memoria compartida utilizada por el proceso.
○ S S: Estado del proceso. En este caso, "S" indica que el proceso está en
ejecución en modo usuario.
○ %CPU 50,0: Porcentaje de tiempo de CPU utilizado por el proceso.
○ %MEM 11,2: Porcentaje de memoria física utilizada por el proceso.
○ TIME+ 2:05.67: Tiempo total de CPU utilizado por el proceso desde su
inicio.
○ COMMAND gnome-shell: Nombre del comando o proceso en ejecución.

6.4 Interrupción procesos


La interrupción de procesos y la ejecución en segundo plano son conceptos relacionados
con la gestión de procesos en sistemas operativos tipo Unix, como Linux. Aquí se aporta
una explicación de ambos conceptos:

1. Interrupción de procesos:
○ La interrupción de procesos se refiere a la capacidad de detener la ejecución
de un programa o proceso en un sistema operativo.
○ En un terminal de Linux, puedes interrumpir un proceso que está en
ejecución presionando Ctrl + C. Esto enviará una señal de interrupción
(SIGINT) al proceso actual, lo que generalmente provoca su terminación.
○ La interrupción de procesos es útil cuando deseas detener la ejecución de un
programa de manera controlada, por ejemplo, durante la ejecución de un
script o un comando en un terminal.
2. Ejecución en segundo plano:
○ La ejecución en segundo plano se refiere a la capacidad de ejecutar un
programa o comando sin bloquear el terminal, permitiendo que el usuario
continúe utilizando el terminal para otras tareas.
○ Para ejecutar un programa en segundo plano, puedes agregar el carácter &
al final del comando. Por ejemplo, comando &.
○ Los procesos en segundo plano continúan ejecutándose en segundo plano
incluso después de cerrar el terminal. Puedes ver una lista de procesos en
segundo plano usando el comando jobs.
○ Para enviar un proceso en ejecución al segundo plano, puedes suspenderlo
(Ctrl + Z) y luego usar el comando bg para reanudarlo en segundo plano.

Ejemplo de ejecución en segundo plano:

● $ comando_en_segundo_plano &

Ejemplo de interrupción de procesos:

● $ proceso_en_ejecucion
● (presionar Ctrl + C para interrumpir el proceso)

6.5 Señales
En sistemas operativos tipo Unix/Linux, las señales son mecanismos de comunicación entre
procesos y entre el kernel y los procesos. Las señales son eventos asíncronos que informan
a un proceso de eventos específicos, como una solicitud de terminación o la recepción de
datos en un socket.

Envío de Señales:

Puedes enviar señales a procesos utilizando el comando kill o el comando killall.

La señal más común es SIGTERM (15), que solicita al proceso que se termine de manera
ordenada. SIGKILL (9) es otra señal común que fuerza la terminación inmediata del
proceso. Ejemplo de envío de señal a un proceso con PID 1234: $ kill -SIGTERM 1234

Señales Comunes:

● SIGHUP (1): Hangup.


● SIGINT (2): Interrupción desde el teclado (Ctrl + C).
● SIGQUIT (3): Terminación desde el teclado (Ctrl + ).
● SIGKILL (9): Terminación forzada.
● SIGTERM (15): Terminación suave.
● Entre muchas otras que podemos ver con kill -l.

Señales del Sistema:

Además de las señales enviadas manualmente, el kernel también puede enviar señales a
los procesos para notificar eventos del sistema, como la terminación de hijos o errores de
división por cero.

Visualización de Señales:

Puedes ver las señales que un proceso puede recibir utilizando el comando kill -l:
$ kill -l

Manejo de Señales en Shell:

En la shell, puedes enviar señales a procesos en segundo plano utilizando comandos como
Ctrl + C para SIGINT y Ctrl + Z para SIGTSTP (detener).

Ejemplo de uso:

Anteriormente hemos empleado señales al programa en primer plano, cuando ejecutamos


Ctrl + C lanzábamos una señal llamada SIGINT y con Ctrl + Z mandábamos otra señal
conocida como SIGTSTP, que viene a ser una parada de terminal. Los procesos están
esperando señales y cuando las reciben realizan una actuación en función de la señal. Las
señales son múltiples y cada una tiene su uso concreto.

En las siguiente capturas hacemos uso de señales para detener el proceso como:

SIGTSTP o 20: Nos permitirá detener el proceso empleando el nombre o número.

SIGCONT o 18: Permite reanudar la ejecución del proceso.

SIGSTOP o 19: Nos permitirá detener el proceso empleando el nombre o número. A


diferencia de SIGTSTP obliga al kernel a detener la ejecución del proceso obligatoriamente.
En el caso de la señal SIGTSTP, el proceso podría tomar la decisión de no detenerse.
SIGINT o 2: Solicita la terminación controlada de un programa y es una forma común y
educada de detener la ejecución de un proceso en la terminal. Ocurre cuando el usuario
presiona Ctrl + C en el teclado.

SIGKILL o 9: Fuerza la terminación de un programa, a diferencia de la anterior, en este


caso el proceso no va a poder ignorar evitar su terminación.

Otro comando de mucho interés es killall que permite eliminar todos los procesos por
nombre. Supongamos que tenemos varios procesos emacs, este killall permitirá
eliminarlo todos.
Si bien es cierto que podemos realizar estas acciones sobre los procesos, esto es posible si
somos los usuarios propietarios del proceso o el superusuario. Si esto no fuera así y
cualquier usuario pudiera eliminar procesos de otros usuarios sería imposible trabajar
dentro del sistema. Si ejecutamos ps aux podemos ver los usuarios propietarios de cada
proceso.

6.6 Init, demonios y servicios


1. Init:
○ init es el primer proceso que se inicia en un sistema Unix/Linux y tiene el
PID (identificador de proceso) 1.
○ Su función principal es inicializar el sistema y arrancar el resto de procesos
esenciales. En sistemas más antiguos, init fue el sistema de inicialización
principal, pero en sistemas más modernos, como aquellos que utilizan
systemd, init puede ser reemplazado o complementado.

2. Demonios (Daemons):
○ Un demonio es un proceso en segundo plano que se ejecuta de manera
continua y proporciona servicios específicos en el sistema.
○ Los demonios pueden ser iniciados por el sistema o por el usuario. Algunos
ejemplos de demonios comunes son httpd (servidor web), sshd (servidor
SSH), y cron (programador de tareas).
3. Servicios y systemd:
○ systemd es un sistema de inicialización y gestión de servicios ampliamente
adoptado en distribuciones Linux modernas, como Ubuntu, Fedora y CentOS.
○ systemd reemplaza el tradicional init y presenta características más
avanzadas, como la paralelización del inicio, la gestión de dependencias y la
activación bajo demanda de servicios.
○ Los servicios gestionados por systemd se conocen como unidades de
servicio (service units). Cada servicio es definido por un archivo de
configuración con extensión .service.
○ La diferencia con los demonios es que los servicios van a recibir cierta
interacción con el usuario u otros procesos. Un demonio es un programa en
segundo plano con el que no vamos a interactuar.

El directorio /etc/init.d en sistemas basados en Unix/Linux contiene scripts de inicio


(initscripts) tradicionales que se utilizan para iniciar, detener y gestionar servicios del
sistema durante el proceso de arranque o en otros momentos específicos. Estos scripts
están asociados con el sistema de inicialización "init" en versiones más antiguas de
sistemas operativos, antes de la adopción generalizada de sistemas de inicialización más
modernos como systemd.

Scripts de Inicio:

Los scripts en /etc/init.d son ejecutables y contienen instrucciones sobre cómo iniciar,
detener y gestionar un servicio específico en base al proceso init. Estos procesos son
demonios en ejecución en segundo plano. Estos scripts suelen aceptar argumentos como
start, stop, restart, entre otros, para realizar acciones específicas.

Por otro lado, en la ruta /etc/default se encuentran los archivos de configuración de los
scripts de inicio (s scripts), que son los segundos en ejecutarse por init, después de los
scripts de terminación (k scripts) que se ejecutan primero. También tienen su respectivo
archivo de configuración en /etc/init.d .

6.7 Gestión de servicios


status:
Esta acción te permite obtener información sobre el estado actual del demonio. Puedes
verificar si el demonio está en ejecución, obtener detalles sobre su estado y ver si hay algún
problema.

stop:

La acción stop se utiliza para detener la ejecución del demonio. Esto implica terminar el
proceso del demonio de manera controlada.

start:

La acción start se utiliza para iniciar el demonio. Si el demonio no está en ejecución, esta
acción lo pondrá en marcha.
Estos comandos son solo ejemplos generales, y el nombre del demonio puede variar según
el sistema operativo y la configuración específica de tu entorno. En algunos sistemas,
también puedes encontrar estos comandos utilizando systemctl, que es el comando
principal para interactuar con systemd, el sistema de inicialización utilizado en muchos
sistemas Linux modernos.

También podemos listar con systemctl list-units –type=service todos los


servicios actuales de nuestra máquina.
6.8 Apagado del sistema
Apagar un sistema linux no es más que detener todos los procesos que el sistema tiene en
ejecución, almacenamiento de datos temporales… Para ello existen una serie de usuarios
que necesitan privilegios de superadministrador para su uso.
halt:

El comando halt detiene el sistema de manera ordenada, dejándolo en un estado de


apagado completo. Es equivalente a poweroff en muchos sistemas. Ejemplo:

$ sudo halt

poweroff:

Similar a halt, poweroff apaga el sistema de manera ordenada. En muchos sistemas,


poweroff es simplemente un enlace simbólico a halt, y ambos hacen lo mismo. Ejemplo:
$ sudo poweroff

reboot:

El comando reboot reinicia el sistema. Lanza el proceso de apagado y luego reinicia el


sistema, llevándolo de nuevo a un estado operativo. Ejemplo:

$ sudo reboot

shutdown:

shutdown es un comando más versátil que permite programar un apagado o reinicio del
sistema en el futuro. También puede enviar mensajes a los usuarios del sistema antes de la
acción planificada.

Ejemplo para apagar el sistema inmediatamente:


$ sudo shutdown -h now

Ejemplo para reiniciar el sistema inmediatamente:

$ sudo shutdown -r now

Ejemplo para apagar el sistema en 10 minutos:

$ sudo shutdown -h +10

Puedes proporcionar mensajes personalizados a los usuarios utilizando la opción -k:

$ sudo shutdown -h +5 "El sistema se apagará en 5 minutos. Guarda tu trabajo

6.9 Cambio de prioridad


Cuanto mayor sea el valor de NI (nice) el kernel va a priorizar menos la asignación de
recursos a ese proceso. Los valores de nice van desde -20 a 19 donde el proceso es más
“bueno” con el resto. Por defecto los procesos se inician con un nice de 0 y PR (prioridad)
de 20. El calculo de la prioridad se realiza de la siguiente forma → priority = nice + 20.

En sistemas Linux, la prioridad de los procesos se mide en términos de valores de


"niceness". El "niceness" es un valor numérico que indica la prioridad de ejecución de un
proceso. Cuanto más bajo es el valor de "niceness", mayor es la prioridad del proceso.

El rango de valores de "niceness" va desde -20 hasta +19, donde:


● -20 a -1: Representan prioridades más altas, indicando procesos con mayor
importancia o urgencia. Estos valores son reservados para procesos con alta
prioridad.
● 0: Es el valor predeterminado y representa la prioridad normal.
● +1 a +19: Representan prioridades más bajas, indicando procesos con menor
importancia o urgencia. Estos valores son reservados para procesos con baja
prioridad.

La relación entre "niceness" y prioridad se invierte: un valor más bajo de "niceness" se


traduce en una prioridad más alta, y viceversa.

● nice -n -10 ./mi_programa: Establece una prioridad alta para el proceso


mi_programa. El valor de "niceness" es -10.
● renice -n 5 -p 1234: Ajusta la prioridad de niceness del proceso con el PID
1234 a un valor más bajo (menos prioritario), ya que el valor de "niceness" es 5.
● nice -n 0 ./mi_programa: Ejecuta mi_programa con la prioridad de niceness
predeterminada (valor 0).
● renice -n 10 -u usuario: Ajusta la prioridad de niceness de todos los
procesos del usuario especificado a un valor más alto.

La relación entre el valor de "niceness" y la prioridad del proceso es gestionada por el kernel
del sistema operativo. Cuanto menor sea el valor de "niceness", más tiempo de CPU
obtendrá el proceso, ya que se considera más prioritario.

6.10 Proceso de arranque de un ordenador


¿Qué es lo ocurre desde que pulsas el botón de encendido de tu ordenador hasta que
se carga el sistema operativo?

Las siguientes son las 6 etapas de alto nivel de un típico proceso de arranque de Linux.

1. BIOS
● BIOS significa Sistema Básico de Entrada/Salida
● Realiza algunas comprobaciones de integridad del sistema
● Busca, carga y ejecuta el programa cargador de arranque.
● Busca el gestor de arranque en el disquete, cd-rom o disco duro. Puede pulsar una
tecla (normalmente F12 o F2, pero depende de su sistema) durante el arranque de
la BIOS para cambiar la secuencia de arranque.
● Una vez que el programa de arranque es detectado y cargado en la memoria, la
BIOS le da el control.
● Así que, en términos simples, BIOS carga y ejecuta el cargador de arranque MBR.

2. MBR

● MBR significa Master Boot Record.


● Se encuentra en el primer sector del disco de arranque. Normalmente es /dev/hda, o
/dev/sda
● El MBR tiene un tamaño inferior a 512 bytes. Tiene tres componentes 1) información
del cargador de arranque primario en los primeros 446 bytes 2) información de la
tabla de particiones en los siguientes 64 bytes 3) comprobación de validación del
mbr en los últimos 2 bytes.
● Contiene información sobre GRUB (o LILO en sistemas antiguos).
● Así que, podemos decir que el MBR carga y ejecuta el cargador de arranque GRUB.

3. GRUB

● GRUB significa Grand Unified Bootloader.


● Si tiene varias imágenes del kernel instaladas en su sistema, puede elegir cuál se
ejecutará.
● GRUB muestra una pantalla de bienvenida, espera unos segundos, si no introduce
nada, carga la imagen del kernel por defecto como se especifica en el archivo de
configuración de grub.
● GRUB tiene el conocimiento del sistema de archivos (el antiguo cargador de Linux
LILO no entendía el sistema de archivos).
● El archivo de configuración de grub es /boot/grub/grub.conf (/etc/grub.conf es un
enlace a esto)
● Así que, podemos decir que el GRUB carga y ejecuta imágenes del Kernel y de
initrd.

4. Kernel

● Monta el sistema de archivos raíz como se especifica en el "root=" en grub.conf


● El Kernel ejecuta el programa /sbin/init
● Como init fue el primer programa ejecutado por el Kernel de Linux, tiene el id de
proceso (PID) de 1.
● initrd significa Disco RAM Inicial.
● El initrd es utilizado por el kernel como sistema de archivos raíz temporal hasta que
el kernel es arrancado y el sistema de archivos raíz real es montado. También
contiene los controladores necesarios compilados en su interior, que le ayudan a
acceder a las particiones del disco duro y a otro hardware.
5. Init

● Lee el archivo /etc/inittab para decidir el nivel de ejecución de Linux.


● Los niveles de ejecución disponibles son los siguientes
○ 0 - halt
○ 1 - Modo de usuario único
○ 2 - Multiusuario, sin NFS
○ 3 - Modo multiusuario completo
○ 4 - sin uso
○ 5 - X11
○ 6 - reinicio
● Init identifica el nivel por defecto sus ficheros de configuracion y lo utiliza para cargar
el resto de programas.
● Ejecuta el comando runlevel en su sistema para identificar el nivel de ejecución
por defecto
● Típicamente, el nivel de ejecución por defecto se establece en 3 o 5.

6. Programas de nivel de ejecución

● Cuando el sistema Linux está arrancando, puede ver que se inician varios servicios.
Estos son los programas de nivel de ejecución, ejecutados desde el directorio de
nivel de ejecución definido por su nivel de ejecución.
● Dependiendo de su configuración de nivel de init por defecto, el sistema ejecutará
los programas desde uno de los siguientes directorios.
○ Nivel de ejecución 0 - /etc/rc.d/rc0.d/
○ Nivel de ejecución 1 - /etc/rc.d/rc1.d/
○ Ejecuta el nivel 2 - /etc/rc.d/rc2.d/
○ Ejecutar el nivel 3 - /etc/rc.d/rc3.d/
○ Ejecutar el nivel 4 - /etc/rc.d/rc4.d/
○ Ejecutar el nivel 5 - /etc/rc.d/rc5.d/
○ Ejecutar el nivel 6 - /etc/rc.d/rc6.d/
● Ten en cuenta que también hay enlaces simbólicos disponibles para estos directorios
bajo /etc directamente. Así, /etc/rc0.d está vinculado a /etc/rc.d/rc0.d.
● Bajo los directorios /etc/rc.d/rc*.d/, verá programas que comienzan con S y K.
● Los programas que empiezan por S se utilizan durante el arranque. S para el
arranque.
● Los programas que comienzan con K se utilizan durante el apagado. K para matar.
● Hay números justo al lado de S y K en los nombres de los programas. Estos son el
número de secuencia en el que los programas deben ser iniciados o eliminados.
● Por ejemplo, S12syslog es para iniciar el deamon del syslog, que tiene el número de
secuencia 12. S80sendmail es para iniciar el demonio sendmail, que tiene el número
de secuencia 80. Así, el programa syslog se iniciará antes que sendmail.
7. Redes

7.1 Interfaces de red


La interfaz de red es un componente crucial que permite la comunicación entre la máquina y
la red. La configuración de la interfaz de red se gestiona mediante herramientas y archivos
de configuración específicos del sistema. Es necesario tener por lo menos una interfaz de
red que se relacione con la tarjeta de red del equipo.

TRATAREMOS ESTE TEMA EN LA TERCERA


EVALUACIÓN
8. Gestión de paquetes y librerías

Con gestión de paquetes en Linux nos referimos al método para instalar y mantener el
software en los sistemas Linux. En Linux el software tiene cambios y actualizaciones
periódicas por lo que existen una serie de herramientas de gestión de paquetes donde
figuran todos los ficheros propios de un programa y será esta herramienta quien se
encargará de hacer las modificaciones necesarias para mantener el Software funcionando.

Un paquete es la unidad básica de un sistema de gestión de paquetes (extensión .deb o


rpm en función de la distribución Linux) y va a contener los ficheros relativos de una
herramienta concreta. En definitiva, un paquete contiene los ficheros y metadatos
necesarios para actualizar y mantener un programa en nuestro sistema.

Estos repositorios donde se almacena el contenido de los paquetes están mantenidos por la
propia distribución de Linux.

8.1 Buscar, instalar y actualizar paquetes


Lo primero que hacemos es hacer uso del comando sudo apt update, el cual permite
actualizar los repositorios de paquetes que tenemos añadidos a nuestro sistema Ubuntu.

Los repositorios de paquetes que tenemos añadidos en nuestro sistema y que podemos
consultar con el anterior comando están en el fichero /etc/apt/sources.list.
También puedo buscar si un paquete está en alguno de los repositorios que tengo
configurados en mi equipo. Para ello hago uso del comando apt-cache search ___.

Por otra parte, si nosotros tenemos un paquete que existe en alguno de los repositorios de
nuestro sistema podemos instalarlo haciendo uso del comando apt-install.

Podemos ver en la imagen anterior como la instalación de este paquete requiere la


instalación de otros tres paquetes que son las dependencias de este paquete que queremos
añadir.
8.2 Instalación manual de paquetes
Existen ocasiones en las que queremos instalar paquetes que no están disponibles en los
repositorios de nuestro sistema. En este caso procedemos a una instalación manual.

Procedemos a la descarga del paquete de ficheros .deb.

Nos dirigimos a descargas y con el comando dpkg nos encargamos de instalarlo. Este
comando es una herramienta de gestión de paquetes en sistemas operativos basados en
Debian, como Ubuntu. Permite instalar, desinstalar y gestionar paquetes de software en el
sistema. Ejemplo: sudo dpkg -i Nombre.deb

Iniciamos el servicio y nos dirigimos a la URL que se nos indica.


8.3 Eliminar, listar y buscar paquetes ya instalados
Vamos a proceder a desinstalar el paquete nessus con sudo apt remove nessus.

Por otra parte, tenemos otro comando muy interesante que es sudo apt upgrade, el cual
actualiza tanto paquetes como dependencias a la última versión disponible en el repositorio.

También podría darse el caso de actualizar un paquete ya instalado. Para ello haríamos el
mismo proceso de instalación que con Nessus.

Podemos ver todo el software instalado en el sistema con dpkg -l:


Y también podemos ver información propia de los metadatos de un paquete con dpkg -s
nombre. Conseguiremos la misma salida haciendo un apt show nombre.

También puedo ver que paquete es responsable de la instalación de un fichero concreto con
el comando dpkg -S nombre.

8.4 Actualizar la distribución de Linux


Una cosa interesante que debemos tener en cuenta es que un sistema Linux está formado
por diferentes componentes de software. Uno de ellos son los programas en espacio de
usuario que hemos aprendido a instalar, eliminar y actualizar en las secciones anteriores.
Sin embargo, hay otro componente software muy importante del que no hemos hablado, el
kernel de Linux.

A medida que la tecnología avanza, los desarrolladores aplican parches y actualizaciones


para el kernel de Linux. Estos parches pueden mejorar la seguridad, añadir funcionalidades
o incluso mejorar la velocidad de funcionamiento del sistema operativo.

Si utilizas un sistema operativo Linux como Ubuntu, es una buena idea comprobar y
actualizar el kernel regularmente. Para ello, podemos seguir el siguiente proceso:

1. Comprobamos cuál es la versión actual del kernel. Para ello, ejecutamos el comando:
uname -sr

2. Actualizamos los repositorios de paquetes: sudo apt update


3. Actualizamos el kernel: sudo apt dist-upgrade

4. Reiniciamos la máquina: sudo reboot

5. Podemos comprobar la nueva versión con el comando: uname -sr

El comando sudo apt dist-upgrade realiza también todas las funciones que incluye el
comando sudo apt upgrade

8.5 Añadir nuevos repositorios de paquetes


Aunque no es una práctica recomendada por cuestiones de seguridad, si es posible añadir
nuevos repositorios a nuestra máquina. Vamos a añadir otro repositorio empleado en la
distribución Kali-Linux.
9. El entorno en Linux

9.1 El entorno en Linux


Linux es un sistema operativo de código abierto basado en el kernel de Linux. Su entorno es
conocido por su estabilidad, seguridad, y flexibilidad. Además, ofrece una amplia variedad
de distribuciones, como Ubuntu, Fedora, Debian, CentOS, entre otras, cada una con sus
propias características y enfoques.

Entorno de Linux:

1. Kernel: El kernel de Linux es el núcleo del sistema operativo. Se encarga de


gestionar los recursos del hardware, la memoria, el sistema de archivos y las
comunicaciones entre el software y el hardware.
2. Sistema de archivos: Linux utiliza un sistema de archivos jerárquico con una
estructura de directorios que incluye directorios como /bin (binarios del sistema),
/etc (configuración del sistema), /home (directorios de usuarios), /var (datos
variables), y otros.
3. Shell: Linux utiliza shells para interactuar con el sistema. Bash (Bourne Again SHell)
es uno de los shells más comunes y estándar en la mayoría de las distribuciones.
Otros ejemplos incluyen Zsh, Fish y Dash.
4. Interfaces gráficas y de línea de comandos: Linux puede ejecutarse en modo
gráfico o en modo de línea de comandos. Las interfaces gráficas como GNOME,
KDE y Xfce ofrecen entornos de escritorio, mientras que la línea de comandos
proporciona una interfaz más directa y potente.
5. Paquetes y gestores de paquetes: Las distribuciones de Linux utilizan sistemas de
gestión de paquetes para instalar, actualizar y eliminar software. Ejemplos incluyen
apt (Debian/Ubuntu), yum/dnf (Fedora/RHEL), y pacman (Arch Linux).

Variables de entorno en Linux: Las variables de entorno son valores dinámicos que
afectan el comportamiento de los procesos en un sistema. En Linux, estas variables se
almacenan en el entorno del sistema y pueden ser accedidas por los programas en
ejecución. Algunas variables de entorno comunes incluyen:

1. PATH: Especifica los directorios donde el sistema busca ejecutables. Cada directorio
está separado por dos puntos (:).
2. HOME: Indica la ruta del directorio personal del usuario.
3. USER: Representa el nombre del usuario actual.
4. SHELL: Especifica el intérprete de comandos predeterminado para el usuario.
5. LANG y LC_*: Establecen la configuración regional y de idioma del sistema.

Una forma de poder ver las variables de entorno es con el comando printenv. Otro
comando de interés es set que a mayores de las variables de entorno muestra funciones
propias del sistema.

También puedo ver el contenido de una variable simplemente $echo nombre_variable.

9.2 Como se establece el entorno


Tenemos una serie de ficheros que llevan a cabo la configuración del entorno.
El archivo /etc/environment en sistemas Linux es un archivo de configuración que se
utiliza para definir variables de entorno de forma global para todos los usuarios del sistema.
Este archivo es leído por el sistema durante el inicio del sistema y establece las variables de
entorno para todas las sesiones de usuario.

El archivo /etc/profile se utiliza para establecer configuraciones y variables de entorno


globales para todos los usuarios del sistema. Contiene comandos y configuraciones que se
ejecutan cada vez que un usuario inicia sesión en el sistema.
No se considera una buena práctica realizar modificaciones directamente sobre este fichero.
Si se quiere añadir una nueva variable es recomendable crear el script necesario en
/etc/profile.d. Estos scripts se ejecutan cuando realizamos una nueva sesión con
login.

El archivo /etc/bash.bashrc es un script de inicio global para el shell Bash en sistemas


basados en Unix y Linux. Su propósito principal es proporcionar configuraciones y funciones
por defecto para todos los usuarios del sistema que utilizan Bash como su shell. A
diferencia del anterior, estas variables se ejecutarán en una shell con sin necesidad de
login.

Estos son los ficheros que afectan a todo el sistema y a todos los usuarios. Por otra parte,
los archivos de configuración a nivel de usuario que se utilizan para personalizar el entorno
de shell Bash para usuarios específicos. Cada uno de ellos tiene un propósito particular en
el ciclo de vida de una sesión de Bash:

~/.profile: Propósito: Este archivo se ejecuta al inicio de sesión y es generalmente


utilizado para configuraciones generales de usuario. Puede establecer variables de entorno,
configurar el PATH, y realizar otras acciones relacionadas con el inicio de sesión.

~/.bash_login: Propósito: Este archivo se ejecuta después de ~/.profile sí existe.


Sin embargo, su uso no es tan común en comparación con ~/.bashrc y a menudo se
omite en favor de otros archivos de perfil.

~/.bashrc: Propósito: Este archivo se ejecuta cada vez que se inicia una nueva instancia
de Bash (interactiva o no). Es utilizado para configurar preferencias de usuario, personalizar
el prompt, definir alias y funciones, y más.

~/.bash_logout: Propósito: Este archivo se ejecuta al cerrar una sesión de Bash.


Puede contener acciones de limpieza o tareas que deben realizarse antes de salir.
A modo de resumen podemos decir que:

Ficheros con aplicación a todo el sistema (todos los usuarios del sistema)

● /etc/enviroment → Fichero específico para la definición de variables de entorno. No


puede contener scripts. Se ejecuta al iniciar el sistema.
● /etc/profile → Permite definir variables de entorno y scripts, aunque no es apropiado
modificar este fichero directamente (debe crearse un nuevo fichero en
/etc/profile.d). Se ejecuta en shells con login.
● /etc/profile.d → Contiene scripts que se ejecutan en shells con login.
● /etc/bash.bashrc → Permite definir variables de entorno y scripts que estarán
disponibles para programas iniciados desde la shell bash. Las variables que se
definan en este fichero no van a estar disponibles para programas iniciados desde la
interfaz gráfica. No se ejecuta en shells con login.

Ficheros con aplicación a un usuarios específico

● ~/.profile → Permite definir variables de entorno y scripts. Este fichero se ejecutará


al iniciar la sesión de Escritorio o en una shell con login. Las variables afectan a
todos los programas ejecutados desde el escritorio gráfico o desde la shell.
● ~/.bashrc → Permite definir variables de entorno y scripts. Se ejecuta cuando se
abre la shell sin necesidad de hacer login. Es un fichero especifico de la shell bash,
lo que quiere decir que las variables definidas solo afectaran a los programas
ejecutados desde bash.
● ~/.bash_profile, ~/.bash_login → Permiten definir variables de entorno y scripts. Se
ejecutan cuando se utiliza una shell con login. Son ficheros específicos de bash, lo
que quiere decir que las variables definidas solo afectaran a los programas
ejecutados desde bash.

9.3 Modificando el entorno


Nosotros podemos crear nuevas variables de entorno en el sistema como en este caso que
creamos una nueva variable llamada EDITOR. El problema es que si abrimos otra shell se
pierde esta variable ya que estos cambios no son persistentes y solo pertenecen a la sesión
de esa Shell.

Por este motivo, en función del alcance que queramos que tengan nuestras variables vamos
a tener que modificar unos ficheros u otros.
A continuación, voy a añadir una nueva variable en /etc/enviroment, donde solo se pueden
definir variables y no scripts y va a tener alcance de todos los usuarios.

Para que este cambio se aplique es necesario reiniciar el sistema. En resumen, si queremos
añadir una variable para todos los usuarios lo hacemos en este archivo.

Si queremos añadir un script que afecte a todos los usuarios vamos a realizarlo en
/etc/profile.d si la shell necesita de autenticación y sino en /etc/bash.bashrc.

De todos modos, lo normal es modificar el entorno para un usuario concreto. Nuevamente


para un solo usuario tenemos el .profile (pensado para usuarios que se conectan de forma
remota) y .bashrc para aquellos usuarios locales.

Vamos a crear nuevas variables de entorno para nuestra propia shell en /etc/bash.bashrc y
vamos a emplear el comando profile para que se apliquen los cambios sobre esta shell
y no tener que abrir otra nueva.
9.4 Variables de entorno interesantes
A continuación se muestra un listado de variables de entorno interesantes.

● SHELL → El nombre de la shell por defecto del usuario.


● HOME → El nombre de la ruta de tu directorio personal.
● LANG / LANGUAGE → Define el conjunto de caracteres y el orden de cotejo de su
idioma.
● PATH → Una lista separada por dos puntos de los directorios que se buscan cuando
introducimos el nombre de un programa ejecutable.
● PWD → El directorio de trabajo actual.
● _ → Una referencia al programa /usr/bin/printenv (prueba a ejecutar el
comando $_)
● USER → Tu nombre de usuario.

10. Dispositivos de almacenamiento externos

10.1 Dispositivos extraibles


En Linux, montar un dispositivo, como un pen drive (también conocido como memoria USB
o unidad flash), significa vincularlo al sistema de ficheros principal para que el sistema
operativo pueda acceder a los datos almacenados en el dispositivo. Cuando conectas un
pen drive a tu sistema, generalmente se detecta automáticamente, pero para acceder a los
archivos, necesitas montarlo en un directorio específico conocido como "punto de montaje".
El objetivo es extender el sistema de ficheros del sistema al pen drive.

El comando mount en sistemas basados en Unix y Linux se utiliza para montar sistemas de
archivos en dispositivos de almacenamiento. Montar un sistema de archivos permite al
sistema operativo acceder a los archivos y directorios presentes en ese sistema de
archivos.
Este proceso que realizamos de forma automática. En primer lugar, vemos que tenemos un
nuevo dispositivo sdb1 al final del comando mount y podemos dirigirnos a la ruta y hacer las
modificaciones necesarias podemos hacerlo de forma manual. Para ello vamos a utilizar los
comandos mount y umount para poder hacer el proceso nosotros mismos.

10.2 Montar y desmontar un dispositivo


Para el montaje de un dispositivo creamos una nueva carpeta en /media donde realizar el
montaje del usb y empleamos el comando mount. Anteriormente hacemos uso del
comando umount para desmontar el dispositivo que inicialmente se montaba de forma
automática.
10.3 Identificar el nombre del dispositivo
En el directorio /dev de sistemas Linux, se encuentran los archivos especiales de
dispositivo que representan diferentes hardware y dispositivos del sistema. Aquí tienes
información específica sobre las categorías mencionadas:

1. /dev/lp: Descripción: Este dispositivo se utiliza para interactuar con impresoras


en sistemas más antiguos que utilizan el puerto paralelo. Uso común: Puede ser
utilizado para redirigir la salida de impresión directamente al puerto paralelo para
imprimir en una impresora conectada.
2. /dev/sd: Descripción: Los dispositivos que comienzan con /dev/sd representan
discos SCSI o dispositivos de almacenamiento como discos duros, SSDs y
dispositivos USB. Uso común: Los dispositivos /dev/sdX pueden ser particiones o
el disco completo, y se montan en puntos específicos para acceder a los datos.
3. /dev/sr: Descripción: Este dispositivo se utiliza para interactuar con unidades de
CD/DVD. Uso común: Puedes usar /dev/srX para acceder a unidades de
CD/DVD y realizar operaciones como leer o grabar datos en discos ópticos.

Para monitorear los cambios de dispositivos USB y asignar letras a los dispositivos, puedes
revisar el archivo de registro /var/log/syslog en muchos sistemas basados en Debian,
como Ubuntu. Este archivo registra varios eventos del sistema, incluidos los cambios en
dispositivos y mensajes del kernel. Puedes utilizar el siguiente comando para ver las últimas
líneas del archivo syslog y buscar cambios relacionados con dispositivos USB: tail -n
50 /var/log/syslog | grep usb Este comando muestra las últimas 50 líneas del
archivo syslog y filtra las líneas que contienen la palabra "usb". Puedes ajustar el número de
líneas según tus necesidades. Además, algunos sistemas también registran eventos de
dispositivos USB en archivos como /var/log/messages o /var/log/udev. La
ubicación exacta del registro puede variar según la distribución del sistema operativo.
Revisa la documentación específica del sistema operativo que estás utilizando para obtener
información detallada sobre la ubicación del registro de eventos de dispositivos.
11. Archivando y comprimiendo archivos

11.1 Comprimiendo y descomprimiendo ficheros


El comando gzip es una herramienta de compresión de archivos en sistemas operativos
tipo Unix y Linux. Su nombre proviene de "GNU zip". La función principal de gzip es
comprimir archivos para reducir su tamaño, lo que facilita su transferencia a través de redes
y el almacenamiento más eficiente en dispositivos de almacenamiento.
11.2 Otra solución para comprimir y descomprimir ficheros
bzip2 es otra herramienta de compresión de archivos en sistemas Unix y Linux. Al igual
que gzip, bzip2 se utiliza para reducir el tamaño de los archivos, pero utiliza un algoritmo
de compresión diferente llamado Burrows-Wheeler Transform (BWT) en combinación con la
codificación de Huffman.

11.3 Archivar ficheros tar


tar es una herramienta de archivado muy utilizada en sistemas operativos tipo Unix y
Linux. Su nombre se deriva de "tape archive" (archivo de cinta), ya que inicialmente se
desarrolló para trabajar con cintas magnéticas. Sin embargo, en la actualidad, tar se utiliza
principalmente para crear archivos y directorios comprimidos o no comprimidos, que se
pueden utilizar para respaldos, transferencias de archivos o cualquier otra tarea que
implique la agrupación de archivos y directorios.

Archivar se refiere a la acción de agrupar archivos y directorios en un solo archivo, mientras


que comprimir implica reducir el tamaño de un archivo utilizando algoritmos de compresión.
Ambas acciones son útiles en diferentes contextos, y a menudo se utilizan juntas para crear
archivos eficientes y fáciles de manejar en entornos Linux.
11.4 Archivar y comprimir con zip

También podría gustarte