Tabla de Contenidos
Administración, particiones y Docker
Sección perteneciente al curso Linux para DevOps y Sysadmin.
Buffer cache
Para obtener información acerca del buffer:
free -m
total usado libre compartido búf/caché disponible Mem: 15953 1778 13463 30 1012 14174 Inter: 4095 0 4095
Si queremos liberar la caché en la memoria:
echo 3 > /proc/sys/vm/drop_caches
Si volvemos a hacer free -m, habrá disminuido el valor de búf/caché.
Estos son los valores que podemos establecer según lo que queramos hacer con la caché:
1: limpiar solo la página de la caché.2: limpia todos los inodos3: limpia la página de la caché y los inodos de memoria.
Cambiar hostname
Para ver el hostname / nommbre del equipo:
hostname
Podemos usar el mismo comando para cambiar el nombre:
hostname nuevohostname
También haremos el cambio en el fichero /etc/hostname.
Finalmente modificaremos también el fichero /etc/hosts.
Información del sistema
Información sobre la distribución instalada:
cat /etc/*release
Ejemplo de salida:
ISTRIB_ID=Ubuntu DISTRIB_RELEASE=22.04 DISTRIB_CODENAME=jammy DISTRIB_DESCRIPTION="Ubuntu 22.04.3 LTS" PRETTY_NAME="Ubuntu 22.04.3 LTS" NAME="Ubuntu" VERSION_ID="22.04" VERSION="22.04.3 LTS (Jammy Jellyfish)" VERSION_CODENAME=jammy ID=ubuntu ID_LIKE=debian HOME_URL="https://www.ubuntu.com/" SUPPORT_URL="https://help.ubuntu.com/" BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/" PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" UBUNTU_CODENAME=jammy
También podemos emplear el comando lsb_release -a:
No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.3 LTS Release: 22.04 Codename: jammy
Otro comando para ver información básica del sistema: hostnamectl
Static hostname: rrr
Icon name: computer-desktop
Chassis: desktop 🖥️
Machine ID: 5cb2fdfd2b55411095c3fbf985a77da6
Boot ID: e2d4a9099f8c4f438cc656de944a30f9
Operating System: Arch Linux
Kernel: Linux 6.4.12-arch1-1
Architecture: x86-64
Hardware Vendor: Gigabyte Technology Co., Ltd.
Hardware Model: H77-D3H
Firmware Version: F11
Firmware Date: Tue 2012-08-21
Firmware Age: 11y 3w 2d
Para ver información del kernel, uname -a:
Linux ubuntu-devops 6.2.0-32-generic #32~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Fri Aug 18 10:40:13 UTC 2 x86_64 x86_64 x86_64 GNU/Linux
De forma más “bonita” y con información extra, podemos usar neofetch:
-` tempwin@rrr
.o+` -----------
`ooo/ OS: Arch Linux x86_64
`+oooo: Kernel: 6.4.12-arch1-1
`+oooooo: Uptime: 16 mins
-+oooooo+: Packages: 1158 (pacman)
`/:-:++oooo+: Shell: bash 5.1.16
`/++++/+++++++: Resolution: 2560x1440
`/++++++++++++++: WM: LG3D
`/+++ooooooooooooo/` Theme: Adwaita-Xfce U [GTK2/3]
./ooosssso++osssssso+` Icons: Adwaita [GTK2/3]
.oossssso-````/ossssss+` Terminal: alacritty
-osssssso. :ssssssso. CPU: Intel i7-3770 (8) @ 3.900GHz
:osssssss/ osssso+++. GPU: NVIDIA GeForce GTX 1050 Ti
/ossssssss/ +ssssooo/- Memory: 3961MiB / 15953MiB
`/ossssso+/:- -:/+osssso+-
`+sso+:-` `.-/+oso:
`++:. `-/+/
.` `/
Otra herramienta parecida a Neofetch es screenfetch:
-`
.o+` tempwin@rrr
`ooo/ OS: Arch Linux
`+oooo: Kernel: x86_64 Linux 6.4.12-arch1-1
`+oooooo: Uptime: 18m
-+oooooo+: Packages: 1161
`/:-:++oooo+: Shell: bash
`/++++/+++++++: Resolution: 2560x1440
`/++++++++++++++: WM: LG3D
`/+++ooooooooooooo/` GTK Theme: Adwaita-Xfce U [GTK2/3]
./ooosssso++osssssso+` Icon Theme: Adwaita
.oossssso-````/ossssss+` Font: Sans 10
-osssssso. :ssssssso. Disk: 479G / 2,7T (19%)
:osssssss/ osssso+++. CPU: Intel Core i7-3770 @ 8x 3.9GHz [63.0°C]
/ossssssss/ +ssssooo/- GPU: NVIDIA GeForce GTX 1050 Ti
`/ossssso+/:- -:/+osssso+- RAM: 4242MiB / 15953MiB
`+sso+:-` `.-/+oso:
`++:. `-/+/
.` `/
Otra herramienta más completas para ver información del sistema y hardware es HardInfo.
Crear particiones con fdisk
Para listar las tablas de particiones de los dispositivos
fdisk -l
(...) Disco /dev/sda: 20 GiB, 21474836480 bytes, 41943040 sectores Disk model: VBOX HARDDISK Unidades: sectores de 1 * 512 = 512 bytes Tamaño de sector (lógico/físico): 512 bytes / 512 bytes Tamaño de E/S (mínimo/óptimo): 512 bytes / 512 bytes Tipo de etiqueta de disco: gpt Identificador del disco: 30D06FF4-EA3B-444B-9894-421E173CB514 Dispositivo Comienzo Final Sectores Tamaño Tipo /dev/sda1 2048 4095 2048 1M Arranque de BIOS /dev/sda2 4096 1054719 1050624 513M Sistema EFI /dev/sda3 1054720 41940991 40886272 19,5G Sistema de ficheros de Linux Disco /dev/sdb: 15 GiB, 16106127360 bytes, 31457280 sectores Disk model: VBOX HARDDISK Unidades: sectores de 1 * 512 = 512 bytes Tamaño de sector (lógico/físico): 512 bytes / 512 bytes Tamaño de E/S (mínimo/óptimo): 512 bytes / 512 bytes
Para usar fdisk con algún dispositivo:
fdisk /dev/sdb
Se abrirá fdisk y veremos un menú. Vamos a crear una partición. Para ello, pulsamos n y luego p para indicar que queremos una partición primaria. Todo lo demás lo dejaremos por defecto.
Al terminar, pulsamos w para aplicar los cambios y salir.
Ahora indicaremos al kernel que lea de nuevo la tabla de particiones para que vea estos cambios:
partprobe
Si ahora listamos los dispositivos y sus particiones:
fdisk -l (...) isco /dev/sdb: 15 GiB, 16106127360 bytes, 31457280 sectores Disk model: VBOX HARDDISK Unidades: sectores de 1 * 512 = 512 bytes Tamaño de sector (lógico/físico): 512 bytes / 512 bytes Tamaño de E/S (mínimo/óptimo): 512 bytes / 512 bytes Tipo de etiqueta de disco: dos Identificador del disco: 0x5d6a25a0 Dispositivo Inicio Comienzo Final Sectores Tamaño Id Tipo /dev/sdb1 2048 31457279 31455232 15G 83 Linux
Ahora formatearemos la partición en ext4 y para ello necesitaremos el comando mkfs:
mkfs.ext4 /dev/sdb1
mke2fs 1.46.5 (30-Dec-2021) Se está creando un sistema de ficheros con 3931904 bloques de 4k y 983040 nodos-i UUID del sistema de ficheros: 2767222d-6e14-461f-a917-0c7abbf15204 Respaldos del superbloque guardados en los bloques: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208 Reservando las tablas de grupo: hecho Escribiendo las tablas de nodos-i: hecho Creando el fichero de transacciones (16384 bloques): hecho Escribiendo superbloques y la información contable del sistema de archivos: hecho
Finalmente nos queda montar la partición en algún sitio. Creamos una carpeta en /media:
mkdir nuevo_disco
Y ahora hacemos el montaje:
mount /dev/sdb1 /media/nuevo_disco
Ya podríamos usar el disco.
Revisamos:
$ df -hT S.ficheros Tipo Tamaño Usados Disp Uso% Montado en tmpfs tmpfs 196M 1,5M 195M 1% /run /dev/sda3 ext4 20G 13G 5,4G 71% / tmpfs tmpfs 980M 0 980M 0% /dev/shm tmpfs tmpfs 5,0M 4,0K 5,0M 1% /run/lock /dev/sda2 vfat 512M 6,1M 506M 2% /boot/efi tmpfs tmpfs 196M 96K 196M 1% /run/user/1000 /dev/sdb1 ext4 15G 24K 14G 1% /media/nuevo_disco
Para desmontar la partición:
umount /media/nuevo_disco
Crear particiones con gparted
GParted es una herramienta gráfica para gestionar discos.
En Ubuntu se instala a través del paquete gparted.
Comprimir y descomprimir ficheros
Utilizaremos dos comandos: tar y gzip.
Cremos un paquete que contendrá el directorio /home/tempwin/mi-directorio:
tar cvf archivo.tar /home/tempwin/mi-directorio/''
c: crear un nuevo archivo.v: salida detallada con lo que está haciendo el comando.f
Se habrá creado el fichero archivo.tar.
Para desempaquetar:
tar cvf archivo.tar
Si en lugar de empaquetar, queremos comprimir, usaremos el comando gzip:
gzip fichero1
El comando anterior elimina el fichero original y deja solo el comprimido.
Para descomprimir:
gzip -d fichero1.gz
El comando anterior elimina el fichero original comprimido y deja solo el descomprimido.
Introducción a Docker
Docker es una herramienta que permite la gestión de contenedores.
Crear un contenedor:
docker run -dti --name web -p 80:80 httpd:latest
Para un contenedor:
docker stop <NOMBRE_CONTENEDOR> | <ID_CONTENEDOR>
Podemos ver los creados, estén o no funcionando, con:
docker ps -a
Si lo queremos arrancar de nuevo:
docker start <NOMBRE_CONTENEDOR> | <ID_CONTENEDOR>
Para obtener estadísticas en tiempo real de los contenedores en funcionamiento:
docker stats
Para acceder de forma interactiva a un contenedor en funcionamiento:
docker exec -ti web bash
Podemos salir del contenedor escribiendo exit o con Ctrl+D
Si queremos inspeccionar en detalle un contenedor:
docker inspect <NOMBRE_CONTENEDOR> | <ID_CONTENEDOR>
Ejemplo de salida:
[
{
"Id": "3ff7959ddfbf8cc14f8375ab4dd558436dd3e22cc0016c41e2e1193c7ecc1cb6",
"Created": "2023-09-14T15:55:41.63269882Z",
"Path": "httpd-foreground",
"Args": [],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 3204,
"ExitCode": 0,
"Error": "",
"StartedAt": "2023-09-14T15:55:42.336390551Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:7860e76287176b75d5c526081506a592f4e848c2f3660492d4dfad7ef8df88f7",
"ResolvConfPath": "/var/lib/docker/containers/3ff7959ddfbf8cc14f8375ab4dd558436dd3e22cc0016c41e2e1193c7ecc1cb6/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/3ff7959ddfbf8cc14f8375ab4dd558436dd3e22cc0016c41e2e1193c7ecc1cb6/hostname",
"HostsPath": "/var/lib/docker/containers/3ff7959ddfbf8cc14f8375ab4dd558436dd3e22cc0016c41e2e1193c7ecc1cb6/hosts",
"LogPath": "/var/lib/docker/containers/3ff7959ddfbf8cc14f8375ab4dd558436dd3e22cc0016c41e2e1193c7ecc1cb6/3ff7959ddfbf8cc14f8375ab4dd558436dd3e22cc0016c41e2e1193c7ecc1cb6-json.log",
"Name": "/web",
"RestartCount": 0,
"Driver": "overlay2",
"Platform": "linux",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "docker-default",
"ExecIDs": null,
"HostConfig": {
"Binds": null,
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {}
},
"NetworkMode": "default",
"PortBindings": {
"80/tcp": [
{
"HostIp": "",
"HostPort": "80"
}
]
},
"RestartPolicy": {
"Name": "no",
"MaximumRetryCount": 0
},
"AutoRemove": false,
"VolumeDriver": "",
"VolumesFrom": null,
"ConsoleSize": [
31,
107
],
"CapAdd": null,
"CapDrop": null,
"CgroupnsMode": "private",
"Dns": [],
"DnsOptions": [],
"DnsSearch": [],
"ExtraHosts": null,
"GroupAdd": null,
"IpcMode": "private",
"Cgroup": "",
"Links": null,
"OomScoreAdj": 0,
"PidMode": "",
"Privileged": false,
"PublishAllPorts": false,
"ReadonlyRootfs": false,
"SecurityOpt": null,
"UTSMode": "",
"UsernsMode": "",
"ShmSize": 67108864,
"Runtime": "runc",
"Isolation": "",
"CpuShares": 0,
"Memory": 0,
"NanoCpus": 0,
"CgroupParent": "",
"BlkioWeight": 0,
"BlkioWeightDevice": [],
"BlkioDeviceReadBps": [],
"BlkioDeviceWriteBps": [],
"BlkioDeviceReadIOps": [],
"BlkioDeviceWriteIOps": [],
"CpuPeriod": 0,
"CpuQuota": 0,
"CpuRealtimePeriod": 0,
"CpuRealtimeRuntime": 0,
"CpusetCpus": "",
"CpusetMems": "",
"Devices": [],
"DeviceCgroupRules": null,
"DeviceRequests": null,
"MemoryReservation": 0,
"MemorySwap": 0,
"MemorySwappiness": null,
"OomKillDisable": null,
"PidsLimit": null,
"Ulimits": null,
"CpuCount": 0,
"CpuPercent": 0,
"IOMaximumIOps": 0,
"IOMaximumBandwidth": 0,
"MaskedPaths": [
"/proc/asound",
"/proc/acpi",
"/proc/kcore",
"/proc/keys",
"/proc/latency_stats",
"/proc/timer_list",
"/proc/timer_stats",
"/proc/sched_debug",
"/proc/scsi",
"/sys/firmware"
],
"ReadonlyPaths": [
"/proc/bus",
"/proc/fs",
"/proc/irq",
"/proc/sys",
"/proc/sysrq-trigger"
]
},
"GraphDriver": {
(...)
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:11:00:02",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "1d5511354c91342495a7e6087434222e4a6ce25f7d49301b066c0ae9640acc71",
"EndpointID": "f89940db2d5a24d276dfff9abf3b62b4a57fdd4b4f89189d5318911f23cf921c",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02",
"DriverOpts": null
}
}
}
}
]
Podemos ver los logs de un contenedor:
docker logs -f <NOMBRE_CONTENEDOR>
Ver las imágenes de Docker disponibles en el sistema:
docker image
Para descargar una imagen explícitamente:
docker pull <IMAGEN:TAG>
Por ejemplo, para la última imagen de Apache2:
docker pull httpd:latest
Para eliminar un contenedor (debe estar detenido):
docker rm <NOMBRE_CONTENEDOR> | <ID_CONTENEDOR>
Comando GPG
gpg es una herramienta que nos permite cifrar y firmar archivos.
Si queremos cifrar un fichero:
gpg -c fichero-importante.txt
Nos pedirá una contraseña para cifrar.
Se creará el fichero fichero-importante.txt. Si intentamos ver su contenido, no entenderemos nada porque estamos viendo todo cifrado_
Yp
{j��
vۛxƷ�!�Kave\7,��r�,I$rLe}��qd̓
Para descifrarlo:
gpg fichero-importante.txt-gpg
No nos ha pedido ninguna contraseña porque la tenemos en nuestro sistema.
uniq comando
El comando uniq muestra por pantalla las líneas o palabras que se repitan.
uniq -c fichero
-c: muestra la cantidad de veces que se repite una ocurrencia
Si queremos mostrar solo las líneas duplicadas (da igual cuántas veces se repitan):
uniq -d fichero
Si queremos mostrar las líneas únicas (que no se repiten):
uniq -u fichero
sort comando
sort permite ordenar líneas de texto.
Por defecto, sort ordena alfabéticamente según ASCII:
sort fichero
Si queremos hacer una ordenación numérica:
sort -n fichero
find comando
Permite buscar ficheros.
Buscar por el nombre del fichero:
find /donde/buscar -name fichero_a_buscar.txt
También podemos buscar ficheros de un determinado usuario:
find / -user tempwin
Buscar ficheros por tamaño, por ejemplo, ficheros que pasen de 500 megabytes:
find / -size +500M
pstree comando
pstree muestra los procesos en ejecución en forma de árbol, de padre a hijos:
$ pstree
systemd─┬─NetworkManager───3*[{NetworkManager}]
├─VBoxSVC─┬─VirtualBoxVM───42*[{VirtualBoxVM}]
│ └─18*[{VBoxSVC}]
├─VBoxXPCOMIPCD
├─VirtualBox───9*[{VirtualBox}]
├─alacritty─┬─bash───mpv───19*[{mpv}]
│ └─4*[{alacritty}]
├─alacritty─┬─bash───hardinfo
│ └─4*[{alacritty}]
├─alacritty─┬─bash───pstree
│ └─4*[{alacritty}]
├─autostart.sh───pnmixer───{pnmixer}
├─chronyd
├─dbus-daemon
├─firefox─┬─2*[Isolated Web Co───26*[{Isolated Web Co}]]
│ ├─Isolated Web Co───28*[{Isolated Web Co}]
│ ├─Isolated Web Co───25*[{Isolated Web Co}]
│ ├─Isolated Web Co───27*[{Isolated Web Co}]
│ ├─Privileged Cont───25*[{Privileged Cont}]
│ ├─RDD Process───3*[{RDD Process}]
│ ├─Socket Process───4*[{Socket Process}]
│ ├─Utility Process───3*[{Utility Process}]
│ ├─3*[Web Content───10*[{Web Content}]]
│ ├─WebExtensions───26*[{WebExtensions}]
│ └─133*[{firefox}]
├─login───bash───startx───xinit─┬─Xorg───{Xorg}
│ └─qtile─┬─numlockx
│ └─{qtile}
├─nm-applet───4*[{nm-applet}]
├─polkitd───3*[{polkitd}]
├─rtkit-daemon───2*[{rtkit-daemon}]
├─sshd
├─systemd─┬─(sd-pam)
│ ├─at-spi-bus-laun─┬─dbus-daemon
│ │ └─4*[{at-spi-bus-laun}]
│ ├─at-spi2-registr───3*[{at-spi2-registr}]
│ ├─dbus-daemon
│ ├─gvfsd───3*[{gvfsd}]
│ ├─gvfsd-fuse───6*[{gvfsd-fuse}]
│ ├─pipewire───2*[{pipewire}]
│ └─pulseaudio─┬─gsettings-helpe───4*[{gsettings-helpe}]
│ └─2*[{pulseaudio}]
├─systemd-journal
├─systemd-logind
├─systemd-udevd
├─udiskie───3*[{udiskie}]
└─udisksd───5*[{udisksd}]
Si queremos ver el ID de cada proceso:
pstree -p
Si los quisiéramos ordenar por su ID, añadimos el argumento -n:
pstree -p -n
Si solo queremos ver los procesos de cierto usuario:
pstree usuario
watch comando
watch ejecuta un comando a intervalos regulares mostrando el resultado del comando por pantalla.
Repetir el comando date cada 5 segundos:
watch -n 5 date
Backups y restore con tar
Crear un paquete archivo.tar con los ficheros fichero1 y fichero2:
tar cvf archivo.tar fichero1 fichero2
v: nos da una salida detallada de lo que va haciendotarcon los ficheros.
Para desempaquetar:
tar xvf archivo.tar
Si queremos comprimir con bzip2, usamos el argumento j:
tar cjvf archivo.bz2 fichero1 fichero2
Para extraerlo:
tar xjvf archivo.bz2
Enviar logs a un fichero
Los logs son ficheros que contienen la salida de una aplicación. Se utilizan para saber qué está ocurriendo en una aplicación.
Veremos cómo extraer la salida de los logs a un fichero para investigarlos tranquilamente.
tail -f /var/log/syslog > /home/tempwin/log
f: muestra los datos que se van añadiendo al archivo en directo.
