Skip to content

Commit d82f356

Browse files
committed
Merge branch '00-fundamentos-de-linux'
2 parents 088a274 + bedddcc commit d82f356

20 files changed

Lines changed: 3150 additions & 13 deletions

00-fundamentos-linux/.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
.vagrant/
2+
*.log
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
# Sistema de ficheros
2+
3+
En Linux y Unix todo es un fichero. Los directorios son ficheros y los dispositivos son ficheros. Los ficheros están organizados en un árbol jerárquico donde existe la relación padre-hijos (los directorios pueden contener otros directorios u otros ficheros). Todos los ficheros parten de una ruta raíz que se representa con el carácter `/`. Cualquier fichero puede ser referenciado por un nombre de ruta. El directorio `/` sirve como punto de montaje para el resto de directorios del sistema. Un punto de montaje no es más que un directorio vacío que sirve para que sean montados otros directorios de una partición de un disco.
4+
5+
Un nombre de ruta absoluto comienza con el carácter `/` del que siguen todos los directorios hijos que deben ser atravesados para llegar al fichero, cada uno separado por el signo `/`.
6+
7+
Un nombre de ruta relativo es aquel que no comienza por `/`. En este caso el árbol de directorios se recorre a partir de un punto determinado que cambia según el directorio actual donde nos encontremos (contexto). En cada directorio hay dos directorios especiales: `.` que representa el contexto o directorio actual, y `..` que representa al directorio padre del contexto.
8+
9+
Este es un ejemplo de un directorio representado por su ruta absoluta:
10+
11+
```
12+
/var/lib/
13+
```
14+
15+
Este es un ejemplo de un fichero representado por su ruta absoluta:
16+
17+
```
18+
/usr/bin/echo
19+
```
20+
21+
Este es un ejemplo del directorio anterior representado por ruta relativa tomando `/home/myusername` como contexto actual:
22+
23+
```
24+
../../var/lib/
25+
```
26+
27+
Este es un ejemplo del fichero anterior representado por ruta relativa tomando `/usr/` como contexto actual:
28+
29+
```
30+
./bin/echo
31+
```
32+
33+
El carácter especial `~` representa el directorio _home_ en forma de ruta absoluta del usuario actual. El directorio _home_ para usuarios finales suelen estar localizados dentro de `/home/` seguidos de una carpeta que representa el _login_ del usuario. Si tenemos un usuario `alfredo` su directorio _home_ será `/home/alfredo`. Esto suele ser diferente de otros usuarios del sistema que son utilizados para ejecutar demonios o procesos en segundo plano. El _home_ del usuario `root` es `/root/`.
34+
35+
Este es un ejemplo de una ruta absoluta de un fichero dentro del directorio `Downloads` de mi _home_ siendo un usuario cuyo login es _alfredo_:
36+
37+
```
38+
~/Downloads/file.txt
39+
```
40+
41+
Es equivalente a:
42+
43+
```
44+
/home/alfredo/Downloads/file.txt
45+
```
46+
47+
Los ficheros o directorios pueden contener espacios y otros caracteres especiales. Estos caracteres deben escaparse con una `\` a la hora de acceder a ellos o estar encerrados entre comillas.
48+
49+
Los siguientes ejemplos representan directorios con espacios:
50+
51+
```
52+
~/My\ Videos/
53+
"~/My Videos/"
54+
~/"My Videos"/
55+
```
56+
57+
## Directorios especiales del sistema
58+
59+
La estructura de ficheros del sistema suelen seguir el [Estandar de Jerarquía de Sistema de Ficheros](https://www.pathname.com/fhs/pub/fhs-2.3.html) aunque algunos directorios pueden variar ligeramente según la distribución:
60+
61+
- `/bin` contiene los comandos de terminal más comunes.
62+
- `/boot` contiene los ficheros necesarios para arrancar el sistema, incluyendo el kernel, la imagen disco RAM y los ficheros de configuración del gestor de arranque.
63+
- `/dev` contiene todos los ficheros que representan los dispositivos. Estos son tipos de ficheros especiales que apuntan a diferentes.dispositivos hardware en el sistema, incluyendo discos duros.
64+
- `/etc` contiene los ficheros de configuración del sistema, que afectan al comportamiento del sistema para todos los usuarios.
65+
- `/home` contiene los directorios principales de los usuarios.
66+
- `/lib` contiene entre otras cosas módulos de kernel y librerías dinámicas muy importantes
67+
- `/media` está pensado para ser utilizado como punto de montaje de dispositivos externos (discos duros, CDs, DVDs, etc).
68+
- `/mnt` también está pensado para ser utilizado como punto de entrada de montaje de dispositivos externos, concretamente los temporales (sistema de ficheros en red, dispositivos extraíbles, etc).
69+
- `/opt` está pensado para contener software adicional del sistema que no esté manejado por el gestor de paquetes.
70+
- `/proc` es un sistema de ficheros virtuales que utiliza el kernel como mecanismo para enviar información a los procesos.
71+
- `/root` es el directorio del usuario administrador.
72+
- `/run` es un sistema de ficheros temporal para almacenar información de procesos pasajeros.
73+
- `/sbin` contiene comandos administrativos importantes que suelen ser utilizados por el superusuario.
74+
- `/srv` está pensado para contener directorios de servicios de sistema como HTTP, FTP, etc.
75+
- `/sys` es otro sistema de ficheros virtuales del que se puede obtener o establecer configuraciones para el kernel.
76+
- `/tmp` está concebido para ser un directorio de ficheros temporales para las aplicaciones.
77+
- `/usr` contiene la mayoría de aplicaciones y utilidades a la que los usuarios tienen acceso.
78+
- `/var` está dedicado a contener datos variables de aplcaciones como logs, bases de datos, correos.
Lines changed: 199 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,199 @@
1+
# Gestión de paquetes
2+
3+
## Introducción
4+
5+
En los sistemas Linux existen varios métodos para instalar programas en el sistema. La opción más primitiva y abierta es descargar el código fuente del programa, compilarlo e instalarlo asegurándonos previamente que tenemos todas las dependencias instaladas. Este método de instalación provee generalmente de un fichero `Makefile` con el listado de instrucciones para ser usadas por el comando `make` para compilar e instalar.
6+
7+
La otra opción para manejar la gestión de aplicaciones es usar un gestor de paquetes. Un gestor de paquetes es un conjunto de programas que se encargan de instalar, actualizar y eliminar aplicaciones del sistema de forma automática.
8+
9+
Los programas en Linux vienen empaquetados (y comprimidos) en un único fichero donde además de la funcionalidad del programa trae información sobre sí mismo, dependencias, hash de verificación, distribuidor, versión, etc. Existen diferentes formatos de paquetes que están enfocados en distribuciones específicas como `.deb` o `.rpm`. Las más generales utilizan `.tar.gz` o `.tar.xz`
10+
11+
El gestor de paquetes puede variar en función de la distribución que estemos usando, pero todos cumplen la misma funcionalidad común.
12+
13+
Ejemplos de gestores de paquetes:
14+
15+
- `zypper` - utilizados en sistemas SUSE y openSUSE entre otros.
16+
- `dpkg`, `apt-get` y compañía - utilizados en sistemas basados en Debian (existen muchos basados en estos como `snap`, `aptitude`, `synaptic`, etc).
17+
- `pacman` - utilizados en sistemas basados en Arch (`yay` y derivados para el repositorio AUR).
18+
- `rpm`, `yum` y su sucesora `dnf` - utilizados en sistemas basados en Red Hat Enterprise Linux.
19+
- `nix` - gestor de paquetes sin distribución específica
20+
- `portage` - utilizados en sistemas basadaos en Gentoo
21+
22+
Las distribuciones que utilizan gestores de paquetes obtienen sus paquetes de **repositorios**. Los repositorios son servidores públicos cuyo objetivo es almacenar paquetes a disposición de los usuarios. Existen repositorios oficiales y no oficiales. Los paquetes que provienen de repositorios oficiales son mantenidos por las entidades que crearon la distribución. Los repositorios no oficiales son mantenidos por la comunidad para aportar paquetes que los creadores de la distribución no admiten como paquetes core por diversos motivos (por ejemplo, filosofía OpenSource).
23+
24+
> Los siguientes ejemplos están basados sobre una máquina Ubuntu, cuyo gestor de paquetes oficial más utilizado es `apt`.
25+
> Todos los ejemplos de comandos precedidos con un `#` indican que requieren de permisos de superusuario para ser ejecutados. Los que empiezan por `$` pueden ser ejecutados por cualquier usuario común.
26+
27+
## Gestión de paquetes en Ubuntu.
28+
29+
El gestor de paquetes `apt` está separado en diferentes programas independientes:
30+
31+
- `apt-get`: Encargado de instalar, desinstalar, actualizar paquetes y sincronizar la lista de paquetes con los repositorios.
32+
- `apt-cache`: Encargado de servir información relacionada con los paquetes (buscar paquetes, mostrar información de paquetes, etc).
33+
- `apt`: Sucesor de `apt-get` y `apt-cache` cuya API aún no es del todo estable, pero es bastante funcional.
34+
- `apt-key`: Encargado de manipular la lista de claves para autenticar paquetes. Útil si utilizamos repositorios externos, ya que las claves de los repositorios oficiales son manejadas automáticamente. Cuando descargamos un paquete está firmado digitalmente para asegurar su autenticifidad.
35+
- `add-apt-repository`: Encargado de añadir o eliminar un repositorio de la lista de repositorios.
36+
37+
El listado de repositorios habilitados se encuentra en `/etc/apt/sources.list`.
38+
39+
### Sincronizar caché de paquetes con los repositorios
40+
41+
Para saber qué paquetes están disponibles en los repositorios junto con sus versiones hace falta sincronizarse con los repositorios que tengamos configurados. Este proceso es importante a la hora de instalar paquetes ya que sin él podríamos requerir un paquete que ya no exista o sea demasiado antiguo.
42+
43+
Para actualiza la caché de paquetes utilizamos el comando:
44+
45+
```shell
46+
# apt-get update
47+
```
48+
49+
O con `apt`:
50+
51+
```shell
52+
# apt update
53+
```
54+
55+
### Instalar y actualizar paquetes específicos
56+
57+
Para instalar paquetes utilizamos el comando:
58+
59+
```shell
60+
# apt-get install <package1> <package2> ... <packageN>
61+
```
62+
63+
Ejemplo:
64+
65+
```shell
66+
# apt-get install nodejs npm
67+
```
68+
69+
Admite varias opciones como `-q` para instalación silenciosa, `-s` para realizar simulación de instalacíon sin realmente añadirlo al sistema o `-y` para que no nos pida confirmación de instalación.
70+
71+
Si intentamos instalar un paquete que esté instalado ya en el sistema intentará actualizarlo si existiesen nuevas versiones del mismo. En caso de no haber actualizaciones no realizará cambios en el sistema a menos que utilicemos los flags que empiezan por `--allow` (man apt-get) para forzar una reinstalación. También podemos especificar que sólo actualice paquetes sin añadirlos en caso de que no estuviese previamente instalados con el flag `--only-upgrade`.
72+
73+
También podemos utilizar `apt`:
74+
75+
```shell
76+
# apt install nodejs npm
77+
```
78+
79+
### Actualizar todos los paquetes:
80+
81+
Para actualizar todos los paquetes con versiones nuevas disponibles sin tener que especificar uno por uno utilizaremos el comnado:
82+
83+
```shell
84+
# apt-get upgrade
85+
```
86+
87+
O utilizando `apt`:
88+
89+
```shell
90+
# apt upgrade
91+
```
92+
93+
Para obtener un listado de paquetes con actualizaciones nuevas podemos ejecutar:
94+
95+
```shell
96+
$ apt list --upgradable
97+
```
98+
99+
Con `apt-get` no existe una forma simple de ver este listado, pero una opción es utilizar la opción `-s` para simular la actualización y así ver los paquetes:
100+
101+
```shell
102+
$ apt-get upgrade -s
103+
```
104+
105+
### Eliminar paquetes:
106+
107+
Para eliminar paquetes utilizaremos el comando:
108+
109+
```shell
110+
# apt-get remove <package1> <package2> ... <packageN>
111+
```
112+
113+
Ejemplo:
114+
115+
```shell
116+
# apt-get remove nodejs npm
117+
```
118+
119+
Admite diversos flags como `-y` para no pedir confirmación, `-s` para simular el borrado, etc.
120+
121+
Si añadimos el signo `+` al final del nombre del paquete lo instalará en vez de borrar. Por ejemplo, `nodejs+` instalará `nodejs` en vez de borrarlo.
122+
123+
Es importante saber que `apt-get remove` elimina los paquetes pero deja los ficheros de configuración en el sistema. Para eliminar también sus ficheros de configuración utilizaremos `apt-get purge`:
124+
125+
```shell
126+
# apt-get purge nodejs npm
127+
```
128+
129+
Si utilizamos `apt` tenemos tanto `apt remove` y `apt purge` para las dos operaciones mencionadas.
130+
131+
Si por algún motivo tenemos alguna dependencia _huérfana_ de paquetes, es decir, dependencias que no han sido eliminadas al desinstalar un paquete utilizaremos el siguiente comando para eliminarlas:
132+
133+
```shell
134+
# apt-get autoremove
135+
```
136+
137+
O utilizando `apt`:
138+
139+
```shell
140+
# apt autoremove
141+
```
142+
143+
### Buscar paquetes en los repositorios:
144+
145+
Para buscar paquetes en los repositorios utilizaremos:
146+
147+
```shell
148+
$ apt-cache search <package>
149+
```
150+
151+
Esto buscará en los repositorios los paquetes que tengan relación directa o indirecta con el nombre del paquete que hayamos puesto o paquetes con nombres similares.
152+
153+
Ejemplo:
154+
155+
```shell
156+
$ apt-cache search npm
157+
```
158+
159+
Utilizando `apt`:
160+
161+
```shell
162+
$ apt search npm
163+
```
164+
165+
### Ver datos de un paquete:
166+
167+
Para obtener información de uno o varios paquetes utilizaremos:
168+
169+
```shell
170+
$ apt-cache show <package1> <package2> ... <packageN>
171+
```
172+
173+
Ejemplo:
174+
175+
```shell
176+
$ apt-cache show npm
177+
```
178+
179+
O si utilizamos `apt`:
180+
181+
```shell
182+
$ apt show npm
183+
```
184+
185+
### Mostrar paquetes instalados
186+
187+
La interfaz de `apt-cache` no tiene ningún flag para obtener un listado de paquetes instalado, pero el comando `dpkg` sí:
188+
189+
```shell
190+
$ dpkg -l
191+
```
192+
193+
Todos los paquetes que comiencen por `ii` están instalados en el sistema.
194+
195+
Utilizando `apt`:
196+
197+
```shell
198+
$ apt list --installed
199+
```

0 commit comments

Comments
 (0)